如何修改nmap, 重新编译,bypass emergingthreats 的公开ids规则
字数 2706 2025-08-26 22:12:02

Nmap流量特征修改与IDS绕过技术详解

1. 背景与概述

本文详细讲解如何通过修改Nmap源代码和配置文件,重新编译Nmap,以绕过Emerging Threats等公开IDS规则的检测。主要内容包括Nmap扫描特征分析、IDS规则解读、具体修改方法和重新编译过程。

2. 前置知识

2.1 网络协议基础

  • IP包格式
  • TCP包格式
  • TCP三次握手与四次挥手

2.2 IDS规则语法

  • Suricata规则语法:https://redmine.openinfosecfoundation.org/projects/suricata/wiki/Suricata_Rules
  • Snort规则语法:http://manual-snort-org.s3-website-us-east-1.amazonaws.com/node33.html

2.3 Nmap扫描技术

  • 端口扫描技术:https://nmap.org/man/zh/man-port-scanning-techniques.html
  • 服务探测文件格式:https://nmap.org/book/vscan-fileformat.html

3. Nmap服务探测文件分析

nmap-service-probes文件包含不同服务的探测报文和响应匹配表达式,主要指令如下:

3.1 Exclude指令

Exclude <port specification>

从版本扫描中排除指定端口,通常放在文件顶部。例如:

Exclude T:9100-9107

--allports指令可以覆盖Exclude指令。

3.2 Probe指令

Probe <protocol> <probename> <probestring>
  • protocol: TCP或UDP
  • probename: 探测名称
  • probestring: 发送的数据包内容,支持转义字符

示例:

q|GET / HTTP/1.0\r\n\r\n|

3.3 Match指令

match <service> <pattern> [<versioninfo>]
  • service: 服务名(ssh, smtp, http等)
  • pattern: 正则表达式匹配模式
  • versioninfo: 版本信息格式

版本信息字段:

p/vendorproductname/   # 供应商或服务名
v/version/             # 应用版本信息
i/info/                # 其他信息
h/hostname/            # 主机名
o/operatingsystem/     # 操作系统
d/devicetype/          # 设备类型
cpe:/cpename/[a]       # CPE格式指纹

3.4 Softmatch指令

与match类似,但匹配后扫描继续,服务名作为已知条件。

3.5 其他指令

  • ports <portlist>: 指定探测发送的端口
  • totalwaitms <milliseconds>: 等待时间
  • tcpwrappedms <milliseconds>: 仅用于NULL探针
  • rarity <value between 1 and 9>: 探测稀有度(1-9)
  • fallback <Comma separated list of probes>: 指定回退探针

4. IDS规则分析与绕过方法

4.1 Ping扫描(-sP)

检测规则:

alert icmp $EXTERNAL_NET any -> $HOME_NET any (msg:"GPL SCAN PING NMAP"; dsize:0; itype:8; ...)

特征:

  • ICMP type=8(echo request)
  • 数据部分大小(dsize)=0

绕过方法:修改ICMP数据包大小或使用其他ICMP类型

4.2 TCP SYN扫描(-sS)

检测规则:

alert tcp $EXTERNAL_NET any -> $HOME_NET any (msg:"ET SCAN NMAP -sS window 2048"; fragbits:!D; dsize:0; flags:S,12; ack:0; window:2048; ...)

特征:

  • 不分片(!D)
  • 数据大小=0
  • SYN标志(S)
  • 保留位1和2设置(12)
  • ACK=0
  • 窗口大小=2048/1024/3072/4096

绕过方法:

  1. 修改TCP窗口大小(修改tcpip.cc)
  2. 调整扫描速率

4.3 TCP Connect扫描(-sT)

检测规则:

alert tcp $EXTERNAL_NET any -> $HOME_NET any (msg:"GPL SCAN nmap TCP"; ack:0; flags:A,12; ...)

特征:

  • ACK=0
  • ACK标志(A)和保留位(12)

绕过方法:降低扫描速率

4.4 UDP扫描(-sU)

检测规则:

alert udp $EXTERNAL_NET any -> $HOME_NET any (msg:"ET SCAN NMAP OS Detection Probe"; dsize:300; content:"CCCCCCCCCCCCCCCCCCCC"; ...)

特征:

  • 数据大小=300
  • 包含特定内容(多个"C")

绕过方法:修改探测内容

4.5 TCP Null/FIN/Xmas扫描(-sN/-sF/-sX)

检测规则:

alert tcp $EXTERNAL_NET any -> $HOME_NET any (msg:"ET SCAN NMAP -f -sN"; fragbits:!M; dsize:0; flags:0,12; ack:0; window:2048; ...)

特征:

  • 不分片(!M)
  • 数据大小=0
  • 标志位组合:
    • Null: 无标志(0)
    • FIN: F
    • Xmas: FPU
  • ACK=0
  • 窗口大小=2048

