V minulém příspěvku jsme prošli úvodem do hádání hesel, dnes se budeme zabývat konstrukcí slovníku použitím nástroje Crunch.
Crunch
Nástroj Crunch generuje slovníky na základě určené abecedy a délky slov. Crunch nalezneme předinstalovaný v linuxové distribuci Kali nebo si jej můžete stáhnout na jeho domovské stránce (Crunch).
V době psaní tohoto příspěvku je Crunch dostupný ve verzi 3.6, která zavádí podporou kódování Unicode a umožňuje omezovat opakující se znaky. V následujících příkladech jsou použity jen velmi malé abecedy, aby bylo možné jednoduše demonstrovat chování nástroje.
Manuálová stránka
Veškerým zdrojem dokumentace pro nás bude manuálová stránka k nástroji Crunch, kterou vyvoláme příkazem man crunch.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
CRUNCH(1) General Commands Manual CRUNCH(1) NAME crunch - generate wordlists from a character set SYNOPSIS crunch <min-len> <max-len> [<charset string>] [options] DESCRIPTION Crunch can create a wordlist based on criteria you specify. The output from crunch can be sent to the screen, file, or to another program. The required parameters are: min-len The minimum length string you want crunch to start at. This option is required even for parameters that won't use the value. max-len The maximum length string you want crunch to end at. This option is required even for parameters that won't use the value. charset string You may specify character sets for crunch to use on the command line or if you leave it blank crunch will use the default character sets. The order MUST BE lower case characters, upper case characters, numbers, and then symbols. If you don't follow this order you will not get the results you want. You MUST specify either values for the character type or a plus sign. NOTE: If you want to include the space character in your character set you must escape it using the \ character or enclose your character set in quotes i.e. "abc ". See the examples 3, 11, 12, and 13 for examples. OPTIONS -b number[type] Specifies the size of the output file, only works if -o START is used, i.e.: 60MB The output files will be in the format of starting letter-ending letter for example: ./crunch 4 5 -b 20mib -o START will gener‐ ate 4 files: aaaa-gvfed.txt, gvfee-ombqy.txt, ombqz-wcydt.txt, wcydu-zzzzz.txt valid values for type are kb, mb, gb, kib, mib, and gib. The first three types are based on 1000 while the last three types are based on 1024. NOTE There is no space between the number and type. For example 500mb is correct 500 mb is NOT correct. .. zkrácený výpis .. |
Všechna slova abecedy
Crunch lze v prvé řadě použít ke generování všech slov zvolené abecedy s minimální a maximální délkou slov. Syntaxe je v tomto případě následující. První a druhý argument jsou čísla, která definují minimální a maximální počet znaků všech slov. Třetí argument je řetězec, který specifikuje abecedu, ta může být vyjádřena například sledem znaků bez mezer. Poslední čtvrtý argument tvoří přepínač (-o), který specifikuje název výstupního souboru, tj. náš výsledný slovník. Vyzkoušíme si hned první příklad.
Příklad 1 – Slova o délce 3 znaků tvořená písmeny A,b,C
1 2 3 4 5 6 7 8 9 |
root@kali:~# crunch 3 3 AbC -o slovnik_3x3_AbC.txt Crunch will now generate the following amount of data: 108 bytes 0 MB 0 GB 0 TB 0 PB Crunch will now generate the following number of lines: 27 crunch: 100% completed generating output |
Jak můžeme vidět z výpisu, po spuštění nástroje Crunch získáme ještě před generováním slovníku informaci, jak velký soubor můžeme očekávat. Jak sami brzy zjistíte, lze snadno vygenerovat slovník, který má přes 1TB. Stačí zvolit abecedu velkých písmen a délku slov 1 až 8. Vraťme se ale k našemu příkladu.
Prozkoumáme-li obsah vygenerovaného souboru slovnik_3x3_AbC.txt, najdeme zde slova, která mají minimální a maximální délku znaků 3 a jsou tvořeny písmeny A,b,C ve všech variacích.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
root@kali:# cat ./slovnik_3x3_AbC.txt AAA AAb AAC AbA Abb AbC ACA ACb ACC bAA bAb bAC bbA bbb bbC bCA bCb bCC CAA CAb CAC CbA Cbb CbC CCA CCb CCC |
Vlastní a předdefinované abecedy
Abecedu nemusíme nutně určovat výčtem jejich písmen na příkazovém řádku. Můžeme nejprve vytvořit definici abecedy v souboru, přiřadit ji jméno a později se na tuto abecedu odkazovat. K tomuto účelu slouží přepínač (-f) následovaný cestou k souboru a jménem abecedy. Jak asi tušíte, v takovém souboru může být abeced víc. Prostudujme nejdříve existující definice abeced, abychom se seznámili s jejich zápisem. S nástrojem Crunch je dodáván soubor charset.lst s přednastavenými abecedami.
Pokud nevíme, kde se soubor charset.lst nachází, pomůžeme si příkazy locate.
1 2 |
root@kali:~# locate crunch | grep charset.lst /usr/share/crunch/charset.lst |
Nyní si prohlédneme obsah souboru charset.lst s definicemi jednotlivých abeced.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
root@kali:~# cat /usr/share/crunch/charset.lst # charset configuration file for winrtgen v1.2 by Massimiliano Montoro (mao@oxid.it) # compatible with rainbowcrack 1.1 and later by Zhu Shuanglei <shuanglei@hotmail.com> hex-lower = [0123456789abcdef] hex-upper = [0123456789ABCDEF] numeric = [0123456789] numeric-space = [0123456789 ] symbols14 = [!@#$%^&*()-_+=] symbols14-space = [!@#$%^&*()-_+= ] symbols-all = [!@#$%^&*()-_+=~`[]{}|\:;"'<>,.?/] symbols-all-space = [!@#$%^&*()-_+=~`[]{}|\:;"'<>,.?/ ] ualpha = [ABCDEFGHIJKLMNOPQRSTUVWXYZ] ualpha-space = [ABCDEFGHIJKLMNOPQRSTUVWXYZ ] ualpha-numeric = [ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789] ualpha-numeric-space = [ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789 ] ualpha-numeric-symbol14 = [ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*()-_+=] ualpha-numeric-symbol14-space = [ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*()-_+= ] .. výpis zkrácen .. |
Z výpisu vidíme, že název abecedy je definován nalevo a písmena abecedy jsou určena výčtem uzavřeným v hranatých závorkách. Všimněte si, že některé abecedy obsahují mezeru a v názvu abecedy se vyskytuje slovo space. Nikdo nám nebrání přidat si do souboru vlastní definici abecedy, nebo ještě lépe si celý soubor zkopírovat pod novým názvem a vytvářet si nové definice v něm.
Nyní si vyzkoušíme příklad s již definovanou abecedou ualpha (upper alpha), která obsahuje pouze velká písmena.
Příklad 2 – Použití pouze velkých písmen pomocí abecedy s názvem ualpha, která je definována v souboru charset.lst
1 2 3 4 5 6 7 8 9 |
root@kali:~# crunch 3 3 -f /usr/share/crunch/charset.lst ualpha -o slovnik-3x3-ualpha.txt Crunch will now generate the following amount of data: 70304 bytes 0 MB 0 GB 0 TB 0 PB Crunch will now generate the following number of lines: 17576 crunch: 100% completed generating output |
Zkontrolujeme obsah našeho nového slovníku, zda obsahuje správná slova abecedy velkých písmen o délce tři znaky.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
root@kali:~# cat ./slovnik-3x3-ualpha.txt AAA AAB AAC AAD AAE AAF AAG AAH AAI AAJ AAK AAL AAM AAN AAO AAP AAQ AAR AAS AAT AAU AAV .. výpis zkrácen .. |
Vidíme, že výsledek je správný.
Skládáme permutace
Pomocí parametru -p, který uvádíme vždy jako poslední, můžeme definovat permutace jednotlivých znaků abecedy nebo přímo vybraných slov. V následujících příkladech záměrně vypouštíme volbu výstupu do souboru přepínačem (-o). Nadále však musíme zachovávat povinné první dva parametry, minimální a maximální počet znaků ve slovech, ikdyž nemají na výsledek vliv.
Příklad 3 – Všechny permutace číslic 1,2 a 3
1 2 3 4 5 6 7 8 9 10 11 12 13 |
root@kali:~# crunch 3 3 -p 123 Crunch will now generate approximately the following amount of data: 24 bytes 0 MB 0 GB 0 TB 0 PB Crunch will now generate the following number of lines: 6 123 132 213 231 312 321 |
Příklad 4 – Všechny permutace slov dog, cat, kit
1 2 3 4 5 6 7 8 9 10 11 12 13 |
root@kali:~# crunch 3 3 -p dog kit cat Crunch will now generate approximately the following amount of data: 60 bytes 0 MB 0 GB 0 TB 0 PB Crunch will now generate the following number of lines: 6 catdogkit catkitdog dogcatkit dogkitcat kitcatdog kitdogcat |
Příklad 5 – Rekonstruujeme heslo, které psal útočník jednou rukou na levé části klávesnice. Víme, že stiskl klávesy q,w,e a dvakrát zadal číslici 1 (ano, není to permutace pro matematiky). Nejsme si jisti pořadím znaků a tak vygenerujeme všechny možnosti.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
root@kali:~# crunch 0 0 -p q w e 1 1 Crunch will now generate approximately the following amount of data: 720 bytes 0 MB 0 GB 0 TB 0 PB Crunch will now generate the following number of lines: 120 11eqw 11ewq 11qew 11qwe 11weq 11wqe 1e1qw 1e1wq 1eq1w 1eqw1 1ew1q 1ewq1 1q1ew -- výpis zkrácen -- |
Sestavujeme vzor
Poslední příklad, který si ukážeme, je sestavení vzoru slova podle masky. Uvažujme případ, kdy hádané heslo má pouze 3 znaky, abecedu tvoří písmena a,b,c a uprostřed tohoto hesla se vyskytuje právě jedno číslo. Maska takového hesla by mohla vypadat takto „@%@“, kde znak zavináč reprezentuje znak abecedy malých písmen a procento zastupuje číslici.
Příklad 6 – Slova podle masky „@%@“
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
root@kali:~# crunch 3 3 abc -t @%@ Crunch will now generate the following amount of data: 360 bytes 0 MB 0 GB 0 TB 0 PB Crunch will now generate the following number of lines: 90 a0a a0b a0c a1a a1b a1c a2a a2b a2c a3a a3b a3c a4a |
V následujícím příkladu sestavíme slova obsahující vždy předponu „black“ následovanou třemi znaky malých písmen a jednou číslicí.
Příklad 7 – Hesla podle masky „black@@@%“
1 2 3 4 5 6 7 8 9 |
root@kali:~# crunch 8 8 -f /usr/share/crunch/charset.lst lalpha -t black@@% -o black.txt Crunch will now generate the following amount of data: 60840 bytes 0 MB 0 GB 0 TB 0 PB Crunch will now generate the following number of lines: 6760 crunch: 100% completed generating output |
Ověřením konce obsahu souboru black.txt vidíme, že konstrukce slov je správná.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
cat ./black.txt .. výpis zkrácen .. blackzy7 blackzy8 blackzy9 blackzz0 blackzz1 blackzz2 blackzz3 blackzz4 blackzz5 blackzz6 blackzz7 blackzz8 blackzz9 |
Zpracování slovníku
Generování slovníku nástrojem Crunch není posledním krokem při stavbě slovníku. Vygenerované slovníky můžeme spojovat, provádět záměnu některých znaků nebo je jinak zpracovávat a filtrovat. Takové zpracování můžeme provádět běžnými příkazy, které běžně známe z Linux/Unix prostředí. Jde zejména o příkazy cat, paste, tr, sort, sed, awk a to buď postupně nebo pomocí jejich zřetězení.
Závěr
V tomto příspěvku jsme si ukázali použití nástroje Crunch pro sestavení vlastního slovníku. Zabývali jsme se třemi případy. První z nich bylo generování všech slov abecedy určité délky, druhým případem byly permutace slov a znaků abecedy a posledním případem bylo generování slov podle vzoru zadaného maskou. Nástroj Crunch má další volby, které umožňují omezovat opakování znaku ve slovech (-d) nebo začít generovat slovník od počátečního slova.
To je pro dnešek vše. Zvažujete-li cestu etického hackera od začátku, rád uvidím na hacking kurzech.