Files

2 Files:

# ls -l /etc/passwd /etc/shadow
-rw-r--r-- 1 root root   3042 Feb 23 05:38 /etc/passwd
-rw-r----- 1 root shadow 1577 Feb 23 05:38 /etc/shadow

Beachte die eingeschränkten Rechte

Beispiel

Zeile in passwd:

matejka:x:1000:1000:Franz MATEJKA,,,:/home/matejka:/bin/bash

:x: bedeutet, dass der Passwort-Hash in der shadow Datei ist:

matejka:$6$Y.6vLGlD1cGsutIg$Hn2/2.hNyojM19F1AwNHPAzAHEk.3vPhsOqWOGyds5hieGvedb45DCxV5aqZ194w12zhaet1rhWJyCx/mzePk.

crypt ist die Standard UNIX Funktion zum berechnen der Hashwerte und prüfen der Passwörter.

Achtung: Radix-64 ≠ Base64

// http://cvsweb.openbsd.org/cgi-bin/cvsweb/src/lib/libc/crypt/bcrypt.c?rev=1.27&content-type=text/x-cvsweb-markup
const static u_int8_t Base64Code[] =
"./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";

Unix stores password hashes computed with crypt in the /etc/passwd file using radix-64 encoding called B64. It uses a mostly-alphanumeric set of characters, plus . and /. Its 64-character set is “./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz”. Padding is not used.

(wikipedia Base64.)

Rounds

Default: 5000 – kann als Option in shadow auf einen anderen Wert gesetzt werden:

$6$rounds=5000$

yescrypt

Neueres Verfahren zum speichern von Passwörtern – z.B. in Kali

kali:x:1000:1000:Kali,,,:/home/kali:/usr/bin/zsh
kali:$y$j9T$h.cekCfg097LWvTwVtk8T0$fcGogK/pi581lOUbxBwtEzH7l/zKL0atAeu9DV.BW86:18681:0:99999:7:::

yescrypt existiert erst seit 2015 [*]. Wird noch nicht von den Cracking Tools unterstützt.

Linux Tools

adduser

Fügt einen neuen User hinzu.

$ adduser htltest

passwd

Setzt ein neues Passwort für einen User.

$ passwd alice
$ passwd bob

mkpasswd

Ist ein Tool um Passwort Hashwerte zu berechnen. Generierte Strings können 1:1 in /etc/shadow eingefügt werden.

$ mkpasswd --method=sha512crypt --salt=Y.6vLGlD1cGsutIg franz
$6$Y.6vLGlD1cGsutIg$Hn2/2.hNyojM19F1AwNHPAzAHEk.3vPhsOqWOGyds5hieGvedb45DCxV5aqZ194w12zhaet1rhWJyCx/mzePk.

$6$ ist die Kennung für sha512crypt als Hash Methode.

Alle verfügbaren Hash Methoden anzeigen:

$ mkpasswd --method=help
Available methods:
yescrypt        Yescrypt ($y$)
gost-yescrypt   GOST Yescrypt
scrypt          scrypt
bcrypt          bcrypt
bcrypt-a        bcrypt (obsolete $2a$ version)
sha512crypt     SHA-512 ($6$)
sha256crypt     SHA-256 ($5$)
sunmd5          SunMD5
md5crypt        MD5 ($1$)
bsdicrypt       BSDI extended DES-based crypt(3)
descrypt        standard 56 bit DES-based crypt(3)
nt              NT-Hash

Beispiel – wenn kein Salt angegeben wird ein zufälliges generiert:

$ mkpasswd --method=sha512crypt p8ssw0rd  
$6$QrBQnyeXt61IcfVR$lXEiG4LME9LF9VjOmPa5R4IsZ2/oXkztP04nh.wwcdAKnHehxreneSljIis6ub2KRGTEmUgMbNQcWWUVm4BNu/

Beispiel – gleiches Passwort (test1) aber unterschiedliches Salt:

$ mkpasswd --method=sha512crypt test1  
$6$f0pzxkd2lEfJsYNn$xsnMkxoktiaZDsZ6nyw9WKeFBpSfub4ke7feEZG8H6FQhUjaFyFtcAmE/RbLqms2NcXRnJfDU1lvMpFmGTDnb/

Zweiter Aufruf generiert wieder ein zufälliges Salt und damit ist der Hashwert unterschiedlich:

$ mkpasswd --method=sha512crypt test1  
$6$2zZ27E60wx7caMIV$gC7p6u0Jp1GtC4cQBBE36aZRIjT.WMe9Drlde9KSAVvzS22hIlkF6rNTRabIr/MHObkwNKmGgrf5GDRag4TfI1