绕过方法:修改标志位组合或窗口大小

4.6 TCP ACK扫描(-sA)

检测规则:

alert tcp $EXTERNAL_NET any -> $HOME_NET any (msg:"ET SCAN NMAP -sA (1)"; fragbits:!D; dsize:0; flags:A,12; window:1024; ...)

特征:

  • ACK标志(A)和保留位(12)
  • 窗口大小=1024/3072

绕过方法:修改窗口大小

4.7 操作系统检测(-O)

检测规则:

alert ip $EXTERNAL_NET any -> $HOME_NET any (msg:"ET SCAN NMAP -sO"; dsize:0; ip_proto:21; ...)

特征:

  • IP协议号=21
  • 数据大小=0

绕过方法:修改探测协议和内容

4.8 服务版本检测(-sV)

检测规则:

alert tcp $EXTERNAL_NET any -> $HOME_NET any (msg:"ET SCAN NMAP -f -sV"; fragbits:!M; dsize:0; flags:S,12; ack:0; window:2048; ...)

特征:

  • 类似SYN扫描特征
  • 特定服务探测内容

绕过方法:

  1. 修改nmap-service-probes文件中的探测内容
  2. 修改osscan2.cc中的随机填充生成函数(nbase\nbase_rnd.c)

4.9 SIP探测

检测规则:

alert tcp $EXTERNAL_NET any -> $HOME_NET $HTTP_PORTS (msg:"ET SCAN NMAP SIP Version Detect OPTIONS Scan"; content:"OPTIONS sip|3A|nm SIP/"; ...)

特征:

  • 包含"OPTIONS sip:nm SIP/"
  • Via头包含"SIP/2.0/TCP nm"
  • From头包含"<sip:nm@nm"

绕过方法:修改nmap-service-probes中的关键词(nm@nm, nm2@nm2, nmap等)

4.10 NSE脚本检测

检测规则示例:

alert http $EXTERNAL_NET any -> $HTTP_SERVERS any (msg:"ET SCAN NMAP SQL Spider Scan"; content:" OR sqlspider"; ...)
alert http $EXTERNAL_NET any -> $HOME_NET any (msg:"ET SCAN Nmap Scripting Engine User-Agent Detected"; content:"Nmap Scripting Engine"; ...)

特征:

  • 特定SQL注入内容(" OR sqlspider")
  • 特定User-Agent("Nmap Scripting Engine")

绕过方法:

  1. 修改scripts/http-sql-injection.nse中的内容("OR sqlspider" → "OR google")
  2. 修改nselib/http.lua中的默认User-Agent
  3. 修改nselib/sip.lua中的SIP UA(设置为"FreeSWITCH-mod_sofia")
  4. 修改scripts/ssl-heartbleed.nse中的特征

5. 修改与重新编译步骤

5.1 修改关键文件

  1. tcpip.cc: 修改TCP窗口大小等参数
  2. nbase/nbase_rnd.c: 修改随机填充生成函数
  3. nmap-service-probes: 修改探测内容和关键词
  4. NSE脚本文件:
    • scripts/http-sql-injection.nse
    • nselib/http.lua
    • nselib/sip.lua
    • scripts/ssl-heartbleed.nse

5.2 重新编译Nmap

./configure
make
make install

5.3 验证版本

./nmap --version

6. 总结

通过分析Nmap的各种扫描类型产生的流量特征和对应的IDS检测规则,我们可以有针对性地修改Nmap源代码和配置文件,重新编译后生成具有隐蔽扫描能力的定制版本。关键点包括:

  1. 理解各种扫描类型的特征和对应的IDS规则
  2. 修改TCP/IP参数(窗口大小、标志位等)
  3. 修改服务探测内容避免模式匹配
  4. 调整NSE脚本避免特征检测
  5. 重新编译并验证修改效果

这种方法可以有效绕过基于公开规则的IDS检测,但需要注意不要违反法律法规,仅用于授权测试。

