from mitmproxy import flowfilter, ctx
from mitmproxy.http import HTTPFlow
from Crypto.Cipher import DES3
from Crypto.Util.Padding import unpad
import base64
import json
classMimit:
def_des3_decrypt(self, encrypted_str):
"""统一的解密方法"""
try:
hardcoded_part = "U2FsdGVkX18ng9Sdur"
salt_part = "IAhhsg"
combined_key = (hardcoded_part + salt_part).encode()
final_key = combined_key[:24]
encrypted_data = base64.b64decode(encrypted_str)
cipher = DES3.new(final_key, DES3.MODE_ECB)
decrypted_data = cipher.decrypt(encrypted_data)
return unpad(decrypted_data, DES3.block_size).decode('utf-8')
except Exception as e:
ctx.log.error(f"解密失败: {str(e)}")
returnNone
defrequest(self, flow: HTTPFlow):
"""处理请求"""
try:
ctx.log.info("进入目标请求处理")
# 处理可能非JSON格式的情况
try:
req_data = json.loads(flow.request.content)
except json.JSONDecodeError:
ctx.log.warn("非JSON格式请求数据")
return
if'data'in req_data:
decrypted = self._des3_decrypt(req_data['data'])
if decrypted:
#ctx.log.info(f"解密后第一阶段数据: {decrypted}")
decrypted2 = self._des3_decrypt(decrypted[:-6])
ctx.log.info(f"解密后第二阶段数据: {decrypted2}")
flow.request.content = json.dumps(req_data).encode()
except Exception as e:
ctx.log.error(f"请求处理异常: {str(e)}")
defresponse(self, flow: HTTPFlow):
"""处理响应"""
try:
salt_part = "IAhhsg"
# 处理可能非JSON格式的情况
try:
resp_data = json.loads(flow.response.content)
except json.JSONDecodeError:
ctx.log.warn("非JSON格式响应数据")
return
if'bizContent'in resp_data:
#ctx.log.info(f"原始响应内容: {resp_data['bizContent']}")
decrypted = self._des3_decrypt(resp_data['bizContent'])
decrypted2 = self._des3_decrypt(decrypted[:-6])
ctx.log.info(f"解密响应内容: {decrypted2}")
flow.request.content = json.dumps(resp_data).encode()
except Exception as e:
ctx.log.error(f"响应处理异常: {str(e)}")
addons = [Mimit()]
des3_decrypt其实是解密函数的封装;浅浅的运行一下,默认mitmdump的代理端口是8080,注意别和burpsuite的代理冲突
defrequest(self, flow: HTTPFlow):
"""处理请求"""
try:
ctx.log.info("进入目标请求处理")
# 处理可能非JSON格式的情况
try:
req_data = json.loads(flow.request.content)
except json.JSONDecodeError:
ctx.log.warn("非JSON格式请求数据")
return
if'data'in req_data:
decrypted = self._des3_decrypt(req_data['data'])
if decrypted:
decrypted2 = self._des3_decrypt(decrypted[:-6])
ctx.log.info(f"解密后第二阶段数据: {decrypted2}")
#将明文请求回传给burpsuite
req_data['data'] = f"{decrypted2}"
flow.request.content = json.dumps(req_data).encode()
except Exception as e:
ctx.log.error(f"请求处理异常: {str(e)}")
mitmdump -p7070 -s d3.py--mode upstream:http://127.0.0.1:8080 --ssl-insecure
from mitmproxy import ctx
from mitmproxy.http import HTTPFlow
from Crypto.Cipher import DES3
from Crypto.Util.Padding import pad, unpad
import base64
import json
classEncryptAddon:
def__init__(self):
self.combined_key = ("U2FsdGVkX18ng9Sdur" + "IAhhsg").encode()
def_des3_encrypt(self, plaintext):
try:
cipher = DES3.new(self.combined_key, DES3.MODE_ECB)
padded = pad(plaintext.encode(), DES3.block_size)
encrypted = cipher.encrypt(padded)
return base64.b64encode(encrypted).decode()
except Exception as e:
ctx.log.error(f"加密失败: {e}")
returnNone
defrequest(self, flow: HTTPFlow):
try:
req_data = json.loads(flow.request.content)
if'data'in req_data:
plain_data = req_data['data']
encrypted_step2 = self._des3_encrypt(plain_data)
encrypted_step1 = self._des3_encrypt(encrypted_step2 + "IAhhsg")
req_data['data'] = encrypted_step1
flow.request.content = json.dumps(req_data).encode()
except Exception as e:
ctx.log.error(f"请求加密错误: {e}")
defresponse(self, flow: HTTPFlow):
"""处理响应"""
try:
# 处理可能非JSON格式的情况
try:
resp_data = json.loads(flow.response.content)
except json.JSONDecodeError:
ctx.log.warn("非JSON格式响应数据")
return
if'bizContent'in resp_data:
flow.request.content = json.dumps(resp_data).encode()
except Exception as e:
ctx.log.error(f"响应处理异常: {str(e)}")
addons = [EncryptAddon()]
mitmdump -p7070 -s d3.py--mode upstream:http://127.0.0.1:8080 --ssl-insecure
mitmdump -p 9091 -s encrypt.py --ssl-insecure
请求路径为:
客户端 -> mitmproxy:7070(解密) -> Burp:8080 -> mitmproxy:9071(加密) -> 服务器
响应路径则应该为:
服务器 -> mitmproxy:9091(解密) -> Burp:8080 -> mitmproxy:7070(加密) -> 客户端
所以我们只需要补充下游代理对返回包的加密流程补充,上游代理对返回包解密流程的补充,即可完成完整的请求链路,实现burpsuite的明文请求、明文响应
from mitmproxy import ctx
from mitmproxy.http import HTTPFlow
from Crypto.Cipher import DES3
from Crypto.Util.Padding import unpad, pad
import base64
import json
classMimit:
def__init__(self):
self.combined_key = ("U2FsdGVkX18ng9Sdur" + "IAhhsg").encode()
def_des3_decrypt(self, encrypted_str):
try:
encrypted_data = base64.b64decode(encrypted_str)
cipher = DES3.new(self.combined_key, DES3.MODE_ECB)
decrypted = cipher.decrypt(encrypted_data)
return unpad(decrypted, DES3.block_size).decode()
except Exception as e:
ctx.log.error(f"解密失败: {e}")
returnNone
def_des3_encrypt(self, plaintext):
try:
cipher = DES3.new(self.combined_key, DES3.MODE_ECB)
padded = pad(plaintext.encode(), DES3.block_size)
encrypted = cipher.encrypt(padded)
return base64.b64encode(encrypted).decode()
except Exception as e:
ctx.log.error(f"加密失败: {e}")
returnNone
defrequest(self, flow: HTTPFlow):
"""处理请求"""
try:
ctx.log.info("进入目标请求处理")
# 处理可能非JSON格式的情况
try:
req_data = json.loads(flow.request.content)
except json.JSONDecodeError:
ctx.log.warn("非JSON格式请求数据")
return
if'data'in req_data:
decrypted = self._des3_decrypt(req_data['data'])
if decrypted:
decrypted2 = self._des3_decrypt(decrypted[:-6])
ctx.log.info(f"解密后第二阶段数据: {decrypted2}")
#将明文请求回传给burpsuite
req_data['data'] = f"{decrypted2}"
flow.request.content = json.dumps(req_data).encode()
except Exception as e:
ctx.log.error(f"请求处理异常: {str(e)}")
defresponse(self, flow: HTTPFlow):
"""处理响应"""
try:
salt_part = "IAhhsg"
# 处理可能非JSON格式的情况
try:
resp_data = json.loads(flow.response.content)
except json.JSONDecodeError:
ctx.log.warn("非JSON格式响应数据")
return
if'bizContent'in resp_data:
plain_resp = resp_data['bizContent']
encrypted_step2 = self._des3_encrypt(plain_resp)
encrypted_step1 = self._des3_encrypt(encrypted_step2 + "27Pskg")
resp_data['bizContent'] = encrypted_step1
flow.response.content = json.dumps(resp_data).encode()
except Exception as e:
ctx.log.error(f"响应处理异常: {str(e)}")
addons = [Mimit()]
from mitmproxy import ctx
from mitmproxy.http import HTTPFlow
from Crypto.Cipher import DES3
from Crypto.Util.Padding import pad, unpad
import base64
import json
classEncryptAddon:
def__init__(self):
self.combined_key = ("U2FsdGVkX18ng9Sdur" + "IAhhsg").encode()[:24]
def_des3_encrypt(self, plaintext):
try:
cipher = DES3.new(self.combined_key, DES3.MODE_ECB)
padded = pad(plaintext.encode(), DES3.block_size)
encrypted = cipher.encrypt(padded)
return base64.b64encode(encrypted).decode()
except Exception as e:
ctx.log.error(f"加密失败: {e}")
returnNone
def_des3_decrypt(self, encrypted_str):
try:
encrypted_data = base64.b64decode(encrypted_str)
cipher = DES3.new(self.combined_key, DES3.MODE_ECB)
decrypted = cipher.decrypt(encrypted_data)
return unpad(decrypted, DES3.block_size).decode()
except Exception as e:
ctx.log.error(f"解密失败: {e}")
returnNone
defrequest(self, flow: HTTPFlow):
try:
req_data = json.loads(flow.request.content)
if'data'in req_data:
plain_data = req_data['data']
encrypted_step2 = self._des3_encrypt(plain_data)
encrypted_step1 = self._des3_encrypt(encrypted_step2 + "IAhhsg")
req_data['data'] = encrypted_step1
flow.request.content = json.dumps(req_data).encode()
except Exception as e:
ctx.log.error(f"请求加密错误: {e}")
defresponse(self, flow: HTTPFlow):
"""处理响应"""
try:
salt_part = "IAhhsg"
# 处理可能非JSON格式的情况
try:
resp_data = json.loads(flow.response.content)
except json.JSONDecodeError:
ctx.log.warn("非JSON格式响应数据")
return
if'bizContent'in resp_data:
encrypted = resp_data['bizContent']
decrypted_step1 = self._des3_decrypt(encrypted)
decrypted_step2 = self._des3_decrypt(decrypted_step1[:-6])
resp_data['bizContent'] = decrypted_step2
flow.response.content = json.dumps(resp_data).encode()
except Exception as e:
ctx.log.error(f"响应处理异常: {str(e)}")
addons = [EncryptAddon()]
mitmdump -p7070 -s d3.py--mode upstream:http://127.0.0.1:8080 --ssl-insecure
mitmdump -p 9091 -s encrypt.py --ssl-insecure
原文始发于微信公众号(我不懂安全):一文看懂mitmdump加密对抗
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论