本文作者:鶇(首次投稿)
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 接口,重写 processHttpMessage
和 processProxyMessage
方法,存储流经的 HTTP 流量。还有一些对 HTTP 请求/响应 的处理细节可以在 src/main/java/loggerplusplus/LogEntry.java
中的 processRequest
和 processResponse
中找到。(其实大部分情况下 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); } }
楼主残忍的关闭了评论