渗透测试工具指南---Nmap篇

深渊向深渊呼唤

简介
Nmap,即Network mapper(网络映射器),是一个用于网络扫描、网络嗅探的软件工具,功能强大,是寻找系统脆弱位置和评估系统安全性的有效工具,具体功能包括:

    主机发现(检测活跃在网络上的主机) 端口发现(检测主机所开放的端口) 服务发现(检测相应端口用于提供服务的软件及版本) 检测主机的硬件地址、操作系统类型及版本
    对于黑客,寻找系统脆弱位置是攻击的第一步,而Nmap则是进行这一步骤的有效工具,黑客可以通过扫描得到的主机开放的端口号及其服务版本、结合操作系统的类型和版本,利用已知漏洞和大部分人安全意识的缺失,对系统进行攻击,进而获取系统的控制权、删除日志、隐藏行踪、开辟后门。
    对于网络管理员和渗透测试人员,可以进行网络故障排查,也可以利用相同的方式对系统进行扫描,从而找出系统存在的已知漏洞,通过打补丁等方式进行预防,当然,这个过程还要考虑可能带来的损失大小以及企业的经济情况。

Nmap基础命令

    扫描单一主机
    命令如下:
    nmap 192.168.2.103
    效果如下图所示:
    渗透测试工具指南---Nmap篇
    扫描结果得出,IP地址为192.168.2.103的目标主机处于打开状态,对该主机扫描的1000个端口中有994个处于关闭状态,端口号为80、135、139、443、445、1025的端口处于开放状态,分别提供http、msrpc、netbios-ssn、https、microsoft-ds、NFS-or-IIS服务,目标主机的硬件地址为00:0C:29:C9:B5:67。
    该命令扫描的实质是半TCP连接,通过wireshark抓包如下:
    渗透测试工具指南---Nmap篇
    从上图可以看出,扫描机发送的是带有SYN标记的TCP报文段,进行第一次握手。对于目标主机开放的80号端口,其返回的是带有SYN、ACK标记的TCP报文段,进行第二次握手;对于目标主机关闭的256号端口,其返回的是带有RST、ACK的TCP报文段,断开连接请求。

    扫描整个子网
    命令如下:
    nmap 192.168.2.0/24
    效果如下图所示:
    渗透测试工具指南---Nmap篇渗透测试工具指南---Nmap篇
    拿IP地址为192.168.2.1的目标主机来解释,该主机打开,对其扫描的1000个端口中,有998个端口的扫描被防火墙或IDS过滤掉,80号端口和1900号端口处于打开状态,分别提供http、upnp服务;对于IP地址为192.168.2.104的主机,还可知道其是华为设备。这条命令扫描的实质仍然是半TCP连接。

    扫描多个目标
    命令如下:
    nmap 192.168.2.100 192.168.2.104
    效果如下图所示:
    渗透测试工具指南---Nmap篇
    从结果不难分析得出:IP地址为192.168.2.104的主机没有打开; IP地址为192.168.2.100的主机处于打开状态,1000个端口扫描都被该主机的防火墙或IDS过滤,MAC地址为34:80:B3:3C:40:17,该主机为小米设备。

    扫描一个范围内的IP地址
    命令如下:
    nmap 192.168.2.1-100
    效果如下图所示:
    渗透测试工具指南---Nmap篇
    该命令扫描的IP地址范围从192.168.2.1至192.168.2.100,从扫描结果可以看出,100台主机中仅有IP地址为192.168.2.1的主机处于打开状态。

    扫描除去某个IP地址外的所有子网主机
    命令如下:
    nmap 192.168.2.0/24 –exclude 192.168.2.1
    效果如下图所示:
    渗透测试工具指南---Nmap篇
    被扫描的主机中仅有IP地址为192.168.2.102、192.168.2.101的主机处于打开状态。对于IP地址为192.168.2.102的主机,996个端口扫描被该主机的防火墙或IDS过滤拦截,443、902、912、3389号端口处于打开状态,分别提供https、iss-realsecure、apex-mesh、ms-wbt-server服务;对于IP地址为192.168.2.101的主机,扫描的1000个端口都处于关闭状态。

    扫描保存在某个文件中的IP地址列表的主机
    命令如下:
    nmap -iL ip_list
    在该命令中,ip_list为Kali Linux系统下的文件名,需要注意的是,在Linux系统下,文件只有名字,没有后缀名。ip_list文件内容如下所示:
    渗透测试工具指南---Nmap篇
    效果如下图所示:
    渗透测试工具指南---Nmap篇
    扫描结果解释参考前面,此处不再叙述。

    扫描某一子网中除去某文件中的IP地址列表外的其它主机
    命令如下:
    nmap 192.168.2.0/24 –excludefile ip_list
    效果如下图所示:
    渗透测试工具指南---Nmap篇
    扫描结果解释参考前面,此处不再叙述。

    查看扫描的主机列表
    命令如下:
    nmap –sL 192.168.2.0/24
    效果如下图所示:
    渗透测试工具指南---Nmap篇

    扫描特定主机的端口号
    命令如下:
    nmap 192.168.2.102 –p 21,23,25,80,443
    效果如下图所示:
    渗透测试工具指南---Nmap篇
    扫描的目标端口中,对21、23、25、80号端口的扫描被该主机上的防火墙或者IDS过滤拦截,对443号端口的扫描成功,该端口处于打开状态。

