乐于分享
好东西不私藏

10分钟上手BurpSuite插件开发:手把手教学

10分钟上手BurpSuite插件开发:手把手教学

相关文档

  • https://portswigger.net/burp/extender/api/index.html

  • https://www.bilibili.com/s/video/BV1sL411W7Kn

  • BurpSuite 插件开发指南之 API 下篇

  • BurpSuite 插件开发指南之 Java 篇

  • Burp 插件学习笔记

  • https://blog.csdn.net/weixin_39970823/article/details/110185993

语言

支持 Java、Python、Ruby

  • 导入包的写法不同

  • Java 的 callbacks 需要手动指定类型

  • 输出错误方式不同

建议:尽量使用 Java,避免 Python

  • 使用 Java 去开发插件兼容性最高,会少很多莫名其妙的错误

  • 使用原生的 Java 开发的插件要比 Python 开发的插件,加载和执行效率更高

下载 SDK

项目中需要导入官方的 SDK 包,我们可以自行从 burpsuite 中直接导出:

也可以从官网下载对应 jar 文件:

https://mvnrepository.com/artifact/net.portswigger.burp.extender/burp-extender-api/2.3

推荐使用 Maven 方便打包

新建项目

根据需要在 SDK 处选择 Java 版本然后新建一个 Maven 项目

导入 API

https://mvnrepository.com/artifact/net.portswigger.burp.extender/burp-extender-api/2.3

添加到项目的 pom.xml

导入 API 模块:菜单栏 File -> Project Structure -> Modules

<projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>org.example</groupId><artifactId>Hello</artifactId><version>1.0-SNAPSHOT</version><dependencies><!-- https://mvnrepository.com/artifact/net.portswigger.burp.extender/burp-extender-api --><dependency><groupId>net.portswigger.burp.extender</groupId><artifactId>burp-extender-api</artifactId><version>2.3</version></dependency></dependencies><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target></properties></project>

导入成功后会在左侧箭头显示,然后就可以一键编译了

官方的一些例子:https://portswigger.net/burp/extender

把我们从 Burp 中导出的 java 文件放到 main/java 目录下

新建一个 BurpExtender.java 文件

