Nmap学习笔记

Nmap学习笔记
lololowe1. 基本操作
使用nmap最简单的方式就是在命令行中输入nmap和目标IP地址(或域名),例如:
1 | nmap 192.168.31.254 |
执行这条命令后,nmap首先会判断有没有root权限,如果有,则会继续检查扫描目标是否和自己在同一网段,如果是的话,则进行ARP协议的主机存活探测(相当于使用-PR
选项,会发送ARP请求报文并等待应答),否则将同时进行TCP协议和ICMP协议的主机存活探测(相当于使用-sP
,会对目标的80和443端口发起SYN请求以及ICMP响应请求和时间戳请求,并等待应答);
如果没有root权限,则会跳过同网段检查,直接进行TCP协议的主机存活探测(-sP
),探测80和443端口是否响应SYN请求,不会进行ICMP协议的主机存活探测,因为缺少root权限;
如果探测到主机存活,则会进行反向DNS解析,否则直接退出扫描。
反向DNS解析之后,nmap会进行端口扫描,默认扫描1000个最有可能开放的端口,使用的扫描技术
2. 扫描过程分析
2.1. 发包和收包检测
nmap提供了--packet-trace
选项,通过它可以观察nmap发出了哪些数据包,收到了哪些数据包,有了这个研究方法,可以更深入地理解nmap的运行原理。
例如,不进行反向DNS解析(-n
)以及端口扫描(-sn
),只使用ICMP协议的响应请求和应答报文进行主机发现(-PE
),同时使用--packet-trace
选项观察nmap发送和接收的数据包,可以使用如下命令:
1 | sudo nmap -n -sn -PE 192.168.31.254 --packet-trace |
从上图可以看到,在对 192.168.31.254 扫描时,虽然也使用了-PE
选项,但是根本没有发送ICMP数据包,而是使用了ARP格式的请求。原因是由于nmap的设计思路,nmap会首先判断目标主机与nmap所在主机是否在同一网段,如果是的话,则直接使用ARP扫描模式。如果不在同一网段,才会使用用户指定的ICMP协议进行扫描,例如下面的例子:
1 | sudo nmap -n -sn -PE 172.16.12.76 --packet-trace |
由于目标主机 172.16.12.76 与nmap所在主机不在同一网段,所以nmap使用了用户指定的ICMP协议进行扫描。
在对192.168.10.20扫描时,虽然也使用了
-PY
选项,但是根本没有发送SCTP数据包,而是使用了ARP格式的请求。这其实是
2.2. 路由追踪
nmap提供了--traceroute
选项,通过它可以观察nmap发出的数据包经过的路由路径,例如:
1 | sudo nmap -n -sn -PE scanme.nmao.org --traceroute |
3. 扫描范围的确定
3.1. 连续主机扫描
输入如下命令来选择扫描范围为192.168.10.1~192.168.10.254的主机:
1 | nmap -sn 192.168.10.1-255 |
3.2. 子网扫描
nmap支持使用CIDR(Classless Inter-Domain Routing,无分类域间路由选择)的方式来扫描整个子网。
例如要扫描192.168.10.1~192.168.10.254这个子网范围的主机,还可以使用如下命令:
1 | nmap -sn 192.168.10.1/24 |
3.3. 不连续主机扫描
nmap可以一次扫描多个主机,如果这些扫描的目标地址没有任何的关系,那么可以通过将目标地址用空格分隔开的方式来同时对这些主机进行扫描。
例如对192.168.10.10、192.168.10.20、192.168.10.30、192.168.10.40进行扫描,可以使用如下命令:
1 | nmap -sn 192.168.10.10 192.168.10.20 192.168.10.30 192.168.10.40 |
3.4. 排除指定目标
在对一些主机进行扫描时,如果需要排除某些指定主机,可以使用--exclude
选项。
例如,如果我们希望在扫描192.168.10.0/24子网的时候,并不对192.168.10.20进行扫描,就可以使用如下命令。
1 | nmap -sn 192.168.10.0/24 --exclude 192.168.10.20 |
3.5. 指定文本文件扫描
如果需要经常性地对某些地址进行扫描,那么每次都在命令中输入这些地址是相当麻烦的,可以将常用的地址保存在一个记事本文件中,然后用 -iL
把文件名作为选项传给Nmap。
例如List.txt,以后,每次想对这些地址进行扫描,无须重新输入,只需要将这个文本文件设定为目标即可:
1 | # vim List.txt |
3.6. 随机扫描主机
nmap中还提供了一个非常有意思的功能,那就是使用-iR
选项指定n个随机目标,然后nmap会对这些目标进行扫描。
例如随机在互联网上对3个IP地址进行扫描,可以使用的命令如下:
1 | nmap -sn -iR 3 |
4. nmap中的DNS选项
在对一台主机进行扫描的时候,如果它有域名的话,nmap会向域名服务器提出请求,显示该IP所对应的域名(反向DNS解析)。但是,在进行扫描时,可能扫描的是一个范围,在这个范围内的多台主机可能有的处于活跃状态,而有的却处于非活跃状态,如果直接进行扫描,nmap只会对处于活跃状态的主机进行DNS转换,而非活跃状态的主机则不予处理。
如果希望所有的目标IP无论是否是活跃主机, 都将其对应的域名列出来的话,可以使用-R
选项:
1 | nmap -sn -R 45.33.32.156-160 |
如果强制将每一个IP都转换为域名,将会耗费大量的时间,有时可能已经知道主机的域名,无须进行任何转换,此时就可以使用-n
选项来取消反向DNS解析,这一点在对大规模的网络进行扫描时效果极其明显:
1 | nmap -sn -n 45.33.32.156-160 |
从上图可以看到域名解析成IP后还会进行一次反向DNS解析,因此耗时1.19s扫完,而跳过反向DNS解析只需0.23s扫完。
如果不想在自己的本地DNS服务器留下本次查询记录,可以使用--dns-servers
选项指定DNS服务器来查询目标:
1 | nmap --dns-servers 8.8.8.8 scanme.nmap.org |
5. 主机存活探测
活跃主机: 已经处于运行状态并且网络功能正常的主机
nmap在扫描时,默认会将目标例如端口之类的信息也扫描出来,但是如果只是想要知道目标是否为活跃主机,则并不需要这些信息。
而如果使用-sn
参数,则只会显示是否为活跃主机这一条,在nmap中执行如下命令:
1 | nmap -sn scanme.nmap.org |
5.1. 基于ARP协议扫描
基于ARP协议的主机存活探测技术的原理是:如果想要知道处在同一网段的IP地址为 *.*.*.*
的主机是否为活跃主机,只需要构造一个ARP请求数据包,并广播出去,如果得到了回应,则说明该主机为活跃主机。
这种发现技术的优点在于准确度高,任何处于同一网段的设备都没有办法防御这种技术,因为如果不遵守ARP,那么将意味着无法通信。缺点在于这种发现技术不能对处于不同网段的目标主机进行扫描。
当目标主机与我们处于同一网段的时候,使用ARP协议扫描技术就是最佳的选择。不仅速度最快,扫描结果也是最为精准的。这是因为没有任何安全措施会阻止正常的ARP请求。使用nmap的选项-PR
就可以实现ARP协议的主机发现:
1 | nmap -sn -PR 192.168.10.20 |
由于Nmap的设计思路,Nmap会首先判断目标主机与Nmap所在主机是否在同一网段,如果相同的话,则直接使用ARP扫描模式,即使已经指定了ICMP扫描模式。
5.2. 基于ICMP协议扫描
ICMP的报文可以分成两类:差错报告报文和询问报文。
nmap的ICMP主机存活探测技术使用的就是询问报文。
ICMP协议中包含了很多种方法,但是这些基于ICMP协议的扫描方式往往也是安全机制防御的重点,因此经常得不到准确的结果。
如果不使用root权限,Nmap 将使用一种称为
TCP Pingscan
的替代方法来检查目标主机的在线状态(不会使用ICMP协议)。这种方法利用TCP协议发送一个无效的TCP连接请求到目标主机的80端口,来观察目标主机是否响应。为什么普通用户可以使用操作系统的 ping 命令发送 ICMP Echo 请求,而在 nmap 中,ICMP Ping 扫描却需要管理员权限?原因在于SUID权限:https://www.leavesongs.com/PENETRATION/linux-suid-privilege-escalation.html
ICMP中适合使用的询问报文包括3类:响应请求和应答、时间戳请求和应答、地址掩码请求和应答。
5.2.1. 响应请求
使用nmap的选项-PE
就可以实现ICMP协议的响应(Echo)请求主机发现。这个过程实质上和ping是一样的:
1 | sudo nmap -sn -PE scanme.nmap.org |
不加sudo将会使用TCP ping扫描,不是真正的ICMP ping扫描。
5.2.2. 时间戳请求
ping方式已经被很多网络所禁止,因此必须另觅它法。比如时间戳请求和应答。
使用nmap的选项-PP
就可以实现ICMP协议的时间戳主机发现:
1 | sudo nmap -sn -PP scanme.nmap.org |
5.2.3. 地址掩码请求
虽然这个协议主要使用在无盘系统中,但是也有一些系统在收到这个请求后会发送一个应答。需要注意的是,这种方法在实际中很少使用。
使用nmap的选项-PM
可以实现ICMP协议的地址掩码(Mask)主机发现:
1 | sudo nmap -PM -sn scanme.nmap.org |
从上图可以发现,第一条不加sudo
的命令使用的是TCP ping扫描,由于扫描目标 scanme.nmap.org 的80端口运行了http服务,因此收到了响应,从而判断出 scanme.nmap.org 是活跃主机。而第二条命令加上了root权限,使用的是ICMP地址掩码主机发现,由于 scanme.nmap.org 没有响应,因此判断出 scanme.nmap.org 不是活跃主机。
5.3. 基于TCP协议扫描
TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。
TCP的特点是使用三次握手协议建立连接。当主动方发出
SYN
连接请求后,等待对方回答TCP的三次握手SYN+ACK
,并最终对对方的SYN执行ACK
确认。这种建立连接的方法可以防止产生错误的连接,TCP使用的流量控制协议是可变大小的滑动窗口协议。如果想知道主机B是否处于活跃状态,就可以向主机B的全部端口(通常并不这样做,而是选择一部分常用的端口)发送连接请求数据包,如果得到回应(注意只要收到了数据包),就可以认为主机B是活跃主机。
TCP扫描是nmap扫描技术中最强大的技术之一,很多服务器的防御机制都会屏蔽掉ICMP echo请求数据包,但是任何的服务器都会响应针对其服务的SYN数据包。
5.3.1. SYN扫描
nmap中使用-PS
选项来向目标主机发送一个设置了SYN标志的数据包,这个数据包的内容部分为空。通常默认的目标端口是80端口,也可以使用参数(可以指定一个以逗号分隔的端口列表,端口与选项之间不能有空格)来改变目标端口:
1 | nmap -sn -PS scanme.nmap.org |
注意:基于TCP SYN协议的主机存活探测技术,在收到到目标主机SYN+ACK响应报文后,Nmap不会做任何响应(RST或ACK),由于Nmap没有响应,服务端会在几次重传SYN/ACK报文后,发送RST报文终止连接:
5.3.2. ACK扫描
ACK扫描和SYN扫描相当相似,不同之处只在于nmap发送的数据包中使用TCP/ACK标志位,而不是SYN标志位。
nmap直接向目标主机发送一个TCP/ACK数据包,目标主机显然无法清楚这是怎么回事,当然也不可能成功建立TCP连接,因此目标主机只能向nmap所在主机发送一个RST标志位的数据包。
在实际情况中,这种类型的扫描很少能成功,造成这种情况的原因是目标主机上的安全机制或者安全设备会将这种莫名其妙的TCP/ACK包直接过滤掉。
这种ACK扫描的方式同样以80端口作为默认端口,也可以进行指定。
如果需要对目标主机采用这种扫描方式,可以使用使用nmap的选项-PA
:
1 | nmap -sn -PA scanme.nmap.org |
5.4. 基于UDP协议扫描
由于UDP协议是非面向连接的,对UDP端口的探测也就不可能像TCP端口的探测那样依赖于连接建立过程,这也使得UDP端口扫描的可靠性不高。
当一个UDP端口收到一个UDP数据包时,如果它是关闭的,就会给源端发回一个ICMP端口不可达数据包;如果它是开放的,就会忽略这个数据包,也就是将它丢弃而不返回任何信息(将无法判断数据包是在传输过程中丢失了还是被目的主机丢弃了)。
TCP需要扫描目标主机开放的端口,而UDP需要扫描的是目标主机关闭的端口,在扫描的过程中,需要避开那些常用的UDP协议端口,例如DNS(端口53)、DHCP(67)。因此在扫描的时候,最合适的做法就是选择一个值比较大的端口,例如供客户端使用的短暂端口号(49152-65535)。Nmap默认探测的UDP端口是40125。
使用nmap的选项-PU
就可以实现UDP协议的主机发现:
1 | sudo nmap -sn -PU scanme.nmap.org |
使用UDP Ping(-PU),需要以root权限运行, 因为需要从网络中读取原始响应数据。
从上图可以看到,第一次扫描时,提示目标主机未存活,第二次扫描时加上了--packet-trace
选项,可以看到发送的UDP数据包,以及目标主机返回的ICMP端口不可达数据包。说明目标主机是存活的,只是Nmap没有将ICMP端口不可达消息视为主机存活的证据,因此,使用-PU
选项进行UDP协议的主机存活探测时,需要加上--packet-trace
选项。
5.5. 基于SCTP协议扫描
SCTP(Stream Control Transmission Protocol,流控制传输协议)与TCP虽然同属于传输层协议,用于完成数据传输任务,但它们之间存在显著差异。TCP通常用于单地址连接,采用字节流传输,且通过三次握手建立连接,而SCTP支持多地址连接,基于消息流传输,能够同时处理多个流,并通过一种4次握手的机制建立连接,这种机制包括客户端发送INIT报文、服务器端回应INIT-ACK报文和cookie、客户端回传COOKIE-ECHO报文以及服务器端分配资源并发送COOKIE-ACK报文,从而有效提高安全性。
这种扫描方法只能作为一种备用手段,因为支持SCTP协议的主机并不多。
使用nmap的选项-PY
就可以向目标主机发送一个SCTP INIT报文:
1 | sudo nmap -sn -PY scanme.nmap.org |
使用SCTP INIT Ping(-PU),需要以root权限运行, 因为需要从网络中读取原始响应数据
5.6. 基于IP协议扫描
IP报文首部中的协议字段(8bit)定义了该报文数据区使用的协议。比如ICMP为1, IGMP为2, TCP为6, UDP为17, IPv6为41, L2TP为115等。更多协议编号可以看这里:https://blog.csdn.net/jiajiren11/article/details/81560844
nmap允许向目标主机发送IP数据包来检测目标主机是否活跃,这种方式允许指定所要使用的协议,如果不指定的话,nmap默认使用ICMP(IP协议编号1)、IGMP(IP协议编号2)和IP-in-IP(IP协议编号4)这三个协议。
nmap使用选项-PO
来指定所要使用协议的编号。默认的IP扫描方式为:
1 | sudo nmap -sn -PO scanme.nmap.org |
使用IP协议(-PO)扫描时,需要以root权限运行, 因为需要从网络中读取原始响应数据。
实际上就相当于:
1 | sudo nmap -sn -PO1,2,4 scanme.nmap.org |
另外,这种情形发出的数据包内容都是空的,这种数据包很容易被检测出来,可以使用一个--data-length
参数来发送添加了随机数据的数据包。例如:
1 | sudo nmap -sn -PO --data-length 25 scanme.nmap.org |
5.7. 综合扫描
综合扫描表示同时使用传输层和应用层的协议进行主机存活探测。
nmap的-sP
选项表示只进行Ping扫描,不进行端口扫描。并且是同时同时发起ICMP响应请求和时间戳请求,以及TCP SYN请求到80和443这2两个端口:
1 | sudo nmap scanme.nmap.org -sP |
6. 端口扫描
TCP/IP协议栈的运输层使用端口号来标识和区分应用层的不同应用进程。端口号的长度为16 bit,取值范围是0〜65535,分为两大类:
- 服务端使用的端口号,又分为两类:
- 熟知端口号:又称为全球通用端口号,取值范围是
0〜1023
。因特网号码分配管理局IANA将这些端口号分配给了TCP/IP协议栈应用层中最重要的一些应用协议。例如,HTTP服务器端的端口号为80, FTP服务器端的端口号为21和20。 - 登记端口号:取值范围是
1024〜49151
这类端口号是为没有熟知端口号的应用 程序使用的,要使用这类端口号必须在因特网号码分配管理局IANA按照规定的手续登记,以防止重复。例如,Microsoft RDP微软远程桌面应用程序使用的端口号是3389
- 客户端使用的短暂端口号:取值范围是
49152〜65535
。这类端口由客户进程在运行时动态选择,又称为临时端口号。
6.1. 端口状态的定义
nmap中对于端口给出了6种不同的状态描述:
open:如果目标端口的状态为open,这表明在该端口有应用程序接收TCP连接或者UDP报文。
closed:如果目标端口的状态为closed,并不意味着没有任何反应,状态为closed的端口是可访问的,这种端口可以接收nmap探测报文并做出响应。相比较而言,没有应用程序在open上监听。
filtered:产生这种结果的原因主要是存在目标网络数据包过滤,由于这些设备过滤了探测数据包,导致nmap无法确定该端口是否开放。这种设备可能是路由器、防火墙甚至专门的安全软件。
unfiltered:这种结果很少见,它表明目标端口是可以访问的,但是nmap却无法判断它到底是open还是closed的。通常只有在进行ACK扫描时才会出现这种状态。
open | filtered:无法确定端口是开放的还是被过滤了,开放的端口不响应就是一个例子。
closed|filtered:无法确定端口是关闭的还是被过滤了。只有在使用idle扫描时才会发生这种情况。
6.2. SYN扫描
SYN扫描是最为流行的一种扫描方式,同时它也是nmap所采用的默认扫描方式(前提是有root权限)。这种扫描方式速度极快,可以在一秒钟扫描上千个端口。又因为nmap在收到SYN/ACK后会发送RST包请求断开连接而不是ACK应答。这样,三次握手就没有完成,无法建立正常的TCP连接,本次扫描也就不会被记录到系统日志中,SYN扫描也就不容易被网络中的安全设备所发现,所以SYN扫描又被称为半开放扫描或隐秘扫描。
SYN扫描使用-sS
选项,如果知道目标主机是存活的,还可以使用-Pn
或-P0
选项跳过存活探测,节省时间:
1 | nmap -Pn -sS scanme.nmap.org # 没有root权限进行SYN扫描会失败 |
这里的
-sS
端口扫描和前面的-PS
主机存活探测的区别为:前者需要root权限,后者不需要,因为前者在收到目标的SYN/ACK后会发送RST断开连接,而后者不会。并且前者默认扫描1000个常见端口而后者默认只扫描80。
6.3. Connect扫描
这种扫描方式其实和SYN扫描很像,只是这种扫描方式完成了TCP的三次握手。这种扫描方式无须root或者administrator权限。
Connect扫描使用-sT
选项,命令如下:
1 | nmap -Pn -sT scanme.nmap.org # 也可以不指定-sT选项,因为默认就是Connect扫描 |
注意:在使用了socks代理时,必须使用Connect扫描(
-sT
),因为socks代理不支持SYN扫描。
6.4. UDP扫描
nmap对一个端口进行UDP扫描时,结果是下图所示的open、closed和filtered三者之一:
要注意UDP扫描的速度是相当慢的,原因是在RFC1812中对ICMP错误报文的生成速度做出了限制。
使用UDP扫描端口的选项为-sU
:
1 | sudo nmap -Pn -sU scanme.nmap.org |
6.5. TCP FIN扫描
TCP FIN扫描方法向目标端口发送一个FIN数据包。按照RFC 793的规定,对于所有关闭的端口,目标系统应该返回RST标志。
使用TCP FIN扫描端口的选项为-sF
:
1 | sudo nmap -Pn -sF scanme.nmap.org |
6.6. NULL扫描
TCP NULL扫描方法是向目标端口发送一个不包含任何标志的数据包。按照RFC 793的规定,对于所有关闭的端口,目标系统应该返回RST标志。
使用TCP NULL扫描端口的选项为-sN
:
1 | sudo nmap -Pn -sN scanme.nmap.org |
6.7. Xmas Tree扫描
TCP Xmas Tree扫描方法是向目标端口发送一个含有FIN、URG和PUSH标志的数据包。按照RFC 793的规定,对于所有关闭的端口,目标系统应该返回RST标志。
使用TCP Xmas Tree扫描端口的选项为-sX
:
1 | nmap -Pn -sX scanme.nmap.org |
6.8. idle扫描
一种更加高级的扫描方式是TCP空闲扫描,这种扫描能让我们冒充网络上另一台主机的ip地址,对目标进行更为隐秘的扫描(这里的空闲主机的意思是该主机在一段特定时间内不向网络发送数据包),这种扫描方式又称为僵尸扫描、闲置扫描。
例如使用-sI
选项指定 kiosk.adobe.com 作为第三方主机,然后对 www.riaa.com 进行扫描:
1 | sudo nmap -Pn -sI kiosk.adobe.com www.riaa.com |
6.9. 指定端口扫描
-p
指定特定端口扫描:
1 | nmap -Pn -p 1234 scanme.nmap.org |
-F
扫描常见的100个端口:
1 | nmap -Pn -n -F scanme.nmap.org |
- 使用协议名称来指定扫描相关端口:
1 | nmap -Pn -p ssh,http scanme.nmap.org |
- 指定协议和端口进行扫描
1 | sudo nmap -Pn -sU -sT -p U:53,T:80 scanme.nmap.org |
- 扫描所有端口
1 | nmap -p - scanme.nmap.org |
--top-ports
扫描指定数量的常用端口
1 | nmap -Pn --top-ports 10 scanme.nmap.org |
7. 操作系统与版本扫描
nmap的-A
选项可以同时对目标进行操作系统指纹识别和运行服务的版本扫描,以及默认的脚本扫描。
7.1. 操作系统指纹扫描
Nmap并不使用被动式的判断目标计算机操作系统的方法。Nmap中的主动式方法采用多达15个探针的操作系统指纹扫描包。操作系统指纹这个名字来源于生物学上的名词指纹。因为人的指纹都是独一无二的,因此可以作为身份验证的一种机制。同样每一种类型的操作系统也都有自己的特征,通过向一台计算机发送特定格式的探针(数据包)来查看目标主机的响应数据,这一过程就是操作系统指纹分析的过程。这些强大的探针利用了TCP、UDP、ICMP等各种协议。这些探针经过巧妙设计,可以发现目标操作系统细微的差别。
在nmap中使用-O
选项通过端口扫描来完成对操作系统(Operating System)的扫描。这个命令将会使用Nmap默认的SYN扫描方式来完成端口检测:
1 | sudo nmap -n -Pn -O scanme.nmap.org |
注意:操作系统扫描依赖于端口扫描,因此在进行操作系统扫描时不能指定
-sn
选项跳过端扫。操作系统扫描结果只是猜测(JUST GUESSING),并不能够保证一定准确。
7.2. 运行服务版本扫描
Nmap提供了更精确的服务及版本检测选项,可通过添加选项-sV
进行服务和版本检测:
1 | sudo nmap -n -Pn -sV scanme.nmap.org |
执行后,首先进行端口扫描,默认情况下使用SYN扫描。其次进行服务识别,发送探针报文,得到返回确认值,确认服务。最后进行版本识别,发送探针报文,得到返回的报文信息,分析得出服务的版本。
还可以使用以下选项进行服务版本扫描:
--version-intensity <intensity>
(设置版本扫描强度):当进行版本扫描(-sV)时,Nmap发送一系列探测报文,每个报文都被赋予一个1到9之间的值。这里的强度水平说明了应该使用哪些探测报文。数值越高,服务越有可能被正确识别。然而,高强度扫描花更多时间。强度值必须在0和9之间。默认是7。
--version-light
(打开轻量级模式):–version-light其实就相当于–version-intensity 2。这种轻量级模式使版本扫描速度快了许多,不过使用这种模式对服务进行扫描成功的几率也小一些。
--version-all
(尝试每个探测):–version-all其实就相当于version-intensity 9,保证对每个端口尝试所有探测报文。
--version-trace
(跟踪版本扫描活动)这将会使Nmap打印出关于正在进行的扫描的详细调试信息。它是你用–packet-trace所得到的信息的子集。
-sR
(RPC扫描)这种方法和许多端口扫描方法联合使用。它对所有被发现开放的TCP/UDP端口执行SunRPC程序NULL命令,试图确定它们是否RPC端口,如果是,可以确定是什么程序和版本号。
8. 辅助扫描
8.1. 分段扫描(碎片扫描)
使用-f
选项可以对Nmap发送的探测数据包进行分段。这样将原来的数据包分成几个部分,目标网络的防御机制例如包过滤、防火墙等在对这些数据包进行检测的时候就会变得更加困难。另外必须谨慎使用这个选项,一些老旧的系统在处理分段的包时经常会出现死机的情况(泪滴攻击(TearDrop))。
1 | sudo nmap -f scanme.nmap.org |
8.2. 指定MTU大小
在Nmap中使用-mtu
选项可以指定MTU的大小,这里MTU的值必须是8的整数倍:
1 | sudo nmap -mtu 48 scanme.nmap.org |
8.3. 指定TTL大小
Nmap中可以设置IPv4数据包的time-to-live域为指定的值,指定的选项为-ttl
:
1 | sudo nmap -n -sn --ttl 10 scanme.nmap.org |
8.4. 源地址伪造
伪造大量的主机地址对目标进行扫描时,目标主机可以发现有人正在进行扫描,但是由于扫描数据包来自于多个主机,即使是IDS也只能知道目前正在受到扫描,并不知道到底是哪台主机在进行扫描。这是一种常用的隐藏自身IP的可靠技术。Nmap中支持使用诱饵主机,在扫描时,使用选项-D
来指定诱饵主机,使用逗号分隔每个诱饵IP地址,也可用自己的真实IP作为诱饵,自己的IP地址可以使用ME
选项代替。如果在第6个位置或更后的位置使用ME选项,一些常用端口扫描检测器(如Solar Designer’s excellent scanlogd)就不会报告这个真实IP。如果不使用ME选项,Nmap将真实IP放在一个随机的位置:
1 | sudo nmap -D 192.168.31.1,192.168.31.2,192.168.31.3,ME -n -Pn scanme.nmap.org |
8.5. 源端口伪造
nmap的-g
和--source-port
选项可以指定源端口,这两个选项是等价的:
1 | sudo nmap -g 53 scanme.nmap.org |
8.6. MAC地址伪造
nmap的--spoof-mac
选项可以伪造MAC地址,这个选项的参数可以是完整MAC地址、OUI(3字节前缀)、OEM名称、随机MAC地址(数字0表示):
1 | sudo nmap --spoof-mac 00:11:22:33:44:55 scanme.nmap.org # 使用指定的MAC地址 |
8.7. 字节填充
默认情况下,Nmap发送的报文中只包含首部,数据部分是空的,很容易被目标网络检测机制所发现,因此在试图通过这些目标网络的检测机制时,可以在数据包上附加指定数量的随机字节,这个选项会使得大部分ping和端口扫描变慢,但是影响并不大。
nmap使用--data-length
选项可以指定数据包中附加的随机字节的数量:
1 | sudo nmap -n 172.16.94.254 -sn -PE --data-length 25 |
8.8. 时序模式
在 Nmap 中,-T
选项用于设置扫描的时间模板,范围从 0 到 5:
-T0
: Paranoid (极慢) - 适合避免 IDS(入侵检测系统)和防火墙的检测。-T1
: Sneaky (慢) - 适合于尽可能低调地进行扫描。-T2
: Polite (中等偏慢) - 在正常速度下进行扫描,减少网络负载。-T3
: Normal (正常) - 默认设置,适合大多数扫描。-T4
: Aggressive (偏快) - 更快的扫描速度,适合在可靠网络上使用。-T5
: Insane (极快) - 用于非常快速的扫描,适合在局域网中,但可能会导致网络拥塞并容易被检测到。
1 | sudo nmap -Pn -n -T5 192.168.31.254 -p 22,443 -sV |
9. NSE脚本应用
NSE(Nmap脚本引擎)自2007年由Gordon Fyodor Lyon在谷歌“代码之夏”大会上发布以来,已成为Nmap不可或缺的部分,扩展了其功能,使其不仅限于服务和主机的探测,而是包含了500多个脚本,涉及网络口令、服务器安全性配置和漏洞审计等多个领域。NSE使用Lua语言编写,易于学习,使得网络安全工作者能轻松将想法转化为代码,因此其脚本库更新迅速,定期更新脚本库成为了良好习惯。
9.1. 默认脚本
nmap的-sC
选项会利用default(默认)分类中所有脚本对目标进行检测,这个分类中的脚本一般不会对目标系统造成任何危害。但是有些脚本可能会引起目标系统上的安全防御措施的警报。普通的用户权限并不能发送原始套接字,因此需要使用sudo
来运行nmap:
1 | sudo nmap -n -Pn -F scanme.nmap.org -sC |
默认脚本提供基本的服务检测,版本检测、漏洞检测等。
9.2. 指定脚本
9.2.1. HTTP方法检测
在Nmap中需要使用--script
选项来指定所使用的脚本。
检测web服务器支持的HTTP方法,可以使用http-methods
脚本:
1 | sudo nmap -n -Pn -p http scanme.nmap.org --script http-methods |
9.2.2. 漏洞检测
nmap提供了漏洞扫描功能,使用--script vuln
选项:
1 | sudo nmap -n -Pn --script vuln --script-args vulns.showall -p 80 testphp.vulnweb.com |
9.2.3. MySQL弱口令检测
1 | sudo nmap -Pn -n -p 3306 --script mysql-brute testphp.vulnweb.com |
9.2.4. 跨站点请求伪造CSRF检测
1 | sudo nmap -n -Pn -p 80,443 --script http-csrf testphp.vulnweb.com |
9.2.5. 存储型XSS检测
1 | sudo nmap -n -Pn -p 80,443 --script http-stored-xss testphp.vulnweb.com |