первый крит на бб ☠️
Все совпадения случайны, да и вообще, просыпайся, багбаунти не существует. Погнали грызть бананы и прыгать по деревьям.
Одним холодным декабрьским вечером, сканер обнаруживает IIS сервер, уязвимый к
cokieless сессии и
shortname enum, благодаря чему даёт вытаскивать DLL библиотеки.
https://target.com/(S(X))/b/(S(X))in/Newtonsoft.Json.dll
Пару минут гуглежа и попадается
статья SWARM'ов о пробиве вебчика по этому же сценарию.
Из хаоса информации и непонимая, выстроилась цель - раскопать кастомные DLL библиотеки.
Помня, что сервер уязвим к shortname enumeration, пробую подобрать имена через
shortscan.
shortscan --timeout 20 --fullurl --stabilise --patience 1 --verbosity 1
https://target.comБИНГО! Я ПОЛУЧИЛ ничего.
Не сдаёмся.
Пошёл в таверну ИИ, расписал
воображаемую ситуацию и попросил сгенерить словарь DLL библиотек, включая как стандартные, так и с названием компании и целевого домена.
Среди мусора попалась Swashbuckle.Core.dll (автоматически генерит swagger)
Развернул Windows виртуалку, скачал
ilspy (декомпилятор .NET) и начал смотреть что же там есть, ведь ИИ подсказал "
в DLL должен быть определен путь к Swagger".
Около получаса прыгаю по коду и интерфейсу, ментально привыкая к .NET. Кое-как костылями натыкаюсь на путь к сваггеру
/swagger/docs/v1
Ликуя, вписываю в браузер иииИИ... сваггер не открывается. Сервер возвращает 404 и не более. Десятки раз перепроверил код, посоветовался с ИИ, пробовал обойти всякими методами и софтами.
Лишь через час вспоминаю, что сервер же уязвим к cookieless сессии! Складываю (S(X)) и путь к сваггеру
/(S(X))/swagger/docs/v1
ОТКРЫВАЕТСЯ СВАГГЕР 👁
Смотрю, изучаю, пробую API на вкус, затем вспоминаю истинную цель похода на сваггер - подобрать имена DLL библиотек.
Собрал ключевые слова со сваггера, закинул в ИИ и попросил сгенерировать ещё один словарь, но уже только кастомных библиотек. Подождал, скачал, запустил подбор и получил хиты!
/(S(X))/b/(S(X))in/COMPANY.core.dll
/(S(X))/b/(S(X))in/LONGASSDOMAIN.dll
/(S(X))/b/(S(X))in/COMPANYX.mvc.dll
Быстро, с потным руками и болью в спине (уже шёл 3-й час ночи), кидаю DLL'ки в ilspy и смотрю код сервиса. Кода слишком много, но и нельзя останаливаться. Надо выкачать весь код и уже затем браться за анализ.
Заметил, что в каждой DLL, в начале кода, были расписаны импорты внешних библиотек. С ИИ написал базовый скрипт, что забирал все импорты из DLL и собирал их в единый словарь
# Bulk extract from all DLLs in a directory
$dlls = Get-ChildItem -Path "C:\Users\w0ltage\Desktop\company-dlls\new" -Filter "*.dll"
foreach ($dll in $dlls) {
try {
$asm = [System.Reflection.Assembly]::ReflectionOnlyLoadFrom($dll.FullName)
$asm.GetReferencedAssemblies() | ForEach-Object {
$_.Name
}
} catch {
Write-Host "Could not load $($dll.Name): $($_.Exception.Message)" -ForegroundColor Red
}
}
Так подобрал ещё десяток библиотек.
На этом заканчиваю сессию багхантинга и ложусь спать.
Следующий день, казалось, был холоднее предыдущего. Впрочем, это не мешало моим пальцам искать уязвимости по небоскребам кода, словно собирая подарки на рождество. I live for this shit.
Следуя по сценарию SWARM'ов, следующим этапом надо было найти RCE. Часы шли медленно, но я не сдавался. Структуры, классы, импорты, утилиты, связки, креды, заголовки, внутренние адреса.
Спустя много дней ручного анализа кода, перепробовав кучу вариантов десера, логических баг и других вагонов уязвимостей.
Ещё пару часов отчаяния и попадается API эндпоинт /journal/get/{id}
/journal/get/8
Без аутентификации, вернулись чьи-то персональные данные. Край данных оказался на числе в почти 7 миллионов. Считай все эти 7кк ПДн торчали в интернет без аутентификации многие годы.
Заполнил репорт с уровнем критичности "высокий", но вендор сам повысил до критического и щедро наградил за находку.
В коде были найдены ещё пара лоу-медиум уязвимостей и всё.
Остался без RCE, но с первым критом 🚗