1-1 nmap
建议使用真实机的nmap进行扫描,如果使用虚拟机中的nmap进行扫描时,网络模式建议使用桥接(如kali虚拟机中自带的nmap),不然会发生一些错误,如在虚拟机NAT模式下跨网段扫描时,发现对方网段主机全部在线,但实际没有。
1. nmap原理
nmap有各种扫描方式,但原理都是通过构造并发送不同的网络探测包来实现的。
nmap工具执行我们的扫描命令的执行顺序:
-
先对目标进行主机扫描
-
再对目标进行端口扫描
-
最后对目标进行其他扫描
如:nmap -p 1-80 -sS -O 192.168.1.200,先执行-sS,再执行-p 1-80,最后执行-O。
因此有时候可以通过-Pn命令跳过主机发现,直接进入端口扫描阶段。
1.1 主机发现技术原理
主机发现是为了发现网段内的活跃主机(活跃主机是指这台主机是运行的),主机发现原理如下表所示。
扫描方式 | 发送报文 | 活跃响应 | 不活跃响应 | 被过滤响应 | 备注 |
---|---|---|---|---|---|
ARP扫描 | ARP请求报文 | ARP响应报文 | 超时 | 不会被过滤 | 精准 |
ICMP扫描 | ICMPtype=8 code=0type=13 code=0type=17 code=0 | ICMPtype=0 code=0type=14 code=0type=18 code=0 | 超时 | 超时 | 可能会被防火墙过滤 |
端口扫描 | TCP SYN | TCP SYN+ACK | 超时 | 超时或ICMP type=3 code=3或13 | 可能会被过滤 |
由表可知:
-
ARP扫描是最精准的扫描方式,并且不会被过滤,因此会被强制有限使用。
-
ICMP扫描是最常见的扫描方式,和ping命令原理一致,但现有很多防火墙和IPS设备会禁用ICMP扫描,使得ICMP主机发现失败。
-
端口扫描技术是另一种发现主机的方式,准确且不容易被防火墙过滤,这种方式被经常使用,端口扫描原理见以下。
1.2 端口扫描技术原理
端口扫描可以分为TCP端口扫描和UDP端口扫描,由于TCP能够提供更多的协议字段,因此TCP端口扫描更准确,如今的端口扫描技术主要是指TCP端口扫描。
在TCP端口扫描中,探测报文组合不同flags位,不同的flags在端口开放、端口关闭、防火墙过滤时的响应是不一样的,通过区分不同的响应来检测端口的状态,具体如下所示。(tcp flags有syn、ack、rst、fin、psh、urg共6种置位)
扫描方式 | 置为1的TCP Flag | 开放时响应 | 关闭时响应 | 过滤时响应 | 特征 |
---|---|---|---|---|---|
-sT,TCP全连接扫描 | 报文1:syn报文2:ack | syn+ack,完成3次握手 | rst+ack | 一般不会被过滤 | 精准、费时、可能会被日志记录 |
-sS,TCP半连接扫描 | syn | syn+ack | rst+ack | ICMP type=3 code=3、13或超时 | 精准、快速、无日志记录,最常见且默认的扫描方式 |
-sA,TCP ack扫描 | ack | rst | rst | 不准确、只能判断是否加防火墙,即端口状态filtered或unfiltered | 判断防火墙 |
-sW,TCP window扫描 | ack | rst,window不为0 | rst,window为0 | 不准确、有的情况下window都为0 | 判断防火墙 |
-sM | fin+ack | 未收到rst | rst | 不准确 | |
-sN | 无置位 | 无响应 | rst | ICMP type=3 code=3或13或超时无响应 | 不准确,只能判断closed和open|filtered |
-sF | fin | 无响应 | rst | ||
-sX | fin+psh+urg | 无响应 | rst | ||
-sU,UDP端口扫描 | 不相关 | 有UDP响应或无响应 | icmp type=3 code=3 | ICMP type=3 code=1,2,9,10,13 | 不准确,通常只能判断closed和open|filtered |
由表可知:
-
-sS扫描最常用,快速、精准,且无日志;-
-
-sT方式最精准,但有日志记录;
-
-sA/-sW能够识别是否有防火墙,对于识别windows防火墙非常有效。
1.3 其他技术原理
Nmap还包括操作系统指纹识别技术、服务识别技术、防火墙绕过技术以及NSE(Nmap Scripting Engine)脚本引擎。
其原理大致是通过一些签名比对匹配之类的来识别。
2. 常用参数与命令
一条Nmap命令主要由以下几个部分组成:
nmap 主机发现参数 端口扫描参数 其他参数 目标主机(/网段)
2.1 主机发现参数
参数 | 描述 | 是否常用 |
---|---|---|
-sL | 列表扫描。仅列出指定目标有哪些IP,不进行主机发现 | 一般 |
-sn | 默认的主机发现方式。组合ARP扫描,ICMP扫描,端口扫描3种技术(表1原理)进行主机发现 | 常用 |
-Pn | 不进行主机发现,直接进入端口扫描阶段。能绕过ICMP过滤,老版本为-P0。 | 常用 |
-PS/-PA/-PU/-PY | 分别用TCP SYN/TCP ACK/UDP/SCTP技术进行主机发现。 | 常用 |
-PE/-PP/-PM | 分别用ICMP ECHO/ICMP TIMESTAMP/ICMP MASK技术进行主机发现。 | 一般 |
-PO | 使用参数指定的协议(如TCP)对主机进行扫描。 | 不常用 |
2.2 端口扫描参数
参数 | 描述 | 是否常用 |
---|---|---|
-p | 指定端口扫描。格式:-p 21,22,80,3389、-p 1-80等 | |
-sT/-sS | TCP全连接扫描(不隐蔽)/ TCP半连接扫描(隐蔽)。 | 常用 |
-sA/-sW | TCP ACK/TCP WINDOW扫描,用于确定目标主机是否有开启防火墙。 | 一般 |
-sM | FIN、ACK同时置位1的扫描。 | 一般 |
-sN/-sF/-sX | NULL/FIN/XMAS扫描。 | 一般 |
-sU | UDP扫描。 | 常用 |
-sI | 盲扫描。 | 不常用 |
-sO | 协议扫描,用于确定目标主机支持哪些协议。 | 一般 |
-sY/-sZ | SCTP/COOKIE-ECHO扫描。 | 不常用 |
-b | FTP代理扫描。 | 不常用 |
2.3 其他参数
参数 | 描述 | 是否常用 |
---|---|---|
-O | OS(操作系统)指纹识别扫描 | 常用 |
-A | OS指纹识别、服务版本扫描、脚本扫描、traceroute(相当于全面扫描) | 常用 |
-sA/-sW | 探测主机是否开启防火墙 | 常用 |
-f | 使用分片报文扫描目标主机 | 常用 |
-sC | 使用脚本对目标主机进行安全扫描 | 一般 |
-sV | 探测主机端口上运行的服务的版本信息 | 常用 |
-oN/-oX/-oS/-oG | 将扫描结果导出为txt、Xml、Script kIddi3、Grepable格式 | 一般 |
-v | 显示扫描过程的详情 | |
-T0~-T5 | 设置扫描时序 |
2.4 常用命令
Nmap的一些常见扫描语句如下:
-
nmap –sn 192.168.1.200/24 //扫描目标网段中有哪些主机是活跃的,可以快速收集到活跃主机。
-
nmap –Pn –p 80,443,8080 192.168.1.200/24 //快速定位目标网段中的WEB服务器。
-
nmap –sS –sU –A –v –T4 192.168.1.200 //对目标主机进行完整扫描,包括知名端口的TCP、UDP扫描,操作系统探测,服务探测,常见漏洞探测。
-
nmap –sS –p 1-65535 –v –T4 192.168.1.200 //对目标主机所有端口进行TCP端口扫描。
-
nmap –sA/-sW 192.168.1.200 //识别目标主机是否在防火墙之后。
3. 注意事项
1.宏观细节:
-
如果在同一网段,则无论主机发现参数如何指定,Nmap都使用ARP扫描完成主机发现。
-
如果没有指定任何参数(如:nmap 192.168.1.1),默认扫描目标主机的1-1000端口。
-
如果未指定主机发现方式,则使用-sn参数进行主机发现。
-
如果未指定端口扫描方式,则使用-sS参数进行端口扫描。
2. 微观细节:
-
-sW,TCP window扫描。是指发送一个构造好的TCP探测包,看对方TCP响应包里window字段(窗口字段)的内容来判断端口状态,而不是说和Windows系统有关。
-
-T0~-T5 设置的扫描时序详情
-T0(偏执的) 非常慢的扫描,用于IDS逃避(IDS,入侵检测系统)
-T1(鬼祟的) 较慢的扫描,用于IDS逃避
-T2(文雅的) 降低速度以降低对宽带的消耗,一般不常用
-T3(普通的) 默认,根据目标的反应自动调整时间
-T4(野蛮的) 快速扫描,常用的扫描方式,网络条件好时用,请求可能会淹没目标
-T5(疯狂的) 极速扫描,以牺牲准确度来提升扫描速度
3. Nmap通过探测将端口划分为6个状态
- open:端口是开放的。
- closed:端口是关闭的。
- filtered:端口有防火墙IDS/IPS过滤,无法确定其状态。
- unfiltered:端口没有过滤,但是否开放需要进一步确定。
- open|filtered:端口是开放的或有过滤。
- closed|filtered :端口是关闭的或有过滤。