好奇心の足跡

飽きっぽくすぐ他のことをしてしまうので、忘れないため・形にして頭に残すための備忘録。

TryHackMe Crack The Hash Level2 writeup

TryHackMe の Crack The Hash Level 2 の Challenge "It's time to crack hashes" パートのwriteupです。
Crack The Hashと、Level2のTasksをコンプリートした前提です。

tryhackme.com

Hashのクラッキングについて、調べたり試行錯誤しながら練習問題が解けるので、かなり勉強になりました。今までオンラインのハッシュクラックツールに突っ込むだけ、or johnhashcat を「全部入り」オプションで長時間マシンぶん回して力技でクラックするだけ、という戦い方だったので、ルールの書き方やWordリストの選び方を手を動かしながら学べて良かったです。

Advice n°1

マシンを立ててWebサイトにアクセスすると、会話形式でパスワードの形式に関するヒントがゲットできます。

John Neige @john: Hi, my name is John. I'm looking for a good advice to get a strong password. Usually I use the name of my son but I fear it's not secure enough.

Hacker @h4ck: You can use border mutation. It's commonly used, add a combination of digits and special symbols at the end or at the beginning, or both.

Hint

English male name, MD5, Border mutation, custom rule

会話とヒントから、男性名に、数字と特殊記号を先頭・末尾のどちらかor両方につけたパスワードで有ることが推測できます。

まず、男性名のワードリストとして、Task3で使ったMentalistを使ってみます。

f:id:kusuwada:20220208151142p:plain f:id:kusuwada:20220208151150p:plain

Base Words から Common Names > Men を選択し、Process > Full Wordlist で男性名のワードリストを出力します。

$ wc menname.txt
1000 1000 6677 menname.txt

1000件ありました。
これの前後に数字・特殊文字がくっついた形式が候補になります。今回は、これまた一つ前のTaskでやった、johnのルールを書いてみることにしました。

$ sudo vi /usr/share/john/john-local.conf                         

下記あたりを参考にしつつ、特殊記号は先程の Mentalist の special symboles から拝借してみました。

数字・特殊記号混じりの文字列を、一つ、二つ、…と足していって、5個まで足したところでHitしました。最終的に使ったルールはこちら。最後のだけで通るはず。

[List.Rules:NO1]
cAz"[0-9!@\#\$%^&*()\-=_+`~\[\]{}\\|/:\;']"
cAz"[0-9!@\#\$%^&*()\-=_+`~\[\]{}\\|/:\;'][0-9!@\#\$%^&*()\-=_+`~\[\]{}\\|/:\;']"
cAz"[0-9!@\#\$%^&*()\-=_+`~\[\]{}\\|/:\;'][0-9!@\#\$%^&*()\-=_+`~\[\]{}\\|/:\;'][0-9!@\#\$%^&*()\-=_+`~\[\]{}\\|/:\;']"
cAz"[0-9!@\#\$%^&*()\-=_+`~\[\]{}\\|/:\;'][0-9!@\#\$%^&*()\-=_+`~\[\]{}\\|/:\;'][0-9!@\#\$%^&*()\-=_+`~\[\]{}\\|/:\;'][0-9!@\#\$%^&*()\-=_+`~\[\]{}\\|/:\;']"
cAz"[0-9!@\#\$%^&*()\-=_+`~\[\]{}\\|/:\;'][0-9!@\#\$%^&*()\-=_+`~\[\]{}\\|/:\;'][0-9!@\#\$%^&*()\-=_+`~\[\]{}\\|/:\;'][0-9!@\#\$%^&*()\-=_+`~\[\]{}\\|/:\;'][0-9!@\#\$%^&*()\-=_+`~\[\]{}\\|/:\;']"

繰り返しをいい感じに書くルールがわからなかったので、愚直にパターンを追加していった。johnの実行コマンドはこちら。

$ echo "b16f211a8ad7f97778e5006c7cecdf31" > no1hash.txt 
$ john no1hash.txt --format=raw-md5 --wordlist=menname.txt --rules=NO1
Using default input encoding: UTF-8
Loaded 1 password hash (Raw-MD5 [MD5 256/256 AVX2 8x3])
Warning: no OpenMP support for this hash type, consider --fork=2
Press 'q' or Ctrl-C to abort, almost any other key for status
...(omit)...
Session completed. 

