
droidground v1.0.14
Un parco giochi flessibile per le sfide CTF su Android.
DroidGround
Nelle tradizionali sfide CTF, è comune nascondere le flag in file su un sistema, richiedendo agli attacker di sfruttare vulnerabilità per recuperarle. Tuttavia, nel mondo Android questo approccio non funziona bene. I file APK sono facilmente scaricabili e reversibili, quindi posizionare una flag sul dispositivo di solito la rende banale da estrarre tramite analisi statica o trucchi con l'emulatore. Questo limita fortemente la possibilità di creare sfide realistiche e incentrate sul runtime.
DroidGround è progettato per risolvere questo problema.
È una piattaforma costruita su misura per ospitare sfide di hacking mobile Android in un ambiente controllato e realistico, in cui gli attacker sono limitati quel tanto che basta per richiedere la risoluzione delle sfide nel modo previsto.
È importante notare che i partecipanti possono essere confinati all'interno dell'ambiente dell'app. La modularità dello strumento consente di impostare se l'utente può o non può aprire una shell, leggere file arbitrari o eseguire il sideload di strumenti. Tutto può essere configurato in modo che l'unico modo per recuperare la flag sia comprendere e sfruttare l'app stessa.
📋 Indice dei contenuti
- 🧭 Panoramica
- ✨ Funzionalità
- 📸 Screenshot
- ⚙️ Configurazione
- 🧩 Casi d'uso
- ⚙️ Utilizzo
- 💡 Consigli
- 🛠 Sviluppo
- 🤝 Contributi
- 📚 Crediti
- 🪪 Licenza
🧭 Panoramica
DroidGround consente di realizzare un'ampia varietà di sfide Android che altrimenti sarebbero difficili da implementare nelle tradizionali configurazioni CTF. Ad esempio, in una sfida di remote code execution (RCE), i giocatori potrebbero ricevere un APK per l'analisi locale. Dopo aver scoperto una vulnerabilità, possono sviluppare uno script Frida ed eseguirlo tramite DroidGround sul dispositivo target reale per estrarre la flag dalla memoria interna. Altri tipi di sfida possono coinvolgere activity nascoste, intent broadcast personalizzati, sfruttamento di servizi o analisi dinamica tramite strumenti preinstallati.
Con lo streaming del dispositivo in tempo reale, il controllo granulare delle funzionalità, l'integrazione con Frida e script di setup e reset personalizzabili, DroidGround consente agli organizzatori di CTF di creare sfide Android sicure, flessibili e realistiche che vanno ben oltre ciò che è tipicamente possibile.
✨ Funzionalità
DroidGround offre un ricco set di funzionalità controllate dal server.
- Schermo del dispositivo in tempo reale (tramite
scrcpy) - Reimposta lo stato della sfida
- Riavvia App / Avvia Activity / Avvia Service
- Invia Broadcast Intent
- Spegnimento / Riavvio del dispositivo
- Scarica Bugreport (bugreportz)
- Scripting Frida
- Esegui dalla libreria preinstallata (modalità jail)
- Esegui script arbitrari (modalità completa)
- Esplora File
- Accesso al Terminale
- Gestione APK
- Visualizzatore Logcat
- Server Exploit (se la modalità a squadre è attiva)
Quasi tutte le funzionalità sono modulari e definite tramite variabili d'ambiente, garantendo un controllo preciso sull'ambito della sfida.
📸 Screenshot
![]() | ![]() |
|---|---|
| Panoramica | Avvia Activity |
![]() | ![]() |
| Frida Modalità Jail | Frida Modalità Completa |
![]() | ![]() |
| Esplora File | Gestore App |
![]() | ![]() |
| Terminale | Log |
⚙️ Configurazione
Il file .env.sample nella directory principale è un buon punto di partenza. Questa è l'elenco completo di tutte le variabili d'ambiente attualmente supportate:
| Variable | Description | Default |
|---|---|---|
DROIDGROUND_BASE_PATH | Percorso della webapp (utile per l'hosting su sottopercorsi) | - |
DROIDGROUND_APP_PACKAGE_NAME | Nome del pacchetto dell'app target | - |
DROIDGROUND_ADB_HOST | Host ADB | localhost |
DROIDGROUND_ADB_PORT | Porta ADB | 5037 |
DROIDGROUND_ADB_SERIAL | Seriale del dispositivo ADB opzionale a cui connettersi | - |
DROIDGROUND_DEVICE_TYPE | usb o network | usb |
DROIDGROUND_DEVICE_HOST | IP del dispositivo Android (adb) (solo modalità network) | - |
DROIDGROUND_DEVICE_PORT | Porta del dispositivo Android (adb) (solo modalità network) | - |
DROIDGROUND_INIT_SCRIPTS_FOLDER | Cartella contenente setup.sh e reset.sh | /init.d |
DROIDGROUND_HOST | Indirizzo di bind | 0.0.0.0 |
DROIDGROUND_PORT | Porta di bind | 4242 |
DROIDGROUND_RESTART_APP_DISABLED | Disabilita il riavvio dell'app | false |
DROIDGROUND_APP_MANAGER_DISABLED | Disabilita il gestore app | false |
DROIDGROUND_BUG_REPORT_DISABLED | Disabilita il bugreport | false |
DROIDGROUND_FILE_BROWSER_DISABLED | Disabilita l'esplora file | false |
DROIDGROUND_FRIDA_DISABLED | Disabilita il supporto Frida | false |
DROIDGROUND_FRIDA_TYPE | jail o full | jail |
DROIDGROUND_FRIDA_INJECTION | server o gadget | server |
DROIDGROUND_LOGCAT_DISABLED | Disabilita logcat | false |
DROIDGROUND_REBOOT_ENABLED | Abilita il riavvio | false |
DROIDGROUND_SHUTDOWN_ENABLED | Abilita lo spegnimento | false |
DROIDGROUND_START_ACTIVITY_DISABLED | Disabilita startActivity | false |
DROIDGROUND_START_RECEIVER_DISABLED | Disabilita il broadcast | false |
DROIDGROUND_START_SERVICE_DISABLED | Disabilita startService | false |
DROIDGROUND_TERMINAL_DISABLED | Disabilita il terminale | false |
DROIDGROUND_RESET_DISABLED | Disabilita il reset | false |
DROIDGROUND_EXPLOIT_APP_DURATION | Il tempo (in secondi) durante il quale l'app exploit sarà attiva | 10 |
DROIDGROUND_EXPLOIT_APP_MAX_SIZE | La dimensione massima (in MB) dell'app exploit | 50 |
DROIDGROUND_NUM_TEAMS | Il numero di squadre che giocano simultaneamente | - |
DROIDGROUND_TEAM_TOKEN_<N> | Il token per l'ennesima squadra. Auto-generato se mancante | - |
DROIDGROUND_IP_STATIC | L'indirizzo IP statico da visualizzare. Ha precedenza su DROIDGROUND_IP_IFACE | - |
DROIDGROUND_IP_IFACE | L'interfaccia di rete per l'indirizzo IP visualizzato | - |
DROIDGROUND_LOGO_LINK | Imposta opzionalmente il link di click-through del logo (es. la tua pagina principale CTF) | - |
La variabile DROIDGROUND_IP_IFACE cerca prima una corrispondenza esatta e ripiega sulla prima interfaccia che inizia con il valore fornito, poiché Docker consente di specificare solo il prefisso dell'interfaccia di rete all'interno del container.
L'uso della variabile DROIDGROUND_NUM_TEAMS modifica leggermente il comportamento dell'applicazione internamente. Se questa opzione è impostata:
- La funzionalità del server exploit viene abilitata, consentendo a ogni squadra di usare il proprio server exploit (molto semplice) tramite il proprio team token.
- Il team token sarà richiesto per installare ed eseguire le app exploit. Ogni app installata sarà associata a una squadra e le altre squadre non potranno eseguirla.
Questo consente di condividere la stessa istanza di DroidGround tra più squadre in sfide in cui la flag può essere esfiltrata tramite una richiesta di rete. Questo riduce drasticamente i costi di deployment di DroidGround per le competizioni CTF.
Inoltre, se il valore è impostato a -1, verrà abilitata la cosiddetta modalità Squadre Illimitate. In questa modalità, nella pagina Panoramica sarà disponibile un pulsante per generare un nuovo team token. Tutte le variabili DROIDGROUND_TEAM_TOKEN_<N> vengono ignorate se questa modalità è abilitata.
🧩 Casi d'uso
Ecco alcuni modi in cui DroidGround può essere utilizzato:
- Activity Nascosta: Trova e avvia un'activity non esposta per vedere la flag (l'app del giocatore contiene una flag fittizia).
- RCE: L'app è vulnerabile a RCE e la flag è memorizzata sul dispositivo.
- Instrumentazione Frida: Sovraccarica un metodo ed estrai la flag dalla memoria privata usando uno script.
⚙️ Utilizzo
Nella cartella examples sono forniti un paio di file Docker Compose di esempio. Usano app del repository degli esempi di DroidGround che verranno progressivamente ampliate per mostrare tutte le funzionalità principali. Sono anche un buon punto di partenza per capire come allestire il tuo CTF.
All'avvio DroidGround esegue le seguenti operazioni:
- Imposta la connessione con
adb - Esegue lo script
setup.shnella cartella specificata daDROIDGROUND_INIT_SCRIPTS_FOLDER, se presente. Questo script può essere usato per installare l'app target e fare tutto il necessario per inizializzare il CTF (es. posizionare la flag in una posizione nota) - (se Frida è abilitata) Scarica il
frida-servercorretto in base alla versione installata e all'architettura del dispositivo e lo avvia - Esegue l'app target (quella specificata tramite
DROIDGROUND_APP_PACKAGE_NAME). Se l'app non è installata, DroidGround terminerà. - Configura le API REST, i server WebSocket e lo streaming del display
Ecco un esempio di script 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"
Per un deploy in produzione (in un CTF reale) potresti voler predisporre in anticipo un numero predefinito di istanze di DroidGround, oppure consentire agli utenti di creare istanze (con una limitazione o magari associando ogni squadra/utente a un'istanza specifica). Per questo motivo abbiamo aggiunto anche un semplice esempio di spawner.
In alternativa, come accennato in precedenza, puoi creare una sfida in cui la flag può essere esfiltrata tramite una richiesta di rete e sfruttare la variabile d'ambiente DROIDGROUND_NUM_TEAMS per evitare di creare più istanze (operazione che potrebbe essere costosa). La cartella net-multi-step fornisce un buon esempio su come realizzare questo tipo di sfide.
💡 Consigli
Ecco alcuni suggerimenti per allestire il tuo CTF Android:
- Fai attenzione quando abiliti la Frida Full Mode: il giocatore avrà il controllo completo del dispositivo (è per questo che abbiamo creato la Frida Jail Mode, come descritto in Frida Library).
- Fai attenzione quando abiliti il Terminale: il giocatore avrà il controllo completo del dispositivo.
- Fai attenzione quando abiliti la funzionalità Shutdown.
- Se prevedi di rendere la flag direttamente visibile nell'interfaccia, potresti voler trovare un modo per creare istanze diverse (una per ogni squadra/giocatore).
Durante i test della configurazione prima di andare in produzione, potrebbe essere utile ottenere la superficie d'attacco dell'app target. Questo è qualcosa che i giocatori non dovrebbero vedere, perché fa parte del loro compito scoprire e analizzare la superficie d'attacco!
Pertanto, è disponibile un endpoint GET raggiungibile all'indirizzo /attackSurface, protetto da un token (da usare come valore dell'header Authorization) generato casualmente durante l'avvio e stampato nei log (quindi accessibile solo ai sysadmin).
Se vuoi usare i tuoi script Frida in modalità jail, devi solo montare tramite bind-mount la cartella che li contiene nel container Docker:
volumes:
- <Frida library folder>:/droidground/library
Per istruire l'applicazione sull'elenco degli script disponibili è necessario un file library.json (come quello nella cartella library).
🛠 Sviluppo
Far funzionare il progetto non dovrebbe essere troppo difficile, ma prima di iniziare dovresti avere installati i seguenti strumenti:
frida(solo se abiliti Frida)node(è un'app Node, devi averlo!)adb(beh, ci affidiamo a esso per comunicare con il dispositivo)- JDK (ti serve per compilare l'app companion)
Dopodiché puoi semplicemente eseguire quanto segue:
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
Dopodiché devi solo impostare le variabili env e poi eseguire npm run dev, e sei a posto. Buon dev mode!
🤝 Contributi
Le pull request sono benvenute! Per favore, apri prima una issue per discutere le modifiche importanti. Le idee per nuovi flussi di lavoro CTF o tipi di sfida sono particolarmente apprezzate.
📚 Crediti
Sviluppato da Angelo Delicato @SECFORCE.
La sezione server si basa in gran parte sull'incredibile lavoro di @yume-chan; probabilmente quest'app non esisterebbe senza il suo straordinario lavoro.
L'app companion è fortemente basata sul server aya, che funziona allo stesso modo del server scrcpy. Ulteriori dettagli sono disponibili nel relativo README.
🪪 Licenza
DroidGround è rilasciato sotto la licenza GPL-3.0.







