分析某台子网站加密,脚本联动BP实现自动加解密梭哈,直接爽飞
字数 1086 2025-08-29 08:30:30

某网站加密分析与BurpSuite自动化加解密实现

0x00 背景介绍

本文档详细分析某网站的加密机制,并通过编写脚本实现BurpSuite自动加解密功能。该网站请求和响应正文全部采用加密处理,主要使用DES和3DES加密算法。

0x01 加密现象分析

初始观察

  • 网站登录框提交后,请求和响应正文均为密文
  • 请求头中包含关键字段Pwds,可作为分析切入点

关键字段定位

在JavaScript源代码中搜索Pwds,发现以下关键点:

  1. Pwds值来源于变量b
  2. b是一串密文,使用固定密钥r进行3DES加密
  3. 加密内容为变量c的值与时间戳拼接

0x02 加密流程解析

请求加密流程

  1. 生成随机字符串c

    • 包含随机内容和时间戳
    • 截取前8位作为DES加密密钥
  2. 构造请求体密文o

    o = p(c, j(a, t))
    
    • a:原始请求正文
    • t:标志位(值为1表示加密)
    • p():DES加密函数
    • c:DES加密密钥
  3. 生成Pwds

    b = 3DES_encrypt(c + timestamp, r)
    Pwds = b
    
    • r:固定密钥(请求和响应不同)
    • 使用3DES加密c与时间戳的拼接

响应解密流程

  1. 从响应头获取Pwds
  2. 使用响应固定密钥r'进行3DES解密
  3. 获取前8位作为DES解密密钥
  4. 解密响应正文

0x03 加解密验证

DES解密验证

  1. 从请求头获取Pwds
  2. 使用固定密钥r进行3DES解密
  3. 获取前8位作为DES密钥
  4. 解密请求正文

3DES解密要点

  • 请求和响应使用不同的固定密钥
  • 初始分析可能误认为DES加密,实际为3DES
  • 时间戳导致每次请求密钥变化

0x04 自动化实现

关键问题解决

由于时间戳导致密钥动态变化,需要:

  1. 自动提取Pwds
  2. 动态解密获取DES密钥
  3. 实时加解密请求/响应

BurpSuite脚本编写

请求处理脚本

from burp import IBurpExtender, IHttpListener
import base64
from Crypto.Cipher import DES, DES3

# 固定密钥(示例)
REQUEST_R_KEY = "FT****GO"  # 替换为实际请求固定密钥
RESPONSE_R_KEY = "RT****GO" # 替换为实际响应固定密钥

class BurpExtender(IBurpExtender, IHttpListener):
    def registerExtenderCallbacks(self, callbacks):
        self._callbacks = callbacks
        self._helpers = callbacks.getHelpers()
        callbacks.setExtensionName("Auto Encrypt/Decrypt")
        callbacks.registerHttpListener(self)
    
    def processHttpMessage(self, toolFlag, messageIsRequest, messageInfo):
        if messageIsRequest:
            self.processRequest(messageInfo)
        else:
            self.processResponse(messageInfo)
    
    def processRequest(self, messageInfo):
        request = messageInfo.getRequest()
        requestInfo = self._helpers.analyzeRequest(request)
        headers = requestInfo.getHeaders()
        body = request[self._helpers.analyzeRequest(request).getBodyOffset():].tostring()
        
        # 获取Pwds
        pwds = None
        for header in headers:
            if header.startswith("Pwds:"):
                pwds = header.split(":")[1].strip()
                break
        
        if pwds:
            # 3DES解密Pwds获取DES密钥
            des_key = self.decrypt_pwds(pwds, REQUEST_R_KEY)[:8]
            
            # DES解密请求体
            decrypted_body = self.des_decrypt(body, des_key)
            
            # 修改请求为明文(调试用)
            # newRequest = self._helpers.buildHttpMessage(headers, decrypted_body)
            # messageInfo.setRequest(newRequest)
            
            # 或者保持加密但使用新密钥重新加密修改后的内容
            # 这里可以实现自动修改请求参数并重新加密
            
    def processResponse(self, messageInfo):
        response = messageInfo.getResponse()
        responseInfo = self._helpers.analyzeResponse(response)
        headers = responseInfo.getHeaders()
        body = response[self._helpers.analyzeResponse(response).getBodyOffset():].tostring()
        
        # 获取响应Pwds
        pwds = None
        for header in headers:
            if header.startswith("Pwds:"):
                pwds = header.split(":")[1].strip()
                break
        
        if pwds:
            # 3DES解密Pwds获取DES密钥
            des_key = self.decrypt_pwds(pwds, RESPONSE_R_KEY)[:8]
            
            # DES解密响应体
            decrypted_body = self.des_decrypt(body, des_key)
            
            # 修改响应为明文
            newResponse = self._helpers.buildHttpMessage(headers, decrypted_body)
            messageInfo.setResponse(newResponse)
    
    def decrypt_pwds(self, pwds, r_key):
        # Base64解码
        encrypted = base64.b64decode(pwds)
        
        # 3DES解密
        cipher = DES3.new(r_key, DES3.MODE_ECB)
        decrypted = cipher.decrypt(encrypted)
        
        return decrypted
    
    def des_decrypt(self, data, key):
        # Base64解码
        encrypted = base64.b64decode(data)
        
        # DES解密
        cipher = DES.new(key, DES.MODE_ECB)
        decrypted = cipher.decrypt(encrypted)
        
        return decrypted
        
    def des_encrypt(self, data, key):
        # DES加密
        cipher = DES.new(key, DES.MODE_ECB)
        encrypted = cipher.encrypt(data)
        
        # Base64编码
        return base64.b64encode(encrypted)

