burp 日志插件从原理到实践

安全工具 2019-11-09

本文作者:(首次投稿)

Logger++ 是 nccgroup 开源的一个 burp 扩展,主要功能是记录经过 Burp Suite 的所有 HTTP 请求 和 HTTP 响应。

相较于 Burp 自带的 Proxy 组件中的 HTTP History, logger++ 的优势是记录了更完整的流量,并且支持对这些流量进行基于正则表达式的简易分析,对相关流量记录进行着色展示,将流量导入到 elasticsearch 平台等。Burp 基本组件 Proxy 中的 HTTP History 则只记录经过代理的 HTTP 流量,对于 Repeater, Scanner, Intruder 等组件的流量,并不会在它的标签中展示。

对于笔者而言,常用的功能主要有两个:

1、基于正则表达式的简易 HTTP 流量分析

2、记录流量日志 (导出 csv 便于后续代码分析)

代码简要分析

https://github.com/nccgroup/BurpSuiteLoggerPlusPlus/blob/master/src/main/java/burp/BurpExtender.java

从入口 src/main/java/burp/BurpExtender.java 开始看,一开始只是继承 loggerplusplus.LoggerPlusPlus 类。

package burp;
import loggerplusplus.LoggerPlusPlus;

public class BurpExtender extends LoggerPlusPlus{  public static void main(String [] args){    System.out.println("You have built the Logger++. You shall play with the jar file now!");  }}

切换到 src/main/java/loggerplusplus/LoggerPlusPlus.java与记录 HTTP 日志有关的语句是 logManager = new LogManager(loggerPreferences);

    @Override    public void registerExtenderCallbacks(final IBurpExtenderCallbacks callbacks){        //Burp Specific        LoggerPlusPlus.callbacks = callbacks;        LoggerPlusPlus.instance = this;        LoggerPlusPlus.contextMenuFactory = new LoggerContextMenuFactory();
        callbacks.setExtensionName("Logger++");
        filterListeners = new ArrayList<>();        loggerPreferences = new LoggerPreferences(LoggerPlusPlus.this);        logManager = new LogManager(loggerPreferences);        elasticSearchLogger = new ElasticSearchLogger(logManager, loggerPreferences);
        if(!callbacks.isExtensionBapp() && loggerPreferences.checkUpdatesOnStartup()){            MoreHelp.checkForUpdate(false);        }
        buildUI();    }

继续跟踪到 src/main/java/loggerplusplus/LogManager.java

基本思路就是继承和实现 Burp 提供的 IHttpListener 接口 和 IProxyListener 接口,重写 processHttpMessageprocessProxyMessage 方法,存储流经的 HTTP 流量。还有一些对 HTTP 请求/响应 的处理细节可以在 src/main/java/loggerplusplus/LogEntry.java 中的 processRequestprocessResponse 中找到。(其实大部分情况下 Burp 自带的 LoggerPlusPlus.getCallbacks().getHelpers().analyzeRequest(requestResponse) 已经帮我们把需要的字段解析完成了。)

关键代码如下:

    @Override    public void processHttpMessage(final int toolFlag, final boolean messageIsRequest, final IHttpRequestResponse requestResponse) {        // Only process scanner messages which contain the request and response.        if(!messageIsRequest) {            final LogEntry logEntry = new LogEntry();            processHttpMessage(logEntry, toolFlag, requestResponse);        }    }

本文由 信安之路 创作,采用 知识共享署名 3.0,可自由转载、引用,但需署名作者且注明文章出处。

楼主残忍的关闭了评论