自動加解密請求包響應包插件(autoDecoder)
續上之前一個flag:明文傳,明文響應;密文傳,密文響應
0x01 背景
當數據包里都是密文,我們無從下手;就算是獲得了加解密的一些關鍵信息,能解密出來,但是每個數據包我們都需要慢慢解密,請求包需要解密,響應包也需要解密,比較麻煩,所以它——autoDecoder來了。
其實取auto這個名字并不是真正的auto,加解密算法還是需要自己去逆出來的,只是相對于數據包里的密文來說,可以算是半自動。
0x02 優點
- 明文傳,明文響應;密文傳,密文響應,不影響原本通訊包的基礎上,增加一個bp擴展頁面查看明文信息。
- 自定義加解密的接口,當存在復雜數據加密的時候,可以自行編寫python代碼對接口進行加解密, 自定義需要加解密域名,即開即用。
0x03 插件的加解密方式
- 直接通過插件自帶的算法去加解密數據包(較為簡單,僅支持部分AES、DES、DESede加密)。
- 通過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 總結
- 越來越多的小程序、app都使用了加密算法,要想更容易挖到漏洞,對于加解密的知識還是要有所了解的。
- 對于這種加解密的程序,其實也可以用被動漏掃,上游代理解密和下游代理加密,中間穿插被動漏掃,有時間也可以記錄下。
0x06 附錄
https://github.com/f0ng/autoDecoder [Burp插件]

浙公網安備 33010602011771號