本文基于ET公开的规则集 https://rules.emergingthreats.net/OPEN_download_instructions.html 中的 emerging-scan.rules 来进行nmap扫描特征分析
rule简介
以该规则为例
alert ip any any -> any any (msg: “IP Packet detected”;)
它会检测所有传入的IP数据包并输出一个消息:”IP Packet detected”
Snort的规则被分为两个部分:规则头和规则选项
规则头包含规则的动作,协议,源和目标ip地址与网络掩码,以及源和目标端口信息;规则选项部分包含报警消息内容和要检查的包的具体部分
在上面这个规则里面
-
alert 表示如果包与后面的规则匹配 则产生一个告警信息(Snort的动作有alert、log、pass、activate和dynamic.)
-
ip指规则用在所有的IP包上
-
第一组 any any IP包的源IP和源端口
-
-> 指数据流动方向
-
第二组 any any IP包的目的IP和目的端口 这里两组都是指匹配任何IP地址和任何端口
-
括号内的是规则选项 ,msg是一个告警信息作为提示信息,语法为 关键字:变量,不同的规则之间用 ;分隔
例如这条规则选项的含义就是匹配TTL为100的数据包
(msg:”Ping with TLL=100″; ttl: 100;)
nmap检测规则
部分规则类似,选择差别比较大的规则来讲解
攻击机环境:windows11、Nmap 7.92
受害机环境:kali linux
nmap -sS TCP SYN扫描
nmap -sS 表示进行TCP SYN扫描,Nmap发送一个TCP包只设置SYN(同步)标志位给目标端口,然后等待目标主机的响应。根据不同情况的响应,Nmap可以确定目标主机上的端口是开放的、关闭的还是过滤的
TCP SYN 扫描的优点在于它能够在不与完整的TCP连接建立之前进行扫描,因此相对隐蔽,并且速度较快
对应的规则集是
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; threshold: type both, track by_dst, count 1, seconds 60; reference:url,doc.emergingthreats.net/2000537; classtype:attempted-recon; sid:2000537; rev:8; metadata:created_at 2010_07_30, updated_at 2010_07_30;)
我们主要关注规则选项
-
fragbits:!D 该部分表示数据包的标志位中不包含DF(Don’t Fragment)位
-
dsize:0 数据包大小为0
-
flags:S,12 数据包的标志位,其中S表示SYN位被设置,12表示保留位未被设置
-
ack:0 数据包的确认号(ACK)为0
-
window:2048 TCP窗口大小为2048
-
threshold: type both, track by_dst, count 1, seconds 60 设置了规则的阈值,当满足条件时,在60秒内针对同一目的地IP地址只允许出现1次匹配
使用nmap进行扫描
nmap -sS 192.168.6.128

为了方便查看我们使用wireshark ,过滤攻击机IP
ip.src_host == 192.168.6.1

很显然这里是不符合上面的规则 window:2048

找到了它的姐妹规则 是有window 1024的
alert tcp $EXTERNAL_NET any -> $HOME_NET any (msg:”ET SCAN NMAP -sS window 1024″; fragbits:!D; dsize:0; flags:S,12; ack:0; window:1024; threshold: type both, track by_dst, count 1, seconds 60; reference:url,doc.emergingthreats.net/2009582; classtype:attempted-recon; sid:2009582; rev:3; metadata:created_at 2010_07_30, updated_at 2014_03_18;)
alert tcp $EXTERNAL_NET any -> $HOME_NET any (msg:”ET SCAN NMAP -sS window 3072″; fragbits:!D; dsize:0; flags:S,12; ack:0; window:3072; threshold: type both, track by_dst, count 1, seconds 60; reference:url,doc.emergingthreats.net/2009583; classtype:attempted-recon; sid:2009583; rev:3; metadata:created_at 2010_07_30, updated_at 2014_03_18;)
alert tcp $EXTERNAL_NET any -> $HOME_NET any (msg:”ET SCAN NMAP -sS window 4096″; fragbits:!D; dsize:0; flags:S,12; ack:0; window:4096; threshold: type both, track by_dst, count 1, seconds 60; reference:url,doc.emergingthreats.net/2009584; classtype:attempted-recon; sid:2009584; rev:2; metadata:created_at 2010_07_30, updated_at 2014_03_18;)
fragbits 不允许分段

dsize 传输层payload大小为0

flags:S,12 flags位置设置了SYN位,忽略CWR和ECE位

ack:0 ack位为0

threshold: type both, track by_dst, count 1, seconds 60
当满足条件时,在60秒内针对同一目的地IP地址只允许出现1次匹配,这条不会在wireshark里面看出来
nmap -sA TCP ACK扫描
alert tcp $EXTERNAL_NET any -> $HOME_NET any (msg:”ET SCAN NMAP -sA (1)”; fragbits:!D; dsize:0; flags:A,12; window:1024; threshold: type both, track by_dst, count 1, seconds 60; reference:url,doc.emergingthreats.net/2000538; classtype:attempted-recon; sid:2000538; rev:8; metadata:created_at 2010_07_30, updated_at 2010_07_30;)
ACK扫描最关键的当然是 flags:A,12

