BurpSuite神器這些年非常的受大家歡迎,在國慶期間解了下Burp相關開發并寫了這篇筆記。希望和大家分享一下JavaSwing和Burp插件相關開發。第一節僅簡單的了解下API相關,后面會帶著大家利用Netbeans開發我們自己的擴展以及各種有趣的小工具。
第一個問題是我們應該怎么去寫自己的Burp擴展?我們可以找一些現有的擴展學習下,或者參閱官方文檔或者手冊,其次才是google一下是否有相關的教程、文章進行學習。
google搜索:burp suite api,找到官方的API相關說明。
http://portswigger.net/burp/extender/
http://blog.portswigger.net/2012/12/draft-new-extensibility-api.html
You can:
執行和修改 HTTP 請求和響應
訪問運行時的數據,比如:代理日志、目標站map和掃描問題
啟動自己的action,如掃描和網站爬行
自定義掃描檢測和注冊掃描問題
提供自定義Intruder payloads和payload處理
查詢和更新Suite-wide的目標作用域
查詢和更新session處理cookie jar
實現自定義session處理action
添加自定義的標簽(tabs)和上下文菜單項到Burp 用戶界面
可使用自己的界面添加Burp的HTTP消息編輯器
自定義Burp的HTTP消息編輯器處理Burp不支持的數據格式
獲取headers, parameters, cookies分析HTTP請求和響應
讀取或修改Burp配置設置
保存或恢復Burp狀態
API下載地址:http://portswigger.net/burp/extender/api/burp_extender_api.zip
下載API后新建Eclipse項目導入API文件:
不急于動手寫代碼,先看下官方的Demo:
下載第一個HelloWorld解壓它并復制BurpExtender.java到我們的項目當中:
BurpExtender.java:
BurpExtender.java實現了IBurpExtender接口,而IBurpExtender僅定義了一個方法:registerExtenderCallbacks(注冊擴展回調方法):
#!java
public interface IBurpExtender{
/**
* 這個方法將在擴展加載的時候.他將會注冊一個
*<code>IBurpExtenderCallbacks</code> 接口實例,可通過擴展
* 實現各種調用
[email protected]
*<code>IBurpExtenderCallbacks</code>對象.
*/
void registerExtenderCallbacks(IBurpExtenderCallbacks callbacks);
}
在確認代碼無任何錯誤后選中項目并導出為jar,建議安裝一個打jar包的插件:Build Fat Jar這樣你就可以非常方便的把整個項目打成一個jar包了.
如果你和我一樣從來都沒有使用過BurpSuite,那么不妨先打開它把玩幾分鐘。在extender(擴展)標簽當中看到了Burp的插件加載界面。
Add我們剛打好的jar包,加載到Burp擴展中去。
這個時候可以看到我們的插件已經成功運行了,在LoadBurpExtension中的output標簽已經看到了Hello output(stdout.println("Hello output");)
Errors標簽也輸出了Hello errors()stderr.println("Hello errors");
對應的錯誤信息(throw new RuntimeException("Hello exceptions");)。
插件名(callbacks.setExtensionName("Hello world extension");),
以及提醒面板的信息Hello alerts(callbacks.issueAlert("Hello alerts");)。
獲取到Burp混淆后的擴展加載類(自定義類加載器):
如你所想,java加載外部擴展利用了URLClassLoader load外部的jar(對這感興趣的朋友可以看下p2j上的相關文章:http://p2j.cn/?s=URLClassLoader&submit=Search)。
第一個HelloWorld很容易就搞定了,第二個Event listeners的Demo。所謂事件監聽即你可以通過Burp的IBurpExtenderCallbacks去注冊自己的監聽方法。Demo只提供了四種事件(包含HTTP監聽、代理、Scanner、狀態監聽),所有的未列舉的事件直接用Eclipse的快捷鍵提示就出來了:
比如想要添加一個IScopeChangeListener很簡單,讓當前類實現IScopeChangeListener接口,注冊ScopeChange事件(callbacks.registerScopeChangeListener(this);)重寫其scopeChanged方法即可。
設置本地瀏覽器代理后再次訪問任意網站后回到擴展標簽,選中我們的擴展程序可以看到監聽中的請求已輸出。
在編寫擴展的時候一定要注意,你的包里面務必包含一個BurpExtender類可以有多個類實現IBurpExtender。 創建自己的Panel并加到Burp主窗體,AppPanel是我自己寫的一個應用面板。我們可以通過實現ITab 重寫getTabCaption和getUiComponent方法(當然實現IBurpExtender接口是必須的)將我們自己的ui嵌套到Burp當中。getTabCaption即獲取獲取標題,getUiComponent獲取組件這里需要給Burp返回你封裝的組件對象。
我們可以先寫好JPanel再嵌入到Burp當中,這里提供了一個簡單的ApplicationPanel小Demo:http://p2j.cn/?p=1512
#!java
package burp;
import java.awt.Component;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
public class BurpExtender implements IBurpExtender, ITab {
private JPanel jPanel1;
@Override
public void registerExtenderCallbacks(final IBurpExtenderCallbacks callbacks) {
//設置擴展名
callbacks.setExtensionName("應用中心");
//創建我們的窗體
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
//我們的主窗體
jPanel1 = new AppPanel();
//自定義我們的組件
callbacks.customizeUiComponent(jPanel1);
//添加標簽到Burp主窗體
callbacks.addSuiteTab(BurpExtender.this);
}
});
}
@Override
public String getTabCaption() {
return "應用中心";
}
@Override
public Component getUiComponent() {
return jPanel1;
}
}
效果圖: