nmap扫描特征分析

admin 2024年2月26日13:45:56评论19 views字数 6173阅读20分34秒阅读模式

本文基于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

nmap扫描特征分析

为了方便查看我们使用wireshark ,过滤攻击机IP

ip.src_host == 192.168.6.1

nmap扫描特征分析

很显然这里是不符合上面的规则 window:2048nmap扫描特征分析

找到了它的姐妹规则 是有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 不允许分段nmap扫描特征分析

dsize 传输层payload大小为0nmap扫描特征分析

flags:S,12 flags位置设置了SYN位,忽略CWR和ECE位nmap扫描特征分析

ack:0 ack位为0nmap扫描特征分析

threshold: type both, track by_dst, count 1, seconds 60
当满足条件时,在60秒内针对同一目的地IP地址只允许出现1次匹配,这条不会在wireshark里面看出来

nmap -sA TCP ACK扫描

nmap扫描特征分析

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,12nmap扫描特征分析

但是如果只是看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进行扫描nmap扫描特征分析

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扫描特征分析

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注入报错
nmap扫描特征分析

具体怎么判断是否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版本的时候触发nmap扫描特征分析

查看wireshark,UDP包对应的Data里面被填充为C,这个特征很明显,并且很难误报nmap扫描特征分析

小结

即便使用最新版本的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文章作者:枫糖甜酒如有侵权,联系删除

声明:⽂中所涉及的技术、思路和⼯具仅供以安全为⽬的的学习交流使⽤,任何⼈不得将其⽤于⾮法⽤途以及盈利等⽬的,否则后果⾃⾏承担。所有渗透都需获取授权

原文始发于微信公众号(白帽子左一):nmap扫描特征分析

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年2月26日13:45:56
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   nmap扫描特征分析https://cn-sec.com/archives/2525809.html

发表评论

匿名网友 填写信息