
Гибкая площадка для Android CTF-задач.
DroidGround
В традиционных CTF-задачах часто прячут флаги в файлах на системе, требуя от атакующих использовать уязвимости для их получения. Однако в мире Android такой подход плохо работает. APK-файлы легко скачать и подвергнуть реверсу, поэтому размещение флага на устройстве обычно делает его извлечение тривиальным с помощью статического анализа или трюков с эмулятором. Это серьёзно ограничивает возможность создавать реалистичные задачи, ориентированные на выполнение в рантайме.
DroidGround создан для решения этой проблемы.
Это специально построенная платформа для проведения Android-задач по взлому мобильных устройств в контролируемой и реалистичной среде, где атакующие ограничены ровно настолько, насколько это необходимо для решения задач предусмотренным способом.
Важно, что участники могут быть изолированы внутри среды приложения. Модульность инструмента позволяет настроить, может ли пользователь запускать оболочку, читать произвольные файлы или устанавливать дополнительные инструменты. Всё можно настроить так, чтобы единственным способом получить флаг было понимание и эксплуатация самого приложения.
DroidGround позволяет проводить самые разные Android-задачи, которые трудно реализовать в традиционных CTF-окружениях. Например, в задаче на удалённое выполнение кода (RCE) игроки могут получить APK для локального анализа. После обнаружения уязвимости они могут разработать Frida-скрипт и запустить его через DroidGround на реальном целевом устройстве, чтобы извлечь флаг из внутреннего хранилища. Другие типы задач могут включать скрытые активности, пользовательские broadcast-намерения, эксплуатацию сервисов или динамический анализ с использованием предустановленных инструментов.
Благодаря потоковой передаче экрана устройства в реальном времени, тонкой настройке функций, интеграции Frida и настраиваемым скриптам установки и сброса, DroidGround позволяет организаторам CTF создавать безопасные, гибкие и реалистичные Android-задачи, выходящие далеко за рамки обычных возможностей.
DroidGround предоставляет богатый набор функций, управляемых сервером.
scrcpy)Почти все функции являются модульными и определяются через переменные окружения, что обеспечивает точный контроль над областью задачи.
Файл .env.sample в корневом каталоге — хорошая отправная точка. Вот полный список всех поддерживаемых в настоящее время переменных окружения:
Переменная DROIDGROUND_IP_IFACE сначала ищет точное совпадение, а затем переключается на первый интерфейс, который начинается с указанного значения, поскольку Docker позволяет указывать только префикс сетевого интерфейса внутри контейнера.
Использование переменной DROIDGROUND_NUM_TEAMS немного меняет поведение приложения под капотом. Если эта опция задана:
Это позволяет использовать один экземпляр DroidGround для нескольких команд в задачах, где флаг можно извлечь через сетевой запрос. Это значительно снижает затраты на развёртывание DroidGround для CTF-соревнований.
Кроме того, если задано значение -1, будет включён так называемый режим Безлимитные команды. В этом режиме на странице Обзор появляется кнопка для генерации нового токена команды. Все переменные DROIDGROUND_TEAM_TOKEN_<N> игнорируются, если этот режим включён.
Вот некоторые способы применения DroidGround:
В папке examples приведено несколько примеров файлов Docker Compose. В них используются приложения из репозитория примеров DroidGround, который будет постепенно расширяться для демонстрации всех ключевых функций. Они также являются хорошей отправной точкой для понимания того, как настроить собственный CTF.
При загрузке DroidGround выполняет следующие действия:
adbsetup.sh в папке, указанной в DROIDGROUND_INIT_SCRIPTS_FOLDER, если она присутствует. Этот скрипт можно использовать для установки целевого приложения и выполнения всего остального, что необходимо для инициализации CTF (например, размещения флага в известном месте)frida-server на основе установленной версии и архитектуры устройства и запускает егоDROIDGROUND_APP_PACKAGE_NAME). Если приложение не установлено, DroidGround завершит работу.Вот пример скрипта setup.sh:
#!/usr/bin/env bash
adb shell pm uninstall com.example.app # To do some cleanup
echo "Sleep for 2 seconds before installing app"
sleep 2
echo "Installing app..."
adb install ./flag.apk # The cwd is set to the "init.d" folder, so the apk file can be accessed with the relative path
echo "Install command executed"
Для production-развёртывания (в реальном CTF) вы можете заранее подготовить определённое количество экземпляров DroidGround или позволить пользователям создавать экземпляры (с ограничением или, возможно, привязывая каждую команду/пользователя к конкретному экземпляру). Поэтому мы также добавили простой пример спавнера.
В качестве альтернативы, как упоминалось ранее, вы можете создать задачу, в которой флаг можно извлечь через сетевой запрос, и использовать переменную окружения DROIDGROUND_NUM_TEAMS, чтобы избежать запуска нескольких экземпляров (что может быть дорого). Папка net-multi-step содержит хороший пример того, как проводить такие задачи.
Вот несколько рекомендаций по настройке вашего Android CTF:
При тестировании настройки перед запуском в production может быть полезно получить поверхность атаки целевого приложения. Это то, что игроки не должны видеть, потому что обнаружение и анализ поверхности атаки — часть их работы!
Поэтому предоставляется GET-эндпоинт, доступный по адресу /attackSurface, защищённый токеном (который нужно использовать в качестве значения заголовка Authorization), который случайным образом генерируется при загрузке и выводится в журналы (то есть доступен только системным администраторам).
Если вы хотите использовать собственные Frida-скрипты в jailed-режиме, вам нужно всего лишь примонтировать папку с ними в Docker-контейнер:
volumes:
- <Frida library folder>:/droidground/library
Файл library.json (как в library) требуется, чтобы сообщить приложению список доступных скриптов.
Запустить проект в режиме разработки не должно быть слишком сложно, но перед началом вам понадобятся следующие инструменты:
frida (только если вы включаете Frida)node (это Node-приложение, он вам нужен!)adb (мы полагаемся на него для общения с устройством)После этого вы можете просто выполнить следующее:
git clone https://github.com/SECFORCE/droidground.git
cd droidground
# Install without running scripts
npm install --ignore-scripts
# Rebuild frida to get the bindings
npm rebuild frida
# Build companion app
npm run companion
# Get scrcpy
npm run scrcpy
После этого вам нужно лишь задать переменные env, а затем запустить npm run dev — и всё готово. Приятного режима разработки!
Пулл-реквесты приветствуются! Пожалуйста, сначала откройте issue, чтобы обсудить крупные изменения. Особенно ценятся идеи новых CTF-сценариев или типов задач.
Разработано Angelo Delicato @SECFORCE.
Раздел сервера во многом опирается на выдающуюся работу @yume-chan; вероятно, этого приложения не существовало бы без его замечательного труда.
Сопутствующее приложение во многом основано на aya server, который работает так же, как scrcpy server. Более подробную информацию можно найти в соответствующем README.
DroidGround распространяется под лицензией GPL-3.0 LICENSE
![]() | ![]() |
|---|
| Обзор | Запуск активности |
![]() | ![]() |
| Frida Jailed Mode | Frida Full Mode |
![]() | ![]() |
| Файловый браузер | Менеджер приложений |
![]() | ![]() |
| Терминал | Журналы |
| Переменная | Описание | По умолчанию |
|---|
DROIDGROUND_BASE_PATH | Путь к веб-приложению (полезно для размещения на подпутях) | - |
DROIDGROUND_APP_PACKAGE_NAME | Имя пакета целевого приложения | - |
DROIDGROUND_ADB_HOST | ADB-хост | localhost |
DROIDGROUND_ADB_PORT | ADB-порт | 5037 |
DROIDGROUND_ADB_SERIAL | Необязательный серийный номер ADB-устройства для подключения | - |
DROIDGROUND_DEVICE_TYPE | usb или network | usb |
DROIDGROUND_DEVICE_HOST | IP-адрес Android-устройства (adb) (только сетевой режим) | - |
DROIDGROUND_DEVICE_PORT | порт Android-устройства (adb) (только сетевой режим) | - |
DROIDGROUND_INIT_SCRIPTS_FOLDER | Папка, содержащая setup.sh и reset.sh | /init.d |
DROIDGROUND_HOST | Адрес привязки | 0.0.0.0 |
DROIDGROUND_PORT | Порт привязки | 4242 |
DROIDGROUND_RESTART_APP_DISABLED | Отключить перезапуск приложения | false |
DROIDGROUND_APP_MANAGER_DISABLED | Отключить менеджер приложений | false |
DROIDGROUND_BUG_REPORT_DISABLED | Отключить bugreport | false |
DROIDGROUND_FILE_BROWSER_DISABLED | Отключить файловый браузер | false |
DROIDGROUND_FRIDA_DISABLED | Отключить поддержку Frida | false |
DROIDGROUND_FRIDA_TYPE | jail или full | jail |
DROIDGROUND_FRIDA_INJECTION | server или gadget | server |
DROIDGROUND_LOGCAT_DISABLED | Отключить logcat | false |
DROIDGROUND_REBOOT_ENABLED | Включить перезагрузку | false |
DROIDGROUND_SHUTDOWN_ENABLED | Включить выключение | false |
DROIDGROUND_START_ACTIVITY_DISABLED | Отключить startActivity | false |
DROIDGROUND_START_RECEIVER_DISABLED | Отключить broadcast | false |
DROIDGROUND_START_SERVICE_DISABLED | Отключить startService | false |
DROIDGROUND_TERMINAL_DISABLED | Отключить терминал | false |
DROIDGROUND_RESET_DISABLED | Отключить сброс | false |
DROIDGROUND_EXPLOIT_APP_DURATION | Время (в секундах), в течение которого эксплойт-приложение будет активно | 10 |
DROIDGROUND_EXPLOIT_APP_MAX_SIZE | Максимальный размер (в МБ) эксплойт-приложения | 50 |
DROIDGROUND_NUM_TEAMS | Количество команд, играющих одновременно | - |
DROIDGROUND_TEAM_TOKEN_<N> | Токен для n-й команды. Автоматически генерируется, если отсутствует | - |
DROIDGROUND_IP_STATIC | Статический IP-адрес для отображения. Имеет приоритет над DROIDGROUND_IP_IFACE | - |
DROIDGROUND_IP_IFACE | Сетевой интерфейс для отображаемого IP-адреса | - |
DROIDGROUND_LOGO_LINK | Необязательно задаёт ссылку при клике на логотип (например, главную страницу вашего CTF) | - |