Log4j2被动扫描Burp插件的编写心得
基础学渗透,领取配套视频
#统统可白嫖#
扫码找小助理白嫖渗透资料
学习大佬的思路技巧
本篇文章只用来作为技术分享,请勿将此技术用于违法活动上。不得将以下内容用于商业或者非法用途,否则,一切后果请读者自负。再次声明,仅供学习研究。
前段时间刚爆出来了Log4j2这个史诗级的漏洞,为了方便笔者平时工作的时候的测试,因此萌生了写一个burp插件的想法,来被动检测,减少笔者平时测试的工作量。
开发环境配置:
使用IDEA进行编写,首先新建项目,配置开发环境:
选择Gradle项目点击下一步,然后填写项目名称点击Finish
成之后在build.gradle配置文件中添加几个参数
在dependencies内添加:
## 从远程仓库加载burpsuite的API
compile('net.portswigger.burp.extender:burp-extender-api:1.7.13')
## 添加GUI界面的打包类,可以让IDEA打包GUI界面
compile('com.intellij:forms_rt:7.0.3')
在plugins内添加:
## 添加shadow插件,可以很方便的把项目打包为jar文件
id 'com.github.johnrengelman.shadow' version '5.2.0'
然后点击右下角的Import Changes将配置加载
还需要在设置中配置打包GUI界面类
Settings>Editor>GUI Designer 将java source code勾选
Settings>Build>Build Tools>Gradle中将Build and run using选择IDEA编辑器
然后点击ok,环境配置就好了
开发环节:
简单的开发思路就是,插件拦截每一个请求,对请求中每一个参数加入指定payload然后单独发送该请求,可以将所有参数一次全部加上payload发送出去,也可以对每一个参数单独加上payload发送出去,并且可以选择监听的模块,可以选择检测的开和关
首先新建插件的入口文件:在src/main/java下新建burp文件夹,在burp文件夹下新建BurpExtender类(必须为这个名,burp只会识别此名称的类为入口类)
新建完后实现IBurpExtender接口
然后建立一个GUI界面文件:在src/main/java/burp文件夹下新建一个GUI Form文件,输入GUI文件名点击OK
进入GUI.form文件将Jpanel命一个名
然后将右边的控件按照喜好放到中间的画布上,并给每一个控件命名(GUI的布局放置会有些别扭,适应一下就好了)
然后点击右上角的绿色小锤子,构建GUI界面类,自动在GUI.java内生成GUI的代码
在BurpExtender.java中注册GUI界面,实现ITab接口:
ITab接口有两个方法:
getTabCaption返回GUI标签页的名字,字符串格式。
getUiComponent返回gui类的 $$$getRootComponent$$$ 方法,用于实现GUI界面
然后在gui中通过callbacks.getHelpers()注册一个IExtensionHelpers类型接口,此接口包含许多帮助程序方法,扩展程序可用于辅助Burp扩展程序出现的各种常见任务
new一个GUI类并将call和helpers传入:
设置插件的名称:
注册接口:
在output页面打印语句
BurpExtender.java文件代码
在GUI,java中实现IHttpListener接口,用于监听流量
此接口需要实现一个方法processHttpMessage(int toolFlag, boolean messageIsRequest, IHttpRequestResponse messageInfo),所有模块的流量都会流经这个方法
其中toolFlag代表经过的流量是哪个模块的,messageIsRequest代表是请求还是响应,messageInfo为请求或响应的详细信息
先暂时不写这块的代码,先把监听器创建好。
在GUI中右键控件,点击Create Listener创建监听器,这里选择第八个 选中监听器
之后会在GUI.java中生成对应监听器的,这里在监听器中设置逻辑:
点击之后判断 payload输入框长度不为0,并且选中模块不等于0,那么使用call.registerHttpListener(GUI.this::processHttpMessage)注册监听器开启监听,否则就将勾选去除并使用call.removeHttpListener(GUI.this::processHttpMessage);将监听器去除
其他的复选框依次创建监听器,并写入对应逻辑:
这里是设置模式的监听器,是单次测试还是递归测试
然后开始编写processHttpMessage内的代码逻辑
首先判断当前流经的流量是否来自指定的模块
然后判断是否为请求
然后下面这一块代码是将请求的URL拼接,并把head头全部提取出来并保存为Map
这个是将head头提取出来的方法:
这块是判断如果选择的是单此测试,则将url中的参数全部提取出来,判断不是空的话则拼接到url中
再次判断请求模式为get还是post,get的话直接调用get的请求方法,post则提取post参数放入请求
这个是提取url参数的方法
这个是提取post参数的方法
这里会区别json和普通的格式
然后判断是递归测试,并为get请求的话,先将url的参数提取出来,并依次遍历,遍历的时候会将当前参数加上payload,其他参数不变拼接上
这边是post请求的话,先将url的参数依次发请求测试了,跟上面一样
然后判断body不为空的话将body的所有参数进行测试
为空的话就判断json不为空的话就对所有参数进行测试
好了就这些,全部代码在https://github.com/F6JO/log4j2_Pscan 可以拉取查看
如果对你有帮助的话,麻烦到github上点个star嘿嘿,谢谢!
看到这里了,点个“赞”、“再看”吧