Wachtwoordlijsten voor echte hackers

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

Grafiek met wachtwoorddekking

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

Diagram van wachtwoordtransformaties

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

RuleWat het doetVoorbeeld
cEerste letter als hoofdletterwachtwoord -> Wachtwoord
uAlles hoofdletterswachtwoord -> WACHTWOORD
lAlles kleine lettersWACHTWOORD -> wachtwoord
$XX toevoegen aan het eindewachtwoord -> wachtwoord!
^XX toevoegen aan het beginwachtwoord -> !wachtwoord
sXYX vervangen door Ywachtwoord -> w@chtwoord
rOmdraaienwachtwoord -> 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\, altijd
  • OneRuleToRuleThemAll.rule - grondig maar traag\, goed voor nachtelijke runs
  • d3adhob0.rule - afgestemd op corporate AD-patronen
  • InsidePro-PasswordsPro.rule - brede substitutiedekking
  • toggles5.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.

Wilt u dit toepassen op uw eigen omgeving?

Neem contact op

Lees verder

Klaar om uw organisatie door de ogen van een aanvaller te zien?

Neem contact op