Nmap流量特征修改与IDS绕过技术详解 1. 背景与概述 本文详细讲解如何通过修改Nmap源代码和配置文件,重新编译Nmap,以绕过Emerging Threats等公开IDS规则的检测。主要内容包括Nmap扫描特征分析、IDS规则解读、具体修改方法和重新编译过程。 2. 前置知识 2.1 网络协议基础 IP包格式 TCP包格式 TCP三次握手与四次挥手 2.2 IDS规则语法 Suricata规则语法:https://redmine.openinfosecfoundation.org/projects/suricata/wiki/Suricata_ Rules Snort规则语法:http://manual-snort-org.s3-website-us-east-1.amazonaws.com/node33.html 2.3 Nmap扫描技术 端口扫描技术:https://nmap.org/man/zh/man-port-scanning-techniques.html 服务探测文件格式:https://nmap.org/book/vscan-fileformat.html 3. Nmap服务探测文件分析 nmap-service-probes 文件包含不同服务的探测报文和响应匹配表达式,主要指令如下: 3.1 Exclude指令 从版本扫描中排除指定端口,通常放在文件顶部。例如: --allports 指令可以覆盖Exclude指令。 3.2 Probe指令 protocol: TCP或UDP probename: 探测名称 probestring: 发送的数据包内容,支持转义字符 示例: 3.3 Match指令 service: 服务名(ssh, smtp, http等) pattern: 正则表达式匹配模式 versioninfo: 版本信息格式 版本信息字段: 3.4 Softmatch指令 与match类似,但匹配后扫描继续,服务名作为已知条件。 3.5 其他指令 ports <portlist> : 指定探测发送的端口 totalwaitms <milliseconds> : 等待时间 tcpwrappedms <milliseconds> : 仅用于NULL探针 rarity <value between 1 and 9> : 探测稀有度(1-9) fallback <Comma separated list of probes> : 指定回退探针 4. IDS规则分析与绕过方法 4.1 Ping扫描(-sP) 检测规则: 特征: ICMP type=8(echo request) 数据部分大小(dsize)=0 绕过方法:修改ICMP数据包大小或使用其他ICMP类型 4.2 TCP SYN扫描(-sS) 检测规则: 特征: 不分片( !D) 数据大小=0 SYN标志(S) 保留位1和2设置(12) ACK=0 窗口大小=2048/1024/3072/4096 绕过方法: 修改TCP窗口大小(修改tcpip.cc) 调整扫描速率 4.3 TCP Connect扫描(-sT) 检测规则: 特征: ACK=0 ACK标志(A)和保留位(12) 绕过方法:降低扫描速率 4.4 UDP扫描(-sU) 检测规则: 特征: 数据大小=300 包含特定内容(多个"C") 绕过方法:修改探测内容 4.5 TCP Null/FIN/Xmas扫描(-sN/-sF/-sX) 检测规则: 特征: 不分片( !M) 数据大小=0 标志位组合: Null: 无标志(0) FIN: F Xmas: FPU ACK=0 窗口大小=2048 绕过方法:修改标志位组合或窗口大小 4.6 TCP ACK扫描(-sA) 检测规则: 特征: ACK标志(A)和保留位(12) 窗口大小=1024/3072 绕过方法:修改窗口大小 4.7 操作系统检测(-O) 检测规则: 特征: IP协议号=21 数据大小=0 绕过方法:修改探测协议和内容 4.8 服务版本检测(-sV) 检测规则: 特征: 类似SYN扫描特征 特定服务探测内容 绕过方法: 修改 nmap-service-probes 文件中的探测内容 修改 osscan2.cc 中的随机填充生成函数( nbase\nbase_rnd.c ) 4.9 SIP探测 检测规则: 特征: 包含"OPTIONS sip:nm SIP/" Via头包含"SIP/2.0/TCP nm" From头包含" <sip:nm@nm" 绕过方法:修改 nmap-service-probes 中的关键词(nm@nm, nm2@nm2, nmap等) 4.10 NSE脚本检测 检测规则示例: 特征: 特定SQL注入内容(" OR sqlspider") 特定User-Agent("Nmap Scripting Engine") 绕过方法: 修改 scripts/http-sql-injection.nse 中的内容("OR sqlspider" → "OR google") 修改 nselib/http.lua 中的默认User-Agent 修改 nselib/sip.lua 中的SIP UA(设置为"FreeSWITCH-mod_ sofia") 修改 scripts/ssl-heartbleed.nse 中的特征 5. 修改与重新编译步骤 5.1 修改关键文件 tcpip.cc : 修改TCP窗口大小等参数 nbase/nbase_rnd.c : 修改随机填充生成函数 nmap-service-probes : 修改探测内容和关键词 NSE脚本文件: scripts/http-sql-injection.nse nselib/http.lua nselib/sip.lua scripts/ssl-heartbleed.nse 5.2 重新编译Nmap 5.3 验证版本 6. 总结 通过分析Nmap的各种扫描类型产生的流量特征和对应的IDS检测规则,我们可以有针对性地修改Nmap源代码和配置文件,重新编译后生成具有隐蔽扫描能力的定制版本。关键点包括: 理解各种扫描类型的特征和对应的IDS规则 修改TCP/IP参数(窗口大小、标志位等) 修改服务探测内容避免模式匹配 调整NSE脚本避免特征检测 重新编译并验证修改效果 这种方法可以有效绕过基于公开规则的IDS检测,但需要注意不要违反法律法规,仅用于授权测试。