Nmap高级命令

    全TCP扫描 –sT
    命令1如下:
    nmap –sT 192.168.2.103 –p 80
    效果如下图所示:
    渗透测试工具指南---Nmap篇
    用wireshark抓包如下图所示:
    渗透测试工具指南---Nmap篇
    从上面两图得出:IP地址为192.168.2.103的主机的80号端口打开,提供http服务。对于目标主机打开的端口,需要建立完全的TCP三次握手,然后再RST,因为目的只是扫描,而不是建立会话。

命令2如下:
nmap –sT 192.168.2.103 –p 1
效果如下图所示:
渗透测试工具指南---Nmap篇
用wireshark抓包如下图所示:
渗透测试工具指南---Nmap篇
从上面两图得出:IP地址为192.168.2.103的主机的1号端口关闭。对于扫描主机发出的TCP连接请求,目标主机不会进行第二次握手,而是直接RST。

命令3如下:
nmap –sT 192.168.2.102 –p 80
效果如下图所示:
渗透测试工具指南---Nmap篇
用wireshark抓包如下图所示:
渗透测试工具指南---Nmap篇
从上面两图得出:对IP地址为192.168.2.102的主机的80号端口的扫描被防火墙或IDS过滤拦截,对于扫描主机发出的第一次握手,目标主机不会返回任何信息。

全TCP扫描总结:
全TCP扫描是通过完整的TCP三次握手来建立与目标主机连接的方式来判断端口是否打开,它会导致目标主机的日志中有大量的连接记录,容易暴露扫描主机的行踪,且扫描速度慢。

    SYN扫描 –sS
    命令1如下:
    nmap –sS 192.168.2.103 –p 80
    效果如下图所示:
    渗透测试工具指南---Nmap篇
    用wireshark抓包如下图所示:
    渗透测试工具指南---Nmap篇
    从上面两图得出:IP地址为192.168.2.103的主机的80号端口打开,提供http服务。对于目标主机开放的端口,在建立前两次握手后,扫描主机不会进行第三次握手,而是直接RST断开连接。

命令2如下:
nmap -sS 192.168.2.103 –p 65520
效果如下图所示:
渗透测试工具指南---Nmap篇
用wireshark抓包如下图所示:
渗透测试工具指南---Nmap篇
从上面两图得出:IP地址为192.168.2.103的主机的65520号端口关闭。对于目标主机关闭的端口,扫描主机进行第一次握手后,目标主机的相应端口直接RST断开连接。

