实用脚本怎么看这波进攻的威胁程度?

wen 实用脚本 2

实用脚本怎么看这波进攻的威胁程度?——从日志分析到攻击路径推演的量化指南


目录导读

  1. 引言:为什么“威胁程度”不能靠感觉判断?
  2. 核心概念:进攻威胁度的三个维度(暴露面、杀伤力、持久性)
  3. 实用脚本拆解:从流量日志到风险评分的四步法
    • 1 第一步:特征提取(正则与哈希匹配)
    • 2 第二步:上下文关联(IP信誉、用户代理、时间窗口)
    • 3 第三步:行为打分(基于MITRE ATT&CK框架)
    • 4 第四步:决策输出(高/中/低危 + 行动建议)
  4. 实战案例:一次WebShell上传的威胁评估全过程
  5. 常见误区与优化:为什么你的脚本会误报?
  6. 延伸思考:如何用同一套脚本应对0day与内网横向移动?
  7. 问答环节(FAQ)

引言:为什么“威胁程度”不能靠感觉判断?

安全运营中最常见的错误是看到“攻击源IP”、“POST请求”或“异常UA”就拉响红色警报,但事实上,爬虫扫描、漏洞探测、实际利用之间的威胁等级天差地别,一个缺乏量化标准的团队,要么被海量告警淹没,要么错过致命一击,本文提供的“实用脚本”不是某款商业软件,而是一套基于日志、可运行的Python/bash逻辑,帮助你将攻击意图量化为0-100的评分,从而回答“这波进攻到底要不要立刻阻断”。

实用脚本怎么看这波进攻的威胁程度?

核心概念:进攻威胁度的三个维度

  • 暴露面(Exposure):攻击目标是否真实存在漏洞?例如目标路径为 /admin/login.php,但系统实际是 Node.js,则暴露面极低。
  • 杀伤力(Impact):若攻击成功,能否获得RCE、数据泄露或权限提升?这取决于Payload类型(命令注入 > XSS > 扫描探测)。
  • 持久性(Persistence):攻击是否试图写入文件、创建计划任务或修改注册表?这类行为会显著拉高威胁分数。

关键公式威胁评分 = 暴露面权重(30%) + 杀伤力权重(50%) + 持久性权重(20%),具体权重可根据企业资产类型调整。

实用脚本拆解:从流量日志到风险评分的四步法

以下逻辑可直接用Python实现,或通过grep + awk在Shell中快速复现。

1 第一步:特征提取(正则与哈希匹配)

# 简单示例:从access.log提取攻击特征
import re
patterns = {
    'sql_inj': r'%27|union.*select|sleep\(',
    'xss': r'<script>|alert\(|onerror=',
    'rce': r'cat /etc/passwd|whoami|base64.*-d',
    'webshell': r'\.php\?.*eval|assert\(|系统命令'
}
log_line = "GET /upload/evil.php?cmd=whoami HTTP/1.1"
score = sum(1 for key, p in patterns.items() if re.search(p, log_line))
# 此处仅作演示,需结合大小写归一化、URL解码等

2 第二步:上下文关联(IP信誉、用户代理、时间窗口)

  • IP信誉:本地维护一个黑名单IP段(如Tor出口、云机房),命中则增加20分。
  • UA异常curl/7.68.0python-requests 直接扣5分(低风险),但Mozilla/5.0 (Windows NT 10.0; Win64; x64) 且出现攻击特征则高风险。
  • 时间窗口:每秒请求数 > 30 次视为扫描行为(降权),在 00:00-04:00 的定向利用加10分。

3 第三步:行为打分(基于MITRE ATT&CK框架)

# 假设已提取到攻击类型和命中次数
case $attack_type in
  "SQL注入") score=$((score + 30)) ;;
  "命令注入") score=$((score + 50)) ;;
  "WebShell上传") score=$((score + 70)) ;;
  "目录穿越") score=$((score + 40)) ;;
esac
# 如果发现后续有写文件操作,额外加20分

4 第四步:决策输出(高/中/低危 + 行动建议)

  • 0-30分:灰名单处理,记录到日志,不阻断。建议:定期复盘。
  • 31-60分:中危,触发速率限制或二次验证。建议:延长观察时间。
  • 61-100分:高危,立即拉黑IP并通知SOC。建议:提取PCAP,回溯前10分钟流量。

实战案例:一次WebShell上传的威胁评估全过程

攻击日志(简化):

2024-02-14 10:00:01 POST /api/upload.php HTTP/1.1 | IP: 45.155.205.xx | UA: Mozilla/5.0 | body="filename=x.jpg&content=<?php system($_GET['cmd']);?>"
  • 特征提取:命中 webshell 模式(+10分),但无明确命令执行(仅创建文件)。
  • 上下文关联:IP来自俄勒冈机房(+8分),UA伪装成Chrome但不匹配真实系统(+5分)。
  • 行为打分:WebShell上传属于高杀伤力(+70分),但系统未实际解析该后缀(暴露面低,-20分)。
  • 持久性:无后续访问该文件的行为(-10分)。
  • 总评分10+8+5+70-20-10 = 63分高危但不紧急,建议:隔离该IP,立即删除文件。

常见误区与优化:为什么你的脚本会误报?

  • 只匹配Payload,不验证上下文union select 出现在 search.php 的接口,但参数已被PDO预编译。优化:添加“目标技术栈”白名单(如判断响应头 X-Powered-By: PHP/7.4)。
  • 忽略攻击链的多步特征,单条日志显示为低危,但5分钟内出现“扫描 + 上传 + 执行”组合,应强制升级为高危。优化:在脚本中维护一个5分钟的滑动窗口,累加所有相关攻击的分数。
  • 依靠静态正则,不处理编码绕过str_replace('select','') 并不影响 selselectect优化:先进行URL解码、HTML实体解码,再做二次匹配。

延伸思考:如何用同一套脚本应对0day与内网横向移动?

  • 针对0day:虽然无法预知漏洞签名,但可通过行为基线检测,例如某进程突然大量执行 whoami 并尝试连接外部IP,即使Payload未知,仍能给予高分。
  • 针对横向移动:脚本需增加“内网IP信任度”字段,若攻击源来自内网,但UA异常且目的端口为3389,应触发高危告警,而不是默认信任内网流量。

问答环节(FAQ)

Q1:脚本的评分权重需要根据行业调整吗? 是的,例如金融行业对“数据窃取”类的杀伤力权重为70%,而对“爬虫”的权重为10%,建议每季度回顾一次误报率,用历史数据调整权重。

Q2:如果日志中没有完整的请求体(如JSON POST),怎么办? 需要额外解析WAF或API网关的日志,或者开启 mod_dumpio 模块,否则脚本只能基于URL和HEADER判断,会漏掉一部分攻击。

Q3:这套脚本能否直接用于WAF加黑? 不建议,脚本的评分应作为决策参考,而非自动化阻断,因为高评分可能源自内部安全扫描器(如nessus),需先排除白名单IP。


(全文完)

抱歉,评论功能暂时关闭!