自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Burpsuite插件開發(fā)之RSA加解密

安全 數(shù)據(jù)安全
Burpsuite是一款非常好用的抓包工具,我自己也是重度用戶,所以就上手了burpsuite的插件接口開發(fā),本文主要記錄了一個(gè)解密請(qǐng)求包,插入payload,再加密的插件開發(fā)過程,插件應(yīng)用場(chǎng)景主要是用于通過分析apk的實(shí)現(xiàn)。

burpsuite是一款非常好用的抓包工具,我自己也是重度用戶,所以就上手了burpsuite的插件接口開發(fā),本文主要記錄了一個(gè)解密請(qǐng)求包,插入payload,再加密的插件開發(fā)過程,插件應(yīng)用場(chǎng)景主要是用于通過分析apk的實(shí)現(xiàn)。這里做探討的目的只是方便安全測(cè)試人員的個(gè)人學(xué)習(xí),或大家滲透測(cè)試使用。

詳細(xì)的代碼見github代碼,在文檔中數(shù)據(jù)首先是以rsa方式加密des的key得到encryptKey,然后使用des的key加密數(shù)據(jù)包得到data,再組裝成一個(gè)JSON格式串,這是加密過程,當(dāng)然解密過程就是逆向的。插件應(yīng)用場(chǎng)景主要是用于通過分析apk的實(shí)現(xiàn),或者泄露的密鑰,獲取其加解密算法,在解密后的數(shù)據(jù)包中插入payload,發(fā)現(xiàn)注入問題等。

如下則是加密后的數(shù)據(jù)包:

  1. c={ 
  2.  
  3.  "data":"21BhviedgtbwK6rdlK7vzltqxOLxUmU2g5qaO5LWPYTha5fXslmL6jrMkFnJBwpZPZMNl5foxTUHw2Mae++zkWwtzWkKXI9WJ/CJqxO9uORT5I6iUmIG7bBcgnHpmlSNKfFwBvnr9vj3v5ByvW2s2/pL9rSaeD+/8XsX01NA96mC4g5pVBeU5IY9F4tdxH9yobXfN6GzEVhLeiEd30xzMA\u003d\u003d", 
  4.  
  5.  "encryptKey":"bjWZgigAW/ZaAA55v7Yi9AGt2qsP7BfZZISu70qc/xVUVfh5L/Mw/mMbzxkcZ6uXb1vvgXvF7hHYwjsVzvEkRK0rIfIwkcYzn160fvQ/8+F8YBMDLzTEhf8r0KjOLlJV+HgOsS4QG/G9lOU5mnupfrVA9sf54b3OvXHU0TQVG7U\u003d" 
  6.  
  7.  } 

從數(shù)據(jù)庫包能看到大的數(shù)據(jù)是一個(gè)json格式,里面有data,和encryptKey值,encryptKey就是使用RSA加密des 的key得到的,RSA的工作方式和pem文件可通過界面設(shè)置,再接著用這個(gè)key采用des方式解密data中的內(nèi)容。操作界面如下:

2、InsertPoint 接口

InsertPoint顧名思義就是注入點(diǎn),就是payload插入的地方,比如request中的cookie,參數(shù)等位置。為了對(duì)一些burpsuite不支持的參數(shù)格式進(jìn)行支持就必須實(shí)現(xiàn)該接口,可以用在Active Scanner和Intruder中.

2.1 基礎(chǔ)開發(fā)知識(shí)

最好的方式就是在原有插件的基礎(chǔ)上修改,這樣能省很多精力,當(dāng)然如果要一步一步來的話,步驟如下:

(1)包含burp的接口文件

(2)創(chuàng)建一個(gè)包名為burp,在里面創(chuàng)建BurpExtender類,實(shí)現(xiàn)IBurpExtender接口,這個(gè)BurpExtender類是所有接口的心臟,注意這里涉及到名字都不能改動(dòng),burp插件就這么規(guī)定的。

(3)實(shí)現(xiàn)唯一的接口函數(shù)

  1. public void registerExtenderCallbacks(final IBurpExtenderCallbacks callbacks) { 
  2.  
  3.         this. callbackscallbacks = callbacks ; 
  4.  
  5.        } 

通過callbacks獲取核心基礎(chǔ)庫能力,像日志,請(qǐng)求,返回值修改等。

(4)日志接口

  1. PrintWriter stdout = new PrintWriter(callbacks.getStdout(), true); 
  2.  
  3. PrintWriter stderr = new PrintWriter(callbacks.getStderr(), true); 
  4.  
  5. //輸出到插件的output 
  6.  
  7. stdout.println("Hello output"); 
  8.  
  9. // 輸出到alerts tab 
  10.  
  11. callbacks.issueAlert("Hello alerts"); 
  12.  
  13. //打印調(diào)用棧 
  14.  
  15. e.printStackTrace(stderr) 

有了這些日志接口就能比較好的調(diào)試代碼了,如果要很好的跟蹤請(qǐng)求的,可以在BApp Store中添加”Custom Logger”這個(gè)插件,能夠記錄所有的請(qǐng)求和返回信息。

2.2 getInsertionPoints

下面我們就來講講如何實(shí)現(xiàn)一個(gè)InsertionPoints接口。第一步繼承IScannerInsertionPointProvider接口,實(shí)現(xiàn)getInsertionPoints()方法,同時(shí)通過callbacks.registerScannerInsertionPointProvider(this)方法注冊(cè)成為insertion point provider。下面我們就來看看getInsertionPoints()的實(shí)現(xiàn)。

  1.  @Override  
  2.  public List<IScannerInsertionPoint> getInsertionPoints (IHttpRequestResponse baseRequestResponse) { // 生成insertPoints數(shù)組   
  3.  List<IScannerInsertionPoint> insertionPoints = new ArrayList<IScannerInsertionPoint>(); // 獲取請(qǐng)求參數(shù)  
  4.  IRequestInfo requestInfo = helpers.analyzeRequest(baseRequestResponse.getRequest());   
  5.  List<IParameter> requestParams = requestInfo.getParameters(); 
  6.  
  7.     for (IParameter parameter : requestParams) { 
  8.         String value = parameter.getValue(); 
  9.         value = helpers.urlDecode(value).trim(); 
  10.         EncryptBean encryptBean = new EncryptBean(); 
  11.         if (parameter.getName().trim().equals("c")){//參數(shù)中含有c參數(shù)表示要加密的內(nèi)容 
  12.             encryptBean = JSON.parseObject(value, EncryptBean.class); 
  13.             stdout.println("private key: " + key.privateKey + " public key " + key.publicKey); 
  14.             try { 
  15.                 value = decryptRSAAndDES(key, encryptBean); 
  16.                 stdout.println("after decrypted:Will scan  data at parameter " + parameter + " with value decrypted " + value); 
  17.             } catch (Exception e) { 
  18.                 e.printStackTrace(stderr); 
  19.             } 
  20.             if (value.isEmpty()) continue; 
  21.  
  22.             try { 
  23.                 String basename = parameter.getName(); 
  24.                 //insertionPoints.add(new InsertionPoint(this, baseRequestResponse.getRequest(), basename, value)); 
  25.                 JSONObject jsonObj = JSON.parseObject(value); 
  26.                 String basevalue = ""
  27.                 for(Map.Entry<String, Object> entry: jsonObj.entrySet()){ 
  28.                     basename = entry.getKey(); 
  29.                     basevalue = entry.getValue().toString();                     
  30.                     //在這里傳入總的value值以便在InsertionPoint進(jìn)行分解,構(gòu)造加密后的request請(qǐng)求,構(gòu)造InsertionPoint時(shí)傳入的value為總的value值 
  31.                     insertionPoints.add(0,new InsertionPoint(this, baseRequestResponse.getRequest(), basename, value)); 
  32.                     stdout.println("in for:Will scan AES encrypted data at parameter " + basename + " with value " + value); 
  33.                 } 
  34.             } catch(Exception e) { 
  35.             } 
  36.         } 
  37.     } 
  38.     return insertionPoints; 

這一段代碼的大體意思就是通過helper.analyzeRequest方法獲取所有請(qǐng)求信息,遍歷其中的參數(shù)信息,當(dāng)發(fā)現(xiàn)參數(shù)名等于”c”時(shí)就會(huì)調(diào)用解密過程,這塊的代碼需要根據(jù)參數(shù)格式自定義解析參數(shù)過程。調(diào)用解密的過程大體就是先解析JSON格式,然后解密,得到解密數(shù)據(jù)的內(nèi)容后調(diào)用

  1. `new InsertionPoint(this, baseRequestResponse.getRequest(), basename, value)` 

 實(shí)例化一個(gè)注入點(diǎn)。一般情況下basename和value是一一對(duì)應(yīng)的,如param1=phoneNum,但是這里我們basename傳入param1,value值則是解密后的值如

  1. `{"userid":"51ba27cb-514d-3d86-0000-2f7515a40613","task_id":"1450147269","param1":"000000000000000","m":"https"}`, 

這么傳遞是為了方便實(shí)例化插入點(diǎn)。接著我們看下InsertionPoint的參數(shù)構(gòu)造。

2.3 InsertionPoint

  1. InsertionPoint(BurpExtender newParent, byte[] baseRequest, String basename,  
  2.                 String basevalue) {  
  3.     this.parent = newParentthis.baseRequest = baseRequest; this.baseName = basename;   
  4.     //this.baseValue = basevalue;  
  5.      this.value = basevaluethis.baseValue = JSON.parseObject(basevalue).getString(basename); 

在InsertionPoint的代碼中有一個(gè)很重要的接口就是buildRequest,這個(gè)函數(shù)就是用來添加payload。

  1. @Override 
  2. public byte[] buildRequest(byte[] payload) 
  3.     String payloadPlain = parent.helpers.bytesToString(payload); 
  4.     String payloadEncrypted = ""
  5.     String tmpAESKey = "0123456789abcdef"
  6.     parent.stdout.println("payloadPlain:" + payloadPlain); 
  7.     parent.callbacks.issueAlert("payloadPlain:" + payloadPlain); 
  8.     try { 
  9.         Map<String,String> map = JSON.parseObject(this.value, new TypeReference<Map<String, String>>(){}.getType()); 
  10.         map.put(this.baseName, getBaseValue() + payloadPlain ); 
  11.         String allPayloadPlain = JSON.toJSONString(map); 
  12.         payloadEncrypted = parent.encryptRSAAndDES(allPayloadPlain, tmpAESKey, parent.key); 
  13.     } catch(Exception e) { 
  14.         parent.callbacks.issueAlert(e.toString()); 
  15.     } 
  16.     parent.stdout.println("Inserting " + payloadPlain + " [" + payloadEncrypted + "] in parameter " + baseName); 
  17.     // TODO: Only URL parameters, must change to support POST parameters, cookies, etc. 
  18.     //"c" 解密數(shù)據(jù)格式包一致 
  19.     return parent.helpers.updateParameter(baseRequest, parent.helpers.buildParameter("c", payloadEncrypted, IParameter.PARAM_BODY)); 

這段代碼就是獲取payload,然后嵌入到解密后的請(qǐng)求包,然后將請(qǐng)求加密,最后調(diào)用updateParameter更新參數(shù)信息。在這里要注意parent.helpers.buildParameter("c", payloadEncrypted, IParameter.PARAM_BODY) c是body中的請(qǐng)求參數(shù),和我們的數(shù)據(jù)格式對(duì)應(yīng),IParameter.PARAM_BODY這個(gè)參數(shù)則表明是Body中的請(qǐng)求參數(shù),如果是URl中的則是PARAM_URL

2.4 接口關(guān)系

知道了上述接口的作用,感覺還糊里糊涂的。那就是這些接口是怎么串起來的,數(shù)據(jù)包是如何流動(dòng)的,下面我們來看下active scanning的流程。

ActiveScanner引擎從InsertionPoints Provider獲取Insertion Points,然后調(diào)用BuildRequest發(fā)送Request,Requst再經(jīng)過HttpListener的處理到達(dá)webServer。

責(zé)任編輯:趙寧寧 來源: nsfocus
相關(guān)推薦

2022-01-26 07:25:09

PythonRSA加解密

2020-12-13 09:40:11

物聯(lián)網(wǎng)物聯(lián)網(wǎng)安全加密方法

2011-08-01 14:36:06

加密RSA

2019-10-16 09:01:22

HTTPS RSA解密

2022-11-08 15:14:17

MyBatis插件

2017-12-07 10:25:55

LinuxGPG加密解密

2015-02-11 15:56:20

微信SDK

2009-06-04 20:26:45

2022-07-27 08:49:34

接口加密解密

2024-10-15 10:38:32

2024-09-09 08:53:56

2018-05-09 10:48:58

Android加密密碼學(xué)

2022-09-14 18:23:01

工具加解密接口

2022-12-14 09:06:58

接口Spring解密

2024-09-27 15:24:15

Spring數(shù)據(jù)加解密

2012-12-03 10:59:30

2023-03-30 08:11:52

Spring加解密連接池

2012-01-04 16:21:11

2023-06-20 15:40:58

系統(tǒng)開發(fā)鴻蒙

2015-02-11 15:27:26

微信SDK
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)