Zurück zu den Updates
New releaseJul 28, 2026

droidground v1.0.11

Ein flexibler Spielplatz für Android-CTF-Herausforderungen.

Teilen


droidground

DroidGround


Website | Demo

In traditionellen CTF-Challenges ist es üblich, Flags in Dateien auf einem System zu verstecken, sodass Angreifer Schwachstellen ausnutzen müssen, um sie zu erhalten. In der Android-Welt funktioniert dieser Ansatz jedoch nicht gut. APK-Dateien sind leicht herunterladbar und reversibel, daher ist es normalerweise trivial, eine Flag auf dem Gerät zu platzieren und sie mithilfe statischer Analyse oder Emulator-Tricks zu extrahieren. Das schränkt die Möglichkeit, realistische, auf die Laufzeit fokussierte Challenges zu erstellen, erheblich ein.

DroidGround wurde entwickelt, um dieses Problem zu lösen.

Es ist eine maßgeschneiderte Plattform zum Hosten von Android-Mobile-Hacking-Challenges in einer kontrollierten und realistischen Umgebung, in der Angreifer gerade genug eingeschränkt sind, um die Challenges auf die beabsichtigte Weise lösen zu müssen.

Wichtig ist, dass die Teilnehmer in die App-Umgebung gesperrt sein können. Die Modularität des Tools erlaubt es festzulegen, ob der Benutzer eine Shell starten, beliebige Dateien lesen oder Tools sideloaden kann. Alles kann so eingerichtet werden, dass der einzige Weg, die Flag zu erhalten, darin besteht, die App selbst zu verstehen und auszunutzen.

📋 Inhaltsverzeichnis

🧭 Übersicht

DroidGround ermöglicht eine große Vielfalt an Android-Challenges, die in traditionellen CTF-Setups sonst schwer umzusetzen sind. Beispielsweise könnten die Spieler bei einer Remote-Code-Execution-Challenge (RCE) eine APK zur lokalen Analyse erhalten. Nach der Entdeckung einer Schwachstelle können sie ein Frida-Skript entwickeln und es über DroidGround auf dem echten Zielgerät ausführen, um die Flag aus dem internen Speicher zu extrahieren. Andere Challenge-Typen können versteckte Activities, benutzerdefinierte Broadcast-Intents, Service-Exploitation oder dynamische Analyse mit vorinstallierten Tools umfassen.

Mit Echtzeit-Geräte-Streaming, feingranularer Kontrolle über Funktionen, Frida-Integration und anpassbaren Setup- und Reset-Skripten befähigt DroidGround CTF-Organisatoren, sichere, flexible und realistische Android-Challenges zu bauen, die weit über das normalerweise Mögliche hinausgehen.

✨ Funktionen

DroidGround bietet eine umfangreiche Palette an servergesteuerten Funktionen.

  • Echtzeit-Gerätebildschirm (über scrcpy)
  • Challenge-Status zurücksetzen
  • App neu starten / Aktivität starten / Dienst starten
  • Broadcast-Intent senden
  • Gerät herunterfahren / neu starten
  • Bugreport herunterladen (bugreportz)
  • Frida-Skripting
    • Aus der vorinstallierten Bibliothek ausführen (Jail-Modus)
    • Beliebige Skripte ausführen (Vollmodus)
  • Dateibrowser
  • Terminalzugriff
  • APK-Verwaltung
  • Logcat-Viewer
  • Exploit-Server (falls der Team-Modus aktiviert ist)

Fast alle Funktionen sind modular und werden über Umgebungsvariablen definiert, sodass eine präzise Kontrolle über den Challenge-Umfang gewährleistet ist.

📸 Screenshots

Screenshot ÜbersichtScreenshot Aktivität starten
ÜbersichtAktivität starten
Screenshot Frida-Jail-ModusScreenshot Frida-Vollmodus
Frida-Jail-ModusFrida-Vollmodus
Screenshot DateibrowserScreenshot App-Manager
DateibrowserApp-Manager
Screenshot TerminalScreenshot Logs
TerminalLogs

⚙️ Konfiguration

Die Datei .env.sample im Stammverzeichnis ist ein guter Ausgangspunkt. Dies ist die vollständige Liste aller derzeit unterstützten Umgebungsvariablen:

