【技術分享】Burpsuite插件改造計劃
前言
之前逛GitHub的時候看到一個老同事寫的一個插件,于是就多喵了兩眼,然后發現其實這個插件還是很實用的!于是就安裝使用了!簡而言之該插件就是利用正則來從數據包中匹配,如果匹配到了規則則高亮顯示!該插件也支持規則導入導出,綜合來講在實戰中就非常有用的!比如去年大殺四方的shiro反序列化,它的數據包的特征就非常明顯即:響應數據包字段中rememberMe=deleteMe,我們只需要寫個正則,然后就可以自動化對數據包做反序列化無損化檢測了!該插件的官方GitHub地址:https://github.com/gh0stkey/HaE,使用效果如下圖所示

但是我在使用的過程中遇到一個很嚴重的問題:如果規則比較多的話,顏色就會重疊,而且我們也不能直觀地看到到底匹配的什么規則!于是我就修改了一下源碼將其改造成了我想要的樣子!下面則是記錄了我是如何從burpsuite的hello world開始到改造插件的過程!本文使用的所有代碼址:https://github.com/ba1ma0/burpsuite_extension

入門
老規矩我們先從helloworld走起,官方已經給出了教程:https://portswigger.net/burp/extender/writing-your-first-burp-suite-extension

官方的教程我總結一下可以分為三步:
從burpsuite中導出api文件。創建Java項目。導出Java代碼的jar包安裝運行。
下面就針對這三點我我介紹一下以便讀者可以跟著這個自己寫出helloworld,然后再改造插件,讓其成為我們想要的樣子。
第一步從burpsuite中導出API文件
第一步打開burpsuite,從Extender->APIS->SaveInterface到一個本地的文件件中

第二步創建Java項目
創建Java項目的時候注意以下兩點:
創建一個burp文件夾用于存放上一步導出的API文件。在Burp文件夾中創建名為BurpExtender.java文件
創建之后我們在BurpExtender.java中寫幾句簡單的代碼即可,如下圖所示

第三步導出jar包運行
代碼寫完之后,我們需要將我們寫的Java導出為jar包,這樣方便我們在burpsuite上安裝運行.接下來我用的是IntelliJ IDEA Community版本作為演示.首先第一步打開File->Project Structure->Project Settings->Artifacts->JAR->From modules with dependencies...,如下圖所示


第二步選擇Module為burp,并且Main class地方為空即可

第三步首先Build->Build project

接著Build->Build Artifacts…->burp:jar->Build輸出插件的jar包如下圖所示


最后安裝并運行burpsuite插件運行成功,至此我們的入門階段完成了!接下來就開始進階部分:如何改造別人的插件讓其成為我們想要的樣子!

進階
首先我們在腦海中要有一個概念,我們想要的效果是將顏色和對應的正則描述name全部在burpsuite中顯現出來!而且此時正則和顏色是一一對應的,也就說我們如果能搞清楚顏色color生成邏輯,大概率也是能夠按照相同規律生成對應的正則描述name,并且將其顯示出來的!所以第一步我們就先在代碼中全局搜索一下color如下圖所示,還記得入門部分我們提到的BurpExtender.java嗎?該文件是插件的入口文件,可以將功能類同于main函數!我們要搞懂color的生成邏輯,最開始的要從這個入口文件中查起!

進入該入口文件之后,我發現color第一被使用出現在114行,被函messageInfo.setHighlight(color) 直接處理
那我們就直接跟進該函數進去看看,而進去之后發現了一個意外之喜.為什么這么說呢?文章前面說過,我們需要將顏色和正則描述全部顯示出來,而burpsuite展示界面唯一一個讓用戶修改的列是comment,我們在IHttpRequestResponse.java直接看到了官方已經將修改comment的接口setComment(String comment)定義好了,那么我們只需要調用即可!


那接下來我們就只需要了解color的生成以及調用邏輯,然后按照相同的邏輯同時生成對應的name即可,最后再調用setComment(String comment)就能實現我們想要的結果!接下來我捋了一下所有跟color有關的變量并且最終定位到了最原始的變量obj如下圖所示

變量obj又誕生于ec.matchRegex中,那我們繼續跟進進入ExtractContent.java,進入之后我們發現這里就是最原始的color產生的地方,且color被存放在一個map中,obj其實就是存放color的map,所以要想要想實現color和name一一對應地展示出來,只要在此處將name和color對應關系一起保存在map中返回即可,原作者這里其實是沒有將這個name一起返回的,我們在這里添加幾行代碼將其返回即可如下圖所示
了解了obj的產生過程,接下來我們看一下他是怎么被調用的,處理obj的是da.highlight,所以直接跟進去看一下實現邏輯!進去之后發現他的實現邏輯其實很簡單,就是從obj中取出colo!color和name其實是一一對應的,所以我就按照相同的邏輯,寫了跟原作者一模一樣的函數將color和name按照name:color 的形式一起返回來如下所示

colorList和commentList是在相同的時間和相同的地方一起產生的!那我們按照相同的順序從他們中取出和color和name此時兩個變量也肯定是一一對應的!取出兩個變量之后我們再調用burpsuite官方提供的修改color和comment的兩個接口就能實現我們想要的結果!

一切修改完之后按照上面導出jar的流程直接導出jar運行,最終實現我們想要的結果

后言
通過這次修改代碼,我發現良好的代碼規范真的很重要,尤其是這種協同的開源項目!原作者的代碼非常規范,所以當我我在調試,追蹤的時候就很舒服!本文作者能力有限,文章若有紕漏請讀者不吝賜教!