banner
lca

lca

真正的不自由,是在自己的心中设下牢笼。

記一次autodecode aes解密滲透實戰

最近測試了好幾個站點,開局一個登錄框,抓包後用戶名和密碼加密了,格式如下:

Pasted image 20241129200536

在前端加密用的比較多的是 aes,也碰到過先通過 rsa 將 aes 的 key 進行加密,再利用 aes 加密傳輸的數據的。

上圖就是直接使用 aes 加密的案例。

我們可以通過瀏覽器找到加密的 js 文件,一般在源代碼 / 來源中找到 js 目錄,此網站比較簡單,直接使用了 crypto-js.js 文件,打開直接就可以看到 aes 的 key 和加密方式。

Pasted image 20241129200734

如上圖我們可以知道,給了 key,模式是 ECB,pad 是 Pkcs7,有了這幾個東西後,就可以去解密數據了。

使用 burpsuite 的autodecoder插件,這次解密也是使用這款插件

Pasted image 20241129201305

autoDecoder 有四個選項卡。

Pasted image 20241129201504

第一個 options 選項卡,是一些設置

  • 模塊控制:在 burp 哪些模塊上運行 autodecoder 加解密
  • 加解密選項:用來控制加解密的方式,使用自帶算法加解密還是使用接口加解密

Pasted image 20241129201749

後面的選項是針對第一個選項,如我選擇接口加解密,那麼我可以設置對數據頭進行處理請求響應不同加解密選項。

  • 加解密設置:則需要注意加解密域名一定要填寫,否則 autodecoder 選項卡顯示不了。其他的可以默認。
  • 設置完後,一定要保存

第二個選項卡是 autodecoder 自帶算法加解密

Pasted image 20241129202124

第三個選項卡是接口加解密

需要設置接口,接口可參考作者給的。如果需要自定義一些請求參數,則大部分需要使用接口加解密。

Pasted image 20241129202150

如這次遇到的存在兩個參數,使用自帶的算法加解密就有點無法滿足要求了。

Pasted image 20241129200536

自帶的算法加解密有個正則模式匹配,只能匹配一個加密字符串(name),就無法提取 pwd 參數的加密字符串。

第四個選項卡是請求響應替換

可以用來測一些越權的漏洞,感覺和 burp 的 Autorize 插件一樣,沒用過。

Pasted image 20241129202217

簡單的介紹了下 autodecoder 插件。

根據作者的腳本改了下,適應了當前測試的站點

from flask import Flask, request
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad,unpad
import base64
from urllib.parse import parse_qs,quote
import hashlib

def aes_encrypt(key, data):
    cipher = AES.new(key, AES.MODE_ECB)
    padded_data = pad(data.encode(), AES.block_size)
    cipher_text = cipher.encrypt(padded_data)
    return base64.b64encode(cipher_text).decode()

def aes_decrypt(key, data):
    cipher = AES.new(key, AES.MODE_ECB)
    decrypted_data = cipher.decrypt(base64.b64decode(data))
    unpadded_data = unpad(decrypted_data, AES.block_size)
    return unpadded_data.decode()

app = Flask(__name__)

@app.route('/encode', methods=["POST"])
def encrypt():
    key = b'這裡寫aes的key'  # 16 bytes key
    str1 = '123'
    param = request.form.get('dataBody')  # Get POST parameter
    md5value = param + str1
    param1 =  quote(aes_encrypt(key,param))
    param2 = hashlib.md5(md5value.encode()).hexdigest()
    return f"Param={param1}&Autograph={param2}"
    '''
    data = json.loads(param)
    encrypted_id = aes_encrypt(key, data["id"])
    encry_param = param.replace(data["id"], encrypted_id)
    return base64.b64decode(encry_param.encode()).decode()
    '''

@app.route('/decode', methods=["POST"])
def decrypt():
    key = b'這裡寫aes的key'
    param = request.form.get('dataBody')
    print('param: ',param)
    parsed_params = parse_qs(param)
    print(parsed_params)
    
    # 解密兩個參數,分別是name和pwd
    decrypted_name = aes_decrypt(key, parsed_params["name"][0])
    decrypted_value = aes_decrypt(key, parsed_params["pwd"][0])
    
    # 返回包含兩個參數的JSON響應
    return f"name={decrypted_name}&pwd={decrypted_value}"

if __name__ == '__main__':
    app.debug = True  # Set debug mode, remember to turn it off in production
    app.run(host="0.0.0.0", port=8888)

寫好了腳本,那麼就運行,程序會監聽在 127.0.0.1:8888

python3 aed_decode.py

可以先抓個包測試下,可以看到成功解密了

Pasted image 20241129203021

目前設置如下:

Pasted image 20241129203246

Pasted image 20241129203422

設置完成後,抓包就可以看到每一次請求都會自動解密了,在 autoDecoder 選項卡可以看到解密內容

Pasted image 20241129203459

也可以開始利用 burp 的 intruder 模塊進行登錄爆破了。

在這裡也推薦一個前端加密對抗練習靶場,包含非對稱加密、對稱加密、加簽以及禁止重放的測試場景,比如 AES、DES、RSA,用於滲透測試練習。

靶場地址:https://github.com/SwagXz/encrypt-labs/tree/main

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。