この記事はCTFのWebセキュリティ Advent Calendar 2021の23日目の記事です。
本まとめはWebセキュリティで共通して使えますが、セキュリティコンテスト(CTF)で使うためのまとめです。
悪用しないこと。勝手に普通のサーバで試行すると犯罪です。
パスワードクラック
- 推測で入れてみる
- 本当に適当に入れてみる。CTFでは推測でこんなユーザーパスがあるのでは?で入れると通ったりする
guest:guest
user:password
admin:admin
- 初期ユーザーパスワードで入れてみる
- phpmyadmin
root:
が初期値なので、変更しないとこれでログイン可能。ユーザー名がrootでパスワードが空白
- ihebski/DefaultCreds-cheat-sheet: One place for all the default credentials to assist the Blue/Red teamers activities on finding devices with default password 🛡️
- デフォルトクレデンシャルがまとまってる
- phpmyadmin
- 辞書攻撃
- パスワードはみなよくある文字列を使ってしまう傾向がある
- rockyou.txt
- CTFではとりあえずこれ使っておけばいい
- GitHub - danielmiessler/SecLists: SecLists is the security tester's companion. It's a collection of multiple types of lists used during security assessments, collected in one place. List types include usernames, passwords, URLs, sensitive data patterns, fuzzing payloads, web shells, and many more.
- SecListsもよく使われる。
- gobusterで
Discovery/Web-Content/
を使うのもいい選択
- rockyou.txt
- よく使われるパスワードについて辞書を用意しておき、かたっぱしから試行すると成功する場合がある
- https://wiki.skullsecurity.org/Passwords
- ここで紹介されてるrockyou.txtがよく使われる。
- なお、14,341,564(15 millionある)
- 手元での解析で主に使用される
- https://github.com/rootphantomer/Blasting_dictionary/blob/master/%E5%B8%B8%E7%94%A8%E5%AF%86%E7%A0%81.txt
- Webサイトの辞書攻撃で使われててた
- burpでやるとき
- Intruderに送る
- Positionsで入れ替えたい部分を$pass$とする
- PayloadsでSimple listにして、Load...でファイル読み込む(tools/webpass.txt)
- Start attackする
- Lengthが異なるものが大体答え
- パスワードはみなよくある文字列を使ってしまう傾向がある
- パスワードのより深い推測
- 得られた情報からパスワードリストを作成してそれを使って試行する
- OSINTで使いそうなワードを探して推測する
- 誕生日などで組合せリストを用意して試す
- 得られた情報からパスワードリストを作成してそれを使って試行する
- 総当たり(ブルートフォース)、リバースブルートフォース
- パスワードスプレイ攻撃
- 基本的にはリバースブルートフォールと一緒であるが、IDを順番に変えていって最後まで行ったら、パスワードを別のありそうな値に変えてIDを再度全探索していく
- パスワードリスト攻撃
- 流出したID・パスワードを使ってログイン試行をすること、リスト型攻撃とも書かれたりする
- 【セキュリティ ニュース】LINEにPWリスト攻撃 - 2段階認証未適用の問合フォームが標的に(1ページ目 / 全1ページ):Security NEXT
- 2FAはすべての部分に採用しないと、弱い所がこのように疲れる。
ハッシュ値の原文の特定・署名の秘密鍵の特定
ツール
pythonでゴリゴリ書いてもいいが、どうしても遅いのでクラッカーを積極的に使用しよう。
hashcat
- パスワードクラッカー、早い。全探索でcrackするときは、pythonとか使わずにこっち使おう。
- ./hashcat.exe -m 3200 hash.txt ../dic/rockyou.txt
- 辞書攻撃するときこんな感じ
- hashcatを使って変形辞書を作ることもできる
- ruleというファイル名で変形前の辞書を保存する
-
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
とすればいい
- hash.txtに
- 1800
sha512crypt $6$, SHA512 (Unix)
- 16500
JWT (JSON Web Token)
- hash.txtにJWTを直に置けばいい
- 3200
- hashcatでshadowファイルを解析する例
- ハッシュについて
- エラーハンドリング
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で要求されるパスワードを総当りで解析するには
- ssh2johnを使って、ハッシュ値に変換する(id_rsaを持ってくる)
- John The Ripperで解析
john --wordlist=/usr/share/wordlists/rockyou.txt hash.txt
- sshで使う
$ ssh -i [prikey] [user]@[ip]
圧縮ファイルパスワードクラック
- ctf-tools/John/run at master · truongkma/ctf-tools · GitHub
- ここにたくさん*2john.pyがある
- zip
-
zip2john [zipfile] > ziphash.txt
でハッシュを抜き出す -
john --wordlist=/usr/share/dirb/wordlists/rockyou.txt ziphash.txt
みたいに解析
-
- 7z
-
7z2john ./chicken.7z > chicken.hash
でハッシュを抜き出す -
john chicken.hash --wordlist=/usr/share/dirb/wordlists/rockyou.txt --format=7z-opencl
みたいに解析
-
- PGP鍵(private key)
-
gpg2john [pgp key] > hash.txt
-
john hash.txt --wordlist=/usr/share/dirb/wordlists/rockyou.txt
みたいに解析 -
gpg --import [gpg key (.asc)]
-
gpg --decrypt [gpg file]
-
- jwt (HS256)
- jwtをそのままhash.txtとして保存
-
john hash.txt
- johnは
.john/john.pot
にクラックパスワードがキャッシュされている
Zip
既知平文攻撃
- 暗号化zipの中に平文がわかっているファイルがあれば、効率的に解析ができる
- 平文がわかっているファイルを含めて、非暗号zipファイルを作る
- zipファイルの圧縮環境の違いでうまく行かない場合があるので、その場合は
7za L -slt
で確認可能 - pkcrackでクラックする
pkcrack -C ./with_password.zip -c mod_logo.jpg -P /tmp/mod_logo.zip -p mod_logo.jpg -d ./dec.zip
- -C [暗号化されたzipファイル]
- -c [暗号化されたzipファイルの中で平文がわかるファイル]
- -P [平文のファイルが入っている暗号化されていないzip] ←これはMUSTじゃない
- -p [平文のファイル]
- -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
- 面白いやり方をしている