命令3如下:
nmap –sS 192.168.2.102 –p 80
效果如下图所示:
渗透测试工具指南---Nmap篇
用wireshark抓包如下图所示:
渗透测试工具指南---Nmap篇
从上面两图得出:对IP地址为192.168.2.102的80端口的扫描被目标主机的防火墙或IDS过滤拦截,对于扫描主机发送的第一次握手,目标主机没有返回任何信息。

SYN扫描总结:
SYN扫描因为TCP三次握手没有完全建立,没有建立会话,从而在日志中不会有相关记录,降低了被发现的可能,也加快了扫描的速度,但仅局限于拥有root或者administrator权限的用户。

    FIN扫描 –sF
    命令1如下:
    nmap -sF 192.168.2.101 –p 21,23,80,443
    效果如下图所示:
    渗透测试工具指南---Nmap篇
    从上图可得出:对IP地址为192.168.2.101的主机,其21,23,80号端口可能处于打开状态,也可能扫描主机发送带有FIN标记的TCP报文段被防火墙或IDS过滤,但可以肯定,443号端口处于关闭状态。通过结果还可以得出目标主机不可能是Windows操作系统,事实上,目标主机是Linux操作系统。

命令2如下:
nmap -sF 192.168.2.103 –p 21,23,80,443
效果如下图所示:
渗透测试工具指南---Nmap篇
用wireshark抓包如下图所示:
渗透测试工具指南---Nmap篇
从上面两图可得出,IP地址为192.168.2.103的主机的21,23,80号端口处于关闭状态,但是事实上,80和443端口处于打开状态,因为该目标主机是Windows操作系统,对于Windows操作系统而言,无论端口是打开还是关闭,只要收到FIN报文段,都会返回RST,即FIN扫描对Windows操作系统不起作用。
FIN扫描总结:
对于非Windows操作系统而言,当其某个端口收到一个FIN报文段时,若返回RST报文段则可以证明该端口关闭,若只是直接丢掉而没有返回任何信息,则可以证明该端口打开或者FIN报文段被防火墙/IDS拦截;对于Windows操作而言,不管端口是打开还是关闭,只要收到FIN报文段,就会返回RST,因此,FIN扫描对Windows操作系统的主机不起作用。

    ACK扫描
    命令1如下:
    nmap –sA 192.168.2.103 –p 21,23,25,80,443,445,3306
    效果如下图所示:
    渗透测试工具指南---Nmap篇
    用wireshark抓包如下图所示:
    渗透测试工具指南---Nmap篇
    渗透测试工具指南---Nmap篇
    从上面两图可得出:目标主机没有防火墙,目标主机可以收到ACK探针,但是返回RST拒绝建立连接,因为这个ACK探针是不请自来的,没有经过完整的TCP三次握手。

命令2如下:
nmap –sA 192.168.2.102 –p 21,23,25,80,443,445,3306
效果如下图所示:
渗透测试工具指南---Nmap篇
用wireshark抓包如下图所示:
渗透测试工具指南---Nmap篇
通过上面两图可得出:目标主机设有防火墙,ACK探针没有到达目的主机的端口,被防火墙过滤掉了。

ACK扫描总结:
目标主机不管是Windows操作系统还是Linux操作系统,对于扫描主机发送的ACK探针,如果没有回复,则肯定是被防火墙或IDS过滤,若回复RST报文,则目标端口可能打开也可能关闭,但无法知道准确结论,只能证明没有被防火墙过滤,即unfiltered。

    NULL扫描
    命令1如下:
    nmap –sN 192.168.2.105 –p 1,80
    效果如下图所示:
    渗透测试工具指南---Nmap篇
    用wireshark抓包如下图所示:
    渗透测试工具指南---Nmap篇

命令2如下:
nmap –sN 192.168.2.104 –p 1,80
效果如下图所示:
渗透测试工具指南---Nmap篇
用wireshark抓包如下图所示:
渗透测试工具指南---Nmap篇

