流量加密又怎样? 多种姿势检测“冰蝎”
字数 1145 2025-08-18 11:39:04
冰蝎(Behinder) WebShell 检测技术详解
一、冰蝎WebShell概述
冰蝎(Behinder)是当前最流行的WebShell客户端工具,其特点是在HTTP明文协议中建立加密隧道,以躲避传统安全设备的检测。本文主要针对冰蝎v2.0.1版本的通讯特征进行分析,并提供详细的检测方法。
二、冰蝎通讯原理
冰蝎使用对称加密算法,通讯过程分为三个阶段:
1. 密钥传递阶段
- 客户端向服务器请求密钥
- 密钥传递是完全明文的
- 密钥为16位随机字符串(小写字母+数字组成)
2. 算法协商阶段
- 客户端用不同算法加密payload发送给服务器
- 服务器成功解密则确定使用该算法
- 常用算法:AES128和XOR(异或)
- 失败则响应为空,客户端继续尝试其他算法
3. 正式通讯阶段
- 客户端使用协商的密钥加密payload
- 通过POST方式发送给服务端
- 服务端解密执行后将结果加密返回
三、静态检测特征
强特征(误报率低,可单独使用)
1. Accept字段特征
Accept: text/html,image/gif, image/jpeg, *; q=.2, */*; q=.2
注:可通过自定义HTTP Header绕过
2. UserAgent字段特征
冰蝎内置的UserAgent列表(部分已过时):
Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1(KHTML, like Gecko) Chrome/14.0.835.163 Safari/535.1
Mozilla/5.0 (Windows NT 6.1; WOW64; rv:6.0)Gecko/20100101 Firefox/6.0
Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.50(KHTML, like Gecko) Version/5.1 Safari/534.50
Opera/9.80 (Windows NT6.1; U; zh-cn) Presto/2.9.168 Version/11.5
Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64;x64; Trident/5.0; .NET CLR 2.0.50727; SLCC2; .NET CLR 3.5.30729; .NET CLR3.0.30729; Media Center PC 6.0; InfoPath.3; .NET4.0C; Tablet PC 2.0; .NET4.0E)
[...更多详见原文...]
检测策略:同一源IP访问同一URL时命中多个上述UA
3. 密钥特征
密钥传递阶段的响应体:
\r\n\r\n[a-z0-9]{16}$
或通过Content-Length检测:
Content-Length: 16
弱特征(需组合使用降低误报)
1. 密钥传递URL参数
\.(php|jsp|asp|jspx|asa)\?(\w){1,10}=\d{2,3}HTTP/1.1
特征:
- 单一参数(key-value形式)
- key为1-10位字母数字(webshell密码)
- value为2-3位随机数字
2. 加密通讯URL参数
\.(php|jsp|asp|jspx|asa) HTTP/1.1
特征:无URL参数
3. 加密数据上行(Base64编码)
\r\n\r\n[a-zA-Z\d\+\/]{20,}
说明:至少20个Base64字符(因TCP分片需保守设置)
4. 加密数据下行(二进制数据)
\r\n\r\n[\w]{0,6}[^\w\s>]
需配合:
Content-Type: text/html
说明:检测text/html类型中的二进制数据
5. 长连接特征
Connection: Keep-Alive
注:可被绕过
四、动态检测方法
在静态特征告警基础上进行行为关联分析:
-
同一URL或源IP在数秒内同时命中:
- 密钥传递规则
- 加密通讯规则
-
取证解密流程:
- 从密钥传递告警中提取密钥
- 从加密通讯告警中提取加密内容
- 进行解密还原攻击行为
五、解密示例(Python)
import base64
from Crypto.Cipher import AES
import sys
# 设置密钥(从流量中提取)
key = '4d21a8526f30c7e2'
# AES解密函数
def add_to_16(value):
while len(value) % 16 != 0:
value += '\0'
return value
def aes_decode(k, data):
aes = AES.new(add_to_16(k), AES.MODE_ECB)
data_encode = data.encode()
data_64 = base64.b64decode(data_encode)
data_pass = aes.decrypt(data_64).decode(encoding='UTF-8', errors='ignore')
return data_pass
# 从HTTP请求提取POST Body
def get_http_info(raw):
temp_arr = raw.split("\n")
length = 0
for one in temp_arr:
if "Content-Length: " in one:
length = int(one[16:])
body = temp_arr[-1]
return length, body
# 示例HTTP请求
http_request = """POST http://xxx:8080/fff2.php HTTP/1.1
Content-Type:application/x-www-form-urlencoded
[...其他头部...]
60Yp….xYA=="""
body_length, body = get_http_info(http_request)
if body_length > 0:
# 先尝试XOR解密
text_64 = base64.b64decode(body)
text_str = text_64
text_list = []
for i in range(len(text_str)):
text_list.append(chr(ord(text_str[i]) ^ ord(key[i + 1 & 15])))
clear_text = ''.join(text_list)
if "assert|" in clear_text: # PHP payload中的关键字
print(clear_text)
else:
# XOR失败尝试AES解密
clear_text = aes_decode(key, body)
if "assert|" in clear_text:
print(clear_text)
else:
print("无法解密")
else:
print("无法提取Post Body")
六、检测建议
-
对于工作于七层的IDS:
- 可检测完整HTTP双向内容
- 可提高Base64检测长度阈值(减少误报)
-
对于工作于四层的IDS:
- 只能检测TCP单"帧"
- 需保守设置特征阈值(如Base64最少20字符)
-
组合策略:
- 强特征+弱特征组合使用
- 静态特征+动态行为分析
-
注意事项:
- 确保提取完整HTTP请求/响应(不解密需完整密文)
- 确认正则引擎支持断言等高级特性
通过以上方法可有效检测冰蝎WebShell的加密通讯行为,实际部署时可根据网络环境调整检测策略和阈值。