
droidground v1.0.14
Гибкая площадка для Android CTF-задач.
DroidGround
В традиционных CTF-задачах часто прячут флаги в файлах на системе, требуя от атакующих использовать уязвимости для их получения. Однако в мире Android такой подход плохо работает. APK-файлы легко скачать и подвергнуть реверсу, поэтому размещение флага на устройстве обычно делает его извлечение тривиальным с помощью статического анализа или трюков с эмулятором. Это серьёзно ограничивает возможность создавать реалистичные задачи, ориентированные на выполнение в рантайме.
DroidGround создан для решения этой проблемы.
Это специально построенная платформа для проведения Android-задач по взлому мобильных устройств в контролируемой и реалистичной среде, где атакующие ограничены ровно настолько, насколько это необходимо для решения задач предусмотренным способом.
Важно, что участники могут быть изолированы внутри среды приложения. Модульность инструмента позволяет настроить, может ли пользователь запускать оболочку, читать произвольные файлы или устанавливать дополнительные инструменты. Всё можно настроить так, чтобы единственным способом получить флаг было понимание и эксплуатация самого приложения.
📋 Содержание
- 🧭 Обзор
- ✨ Возможности
- 📸 Скриншоты
- ⚙️ Конфигурация
- 🧩 Варианты использования
- ⚙️ Использование
- 💡 Советы
- 🛠 Разработка
- 🤝 Вклад в проект
- 📚 Благодарности
- 🪪 Лицензия
🧭 Обзор
DroidGround позволяет проводить самые разные Android-задачи, которые трудно реализовать в традиционных CTF-окружениях. Например, в задаче на удалённое выполнение кода (RCE) игроки могут получить APK для локального анализа. После обнаружения уязвимости они могут разработать Frida-скрипт и запустить его через DroidGround на реальном целевом устройстве, чтобы извлечь флаг из внутреннего хранилища. Другие типы задач могут включать скрытые активности, пользовательские broadcast-намерения, эксплуатацию сервисов или динамический анализ с использованием предустановленных инструментов.
Благодаря потоковой передаче экрана устройства в реальном времени, тонкой настройке функций, интеграции Frida и настраиваемым скриптам установки и сброса, DroidGround позволяет организаторам CTF создавать безопасные, гибкие и реалистичные Android-задачи, выходящие далеко за рамки обычных возможностей.
✨ Возможности
DroidGround предоставляет богатый набор функций, управляемых сервером.
- Экран устройства в реальном времени (через
scrcpy) - Сброс состояния задачи
- Перезапуск приложения / Запуск активности / Запуск сервиса
- Отправка broadcast-намерения
- Выключение / Перезагрузка устройства
- Загрузка bugreport (bugreportz)
- Frida-скрипты
- Запуск из предустановленной библиотеки (jailed-режим)
- Запуск произвольных скриптов (полный режим)
- Файловый браузер
- Доступ к терминалу
- Управление APK
- Просмотр logcat
- Эксплойт-сервер (если включён командный режим)
Почти все функции являются модульными и определяются через переменные окружения, что обеспечивает точный контроль над областью задачи.
📸 Скриншоты
![]() | ![]() |
|---|---|
| Обзор | Запуск активности |
![]() | ![]() |
| Frida Jailed Mode | Frida Full Mode |
![]() | ![]() |
| Файловый браузер | Менеджер приложений |
![]() | ![]() |
| Терминал | Журналы |
⚙️ Конфигурация
Файл .env.sample в корневом каталоге — хорошая отправная точка. Вот полный список всех поддерживаемых в настоящее время переменных окружения:
| Переменная | Описание | По умолчанию |
|---|---|---|
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) | - |
Переменная DROIDGROUND_IP_IFACE сначала ищет точное совпадение, а затем переключается на первый интерфейс, который начинается с указанного значения, поскольку Docker позволяет указывать только префикс сетевого интерфейса внутри контейнера.
Использование переменной DROIDGROUND_NUM_TEAMS немного меняет поведение приложения под капотом. Если эта опция задана:
- Включается функция эксплойт-сервера, позволяющая каждой команде использовать свой собственный (очень простой) эксплойт-сервер через свой токен команды.
- Токен команды будет обязателен для установки и запуска эксплойт-приложений. Каждое установленное приложение будет привязано к команде, и другие команды не смогут его запустить.
Это позволяет использовать один экземпляр DroidGround для нескольких команд в задачах, где флаг можно извлечь через сетевой запрос. Это значительно снижает затраты на развёртывание DroidGround для CTF-соревнований.
Кроме того, если задано значение -1, будет включён так называемый режим Безлимитные команды. В этом режиме на странице Обзор появляется кнопка для генерации нового токена команды. Все переменные DROIDGROUND_TEAM_TOKEN_<N> игнорируются, если этот режим включён.
🧩 Варианты использования
Вот некоторые способы применения DroidGround:
- Скрытая активность: найдите и запустите неэкспонированную активность, чтобы увидеть флаг (в приложении игрока находится фиктивный флаг).
- RCE: приложение уязвимо к RCE, а флаг хранится на устройстве.
- Frida-инструментирование: перегрузите метод и извлеките флаг из приватной памяти с помощью скрипта.
⚙️ Использование
В папке examples приведено несколько примеров файлов Docker Compose. В них используются приложения из репозитория примеров DroidGround, который будет постепенно расширяться для демонстрации всех ключевых функций. Они также являются хорошей отправной точкой для понимания того, как настроить собственный CTF.
При загрузке DroidGround выполняет следующие действия:
- Настраивает соединение с
adb - Запускает
setup.shв папке, указанной вDROIDGROUND_INIT_SCRIPTS_FOLDER, если она присутствует. Этот скрипт можно использовать для установки целевого приложения и выполнения всего остального, что необходимо для инициализации CTF (например, размещения флага в известном месте) - (если Frida включена) Загружает подходящий
frida-serverна основе установленной версии и архитектуры устройства и запускает его - Запускает целевое приложение (то, которое указано через
DROIDGROUND_APP_PACKAGE_NAME). Если приложение не установлено, DroidGround завершит работу. - Настраивает REST API, WebSocket-серверы и потоковую передачу экрана
Вот пример скрипта 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:
- Будьте осторожны при включении Frida Full Mode: игрок получит полный контроль над устройством (именно поэтому мы сделали Frida Jail Mode, как подробно описано в Frida Library).
- Будьте осторожны при включении терминала: игрок получит полный контроль над устройством.
- Будьте осторожны при включении функции выключения.
- Если вы планируете сделать флаг напрямую видимым в интерфейсе, возможно, вам стоит найти способ создавать отдельные экземпляры (по одному для каждой команды/игрока)
При тестировании настройки перед запуском в production может быть полезно получить поверхность атаки целевого приложения. Это то, что игроки не должны видеть, потому что обнаружение и анализ поверхности атаки — часть их работы!
Поэтому предоставляется GET-эндпоинт, доступный по адресу /attackSurface, защищённый токеном (который нужно использовать в качестве значения заголовка Authorization), который случайным образом генерируется при загрузке и выводится в журналы (то есть доступен только системным администраторам).
Если вы хотите использовать собственные Frida-скрипты в jailed-режиме, вам нужно всего лишь примонтировать папку с ними в Docker-контейнер:
volumes:
- <Frida library folder>:/droidground/library
Файл library.json (как в library) требуется, чтобы сообщить приложению список доступных скриптов.
🛠 Разработка
Запустить проект в режиме разработки не должно быть слишком сложно, но перед началом вам понадобятся следующие инструменты:
frida(только если вы включаете Frida)node(это Node-приложение, он вам нужен!)adb(мы полагаемся на него для общения с устройством)- JDK (нужен для сборки сопутствующего приложения)
После этого вы можете просто выполнить следующее:
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







