冰蝎动态二进制加密WebShell基于流量侧检测方案
字数 1618 2025-08-18 11:39:08

冰蝎动态二进制加密WebShell流量侧检测方案详解

1. 冰蝎WebShell概述

冰蝎(Behinder)是一款新型动态二进制加密网站工具,目前已发展到6个版本。它支持多种脚本类型:ASP、ASPX、JSP、JSPX、PHP。

2. 检测思路

对于WebShell的网络流量侧检测,主要有三个思路:

  1. WebShell上传过程中文件还原进行样本分析,检测静态文件是否报毒
  2. WebShell上线或建立连接过程的数据通信流量
  3. 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 特殊数据包类型

  1. 无Content-Length字段的包(可能是chunked加密)
  2. PHP GET响应无强特征"Content-Length: 16"

5. 静态特征分析

5.1 弱特征

  1. 密钥传递时URL参数

    \.(php|jsp|asp|jspx|aspx)\?\w{1,8}=\d{1,10}HTTP/1\.1
    
    • \w{1,8}表示密码长度
    • \d{1,10}表示密码后跟的数字长度
  2. 加密时的URL参数

    \.(php|jsp|asp|jspx|aspx) HTTP/1.1
    
    • 无URL参数本身也是一种特征

5.2 强特征

  1. Accept字段(可绕过):

    Accept: text/html,image/gif, image/jpeg, *; q=.2, */*;q=.2
    
    • 存在于冰蝎任何通讯阶段
    • 支持自定义HTTP Header可绕过
  2. UserAgent字段(可绕过):

    • V1.1+版本从17种常见(较老)UserAgent中随机选取
    • 同一源IP访问某URL时命中多个列表中的UserAgent可确认为冰蝎
  3. 传递的密钥

    • 密钥是16位随机字符串(大小写字母+数字)
    • 上线过程会进行2次密码协商(2个GET请求,返回2次16位key)
    • 特征:
      \r\n\r\n[A-Za-z0-9]{16}$
      Content-Length: 16
      

5.3 加密数据特征

  1. 加密数据上行特征

    • JSP/PHP/JSPX:
      \r\n\r\n[a-zA-Z\d\+\/]{10,}\/[a-zA-Z\d\/]{50}
      
    • ASP/ASPX:
      • ASPX独有特征(包含不可见字符)
      [^\w\s>
      
  2. 加密数据下行特征

    • 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
      
  3. 长连接特征(可绕过):

    Connection: Keep-Alive
    

6. Snort规则检测思路

  1. 第一阶段:检测第一个GET请求的响应体

    • 16位大小写字母或数字
    • 状态码200 OK
    • 设置flowbits: set, bx_first_get_resp
  2. 第二阶段:检测第二个GET请求

    • 满足URL参数弱特征
    • 设置flowbits: set, bx_second_get_req
  3. 第三阶段:检测第二个GET响应体

    • 同第一阶段特征
    • 设置flowbits: set, bx_second_get_resp
  4. 第四阶段:分两种情况检测

    • 情况一
      • 检测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. 检测注意事项

  1. 冰蝎支持自定义HTTP Header,部分特征可被绕过
  2. 对于特殊包类型(如无Content-Length字段),需要特殊处理
  3. 不同脚本类型(ASP/ASPX/JSP/JSPX/PHP)有各自的特征差异
  4. 检测时应考虑多包联合检测(使用flowbits)
  5. 规则中的数字参数(如{50})可根据实际IDS性能调整
冰蝎动态二进制加密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参数 : \w{1,8} 表示密码长度 \d{1,10} 表示密码后跟的数字长度 加密时的URL参数 : 无URL参数本身也是一种特征 5.2 强特征 Accept字段 (可绕过): 存在于冰蝎任何通讯阶段 支持自定义HTTP Header可绕过 UserAgent字段 (可绕过): V1.1+版本从17种常见(较老)UserAgent中随机选取 同一源IP访问某URL时命中多个列表中的UserAgent可确认为冰蝎 传递的密钥 : 密钥是16位随机字符串(大小写字母+数字) 上线过程会进行2次密码协商(2个GET请求,返回2次16位key) 特征: 5.3 加密数据特征 加密数据上行特征 : JSP/PHP/JSPX: ASP/ASPX: ASPX独有特征(包含不可见字符) 加密数据下行特征 : JSP/PHP/ASP/ASPX: 匹配二进制非常见字符 返回状态码200 OK Content-Type: text/html JSPX特殊: 长连接特征 (可绕过): 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规则示例 8. 检测注意事项 冰蝎支持自定义HTTP Header,部分特征可被绕过 对于特殊包类型(如无Content-Length字段),需要特殊处理 不同脚本类型(ASP/ASPX/JSP/JSPX/PHP)有各自的特征差异 检测时应考虑多包联合检测(使用flowbits) 规则中的数字参数(如{50})可根据实际IDS性能调整