これで暫く待つとHitしました。

Advice n°2

Levy Tate @levy: Hi, my name is Levy. I'm looking for a good advice to get a strong password too. Usually I use the name of my daughter but I fear it's not secure too.

Hacker @h4ck: Like John, use border mutation.

Hint

English female name, MD5, Border mutation, custom rule

No1との違いは、名前が男性でなく女性なこと。No1のMentalistで作成した名前リストを女性用に変更して、同じようにやってみます。

$ echo 7463fcb720de92803d179e7f83070f97 > no2hash.txt
$ john no2hash.txt --format=raw-md5 --wordlist=womenname.txt --rules=NO1                                                               1 ⨯
Using default input encoding: UTF-8
Loaded 1 password hash (Raw-MD5 [MD5 256/256 AVX2 8x3])
Warning: no OpenMP support for this hash type, consider --fork=2
Press 'q' or Ctrl-C to abort, almost any other key for status
...(omit)...
Session completed. 

数秒でクラックに成功しました👍

Advice n°3

Charlotte Ofreize @charlotte: I'm Charlotte, 23 y/o. During my holidays in Mexico my professional account password expired. I need a new one, any idea?

Hacker @h4ck: Maybe pick a town you visited during your trip?

Charlotte Ofreize @charlotte: Good idea. But it's not matching my company's password policy.

Hacker @h4ck: Use freak/1337 mutation. Replace some letters with similarly looking special symbols.

Hint

Town name of Mexico, MD5, Freak mutation, mentalist tool

メキシコの町の名前をベースに、1337ということはリートコードが使ってあるっぽい。
メキシコに特化した町の名前のデータベースは見つからなかったけど、ただのCityのリストなら前のTaskでダウンロードしておいた seclist の秘密の質問の回答集にあったので、まずはこれを使ってみました。
あと、johnの用意されているルール集に l33t というのがあって今回使えそうだったので、そっちも使ってみました。

$ echo f4476669333651be5b37ec6d81ef526f > no3hash.txt
$ john no3hash.txt --format=raw-md5 --wordlist=/usr/share/seclists/Miscellaneous/security-question-answers/cities.txt --rules=l33t
Using default input encoding: UTF-8
Loaded 1 password hash (Raw-MD5 [MD5 256/256 AVX2 8x3])
Warning: no OpenMP support for this hash type, consider --fork=2
Press 'q' or Ctrl-C to abort, almost any other key for status
...(omit)...
Session completed. 

今回はMentalist使わなかった。

Advice n°4

David Guettapan @david: Hi, I'm David, I'm a dj. But I also love rap. For example this, Eminem song: https://www.youtube.com/watch?v=sNPnbI1arSE

"Hi, my name is, what? My name is, who?"

I really love this song.

Hacker @h4ck: ... What can I do for you? You need a password right?

David Guettapan @david: Yeah I'll use my awesome name.

Hacker @h4ck: That's too easy. Use case mutation, make variations of uppercase or lowercase letters for any character.

Hint

Own name, SHA1, Case mutation; existing rule

リンク先の動画を見てみたけど、特定の名前が出てくるものではなさそう。再生回数もめちゃめちゃ多いので、私は知らないけど有名なアーティストなのかもしれない。
名前と、大文字小文字の組み合わせでいけそう。ヒントの通りsha1らしい。

…と思って色々やってみたけどなんだかうまく行かない。
よくよく問題やヒントを見返してみると、 "Own name", "my awesome name"、即ちフルネームである。使っていた辞書リストはFirst nameばかりなのでヒットしなかったみたい。

姓と名の辞書を組み合わせてやるのも良さそうだけど、facebookの名前辞書を見つけたのでこちらをDLしてみたり。

$ sudo python3 wordlistctl.py fetch facebook-names-unique

Case mutationとのことなので、ruleにCase mutation用のものを使用してみたりしたけどクラックできず。諦めて一旦他の問題に。

戻ってきて問題文をよく読んで気づいたのですが、この人の名前 David Guettapanじゃん。
THMの解答欄を見ると14文字。スペースをなくせばこの人の名前も14文字。もしやもうこれをCaseMutationすればいいだけでは?
この後の問題で、john the ripperの既存rule一覧 を見ていたときに、大文字小文字を変えるやつがあったのを思い出しました。(KoreLogicRulesReplaceLettersCaps)
どうやらシンプルなルール --rules:nt に含まれているらしい。どちらを使っても一瞬でクラックできました!

$ echo a3a321e1c246c773177363200a6c0466a5030afc > no4hash.txt
$ haiti a3a321e1c246c773177363200a6c0466a5030afc
SHA-1 [HC: 100] [JtR: raw-sha1]
$ echo DavidGuettapan > no4.txt 
$ john no4hash.txt --format=raw-sha1 --wordlist=no4.txt --rules:ReplaceLettersCaps
Using default input encoding: UTF-8
Loaded 1 password hash (Raw-SHA1 [SHA1 256/256 AVX2 8x])
Warning: no OpenMP support for this hash type, consider --fork=2
Press 'q' or Ctrl-C to abort, almost any other key for status
...(omit)...
Session completed.

色んな所で落としてきたフルネームリストを使ったクラッキングをしてると、kali VMが何度もメモリ不足やらなんやらでクラッシュして大変だった。問題を読み直す・よく読むの大事。

Advice n°5

Jack Pott @jack: I love Adele, the singer, such powerful lyrics, such beautiful songs ... anyway ... Hi hacker, how can I strengthen my password?

Hacker @h4ck: Make it longer.

Jack Pott @jack: Yeah but it is already pretty long.

Hacker @h4ck: So just reverse the characters order.

Hint

Lyrics, MD5, Order mutation, lyricpass

会話とヒントから、歌詞(lyrics)のワードリストを取ってきて逆順にするやつを試せば良さそうです。lyricpassというヒントをググってみます。

GitHub - initstring/lyricpass: Password wordlist generator using song lyrics for targeted bruteforce audits / attacks. Useful for penetration testing or security research.

これが使えるみたい。READMEの使い方を読んで、会話に出てきたアーティストの楽曲でワードリストを作ってもらいます。

$ git clone https://github.com/initstring/lyricpass.git
$ cd lyricpass
$ python3 lyricpass.py -a "Adele"
[+] Looking up artist Adele
[+] Found 379 songs for artists Adele
[+] All done! 379/379...       

Raw lyrics: raw-lyrics-2022-02-06-08.28.54
Passphrases: wordlist-2022-02-06-08.28.54

完成しました。あとは、reverseのルールをつけてクラックに挑戦してみます。

$ echo d5e085772469d544a447bc8250890949 > no5hash.txt
$ echo r > rev.rule
$ haiti d5e085772469d544a447bc8250890949        
MD5 [HC: 0] [JtR: raw-md5]
...(omit)...
$ hashcat -m 0 no5hash.txt raw-lyrics-2022-02-06-08.28.54 -r rev.rule
hashcat (v6.1.1) starting...
...(omit)...                                            
Session..........: hashcat
Status...........: Cracked
Hash.Name........: MD5
Hash.Target......: d5e085772469d544a447bc8250890949
Time.Started.....: Mon Feb  7 00:27:15 2022 (0 secs)
Time.Estimated...: Mon Feb  7 00:27:15 2022 (0 secs)
Guess.Base.......: File (raw-lyrics-2022-02-06-08.28.54)
Guess.Mod........: Rules (rev.rule)
Guess.Queue......: 1/1 (100.00%)
Speed.#1.........:   175.8 kH/s (0.73ms) @ Accel:1024 Loops:1 Thr:1 Vec:8
Recovered........: 1/1 (100.00%) Digests
Progress.........: 2048/16666 (12.29%)
Rejected.........: 0/2048 (0.00%)
Restore.Point....: 0/16666 (0.00%)
Restore.Sub.#1...: Salt:0 Amplifier:0-1 Iteration:0-1
Candidates.#1....: tnew yrots eht woh si sihT -> )peed eht ni gnillor ,llaf annog era sraeT( peed eht ni gnilloR

Started: Mon Feb  7 00:27:13 2022
Stopped: Mon Feb  7 00:27:18 2022

数秒でクラックできました!

Advice n°6

Crystal Ball @crystal: Hi, I need an easily rememberable password.

Hacker @h4ck: Just pick your phone number! lol

Crystal Ball @crystal: Even if I'm from Sint Maarten?

Hacker @h4ck: Why not. lol

Hint

Phone number, MD5, No mutation, pnwgen

どうやらSint Maartenの電話番号みたい。pnwgenというヒントがあるので、調べてみます。

GitHub - toxydose/pnwgen: A very flexible phone number wordlist generator

Phone number Wordlist Generator だそうです!まさに!こんなのがあるんですねー!!
"Sint Maarten" は、Google情報によると

シント・マールテン (国) シント マールテンはオランダ王国を構成している自治領のひとつで、カリブ海に浮かぶ島の南部に位置します。島はこのシント マールテンとフランスの海外準県であるサンマルタンに分割されています。この島には、ラグーン、ビーチ、塩田といった自然が広がっています。首府フィリップスブルフには石畳の道が敷かれています。ショッピング街のフロント ストリートにはカラフルなコロニアル調の建物が立ち並びます。この街の港はクルーズ船の寄港地として人気です。 ― Google

首都: フィリップスバーグ

市外局番: +721

人口: 4.081万 (2020年) 世界銀行

調べてて思い出したけど、行ったことあった…。クルーズ船で島巡りした時寄っただけだからすっかり忘れてた。

ということで、市外局番+721から始まるのをprefixに指定すると良さそう。prefixは prefix.txt を書き換えると自動でつく。

$ git clone https://github.com/toxydose/pnwgen.git
$ cd pnwgen
$ vi prefix.txt
<721に書き換え>
$ python3 pnwgen.py      
INFO:--------------------------------
INFO:Creating a wordlist file...

Choose the number of digits in generated raw output:
(min 4, max 10, 7 (by default) - press ENTER)

>>> 
INFO: digits raw output was choosed
INFO:Finished!!!

とりあえずDefaultの長さでリストを作ってもらいました。
この情報でhashcatでクラックを試みるも、うまくヒットしません。もう一度 sint maarten phone number format でググってみると、どうやら +1721 + 7桁の番号が正式な電話番号っぽい。ので、上記の prefix.txt+1721 に書き換えて、再度Wordリストを作成してみました。

$ haiti 377081d69d23759c5946a95d1b757adc                                                                            
MD5 [HC: 0] [JtR: raw-md5]
...(omit)...
$ echo 377081d69d23759c5946a95d1b757adc > no6hash.txt
$ hashcat -m 0 no6hash.txt pnwgen/wordlist.txt
hashcat (v6.1.1) starting...

...(omit)...
                                                 
Session..........: hashcat
Status...........: Cracked
Hash.Name........: MD5
Hash.Target......: 377081d69d23759c5946a95d1b757adc
Time.Started.....: Mon Feb  7 06:16:42 2022 (2 secs)
Time.Estimated...: Mon Feb  7 06:16:44 2022 (0 secs)
Guess.Base.......: File (pnwgen/wordlist.txt)
Guess.Queue......: 1/1 (100.00%)
Speed.#1.........:  3940.7 kH/s (0.22ms) @ Accel:1024 Loops:1 Thr:1 Vec:8
Recovered........: 1/1 (100.00%) Digests
Progress.........: 5441536/10000000 (54.42%)
Rejected.........: 0/5441536 (0.00%)
Restore.Point....: 5439488/10000000 (54.39%)
Restore.Sub.#1...: Salt:0 Amplifier:0-1 Iteration:0-1
Candidates.#1....: +17215439488 -> +17215441535

Started: Mon Feb  7 06:16:41 2022
Stopped: Mon Feb  7 06:16:45 2022

4秒でクラック成功!
...だけど、その前にprefix 721 で試したり、 +721 で試したり、 1721 でも試したので実際この問題を解くのに結構時間かかった。

Advice n°7

Justin Thyme @justin: Hi, I have a common password that I want to keep, I need a stronger way to store it than MD5.

Hacker @h4ck: Take a look at the last Competition Project of NIST.

Justin Thyme @justin: SHA1?

Hacker @h4ck: NO! lol lel kek keccak topkek

Hint

Rockyou, SHA3-512, No mutation

ヒントがとても強力。rockyouを使うとクラックできるらしい。ヒントにも書いてあるけど、haitiでHashの種類の候補と番号を取得してクラックしてみます。

$ echo ba6e8f9cd4140ac8b8d2bf96c9acd2fb58c0827d556b78e331d1113fcbfe425ca9299fe917f6015978f7e1644382d1ea45fd581aed6298acde2fa01e7d83cdbd > no7hash.txt
$ haiti ba6e8f9cd4140ac8b8d2bf96c9acd2fb58c0827d556b78e331d1113fcbfe425ca9299fe917f6015978f7e1644382d1ea45fd581aed6298acde2fa01e7d83cdbd
SHA-512 [HC: 1700] [JtR: raw-sha512]
SHA3-512 [HC: 17600] [JtR: raw-sha3]
SHA3-512 [HC: 17600] [JtR: dynamic_400]
$ hashhashcat -m 17600 no7hash.txt /usr/share/wordlists/rockyou.txt
hashcat (v6.1.1) starting...
...(omit)...
Session..........: hashcat
Status...........: Cracked
Hash.Name........: SHA3-512
Hash.Target......: ba6e8f9cd4140ac8b8d2bf96c9acd2fb58c0827d556b78e331d...83cdbd
Time.Started.....: Sun Feb  6 14:32:56 2022 (14 secs)
Time.Estimated...: Sun Feb  6 14:33:10 2022 (0 secs)
Guess.Base.......: File (/usr/share/wordlists/rockyou.txt)
Guess.Queue......: 1/1 (100.00%)
Speed.#1.........:  1151.7 kH/s (1.28ms) @ Accel:1024 Loops:1 Thr:1 Vec:4
Recovered........: 1/1 (100.00%) Digests
Progress.........: 14343189/14344385 (99.99%)
Rejected.........: 3093/14343189 (0.02%)
Restore.Point....: 14341141/14344385 (99.98%)
Restore.Sub.#1...: Salt:0 Amplifier:0-1 Iteration:0-1
Candidates.#1....: !J389aM544b! -> !!regan~~

Started: Sun Feb  6 14:32:30 2022
Stopped: Sun Feb  6 14:33:11 2022

なんと1分未満でHitしました。やったね!

Advice n°8

Robyn Banks @robyn: Hi hacker, we need a true military grade password.

Hacker @h4ck: Hey Robyn, sure yeah! Let's start by randomly picking a word here. Then let's repeat 2, 3, 4 or maybe 5 times so it will be longer. Finally let's pick a hardcore cryptographic hash function.

Robyn Banks @robyn: Yeah yeah yeah, I like it. Like a finalist of SHA-3 project. But one that is used by PHC winner KDF.

Hacker @h4ck: Yeah good choice, plus it will be handy as it is included in GNU core utilities. Wow even WireGuard use it.

Hint

Web scrapping, blake2, Repetition, CeWL

今回はWebからWordリストを作るようです。Hashの種類も強固なやつっぽい。まずはHashの種別特定とクラックツールへの入力値準備。

$ echo 9f7376709d3fe09b389a27876834a13c6f275ed9a806d4c8df78f0ce1aad8fb343316133e810096e0999eaf1d2bca37c336e1b7726b213e001333d636e896617 > no8hash.txt
$ haiti 9f7376709d3fe09b389a27876834a13c6f275ed9a806d4c8df78f0ce1aad8fb343316133e810096e0999eaf1d2bca37c336e1b7726b213e001333d636e896617
SHA-512 [HC: 1700] [JtR: raw-sha512]
SHA3-512 [HC: 17600] [JtR: raw-sha3]
SHA3-512 [HC: 17600] [JtR: dynamic_400]
Keccak-512 [HC: 18000] [JtR: raw-keccak]
BLAKE2-512 [JtR: raw-blake2]

