はまやんはまやんはまやん

hamayanhamayan's blog

CTFのWebセキュリティにおけるPassword Cracking, ハッシュ, 暗号化

この記事はCTFのWebセキュリティ Advent Calendar 2021の23日目の記事です。

本まとめはWebセキュリティで共通して使えますが、セキュリティコンテスト(CTF)で使うためのまとめです。
悪用しないこと。勝手に普通のサーバで試行すると犯罪です。

パスワードクラック

ハッシュ値の原文の特定・署名の秘密鍵の特定

ツール

pythonでゴリゴリ書いてもいいが、どうしても遅いのでクラッカーを積極的に使用しよう。

hashcat

  • パスワードクラッカー、早い。全探索でcrackするときは、pythonとか使わずにこっち使おう。
  • ./hashcat.exe -m 3200 hash.txt ../dic/rockyou.txt
    • 辞書攻撃するときこんな感じ
  • hashcatを使って変形辞書を作ることもできる
    1. ruleというファイル名で変形前の辞書を保存する
    2. hashcat.exe -r rules/best64.rule --stdout rule > dic.txtで変形辞書を作成
  • ハッシュ関数を変えたいときは-mで変える。
    • https://hashcat.net/wiki/doku.php?id=hashcat
    • ここに対応表が書いてあるので、md5(md5(pass))であれば-m 2600のように指定する。
    • 使用済み
      • 3200 bcrypt $2*$, Blowfish (Unix)
      • 100 SHA1
      • 1400 SHA2-256
      • 900 MD4
      • 0 MD5
      • 2600 md5(md5($pass))
      • 4400 md5(sha1($pass))
      • 1000 NTLM
      • 160 HMAC-SHA1 (key = $salt)
        • hash.txtにhash:saltとすればいい
      • 1800 sha512crypt $6$, SHA512 (Unix)
      • 16500 JWT (JSON Web Token)
        • hash.txtにJWTを直に置けばいい
  • hashcatでshadowファイルを解析する例
  • ハッシュについて
    • bcrypt - Wikipedia
      • $1$: MD5ベースの暗号('md5crypt')
      • $2$: Blowfishベースの暗号 ('bcrypt')
      • $sha1$: SHA-1ベースの暗号 ('sha1crypt')
      • $5$: SHA-256ベースの暗号 ('sha256crypt')
      • $6$: SHA-512ベースの暗号 ('sha512crypt')
  • エラーハンドリング
    • Initializing backend runtime for device #1...となっている場合は--forceで待てば動くようになるかも
      • これでハングしてる場合は動いてない
  • 原文がアラビア語の場合のクラック

John The Ripper

  • パスワードの総合的なクラックツール。john --wordlist /usr/share/wordlists/rockyou.txt [hashpath]
  • JWTの署名もクラック可能
  • Dockerで使うには
    • docker run -it -v d:\root\docker\jacktheripper:/root/ adamoss/john-the-ripper --wordlist /root/rockyou.txt /root/cracked.txt
  • パスワード解析終えたら別コマンドでしか結果取得できないので注意
    • $ john --show users.txt実行コマンドに--showを入れるだけ
  • フォーマット指定について
    • フォーマットを指定しなくても大丈夫だが、最初に大量にワーニングが出てこれじゃないみたいな提案をしてくれる。
    • 積極的に指定しないと駄目な場合も多い
    • フォーマット対応はjohnよりhashcatの方が多い
  • .htpasswdのパスワード解析 admin:$apr1$1U8G15kK$tr9xPqBn68moYoH4atbg20 渡すだけでOK
  • shadowのパスワード解析 $ john users.txt --wordlist=dic.txt
  • private keyで要求されるパスワードを総当りで解析するには
    1. ssh2johnを使って、ハッシュ値に変換する(id_rsaを持ってくる)
    2. John The Ripperで解析 john --wordlist=/usr/share/wordlists/rockyou.txt hash.txt
    3. sshで使う $ ssh -i [prikey] [user]@[ip]