VariableDescriptionDefault
DROIDGROUND_BASE_PATHPfad der Webapp (nützlich für das Hosten auf Unterpfaden)-
DROIDGROUND_APP_PACKAGE_NAMEPaketname der Ziel-App-
DROIDGROUND_ADB_HOSTADB-Hostlocalhost
DROIDGROUND_ADB_PORTADB-Port5037
DROIDGROUND_ADB_SERIALOptionale ADB-Geräteseriennummer, mit der verbunden werden soll-
DROIDGROUND_DEVICE_TYPEusb oder networkusb
DROIDGROUND_DEVICE_HOSTIP des Android-Geräts (adb) (nur Netzwerkmodus)-
DROIDGROUND_DEVICE_PORTPort des Android-Geräts (adb) (nur Netzwerkmodus)-
DROIDGROUND_INIT_SCRIPTS_FOLDEROrdner, der setup.sh und reset.sh enthält/init.d
DROIDGROUND_HOSTBind-Adresse0.0.0.0
DROIDGROUND_PORTBind-Port4242
DROIDGROUND_RESTART_APP_DISABLEDApp-Neustart deaktivierenfalse
DROIDGROUND_APP_MANAGER_DISABLEDApp-Manager deaktivierenfalse
DROIDGROUND_BUG_REPORT_DISABLEDBugreport deaktivierenfalse
DROIDGROUND_FILE_BROWSER_DISABLEDDateibrowser deaktivierenfalse
DROIDGROUND_FRIDA_DISABLEDFrida-Unterstützung deaktivierenfalse
DROIDGROUND_FRIDA_TYPEjail oder fulljail
DROIDGROUND_FRIDA_INJECTIONserver oder gadgetserver
DROIDGROUND_LOGCAT_DISABLEDLogcat deaktivierenfalse
DROIDGROUND_REBOOT_ENABLEDNeustart aktivierenfalse
DROIDGROUND_SHUTDOWN_ENABLEDHerunterfahren aktivierenfalse
DROIDGROUND_START_ACTIVITY_DISABLEDstartActivity deaktivierenfalse
DROIDGROUND_START_RECEIVER_DISABLEDBroadcast deaktivierenfalse
DROIDGROUND_START_SERVICE_DISABLEDstartService deaktivierenfalse
DROIDGROUND_TERMINAL_DISABLEDTerminal deaktivierenfalse
DROIDGROUND_RESET_DISABLEDReset deaktivierenfalse
DROIDGROUND_EXPLOIT_APP_DURATIONDie Zeit (in Sekunden), in der die Exploit-App aktiv ist10
DROIDGROUND_EXPLOIT_APP_MAX_SIZEDie maximale Größe (in MB) der Exploit-App50
DROIDGROUND_NUM_TEAMSDie Anzahl der gleichzeitig spielenden Teams-
DROIDGROUND_TEAM_TOKEN_<N>Das Token für das n-te Team. Wird automatisch generiert, falls es fehlt-
DROIDGROUND_IP_STATICDie statische IP-Adresse zur Anzeige. Sie hat Vorrang vor DROIDGROUND_IP_IFACE-
DROIDGROUND_IP_IFACEDie Netzwerkschnittstelle für die angezeigte IP-Adresse-
DROIDGROUND_LOGO_LINKOptional den Klick-Ziel-Link des Logos festlegen (z. B. deine CTF-Hauptseite)-

DROIDGROUND_IP_IFACE sucht zuerst nach einer exakten Übereinstimmung und fällt auf die erste Schnittstelle zurück, die mit dem angegebenen Wert beginnt, da Docker innerhalb des Containers nur die Angabe des Netzwerkschnittstellen-Präfixes erlaubt.

Die Verwendung der Variable DROIDGROUND_NUM_TEAMS ändert das Verhalten der Anwendung im Hintergrund leicht. Wenn diese Option gesetzt ist:

  1. Die Exploit-Server-Funktion wird aktiviert, sodass jedes Team seinen eigenen (sehr einfachen) Exploit-Server über sein Team-Token nutzen kann.
  2. Das Team-Token ist erforderlich, um Exploit-Apps zu installieren und auszuführen. Jede installierte App wird einem Team zugeordnet und andere Teams können sie nicht ausführen.

Dadurch kann dieselbe DroidGround-Instanz von mehreren Teams bei Challenges genutzt werden, bei denen die Flag über eine Netzwerkanfrage exfiltriert werden kann. Das reduziert die Bereitstellungskosten von DroidGround für CTF-Wettbewerbe massiv.

Darüber hinaus wird bei einem Wert von -1 der sogenannte Unlimited Teams-Modus aktiviert. In diesem Modus ist auf der Seite Übersicht eine Schaltfläche zum Generieren eines neuen Team-Tokens verfügbar. Alle DROIDGROUND_TEAM_TOKEN_<N>-Variablen werden ignoriert, wenn dieser Modus aktiviert ist.

🧩 Anwendungsfälle

Hier sind einige Möglichkeiten, wie DroidGround verwendet werden kann:

  1. Versteckte Aktivität: Eine nicht exponierte Aktivität finden und starten, um die Flag zu sehen (die App des Spielers enthält eine Dummy-Flag).
  2. RCE: Die App ist anfällig für RCE und die Flag ist auf dem Gerät gespeichert.
  3. Frida-Instrumentierung: Eine Methode überladen und mit einem Skript die Flag aus dem privaten Speicher extrahieren.

⚙️ Verwendung

Einige Beispiel-Docker Compose-Dateien sind im Ordner examples enthalten. Sie verwenden Apps aus dem DroidGround-Beispiel-Repository, das nach und nach erweitert wird, um alle wichtigen Funktionen zu demonstrieren. Sie sind auch ein guter Ausgangspunkt, um zu verstehen, wie man ein eigenes CTF einrichtet.

Beim Start führt DroidGround Folgendes aus:

  1. Die Verbindung mit adb einrichten
  2. Das setup.sh in dem von DROIDGROUND_INIT_SCRIPTS_FOLDER angegebenen Ordner ausführen, falls vorhanden. Dieses Skript kann verwendet werden, um die Ziel-App zu installieren und alles andere zu tun, was zur Initialisierung des CTFs benötigt wird (z. B. die Flag an einem bekannten Ort zu platzieren).
  3. (falls Frida aktiviert ist) Den passenden frida-server basierend auf der installierten Version und der Architektur des Geräts herunterladen und starten
  4. Die Ziel-App ausführen (diejenige, die über DROIDGROUND_APP_PACKAGE_NAME angegeben wurde). Wenn die App nicht installiert ist, beendet sich DroidGround.
  5. Die REST-APIs, die WebSocket-Server und das Display-Streaming einrichten

Hier ist ein Beispiel für ein setup.sh-Skript:

#!/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"

Für eine Produktionsbereitstellung (in einem echten CTF) möchtest du möglicherweise im Voraus eine festgelegte Anzahl von DroidGround-Instanzen bereitstellen oder den Benutzern erlauben, Instanzen zu erzeugen (mit einer Begrenzung oder vielleicht der Zuordnung jedes Teams/Benutzers zu einer bestimmten Instanz). Aus diesem Grund haben wir auch ein einfaches Spawner-Beispiel hinzugefügt.

Alternativ kannst du, wie bereits erwähnt, eine Challenge erstellen, bei der die Flag über eine Netzwerkanfrage exfiltriert werden kann, und die Umgebungsvariable DROIDGROUND_NUM_TEAMS nutzen, um das Erzeugen mehrerer Instanzen zu vermeiden (was teuer sein kann). Der Ordner net-multi-step bietet ein gutes Beispiel, wie solche Challenges umgesetzt werden können.

💡 Tipps

Hier sind einige Vorschläge für die Einrichtung deines Android-CTFs:

  • Sei vorsichtig, wenn du den Frida-Vollmodus aktivierst – der Spieler hat dann die vollständige Kontrolle über das Gerät (deshalb haben wir den Frida-Jail-Modus entwickelt, wie in Frida Library beschrieben).
  • Sei vorsichtig, wenn du das Terminal aktivierst – der Spieler hat dann die vollständige Kontrolle über das Gerät.
  • Sei vorsichtig, wenn du die Herunterfahren-Funktion aktivierst.
  • Wenn du planst, die Flag direkt in der Benutzeroberfläche sichtbar zu machen, solltest du einen Weg finden, verschiedene Instanzen zu erzeugen (eine für jedes Team/jeden Spieler).

Beim Testen des Setups vor der Produktion kann es nützlich sein, die Angriffsfläche der Ziel-App zu ermitteln. Das ist etwas, das die Spieler nicht sehen sollten, denn es ist Teil ihrer Aufgabe, die Angriffsfläche zu entdecken und zu analysieren!

Daher wird ein GET-Endpunkt unter /attackSurface bereitgestellt und mit einem Token geschützt (das als Wert des Authorization-Headers verwendet werden muss), das beim Start zufällig generiert und in den Logs ausgegeben wird (also nur für Systemadministratoren zugänglich ist).

Wenn du deine eigenen Frida-Skripte im Jail-Modus verwenden möchtest, musst du nur den Ordner, der sie enthält, in den Docker-Container bind-mounten:

volumes:
  - <Frida library folder>:/droidground/library

Eine Datei library.json (wie die in der library) ist erforderlich, um der Anwendung die Liste der verfügbaren Skripte mitzuteilen.

🛠 Entwicklung

Es sollte nicht allzu schwierig sein, es zum Laufen zu bringen, aber bevor du beginnst, solltest du die folgenden Werkzeuge installiert haben:

  • frida (nur wenn du Frida aktivierst)
  • node (es ist eine Node-App, du brauchst sie!)
  • adb (nun, wir verlassen uns darauf, um mit dem Gerät zu kommunizieren)
  • JDK (du brauchst es, um die Companion-App zu bauen)

Danach kannst du einfach Folgendes ausführen:

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

Danach musst du nur noch die env-Variablen setzen und dann npm run dev ausführen – dann kannst du loslegen. Viel Spaß im Dev-Modus!

🤝 Mitwirken

Pull-Requests sind willkommen! Bitte eröffne zuerst ein Issue, um größere Änderungen zu besprechen. Ideen für neue CTF-Workflows oder Challenge-Typen sind besonders willkommen.

📚 Credits

Entwickelt von Angelo Delicato @SECFORCE.

Der Server-Bereich stützt sich stark auf die großartige Arbeit von @yume-chan; wahrscheinlich würde diese App ohne seine großartige Arbeit nicht existieren.

Die Companion-App basiert stark auf dem aya server, der auf die gleiche Weise funktioniert wie der scrcpy server. Weitere Details findest du in der spezifischen README.

🪪 Lizenz

DroidGround wird unter der GPL-3.0-Lizenz veröffentlicht.

Kategorien