От рекона до домена. Часть 1.

Введение

Иногда цепочка, на первый взгляд незначительных уязвимостей, может обернуться серьёзной угрозой для безопасности организации. В этой статье мы расскажем о том, как совокупность таких «мелочей» привела к полной компрометации инфраструктуры.

Ключевым звеном в атаке стал APK-файл, обнаруженный на внешнем периметре.

Мы подробно разберём каждый этап этой цепочки — от первичного доступа до полного контроля над внутренними системами — и покажем, как критичные недостатки в защите, будучи объединёнными, могут нанести сокрушительный удар по безопасности компании.

На следующей схеме показана цепочка эксплуатации:

Далее мы подробно разберем каждый этап атаки.

Первый этап сбор информации

Как обычно, тестирование началось со сбора данных о ресурсах компании из открытых источников: IP-адреса, домены, открытые порты, а также данные, которые могли оказаться в открытом доступе. Далее мы приступили к перебору директорий и на одном из доменов нашли каталог /home. В этой директории хранились отладочные сборки мобильных приложений в формате APK. Наличие в открытой директории отладочных APK сразу привлекло внимание — подобные файлы редко оказываются в общем доступе и могут содержать важную информацию.

Скачав APK-файлы, мы приступили к их исследованию с помощью декомпилятора — использовали jd-gui для просмотра декомпилированного Java-кода. Изучая исходный код, мы нашли в нём параметры авторизации для доступа к одному из внешних хостов. Получив доступ к этому хосту, закрытому аутентификацией, мы изучили доступный функционал, но не обнаружили ничего интересного. Далее приступили к перебору доступных виртуальных хостов и обнаружили среди них приложение — платформу для обмена текстовыми данными (все приложения на данном ресурсе были закрыты Basic Auth, и ранее обнаруженные учётные данные позволили получить доступ к этому сервису). Поискав информацию о нём в интернете, мы обнаружили репозиторий с исходным кодом этого приложения на GitHub.

После первичного сбора информации и получения доступа к внутренним ресурсам мы сосредоточились на исследовании обнаруженного open-source приложения, поскольку оно представляло наибольший интерес с точки зрения возможных уязвимостей.

Изучение  open-source приложения и обход директорий

В ходе аудита безопасности open-source приложения мы первым делом проверили раздел GitHub Issues. Перед тем как переходить к изучению исходного кода, всегда стоит посмотреть, какие проблемы были обнаружены ранее.

После этого мы начали вручную смотреть исходный код приложения и довольно быстро заметили необычную реализацию: путь к файлу формировался из пользовательского ввода практически напрямую.

В результате в одной из функций приложения мы обнаружили уязвимость обхода пути (path traversal). Она позволяла передавать произвольный путь в параметрах запроса, что давало доступ к файлам за пределами рабочей директории веб-приложения. 

Интересно, что в коде была реализована защита от обхода директорий. Перед формированием пути к файлу все вхождения ../ просто удалялись из пользовательского ввода:

Однако эта защита оказалась недостаточно эффективной — она не учитывала альтернативные способы обхода. Например, используя конструкции с чередованием ..././, можно обойти фильтр, поскольку при нормализации путей ./ игнорируется, а ... воспринимается как часть имени папки, что позволяет фактически выйти за пределы разрешённой директории.

Таким образом, для обхода используемой защиты был сформирован следующий GET-запрос, позволяющий получить доступ к каталогу /etc/passwd:

Содержимое файла /etc/passwd было успешно возвращено сервером:

Успешная эксплуатация уязвимости открыла доступ к конфиденциальным файлам — включая конфигурации веб-сервера, сведения об установленных сервисах и журналы. Доступ к файловой системе стал ключевым этапом в цепочке атаки, который в дальнейшем позволил получить удалённое выполнение кода (RCE).

Изучение внутренней конфигурации сервера

В результате эксплуатации уязвимости path traversal мы получили возможность читать произвольные файлы, включая данные конфигурации веб-сервера. 

Так как мы знали, что используется nginx, мы стали изучать какие виртуальные хосты присутствуют на сервере. Определив список активных виртуальных хостов, мы перебрали доступные директории и выделили среди них потенциально интересные. После этого мы приступили к исследованию файлов, расположенных в этих директориях. Так нам удалось обнаружить временные файлы и логи, которые могли содержать чувствительную информацию. В результате анализа файлов access.log и error.log на одном из хостов были обнаружены пути к нескольким php файлам. Дальнейшее изучение логики работы одного из них помогло найти уязвимость, позволяющую внедрять и выполнять произвольные команды на сервере, что стало основным шагом в развитии дальнейшей атаки.

Инъекция кода

Анализ принципа работы обнаруженного ранее PHP-скрипта показал, что он принимает значение параметра id из строки запроса и напрямую передаёт его в системную оболочку без какой-либо фильтрации или экранирования. Такая реализация не является безопасной, что открывает прямой путь для внедрения и выполнения произвольных команд операционной системы.Ниже показано содержимое обнаруженного PHP-файла:

Мы решили проверить работоспособность этого вектора атаки и сформировали специальный запрос, в котором к параметру id добавили команду вывода списка файлов в каталоге пользователя (Тут и ниже для читаемости не закодированы пробелы):

В ответ сервер вернул содержимое директории, подтвердив, что передаваемые команды действительно выполняются на сервере.

Далее мы отправили ещё один запрос с командой uname -a, чтобы получить полную информацию о ядре операционной системы и аппаратной платформе:

Ответ сервера содержал полный вывод команды: название ядра, версию, архитектуру и время сборки:

Такая уязвимость предоставляет возможность удалённого выполнения системных команд, что существенно увеличивает возможности для дальнейшего развития атаки и закрепления в инфраструктуре Заказчика. Получив доступ к командной оболочке, мы смогли глубже исследовать внутренние сервисы и механизмы взаимодействия между компонентами системы — подробнее об этом расскажем в следующей статье.

Заключение

Поэтапная эксплуатация обнаруженных уязвимостей позволила нам получить удалённый доступ и добиться выполнения произвольного кода на сервере. Ключевым элементом во всей цепочке стала уязвимость обхода путей в open-source приложении, открывшая доступ к конфиденциальной информации и внутренним механизмам конфигурации сервера.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *