Разбор Detector [Web] [CC]
RubikoidВторое из двух заданий на веб.

Открываем задание, видим выделенное жирным docs, подсказку с secrets (запоминаем) и кнопку хинта, он пригодится позже.
Открываем сервис, представляющей из себя сайт, проверяющий документы на "модные" слова.

Вспоминаем про подсказку с docs и пробуем загрузить какой-то документ, созданный в ворде, например. Если документ сформирован криво, там чего-то нету, открывается та же страница. В ином случае получаем надпись "Valid".
Тогда пробуем погуглить список buzzwords и находим таковой на википедии. Копируем кусок в документ и отправляем. В моем случае, их фильтр среагировал на слова "aglie" и "big data". Если фильтр что-то таки находит, то выводится некоторый кусок xml, и собственно это слово.
Все это в целом наталкивает на мысль об уязвимости сервиса к XXE.
Открываем .docx как самый обычный zip-архив, дальше лезем в word/document.xml, в котором ворд хранит, собственно, документ:
<!DOCTYPE word [ <!ENTITY ext SYSTEM "file:///etc/passwd"> ]>
И в элементе с Aglie:
<w:t>Agile
&ext;</w:t>
</w:r>
После отправки файла с таким содержимым понимаем, что да, можно успешно эксплуатировать XXE. Самое время вспомнить про подсказки:
В файловой системе ничего нету
Найти хост secrets
Сервис в secrets находится на произвольном порту
Пробуем запросить вместо файла - сайт http://secrets, и видим, как сервис подвисает. Пробуем запросить сайт с произвольным именем и видим, что сервис выкидывает ошибку 500. Значит secrets - это то, что мы ищем, осталось только найти порт.
Для это было написано два скрипта на питоне. Первый - обыкновенный http сервер, который при запросе на /<num>.dtd отдавал dtd, в котором был запрос на http://secrets:<num>/, и второй скрипт, который формировал .docx файлы и отправлял их в цикле.

Соответственно, base.docx - файл без файла document.xml, он вставляется позже. Это сделано, чтобы было проще формировать файлы.
Запускаем скрипт, ждем некоторое время и получаем порт 8080, и, собственно флаг.