ヒントにBlake2とあったので、このタイプを使うことにします。hashcatは対応してないのかな。

cewlは、上記会話中の"here"のところがリンクになっており、こんなページに案内されたのでここから情報を取ってWordリストを作ります。ちなみにこのRoomように立てたマシン上のページでした。

f:id:kusuwada:20220208151807p:plain

cewlは SANS HolidayHack2021で使ったばっかり。URLを入れるだけ。とても簡単。

$ cewl http://10.10.221.120/rtfm.re/en/sponsors/index.html > no8wordlist.txt

あとは、単語を選んだらそれを繰り返す、という会話があったので、これをルールに設定してみます。johnのルールの Dupilicate: d が使えそう。

$ sudo vi /usr/share/john/john-local.conf 

こちらが今回使ったルール。repeat 2, 3, 4 or maybe 5 times とあったので、5回分くらい繰り返してくれるようにルールを作ってみました。

[List.Rules:Double]
d
dd
ddd
dddd
ddddd

これらを使ってクラックを試みます。

$ john no8hash.txt --format=raw-blake2 --wordlist=no8wordlist.txt --rules=Double
Using default input encoding: UTF-8
Loaded 1 password hash (Raw-Blake2 [BLAKE2b 512 128/128 AVX])
Will run 2 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
...(omit)...
Use the "--show" option to display all of the cracked passwords reliably
Session completed. 

ルールを結構書いたので時間がかかるかと思いきや、一瞬でクラックに成功しました。やったね!

Advice n°9

Warren Peace @warren: Why are you spreading your stupid mutations? Strong hash + salt is enought.

Hacker @h4ck: Wow that's rude. Let's see if I can hack you.

Hint

Rockyou, SHA512-crypt, No mutation

ヒントがまたしても強力なのですぐ解けそう。Hashのタイプと番号を調べてrockyou使ってクラックします。

$ echo '$6$kI6VJ0a31.SNRsLR$Wk30X8w8iEC2FpasTo0Z5U7wke0TpfbDtSwayrNebqKjYWC4gjKoNEJxO/DkP.YFTLVFirQ5PEh4glQIHuKfA/' > no9hash.txt
$ haiti '$6$kI6VJ0a31.SNRsLR$Wk30X8w8iEC2FpasTo0Z5U7wke0TpfbDtSwayrNebqKjYWC4gjKoNEJxO/DkP.YFTLVFirQ5PEh4glQIHuKfA/'
SHA-512 Crypt [HC: 1800] [JtR: sha512crypt]
$ hashcat -m 1800 no9hash.txt /usr/share/wordlists/rockyou.txt
hashcat (v6.1.1) starting...
...(omit)...                                       
Session..........: hashcat
Status...........: Cracked
Hash.Name........: sha512crypt $6$, SHA512 (Unix)
Hash.Target......: $6$kI6VJ0a31.SNRsLR$Wk30X8w8iEC2FpasTo0Z5U7wke0Tpfb...HuKfA/
Time.Started.....: Sun Feb  6 14:36:58 2022 (50 secs)
Time.Estimated...: Sun Feb  6 14:37:48 2022 (0 secs)
Guess.Base.......: File (/usr/share/wordlists/rockyou.txt)
Guess.Queue......: 1/1 (100.00%)
Speed.#1.........:      553 H/s (5.34ms) @ Accel:8 Loops:1024 Thr:1 Vec:4
Recovered........: 1/1 (100.00%) Digests
Progress.........: 27824/14344385 (0.19%)
Rejected.........: 0/27824 (0.00%)
Restore.Point....: 27808/14344385 (0.19%)
Restore.Sub.#1...: Salt:0 Amplifier:0-1 Iteration:4096-5000
Candidates.#1....: leopards -> junior06

Started: Sun Feb  6 14:36:56 2022
Stopped: Sun Feb  6 14:37:50 2022

こちらも1分未満でHit。日本語っぽいパスワードだったけどばっちりクラックできました。