基于流量的入侵原因自动化分析

基于流量关联与机器学习的Webshell入侵溯源方案,实现从海量流量中自动化定位入侵原因。

而针对海量的租户和攻击事件,如何快速的定位入侵原因,是云平台安全治理的基石。快速定位目前有哪些0 Day/N Day/攻击手法在云平台上造成大批入侵,可以快速部署拦截策略来控制蠕虫的蔓延保证云平台的稳定性和信誉。那么基于云上的流量数据,如何从每秒数亿次的瞬时流量中,精准定位出那一颗导致 Webshell 落地的“子弹”?

针对海量的流量,人工分析入侵原因已经是不可行的路径了,本文介绍如何基于“流量关联”与“机器学习”实现从 Webshell 发现到自动化的入侵溯源。

核心挑战

面对云上海量实用不同协议乃至加密通信的流量,当HIDS 报出一个webshell /var/www/html/css/shell.php 时,溯源通常面临几个难点:

  1. 时间断层:Webshell 可能是半个月前通过一个 0-day 漏洞写入的。
  2. 特征对抗:攻击流量可能经过 Hex、Base64 编码或混淆,绕过传统的 WAF 规则。
  3. 信息缺失:攻击可能来自非标端口缺失攻击payload信息采集,可能走的加密协议,即使捕获流量也无法分析

具体实现

我们可以用来分析的流量数据主要有两种:
全量五元组: 源IP地址、源端口、目的IP地址、目的端口和传输层协议
通用协议捕获的流量数据: 如HTTP、Redis、SQL等

我们的溯源逻辑分为两条技术路径:针对流量数据基于规则与 IOA(攻击特征表) 的确定性关联,以及针对五元组基于机器学习的概率预测。

1. 流量关联:寻找案发现场的“指纹”

流量关联的核心逻辑是:寻找流量中Payload与Webshell文件写入之间的因果联系。

1.1 通用场景:时间窗口关联

最直接的溯源方式是时间关联:以主机检测到 Webshell 的时间点为锚点,向前向后关联可疑的 HTTP 请求。然后通过Webshell的相关特征,从不同维度关联可能的攻击请求。可以用于关联的维度如下:

