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