
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.
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.
DroidGround offre un ricco set di funzionalità controllate dal server.
scrcpy)Quasi tutte le funzionalità sono modulari e definite tramite variabili d'ambiente, garantendo un controllo preciso sull'ambito della sfida.
Il file .env.sample nella directory principale è un buon punto di partenza. Questa è l'elenco completo di tutte le variabili d'ambiente attualmente supportate:
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:
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.
Ecco alcuni modi in cui DroidGround può essere utilizzato:
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:
adbsetup.sh nella cartella specificata da DROIDGROUND_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)frida-server corretto in base alla versione installata e all'architettura del dispositivo e lo avviaDROIDGROUND_APP_PACKAGE_NAME). Se l'app non è installata, DroidGround terminerà.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.
Ecco alcuni suggerimenti per allestire il tuo CTF Android:
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).
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)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!
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.
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.
DroidGround è rilasciato sotto la licenza GPL-3.0.
![]() | ![]() |
|---|
| Panoramica | Avvia Activity |
![]() | ![]() |
| Frida Modalità Jail | Frida Modalità Completa |
![]() | ![]() |
| Esplora File | Gestore App |
![]() | ![]() |
| Terminale | Log |
| 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) | - |