NULL扫描总结:
NULL扫描的命令1中,目标主机是Linux操作系统,命令2中,目标主机是Windows操作系统。事实上,NULL扫描和FIN扫描类似,对于Windows操作系统的主机,无论端口打开还是关闭,都会返回RST;对于Linux系统的主机,只有关闭端口才返回RST,没有返回RST不能可定端口打开,也有可能被防火墙过滤。

    Xmas扫描 -sX
    命令1如下:
    nmap –sX 192.168.2.104 –p 1,80
    效果如下图所示:
    渗透测试工具指南---Nmap篇
    用wireshark抓包如下图所示:
    渗透测试工具指南---Nmap篇

命令2如下:
nmap –sX 192.168.2.105 –p 1,80
效果如下图所示:
渗透测试工具指南---Nmap篇
用wireshark抓包如下图所示:
渗透测试工具指南---Nmap篇

Xmas扫描总结:
Xmas扫描事实上是发送带有URG、PSH、FIN探针的TCP报文,对于命令1中windows操作系统的目的主机,无论端口打开还是关闭,都会返回RST;对于命令2中Linux操作系统的主机,如果目标主机返回RST,该端口关闭,如果没有返回RST,则可知探针被防火墙或IDS过滤。
事实上,可以通过—scanflags选项指定通过哪些探针进行扫描,探针包括URG、ACK、PSH、RST、SYN、FIN。

    扫描最常用的100个端口 –F
    命令如下:
    nmap –F 192.168.2.103
    效果如下图所示:
    渗透测试工具指南---Nmap篇
    之前的nmap扫描,如果没有指定要扫描的端口号,默认是对最可能打开的1000个端口进行扫描。当命令中包含-F时,则是对最可能打开的100个端口进行扫描。
    从上图的扫描结果可以得出,扫描了IP地址为192.168.2.103的目标主机中100个最有可能打开的端口,94个处于关闭状态,只有80,135,139,443,445,1025号等6个端口打开。

    针对UDP端口的扫描 -sU
    命令如下:
    nmap –sU 192.168.2.103 –p 80,137,445
    效果如下图所示:
    渗透测试工具指南---Nmap篇
    用wireshark抓包如下图所示:
    渗透测试工具指南---Nmap篇
    从上面两图可得出:扫描主机分别通过47150和47151号端口向目标主机的445号端口发送UDP报文段,都没有得到回复,则目标主机的445号端口可能打开,也有可能扫描主机发送的UDP报文被防火墙或IDS过滤;第21-23个数据包是扫描主机和目标主机80号端口的通信,目标主机的80号端口返回ICMP目的不可达报文,可证明目标主机的80号端口是关闭的;第19-20个数据包是扫描主机与目标主机137号端口的通信,目标主机返回NBNS应答数据包,可以证明目标主机的137号端口是打开的。

    Ping扫描 -sP
    命令1如下:
    nmap –sP 192.168.2.103
    效果如下图所示:
    渗透测试工具指南---Nmap篇
    用wireshark抓包如下图所示:
    渗透测试工具指南---Nmap篇
    命令2如下:
    nmap –sP 192.168.2.10
    效果如下图所示:
    渗透测试工具指南---Nmap篇
    用wireshark抓包如下图所示:
    渗透测试工具指南---Nmap篇