Beispiel – mit Anzahl von Runden (--rounds=<RUNDEN>).

$ mkpasswd --method=sha512crypt --rounds=20000 p8ssw0rd 
$6$rounds=20000$zRsXAj3dLKuy4ynB$lb9OMX/eqfPRKzbSCC6.Z0o/zJ/zlfU17FOQ6yGANLMth0OblyXoG1zv8qqhoiQQma0y9zacqepAynxnU8VYk1

Kali Tools

unshadow

Kombiniert passwd mit shadow zu einer einzigen Datei, diese kann von John the Ripper gelesen werden.

$ unshadow /etc/passwd /etc/shadow > crack.password

John the Ripper

[Linux Password Cracking: Explain unshadow and john Commands ( John the Ripper Tool )]

john (aus dem Projekt Openwall)

[John the Ripper’s cracking modes]:

John the Ripper usage examples

Single crack mode:

$ john --single crack.password

Wordlist crack mode:

$	john --wordlist crack.password

Verwendet john’s Standard Wordlist (/usr/share/john/password.lst – ist eher klein)

Incremental cracking mode:

$ john --incremental crack.password

Wenn kein Mode angegeben probiert john in der Reihenfolge single, wordlist, incremental:

$ john crack.password 

pot File

John merkt sich bereits gecrackte Passwörter (pro User) in einer Datenbank und versucht es nicht noch einmal. Wenn man ganz von vorne beginnen möchte (z.B. Passwort wurde geändert) muss folgendes File gelöscht werden:

$ rm ~/.john/john.pot

Single Mode

Cracking Mode single (z.B. pw=username)

$ john --single crack.password   
Using default input encoding: UTF-8
Loaded 1 password hash (sha512crypt, crypt(3) $6$ [SHA512 256/256 AVX2 4x])
Cost 1 (iteration count) is 5000 for all loaded hashes
Will run 2 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
Warning: Only 3 candidates buffered for the current salt, minimum 8 needed for performance.
test1            (test1)
1g 0:00:00:00 DONE (2021-08-05 10:51) 100.0g/s 300.0p/s 300.0c/s 300.0C/s test1..test0
Use the "--show" option to display all of the cracked passwords reliably
Session completed

Die gecrackten Passworter werden im pot File gespeichert und können mit der --show Option abgefragt werden:

$ john --show crack.password 
test1:test1:1001:1001:,,,:/home/test1:/bin/bash

1 password hash cracked, 0 left

Mangling rules? Auszug aus Dokumentation:

--single
              Enables the "single crack" mode, using rules from [List.Rules:Single].

[List.Rules:Single] ist eine Verweis auf eine Section in /etc/john/john.conf:

