Ransom (2022)
Прохождение Hackthebox::Ransom

Тэги:
Linux
Web
PHP
API
Web Fuzzing
Сканируем порты с помощью nmap
На 80 порту есть страница авторизации:


Отправляем в Repeater и начинаем тестировать. Мои попытки с SQLi закончились неудачей, поэтому я начал копать глубже, изменив запрос, и нашел то, что API передает данные назад в формате JSON:

Следовательно мы можем добавить заголовки Content-Length (ставится автоматически в BurpSuite) и Content-Type и попытаться передать параметр password в JSON:

И он успешно отправился в JSON. Тогда можно отправить в качестве пароля значение true и если проверка сделана некачественно, то такой запрос пройдет, так как JSON обрежет кавычки. Вот пример такой проверки:
Два знака равно не проверяют тип в PHP, следовательно true == 'SuperSecurePassword' будет выполняться:

При этом, если добавить три знака равно, то будет проверка на тип данных и такой трюк не сработает:

Пробуем, работает:

Теперь мы можем просто зайти обратно на сайт, перехватить запрос и вставить тот, который мы сейчас использовали:

У нас есть флаг юзера и зашифрованный архив. Качаем последнего и смотрим, что в нем:
Итак, для архива мы можем применить атаку на основе открытых текстов(plaintext attack)(https://ru.wikipedia.org/wiki/Атака_на_основе_открытых_текстов), так как в архиве есть стандартный файл .bash_logout.
Отрывок из википедии про атаку на основе открытых текстов:
В то же время различные зашифрованные архивы, такие как ZIP, уязвимы для данной формы атаки. В данном случае злоумышленнику, желающему вскрыть группу зашифрованных ZIP файлов, необходимо знать всего один незашифрованный файл из архива или его часть, который в данном случае будет выполнять функцию открытого текста. Далее, с использованием программ, находящихся в свободном доступе, быстро находится ключ, необходимый для расшифровки всего архива. Взломщик может попытаться найти данный незашифрованный файл в Интернете либо в других архивах, либо может попытаться восстановить открытый текст, зная имя из зашифрованного архива.
Смысл атаки в том, что для того, чтобы взломать zip-архив нужно знать 12 байтов одного файла этого архива, 8 из которых должны быть различными. Чем больше байтов знаешь, тем быстрее идет расшифровка архива.
То есть, по факту нам нужен просто стандартный файл .bash_logout с размером 220 и с CRC-кодом 6CE3189B. Создаем его и вписываем такие данные:
Запаковываем его в архив:
И смотрим его размер и CRC-код:
Теперь с помощью данной тулзы можно расшифровать архив:


Вместо anypass можно вставить любое значение, это новый пароль для расшифрованного архива:

Мы можем узнать имя юзера через authorized_keys:
Подключаемся:

Мы можем посмотреть по стандартному пути, где находится папка сайта:
Далее, полазив по дирам, находим файл(/srv/prod/app/Http/Controllers/AuthController.php), который как раз-таки и был тем файлом, который использовался для доступа к E Corp Secure File Transfer на 80 порту:
И тут действительно плохая проверка, которая не проверяет тип переменной. Пароль - UHC-March-Global-PW!, который подходит для авторизации на сайте, а также для пользователя root:

Last updated
Was this helpful?