Hash-funktion är en allmän term för en typ av funktion. Ingången till denna typ av funktion är godtycklig binär data, och utdata är binär data med fast längd, denna typ av funktion har följande egenskaper:
Enriktad: Det är enkelt och snabbt att beräkna utdata från ingången, men det är matematiskt omöjligt att härleda ingången från utdata
Kollisionsbegränsning: Det är extremt svårt att hitta två olika ingångar med samma utdata
Funktioner som uppfyller dessa egenskaper kan kallas hashfunktioner. En viss data används som ingång i en hash-funktion för att beräkna utmatningen. Det är vanligt att kalla denna utdata för datans hash-värde.
En av de viktigaste funktionerna för hash-funktionen är att lagra lösenordet på ett säkert sätt. Det sparar inte lösenordet direkt (det vill säga det lagrar inte lösenordet i vanlig text), utan sparar lösenordets hash-värde. Under verifiering behöver du bara beräkna det inmatade lösenordet igen. Jämför hash-värdet med hash-värdet för det sparade lösenordet för att veta om lösenordet är korrekt. På grund av hash-funktionens enriktade karaktär och kollisionsbegränsningarna är det svårt för angriparen att känna lösenordet själv även om han får lösenordets hash-värde.
Angriparen har fått hash-värdet för lösenordet. Finns det verkligen inget sätt att veta själva lösenordet? Naturligtvis inte Även om det är matematiskt omöjligt att direkt beräkna lösenordet från lösenordets hash-värde, vet vi att hash-funktionen är enkel och snabb att beräkna utdata från ingången. I värsta fall kan du prova lösenorden som människor kan ställa in är de enda, prova dem ett efter ett, du kan fortfarande prova dem om du har tur. Operationen att kontinuerligt försöka få ingången som motsvarar hash-värdet kallas sprängning.
Baserat på denna idé kom hashcat till. Det sägs att hashcat föddes för att bevisa att det är väldigt enkelt att spränga hash. hashcat påstår sig vara världens snabbaste hashblastverktyg, och det stöder till och med GPU och FGPA, om du har någon.
hashcat är inte bara snabb, utan stöder också mer än tvåhundra hash-funktioner professionellt Använd kommandot:
hashcat - -help
Du kan se listan över alla hash-funktioner som stöds av hashcat. Det finns för många och jag kommer inte att lägga upp dem här.
hashcat är installerad som standard i Kali och kan användas direkt. Men min Kali är installerad i VirtualBox och jag känner alltid att den virtuella maskinen är långsammare, så jag vill använda hashcat i den fysiska värden. Gå först till Hashchats officiella webbplats för att ladda ner hashcat. Från och med nu är den senaste versionen v3.5.0, som släpptes 2017.04.05. Från uppdateringsdatumet kan man se att hashchat är full av vitalitet. Undvik besväret med att kompilera och ladda ner det binära paketet direkt, som bara är 2,7 miljoner, vilket är väldigt litet jämfört med spel som ofta väger dussintals gigabyte.
Efter att nedladdningen är klar, packa ut hashcat och se:
Sådana filer är 32-bitars och 64-bitars körbara filer i linux och windows, välj bara en av dem enligt din dators situation. Jag valde hashcat64.bin För skönhetens skull lägger jag till en rad i ~ /. bashrc-filen:
alias hashcat = ' sökvägen till hashcat64.bin '
Efter att ha sparat öppnar du den virtuella terminalen igen för att få ~ /. bashrc-filen att träda i kraft. På så sätt, oavsett var du är, kan du bara ange hashcat-kommandot direkt utan att byta kataloger eller ange det fula "64.bin", som visas i bilden nedan.
Okej, nu kan du börja spränga olika hash med hashcat.
md5 borde vara en av de mest kända och mest använda hash-funktionerna. Använd först Python för att generera flera MD5-värden för sprängning. Koden är som följer:
import hashlib. Lösenord = [' 123123 ', ' bond007 ', ' xxxxxx ', ' *H@ & (NT*@BR#^ '] för lösenord i lösenord: md5 = hashlib.md5 () md5.update (lösenord) print md5.hexdigest ()
Ovanstående kod beräknar hashvärdena för de fyra strängarna respektive, och utdataresultatet är:
4297f44b13955235245b2497399d7a93 cbdb7e2b1ed566ceb796af2df07205a3 dad3a37aa9d50688b5157698acfd7aee d77db958c179bbffae04b2b908b75c26
Spara utdataresultatet i filen md5.hash, ett hahs-värde per rad. Använd sedan hashcat för att spränga dessa hash-värden, kommandot är följande:
hashcat -w 3 -a 0 -m 0 - -remove -o md5.out md5.hash wordlist.dic
Parametern-w används för att ange arbetslägen, det finns fyra, som visas i tabellen nedan:
| N | Prestanda | Runtime | Strömförbrukning | Desktop Impact |
|---|---|---|---|---|
| 1 | Låg | 2 ms | låg | Minimal |
| 2 | standard | 12 ms | ekonomisk | märkbar |
| 3 | hög | 96 ms | hög | svarslös |
| 4 | mardröm | 480 ms | galen | huvudlös |
Parameter-a används för att ange attackläget, betydelsen av 0 är direkt och kontinuerlig, det vill säga sprängning med lösenordsordbok, det finns fem värden för-a, som visas i tabellen nedan:
| N | läge |
|---|---|
| 0 | rak |
| 1 | kombination |
| 3 | Brute-force |
| 6 | Hybrid Wordlist + Mask |
| 7 | Hybrid Mask + Wordlist |
-m Används för att ange hashen som ska sprängas Hash-funktionen för värdet, 0 betyder att hash-funktionen är md5, och de andra värdena visas i följande tabell:
| N | namn | kategori |
|---|---|---|
| 0 | MD5 | Raw Hash |
| 300 | MySQL4.1/MySQL5 | databasserver |
| 1000 | NTLM | Operativsystem |
| 1800 | sha512crypt $6$, SHA512 (Unix) | Operativsystem |
| 2611 | vBulletin < v3.8.5 | Forum, CMS, e-handel, ramverk |
Detta Tabellen är för lång. Jag visar bara några hash-funktioner som är involverade i den här artikeln. Du kan se dem alla med parametern – hjälp. Betydelsen av
parameter – ta bort är att om ett visst hash-värde sprängs framgångsrikt, ta bort värdet från md5.hash.
Parameter-o följs av ett filnamn som anger var sprängningsresultaten sparas.
De två sista parametrarna md5.hash och wordlist.dic är hashvärdet respektive lösenordsordboken som ska sprängas. Hashvärdet och lösenordsordboken är båda en per rad. Innehållet i md5.hash har beräknats av Python Om du inte har en lämplig lösenordsordbok till hands kan du använda kommandot:
wget -O wordlist.dic https://samsclass.info/123/proj10/500_passwords.txt
下载一个。现在完事具备,按下回车,结果华丽地报错:(
clGetPlatformIDs(): CL_PLATFORM_NOT_FOUND_KHR
Det saknas förmodligen någon körmiljö, så installera den. Jag har installerat dessa saker totalt:
sudo apt-get install gcc make p7zip-full git lsb-core wget http://registrationcenter-download.intel.com/akdlm/irc_nas/9019/opencl_runtime_16.1.1_x64_ubuntu_6.4.0.25.tgz tar -xvf opencl_runtime_16.1.1_x64_ubuntu_6.4.0.25.tgz cd opencl_runtime_16.1.1_x64_ubuntu_6.4.0.25 sudo . /install.sh
Om internethastigheten är bra kommer den att installeras på kort tid. Det första kommandot rapporterar ett fel:
/sbin/ldconfig.real: /usr/lib/nvidia-375/libEGL.so.1 är inte en symbolisk länk /sbin/ldconfig.real: /usr/lib32/nvidia-375/libEGL.so.1 är inte en symbolisk länk
Men det verkar inte påverka någonting, ignorera det bara. Efter att ha installerat dessa tryckte jag på Enter igen och körde det ursprungliga felkommandot. Jag fann att det inte fanns något fel igen, och exekveringen slutfördes på ett ögonblick. Efter att kommandot har exekverats, kontrollera innehållet i filerna md5.hash och md5.out och upptäcka att det bara finns en hash kvar i md5.hash. De tre hash som sprängdes framgångsrikt har överförts till filen md5.out Det finns tre hash-värden och deras ursprungliga värden, som visas i figuren nedan:
Hash-värdet för Windows inloggningslösenord sparas i SAM-filen, SAM är förkortningen för "security account manager". Vanligtvis finns den i
C: \Windows\system32\config\SAM
SAM-filen är skyddad av Windows och kan inte läsas direkt med hjälp av verktyg som SAMInside. Hitta en virtuell Windows 7-maskin, skapa en ny administratörsanvändare som heter hashcat, ställ in ett lösenord, ladda ner och packa ut SAMInside i Windows 7, kör det med administratörsbehörigheter och klicka sedan på File- > Importera lokala användare vis Scheduler, som visas nedan Som visas i bilden:
Efter det kan SAMInside "inte svara", men det spelar ingen roll, vänta tålmodigt i några sekunder, SAMInside lever upp till förväntningarna och läser ut vad vi vill ha hash, som visas i bilden nedan:
Välj användaren "hashcat" som vi vill spränga lösenordet, tryck på Ctrl +5 för att kopiera NT-hash, gå sedan tillbaka till Ubuntu med hashcat installerat, använd följande kommando för att spara det kopierade hash-värdet till filen win7.hash:
echo 356CEAE0C89FB65ED6D6AA7A445C4CE5 {> hashcat -w 3 -a 0 -m 1000 - -remove -o win7.out win7.hash wordlist.dic
Exekveringen slutfördes efter ett tag. Jag kontrollerade win7.out-filen och fann att sprängningen var framgångsrik. Användarens hashcat-inloggningslösenord är rush2112:
werner@Yasser: ~ /hashcat$ cat win7.out
356ceae0c89fb65ed6d6aa7a445c4ce5:rush2112
Hur man får SAM-filen, se "Hur man exporterar Windows Hash Series 1". Följande är processen att läsa SAM-filen i den virtuella maskinen Windows 7.
Om det är en fysisk maskin, använd Win PE för att starta maskinen och läs SAM-filen på disken. Min är en virtuell maskin. Du kan läsa filerna på den virtuella disken genom att montera den virtuella diskfilen i filsystemet. Den virtuella maskinen jag använder är VirtualBox, som kan göras med kommandot vdfuse. Om du inte har vdfuse måste du installera virtualbox-fuse först:
sudo apt-get install virtualbox-fuse
Du kan också ladda ner installationspaketet för virtualbox-fuse och installera det själv.
Efter att installationen är klar finns kommandot vdfuse, som kan starta virtuell diskmappning och montering:
mkdir -p ~ /vmdisk
sudo vdfuse -t vmdk -f Win7Pro32.vmdk ~ /vmdisk/
Efter att ha utfört detta steg, kontrollera ~ /vmdisk-katalogen, som har tre filer: entire disk, Partition1 och Partition2, ny katalog:
mkdir -p ~ /vmdisk_en
mkdir -p ~ /vmdisk_1
mkdir -p ~ /vmdisk_2
Använd kommandot mount för att montera de tre filerna entire disk, Partition1 respektive Partition2:
sudo mount ~ /vmdisk/entire disk ~ /vmdisk_en
sudo mount ~ /vmdisk/Partition1 ~ /vmdisk_1
sudo mount ~ /vmdisk/Partition2 ~ /vmdisk_2
upptäckte att monteringen av hela disken misslyckades, innehållet i Partition1 var inte vad jag ville ha, Partition2 var filen i den virtuella maskinen Windows 7, precis vad jag ville ha. Kopiera vår mål-SAM-fil från vmdisk_fs:
cp ~ /vmdisk_2/Windows/System32/config/SAM . /
Förresten, kopiera systemfilen också:
cp ~ /vmdisk_2/Windows/System32/config/SYSTEM . /
Kontrollera innehållet i SAM-filen, som visas i bilden nedan, är det inte en vanlig textfil, det är verkligen Windows-stilen,
Tja, även om SAM-filen öppnades framgångsrikt, får vi fortfarande inte hash. Vad ska vi göra om vi ändrar den härnäst? Du kan bara använda verktyget för att analysera innehållet i SAM-filen. Lägg in både sam-filen och systemfilen i Kali och kör kommandot:
samdump2 -o sam.hash SYSTEM sam
Kontrollera sedan sam.hash, och du kan också se hash-värdet för varje användares inloggningslösenord. Varje rad i sam.hash-filen är en användare, och formatet för varje rad är:
Användarnamn: RID:lm-hash-värde: ntlm-hash-värde
Observera att detta format är samdump2-kommandoutdataformatet, inte "hash-lösenordsformatet under Windows".
3. Explodera Linux-inloggningslösenordet hash
Först måste du ha en dator som kör Linux-systemet. Detta är lätt att säga, bara en virtuell maskin räcker. Kör sedan följande kommando för att lägga till en ny användare och ställa in ett lösenord för vår sprängning:
sudo adduser justforfun
Hash-värdet för användarens inloggningslösenord i linux lagras i filen/etc/shadow (Obs: inte/etc/passwd Använd följande kommando för att se hash-värdet för den nya användarens inloggningslösenord:
test@test-VirtualBox: ~ $ sudo tail -n 1 /etc/shadow
justforfun:$6$0fokwg59$6hpMS5dM9wDT/42DDoSD0i0g/wHab50Xs9iEvVLC3V20yf1kRmXZHGXCM0Efv6XU69hdgMZ4FwaMzso4hQaGQ0:17373:0:99999:7:::
tail Kommandot används för att läsa de sista raderna i en fil, standarden är 10 rader, och antalet rader anges med parametern-n. Användaren vi just skapade är naturligtvis på sista raden, så vi använder tail-n 1 för att läsa den. Resultatet av läsning är uppdelad med ":" Den första delen är användarnamnet "justforfun", den andra delen är lösenordets hash-värde, och de andra delarna behöver inte bry sig om i den här artikeln. Vi fokuserar på den andra delen.
"$6$" som börjar med betyder att typen av hash-funktionen som används är SHA-512. Förutom "$6$", i linux, syftar "$1$" på MD5, "$2a$" syftar på Blowfish, "$2y$" syftar på Blowfish (korrekt hantering av 8-bitars tecken), "$5$" Syftar på SHA-256, se Wikipedia för detaljer: passwd. Dessutom beskriver filen/etc/login.defs också hash-algoritmen.
Sektionen "0fokwg59" från början av "$6$" till nästa "$" är SALT. Vad är salt? Baidu vet att CNB2009s svar på frågan " Vad är MD5-saltvärdet " är enkelt och lätt att förstå:
Enkelt uttryckt är det ett sätt att få samma lösenord att ha olika hash-värden, är saltning. MD5 i sig är irreversibelt, men det finns för närvarande många databaser på Internet som stöder anti-fråga. Om användarlösenordsdatabasen av misstag läcker, kan hackare få användarlösenordet genom anti-fråga, eller använda hashkoder som förekommer oftare i databasen (dvs. används av många människor) för brute force cracking (eftersom det vanligtvis är ett svagt lösenord). Saltvärdet är ett extra slumpmässigt värde som läggs till under lösenordshashprocessen. Till exempel är mitt id och lösenordet är 123456. När det lagras i databasen kan jag hasha strängen "123456/epilepsi". och när du verifierar lösenordet används också strängen "(lösenordet som ska verifieras) /epilepsi omvänd ④" för verifiering. På så sätt, när ett annat idiotlösenord är 123456, kan olika hash-värden fortfarande konstrueras och verifieras framgångsrikt. Vid denna tidpunkt används mitt id som ett saltvärde för att utföra komplex hash för lösenordet. Så vad?. Rollen av saltvärdet är att minska förlusten som orsakas av databasläckage. Om din RP är mycket bra och du gissar mitt lösenord är 123456, kan jag inte stoppa dig
Detta svar är för md5, och samma sak gäller för andra hash-funktioner. Delen efter saltet är hash-värdet. Kopiera nu hela den andra delen till filen linux.hash, innehållet i linux.hash ska vara:
$6$0fokwg59$6hpMS5dM9wDT/42DDoSD0i0g/wHab50Xs9iEvVLC3V20yf1kRmXZHGXCM0Efv6XU69hdgMZ4FwaMzso4hQaGQ0
Spränge sedan Linux-inloggningslösenordet hash med följande kommando:
hashcat -w 3 -a 0 -m 1800 - -remove -o linux.out linux.hash wordlist.dic
Efter ett ögonblick är sprängningen klar, se resultatet:
werner@Yasser: ~ /hashcat$ cat linux.out
$6$0fokwg59$6hpMS5dM9wDT/42DDoSD0i0g/wHab50Xs9iEvVLC3V20yf1kRmXZHGXCM0Efv6XU69hdgMZ4FwaMzso4hQaGQ0:4321
Det kan ses att sprängningen var framgångsrik.
4. Explodera MySQL-inloggningslösenord hash
Först måste du ha Mysql. Det råkar vara i min virtuella maskin. Baidu kan veta att hash-värdet för MySQL-inloggningslösenordet sparas i filen user.MYD. Var är filen user.MYD? Jag vet inte heller, bara leta efter:
test@test-VirtualBox: ~ $ sudo find / -name user.MYD
/var/lib/mysql/mysql/user.MYD
hittade den i/var/lib/mysql/mysql/user.MYD Se innehållet i filen:
sudo cat /var/lib/mysql/mysql/user.MYD
Det är inte en vanlig textfil, så det har lite att göra med det. Du kan fortfarande se att hash-värdet för användarens rootinloggningslösenord är:
6B825255FB466413D6B1B724644E23428C94BBCB
Spara detta värde till filen mysql.hash, använd följande kommando för att spränga hash för MySQL-inloggningslösenordet:
hashcat -w { Efter ett ögonblick är sprängningen klar, se resultatet:
werner@Yasser: ~ /hashcat$ cat mysql.out
6b825255fb466413d6b1b724644e23428c94bbcb:viper
Det kan ses att sprängningen lyckades.
5. Explosion Discuz! Forum lösenord
Discuz! Det är ett välkänt PHP-forumprogram i Kina och används mycket. Låt oss nu spränga Discuz! Hash-värdet för användarlösenordet. Först måste du hitta hash-värdet. Var kan du hitta det? Från Discuz förstås! i databasen.
kan Discuz! Var är databasen? Så här löste jag det, ladda ner den senaste versionen av Discuz från dess officiella hemsida! Källkoden, kör och installera den, och du får Discuz! Databas
Discuz! Standarddatabasnamnet är ultrax, och tabellen pre_ucenter_members lagrar hash-värdet för inloggningslösenordet "pre_" är standardprefixet och kan ändras under installationen, men "ucenter_members" kommer inte att ändras. Använd följande SQL-sats för att fråga hash-värdet för inloggningslösenordet:
välj lösenord, salt från pre_ucenter_members;
Spara hash-och saltvärden till filen:
echo 69bcba126b93c6f397983629a0f70553:c13fd9 > discuz.hash
Hash-värdet och saltvärdet är i samma rad, delat med ":". Använd slutligen följande kommando för att spränga Discuz-inloggningslösenordet hash:
hashcat -w 3 -a 0 -m 2611 - -ta bort -o discuz.out discuz.hash wordlist.dic
Efter ett ögonblick är sprängningen klar, se resultatet:
werner@Yasser: ~ /hashcat$ cat discuz.out
69bcba126b93c6f397983629a0f70553:c13fd9:winter
Det kan ses att sprängningen lyckades.
6. Stort ordbokstest
Från och med nu använder vi en liten ordbok med bara 500 ord. Det tar bara ett ögonblick varje gång att framgångsrikt spränga alla typer av hash. Tycker du inte att det är konstigt? Detta beror på att jag medvetet ställde in ett svagt lösenord i ordboken för att öva på att använda hashcat, annars skulle det inte vara dåligt att det inte kunde sprängas ut. Det är omöjligt att ha så bra tur i praktiken. Låt oss slumpmässigt beräkna MD5-värdet för ett mindre svagt lösenord, spränga det med en stor ordbok, prova tur å ena sidan och se hur snabbt hashcat kan vara å andra sidan.
Beräkna först MD5-värdet:
import hashlib
md5 = hashlib.md5 ()
md5.update (" werner123456!!! ")
print md5.hexdigest () Utdata är:
b17133f9abff287ed0546c1af2b171f7
Välj sedan en 10,5G-storlek ordbok som innehåller 940 miljoner lösenord och börja spränga:
hashcat -w 3 -a 0 -m 0 - -ta bort -o big.out b17133f9abff287ed0546c1af2b171f7 big.dic
Observera att när det bara finns ett hash-värde behöver du inte spara det i filen, du kan också skriva det direkt i kommandoradsparametrarna. Började spränga innan jag gick och la mig, vaknade nästa dag för att titta på resultaten och hittade:
Började: Ons Jul 26 22:55:27 2017
Stopped: ons Jul 26 23:02:28 2017
Det visade sig att det bara tog 7 minuter! Jag trodde att det skulle ta 7 timmar och det var 60 gånger snabbare än jag förväntade mig! Det är lite synd att hash-värdet inte sprängdes framgångsrikt. Det verkar som att "werner123456!!!" inte finns i lösenordsordboken. Det verkar som att jag behöver förbereda en 100G lösenordsordbok, men det är väldigt obekvämt att spara och överföra en så stor ordbok. Finns det inget annat sätt? Självklart, kom ihåg attackläget? Vi har använt "rakt"-läget. Låt oss sedan titta på flera andra lägen.
7. Sammanfattning
När du använder hashcat för att spränga hash, är det första att hitta den korrekta hash Olika system och olika programvara har olika platser för att lagra hash, så du måste hitta hash-värdet exakt. Det andra är att korrekt bedöma hash-typen, avgöra om hashcat stöder denna hash och välja rätt-m-parameter, annars är det nästan omöjligt att lyckas; Den tredje är att lösenordsordboken ska vara bättre. Huruvida explosionen kan lyckas i slutändan beror på att titta på ordboken. Även om en större lösenordsordbok inte är bättre, är det fortfarande bättre att vara större. hashcat är också känd för sin hastighet, och stora ordböcker är inte ett problem för hashcat. Här är en bättre ordbok: tidigare läckagördar + vanligt använd svag lösenordsordbok samling.7Z , dekomprimeringslösenordet är: anywlan. Dessutom, om du samlar in många små ordböcker, kan du slå samman, sortera och deduplicera de små ordböckerna för att få en stor ordbok för hashcat-sprängning. Om den lilla ordboken är i samma katalog kan du göra det med ett kommando:
cat * | sortera | uniq > Merge.dic
Tänk om den lilla ordboken är organiserad efter kategori och distribuerad i en katalog med flera lager? Det är uppenbarligen inte möjligt att bara använda kattkommandot, men i själva verket behövs bara ett kommando Om man antar att alla små ordböcker är lagrade i katalogen MyDictionary, kan kommandot skrivas så här:
hitta . /MyDictionary -type f -exec cat {} \; | sortera | uniq > Merge.dic