# "Single crack" mode rules
[List.Rules:Single]
# Simple rules come first...
:
-s x**
-c (?a c Q
-c l Q
-s-c x** /?u l
# These were not included in crackers I've seen, but are pretty efficient,
# so I include them near the beginning
-<6 >6 '6
-<7 >7 '7 l
-<6 -c >6 '6 /?u l
-<5 >5 '5
...

Wordlist rules syntax

Oft wird für ein Passwort ein Wort gewählt das man sich gut merken kann. Die meisten Passwortregeln erzwingen zusätzlich Großbuchstaben, Ziffern und/oder Sonderzeichen. Also verändert der User sein gewähltes Passwort (z.B. cybersecurity) ein wenig damit es den Passwortregeln entspricht sich aber immer noch gut merken lässt, z.B. Cybersecurity21 oder cybersecuritY#.

Die mangling rules bilden diese kleinen üblichen Änderungen in John the Ripper nach.

Wordlist Mode

$ more /usr/share/john/password.lst 
$	john --wordlist crack.password

john’s Standard Wordlist (ist eher klein) (/usr/share/john/password.lst) wird verwendet wenn keine andere Wortliste angegeben wird.

Wortlisten

Die Erfolgswahrscheinlichkeit ein Passwort zu knacken hängt stark von der Qualität der Wortliste ab. Umfangreiche Wortlisten stammen von diversen password breaches, z.B. rockyou.txt.

Eigene Wortliste

Wortlisten sind simple Textfiles

$ more test.lst
braunau
htl
gundula
$	john --wordlist=test.lst crack.password

Mangling Rules

Die Erfolgswahrscheinlichkeit im Wordlist Mode kann wesentlich erhöht werden wenn zusätzlich Mangling Rules angewendet werden. Dafür gibt es die Option --rules:

$	john --wordlist=password.lst --rules crack.password

Wird die Option --rules bei --wordlist verwendet so arbeitet john mit den Mutationsregeln der Sektion [List.Rules:Wordlist] in /etc/john/john.conf. Diese sind weniger rechenintensiv als die Regeln vom Single Mode. Die Mutationsregeln können zusätzlich angegeben werden.

$ john --wordlist=password.lst --rules=Single crack.password

Single ist bspw. erfolgreich bei Mutation von test in Test24 – die WordList Rules scheitern daran.

Mit der Option --stdout werden die Passwortkandidaten ausgegeben ohne diese mit den Hashwerten zu vergleichen.

$ more test.lst
braunau
htl
gundula
$ john --rules --wordlist=test.lst --stdout
...
Gundula1
htlhtl
uanuarb
aludnug
1braunau
1htl
1gundula
BRAUNAU
HTL
GUNDULA
...
Gundula4
Braunau6
Htl6
Gundula6
Braunau8
Htl8
Gundula8
Braunau.
Htl.
Gundula.
Braunau?
Htl?
Gundula?
Braunau0
..

Eigene Regeln

Eigene Regel in der Konfigurationsdatei von John the Ripper ergänzen:

$ sudo -i
$ nano /etc/john/john.conf

Beispiel: Erweitern der WordList Sektion durch eine Regel (^[0-9]$[0-9]) die alle Ziffern am Anfang und am Ende des Worts ausprobiert:

...
# Wordlist mode rules
[List.Rules:Wordlist]
# Try words as they are
:
# Lowercase every pure alphanumeric word
-c >3 !?X l Q
...
...
# Ziffer am Anfang ^ und Ende $ des Wortes
^[0-9]$[0-9]
$ john --wordlist=test.txt --rules --stdout >test-mutated.txt
Using default input encoding: UTF-8
Press 'q' or Ctrl-C to abort, almost any other key for status
448p 0:00:00:00 100.00% (2021-05-13 05:16) 8960p/s 9gundula9

#########################
$ tail test-mutated.txt 
9gundula6
9braunau7
9htl7
9gundula7
9braunau8
9htl8
9gundula8
9braunau9
9htl9
9gundula9

Man kann in /etc/john/john.conf auch eine eigene Sektion hinzufügen:

[List.Rules:TwoDigits]
# Ziffer am Anfang^ und Ende$ des Wortes
^[0-9]$[0-9]

Nur diese Regel ausführen:

$ john --wordlist=test.txt --rules=TwoDigits --stdout >test-mutated.txt | more

Incremental Mode

Der stärkste (aber auch rechenaufwändigste) cracking mode. Probiert alle Möglichkeiten durch

“Incremental” mode

$ john --incremental crack.password

Default Einstellungen in /etc/john/john.conf in der Sektion [Incremental:ASCII]:

Dies kann lange (ewig) dauern.

Schwächere Passwörter können mit anderen vordefinierten Incremental Mode Parametern gefunden werden, z.B. digits:

$ john --incremental=digits mypasswd

probiert alle Ziffernkombinationen von 0 bis 99999999999999999999

Siehe auch hier.

Crunch

Tool crunch: zum erstellen einer brute-force Wortliste – ähnlich zum Incremental Mode von John the Ripper.

Beispiel: Länge 4 aus einer Buchstabenliste:

$ crunch 4 4 "asdfgzxcv1234567890#?" | head
Crunch will now generate the following amount of data: 972405 bytes
0 MB
0 GB
0 TB
0 PB
Crunch will now generate the following number of lines: 194481 
aaaa
aaas
aaad
aaaf
aaag
aaaz
aaax
aaac
aaav
aaa1

Alle Wörter von Länge 4 bis 6 aus bestimmten Buchstaben zusammengesetzt:

$ crunch 4 6 "abcdefg123456789!" -o crunchlist.txt
# crunch <min-len> <max-len> [<charset string>] [options]
# -o wordlist.txt
#              Specifies the file to write the output to, eg: wordlist.txt

Fertige charsets aus /usr/share/crunch/charset.lst

$ crunch 4 8 -f /usr/share/crunch/charset.lst mixalpha-numeric-all-sv -o crunch2.txt
# -f /path/to/charset.lst charset-name
#              Specifies a character set from the charset.lst

Achtung kann groß werden: 84 PB! (Peta Byte)

Siehe man crunch – eher komplex in der Bedienung.

Output von crunch direkt in john pipen:

$ crunch 4 8 01234567890abcdefghijklmnopqrstuvwxyz | john hashes --stdin

Wortkombinationen “crunchen” (aus der man page):

$ crunch 4 5 -p dog cat bird
#       The numbers aren't processed but are needed.
#       crunch will generate birdcatdog, birddogcat, catbirddog, catdogbird,  
#           dogbirdcat,dogcatbird.

[Create Wordlists with Crunch]