| name | detecting-ransomware-precursors-in-network |
| description | 在加密开始前检测网络流量中的勒索软件早期指标,包括初始访问经纪人(IAB)活动、 命令与控制(C2)信标、凭据收集、侦察扫描和暂存行为。使用网络检测工具(Zeek、Suricata、Arkime)、 SIEM 关联规则和威胁情报订阅,识别 Cobalt Strike 信标、Mimikatz 网络特征和 RDP 暴力破解等 勒索软件前驱模式。适合涉及勒索软件前驱检测、基于网络的勒索软件指标或早期预警监控的相关请求。
|
| domain | cybersecurity |
| subdomain | ransomware-defense |
| tags | ["ransomware","detection","network-security","incident-response","defense"] |
| version | 1.0.0 |
| author | mahipal |
| license | Apache-2.0 |
检测网络中的勒索软件前驱活动
适用场景
- 为勒索软件部署前的网络活动构建检测规则(从 Cobalt Strike 部署到加密开始平均只需 17 分钟)
- 监控初始访问经纪人(IAB)指标,这些指标往往先于勒索软件部署出现
- 创建 SIEM 关联规则,将多个前驱事件链接为高置信度告警
- 调优网络检测系统,区分勒索软件暂存行为与正常管理操作
- 调查可能表明勒索软件操作者已建立立足点的可疑网络流量模式
不适用场景:不适用于加密后的响应处置(参见 recovering-from-ransomware-attack)。本技能专注于加密前的检测窗口期,此时遏制措施可以防止数据损失。
前置条件
- 网络检测平台(Zeek/Bro、Suricata 或 Arkime/Moloch)部署在网络 TAP 或 SPAN 端口
- SIEM 平台(Splunk、Elastic Security、Microsoft Sentinel 或 QRadar)接入网络日志
- 覆盖勒索软件 IOC 的威胁情报订阅(CISA、abuse.ch、OTX、MISP)
- 来自核心路由器和防火墙的网络流量数据(NetFlow/IPFIX)
- 来自内部解析器的 DNS 查询日志
- 用于事件调查的全量抓包能力
工作流程
步骤 1:识别网络流量中的勒索软件杀伤链阶段
将可网络观测的指标映射到各个加密前阶段:
| 杀伤链阶段 | 网络指标 | 检测来源 |
|---|
| 初始访问 | RDP 暴力破解、VPN 凭据填充、钓鱼回调 | 防火墙日志、IDS、代理日志 |
| C2 建立 | Cobalt Strike 信标(HTTPS/DNS)、Sliver/Brute Ratel 回调 | Zeek SSL/HTTP 日志、DNS 日志 |
| 凭据收集 | NTLM 中继、Kerberoasting、DCSync 流量 | Zeek Kerberos/NTLM 日志、DC 日志 |
| 侦察 | 内部端口扫描、AD 枚举(LDAP/SMB) | Zeek conn.log、流量数据 |
| 横向移动 | PsExec/WMI/WinRM 流量、RDP 跳板、SMB 文件复制 | Zeek SMB/DCE-RPC 日志 |
| 暂存 | 数据聚合、压缩包创建、云上传准备 | 代理日志、DNS 日志、DLP |
步骤 2:部署网络检测规则
Suricata 常见勒索软件前驱规则:
alert tls $HOME_NET any -> $EXTERNAL_NET any (msg:"RANSOMWARE PRECURSOR - Cobalt Strike Default TLS Certificate"; tls.cert_subject; content:"Major Cobalt Strike"; sid:3000001; rev:1;)
alert dns $HOME_NET any -> any 53 (msg:"RANSOMWARE PRECURSOR - Cobalt Strike DNS Beacon Pattern"; dns.query; pcre:"/^[a-z0-9]{3}\.[a-z]{4,8}\./"; threshold:type both, track by_src, count 50, seconds 60; sid:3000002; rev:1;)
alert tcp $HOME_NET
Zeek 行为检测脚本:
# detect_ransomware_precursors.zeek
# 检测大量 SMB 连接失败(凭据测试)
@load base/protocols/smb
module RansomwarePrecursor;
export {
redef enum Notice::Type += {
SMB_Brute_Force,
Suspicious_Internal_Scan,
Excessive_DNS_Queries,
SMB_Admin_Share_Access,
};
const smb_fail_threshold = 10 &redef;
const scan_threshold = 50 &redef;
const dns_query_threshold = 200 &redef;
}
global smb_fail_count: table[addr] of count &default=0 &create_expire=5min;
global conn_count: table[addr] of set[addr] &create_expire=1min;
event smb2_message(c: connection, hdr: SMB2::Header, is_orig: bool) {
if (hdr$status != 0) {
++smb_fail_count[c$id$orig_h];
if (smb_fail_count[c$id$orig_h] >= smb_fail_threshold) {
NOTICE([$note=SMB_Brute_Force,
$msg=fmt("Host %s has %d failed SMB attempts", c$id$orig_h, smb_fail_count[c$id$orig_h]),
$src=c$id$orig_h,
$identifier=cat(c$id$orig_h)]);
}
}
}
event new_connection(c: connection) {
if (c$id$orig_h in Site::local_nets && c$id$resp_h in Site::local_nets) {
if (c$id$orig_h !in conn_count)
conn_count[c$id$orig_h] = set();
add conn_count[c$id$orig_h][c$id$resp_h];
if (|conn_count[c$id$orig_h]| >= scan_threshold) {
NOTICE([$note=Suspicious_Internal_Scan,
$msg=fmt("Host %s connected to %d internal hosts in 1 min", c$id$orig_h, |conn_count[c$id$orig_h]|),
$src=c$id$orig_h,
$identifier=cat(c$id$orig_h)]);
}
}
}
步骤 3:创建 SIEM 关联规则
Splunk 勒索软件前驱链关联:
| tstats count FROM datamodel=Network_Traffic
WHERE earliest=-24h All_Traffic.dest_port IN (445, 135, 139, 3389, 5985, 5986)
AND All_Traffic.src_ip IN 10.0.0.0/8
AND All_Traffic.dest_ip IN 10.0.0.0/8
BY All_Traffic.src_ip, All_Traffic.dest_port, _time span=1h
| stats dc(All_Traffic.dest_port) as port_count,
values(All_Traffic.dest_port) as ports,
count as total_conns
BY All_Traffic.src_ip
| where port_count >= 3 AND total_conns > 50
| rename All_Traffic.src_ip as src_ip
| lookup threat_intel_ioc ip as src_ip OUTPUT threat_type
| eval risk_score = case(
port_count >= 5 AND total_conns > 200, "CRITICAL",
port_count >= 3 AND total_conns > 50, "HIGH",
1=1, "MEDIUM")
| table src_ip, ports, port_count, total_conns, risk_score, threat_type
Microsoft Sentinel KQL - 勒索软件前驱关联:
let timeframe = 24h;
let RDPBruteForce = SecurityEvent
| where TimeGenerated > ago(timeframe)
| where EventID == 4625
| where LogonType == 10
| summarize FailedRDP = count() by TargetAccount, IpAddress, bin(TimeGenerated, 1h)
| where FailedRDP > 10;
let SuspiciousSMB = SecurityEvent
| where TimeGenerated > ago(timeframe)
| where EventID == 5145
| where ShareName has "ADMIN$" or ShareName has "C$" or ShareName has "IPC$"
| summarize AdminShareAccess = count() by SubjectUserName, IpAddress, bin(TimeGenerated, 1h)
| where AdminShareAccess > 5;
let ServiceInstalls = SecurityEvent
| where TimeGenerated > ago(timeframe)
| where EventID == 7045
| where ServiceName has_any ("PSEXESVC", "meterpreter", "beacon");
RDPBruteForce
| join kind=inner SuspiciousSMB on IpAddress
| project TimeGenerated, IpAddress, TargetAccount, FailedRDP, SubjectUserName, AdminShareAccess
| extend AlertTitle = "Ransomware Precursor: RDP Brute Force + Admin Share Access"
步骤 4:集成威胁情报
配置已知勒索软件基础设施的自动 IOC 订阅:
curl -s https://feodotracker.abuse.ch/downloads/ipblocklist.csv | \
grep -v "^#" | cut -d, -f2 > /opt/threat-intel/feodo_ips.txt
curl -s https://urlhaus.abuse.ch/downloads/csv_recent/ | \
grep -v "^#" | cut -d, -f3 > /opt/threat-intel/urlhaus_urls.txt
curl -s https://threatfox.abuse.ch/export/csv/recent/ | \
grep -i "ransomware" | cut -d, -f3 > /opt/threat-intel/ransomware_iocs.txt
curl -s https://www.cisa.gov/sites/default/files/feeds/known_exploited_vulnerabilities.json | \
python3 -c "import json,sys; data=json.load(sys.stdin); [print(v['cveID'],v['vendorProject'],v['product']) for v in data['vulnerabilities'] if 'ransomware' in v.get('knownRansomwareCampaignUse','').lower()]"
步骤 5:建立告警分类和上报流程
根据前驱置信度定义分类流程:
| 告警类型 | 置信度 | 响应时间 | 处置措施 |
|---|
| 已确认 Cobalt Strike 信标 | 高 | 15 分钟 | 立即隔离主机,触发 IR |
| 非 DC 发起的 DCSync/Kerberoasting | 高 | 15 分钟 | 禁用账户,隔离主机,触发 IR |
| 内部端口扫描 + 管理共享访问 | 中高 | 30 分钟 | 调查源主机,检查 EDR 遥测数据 |
| 内部主机 RDP 暴力破解 | 中 | 1 小时 | 确认是否为合法管理操作,检查主机 |
| 异常 DNS 查询量 | 低中 | 4 小时 | 检查 DNS 隧道,与其他告警关联分析 |
核心概念
| 术语 | 定义 |
|---|
| 勒索软件前驱(Ransomware Precursor) | 勒索软件加密前的网络活动,包括 C2 通信、横向移动和数据暂存 |
| 驻留时间(Dwell Time) | 从初始入侵到勒索软件部署的时间,平均 21 天,但有时短至 17 分钟 |
| 初始访问经纪人(IAB) | 在暗网市场向勒索软件运营者出售已入侵网络访问权限的威胁行为者 |
| 信标(Beaconing) | 植入物(Cobalt Strike、Sliver)定期向 C2 回调,通过分析连接时序模式可检测 |
| Kerberoasting | 请求 Kerberos 服务票据进行离线破解的凭据收集技术,可通过异常 TGS-REQ 模式检测 |
| DCSync | 使用目录复制服务从域控制器提取密码哈希的技术,是勒索软件的关键前驱指标 |
工具与系统
- Zeek(原 Bro):网络分析框架,为 SMB、Kerberos、DNS、HTTP 和 TLS 连接生成结构化日志
- Suricata:高性能 IDS/IPS,支持协议分析和多线程,用于勒索软件特征检测
- Arkime(原 Moloch):全量抓包与检索平台,用于网络事件的深度取证调查
- RITA(Real Intelligence Threat Analytics):开源工具,检测 Zeek 日志中的信标行为、DNS 隧道和长连接
- AC-Hunter:Active Countermeasures 的网络威胁狩猎平台,用于信标检测和 C2 识别
常见场景
场景:检测制造业网络中的 LockBit 前驱活动
背景:一家制造企业的 SOC 收到来自工程部门工作站(10.1.5.42)异常 SMB 流量的告警。该工作站在凌晨 2:00 的 5 分钟内连接了 47 台内部主机的 445 端口。
分析步骤:
- Zeek conn.log 分析显示 10.1.5.42 在 01:55-02:05 间对 47 个唯一内部 IP 的 445、135 和 3389 端口发起连接
- Zeek ssl.log 发现每 60 秒向 185.x.x.x 发送一次包含固定 48 字节载荷的出站 HTTPS 连接(Cobalt Strike 信标模式)
- RITA 信标分析确认该外部 IP 的信标评分极高(0.96),抖动间隔 60 秒
- Zeek kerberos.log 显示 10.1.5.42 对多个 SPN 账户发起 TGS-REQ(Kerberoasting)
- SMB tree_connect 事件显示在 12 台主机上访问了 ADMIN$ 共享(横向移动暂存)
- 遏制措施:隔离主机,重置工程用户凭据,部署 C2 IP 封锁规则
- 在勒索软件部署前完成全面 IR 响应
注意事项:
- 不要在未确认源头是否为授权扫描器的情况下,将内部端口扫描视为漏洞扫描器活动而忽视
- 不要孤立地处理单个低严重度告警(DNS 异常 + SMB 访问 + 登录失败),应关联为高严重度事件链
- 不要为避免误报而将检测阈值设置过高,从而遗漏低速侦察活动
- 不要忽视加密流量分析(JA3/JA4 指纹),即使在 TLS 隧道中也能识别 Cobalt Strike
输出格式
## 勒索软件前驱检测告警
**告警 ID**:[SIEM 生成的 ID]
**检测时间**:[时间戳]
**源主机**:[IP / 主机名]
**置信度**:[高 / 中 / 低]
**杀伤链阶段**:[初始访问 / C2 / 凭据收集 / 侦察 / 横向移动 / 暂存]
### 已检测指标
| 指标 | 来源 | 详情 | MITRE ATT&CK |
|------|------|------|--------------|
| [类型] | [Zeek/Suricata/SIEM] | [描述] | [T-ID] |
### 关联事件链
1. [时间戳] - [事件 1]
2. [时间戳] - [事件 2]
3. [时间戳] - [事件 3]
### 建议处置措施
- [ ] 将源主机从网络隔离
- [ ] 检查主机上的 EDR 遥测数据
- [ ] 重置受影响用户账户的凭据
- [ ] 封锁已识别的 C2 基础设施
- [ ] 上报至事件响应团队