圧縮ファイルパスワードクラック

  • ctf-tools/John/run at master · truongkma/ctf-tools · GitHub
    • ここにたくさん*2john.pyがある
  • zip
    1. zip2john [zipfile] > ziphash.txtでハッシュを抜き出す
    2. john --wordlist=/usr/share/dirb/wordlists/rockyou.txt ziphash.txtみたいに解析
  • 7z
    1. 7z2john ./chicken.7z > chicken.hashでハッシュを抜き出す
    2. john chicken.hash --wordlist=/usr/share/dirb/wordlists/rockyou.txt --format=7z-openclみたいに解析
  • PGP鍵(private key)
    1. gpg2john [pgp key] > hash.txt
    2. john hash.txt --wordlist=/usr/share/dirb/wordlists/rockyou.txtみたいに解析
    3. gpg --import [gpg key (.asc)]
    4. gpg --decrypt [gpg file]
  • jwt (HS256)
    1. jwtをそのままhash.txtとして保存
    2. john hash.txt
  • johnは.john/john.potにクラックパスワードがキャッシュされている

Zip

既知平文攻撃

  • 暗号化zipの中に平文がわかっているファイルがあれば、効率的に解析ができる
    1. 平文がわかっているファイルを含めて、非暗号zipファイルを作る
    2. zipファイルの圧縮環境の違いでうまく行かない場合があるので、その場合は7za L -sltで確認可能
    3. pkcrackでクラックする pkcrack -C ./with_password.zip -c mod_logo.jpg -P /tmp/mod_logo.zip -p mod_logo.jpg -d ./dec.zip
    4. -C [暗号化されたzipファイル]
    5. -c [暗号化されたzipファイルの中で平文がわかるファイル]
    6. -P [平文のファイルが入っている暗号化されていないzip] ←これはMUSTじゃない
    7. -p [平文のファイル]
    8. -d [出力先(復号したzipファイルの名前)]
  • @Nperairさんのツイート
    • zipの標準の暗号化がゴミで、ファイルに12byteの既知の平文があれば既知平文攻撃で中身が読める
    • ファイルのフォーマットの都合上先頭12byteくらいはほぼ推測できてしまう
  • 7zipであらかじめ開いてサイズを確認して、既知平文として正しいものかどうかを確認する
  • DCTF-writeups/CompanyLeak.md at main · yulyachert/DCTF-writeups · GitHub
    • bkcrackというツールでもやれる

AES圧縮のzip

  • zipファイルの新しいフォーマットではAES暗号化とかが使える
    • unzipで解凍をneed PK compat.みたいに出てきたら、古い可能性がある
    • そういう場合は7za e [filepath]とすると行える
  • pythonならpyzipperを使えばいい
  • crack例

johnとhashcat

  • ctf/2021/dawg/forensics/photo_album at master · ryan-cd/ctf
    • 面白いやり方をしているzip2john encrypted.zip > pass_hash.txtとするとpkzip2という文字列を含むハッシュが得られたので、hashcatの 17200 | PKZIP (Compressed) | Archives 17220 | PKZIP (Compressed Multi-File) | Archives 17225 | PKZIP (Mixed Multi-File) | Archives 17230 | PKZIP (Mixed Multi-File Checksum-Only) | Archives 17210 | PKZIP (Uncompressed) | Archives 20500 | PKZIP Master Key | Archives 20510 | PKZIP Master Key (6 byte optimization) | Archives この一覧から17220を使って$ hashcat.exe -m 17220 -a 3 -1 ?l?d ?1?1?1?1?1?1?1?1 hash.txtで総当たりすると見つかる
    • 上と似ているが動かなかった。だが、下なら動いた
      • zip2john [file] | cut -d ':' -f 2 > hash.txtとしてhashcat -a 0 -m 13600 hash.txt --show