维度匹配逻辑说明
文件名URI 中包含 Webshell 文件名如检测到 /uploads/x.php,则搜索包含 x.php 的请求
文件内容请求体中包含 Webshell 特征码如请求体中存在 eval($_POST 等特征
目标路径URI 路径与 Webshell 所在目录匹配如 Webshell 在 /uploads/ 下,关联该目录所有写入请求

在进行特征关联前,需要对可以攻击请求进行自动化解码和归一化预处理,例如:

  • 多层解码:针对 url_encode -> base64 -> hex 的嵌套混淆进行递归还原。
  • Payload 归一化:例如针对 DedeCMS 常见的数组注入攻击,需要识别特殊的 URL 参数模式(如 /plus/download.php?open=1&arrs1[]=99&arrs1[]=102...)并将其还原为原始的攻击指令。

1.2 场景二:从“Webshell 访问流量”反推“入侵流量”

除了HIDS本地检测Webshell,从流量中识别Webshell被访问的行为也可以检出Webshell。通常从流量中可以通过如下思路识别Webshell访问行为:

  • request + response 特征
    • 如命令执行+命令执行结果(shell特征)
    • 典型:cmd=whoami ↔ www-data,cmd=id ↔ uid=0(root)
  • Webshell payload 特征
    • 常见一句话特征关键函数组合(固定参数名 z0/z1/z2,响应格式 X@Y...X@Y等)、特定工具的协议/字段形态(菜刀/蚁剑/冰蝎/哥斯拉等)
  • 统计特征异常
    • 访问 IP 分布异常、孤立页面(空 referer 或 referer=自身)、URI 形态异常(随机串/高熵/短周期爆发)
  • 请求重放验证
    • 请求重放通过响应内容确认

在这种场景的溯源更为直接, 通过提取攻击者 IP(会话特征、UA等),用该 IP 关联当天全部 HTTP 日志 → 清洗可疑请求 → 与 IOA 表匹配 → 找到真正的“写入/利用”请求。

1.3 IOA(攻击特征表):把“有效攻击”从海量请求里抠出来

IOA 不同于 IOC(失陷指标),它侧重于攻击行为特征。我们通过对海量攻击样本的抽象,建立了一套动态更新的 IOA 正则库。基于该正则可以将可以的HTTP流量筛选出相应的攻击证据。
通过将攻击请求关联IOA特征提取出相应的攻击特征,等于提取有效的攻击及其meta信息,从而压缩数据可以长期沉淀成离线攻击特征库,可以应对历史中入侵的Webshell近期被发现的case。

HTTP IOA 示例

IOA ID攻击类型匹配字段
DEDECMS_UPLOADDedeCMS后台上传uri: /file_manage_control.php/ && post: /filename=(.*.php)/ && ret_code: 200
PHPMYADMIN_IMPORTphpMyAdmin利用写入myadmin\/+(import
DEDECMS_UPLOADDedeCMS文件上传(\/+tpl\.php)

四层 IOA 示例

IOA ID攻击类型匹配字段
MYSQL_GENERAL_LOGGeneral_log 写 Shellset[\s\S]*?general_log_file
MYSQL_OUTFILEINTO OUTFILE 写 Shellselect .?into.?(outfile
REDIS_DBFILE_SHELLRedis写入Shellset[\s]?dbfilename[\s]?[\S]*?.php

2.机器学习:穿透五元组的“战争迷雾”

在很多业务场景下(如非标准端口、加密隧道或仅存四层流量),我们无法获取完整的 Payload。此时,只有网络层五元组(源 IP、源端口、目的 IP、目的端口、协议)可供分析。五元组数据可以用来分析的信息很少,人工很难通过其判断真实的入侵来源,这时就需要结合专家经验来进行特征工程补全上下文信息了

1. 特征工程:赋予数据“上下文”

单条五元组数据信息非常单一的,但通过特征工程,我们可以丰富出攻击的上下文:

  • 访问密度特征:人工分析时,如果一个IP连接了云端数千台机器,则更类似于扫描器;如果连接的都是同一类型的受害者,甚至连端口也有比较强的一致性,则入侵嫌疑更高。那么这些特征完全可以通过数据统计来转化为向量。
  • 基线偏离度:如很多服务(PostgreSQL/MangoDB)访问来源都很固定,有的服务(如HTTP)的同一IP访问频度分桶明显成正太分布。可以构建服务器的日常访问基线,然后通过关联对IP进行打标。这里需要注意排除一些扫描IP,避免他们被纳入基线之中。
  • 目标风险权重:目标端口是否为 6379 (Redis)、2375 (docker) 等高危利用端口,风险的量化可以通过历史的入侵原因数据进行公正的评分。
  • 来源IP画像: 来源IP是否先天高危(情报、ASN、归属地)
  • 时间序列特征: 与webshell告警时间距离、前后的访问特征。该IP的活跃时间段特征等
    …

2. 样本构建

有了特征工程增强的五元组,接下来是要对五元组进行打标构建训练样本,主要通过三种方式进行打标:

  1. 关联样本:基于通过流量关联分析出来的数据作为训练样本
  2. 聚类分析:对所有主机连接进行聚类,将模式近似的请求基于人工分析确认进行批量标注
  3. 人工标注:某些特殊的样本,需要通过人工的入侵原因分析进行确认(Webshell 明显特征是由 SQLServer 写入的,或者蠕虫中就携带了传播所利用的漏洞),将该时间段内符合模式的五元组人工分析进行标注

3. 模型预测

将五元组处理后的特征矩阵,训练二分类模型,模型会对入侵时间点附近的每一条五元组进行评分,输出入侵概率值。概率值越接近 1,意味着该条连接是入侵原因的可能性越大。
模型选择上,不同模型差别不大,但XGBoost通常效果较好,因为XGBoost对对非线性、稀疏/分桶特征较为友好。

结语

通过将“流量关联”与“机器学习”相结合,我们构建了一套自动化的 Webshell 溯源体系。对于简单攻击,通过关联可以给出完整的攻击 Payload 还原情景。对于复杂或加密攻击,机器学习模型能够穿透协议层,从五元组的统计分布中嗅探出攻击者的蛛丝马迹。在海量流量面前,攻击者无所遁形。