В продолжние темы простых разминочных заданий. Задача добраться до админки и получить флаг. Настройки сайта дефолтные. Кое-что скрыто. Но брутить и сканить ничего не надо. Щепотка внимательности и смекалки расставит все по своим местам. Правила: Срок: Таргет: Всем удачи! Scoreboard: @gurux13 1,2 @Franky_T 1 @joelblack 1 @manfromkz 1,2 Прохождение
Небольшое уточнение - админку не прятали глубоко. Она на поверхности, нужно внимательно посмотреть на задание. И что-то должно подсказать, как ее найти. Но админка - это одна из двух частей задачи. Простое нахождение ее ничего не даст. Поэтому начинать необязательно с нее.
Наверное следует сделать еще одно уточнение. Найти админку != получить к ней доступ. Нахождение админки - часть задания. Получение доступа к ней - цель задания. Флаг в ней.
Немного о способах прохождения. Таск задумывался с одним способом прохождения, несмотря на то что окончательных пэйлоадов много. @gurux13 выкатил еще один, достаточно интересный на мой взгляд. Я надеюсь по окончанию таска он с нами им поделится. Ну и всвязи с вновь открывшимися обстоятельствами этот вариант принимается тоже. Итог: задача имеет два варианта решения.
Судя по всему, я нашёл оба Надо сказать, что первое найденное мной решение немного сложнее решения №1. Спасибо за таск! Временами я чувствовал себя котом, который сидит и смотрит на мышиную нору. Залитую бетоном.
1) Админка Мы с этим сталкивались, мы все это знаем. Встречается как на самописах, так и в CMS. И проверять это очень важно на самописах, на CMS и так знаем. 2) Фильтр Байпас фильтра состоит из двух частей. Определить прошел/не прошел фильтр для каждой части не сложно, все на виду. И на мой взгляд проще работать с каждой частью по отдельности.
Заметил некоторые сложности с нахождением админки. Наверное на этом моменте не цепляется глаз за то что нужно. После выходных скину путь, оставим еще немного времени для тех кто хочет самостоятельно найти её.
Нам предлагается получить доступ к административной панели, в которой находится заветный флаг. Взглянем на задание. Блог ИБ тематики. Тем кто участвовал в предыдущих тасках наверняка в глаза бросился порт на котором запущенно задание. Он четырехзначный(1111), вместо привычных пятизначных. С чем это связано мы пока не знаем, поэтому просто держим в уме и продолжим изучать задание. Посмотрим в сорцы. Тут нас встречает title с заверением, что ничего необычного мы здесь не найдем. 15 ссылок на контент блога и, наверное, знакомые многим как минимум по ctf.antichat.com, скрипты. Возможно поэтому не все на них обратили внимание. Ну что ж, время пришло. Наше внимание должен привлечь единственный, лежащий локально, скрипт tpl_style.min.js. Ниже него расположен еще один бутстрап скрипт, но лежит он удаленно. Посмотрим содержимое обоих скриптов... Они идентичны. Возникает вопрос - зачем подгружаются два идентичных скрипта, причем один положили локально? И как нам это может помочь? Тут необходимо заострить внимание на имени локального скрипта. Ведь неспроста его назвали tpl_style, а не просто style. И это подталкивает нас на мысль о том, что если имеется один файл с префиксом, почему не может быть и других? Учитывая необходимость найти админку, можно и попробовать. Так как в задании указано, что пройти можно без брута, предполагаем одно из "стандартных" имен админки - login, admin, administrator. Добавляем к ним префикс и находим верный вариант - директорию tpl_admin с кодом ответа 403. Попытка обратиться к предполагаемым скриптам внутри - index.php admin.php login.php administrator.php возвращает нам тот же 403. Spoiler: Немного мыслей Вообще необязательно сравнивать содержимое бутстраповских скриптов. Тут немного иная идея. Встречается использование "своих" префиксов на самописных сайтах для имен файлов и директорий. Например target.com --> tgt_style.css, tgt_image и так далее, ассоциируя префикс с доменом, хотя условие необязательное. Определить префикс можно по css, js файлам в сорцах. Как правило, располагаются они локально, либо загружаются с доверенных хостов. На CMS, при условии, что сорцы доступны, мы можем просто посмотреть их, скачав(купив) ее. wp-include, wp-admin мы видели и знаем. Но при blackbox самописного ресурса такая роскошь недоступна. Поэтому на этот момент, наверное, будет не лишним обратить внимание. Замечен интересный момент - со "своим" префиксом встречаются не только скрипты и необходимые для работы приложения файлы, директории. Встречались бэкапы и старые версии панелей, админок и других интересных вещей с которыми можно было взаимодействовать, что несло под собой дополнительное поле для деятельности. Что касается таска, то оставлять один файл с префиксом показалось слишком простой задачей. Поэтому было принято решение замаскировать его. Продолжим изучать наш таргет. В ссылках на контент блога мы видим параметр 'name' в который мы можем что-то передать. Повтыкав понимаем, что передаваемые данные фильтруются. Имеем возможность передавать диапазон символов [a-zA-Z0-9_\:\[\]/]. Пробуем использовать врапперы - доступен только http(s)://. Далее логичным предположением было попробовать обратиться к таску через эту обертку, но ... У нас фильтруется точка. Напрашивается вариант с localhost, но не все так просто - он фильтруется. Тут нам необходимо вспомнить про представления хоста, а если точнее ip адреса, в различных форматах. Информация эта давно известна, гуглится, поэтому кратко: 1) 127.0.0.0/8 или 0.0.0.0 Тут мешают точки. Мы знаем что 0 можно опускать, т.е. 127.0.0.1 = 127.1 Вариант http://0:1111/ не даст результата. Есть варианты в восьмеричной и шестнадцатеричной системе, но мешают точки: 0x7f.0x00.0x00.0x01 0177.0.0.01 2) Есть возможность представить IPv4 в hex,dec,oct форматах без точек. 0x7f000001 или 0x0 017700000001 - локалхост получить не удастся, хотя удаленные ресурсы мы получаем. Пример google.com = 172.217.11.78 = 025466205516 2130706433 - в dec аналогично, получаем только удаленные хосты. Пример google.com = 172.217.11.78 = 2899905358 3) IPv6 Есть возможность использования(не совсем), на это намекают нефильтруемые квадратные скобки. Обратится к локалхосту http://[::1] у нас не получится. Но есть возможность отображения IPv4 в формате IPv6 - [::ffff:127.0.0.1]. Тут опять встает проблема фильтруемых точек. Но использование hex сводит на нет эту проблему. В итоге получаем http://[::ffff:7f00:1]. Для перевода можно воспользоваться онлайн сервисами, например этим. Теперь нас встречает вторая проблема - обратившись любым из способов выше к нашему таску, нас встречает предупреждение фильтра. Фильтр на 1111 порт. Точнее на ":1111". Тут возможны различные варианты байпаса - 0x09-0x0d, 0x20, 0x30. Для таска оставили один - 0. Spoiler: Решение http://task.antichat.com:1111/reader/index.php?name=http://0x7f000001:01111/tpl_admin/
Итак, по просьбам - врайтап о втором способе взлома. Смотрим на URL'ы страниц таска. Пример: Code: http://task.antichat.com:1111/reader/index.php?name=info/1 Заметен параметр name, который получает что-то похожее на путь. Давайте попробуем выяснить, что туда можно передать. Несложным перебором выясняем, что: - Из врапперов доступен только http:// - Фильтруются все символы, кроме []:_/, причём / не может быть первым. - Фильтруются localhost и :1111, что намекает на возможное обращение к http://localhost:1111/super-private. Такое обращение будет локальным для сервера, и некоторые ограничения могут отключиться. Как мы узнаем дальше, так оно и есть. Сделать ?name=http://localhost:1111/tpl_admin/ нам не даёт фильтрация localhost и :1111. Spoiler Please, don't it. English, motherf*cker, do you speak it? Поскольку нельзя точки, непонятно, как задавать хост. Работает хост task, но он не даёт ничего хорошего, потому что :1111 всё равно не работает. Любопытные результаты по ?name=http://task/. Так я узнал, что на task.antichat.ru/ есть апач без index.(php|html). Окей, читаем RFC по URI, где написно, что они не одобряют кривые форматы IP-адресов, хоть они и используются, и парсинг IP зависит от реализации. Давайте почитаем, например, ман по inet_aton. Видим, что адреса - это не только четыре октета a.b.c.d, но и даже одно 32-битное число, можно десятичное, шестнадцатеричное или даже восьмеричное. Применим эту логику к IP, например, гугла: 216.58.206.110, предварительно убедившись, что он вообще открывается по IP. Code: 216.58.206.110 = D8.3A.CE.6E = 0xD83ACE6E (hex) = 3627732590 (dec) = 033016547156 (oct) Все помнят, что IP адреса пишутся в прямом порядке байт (big-endian)? Итак, переходим на http://task.antichat.com:1111/reader/index.php?name=http://3627732590/ и видим (кажется, немецкий) гугл. Ура, умеем стучаться наружу. Можно было бы http://033016547156 или http://0xD83ACE6E, все три работают. Spoiler Любопытно, что мой браузер (Chrome) тоже поддерживает это безобразие. Если кликнуть по ссылкам выше, то откроется гугл. The more you know. Для IP адреса 127.0.0.1 этот трюк не сработал. Ладно, поищем что-нибудь другое. Немного читаем код php (брр!) и вспоминаем, что http:// враппер поддерживает редиректы. То есть, если что-то в интернете нам ответит Code: HTTP/1.0 302 Found Location: SOME_URL То PHP перейдёт по SOME_URL, если посчитает его безопасным. Обычно безопасные - http(s) / (s)ftp. То есть, можно сделать Code: HTTP/1.0 302 Found Location: http://localhost:1111/tpl_admin/ и сервер перейдёт по редиректу и отдаст нам админку. Там могут быть ограничения на redirect follow, но не попробуешь - не узнаешь. Давайте же поднимем сервер (где-нибудь), который отдаст то, что сверху. Самое простое - так. Code: $ cat redirect HTTP/1.0 302 Found Location: http://localhost:1111/tpl_admin/ $ cat redirect | awk 1 ORS='\r\n' | nc -l 12345 awk выше нужен, чтобы заменить \n на \r\n, в заголовках переносом строки является \r\n. Переходим на адрес Code: http://task.antichat.com:1111/reader/index.php?name=http://<32-bit IP of server>:12345/ и видим флаг!
Спасибо за таск, читаю прохождение со слезами на глазах с портом стормозил (самое главное знал ведь, что он фильтруется...) task.antichat.com был видет в футере ошибки, так что вместо localhost срабатывал и http://task/. И еще я заметил и меня это сильно удивило, что допустим http://task.antichat.com:1111/reader/index.php?name=http://ai/ или http://task.antichat.com:1111/reader/index.php?name=http://dk/ отдавал чужие страницы. Я сначала подумал что RFI, но заветное пхпинфо ничего не дало, а лишь выдало само себя как текст. Upd: Ах да, в порывах чувств забыл поблагодарить за таск)) Так что, спасибо, от души!
интересный таск, узнал много нового в ходе поиска решения, было очень интересно. Спасибо автору Spoiler Само решение, оказалось для меня слишком, не логичным что ли... Админку я бы не нашел сам, поскольку когда пишут, что не нужен никакой брутфорс (то я автоматом исключаю какие то гадания и ищу нечто, что явно должно указывать на искомое, но это моя проблема, уже не в первом таске с этим обжигаюсь ) По фильтру, к сожалению забрел в некуда. Вроде сразу понятно, что врапперы кроме http/s запрещены, локалхост и порт 1111 также. В сети гуглится,как это обходить, можно обойти адрес через разные представления, пробовал в виде int IP 2130706433 и ipv6 через [::1] не работает ( делаю ошибочный вывод, что это не то...) . Посмотрев решения, не понимаю, почему работает 0x и не работают другие представления, ipv6 еще может быть отключен, но почему не работает 2130706433, это как то не логично, они все же позволяют обойти фильтр (не понятно в чем разница) пробую через http://task и вроде работает, но нет он открывает и соседние таски и дефолтную страницу apache на task.antichat.com по этому хостнейму (значит это не совсем локалхост и поэтому у меня админка не открывается). Дальше пробую task11 и вижу, что этот хостнейм работает и дефолтная страница apache с task11.antichat.com не открывается (думаю ну наверное это мой локалхост, но и тут админка не открывается ). В итоге я так и не понял, что это за хостнейм и как он с враппером работает (какая то муть от докера (опять же мои догадки и только) или в таске так предусмотрено. Тут наступает тупик, потом полазив еще раз и потыкав таск обнаруживаю, что работает редирект на http://task/reader?name=... который исправляет ссылку на http://task/reader/?name=... Тут первое, что приходит в голову это ssrf, но мешает фильтруемый ? (делаю ошибочный вывод, после подсказки что это вторая часть фильтра, которую нужно обойти, уже пытаюсь найти инфу, как это можно обойти и ничего не нахожу ) Сейчас, посмотрев решение, интерсно, сработает ли двойной редирект, через мой хост (хотя он там уже и не нужен...) Еще раз спасибо автору, много нового узнал для себя в ходе поиска решения.
Для решения задачки все таки требуется некоторая хакерская смекалка. Да, зайдет не всем и это логично. Но это тот момент, когда действительно уравниваются шансы как новичков так и спецов. По поводу хоста - да, можно было запутаться. Я намекал на другое представление тем кто присылал полный готовый ответ, но с другим представлением и логичным вопросом почему же не работает, хотя контент блога отдает. Здесь наверное важно вынести такой момент - не стоит останавливаться, попробовав пару вариантов. Пробовать нужно все. Ну а если говорить о логичности работы одного представления и неработы другого - этот вопрос наверное лучше задать разрабам php. Для меня было важно чтобы хост был представлен в "непривычном" виде, а какой именно - на усмотрение проходящих, поэтому и был добавлен вариант с [::ffff:0:0].