burp验证码爆破插件二改

这不315晚会burp都上了嘛,蹭蹭时事热点。

0x01 背景

最近遇到了很多验证码登录口,验证码识别项目github上找了几个,但是不是装不上就是准确率不高的问题,后续也是慢慢修改出来了还算满意的识别验证码插件。

原插件项目地址为: https://github.com/c0ny1/captcha-killer

修改后的项目地址为: https://github.com/f0ng/captcha-killer-modified

已征得原作者同意进行二开

0x02插件二次修改

直接下载原项目的jar包,按照项目说明进行使用,发现intruder无法进行爆破,有些情况也满足不了需求,后面优化了一下,总共修改了两处地方

修改点1

发现使用过程中出现了报错 img 后面查了一下,原因是sun.misc.BASE64Encoder类不在jdk8+支持了,因为都在用新版burp了,而新版burp启动需要高版本的jdk,这里我是jdk10启动的burp,所以没有sun.misc.BASE64Encoder

下载源码,修改java.utils.Util里的源码如下:

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
27
// java
public static String base64Encode(byte[] byteArray){
byte[] res = Base64.getEncoder().encode(byteArray);
String res2 = new String(res);
res2 = res2.replace(System.lineSeparator(),"");
return res2;
}

public static String base64Encode(String str){
byte[] b = new byte[]{};
try {
b = str.getBytes("UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
byte[] res = Base64.getEncoder().encode(b);
String res2 = new String(res);
//去除base64结果中的换行符,java base64编码默认会76个字母换行一次
res2 = res2.replace(System.lineSeparator(),"");
return res2;
}

public static byte[] base64Decode(String str){
byte[] byteRes = new byte[]{};
byteRes = Base64.getDecoder().decode(str);
return byteRes;
}

再导入依赖

1
import java.util.Base64;

修改点2

这里还有个不是很完美的地方,只能识别响应包为图片的验证码,但是遇到的真实环境中,也有一种data:image这种格式的验证码,这个插件就无法识别了,如下:

img

这里我也进行了一点修改,主要是响应包图片的提取,主要修改如下: 在java.utils.Util包中增加函数

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
27
28
29
30
public static byte[] dataimgToimg(String str_img) throws IOException {
String pattern = "(data:image.*?)[\"|&]|(data%2Aimage.*?)[\"|&]";
Pattern r = Pattern.compile(pattern);
Matcher m = r.matcher(str_img);
if (m.find( )) {
str_img = m.group(0).replace("\"","").replace("&","") ;
}
byte[] img = DatatypeConverter.parseBase64Binary(str_img.substring(str_img.indexOf(",") + 1));
InputStream buffin = new ByteArrayInputStream(img);
return img;
}

public static boolean isImage(String str_img) throws IOException {
String pattern = "(data:image.*?)[\"|&]|(data%2Aimage.*?)[\"|&]";
Pattern r = Pattern.compile(pattern);
Matcher m = r.matcher(str_img);
if (m.find( )) {
str_img = m.group(0).replace("\"","").replace("&","") ;
}
byte[] img = DatatypeConverter.parseBase64Binary(str_img.substring(str_img.indexOf(",") + 1));
boolean isImg = false;
InputStream buffin = new ByteArrayInputStream(img);
BufferedImage image = ImageIO.read(buffin);
if(image == null){
isImg = false;
}else {
isImg = true;
}
return isImg;
}

修改后对项目进行编译:

1
$ mvn package

识别的效果如下: img

0x03 插件验证码识别库的选择

这里的接口大部分都需要付费,如baidu的接口每天只有300次,还有其他平台的,每天有限制次数,不利于咱们测试呀

img

于是在我的不懈努力下,找到了一个开源识别验证码的项目,项目地址为: https://github.com/sml2h3/ddddocr

所需要的环境支持如下:

1
2
3
python <= 3.9
Windows/Linux/Macos..
暂时不支持Macbook M1(X),M1(X)用户需要自己编译onnxruntime才可以使用

0x04 实际效果

安装好ocr库以后直接运行代码:

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
# -*- coding:utf-8 -*-
# author:f0ngf0ng

import argparse
import ddddocr # 导入 ddddocr
from aiohttp import web

parser = argparse.ArgumentParser()
parser.add_argument("-p", help="http port",default="8888")
args = parser.parse_args()

ocr = ddddocr.DdddOcr()
port = args.p

async def handle_cb(request):
return web.Response(text=ocr.classification(img_base64=await request.text()))

app = web.Application()
app.add_routes([
web.post('/reg', handle_cb),
])

if __name__ == '__main__':
web.run_app(app, port=port)
$ python3 codereg.py

运行代码界面

img 识别模板如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
POST /reg HTTP/1.1
Host: 127.0.0.1:8888
Connection: close
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36
Sec-Fetch-Mode: navigate
Sec-Fetch-User: ?1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
Sec-Fetch-Site: none
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Content-Type: application/x-www-form-urlencoded
Content-Length: 55

<@BASE64><@IMG_RAW></@IMG_RAW></@BASE64>

记得设置接口地址为:http://127.0.0.1:8888

点击识别

img 即可识别出来验证码,准确率还不错,在85%以上,重要的是免费,无限使用

img

img

关于captcha-killer的用法可以参考c0ny1师傅的文章

注:

  • intruder的cookie要和captcha-killer的cookie一致
  • intruder的线程调为1,最好加时间延迟参数

0x05 总结

  1. 最近一直在写、改一些插件,发现burp对jdk版本高低太敏感了,有些时候特定的jdk版本会造成插件之间的冲突
  2. 修改插件感觉就像是站在巨人的肩膀上,不得不说c0ny1师傅的这个插件GUI页面用起来都很舒服
  3. 学会开发很重要,可以自己进行自定义修改,不做百分百的脚本小子

0x06 附录

https://github.com/c0ny1/captcha-killer [插件源项目]

https://gv7.me/articles/2019/burp-captcha-killer-usage/ [插件用法]

https://github.com/sml2h3/ddddocr [验证码识别项目]

https://github.com/PoJun-Lab/blaster [验证码登录爆破]

https://github.com/f0ng/captcha-killer-modified [修改后的burp验证码识别插件]