ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

使用 Suricata IDS 签名检测网络扫描:从阈值规则到自动化分析(Anthropic-Cybersecurity-Skills 实战指南)

使用 Suricata IDS 签名检测网络扫描:从阈值规则到自动化分析(Anthropic-Cybersecurity-Skills 实战指南) 使用 Suricata IDS 签名检测网络扫描从阈值规则到自动化分析Anthropic-Cybersecurity-Skills 实战指南【免费下载链接】Anthropic-Cybersecurity-Skills817 structured cybersecurity skills for AI agents · Mapped to 6 frameworks: MITRE ATTCK, NIST CSF 2.0, MITRE ATLAS, D3FEND, NIST AI RMF MITRE F3 (Fight Fraud) · agentskills.io standard · Works with Claude Code, GitHub Copilot, Codex CLI, Cursor, Gemini CLI 20 platforms · 29 security domains · Apache 2.0项目地址: https://gitcode.com/GitHub_Trending/an/Anthropic-Cybersecurity-Skills导读网络扫描Network Scanning是几乎所有攻击活动的第一步——攻击者借助 Nmap、Masscan、ZMap 等工具枚举存活主机、开放端口、运行服务与操作系统版本为后续渗透建立侦察基础。本文以 Anthropic-Cybersecurity-Skills 仓库中的detecting-network-scanning-with-ids-signatures技能为骨架系统讲解如何基于 Suricata / Snort 的签名检测signature-based、阈值检测threshold-based与流量异常分析识别 SYN、FIN、Xmas、NULL、UDP、ACK 等各类扫描手法并借助本仓库提供的 检测脚本 与 API 参考文档 实现扫描告警的自动化关联与研判。读完本文你将掌握一套可直接落地的 IDS 扫描检测规则集、阈值调优方法与告警分析工作流。为什么要在侦察阶段就拦截扫描在 MITRE ATTCK 的战术框架中侦察Reconnaissance位于攻击链最前端。本技能在 SKILL.md 中明确指出扫描通常是攻击的第一阶段识别这一侦察活动能为后续防御赢得宝贵的提前量。从仓库的 MITRE ATTCK 覆盖表 可以看到该技能对应的核心 ATTCK 技术包括T1046网络服务发现Network Service Discovery——通过端口扫描识别目标开放的服务T1595主动扫描Active Scanning——攻击者主动探测受害者基础设施T1040网络嗅探、T1557中间人、T1071应用层协议作为关联补充主机探测Host Sweep在脚本实现中对应T1018远程系统发现。同时技能元数据映射到 NIST CSF 2.0 的PR.IR-01安全响应计划、DE.CM-01持续监控、ID.AM-03资产清点与PR.DS-02数据保护。这意味着一条扫描检测能力同时覆盖攻击侧与防御侧两大框架既可用于红队验证检测覆盖也可用于 SOC 构建纵深监控。IDS 检测扫描的核心手段有三类签名检测匹配已知扫描工具的报文特征如 Nmap 的 T1 探测报文、Masscan 的特定窗口大小、NSE 脚本的 User-Agent阈值检测在时间窗口内统计连接尝试次数超过阈值即告警防慢速扫描异常检测识别状态机违背如无 SYN 先例的 SYN/ACK 报文与非常规流量模式。扫描类型与检测方法对照各类扫描手法与判定指标API 参考文档 api-reference.md 给出了四类典型扫描的宏观检测指标SKILL.md 则进一步细化到具体 Nmap 参数与报文特征。合并如下扫描类型Nmap 标志报文特征检测方法TCP SYN-sS仅 SYN 标志无三次握手完成SYN 无 SYN/ACK 回应的半开模式TCP Connect-sT完整三次握手单一来源的大量短连接TCP FIN-sF仅 FIN 标志对关闭端口的 FIN 收到 RST 响应TCP Xmas-sXFINPSHURG 组合非常规标志组合TCP NULL-sN无任何标志零标志 TCP 报文UDP 扫描-sU向大量端口发 UDP 报文ICMP port unreachable 响应ACK 扫描-sA仅 ACK 标志防火墙探测无来源的 ACK 报文SYN/ACK 扫描自定义无先例 SYN 的 SYNACK状态机违背OS 指纹-O非常规 TCP 选项/窗口大小特定选项组合版本探测-sV服务探测字符串已知探测载荷上述映射在 agent.py 中被固化为SCAN_SIGNATURES常量例如 SYN 扫描默认端口阈值 20、CONNECT 扫描阈值 15、HOST_SWEEP 主机阈值 10并统一关联 ATTCK 技术编号端口/服务扫描为 T1046主机探测为 T1018。Nmap 时序模板Timing Templates与检测难度慢速扫描是规避阈值检测的主要手段理解 Nmap 时序模板有助于你合理设置统计窗口模板Nmap 标志速度检测难度Paranoid-T01 探测/5 分钟非常困难Sneaky-T11 探测/15 秒困难Polite-T21 探测/0.4 秒中等Normal-T3默认并行度容易Aggressive-T4并行1.25 秒超时非常容易Insane-T5最大并行度极易实际环境中攻击者常使用-T1/-T2规避「短窗口高计数」类规则因此需要在规则设计上拉长统计窗口并结合异常流量如单个来源对多个端口仅发一个 SYN进行补充检测。实战第一步部署 Suricata 扫描检测规则按 SKILL.md 的 Workflow首先在/var/lib/suricata/rules/scan-detection.rules创建完整规则集以下为仓库提供的生产级规则可直接复制使用# TCP Scan Detection # Detect TCP SYN scan (high volume SYN without completion) alert tcp $EXTERNAL_NET any - $HOME_NET any (msg:SCAN TCP SYN Scan Detected; flags:S,12; threshold:type both,track by_src,count 30,seconds 10; classtype:attempted-recon; sid:5000001; rev:2;) # Detect TCP FIN scan alert tcp $EXTERNAL_NET any - $HOME_NET any (msg:SCAN TCP FIN Scan; flags:F,12; threshold:type both,track by_src,count 20,seconds 60; classtype:attempted-recon; sid:5000002; rev:1;) # Detect TCP Xmas scan (FINPSHURG) alert tcp $EXTERNAL_NET any - $HOME_NET any (msg:SCAN TCP Xmas Tree Scan; flags:FPU,12; classtype:attempted-recon; sid:5000003; rev:1;) # Detect TCP NULL scan (no flags) alert tcp $EXTERNAL_NET any - $HOME_NET any (msg:SCAN TCP NULL Scan; flags:0,12; classtype:attempted-recon; sid:5000004; rev:1;) # Detect ACK scan (firewall probing) alert tcp $EXTERNAL_NET any - $HOME_NET any (msg:SCAN TCP ACK Scan; flags:A,12; flow:stateless; threshold:type both,track by_src,count 50,seconds 30; classtype:attempted-recon; sid:5000005; rev:1;) # Detect SYNACK scan (unusual stateless probe) alert tcp $EXTERNAL_NET any - $HOME_NET any (msg:SCAN TCP SYN-ACK Scan; flags:SA,12; flow:stateless; threshold:type both,track by_src,count 30,seconds 30; classtype:attempted-recon; sid:5000006; rev:1;) # UDP Scan Detection # Detect UDP port scan alert udp $EXTERNAL_NET any - $HOME_NET any (msg:SCAN UDP Port Scan; threshold:type both,track by_src,count 30,seconds 10; classtype:attempted-recon; sid:5000010; rev:1;) # Nmap Specific Detection # Detect Nmap OS fingerprinting (T1 probe - ECN SYN) alert tcp $EXTERNAL_NET any - $HOME_NET any (msg:SCAN Nmap OS Fingerprint Probe; flags:SEC,12; window:1; classtype:attempted-recon; sid:5000020; rev:1;) # Detect Nmap window scan (specific window size patterns) alert tcp $EXTERNAL_NET any - $HOME_NET any (msg:SCAN Nmap Window Size Probe; flags:A,12; flow:stateless; window:1024; threshold:type both,track by_src,count 10,seconds 30; classtype:attempted-recon; sid:5000021; rev:1;) # Detect Nmap version detection probes alert tcp $EXTERNAL_NET any - $HOME_NET any (msg:SCAN Nmap Service Version Probe; flow:established; content:HELP; depth:4; threshold:type both,track by_src,count 5,seconds 60; classtype:attempted-recon; sid:5000022; rev:1;) # Detect Nmap scripting engine (NSE) alert http $EXTERNAL_NET any - $HOME_NET any (msg:SCAN Nmap NSE HTTP Script; http.user_agent; content:Nmap Scripting Engine; classtype:attempted-recon; sid:5000023; rev:1;) # Masscan Detection # Detect Masscan SYN scan (specific window size) alert tcp $EXTERNAL_NET any - $HOME_NET any (msg:SCAN Masscan SYN Scan Detected; flags:S,12; window:1024; threshold:type both,track by_src,count 100,seconds 10; classtype:attempted-recon; sid:5000030; rev:1;) # Internal Scan Detection # Detect internal host scanning (lateral movement recon) alert tcp $HOME_NET any - $HOME_NET any (msg:SCAN Internal Network Scan Detected; flags:S,12; threshold:type both,track by_src,count 50,seconds 30; classtype:attempted-recon; sid:5000040; rev:1;) # Detect internal ICMP sweep alert icmp $HOME_NET any - $HOME_NET any (msg:SCAN Internal ICMP Sweep; itype:8; threshold:type both,track by_src,count 30,seconds 10; classtype:attempted-recon; sid:5000041; rev:1;)规则设计要点解读flags:S,12匹配 SYN 标志并显式检查其余标志位12 表示屏蔽 FIN/SYN/RST/ACK 之外的位防止带其他标志的报文误命中threshold:type both, track by_src同时启用告警限制与统计both按源 IP 跟踪by_src即「窗口内达到计数才首次告警随后按抑制间隔限制告警频率」flow:stateless对 ACK、SYN/ACK 这类无需完整连接状态的探测报文使用无状态匹配避免依赖流表window:1024利用 Masscan 默认窗口大小特征识别其 SYN 扫描SYN 规则的window:1024与计数 100/10 秒配合可在大规模扫描中精确区分 Masscan 与 NmapNSE 规则Nmap 脚本引擎发起 HTTP 请求时 User-Agent 含Nmap Scripting Engine字样属于高置信度签名内部扫描规则sid:5000040/5000041$HOME_NET - $HOME_NET横向扫描往往意味着主机已失陷严重性显著高于外部扫描——这与分析脚本中「内部来源直接判 CRITICAL」的逻辑一致。部署后可用suricata -T -c /etc/suricata/suricata.yaml做规则集校验确认语法无误再加载到运行中的实例。实战第二步配置阈值抑制与告警限速编辑/etc/suricata/threshold.config对上述规则做三件事放行授权扫描器、限速告警洪泛、对关键事件收紧过滤# Suppress scan alerts from authorized vulnerability scanners suppress gen_id 1, sig_id 5000001, track by_src, ip 10.0.5.100 suppress gen_id 1, sig_id 5000001, track by_src, ip 10.0.5.101 # Rate-limit scan alerts to prevent log flooding rate_filter gen_id 1, sig_id 5000001, track by_src, count 5, seconds 300, new_action alert, timeout 600 rate_filter gen_id 1, sig_id 5000040, track by_src, count 3, seconds 300, new_action alert, timeout 600 # Event filter for critical internal scans event_filter gen_id 1, sig_id 5000040, type both, track by_src, count 1, seconds 60三个指令的差异需要理解清楚suppress完全静默指定来源如内部合规扫描器 Nessus / OpenVAS 的 IP10.0.5.100、10.0.5.101避免合法扫描产生告警噪声rate_filter先放行达到速率后切换动作——例如count 5, seconds 300表示 5 分钟内同源告警超过 5 条才转为alert并持续timeout 600秒防止扫描洪泛打爆 SIEMevent_filter对内部横向扫描这类高风险事件做抑制count 1意味着同一源在 60 秒窗口内只保留 1 条告警既保住关键信号又控制日志量。实战第三步理解告警数据格式Suricata EVE JSONSuricata 的 EVE JSON 是下游分析与 SIEM 对接的统一格式。api-reference.md 给出了一条典型扫描告警记录{ event_type: alert, src_ip: 10.0.5.5, dest_ip: 192.168.1.100, alert: { signature: ET SCAN Nmap SYN Scan, category: Attempted Information Leak, severity: 2, signature_id: 2000001 } }字段语义event_type固定为alert是分析脚本筛选扫描告警的入口src_ip/dest_ip标识扫描来源与目标是关联聚合按源聚合扫描目标、按目标统计端口的关键字段alert.signature包含规则消息如SCAN ...前缀agent.py 正是通过检查签名文本中是否含SCAN来圈定扫描事件alert.severity1–31 最严重分析脚本据此把 severity ≤ 2 的扫描告警升级为 HIGH。在 agent.py 的analyze_ids_alerts函数中告警分析还做了两件事一是用正则集合NMAP_SIGNATURESnmap、masscan、zmap、rustscan、unicornscan、Nmap Scripting Engine从签名中识别具体扫描工具二是将包含 scan 的 category/signature 统一归入ids_scan_alert发现项。实战第四步基于 Zeek conn.log 的流量侧检测扫描不仅会触发 IDS 签名也会在连接日志中留下统计特征。api-reference.md 给出 Zeek conn.log 的核心字段结构#fields ts uid id.orig_h id.orig_p id.resp_h id.resp_p proto service duration orig_bytes resp_bytes conn_state其中id.orig_h源 IP、id.resp_h目的 IP、id.resp_p目的端口与conn_state连接状态是扫描检测的核心输入。agent.py 的parse_connection_log会解析#fields头将制表符分隔的每行转换为字段字典。端口扫描检测detect_port_scan按「源→目的」对聚合目的端口集合统计去重端口数def detect_port_scan(connections, threshold20): src_dst_ports defaultdict(set) src_dst_count defaultdict(int) for conn in connections: src conn.get(id.orig_h, ) dst conn.get(id.resp_h, ) port conn.get(id.resp_p, ) src_dst_ports[f{src}-{dst}].add(port) src_dst_count[f{src}-{dst}] 1 for pair, ports in src_dst_ports.items(): if len(ports) threshold: ... severity: CRITICAL if len(ports) 100 else HIGH,主机扫描Host Sweep检测detect_host_sweep按「源:端口」聚合去重目的主机数def detect_host_sweep(connections, threshold10): src_port defaultdict(set) for conn in connections: ... src_port[f{src}:{port}].add(dst) for src_p, hosts in src_port.items(): if len(hosts) threshold: ... severity: HIGH if len(hosts) 50 else MEDIUM,检测阈值速查表api-reference.md 汇总了这两类检测的判定阈值与脚本默认参数一一对应指标阈值严重级别单目的唯一端口数20HIGH单目的唯一端口数100CRITICAL单端口探测主机数10MEDIUM单端口探测主机数50HIGH对应到脚本默认值--port-threshold默认 20、--sweep-threshold默认 10。在 /16 这类大型网段中基线噪声更高应基于环境流量特性上调阈值详见下文最佳实践。CLI 使用方式api-reference.md 给出了检测脚本的两种典型调用脚本位于 scripts/agent.py# 仅分析 Suricata EVE JSON 告警 python agent.py --eve-log eve.json # 分析 Zeek conn.log 并自定义阈值 python agent.py --conn-log conn.log --port-threshold 25 --sweep-threshold 15不传任何参数时脚本默认读取/var/log/suricata/eve.json见main()中的默认路径逻辑。输出为结构化的 JSON含timestamp、findings数组与total_findings计数每条发现均携带type、source、destination、severity与mitre编号可直接喂给 SIEM 或 SOAR。需要注意parse_suricata_eve仅处理event_type alert的行并忽略 JSON 解析错误保证日志中存在脏数据时分析不中断。实战第五步告警关联报告与 Splunk 查询扫描活动关联报告SKILL.md 内置的ScanDetector类见 SKILL.md 第 3 步对 EVE JSON 告警做时间线聚合按源 IP 归并目标 IP 集合、端口集合、扫描类型集合与命中签名分布并给出首末次出现时间与持续时长。其严重级别判定规则与前面的阈值体系一致来源 IP 属于10./172./192.168.私有段 →CRITICAL内部扫描疑似失陷主机目标主机数 50 或端口数 100 →HIGH其余 →MEDIUM。报告按告警数降序输出每个扫描源Top 5 命中签名一目了然可直接用于每日 SOC 研判。Splunk SPL 检测在没有专用分析脚本的环境中可用 Splunk SPL 在已索引的网络日志上实现同等的端口扫描检测api-reference.md 提供indexnetwork | stats dc(dest_port) as unique_ports by src_ip, dest_ip | where unique_ports 20 | sort -unique_portsdc(dest_port)计算按src_ip, dest_ip分组的去重目的端口数where unique_ports 20对应阈值表中的 HIGH 判级最后按端口数降序排列定位扫描行为最剧烈的来源。将该查询与上表阈值结合即可扩展出主机扫描dc(dest_ip) by src_ip, port变体。响应处置与最佳实践扫描告警响应流程Response PlaybookSKILL.md 给出六步处置基线SOC 可直接固化为标准作业程序研判Triage——区分授权扫描器对照 suppress 名单与未知来源情报丰富Enrich——在威胁情报源中查询来源 IP 的信誉评估范围Assess Scope——统计去重目标数与端口数量化扫描广度阻断Block——对激进的公网扫描源加入防火墙黑名单调查内部Investigate Internal——内部扫描可能意味着主机已失陷应立即隔离并取证关联Correlate——核查扫描之后是否伴随利用尝试验证杀伤链进展。最佳实践清单白名单授权扫描器用suppress静默合规扫描器 IP消除合法噪声聚焦内部扫描内部横向扫描的严重性高于外部往往指向失陷优先处置阈值调优根据网络规模调整阈值——/16 网段的环境扫描噪声远高于 /24切忌照搬默认值跨告警关联把扫描检测与利用告警如 T1046 后的漏洞利用串联获得完整杀伤链视角时间维度分析凌晨 3 点的扫描应获得更高优先级该逻辑已在分析脚本的first_seen/last_seen时间窗口统计中体现告警限速用rate_filter/event_filter防止扫描洪泛淹没 SIEM保持信噪比。与仓库框架映射的对接本技能在 Anthropic-Cybersecurity-Skills 的 817 个技能中属于network-security子域见 SKILL.md 元数据同时映射到 ATTCK 与 NIST CSF 两套框架。在 MITRE ATTCK 侧扫描检测对应 T1046网络服务发现与 T1595主动扫描主机探测对应 T1018远程系统发现在 NIST CSF 2.0 侧覆盖DE.CM-01持续监控对应 Suricata/Zeek 的部署与PR.IR-01响应预案对应六步处置流程。这意味着将本文的规则与脚本落地后可以在框架层面对齐「监控—检测—响应」的合规闭环并通过仓库的 attack-navigator-layer.json 导入 MITRE ATTCK Navigator 可视化覆盖情况。小结从签名规则、阈值配置到流量侧统计与脚本化关联本文完整还原了「检测网络扫描」这一侦察阶段防线在 Anthropic-Cybersecurity-Skills 仓库中的落地方案。核心要点可归纳为用flags/window/content签名锁定工具特征用threshold/rate_filter平衡检出与噪声用 EVE JSON conn.log 双数据源实现端口扫描与主机扫描的统计检测再用 agent.py 或 Splunk SPL 完成告警聚合与处置闭环。建议读者以仓库提供的规则集和脚本为基线结合自身网络基线反复调优阈值并持续将扫描告警与后续利用告警做关联分析让侦察阶段的每一次探测都成为整条攻击链最早的预警信号。【免费下载链接】Anthropic-Cybersecurity-Skills817 structured cybersecurity skills for AI agents · Mapped to 6 frameworks: MITRE ATTCK, NIST CSF 2.0, MITRE ATLAS, D3FEND, NIST AI RMF MITRE F3 (Fight Fraud) · agentskills.io standard · Works with Claude Code, GitHub Copilot, Codex CLI, Cursor, Gemini CLI 20 platforms · 29 security domains · Apache 2.0项目地址: https://gitcode.com/GitHub_Trending/an/Anthropic-Cybersecurity-Skills创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进