响应处理脚本

# 响应处理已在上述脚本中实现
# 主要区别在于使用不同的固定密钥(RESPONSE_R_KEY)

0x05 使用说明

  1. 安装Jython环境并配置BurpSuite
  2. 替换脚本中的REQUEST_R_KEYRESPONSE_R_KEY为实际值
  3. 根据需要修改加解密逻辑(如填充模式、加密模式等)
  4. 加载脚本到BurpSuite

0x06 测试验证

  1. 捕获登录请求,观察自动解密功能
  2. 修改请求参数,验证自动重新加密
  3. 检查响应是否自动解密为明文

0x07 注意事项

  1. 确保获取正确的固定密钥(请求和响应不同)
  2. 注意加密算法的模式和填充方式
  3. 时间戳处理要准确,确保密钥生成一致
  4. 实际部署前充分测试各种边界情况

0x08 扩展功能

  1. 实现请求参数自动修改并重新加密
  2. 添加加解密日志记录功能
  3. 支持更多加密算法
  4. 开发UI界面配置密钥和算法参数

通过以上分析和实现,可以完全自动化处理该网站的加解密通信,极大提高测试效率。

某网站加密分析与BurpSuite自动化加解密实现 0x00 背景介绍 本文档详细分析某网站的加密机制,并通过编写脚本实现BurpSuite自动加解密功能。该网站请求和响应正文全部采用加密处理,主要使用DES和3DES加密算法。 0x01 加密现象分析 初始观察 网站登录框提交后,请求和响应正文均为密文 请求头中包含关键字段 Pwds ,可作为分析切入点 关键字段定位 在JavaScript源代码中搜索 Pwds ,发现以下关键点: Pwds 值来源于变量 b b 是一串密文,使用固定密钥 r 进行3DES加密 加密内容为变量 c 的值与时间戳拼接 0x02 加密流程解析 请求加密流程 生成随机字符串 c : 包含随机内容和时间戳 截取前8位作为DES加密密钥 构造请求体密文 o : a :原始请求正文 t :标志位(值为1表示加密) p() :DES加密函数 c :DES加密密钥 生成 Pwds : r :固定密钥(请求和响应不同) 使用3DES加密 c 与时间戳的拼接 响应解密流程 从响应头获取 Pwds 使用响应固定密钥 r' 进行3DES解密 获取前8位作为DES解密密钥 解密响应正文 0x03 加解密验证 DES解密验证 从请求头获取 Pwds 使用固定密钥 r 进行3DES解密 获取前8位作为DES密钥 解密请求正文 3DES解密要点 请求和响应使用不同的固定密钥 初始分析可能误认为DES加密,实际为3DES 时间戳导致每次请求密钥变化 0x04 自动化实现 关键问题解决 由于时间戳导致密钥动态变化,需要: 自动提取 Pwds 动态解密获取DES密钥 实时加解密请求/响应 BurpSuite脚本编写 请求处理脚本 响应处理脚本 0x05 使用说明 安装Jython环境并配置BurpSuite 替换脚本中的 REQUEST_R_KEY 和 RESPONSE_R_KEY 为实际值 根据需要修改加解密逻辑(如填充模式、加密模式等) 加载脚本到BurpSuite 0x06 测试验证 捕获登录请求,观察自动解密功能 修改请求参数,验证自动重新加密 检查响应是否自动解密为明文 0x07 注意事项 确保获取正确的固定密钥(请求和响应不同) 注意加密算法的模式和填充方式 时间戳处理要准确,确保密钥生成一致 实际部署前充分测试各种边界情况 0x08 扩展功能 实现请求参数自动修改并重新加密 添加加解密日志记录功能 支持更多加密算法 开发UI界面配置密钥和算法参数 通过以上分析和实现,可以完全自动化处理该网站的加解密通信,极大提高测试效率。