CC攻击能查到源头吗?溯源与攻击者画像实战

遇到 CC 攻击时,多数站长第一反应是「能不能查到是谁」。本文用 9 个问答讲清 CC 攻击溯源的真实能力边界、需要提前固定的日志证据、从 ASN 与 UA 指纹读出攻击工具画像的方法、代理池与秒拨 IP 的区分依据,以及哪些反制动作会踩到法律红线。

Q:CC 攻击真的能查到源头吗?

先把三件事拆开,不要混为一谈:

  • 查到源 IP:几乎一定查得到,但 CC 的源 IP 基本是代理池、秒拨 IP 或被感染的设备,本身不等于攻击者。
  • 查到攻击资源:多数情况可以,能判断对方用的是固定 IP 段、代理池,还是秒拨 IP 加无头浏览器。
  • 查到自然人:极难。通常需要域名、支付、账号等现实线索,并须由执法机关依法调取,服务商和站长都没有这个权限。

所以实战里 溯源目标应定在「查清攻击资源与工具画像」,据此调整防护与成本策略,而不是期待一键定位到人。凡是宣称能一键溯源到真人的工具,都要保留怀疑。

Q:溯源前必须先固定哪些证据?

取证的前提是日志本身站得住脚,三个条件缺一不可:

  • 字段完整:默认日志缺少溯源需要的耗时与代理头信息。
  • 时间可信:服务器时间未同步,就永远无法和 CDN、WAF 侧日志对齐。
  • 未被篡改:日志要异地或远端留存,攻击期间别在同一台机器上边打边改配置。
# 1) 补齐日志字段(nginx.conf 的 http 段)
log_format forensic '$remote_addr - $remote_user [$time_local] "$request" '
                    '$status $body_bytes_sent "$http_referer" "$http_user_agent" '
                    'rt=$request_time urt=$upstream_response_time '
                    'xff="$http_x_forwarded_for" host="$host"';

# 2) 确认时间已同步
timedatectl status | grep -E 'System clock|NTP'
chronyc tracking 2>/dev/null | head -3

# 3) 日志至少保留 90 天并压缩归档
/var/log/nginx/access.log {
    daily
    rotate 90
    compress
    dateext
}

关键点:字段要在攻击发生前就补齐。出事后再改配置,之前那段时间的日志永远是残缺的,补不回来。

Q:怎么从日志里看出攻击来源属于哪一类?

不要一个个看 IP,要按维度做聚合。最有信息量的四个维度是 ASN、C 段、UA、请求间隔:

# Top 30 源 IP
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -30

# 把 IP 映射到 ASN 与归属,看来源是否集中在少数运营商
awk '{print $1}' /var/log/nginx/access.log | sort -u \
  | head -200 | while read ip; do echo "$ip $(whois -h whois.cymru.com " -v $ip" | tail -1)"; done

# Top UA(判断工具画像)
awk -F'"' '{print $6}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -20

读法很直接:IP 高度集中在 IDC 段,是代理性攻击;分散在住宅与移动网段,多为被感染设备或秒拨 IP。UA 只有两三种且高度集中,说明是同一套脚本;UA 版本跨度极大,说明对方在轮换工具或做了伪造。

Q:代理池和秒拨 IP 怎么区分?

只看两个数就够:独立 IP 数量和单 IP 平均请求数。

  • 代理池:IP 数量多,但每个 IP 请求数少且 ASN 高度分散,还常带异常代理头(多个 Via、X-Forwarded-For 链路过长)。
  • 秒拨 IP:同一 C 段短时间大量 IP 轮换,每个 IP 只活跃几分钟,归属是境内运营商但反向解析落在 IDC 段。
  • 固定 IP 段:IP 少、每 IP 请求数极高、持续数小时不换,最容易被 ipset 直接封掉。
# 统计「IP 数 / 请求数 / 每 IP 平均请求数」
awk '{c[$1]++; n++} END {print "unique_ips="length(c), "requests="n, "avg="n/length(c)}' \
  /var/log/nginx/access.log

这个比值就是攻击成本结构的指纹。平均值低于 5,说明对方在大量轮换 IP,单靠封 IP 收益很低,应转向行为层拦截;平均值高于 500,说明资源很便宜,直接封段即可。

