Содержание статьи
Я занимаюсь анализом защищенности веб‑приложений и внешних инфраструктур в Singleton Security. Нашим заказчиком выступил довольно крупный интернет‑провайдер, предоставляющий свои услуги в нескольких регионах России.
Суть проекта заключалась в тестировании сравнительно скромного сегмента внешней инфраструктуры заказчика — на старте было предоставлено всего девять IP-адресов. Скоуп, конечно, небольшой, но, как показывает практика, даже этого бывает достаточно для весьма интересных находок. Так произошло и здесь!
В область тестирования входила корпоративная ERP-система, причем это был даже не вендорский продукт, а внутренняя разработка. Самописные решения (еще и для внутреннего использования) особенно интересны тем, что к ним могут предъявляться гораздо менее строгие требования по безопасности. Вероятность того, что такие системы проходят регулярный пентест, тем более мала. Собственно, о захвате этой системы я сегодня и расскажу.
warning
Статья имеет ознакомительный характер и предназначена для специалистов по безопасности, проводящих тестирование в рамках контракта. Автор и редакция не несут ответственности за любой вред, причиненный с применением изложенной информации. Распространение вредоносных программ, нарушение работы систем и нарушение тайны переписки преследуются по закону.
Разведка, первая зацепка
Первый этап при проведении пентеста — это, конечно же, разведка — поиск максимального числа поддоменов, веб‑сайтов, служб и сервисов, доступных в обозначенном скоупе.
Поэтому в первую очередь я просканировал порты на полученных девяти IP-адресах, чтобы определить доступные службы.
Я начал с поиска веб‑приложений на стандартных портах — 80 и 443. Это помогло быстро очертить базовую поверхность атаки и провести сканирование без лишнего шума. На тот момент было непонятно, использует ли заказчик средства защиты и насколько строго они настроены, поэтому я старался действовать осторожно.
Позже я полноценно просканировал весь скоуп, но решил не углубляться в детали, чтобы не перегружать повествование.
Команда выглядела так:
nmap -v -Pn -iL scope.txt -p 80,443 --max-rate 20 -oG web-scan.nmap
В результате сканирования я обнаружил три узла с доступными веб‑серверами. Кроме того, Nmap по умолчанию выполняет обратное разрешение DNS-имен, поэтому в процессе я также получил используемое доменное имя (в тексте я буду использовать вместо него example.ru).
Теперь можно использовать его для поиска поддоменов. Для этого я обычно пользуюсь инструментарием ProjectDiscovery, в частности утилитами subfinder и dnsx. Первая предназначена для поиска поддоменов в открытых источниках, а вторая — для выполнения DNS-запросов, аналог nslookup или dig. Инструментарий PD примечателен тем, что вывод одной утилиты можно сразу пайпить на ввод другой. Благодаря этому можно собирать интересные комбайны, позволяющие одним однострочником провести разведку, обнаружить действующие HTTP-сервисы и сразу же просканировать их на наличие уязвимостей.
Но конкретно в этом случае задача проще — найти все поддомены, относящиеся к скоупу, поэтому я использовал лишь две упомянутые утилиты:
subfinder -all -silent -d example.ru | dnsx -a -resp -silent -nc
После фильтрации вывода по IP-адресам из скоупа мое внимание привлек один адрес, в который разрешались около десяти поддоменов. Это был как раз один из ранее найденных хостов с доступным веб‑интерфейсом.
Я изучил доступные веб‑приложения и выяснил, что на этом узле размещена ERP-система (erp.
). Большинство поддоменов оказались ее копиями для офисов компании в разных городах. Также были доступны поддомены с говорящими названиями files
и api
, судя по всему, предназначенные для работы с файлами и API-запросами.
Следующий этап, разумеется, — это фаззинг доступных файлов и директорий на обнаруженных веб‑приложениях. Здесь и ждала первая находка: на поддомене files.
оказался доступен конфиг Nginx.
Первая уязвимость — читаем файлы
Мое внимание сразу же привлекла одна из первых строчек конфига:
location /avatar { rewrite ^/avatar/(.*)$ /api.php?type=getAvatar&file=$1 break; ... fastcgi_pass localhost:9000}
Здесь можно увидеть, что все маршруты, начинающиеся с /
, обрабатываются rewrite-правилом, его можно прочитать так: «возьми все, что идет после /
, и подставь в аргумент параметра file». То есть если мы обратимся по пути /
, то Nginx превратит это в /
.
GET-параметр file
вызывает очень большие подозрения на возможный LFR / Path Traversal, но, если мы подставим нагрузку в изначальный URL, ничего не произойдет: Nginx обрубает подобные запросы и возвращает ошибку 400. Но стоит проверить, можно ли обратиться к скрипту api.
напрямую и подставить нагрузку туда.

Бинго! Теперь есть возможность читать содержимое файлов в системе, доступных текущему пользователю, — вероятно, www-data
. А еще в конфиге Nginx был виден эндпоинт, предназначенный для загрузки файлов, но он уже требовал авторизации (однако он все еще будет полезен в дальнейшем).
Новый поддомен
Используя обнаруженную уязвимость, я принялся изучать содержимое файлов сервера, включая многочисленные конфиги в директории /
. И тут всплыла следующая находка: настройка зоны (назовем ее example.
) для DNS-сервера BIND. В ней — несколько новых поддоменов, которые я не встречал на этапе разведки, причем они резолвились все в тот же IP-адрес, с которым я работал. Одним из них был xyz.
, на котором нашлось новое приложение.
Продолжение доступно только участникам
Материалы из последних выпусков становятся доступны по отдельности только через два месяца после публикации. Чтобы продолжить чтение, необходимо стать участником сообщества «Xakep.ru».
Присоединяйся к сообществу «Xakep.ru»!
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее