自動加解密請求包響應包外掛(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外掛]