vlambda博客
学习文章列表

Log4j2被动扫描Burp插件的编写心得

基础学渗透,领取配套视频

#统统可白嫖#

扫码找小助理白嫖渗透资料Log4j2被动扫描Burp插件的编写心得

学习大佬的思路技巧



一、简介:

本篇文章只用来作为技术分享,请勿将此技术用于违法活动上。不得将以下内容用于商业或者非法用途,否则,一切后果请读者自负。再次声明,仅供学习研究。

前段时间刚爆出来了Log4j2这个史诗级的漏洞,为了方便笔者平时工作的时候的测试,因此萌生了写一个burp插件的想法,来被动检测,减少笔者平时测试的工作量。

开发环境配置:


使用IDEA进行编写,首先新建项目,配置开发环境:


Log4j2被动扫描Burp插件的编写心得


选择Gradle项目点击下一步,然后填写项目名称点击Finish


Log4j2被动扫描Burp插件的编写心得


成之后在build.gradle配置文件中添加几个参数


Log4j2被动扫描Burp插件的编写心得


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将配置加载

Log4j2被动扫描Burp插件的编写心得


还需要在设置中配置打包GUI界面类


Settings>Editor>GUI Designer java source code勾选


Log4j2被动扫描Burp插件的编写心得


Settings>Build>Build Tools>Gradle中将Build and run using选择IDEA编辑器


Log4j2被动扫描Burp插件的编写心得

然后点击ok,环境配置就好了

 

开发环节:

简单的开发思路就是,插件拦截每一个请求,对请求中每一个参数加入指定payload然后单独发送该请求,可以将所有参数一次全部加上payload发送出去,也可以对每一个参数单独加上payload发送出去,并且可以选择监听的模块,可以选择检测的开和关

 

首先新建插件的入口文件:在src/main/java下新建burp文件夹,在burp文件夹下新建BurpExtender类(必须为这个名,burp只会识别此名称的类为入口类)


新建完后实现IBurpExtender接口


Log4j2被动扫描Burp插件的编写心得


然后建立一个GUI界面文件:在src/main/java/burp文件夹下新建一个GUI Form文件,输入GUI文件名点击OK


Log4j2被动扫描Burp插件的编写心得

Log4j2被动扫描Burp插件的编写心得


进入GUI.form文件将Jpanel命一个名


Log4j2被动扫描Burp插件的编写心得


然后将右边的控件按照喜好放到中间的画布上,并给每一个控件命名(GUI的布局放置会有些别扭,适应一下就好了)


然后点击右上角的绿色小锤子,构建GUI界面类,自动在GUI.java内生成GUI的代码


Log4j2被动扫描Burp插件的编写心得

Log4j2被动扫描Burp插件的编写心得


在BurpExtender.java中注册GUI界面,实现ITab接口:


ITab接口有两个方法:


getTabCaption返回GUI标签页的名字,字符串格式。


getUiComponent返回gui类的 $$$getRootComponent$$$ 方法,用于实现GUI界面


Log4j2被动扫描Burp插件的编写心得


然后在gui中通过callbacks.getHelpers()注册一个IExtensionHelpers类型接口,此接口包含许多帮助程序方法,扩展程序可用于辅助Burp扩展程序出现的各种常见任务


new一个GUI类并将call和helpers传入:


Log4j2被动扫描Burp插件的编写心得


设置插件的名称

Log4j2被动扫描Burp插件的编写心得


注册接口:

Log4j2被动扫描Burp插件的编写心得


在output页面打印语句

Log4j2被动扫描Burp插件的编写心得


BurpExtender.java文件代码


Log4j2被动扫描Burp插件的编写心得


在GUI,java中实现IHttpListener接口,用于监听流量


此接口需要实现一个方法processHttpMessage(int toolFlag, boolean messageIsRequest, IHttpRequestResponse messageInfo),所有模块的流量都会流经这个方法


其中toolFlag代表经过的流量是哪个模块的,messageIsRequest代表是请求还是响应,messageInfo为请求或响应的详细信息


先暂时不写这块的代码,先把监听器创建好。

 

在GUI中右键控件,点击Create Listener创建监听器,这里选择第八个 选中监听器


Log4j2被动扫描Burp插件的编写心得

Log4j2被动扫描Burp插件的编写心得

之后会在GUI.java中生成对应监听器的,这里在监听器中设置逻辑:


点击之后判断 payload输入框长度不为0,并且选中模块不等于0,那么使用call.registerHttpListener(GUI.this::processHttpMessage)注册监听器开启监听,否则就将勾选去除并使用call.removeHttpListener(GUI.this::processHttpMessage);将监听器去除


Log4j2被动扫描Burp插件的编写心得


其他的复选框依次创建监听器,并写入对应逻辑:


Log4j2被动扫描Burp插件的编写心得


这里是设置模式的监听器,是单次测试还是递归测试


Log4j2被动扫描Burp插件的编写心得


然后开始编写processHttpMessage内的代码逻辑


首先判断当前流经的流量是否来自指定的模块


Log4j2被动扫描Burp插件的编写心得


然后判断是否为请求


Log4j2被动扫描Burp插件的编写心得


然后下面这一块代码是将请求的URL拼接,并把head头全部提取出来并保存为Map


Log4j2被动扫描Burp插件的编写心得


这个是将head头提取出来的方法:


Log4j2被动扫描Burp插件的编写心得


这块是判断如果选择的是单此测试,则将url中的参数全部提取出来,判断不是空的话则拼接到url中


再次判断请求模式为get还是post,get的话直接调用get的请求方法,post则提取post参数放入请求


Log4j2被动扫描Burp插件的编写心得


这个是提取url参数的方法


Log4j2被动扫描Burp插件的编写心得


这个是提取post参数的方法


这里会区别json和普通的格式


Log4j2被动扫描Burp插件的编写心得


然后判断是递归测试,并为get请求的话,先将url的参数提取出来,并依次遍历,遍历的时候会将当前参数加上payload,其他参数不变拼接上


Log4j2被动扫描Burp插件的编写心得


这边是post请求的话,先将url的参数依次发请求测试了,跟上面一样


Log4j2被动扫描Burp插件的编写心得


然后判断body不为空的话将body的所有参数进行测试


为空的话就判断json不为空的话就对所有参数进行测试


Log4j2被动扫描Burp插件的编写心得


好了就这些,全部代码在https://github.com/F6JO/log4j2_Pscan 可以拉取查看


如果对你有帮助的话,麻烦到github上点个star嘿嘿,谢谢!



@
欢迎关注视频号:“ 掌控安全课堂
分享点那些黑客你不知道的事,每周二也会开直播唠唠嗑!
解决大家在自学上存在的烦恼!
掌控安全课堂
你知道黑客也分中杯,大杯,特大杯吗?#黑客#程序员#网络安全#渗透测试


看到这里了,点个“赞”、“再看”吧