1. 程式人生 > 其它 >自動加解密請求包響應包外掛(autoDecoder)

自動加解密請求包響應包外掛(autoDecoder)

續上之前一個flag:明文傳,明文響應;密文傳,密文響應

0x01 背景

當資料包裡都是密文,我們無從下手;就算是獲得了加解密的一些關鍵資訊,能解密出來,但是每個資料包我們都需要慢慢解密,請求包需要解密,響應包也需要解密,比較麻煩,所以它——autoDecoder來了。

其實取auto這個名字並不是真正的auto,加解密演算法還是需要自己去逆出來的,只是相對於資料包裡的密文來說,可以算是半自動。

0x02 優點

  1. 明文傳,明文響應;密文傳,密文響應,不影響原本通訊包的基礎上,增加一個bp擴充套件頁面檢視明文資訊。
  2. 自定義加解密的介面,當存在複雜資料加密的時候,可以自行編寫python程式碼對介面進行加解密, 自定義需要加解密域名,即開即用。

0x03 外掛的加解密方式

  1. 直接通過外掛自帶的演算法去加解密資料包(較為簡單,僅支援部分AES、DES、DESede加密)。
  2. 通過python的flask介面去編寫加解密資料包的api(不一定是flask框架,也可以起其他框架,只需要介面地址正確且加解密流程正確即可)。
具體來說說加解密的方式
  • 自帶演算法進行加解密

支援較為簡單的AES/CBC/PKCSPadding、AES/ECB/PKCSPadding等簡單加解密方法,適合請求包或者響應包全部為加密的內容傳參,如下文舉例中的《使用自帶演算法進行加解密》章節。

  • 自定義介面進行加解密

自定義加解密的內容,預設傳入的引數是整個請求體(request body)與整個響應體(response body),支援複雜的加解密演算法,當然,這些都需要自行去寫程式碼解密了。

0x04 舉例

這裡主要考慮到很多app、小程式的請求是多個的,上一個請求獲取到的響應包會進行自動解密並且獲取裡面的引數,而獲取到的引數中有下一個請求包的引數,如果將密文直接替換為明文進行回顯,那麼程式可能在第二個資料包請求就會報錯。

所以為了解決上面的問題,增加了一個擴充套件頁面檢視明文,而當burp裡指定域名的請求包是明文,那麼響應包會自動響應明文。

為了方便理解,以testsql.php這個測試檔案舉例,testsql.php是一個以DES加密請求包和響應包的測試頁面,存在SQL注入漏洞。

{"id":"2"}舉例,加密後的密文為Gh9+wH+QSIkOwCj/QK/Kiw==

使用自帶演算法進行加解密

外掛配置如下:

原始請求如下

點選autoDecoder

再次點選Send按鈕進行請求,響應包自動解密

也可以直接拿sqlmap進行測試,為做對比,先關閉外掛的加解密

直接明文進行sqlmap跑注入,代理到proxy,增加命令 --proxy=http://127.0.0.1:8080

資料包如下:

burp裡sqlmap的第一個請求資料包如下:

跑不出來注入(沒有啟動外掛,傳參是明文,所以無回顯)

sqlmap結果

開啟外掛:

再次使用sqlmap,代理到proxy,增加命令 --proxy=http://127.0.0.1:8080

burp裡sqlmap的第一個請求(啟動了外掛,傳參是明文,會自動加密,所以有回顯)

sqlmap結果

注入成功跑出

使用自定義介面進行加解密

python程式碼如下:

# -*- coding:utf-8 -*-
# author:f0ngf0ng

from flask import Flask,Response,request
from pyDes import *
import base64

def des_encrypt(s):
    """
    DES 加密
    :param s: 原始字串
    :return: 加密後字串,16進位制
    """
    secret_key = "f0ngtest"
    iv = "f0ngf0ng"
    k = des(secret_key, CBC, iv, pad=None, padmode=PAD_PKCS5)
    en = k.encrypt(s, padmode=PAD_PKCS5)
    return base64.encodebytes(en).decode()

def des_decrypt(s):
    """
    DES 解密
    :param s: 加密後的字串,16進位制
    :return:  解密後的字串
    """
    secret_key = "f0ngtest"
    iv = "f0ngf0ng"
    k = des(secret_key, CBC, iv, pad=None, padmode=PAD_PKCS5)
    de = k.decrypt(base64.decodebytes(bytes(s,encoding="utf-8")), padmode=PAD_PKCS5)
    return de.decode()

app = Flask(__name__)

@app.route('/encode',methods=["POST"])
def encrypt():
    param = request.form.get('data')  # 獲取  post 引數
    encry_param = des_encrypt(param.strip("\n"))
    print(param)
    print(encry_param)
    return encry_param

@app.route('/decode',methods=["POST"])
def decrypt():
    param = request.form.get('data')  # 獲取  post 引數
    decrypt_param = des_decrypt(param.strip("\n"))
    print(param)
    print(decrypt_param)
    return decrypt_param

if __name__ == '__main__':
    app.debug = True # 設定除錯模式,生產模式的時候要關掉debug
    app.run(host="0.0.0.0",port="8888")

外掛配置如下:

原始請求如下:

點選autoDecoder

再次請求

sqlmap使用也是一樣的,代理到burp即可,這裡不再贅述

實戰環境中

APP1

APP2

0x05 總結

  1. 越來越多的小程式、app都使用了加密演算法,要想更容易挖到漏洞,對於加解密的知識還是要有所瞭解的。
  2. 對於這種加解密的程式,其實也可以用被動漏掃,上游代理解密和下游代理加密,中間穿插被動漏掃,有時間也可以記錄下。

0x06 附錄

https://github.com/f0ng/autoDecoder [Burp外掛]

https://mp.weixin.qq.com/s/_7wSWy0gIMMZmVeOtFgdsw [某APP測試]