命令3如下:
nmap –sP 14.215.177.38
效果如下图所示:
渗透测试工具指南---Nmap篇
用wireshark抓包如下图所示:
渗透测试工具指南---Nmap篇
Ping扫描的命令1和命令2中,目标主机都是同网主机,扫描主机是通过向全网广播ARP请求包,以是否收到目标主机的ARP应答包来判定目标主机是否开机,且可以得到目标主机的MAC地址。命令1中的目标主机有返回ARP应答包,处于开机状态。命令2中的目标主机没有返回ARP应答包,处于关机状态,也可能根本不存在这个IP地址的主机;Ping扫描的命令3中,目标主机属于外网主机,扫描主机是通过发送ICMP请求数据包,以是否收到目标主机的ICMP应答包来判定目标主机是否开机,无法得到目标主机的MAC地址,命令3中的主机有返回ICMP应答包,处于开机状态。

    版本检测 –sV
    命令如下:
    nmap –sV 192.168.2.103 –p 80
    效果如下图所示:
    渗透测试工具指南---Nmap篇
    用wireshark抓包如下图所示:
    渗透测试工具指南---Nmap篇
    渗透测试工具指南---Nmap篇
    渗透测试工具指南---Nmap篇
    从上面4图可得出:扫描主机首先是通过SYN扫描确定目标主机的80端口打开,再通过TCP三次握手建立连接,然后进行HTTP数据传输,从HTTP数据传输的过程中判断目标主机端口服务的版本。

    空闲扫描 -sI
    命令如下:
    nmap –Pn -n –sI 192.168.2.106 192.168.2.107 –p 80
    效果如下图所示:
    渗透测试工具指南---Nmap篇
    用wireshark抓包如下图所示:
    渗透测试工具指南---Nmap篇
    渗透测试工具指南---Nmap篇
    渗透测试工具指南---Nmap篇
    从上面四图得出:并不是本机进行扫描,而是通过IP地址为192.168.2.106的主机的80号端口对IP地址为192.168.2.107的目标主机进行代理扫描。
    空闲扫描的前提是找到一台僵尸主机做代理,这台僵尸主机要求足够空闲。
    空闲扫描的原理基于两个网络背景:①当端口收到SYN探针时,如果端口打开,会返回SYN/ACK;如果端口关闭,会返回RST;如果存在防火墙或IDS,不会返回任何信息。②互联网上的每个IP数据包都有一个分片标识符(当存在IP分片时,源IP和分片标识符相同的IP分片属于同一大的IP数据包)。对于互联网上的一台主机,它所发出的每一个IP数据包的分片标识符都会以增量为1逐渐递增,代表该主机发出了多少IP数据包,很多操作系统都是这么做的。
    空闲扫描的工作过程:①攻击机首先需要寻找指定的僵尸机,向僵尸机的某一端口依次发送6个SYN/ACK报文段,僵尸机对不请自来的第二次握手信号,会相应的返回6个RST报文段。如果 这6个RST报文段的IP分片标识符依次加1,则继续,否则,说明此端口不够空闲。第一张wireshark截图反映的就是这个过程,它是对IP地址为192.168.2.106的僵尸主机的80号端口进行空闲试验,结果每次僵尸主机每次返回的RST报文的IP分片标识符都累加1(这里考虑到文章篇幅,没有展开数据包的内容,可以自己实践一下,自己抓包去分析),进行第二步。②攻击机伪造僵尸机的IP地址向目标主机依次连续发送4个SYN/ACK报文段,同样僵尸机对不请自来的第二次握手信号,也会相应的返回4个RST报文段。如果这4个RST报文段的IP分片表示符是按上一个依次递增1,则继续,否则,说明此端口不够空闲。第二张wireshark截图反映的就是这个过程,对于目标主机返回给僵尸机的SYN/ACK报文段,僵尸机返回的RST报文段中的IP分片标识符都会递增1(这里考虑到文章篇幅,没有展开数据包的内容,可以自己实践一下,自己抓包去分析),进行第三步。③前两步过后,证明选择的僵尸主机的端口是空闲的,是合适的,接下来,就通过僵尸主机的空闲端口进行扫描。攻击机先向目标主机发送SYN/ACK探针,目标主机返回RST,攻击机记录下该RST报文的IP分片标识符T,然后,攻击机伪造僵尸机的IP地址向目标机发送SYN探针,这时会有三种情况:Ⅰ 目标端口是打开的。目标主机会返回给僵尸机SYN/ACK,僵尸机会返回给目标主机RST,该RST报文段的IP分片标识符将为T+1,最后,攻击机再向目标主机发送SYN/ACK,目标主机再向攻击机返回RST,该RST的IP分片标识符为T+2。Ⅱ 目标端口是关闭的。目标主机返回给僵尸机RST。攻击机再向目标主机发送SYN/ACK探针,目标主机返回给攻击机RST,这时RST的IP分片标识符为T+1。Ⅲ 目标主机存在防火墙或IDS。目标主机不会返回给僵尸主机任何信息,攻击机再向目标主机发送SYN/ACK探针,目标主机会返回RST,这时,RST报文段的IP分片标识符为T+1。
    选择的僵尸主机必须具有空闲端口,这一点非常重要,如果该端口与网络上的其它主机存在大量数据包通信,攻击机收到的RST报文段中的IP分片标识符就不会是递增1,这会导致产生误判,会影响结果的正确性。
    空闲扫描的好处是隐蔽性强,能够做到身份隐藏,缺点是效率低,前期需要进行空闲试验,消耗时间。
    空闲扫描最好的情况下,是基于僵尸机和目的主机之间的信任关系,能准确地扫描出结果。

    对目标主机OS的检测 –O
    命令1如下:
    nmap –O –PN 192.168.2.103
    效果如下图所示:
    渗透测试工具指南---Nmap篇
    从上图可得出:目标主机运行的是Microsoft Windows 2003操作系统,详细信息上看属于Microsoft Windows Server 2003 SP1或Microsoft Windows Server 2003 SP2中的一种,目标主机与扫描主机在网络上的距离是1跳。

