ANTICHAT

ANTICHAT (https://forum.antichat.xyz/index.php)
-   Задания/Квесты/CTF/Конкурсы (https://forum.antichat.xyz/forumdisplay.php?f=112)
-   -   Квантовый прорыв WriteUp — полный разбор CTF-задачи (https://forum.antichat.xyz/showthread.php?t=1645358)

kovalyoff 10.06.2025 20:03

https://forum.antichat.xyz/attachmen...9568667986.png

Честно, попыхтел над этой задачкой с hackerlab. Хотя, по сути, и пыхтеть-то было не над чем — лол.

Айпи переводит нас на сайт. На первый взгляд — ничего особенного, просто текст. Нас интересует вкладка "Контакты".

https://forum.antichat.xyz/attachmen...9568726884.png

https://forum.antichat.xyz/attachmen...9568816381.png

Первое, что приходит в голову — ввести рандомные данные в поля и нажать "отправить сообщение". Так и делаем. В ответ — привычное:
Цитата:


"Спасибо за ваше сообщение! Мы свяжемся с вами в ближайшее время."

А что же происходит в этот момент "под капотом"?

https://forum.antichat.xyz/attachmen...9568998333.png

В поле response видим base64-код. Декодируем — получаем HTML-страницу с заглушкой Cloudflare. Я ввел сайт
Код:

lol.com
, видимо, сервер решил, что мы лезем куда не надо. Но раз появляется заглушка, значит, поле "ваш сайт" отправляет запрос на указанный URL. А что если попробовать направить его на самого себя?

Вводим
Код:

127.0.0.1
и...

https://forum.antichat.xyz/attachmen...9569541839.png

Создатели явно предусмотрели такой вариант — защита сработала. Но мы не сдаемся. Попробуем обойти это ограничение.
Если
Код:

127.0.0.1
не работает, пробуем
Код:

127.1
и указываем порт. Сканирование показало, что порт 8000 открыт.

Вводим:
Код:

http://127.1:8000/
https://forum.antichat.xyz/attachmen...9569921493.png

Опять сообщение:
Цитата:


"Спасибо за ваше сообщение".

Запрос сработал, а в ответ снова прилетает base64. Расшифровываем — и вот она, HTML главной страницы. Выходит, сервер возвращает содержимое запрашиваемой страницы.

На этом моменте я немного застопорился. Ну получил я HTML — и что дальше?

Но потом случилось буквально библейское чудо. Присел покурить, наблюдаю за птичками... случайно уронил сигарету на ногу — и тут меня осенило.

Если мы получаем главную страницу, то, возможно, можем получить и другие — например,
Код:

contacts
или
Код:

about
. Хотя они вряд ли что-то дадут. Значит, ищем скрытую директорию. Запускаем фаззер и получаем:

https://forum.antichat.xyz/attachmen...9570331980.png

Есть директория
Код:

/secret
, но статус у неё — forbidden. Пробуем зайти туда:

https://forum.antichat.xyz/attachmen...9570388918.png

Цитата:


"Access denied."

Ну, кто бы сомневался. Понятно, что именно там и лежит флаг. Но вряд ли он просто в HTML. Скорее, это отдельный файл.

Допустим, попробуем:
Код:

http://127.1:8000/secret/main.js
В ответ снова base64 → html, в котором написано:

PHP:


Код:


404
Not Found

Not Found

The requested
URL
was not found on the server
.
.
.

И вот это сообщение — ключевое! Оно генерируется Flask, а значит, логично искать
Код:

.py
файл!

Пробуем
Код:

main.py
— опять 404. Тупик? А может и нет...

Если бы мы хотели напрямую попросить файл у сервера, использовали бы
Код:

file:///
, но есть одно но: поле "ваш сайт" принимает только адреса, начинающиеся с
Код:

http://
или
Код:

https://
.

Тогда — хитрый ход. Делаем запрос вида:
Код:

http://127.1:8000/secret?url=file:///app/main.py
(логично предположить, что
Код:

main.py
— основной файл)

Отправляем. В ответ — снова base64. Декодируем... и внутри — флаг!

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

f22 11.06.2025 11:16

Спасибо за статью! Вопрос:
Цитата:


kovalyoff сказал(а):

Если
Код:

127.0.0.1
не работает, пробуем
Код:

127.1

почему такой ip адрес корректно воспринимается браузером, к тому же является вектором атаки?

kovalyoff 11.06.2025 15:43

Цитата:


f22 сказал(а):

Спасибо за статью! Вопрос:

почему такой ip адрес корректно воспринимается браузером, к тому же является вектором атаки?


Спасибо за вопрос.
Если мы посмотрим на двоичное значение адреса 127.0.0.1, учитывая стандартный, состоящий из четырех октет, dot-decimal nonation, то получим 01111111.00000000.00000000.00000001. Но парсер браузера умеет работать с IP состоящим не только из четырех октет. Если мы возьмем всего лишь две октеты (то есть 127.1), то у нас получится 01111111.000000000000000000000001. А далее все просто - браузер с помощью функции inet_addr просто пересоберет и подгонит его под привычный 127.0.0.1. По сути, в результате такой махинации двоичное значение IP адреса не меняется, а браузер сам знает, как преобразовать его в нужный формат.
Почему это вектор атаки? Потому что в случае данной задачи фильтр, скорее всего, предусматривал только запрет на ввод 127.0.0.1, а вот 127.1 вообще не предусмотрен.

NuclearChemist 15.06.2025 22:54

Йоооу, чувак круто вышло, я вот пишу райтапы, но исключительно для себя так как только учусь, и то как писал ты мне ооочень зашло. описываешь прям мысли. И кстати в последнем действии можно не только main.py чекать, но и app.py flag.txt secret.txt все выдает один и тот же ответ. Спасибо за такой клевый райтап!

rus7777 10.07.2025 14:47

Спасибо за райтап, долго не мог решить задачу т.к. не знал что блокировку 127.0.0.1 можно 127.1. А для секрета достаточно http://127.1:8000/secret

BAO 08.08.2025 21:41

Цитата:


rus7777 сказал(а):

Спасибо за райтап, долго не мог решить задачу т.к. не знал что блокировку 127.0.0.1 можно 127.1. А для секрета достаточно http://127.1:8000/secret

Так же вместо http://127.0.0.1 можно использовать:
http://0
http://@0/
http://2130706433


Время: 19:55