但是如果只是看ACK包又会有很多的误报,所以其他的规则我理解是为了降低误报,比如window 1024,大多数情况下,TCP数据包的大小是动态变化的
第二个sA扫描的规则也是类似,只是改变了数据包大小为3072
alert tcp $EXTERNAL_NET any -> $HOME_NET any (msg:”ET SCAN NMAP -sA (2)”; fragbits:!D; dsize:0; flags:A,12; window:3072; threshold: type both, track by_dst, count 1, seconds 60; reference:url,doc.emergingthreats.net/2000540; classtype:attempted-recon; sid:2000540; rev:8; metadata:created_at 2010_07_30, updated_at 2010_07_30;)
nmap User-Agent检测
使用nmap的脚本对IP进行扫描
alert tcp $EXTERNAL_NET any -> $HOME_NET $HTTP_PORTS (msg:”ET SCAN Nmap Scripting Engine User-Agent Detected (Nmap Scripting Engine)”; flow:to_server,established; content:”User-Agent|3a| Mozilla/5.0 (compatible|3b| Nmap Scripting Engine”; fast_pattern:38,20; http_header; nocase; reference:url,doc.emergingthreats.net/2009358; classtype:web-application-attack; sid:2009358; rev:5; metadata:created_at 2010_07_30, updated_at 2010_11_22;)
在规则里面的 |3a| 代表ASCII字符冒号,|3b|代表ASCII字符分号,所以content为
User-Agent: Mozilla/5.0 (compatible; Nmap Scripting Engine
剩下的fast_pattern:38,20; http_header; nocase; 这些选项组合在一起,用于指定在HTTP头部中进行快速、大小写不敏感的匹配检查。这样可以加快规则的匹配速度,并且更灵活地捕获目标内容
nmap SQL注入扫描
alert tcp $EXTERNAL_NET any -> $HTTP_SERVERS $HTTP_PORTS (msg:”ET SCAN NMAP SQL Spider Scan”; flow:established,to_server; content:”GET”; http_method; content:” OR sqlspider”; http_uri; reference:url,nmap.org/nsedoc/scripts/sql-injection.html; classtype:web-application-attack; sid:2013778; rev:1; metadata:created_at 2011_10_19, updated_at 2011_10_19;)
SQL注入检测的关键位置是 uri 包含 ” OR sqlspider”
为什么要这么检测,需要从nmap的这个SQL脚本里面寻找答案 – https://svn.nmap.org/nmap/scripts/http-sql-injection.nse
它会把参数的值修改为 ‘ OR sqlspider,用来触发SQL注入报错

具体怎么判断是否SQL注入报错,LUA脚本使用了一个check_injection_response方法
local function check_injection_response(response) local body = string.lower(response.body) if not (response.status == 200 or response.status ~= 500) then return false end if errorstrings then for _,e in ipairs(errorstrings) do if string.find(body, e) then stdnse.debug2("error string matched: %s", e) return true end end end return false end
对攻击后的页面进行字符串检测,默认的报错关键字列表为
errorstrings = {"invalid query", "sql syntax", "odbc drivers error"}
所以一切都说得通了
nmap 操作系统探测
检测规则为
alert udp $EXTERNAL_NET 10000: -> $HOME_NET 10000: (msg:”ET SCAN NMAP OS Detection Probe”; dsize:300; content:”CCCCCCCCCCCCCCCCCCCC”; fast_pattern:only; content:”CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC”; depth:255; content:”CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC”; within:45; classtype:attempted-recon; sid:2018489; rev:3; metadata:created_at 2014_05_21, updated_at 2014_05_21;)
这里的规则需要nmap 探测OS版本的时候触发

查看wireshark,UDP包对应的Data里面被填充为C,这个特征很明显,并且很难误报
小结
即便使用最新版本的nmap,nmap大部分扫描的特征还是会存在,想要绕过IDS的话就需要自行修改nmap源码,去除特征后自行编译
参考链接
-
https://www.cnblogs.com/starrys/p/15257712.html
-
https://rce.moe/2022/11/06/portscantoolsanalyse/
-
https://github.com/al0ne/Nmap_Bypass_IDS
-
https://xz.aliyun.com/t/6002
-
https://zhuanlan.zhihu.com/p/248625327
-
https://rules.emergingthreats.net/OPEN_download_instructions.html
-
https://svn.nmap.org/nmap/scripts/http-sql-injection.nse
-
https://www.cnblogs.com/yuersan/p/15236326.html
-
https://jax777.win/2019/08/18/nmap/
文章来源: https://xz.aliyun.com/t/13779文章作者:枫糖甜酒
黑白之道发布、转载的文章中所涉及的技术、思路和工具仅供以安全为目的的学习交流使用,任何人不得将其用于非法用途及盈利等目的,否则后果自行承担!
如侵权请私聊我们删文
END
















暂无评论内容