
Fuzzer in-process guidato dalla copertura per il daemon Bluetooth di iOS (bluetoothd) che utilizza FRIDA, con fuzzing over-the-air per il protocollo MagicPairing e capacità di replay dei crash.

ToothPicker è un fuzzer in-process, guidato dalla copertura, per iOS. È stato sviluppato per colpire specificamente il demone Bluetooth di iOS bluetoothd e per analizzare vari protocolli Bluetooth su iOS. Poiché è costruito usando FRIDA, può essere adattato per colpire qualsiasi piattaforma che esegue FRIDA.
Questo repository include anche un fuzzer over-the-air con un'implementazione esemplificativa per fare fuzzing del protocollo MagicPairing di Apple usando InternalBlue. Inoltre, contiene lo script ReplayCrashFile.py che può essere usato per verificare i crash che il fuzzer in-process ha trovato.
Questo è un fuzzer molto semplice che si limita a invertire bit e byte nelle connessioni attive. Nessuna guida alla copertura, nessuna iniezione, ma carino come demo e stateful. Funziona solo con Python+Frida, nessun modulo o installazione richiesta. Testato su iOS 13.5-14.3. Vedi inplace-fuzzer.
Il Fuzzer In-Process funziona out-of-the-box su varie versioni di iOS (13.3-13.7 testate), ma i simboli devono essere specificati. Altre versioni di iOS richiedono adattamenti agli indirizzi delle funzioni. Inoltre, sembra che lo stalker di FRIDA abbia qualche problema con l'iPhone 8. Su iPhone più nuovi che supportano PAC, le prestazioni risentono significativamente della firma dei puntatori. Pertanto, si consiglia di eseguirlo su un iPhone 7.
ToothPicker è costruito sulla base di codice di frizzer. Tuttavia, è stato adattato per questa applicazione specifica e quindi non è più compatibile con la versione originale. Esistono piani per sostituirlo con un componente più dedicato in futuro.
Sull'iPhone:
Su Linux:
Per Linux basato su Arch:
# usbmuxd typically comes with libimobiledevice
# but just to be sure, we manually install it as well
sudo pacman -S usbmuxd libimobiledevice python-virtualenv radamsa
# Connect the iPhone to the computer
# Unlock it.
# If a pairing message pops up, click "Trust"
# If no pairing message pops up:
idevicepair pair
# Now there should be the pop up, accept and then again:
idevicepair pair
# In case of connection errors:
sudo systemctl restart usbmuxd
# or pair phone and computer again
# Other useful commands
# To ssh into the iPhone:
# Checkra1n comes with an SSH server listening on Port 44
# Proxy the phone's SSH port to 4444 localport:
iproxy 4444 44
# Connect:
ssh root@localhost -p 4444
# Default password: alpine
# To fetch some device information of the phone:
ideviceinfo
Per Debian Linux:
Quasi lo stesso di sopra. Eccezioni:
radamsa deve essere installato dal repository git perché non è impacchettato.iproxy richiede il pacchetto aggiuntivo libusbmuxd-tools.Per macOS:
Comandi leggermente diversi rispetto alla configurazione di Arch Linux...
brew install libimobiledevice usbmuxd radamsa npm
idevicepair pair
npm install frida-compile
pip3 install frida-tools
Su macOS, PacketLogger, che fa parte degli Additional Tools for Xcode, può decodificare vari pacchetti una volta installato il Bluetooth Debug Profile. Inoltre, se apri i log di crash di iOS con Xcode, verranno aggiunti alcuni simboli.
Configurazione:
frizzer.frizzer.projects contiene un progetto di esempio per fare fuzzing del protocollo MagicPairing.MagicPairing in un unico file.cd nella directory harness e installa frida-compile. Nota che questo deve essere eseguito in quella cartella e può essere installato direttamente come utente eseguendo npm install frida-compile.frida-compile ../projects/YOUR_PROJECT/YOUR_SPECIALIZED_HARNESS.JS -o ../projects/YOUR_PROJECT/harness.js. Poiché questo è stato installato nel contesto npm, potrebbe essere necessario eseguire npx frida-compile invece. Ogni volta che l'harness cambia, devi rieseguire .Fuzzing:
killall -9 bluetoothd per avviare bluetoothd da capo.cd nella directory del tuo progetto, crea la directory dei log di crash (mkdir crashes) ed esegui ../../frizzer/fuzzer.py fuzz -p .In breve, per avviare un nuovo progetto, esegui:
cd harness
npx frida-compile ../projects/YOUR_PROJECT/YOUR_SPECIALIZED_HARNESS.JS -o ../projects/YOUR_PROJECT/harness.js
cd ../projects/YOUR_PROJECT/
mkdir crashes
../../frizzer/fuzzer.py fuzz -p .
Puoi iniziare con un seed diverso usando frizzer/fuzzer.py fuzz --seed 1234 -p ..
Aggiungere nuove versioni di iOS:
Attualmente, diverse versioni di iOS sono definite in bluetoothd.js. Puoi trovarle con lo strumento di versioning Ghidra data una versione iniziale che abbia tutti i simboli richiesti. Nota che alcuni di essi non sono nominati nel binario iOS originale, quindi idealmente inizia con uno che sia già stato annotato prima. Ogni volta che bluetoothd.js cambia, devi rieseguire frida-compile.
Aumentare le capacità di bluetoothd:
I log di crash di iOS sono memorizzati in Impostazioni -> Privacy -> Analisi e Miglioramenti -> Dati di Analisi. Se contengono crash di bluetoothd con il pattern bluetoothd.cpu_resource-*.ips, ciò indica che il crash è stato causato dal superamento delle risorse. Possono essere aumentati come segue.
Su un iPhone 7, esegui:
cd /System/Library/LaunchDaemons/
plistutil -i com.apple.jetsamproperties.D10.plist -o com.apple.jetsamproperties.D10.plist.txt
plistutil -i com.apple.jetsamproperties.D101.plist -o com.apple.jetsamproperties.D101.plist.txt
Su iPhone SE2, questi si trovano in com.apple.jetsamproperties.D79.plist:
cd /System/Library/LaunchDaemons/
plistutil -i com.apple.jetsamproperties.D79.plist -o com.apple.jetsamproperties.D79.plist.txt
Cerca bluetoothd, aggiorna la priorità a 19 (la priorità valida più alta) e imposta il limite di memoria a un valore molto alto. Applica le stesse modifiche a entrambi i file.
<dict>
<key>ActiveSoftMemoryLimit</key>
<integer>24000</integer>
<key>InactiveHardMemoryLimit</key>
<integer>24000</integer>
<key>EnablePressuredExit</key>
<false/>
<key>JetsamPriority</key>
<integer>19</integer>
</dict>
Riscrivi le modifiche e riavvia bluetoothd.
plistutil -i com.apple.jetsamproperties.D10.plist.txt -o com.apple.jetsamproperties.D10.plist
plistutil -i com.apple.jetsamproperties.D101.plist.txt -o com.apple.jetsamproperties.D101.plist
killall -9 bluetoothd
Rispettivamente su iPhone SE2:
plistutil -i com.apple.jetsamproperties.D79.plist.txt -o com.apple.jetsamproperties.D79.plist
killall -9 bluetoothd
Eliminare i vecchi log:
iOS smette di salvare i log di crash per un programma dopo aver raggiunto il limite di 25. Se carichi un log di crash con Xcode (tramite Simulators&Devices), vengono aggiunti alcuni simboli alla traccia dello stack. Una volta raggiunto il limite, i log possono essere rimossi tramite Xcode o direttamente sul dispositivo iOS cancellandoli nella cartella /var/mobile/Library/Logs/CrashReporter/.
A12+:
A partire da iPhone XR/Xs, è stato introdotto PAC. Questo richiede di chiamare sign() su NativeFunction in FRIDA. Mentre questa è una no-op sulle CPU precedenti, riduce enormemente la velocità sui dispositivi più nuovi, ma è necessaria per farli funzionare. Abbiamo osservato che ToothPicker opera a metà velocità quando si usa un iPhone SE2 invece di un iPhone 7.
L'implementazione MagicPairing del fuzzer over-the-air richiede che InternalBlue sia installato e può essere eseguita lanciando python MagicPairingFuzzer.py TARGET_BD_ADDR.
Se vuoi riprodurre i crash, usa lo script ReplayCrashFile.py, che può prendere un file di crash e avviare una connessione over-the-air con un payload basato sul crash.
frida-compile