0x00 前言
一直想找一个burp的验证码识别插件,网上看了好几款,像reCAPTCHA/captcha-killer,要找的不是说验证码识别算法或者库,是一个可以和intruder、验证码识别接口同时对接的插件,可以灵活配置自己需要的验证码识别接口,最终选择了captcha killer
github地址: https://github.com/c0ny1/captcha-killer
他的界面如下,可以配置验证码获取URL和验证码识别接口,都是填充HTTP请求包的方式,就比较灵活
因为使用的验证码识别接口是POST直接提交二进制图片文件的,就如上图配置所示,发现发送一直失败,所以考虑调试下该插件,修修bug。
0x01 burp插件调试环境配置
这边跳过burp插件开发流程,可以参考最后的参考连接,调试其实很简单,先下载插件源码,很多插件使用mvn管理的,这个插件也是。所以制作前先配置好mvn,这里使用的是IDEA说明。
配置前建议先关闭项目,这样确保配置是全局的,方便其他项目
IDEA其实有内置的MVN插件可以直接用,
maven home directory: 因为我本地安装了,所以mvn home就设置本地的了
user settings file: 建议也修改,默认是C盘;还有设置里有设置远端镜像仓库地址,默认使用官方的仓库地址,访问下载包很慢,需要改成国内地址,我改成了阿里云的地址。
local repository: 本地的仓库地址,用来存放下载的项目依赖jar包等,也别放C盘,记得点override。
settings.xml的配置推荐,本地仓库地址也要改一下。
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 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 | <?xml version="1.0" encoding="UTF-8"?> <settings xmlns="http://maven.apache.org/SETTINGS/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd"> <pluginGroups /> <proxies /> <servers /> <!-- maven自动下载的jar包,会存放到该目录下 --> <localRepository>D:/Java/mvn/repository</localRepository> <mirrors> <mirror> <id>alimaven</id> <mirrorOf>central</mirrorOf> <name>aliyun maven</name> <url>http://maven.aliyun.com/nexus/content/repositories/central/</url> </mirror> <mirror> <id>alimaven</id> <name>aliyun maven</name> <url>http://maven.aliyun.com/nexus/content/groups/public/</url> <mirrorOf>central</mirrorOf> </mirror> <mirror> <id>central</id> <name>Maven Repository Switchboard</name> <url>http://repo1.maven.org/maven2/</url> <mirrorOf>central</mirrorOf> </mirror> <mirror> <id>repo2</id> <mirrorOf>central</mirrorOf> <name>Human Readable Name for this Mirror.</name> <url>http://repo2.maven.org/maven2/</url> </mirror> <mirror> <id>ibiblio</id> <mirrorOf>central</mirrorOf> <name>Human Readable Name for this Mirror.</name> <url>http://mirrors.ibiblio.org/pub/mirrors/maven2/</url> </mirror> <mirror> <id>jboss-public-repository-group</id> <mirrorOf>central</mirrorOf> <name>JBoss Public Repository Group</name> <url>http://repository.jboss.org/nexus/content/groups/public</url> </mirror> <mirror> <id>google-maven-central</id> <name>Google Maven Central</name> <url>https://maven-central.storage.googleapis.com </url> <mirrorOf>central</mirrorOf> </mirror> <!-- 中央仓库在中国的镜像 --> <mirror> <id>maven.net.cn</id> <name>oneof the central mirrors in china</name> <url>http://maven.net.cn/content/groups/public/</url> <mirrorOf>central</mirrorOf> </mirror> </mirrors> </settings> |
以上配置好后,就可以打开项目,更新下载项目的依赖包等。IDEA右侧有maven操作界面,第一次需要点击左上角的刷新按钮,重新导入所有依赖包,会根据pom.xml文件下载依赖包。然后按顺序双击clean(清除输出目录)/compile(编译)/package(打包),这样就生成了一个可直接导入burp的插件jar包了。
我在编译的时候遇到报错,是sun.misc.BASE64Encoder包不存在,查了下原来jdk9以后,已经移除这个包,我使用的是jdk13的环境编译的(burpsuite新版本仅支持jdk9-13运行,并且13可以使用tls1.3),所以报错了,这也是之前我为啥测试失败的原因,并且官方在jdk8以后,内置了一个官方库java.util.Base64用于base64编码,所以将部分代码调整下就ok了。
调整完后编译打包,就能用了。
接下来就是要配置调试参数了。
IDEA debug配置添加一个remote,其他参数用默认的即可,需要注意的是第二个红框里的参数是需要在burp运行时额外添加的参数,这样运行burpsuite就会监听5005端口,从而让IDEA可以连接上burp进行调试工作。
还有一点是,启动参数根据jdk版本可能会有所不同,我burp启动用的是jdk13,所以选择第一个。
如下运行burpsuite即可
然后在扩展选项导入插件。
其实burp运行起来的时候,就可以在IDEA里下断点调试了,在IDEA里点击debug
连接上burp
我随便在识别按钮的处理线程里下个断点即可。
0x02 插件使用配置
先讲解下插件的配置方法,了解插件的逻辑,方便后续调试的时候理解
我们需要填写验证码请求接口和验证码识别接口,通过代理模块抓取验证码获取的请求包,然后右键菜单里有个captcha-killer,可以看到发送到两个位置,第一个就是验证码获取框,第二个验证码识别框
点击获取正常后可以看到验证码内容。
接下来接口部分填写,这里还需要添加一个验证码的标签,右键菜单可直接添加,这个标签是用于替换成之前获取到的验证码图片数据,我调用的识别接口是直接发送二进制图片,所以选择"验证码图片二进制内容标签",然后点击"识别"
识别后会将真正发送的请求放在"Requst raw"标签页里,方便查看。
右侧有个匹配方式,用于返回结果的过滤,准确获取验证码识别结果位置,我这无需过滤则没选。
这里还可以将识别接口保存为模板,方便下次直接填写,也有几个内置的模板。
0x03 修复bug
上述base64问题解决后,识别模块可以正常发包了,但是返回的验证码识别结果为空,我抓了包看了下,左侧是识别正常的,右侧是识别不正常的,可以看到BMP图片的标识符都变了,那就是代码里的编码转换有问题,因为是直接发送二进制文件,猜测是字节数组和字符串转换有问题。
在做图片处理的时候,会将图片用base64保存,发送请求的时候才会base64解码,但在LabelParser.java的parseAllLabe方法里,在将base64解码后的字节数组转换成字符串的时候,没设置字符编码,如果没设定则是使用系统默认编码,而图片本身是二进制文件,无直接字符串(如中文等字符串)对应关系,所以通过这种转换会导致图片二进制内容被修改
1 | String b64decode = new String(base64Decode(b64encode)); |
这里需要调整成iso-8859-1编码,这个是单字节编码,不影响图片原始内容。然后将reqTpl标签内容用图片二进制内容替换。
最后在将整个数据包字符串用iso-8859-1编码成字节数组发送即可保证数据无篡改。
最终效果如下,英数识别来识别一些简单验证码还是可以的,这个目标站点测下来没啥问题。
0x04 实战
在之前配置测试完毕的基础上,用户登录请求包发送到intruder里,选中password和validatecode(验证码),attack type选择pitchfork
第一个payload选择正常密码字典即可,第二payload选择扩展模块生成。
对比验证码识别模块的log来看,可检验识别是否准确无误,当然我建议intruder使用单线程,多线程很容易导致目标验证码失效的问题,这个大家测试验证码绕过的时候应该很有心得的。
0x05 参考
burp插件制作讲解 https://xz.aliyun.com/t/7065
jdk1.8后的base64类 https://docs.oracle.com/en/java/javase/13/docs/api/java.base/java/util/Base64.Encoder.html
captcha killer使用案例: http://gv7.me/articles/2019/burp-captcha-killer-usage/