冰蝎动态二进制加密WebShell基于流量侧检测方案
字数 1618 2025-08-18 11:39:08
冰蝎动态二进制加密WebShell流量侧检测方案详解
1. 冰蝎WebShell概述
冰蝎(Behinder)是一款新型动态二进制加密网站工具,目前已发展到6个版本。它支持多种脚本类型:ASP、ASPX、JSP、JSPX、PHP。
2. 检测思路
对于WebShell的网络流量侧检测,主要有三个思路:
- WebShell上传过程中文件还原进行样本分析,检测静态文件是否报毒
- WebShell上线或建立连接过程的数据通信流量
- WebShell已连接后执行远程控制命令过程的数据通信流量
本文主要关注第二种思路:检测冰蝎上线的静态特征。
3. 冰蝎通讯原理
冰蝎采用AES加密算法进行通信,已有许多文章介绍其解密方法,本文不再赘述。
4. 各版本上线数据包特征
4.1 V1.0版本
- 通信流量特征:
Content-Type: application/octet-stream(二进制流传输数据) - GET请求体返回16位大小写字母或数字
4.2 V1.1版本
- 新增随机UserAgent支持,每次会话从17种常见UserAgent中随机选取
pass(密码)后跟10位数字
4.3 V2.0.1版本
- PHP shell上线数据包:产生两个POST请求和响应
- 第一个POST响应无响应体
- 第二个POST响应有响应体
- 需要使用
flowbits设置多包联合检测
4.4 特殊数据包类型
- 无Content-Length字段的包(可能是chunked加密)
- PHP GET响应无强特征"Content-Length: 16"
5. 静态特征分析
5.1 弱特征
-
密钥传递时URL参数:
\.(php|jsp|asp|jspx|aspx)\?\w{1,8}=\d{1,10}HTTP/1\.1\w{1,8}表示密码长度\d{1,10}表示密码后跟的数字长度
-
加密时的URL参数:
\.(php|jsp|asp|jspx|aspx) HTTP/1.1- 无URL参数本身也是一种特征
5.2 强特征
-
Accept字段(可绕过):
Accept: text/html,image/gif, image/jpeg, *; q=.2, */*;q=.2- 存在于冰蝎任何通讯阶段
- 支持自定义HTTP Header可绕过
-
UserAgent字段(可绕过):
- V1.1+版本从17种常见(较老)UserAgent中随机选取
- 同一源IP访问某URL时命中多个列表中的UserAgent可确认为冰蝎
-
传递的密钥:
- 密钥是16位随机字符串(大小写字母+数字)
- 上线过程会进行2次密码协商(2个GET请求,返回2次16位key)
- 特征:
\r\n\r\n[A-Za-z0-9]{16}$ Content-Length: 16
5.3 加密数据特征
-
加密数据上行特征:
- JSP/PHP/JSPX:
\r\n\r\n[a-zA-Z\d\+\/]{10,}\/[a-zA-Z\d\/]{50} - ASP/ASPX:
- ASPX独有特征(包含不可见字符)
[^\w\s>
- JSP/PHP/JSPX:
-
加密数据下行特征:
- JSP/PHP/ASP/ASPX:
[^\w\s>w]{2}[^\w\s>a-zA-Z\d]{2}- 匹配二进制非常见字符
- 返回状态码200 OK
- Content-Type: text/html
- JSPX特殊:
Content-Type:text/xml
- JSP/PHP/ASP/ASPX:
-
长连接特征(可绕过):
Connection: Keep-Alive
6. Snort规则检测思路
-
第一阶段:检测第一个GET请求的响应体
- 16位大小写字母或数字
- 状态码200 OK
- 设置
flowbits: set, bx_first_get_resp
-
第二阶段:检测第二个GET请求
- 满足URL参数弱特征
- 设置
flowbits: set, bx_second_get_req
-
第三阶段:检测第二个GET响应体
- 同第一阶段特征
- 设置
flowbits: set, bx_second_get_resp
-
第四阶段:分两种情况检测
- 情况一:
- 检测POST请求通用特征
- 检测POST响应特征
- 情况二(不满足情况一):
- 检测JSPX特有的POST请求特征
- 检测JSPX特有的POST响应特征
- 情况一:
7. Snort规则示例
alert http any any -> any any(msg:"MALWARE-BACKDOOR Behinder webshell online detected"; flow:established,to_client; pcre: "/\r\n\r\n[A-Za-z0-9]{16}$/"; content:"200 OK"; content: "Content-Length: 16"; fast_pattern;nocase; flowbits: set, bx_first_get_resp; noalert; classtype:web-attack;sid:3000021; rev:1; metadata:created_at 2019_11_20, updated_at 2019_11_20;)
alert http any any -> any any(msg:"MALWARE-BACKDOOR Behinder webshell online detected"; flow:established,to_server; content:"GET"; http_method; pcre:"/\.(php|jsp|asp|jspx|aspx)\?\w{1,8}=\d{1,10} HTTP/1\.1/";flowbits:isset, bx_first_get_resp; flowbits:set, bx_second_get_req; noalert;classtype:web-attack; sid:3000022; rev:1; metadata:created_at 2019_11_20,updated_at 2019_11_20;)
alert http any any -> any any(msg:"MALWARE-BACKDOOR Behinder webshell online detected"; flow:established,to_client; pcre: "/\r\n\r\n[A-Za-z0-9]{16}$/"; content:"Content-Length: 16"; fast_pattern; nocase; flowbits: isset,bx_second_get_req; flowbits:set, bx_second_get_resp; noalert;classtype:web-attack; sid:3000023; rev:1; metadata:created_at 2019_11_20,updated_at 2019_11_20;)
alert http any any -> any any(msg:"MALWARE-BACKDOOR Behinder webshell online detected"; flow:established,to_server; content:"POST"; http_method; pcre:"/\.(php|jsp|asp|jspx|aspx) HTTP/1\.1/"; flowbits:isset, bx_second_get_resp;flowbits:set, bx_first_post_req; noalert; classtype:web-attack; sid:3000024;rev:1; metadata:created_at 2019_11_20, updated_at 2019_11_20;)
alert http any any -> any any(msg:"MALWARE-BACKDOOR Behinder webshell online detected"; flow:established,to_client; pcre: "/[^\w\s>w]{2}[^\w\s>a-zA-Z\d]{2}/";content: "200 OK"; content: "Content-Type: text/html";flowbits: isset, bx_first_post_req; classtype:web-attack; sid:3000025; rev:1;metadata:created_at 2019_11_20, updated_at 2019_11_20;)
alert http any any -> any any(msg:"MALWARE-BACKDOOR Behinder webshell-jspx online"; flow:established,to_server; pcre:"/\r\n\r\n[a-zA-Z\d\+\/]{10,}\/[a-zA-Z\d\/]{50}/"; content:"Content-Type: application/octet-stream"; fast_pattern; flowbits:isset, bx_second_get_resp; flowbits: set, bx_req_jspx; noalert;classtype:web-attack; sid:3000026; rev:1; metadata:created_at 2019_11_20,updated_at 2019_11_20;)
alert http any any -> any any(msg:"MALWARE-BACKDOOR Behinder webshell-jspx online"; flow:established,to_client; pcre:"/[^\w\s>w]{2}[^\w\s>a-zA-Z\d]{2}/";content: "200 OK"; content: "Content-Type: text/xml";fast_pattern; flowbits: isset, bx_req_jspx; classtype:web-attack; sid:3000027;rev:1; metadata:created_at 2019_11_20, updated_at 2019_11_20;)
8. 检测注意事项
- 冰蝎支持自定义HTTP Header,部分特征可被绕过
- 对于特殊包类型(如无Content-Length字段),需要特殊处理
- 不同脚本类型(ASP/ASPX/JSP/JSPX/PHP)有各自的特征差异
- 检测时应考虑多包联合检测(使用flowbits)
- 规则中的数字参数(如{50})可根据实际IDS性能调整