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

加载中...
此文章数据所有权由区块链加密技术和智能合约保障仅归创作者所有。