第4章 IOC(折衷指标)的概念与类型归纳总结

如果你在安全行业待过一段时间,肯定听过“IOC”这个词。全称叫Indicator of Compromise,中文翻译成“折衷指标”。说白了,就是系统已经被入侵后留下的那些痕迹。我刚开始做威胁狩猎那会儿,经常把IOC和IOA(攻击指标)搞混——后来才发现,IOC是“事后”的证据,IOA是“事中”的行为。这个区别很重要,后面我们会不断提到。

4.1 IOC 到底是什么?

IOC 是已经被确认的攻击证据。它可以是网络流量里的某个 IP,也可以是主机上恶意文件的哈希值,甚至是一条注册表残留项。每个 IOC 都告诉我们:“这里已经被突破了。”

我个人习惯把 IOC 分成两类:确定性 IOC(比如已知恶意文件的SHA256)和关联性 IOC(比如攻击者常用的域名模式)。实战中,关联性 IOC 的提取往往更考验经验。

提示:威胁狩猎的精髓不是收集 IOC,而是把 IOC 串成一条链。单个 IP 可能只是扫描器,但 IP + 域名 + 文件哈希 + 时间戳 就能还原一个攻击活动。

4.2 IOC 的主要类型

我根据实际威胁狩猎的场景,把常见的 IOC 归纳为五大类。每类在提取和关联时都有不同的坑,我一个个讲。

类型 典型示例 提取来源 分析用途
网络 IOC 恶意 IP、C2 域名、URL、UA 字符串 Firewall/Proxy/IDS 日志 阻断外联、溯源攻击源
主机 IOC 文件哈希、注册表键值、进程名、服务名 Sysmon、EDR、Windows 事件日志 确认失陷、清除恶意软件
内存 IOC 进程注入、shellcode 特征、隐藏模块 内存取证、Volatility 输出 发现无文件攻击
账户 IOC 异常登录 IP、不在上班时间的登录、提权事件 AD 审计日志、VPN 日志 检测凭证窃取与横向移动
行为 IOC 异常进程链、罕见计划任务、WMI 持久化 EDR 行为分析、日志关联 发现高级持续性威胁

你想想看,网络 IOC 最容易拿到,但也是最容易被绕过的——攻击者换一个 CDN 节点,你的黑名单就废了。主机 IOC 相对稳定,但需要 EDR 能力才能大规模提取。内存 IOC 攻击者最喜欢藏,因为普通杀软看不见。

4.3 网络 IOC 提取实战

我在项目中遇到过最典型的场景:内网一台服务器突然向外发起大量 DNS 请求,请求的域名看起来像乱码。我快速提取了域名和对应的 IP,然后批量查询威胁情报——果然,关联到一款已知的远控木马。

这里我提供一个简单的网络 IOC 提取代码,从 Apache 访问日志里提取可疑 IP:

import re
from collections import Counter

log_file = "access.log"
pattern = r'(\d+\.\d+\.\d+\.\d+).*?(GET|POST)\s+(\S+)'
ip_counter = Counter()

with open(log_file, 'r') as f:
    for line in f:
        match = re.search(pattern, line)
        if match:
            ip = match.group(1)
            uri = match.group(3)
            if '/admin' in uri or '?cmd=' in uri:
                ip_counter[ip] += 1

# 输出高频可疑 IP
for ip, count in ip_counter.most_common(10):
    if count > 50:
        print(f"{ip}: {count} requests")
警告:我曾经踩过一个坑——一个内部扫描器对某地址发起了上千次请求,结果被误判为恶意 IP。所以提取 IOC 时,一定要先过滤白名单(内部 IP、CDN、合法扫描器),否则会收到大量误报。

4.4 主机 IOC 提取要点

主机 IOC 里最常用的是文件哈希。但哈希也有坑:攻击者只要改一个字节,哈希就变了。所以我建议同时提取文件的模糊哈希(如 ssdeep)和PE 特征(如编译时间、导入表)。这样即使文件被修改,也能关联到同源样本。

我记得有一次分析一个勒索软件家族,攻击者每次都用不同的哈希,但编译时间总是凌晨 3 点,而且导入表都包含相同的加密库——通过这个特征,我们一举关联了 20 多个变种。

4.5 IOC 知识框架

下面这张图把 IOC 的核心类型和它们之间的关联关系画了出来。你可以把它当作威胁狩猎的“地图”。

折衷指标(IOC)分类与关联 折衷指标 网络 IOC 恶意IP / 域名 / URL UA字符串 / 端口 主机 IOC 文件哈希 / 注册表 进程名 / 服务名 内存 IOC Shellcode / 隐藏模块 进程注入 / 钩子 账户 IOC 异常登录 / 时间异常 提权 / 新建账户 行为 IOC 异常进程链 / 持久化 横向移动 / 数据外泄 提示:行为 IOC 通常由多个基础 IOC 组合推导得出,是威胁狩猎的核心输出

4.6 IOC 的关联分析逻辑

提取单个 IOC 只是第一步。真正有价值的是把它们串成一张情报网。我常用的方法是:时间关联 + 实体关联。举个例子,某一时刻内网某台主机同时出现了网络 IOC(外连恶意域名)和主机 IOC(本地生成恶意文件),那基本可以判定失陷。

还有一个我踩过的坑:时间窗口设得太宽,导致关联出大量无关事件。现在我一般把时间窗口设为 5 分钟内,超过这个范围的 IO 相关性极低。

实战经验:你可以在 SIEM 里建一个“IOC 碰撞”查询规则,把威胁情报源(如 AlienVault OTX)的 IOC 列表与内部日志做匹配。我见过很多团队只放黑名单,却忘了定期更新——结果攻击者换了一个 IP,规则就废了。

4.7 IOC 生命周期管理

IOC 不是永久的。一个 IP 今天被报告为恶意,下周可能就被正常服务收回了。所以我建议给每个 IOC 标记“首次发现时间”和“有效时间窗”。通常网络 IOC 有效期为 30 天,文件哈希有效期较长(只要样本没有变种)。

嗯,这里要注意:管理大量 IOC 时,必须做白名单归一化。我记得有个安全团队把 Google 的某个 IP 当成恶意 IP 封锁了,结果全公司访问不了 Gmail——太尴尬了。

4.8 本章小结