这不315晚会burp都上了嘛,蹭蹭时事热点。
0x01 背景
最近遇到了很多验证码登录口,验证码识别项目github上找了几个,但是不是装不上就是准确率不高的问题,后续也是慢慢修改出来了还算满意的识别验证码插件。
原插件项目地址为: https://github.com/c0ny1/captcha-killer
修改后的项目地址为: https://github.com/f0ng/captcha-killer-modified
已征得原作者同意进行二开
0x02插件二次修改
直接下载原项目的jar包,按照项目说明进行使用,发现intruder无法进行爆破,有些情况也满足不了需求,后面优化了一下,总共修改了两处地方
修改点1
发现使用过程中出现了报错 后面查了一下,原因是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
| 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); 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
这种格式的验证码,这个插件就无法识别了,如下:
这里我也进行了一点修改,主要是响应包图片的提取,主要修改如下: 在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; }
|
修改后对项目进行编译:
识别的效果如下:
0x03 插件验证码识别库的选择
这里的接口大部分都需要付费,如baidu的接口每天只有300次,还有其他平台的,每天有限制次数,不利于咱们测试呀
于是在我的不懈努力下,找到了一个开源识别验证码的项目,项目地址为: 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
|
import argparse import 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
|
运行代码界面
识别模板如下:
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
点击识别
即可识别出来验证码,准确率还不错,在85%以上,重要的是免费,无限使用
关于captcha-killer的用法可以参考c0ny1师傅的文章
注:
- intruder的cookie要和captcha-killer的cookie一致
- intruder的线程调为1,最好加时间延迟参数
0x05 总结
- 最近一直在写、改一些插件,发现burp对jdk版本高低太敏感了,有些时候特定的jdk版本会造成插件之间的冲突
- 修改插件感觉就像是站在巨人的肩膀上,不得不说c0ny1师傅的这个插件GUI页面用起来都很舒服
- 学会开发很重要,可以自己进行自定义修改,不做百分百的脚本小子
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验证码识别插件]