命令2如下:
nmap –O –PN 14.215.177.38
效果如下图所示:
渗透测试工具指南---Nmap篇
从上图可得出:根据警告warning,本次扫描没有至少扫描出1个开放端口和1个关闭端口,而“至少发现1个开放端口和1个关闭端口”是OS检测的基础,因而无法得知目标主机操作系统的类型、版本及与目标主机在网络上的距离,可见目标主机的防护措施还是不错的,它对针对操作系统类型的检测做了防范。
另外,-PN参数的目的是默认目标主机的IP地址在网络上是存在的,因此,不需要与目标主机进行ICMP数据传输来确认目标主机是否存在,一来,能加快扫描速度,二来,ping数据流可能会被防火墙或者IDS过滤掉,而加上-PN参数则不会产生ping数据流,因而可以提高扫描成功的概率,三来,不会影响对目标主机的扫描。

命令3如下:
nmap–v-n–O–osscan-guess–max-os-tries=1–PN 14.215.177.38
效果如下图所示:
渗透测试工具指南---Nmap篇
由上图可知:-v是显示扫描的过程,-n是不进行DNS解析,–osscan-guess参数是强制猜测操作系统类型,–max-os-tries=1是只进行1次猜测(默认是2次,次数少可以加快速度,但也可能错过潜在的可识别目标)。扫描结果为无法识别,因为对常见的1000个端口扫描都被防火墙过滤了。
–osscan-limit可以对没有至少一个端口打开一个端口关闭的主机直接跳过,通常用在对大量主机进行操作系统识别中,加快速度。
–version-trace可以显示详细参数信息,这些参数可以修改。
事实上,nmap的操作系统类型检测依赖于nmap-0S-DB这个数据库,该数据库包含了超过2600中操作系统的信息,nmap把与目标主机的TCP或UDP通信结果与数据库做比较,得出可能的操作系统类型及版本,得到的具体信息包括:设备类型、运行的操作系统、操作系统的详细信息、扫描机与目标主机之间的距离。

    路由跟踪
    命令如下:
    nmap –traceroute 14.215.177.38
    效果如下图所示:
    渗透测试工具指南---Nmap篇
    用wireshark抓包如下图所示:
    渗透测试工具指南---Nmap篇
    从上面两图可得出:扫描主机与IP地址为14.215.177.38的目标主机在网络上的距离是14跳,可以得到中间间隔的各个路由器。

    ALL扫描
    命令如下:
    nmap –A 192.168.2.103
    效果如下图所示:
    渗透测试工具指南---Nmap篇
    从上图可得出:这是对目标主机进行全面的扫描,包括主机发现、服务发现、操作系统检测、路由跟踪等。

本篇博客我还整理成了Word文档,可自行下载,网盘链接和提取码如下:
链接:https://pan.baidu.com/s/1b9eQ_q9_KK-gxzMUNI1tXw
提取码:5sy0

栏目