戟星安全实验室

忆享科技旗下高端的网络安全攻防服务团队。安服内容包括渗透测试、代码审计、应急响应、漏洞研究、威胁情报、安全运维、攻防演练等。

本文约4500字,阅读约需12分钟。

0x00  前言

扩展burp功能的程序,依赖burp提供的API,让使用者可以开发一些自己想要的功能。

0x01  api文档

https://gitee.com/stemmm/burp-api-drops#burp-api-drops

0x02  burp插件hello world

下载开发模板,导入到idea中

或者新建maven项目,导入maven依赖也可以。(建议)

导入依赖

开始写代码:

新建一个burp的包

写个BurpExtender类,一定要放在burp包下


package burp;import java.io.PrintWriter;public class BurpExtender implements IBurpExtender{private IBurpExtenderCallbackscallbacks; //声明回调对象private IExtensionHelpershelpers;  //辅助类,小工具箱,各种类型的转换等private PrintWriter stdout;  //用来输出流需要@Overridepublic voidregisterExtenderCallbacks(IBurpExtenderCallbacks callbacks) {this.callbacks=callbacks;this.helpers =callbacks.getHelpers(); //通过回调获取辅助对象this.stdout = newPrintWriter(callbacks.getStdout(),true); //输出流callbacks.setExtensionName("burp_hello"); //给插件命名stdout.println("burptest !!!"); //输出内容}
}

点击maven的package,打包项目成jar包

Jar包在target目录下

打成jar包后,到入burp之后会自动调用burp包中的BurpExtender类中的类的registerExtenderCallbacks方法

导入burp后,就成功了。第一个burp插件完成。

0x03      HTTP数据包的处理

主要是processHttpMessage这个函数。

callbacks.registerHttpListener(this);//如果没有注册,下面的processHttpMessage方法是不会生效的。处理请求和响应包的插件,这个应该是必要的