Q:UA 和请求指纹能提供什么线索?

指纹给出的是工具画像,不是人的身份,但对防护非常有用:

  • UA 与真实浏览器特征不匹配:UA 写着最新版 Chrome,但 TLS 指纹(JA3)是 Go 或 Python 客户端。
  • 头信息残缺:缺少 Accept-Language,Accept-Encoding 只有一种,从不携带 Cookie。
  • 版本陈旧且集中:整批请求都用同一个老版本 UA,是脚本框架的默认值。

把这些特征写成规则,就能从「封 IP」升级到「拦工具」。例如 Nginx 里按 UA 与缺失头做初筛,再把 UA 落到独立日志持续观察,比一次性黑名单更稳。要注意 UA 可被任意伪造,它只能作为加权信号,不能作为唯一判据。

Q:能不能主动反制攻击者?

不能,而且这条线很清楚。主动回击、反向扫描对方主机、挂马或植入、发起对等流量攻击,都可能构成违法,还会把你自己从受害方变成违法方,同时暴露源站。合法且有效的动作只有这些:

# 带超时的自动封禁,到期自动解封,避免长期误伤
ipset create ccbl hash:ip timeout 3600
iptables -I INPUT -m set --match-set ccbl src -j DROP
# 命中可疑特征时加入黑名单
ipset add ccbl 203.0.113.10 1800
  • 止损类:限速、加并发上限、下发行人机验证、切清洗。
  • 取证类:日志封存、哈希校验、时间线整理、证据包输出。
  • 上报类:向云服务商提交攻击 IP 清单,向网警或 CNCERT 报案并提供证据包。收到敲诈勒索信息时,务必保留原始记录并直接报案。

核心原则:把取证结果用于提升攻击成本,而不是用于报复。

Q:什么情况下才值得花时间做完整溯源?

溯源是事后成本,不是应急手段。先判断性价比,满足两条以上再投入:

  • 攻击持续超过 3 天,不是一次性脉冲。
  • 有明确商业指向:同行竞争窗口期、伴随敲诈信息、关键业务发布节点。
  • 损失可量化:能给出订单损失、退款、带宽超量的具体金额。
  • 需要配合报案或平台申诉,必须有成体系的证据材料。

不满足上述条件时,正确顺序是先止损(限速、封禁、清洗),再谈溯源。攻击进行中花时间做分析,本身就是被牵着走的次优选择。

Q:一套完整的取证流程该怎么做?

五步走,每一步都留有产物,避免做完发现取证不可用:

  • 第一步 固化环境:确认时区与 NTP 同步状态,记录服务器当前时间。
  • 第二步 完整提取:把轮转过的 .gz 一并取出,覆盖攻击全时段,不要只取当天。
  • 第三步 归一化统计:按 IP、ASN、UA、目标路径、分钟级时间桶分别聚合,形成时间线。
  • 第四步 三方交叉:源站日志、WAF 日志、CDN 日志对齐同一时间窗,确认拦截前后的真实到达量。
  • 第五步 封存输出:生成证据包并做哈希,保证事后不可否认。
# 打包并生成校验值,便于后续比对与提交
tar czf cc-attack-evidence-$(date +%Y%m%d).tar.gz /var/log/nginx/access.log*
sha256sum cc-attack-evidence-*.tar.gz > cc-attack-evidence.sha256
# 统计攻击峰值时段,供报案材料引用
awk '{print substr($4,14,5)}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -10

递交材料时,时间线加原始日志加校验值这三样比任何分析结论都更有说服力。

Q:还有什么补充建议?

  • 溯源的前置是防护。先把默认限速、UA 初筛、并发上限做好,攻击频率下降后取证难度也同步下降。
  • 日志是资产,保留 90 天以上并异地存放。等出事那天才开始找日志,基本什么都找不到。
  • 别在线上做取证实验,尤其不要为了复现而放开限速或关闭 WAF,那是给攻击者送礼。
  • 不要过度承诺。向老板或客户汇报时,说清能查到资源画像、难查到自然人,比事后解释要轻松得多。

一句话总结:CC 攻击溯源的真实价值,是搞清对手在用哪一档成本的资源,然后把防护做到让那一档资源失效。