packageburp;importjava.io.PrintWriter;publicclassBurpExtenderimplementsIBurpExtender {@OverridepublicvoidregisterExtenderCallbacks(IBurpExtenderCallbackscallbacks) {// set our extension namecallbacks.setExtensionName("Hello world extension");// obtain our output and error streamsPrintWriterstdout=newPrintWriter(callbacks.getStdout(), true);PrintWriterstderr=newPrintWriter(callbacks.getStderr(), true);// write a message to our output streamstdout.println("Hello output");// write a message to our error streamstderr.println("Hello errors");// write a message to the Burp alerts tabcallbacks.issueAlert("Hello alerts");// throw an exception that will appear in our error streamthrownewRuntimeException("Hello exceptions");    }}

使用 maven 编译后在 BurpSuite 中加载,可以看到正常输出了 Hello output

接口说明

IBurpExtender 接口

public interface IBurpExtender

所有的扩展必须实现此接口,实现的类名必须为 “BurpExtender”。在 burp 包中,必须申明为 public,并且必须提供一个新的默认的构造器。此接口实现了以下方法:

void registerExtenderCallbacks(IBurpExtenderCallbacks callbacks)

此方法将在扩展加载后被调用,它注册了一个 IBurpExtenderCallbacks 接口的实例,IBurpExtenderCallbacks 接口提供了许多在开发插件过程中常用的一些操作。

参数说明:

  • callbacks 是一个 IBurpExtenderCallbacks 对象。

Demo code:

packageburp;publicclassBurpExtenderimplementsIBurpExtender {@OverridepublicvoidregisterExtenderCallbacks(finalIBurpExtenderCallbackscallbacks) {// TODO here    }}

public interface IBurpExtenderCallbacks

此接口中实现的方法和字段在插件开发过程中会经常使用到。Burp Suite 利用此接口向扩展中传递了许多回调方法,这些回调方法可被用于在 Burp 中执行多个操作。当扩展被加载后,Burp 会调用 registerExtenderCallbacks() 方法,并传递一个 IBurpExtenderCallbacks 的实例。扩展插件可以通过这个实例调用很多扩展 Burp 功能必需的方法。如:设置扩展插件的属性,操作 HTTP 请求和响应以及启动其他扫描功能等等。

此接口提供了很多的方法和字段,在此不一一列举,具体的说明可以在 burp SDK 中的 IBurpExtenderCallbacks.java 或 https://portswigger.net/burp/extender/api/burp/IBurpExtenderCallbacks.html 中查看。

Demo code:

packageburp;publicclassBurpExtenderimplementsIBurpExtender {@OverridepublicvoidregisterExtenderCallbacks(finalIBurpExtenderCallbackscallbacks) {callbacks.setExtensionName("Hello"); // 设置扩展名称为 "Hello"    }}

IHttpListener

通过调用 IBurpExtenderCallbacks.registerHttpListener() 注册一个 HTTP 监听器。Burp 里的任何一个工具发起 HTTP 请求或收到 HTTP 响应都会通知此监听器。扩展可以得到这些交互的数据,进行分析和修改。

如果在开发插件的时候需要获取到所有的 HTTP 数据包,包括通过 Repeater 工具自定义修改的请求,则必须实现此接口,重写该方法。

public interface IHttpRequestResponse

此接口用于检索和更新有关 HTTP 消息的详细信息。

注意: setter 方法通常只能在消息被处理之前使用,因为它是一个写操作,因此在只读的上下文中也是不可用的。与响应细节相关的 getter 方法只能用在请求发出后使用。

示例:内网 IP 过滤

我们来实现一个简单的 Burp 插件

BurpExtender.java

packageburp;importjava.io.PrintWriter;importjava.net.URL;importjava.text.SimpleDateFormat;importjava.util.ArrayList;importjava.util.Date;importjava.util.List;// 实现的类名必须为 "BurpExtender"publicclassBurpExtenderimplementsIBurpExtenderIHttpListener {// 当扩展被加载后,Burp 会调用 registerExtenderCallbacks() 方法,并传递一个 IBurpExtenderCallbacks 的实例privateIBurpExtenderCallbackscallbacks;privateIExtensionHelpershelpers// 通过调用 IBurpExtenderCallbacks.getHelpers 获得此接口的实例privatePrintWriterstdout;privateStringExtensionName="Private IP Scan";privateList<URL>urlList=newArrayList<>(); // 已发现漏洞的地址(确保不重复输出)publicvoidregisterExtenderCallbacks(IBurpExtenderCallbackscallbacks) {this.callbacks=callbacks;callbacks.setExtensionName(ExtensionName); // 插件名称helpers=callbacks.getHelpers();stdout=newPrintWriter(callbacks.getStdout(), true);StringsuccessOutputData="[+] Version: 0.1\n";successOutputData+="Private IP Scan\n";successOutputData+="Description: Private address leak scanning plugin, the result is in the Extender plugin output interface\n";successOutputData+="----------------------------------------\n";stdout.println(successOutputData);callbacks.registerHttpListener(this);    }// 处理所有 HTTP 数据@OverridepublicvoidprocessHttpMessage(inttoolFlagbooleanmessageIsRequestIHttpRequestResponsemessageInfo) {// 只关注响应包if (!messageIsRequest) {IResponseInfoanalyzedResponse=helpers.analyzeResponse(messageInfo.getResponse()); // getResponse 获得的是字节序列Stringresp=newString(messageInfo.getResponse());intbodyOffset=analyzedResponse.getBodyOffset();Stringbody=resp.substring(bodyOffset);List<String>intranetIpList=FindIntranetIp.getIntranetIps(body);// 获取漏洞 URLURLurl;try {url=helpers.analyzeRequest(messageInfo).getUrl();            } catch (UnsupportedOperationExceptione) {url=null;            }// 获取时间Dateday=newDate();SimpleDateFormatdf=newSimpleDateFormat("HH:mm:ss");if (intranetIpList.size() >0) {// 判断是否已经存在该 URL,不存在则输出并添加if (!urlList.contains(url)) {stdout.println("[Private IP] - ["+df.format(day+"] - "+url+" - "+intranetIpList);urlList.add(url);                }            }        }    }}

FindIntranetIp.java

packageburp;importjava.util.ArrayList;importjava.util.List;importjava.util.regex.Matcher;importjava.util.regex.Pattern;publicclassFindIntranetIp {/*** 正则匹配IP地址列表中的内网地址* @param data* @return intranetIpList*/publicstaticList<String>getIntranetIps(Stringdata) {List<String>ipList=getIps(data);List<String>ipFilter=newArrayList<String>();List<String>intranetIpList=newArrayList<String>();// A类地址范围:10.0.0.0—10.255.255.255ipFilter.add("^10\\.(1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|[0-9])\\.(1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|[0-9])\\.(1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|[0-9])$");// B类地址范围: 172.16.0.0---172.31.255.255ipFilter.add("^172\\.(1[6789]|2[0-9]|3[01])\\.(1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|[0-9])\\.(1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|[0-9])$");// C类地址范围: 192.168.0.0---192.168.255.255ipFilter.add("^192\\.168\\.(1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|[0-9])\\.(1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|[0-9])$");// ipFilter.add("127.0.0.1");// ipFilter.add("0.0.0.0");// 正则编译类型列表,将 ipFilter 中表达式编译为正则表达式List<Pattern>ipFilterRegexList=newArrayList<>();// 循环读取并编译存储for (Stringtmp : ipFilter) {ipFilterRegexList.add(Pattern.compile(tmp));        }// 正则匹配内网地址for (Stringip : ipList) {for (Patterntmp : ipFilterRegexList) {Matchermatcher=tmp.matcher(ip);if (matcher.find()) {intranetIpList.add(ip);break;                }            }        }returnintranetIpList;    }/*** 正则匹配 String 中的 IP 地址* @param data* @return ipList*/privatestaticList<String>getIps(Stringdata) {StringregEx="((2[0-4]\\d|25[0-5]|[01]?\\d\\d?)\\.){3}(2[0-4]\\d|25[0-5]|[01]?\\d\\d?)";List<String>ipList=newArrayList<String>();// 创建正则对象Patternp=Pattern.compile(regEx);Matcherm=p.matcher(data);// 循环匹配 IP 地址while (m.find()) {Stringresult=m.group();ipList.add(result);        }returnipList;    }}

实际效果:

本站文章均为手工撰写未经允许谢绝转载:夜雨聆风 » 10分钟上手BurpSuite插件开发:手把手教学

评论 抢沙发

3 + 2 =
  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
×
订阅图标按钮