1.    获取请求包中的数据例子

 @Overridepublic void processHttpMessage(int toolFlag,boolean messageIsRequest,IHttpRequestResponse messageInfo){if (toolFlag == IBurpExtenderCallbacks.TOOL_PROXY){//不同的toolFlag代表了不同的burp组件 https://portswigger.net/burp/extender/api/constant-values.html#burp.IBurpExtenderCallbacksif (messageIsRequest){ //对请求包进行处理IRequestInfo analyzeRequest = helpers.analyzeRequest(messageInfo);//对消息体进行解析,messageInfo是整个HTTP请求和响应消息体的总和,各种HTTP相关信息的获取都来自于它,HTTP流量的修改都是围绕它进行的。/*****************获取参数**********************/List<IParameter> paraList = analyzeRequest.getParameters();//获取参数的方法//当body是json格式的时候,这个方法也可以正常获取到键值对;但是PARAM_JSON等格式不能通过updateParameter方法来更新。//如果在url中的参数的值是 key=json格式的字符串 这种形式的时候,getParameters应该是无法获取到最底层的键值对的。for (IParameter para : paraList){// 循环获取参数,判断类型,进行加密处理后,再构造新的参数,合并到新的请求包中。String key = para.getName(); //获取参数的名称String value = para.getValue(); //获取参数的值int type = para.getType();stdout.println("参数 key value type: "+key+" "+value+" "+type);}}

效果

2.更新和删除数据等其他操作。

  /*****************修改并更新参数**********************/IParameter newPara = helpers.buildParameter("testKey", "testValue", IParameter.PARAM_BODY); //构造新的参数byte[] new_Request = messageInfo.getRequest();new_Request = helpers.updateParameter(new_Request, newPara); //构造新的请求包messageInfo.setRequest(new_Request);//设置最终新的请求包/*****************删除参数**********************/for (IParameter para : paraList){// 循环获取参数,判断类型,进行加密处理后,再构造新的参数,合并到新的请求包中。String key = para.getName(); //获取参数的名称if (key.equals("aaa")) {new_Request = helpers.removeParameter(new_Request, para); //构造新的请求包}}/*****************获取header**********************/List<String> headers = analyzeRequest.getHeaders();for (String header : headers){// 循环获取参数,判断类型,进行加密处理后,再构造新的参数,合并到新的请求包中。stdout.println("header "+header);if (header.startsWith("referer")) {/*****************删除header**********************/headers.remove(header);}}/*****************新增header**********************/headers.add("myheader: balalbala");/*****************获取body 方法一**********************/int bodyOffset = analyzeRequest.getBodyOffset();byte[] byte_Request = messageInfo.getRequest();String request = new String(byte_Request); //byte[] to StringString body = request.substring(bodyOffset);byte[] byte_body = body.getBytes();  //String to byte[]/*****************获取body 方法二**********************/int len = byte_Request.length;byte[] byte_body1 = Arrays.copyOfRange(byte_Request, bodyOffset, len);new_Request = helpers.buildHttpMessage(headers, byte_body);//如果修改了header或者数修改了body,不能通过updateParameter,使用这个方法。messageInfo.setRequest(new_Request);//设置最终新的请求包}}else{//处理响应包IResponseInfo analyzedResponse = helpers.analyzeResponse(messageInfo.getResponse()); //getResponse获得的是字节序列short statusCode = analyzedResponse.getStatusCode();List<String> headers = analyzedResponse.getHeaders();String resp = new String(messageInfo.getResponse());int bodyOffset = analyzedResponse.getBodyOffset();//响应包是没有参数的概念的,大多需要修改的内容都在body中String body = resp.substring(bodyOffset);if (statusCode==200){String newBody= body+"&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&";byte[] bodybyte = newBody.getBytes();messageInfo.setResponse(helpers.buildHttpMessage(headers, bodybyte));}}}
}
for (IParameter para : paraList){// 循环获取参数,判断类型,进行加密处理后,再构造新的参数,合并到新的请求包中。String key = para.getName(); //获取参数的名称String value = para.getValue(); //获取参数的值int type = para.getType();stdout.println("参数 key value type: "+key+" "+value+" "+type);}

para.getType()

0代表的是URL。

1代表的是Body处的。

END

忆享科技戟星安全实验室|从零开始Burpsuite 插件开发相关推荐

  1. 忆享科技戟星安全实验室|内网隧道技术,你知道几个?

    戟星安全实验室 忆享科技旗下高端的网络安全攻防服务团队.安服内容包括渗透测试.代码审计.应急响应.漏洞研究.威胁情报.安全运维.攻防演练等 本文约6000字,阅读约需15分钟. 0x00 前言 在实际 ...

  2. 忆享科技戟星安全实验室|互联网资产搜集平台大全

    戟星安全实验室 忆享科技旗下高端的网络安全攻防服务团队.安服内容包括渗透测试.代码审计.应急响应.漏洞研究.威胁情报.安全运维.攻防演练等 本文约4517字,41图,阅读约需12分钟. 前言 想着对资 ...

  3. 忆享科技戟星安全实验室|内网渗透神器-Viper的基本使用

    戟星安全实验室 忆享科技旗下高端的网络安全攻防服务团队.安服内容包括渗透测试.代码审计.应急响应.漏洞研究.威胁情报.安全运维.攻防演练等 本文约1200字,阅读约需4分钟. 0x00 介绍 vipe ...

  4. 忆享科技戟星安全实验室|五分钟学会挖矿病毒的应急响应

    戟星安全实验室 忆享科技旗下高端的网络安全攻防服务团队.安服内容包括渗透测试.代码审计.应急响应.漏洞研究.威胁情报.安全运维.攻防演练等 本文约1790字,阅读约需5分钟. 0x00 前言 随着虚拟 ...

  5. 忆享科技受邀亮相CIS2022网络安全创新大会

    12月14日,忆享科技受邀亮相第八届网络安全创新大会(简称"CIS")多维时空专场,与行业内资深专家及众多头部企业交流对话,深度了解网络安全行业新理念.新技术.新思路和新实践,共同 ...

  6. 忆享科技聚焦|数字经济、视频云、AI数字人、全球5G用户……行业热点资讯一览

    忆享聚焦"栏目第六期来啦! 本栏目汇集近期互联网最新资讯,聚焦前沿科技,关注行业发展动态,筛选高质量讯息,拓宽用户视野,让您以最低的时间成本获取最有价值的行业资讯. 目录 行业资讯 1.我国 ...

  7. 忆享科技:从产业初布局到品牌新升级的企业蜕变

    成都忆享科技有限公司(www.weops.com)成立于2015年,是一家智能信息化综合解决方案服务供应商,业务范围包括云化IT服务.云计算升级服务.互联网平台应用设计.软件服务外包(ITO).微信及 ...

  8. 忆享科技聚焦|数字中国发展报告、政务云市场规模、网络安全、中小企业数字化……近期热点资讯一览

    忆享科技 "忆享聚焦"栏目第七期来啦!本栏目汇集近期互联网最新资讯,聚焦前沿科技,关注行业发展动态,筛选高质量讯息,拓宽用户视野,让您以最低的时间成本获取最有价值的行业资讯. 目录 ...

  9. 忆享科技聚焦|数字经济、网络安全、5.5G、数字火炬手……热点资讯一览

    "忆享聚焦"栏目第十期来啦!本栏目汇集近期互联网最新资讯,聚焦前沿科技,关注行业发展动态,筛选高质量讯息,拓宽用户视野,让您以最低的时间成本获取最有价值的行业资讯. 目录 行业资讯 ...

最新文章

  1. Windows和Linux下通用的线程接口
  2. esxi ntp服务器地址_NTP的工作原理以及工作模式
  3. Java异常之异常机制
  4. java char 指针数组_双指针之对撞指针,Java
  5. MFC改变对话框背景图片实例
  6. java formfile_基于Struts文件上传(FormFile)详解
  7. 关于C生成的汇编与C++生成的汇编在函数名称上的差异
  8. java 查看虚拟机状态_深入理解java虚拟机学习笔记(四)虚拟机性能监控与故障处理工具...
  9. 0 基础转行 Android 工程师是种怎样的体验?
  10. linux 隐藏字符 h,webpack手动配置
  11. NYOJ题目71-独木舟上的旅行(贪心)
  12. 内存超频时序怎么调_超频讲解:内存时序设置说明二
  13. MFC简易RTF编辑器
  14. 阿里云云盘扩容数据盘_Linux
  15. 先进制造技术论文_轴承先进锻造工艺及制造技术
  16. 以YOLOv5为基准实现布匹缺陷检测(Fabric Defect Detection)
  17. 高考首日,为梦想加油!
  18. 程序员怎么提高英语阅读水平?
  19. Navicat for MySQL 11注册码
  20. 文津读书沙龙:吴军杨早数学之美-文明之光

热门文章

  1. python培训班排行榜-济南十大python编程培训机构排行榜
  2. 点阵图、矢量图、像素图、位图图像、位元块传输
  3. 成功解决AttributeError: module ‘numpy‘ has no attribute ‘polyld‘
  4. 神经网络中卷积层的堆叠
  5. 算法刷题|392.判断子序列、115.不同的子序列
  6. php扩展库EOS,EOS区块链PHP开发包 —— EosTool
  7. CART回归树模型树 生成 剪枝 in Python
  8. 企业信息化建设的方方面面
  9. 网易云信短信验证php,网易云 短信验证码+验证+tp5
  10. 【笑话:】执子之手,方知子丑,泪流满面,子不走我走。爆笑死你我不负责~~~~[