- 名称:nmap 网络探测工具和安全/端口扫描器
- 用法:nmap [扫描类型 ...] [选项] {扫描目标说明}
- 描述:nmap(“Network Mapper(网络映射器)”)是一款开源的网络探测和安全审核的工具。它的设计目标是快速的扫描大型网络,当然用它扫描单个主机也是没问题的。Nmap以新颖的方式使用原始IP报文来发现网络上有哪些主机,那些主机提供社么服务(应用程序名和版本),那些服务运行在什么操作系统(包括版本信息),它们使用什么类型的报文过滤器/防火墙,以及一堆其他的功能。虽然Nmap通常用于安全审核,许多系统管理员和网络管理员也用它来做一些日常的工作,比如查看整个网络的主机和服务的运行。
- Nmap的工作原理:
- 1、探针:探针(Probe)是基于协议功能和特性,使用特定的端口和数据载荷所构建的数据包。
- 例如:使用ARP Ping发现主机。发送的探针如下:
- SENT (0.0904s) ARP who-has 19.168.198.137 tell 192.168.198.133
- 以上发送的探针是一个基于ARP的请求数据包,请求获取主机192.168.198.137的MAC地址,如果目标主机收到该请求,将对应的地址返回给192.168.198.133主机
- 2、指纹信息“就是目标主机响应包的特征信息,如ARP应答报文、TCP标志位、ICMP应带报文等。Nmap根据这些指纹信息即可判断主机的状态和端口状态等。
- 例如:ARP应答报文的指纹信息、
- RCVD (0.0859s) ARP reply 192.168.198.137 is-at 00:0c:29:2e:25:d9
- 从数据包中可以看出,包的信息为ARP reply,即ARP应答报文。根据响应信息可以确定目标主机192.168.198.137是活动的。
- 1、探针:探针(Probe)是基于协议功能和特性,使用特定的端口和数据载荷所构建的数据包。
- Nmap输出的是扫面目标的列表,以及每个目标的补充信息,至于是哪些信息则依赖于所使用的选项,“所感兴趣的端口表格”是其中的关键。那张表列出端口号、协议、服务名称和状态。
- 状态可能是open(开发的),filtered(被过滤的),closed(关闭的),或者unfiltered(未被过滤的)。
- open(开放的)意味着目标机器上的应用程序正在该端口监听连接/报文。
- filtered(被过滤的)意味着防火墙、过滤器或者其他网络障碍阻止了该端口被访问,Nmap无法得知它是open(开放的)还是closed(关闭的)。
- closed(关闭的)端口没有应用程序在它上面监听,但是他们随时可能开放,
- unfiltered(未被过滤的)当端口对Nmap的探测做出响应,但是Nmap无法确定他们是关闭还是开放时,这些端口就被认为是unfiltered(未被过滤的)
- 如果Nmap报告状态组合open|filtered和closed|filtered时,那说明Nmap无法确定该端口处于两个状态中的哪一个状态。当要求进行版本探测时,端口表也可以包含软件的版本信息。
- 当要求进行IP协议扫描时(-sO),Nmap提供关于所有支持的IP协议,而不是正在监听的端口的信息。
- 除了所感兴趣的端口表,Nmap还能提供关于目标主机的进一步信息,包括反向域名、操作系统猜测、设备类型和MAC地址。
- 目标说明
- 除了选项,所有出现在Nmap命令行上的都被视为对目标主机的说明。最简单的情况是指定一个目标IP地址或主机名
- 有时候希望扫描整个网络的相邻主机。为此,Nmap支持CIDR(无类域间路由)风格的地址。您可以附加一个 /numbit在一个IP地址或主机名后面,Nmap将会扫描所有和该参考IP地址具有 numbit相同比特的所有IP地址或主机。
- 例如:192.168.10.0/24 将会扫描192.168.10.0(二进制格式:11000000 10101000 00001010 00000000)和192.168.10.255(二进制格式:11000000 1010000 00001010 11111111)之间的256台主机。 192.168.10.40/24 将会做同样的事情。
- 假设主机 scame.nmap的IP地址时205.217.153.62, scanme.nmap/16将扫描205.217.0.0和205.217.255.255之间的65536个IP地址。
- 所允许的最小值是 /1,这将会扫描半个互联网。最大值是 /32,这将会扫描该主机或IP地址,因为所有的比特都固定了。
- CIDR(无类域间路由)标志位很简洁,但有时不够灵活。
- 例如:你也许想要扫描192.168.0.0/16,但略过任何以.0或者.255结束的IP地址,因为他们通常是广播地址,但是CIDR(无类域间路由)无法做到。
- Nmap可以通过八位字节地址范围支持这样的扫描,你可以用逗号分开的数字或范围列表为IP地址的每个八位字节指定它的范围。
- 例如:192.168.0-255.1-254 将略过在该范围内以.0和.255结束的地址。范围不必限于最后的8位:0-255.0-255.13.37将在整个互联网范围内扫描所有以13.37结束的地址。
- 这种大范围的扫描对互联网的调查研究也许有用。
- IPv6地址只能用规范的IPv6地址或主机名指定,CIDR(无类域间路由)和八位字节范围不支持IPv6,因为他们对于IP v6几乎没什么作用。
- Nmap命令行接受多个主机说明,它们不必是相同类型。命令 namp scanme.nmap 192.168.0.0/8 10.0.0, 1 , 3-7.0-255将和您预期的一样执行。
- 虽然目标通常在命令行指定,下列选项也可以用来控制目标的选择:
- Nmap命令释义
- -iL <inputfilename>(从列表中输入)
- 从inputfilename中读取目标说明。在命令行输入一堆主机名显得很笨拙,然而经常需要这样。
- 例如:您的DHCP服务器可能到处10000个当前租约的列表,而您希望对它们进行扫描。如果您不是使用未授权的静态IP来定位主机,或许您想要扫描所有IP地址。只要生产要扫描的主机的列表,用 -iL 把文件名作为选项传给Nmap。列表中的项都可以是Nmap在命令行上接受的任何格式(IP地址、主机名、CIDR、IPv6、或者八位字节范围)。每一项必须以一个或者多个空格,制表符或者换行符分开。如果您希望Nmap从标准输入而不是实际文件读取列表,您可以用一个连字符(-)作为文件名。
- 从inputfilename中读取目标说明。在命令行输入一堆主机名显得很笨拙,然而经常需要这样。
- -iR<hostnum>(随机选择目标)
- 对于互联网范围内的调查和研究,您也许想随机地选择目标。hostnum选项告诉Nmap生产多少个IP。不符合需要的IP(如特定的私有、组播或者未分配的地址自动略过)。选项 0 意味着永无休止的扫描。记住,一些网管对于未授权的扫描可能会很感冒并加以抱怨(你懂的)。使用该选项的后果自负!
- 如果在某个雨天的下午,嗯,就是下雨天(毕竟雨后有故事),您觉得实在无聊,可以试试这个命令nmap -sS -PS80 -iR 0 -p 80 随机的找一些网站浏览。
- 对于互联网范围内的调查和研究,您也许想随机地选择目标。hostnum选项告诉Nmap生产多少个IP。不符合需要的IP(如特定的私有、组播或者未分配的地址自动略过)。选项 0 意味着永无休止的扫描。记住,一些网管对于未授权的扫描可能会很感冒并加以抱怨(你懂的)。使用该选项的后果自负!
- --exclude<host1[,host2][,host3], ...>(排除主机/网络)
- 如果在您指定的扫描范围有一些主机或者网络不是您的目标,那就用该选项加上以逗号分隔的列表排除它们。该列表用正常的Namp语法,因此它可以包括主机名,CIDR,八位字节范围等等。当您希望扫描的网络包含执行关键任务的服务器,已知的对端口扫描反应强烈的系统或者被其他人看管的子网时,这也许有用
- --excludefile<excludefile>(排除文件中的列表)
- 这和--exclude选项的功能一样,只是所排除的目标时用以 换行符、空格或者制表符分隔的excludefile提供的,而不是在命令行上输入的。
- -iL <inputfilename>(从列表中输入)
- 主机发现
- 任何网络探测任务的最初几个步骤之一就是把一组IP范围(有时该范围是巨大的)缩小为一列活动的或者您感兴趣的主机。扫描每个IP的每个端口很慢,通常也没必要。当然,什么样的主机令您感兴趣主要依赖于扫描的目的。网管也许只对运行的特定服务的主机感兴趣,而从事安全的人士则可能对一个马桶都感兴趣,只要他有IP地址(哈哈哈~)。一个管理员也许仅仅使用ping命令来定位内网上的主机,而一个外部入侵测试人员则可能绞尽脑汁使用各种方法,试图突破防火墙的封锁。
- 由于主机发现的需求五花八门,Nmap提供了一箩筐的选项来定制您的需求。主机发现有时候也叫做ping扫描,但它远远超越世人皆知的ping命令发送简单的ICMP回声请求报文。用户完全可以通过使用列表扫描(-sL)或者通过关闭ping(-P0)跳过ping的步骤,也可以使用多个端口把TCP SYN/ACK,IDP和ICMP任意组合起来玩一玩。这些探测的目的是获得响应,以显示某个IP地址是否是活动的(正在被某主机或者网络设备使用)。在许多网络上,在给定的时间,往往只有小部分的IP地址是活动的。这种情况在基于RFC1918的私有地址空间,如10.0.0.0/8尤其普遍。那个网络有16000000个IP,但一些使用它的公司连1000台机器都没有。主机发现能够找到零星分布于IP地址海洋上的那些机器 。
- 如果没有给出主机发现的选项,Nmap就发送一个TCP ACK报文到80端口和一个ICMP回声请求到每台目标主机。一个例外是ARP扫描用于局域网上的任何目标机器。对于非特权UNIX shell用户,使用connect()系统调用会发送一个SYN报文而不是ACK,这些默认行为和使用-PA 、 -PE选项的效果相同。扫描局域网时,这种主机发现一般就够用了,但是对于安全审核,建议进行全面的探测。
- Nmap命令释义
- -P*选项(用于选择 ping的类型)
- 可以被结合使用。 您可以通过使用不同的TCP端口/标志位和ICMP码发送许多探测报文来增加穿透防守严密的防火墙的机会。另外要注意的是即使您指定了其它 -P*选项,ARP发现(-PR)对于局域网上的目标而言是默认行为,因为它总是更快更有效。
- -sL (列表扫描)
- 列表扫描是主机发现的退化形式,它仅仅列出指定网络上的每台主机, 不发送任何报文到目标主机。默认情况下,Nmap仍然对主机进行反向域名解析以获取 它们的名字。简单的主机名能给出的有用信息常常令人惊讶。Nmap最后还会报告IP地址的总数。列表扫描可以很好的确保您拥有正确的目标IP。 如果主机的域名出乎您的意料,那么就值得进一步检查以防错误地扫描其它组织的网络。既然只是打印目标主机的列表,像其它一些高级功能如端口扫描,操作系统探测或者Ping扫描 的选项就没有了。如果您希望关闭ping扫描而仍然执行这样的高级功能,请继续阅读关于 -P0选项的介绍。
- -sP (Ping扫描)
- 该选项告诉Nmap仅仅 进行ping扫描 (主机发现),然后打印出对扫描做出响应的那些主机。 没有进一步的测试 (如端口扫描或者操作系统探测)。 这比列表扫描更积极,常常用于和列表扫描相同的目的。它可以得到些许目标网络的信息而不被特别注意到。 对于攻击者来说,了解多少主机正在运行比列表扫描提供的一列IP和主机名往往更有价值。系统管理员往往也很喜欢这个选项。 它可以很方便地得出 网络上有多少机器正在运行或者监视服务器是否正常运行。常常有人称它为 地毯式ping,它比ping广播地址更可靠,因为许多主机对广播请求不响应。-sP选项在默认情况下, 发送一个ICMP回声请求和一个TCP报文到80端口。如果非特权用户执行,就发送一个SYN报文 (用connect()系统调用)到目标机的80端口。 当特权用户扫描局域网上的目标机时,会发送ARP请求(-PR),除非使用了--send-ip选项。 -sP选项可以和除(-P0)之外的任何发现探测类型-P* 选项结合使用以达到更大的灵活性。 一旦使用了任何探测类型和端口选项,默认的探测(ACK和回应请求)就被覆盖了。 当防守严密的防火墙位于运行Nmap的源主机和目标网络之间时, 推荐使用那些高级选项。否则,当防火墙捕获并丢弃探测包或者响应包时,一些主机就不能被探测到。
- -P0 (无ping)
- 该选项完全跳过Nmap发现阶段。 通常Nmap在进行高强度的扫描时用它确定正在运行的机器。 默认情况下,Nmap只对正在运行的主机进行高强度的探测如端口扫描、版本测或者操作系统探测。用-P0禁止主机发现会使Nmap对每一个指定的目标IP地址 进行所要求的扫描。所以如果在命令行指定一个B类目标地址空间(/16), 所有 65,536个IP地址都会被扫描。 -P0的第二个字符是数字0而不是字母O。 和列表扫描一样,跳过正常的主机发现,但不是打印一个目标列表, 而是继续执行所要求的功能,就好像每个IP都是活动的。
- -PS [portlist] (TCP SYN Ping)
- 该选项发送一个设置了SYN标志位的空TCP报文。 默认目的端口为80 (可以通过改变nmap.h) 文件中的DEFAULT-TCP-PROBE-PORT值进行配置,但不同的端口也可以作为选项指定。 甚至可以指定一个以逗号分隔的端口列表(如 -PS22,23,25,80,113,1050,35000), 在这种情况下,每个端口会被并发地扫描。 SYN标志位告诉对方您正试图建立一个连接。 通常目标端口是关闭的,一个RST (复位) 包会发回来。 如果碰巧端口是开放的,目标会进行TCP三步握手的第二步,回应一个SYN/ACK TCP报文。然后运行Nmap的机器则会扼杀这个正在建立的连接,发送一个RST而非ACK报文,否则,一个完全的连接将会建立。 RST报文是运行Nmap的机器而不是Nmap本身响应的,因为它对收到 的SYN/ACK感到很意外。Nmap并不关心端口开放还是关闭。 无论RST还是SYN/ACK响应都告诉Nmap该主机正在运行。在UNIX机器上,通常只有特权用户 root 能否发送和接收原始的TCP报文。因此作为一个变通的方法,对于非特权用户, Nmap会为每个目标主机进行系统调用connect(),它也会发送一个SYN 报文来尝试建立连接。如果connect()迅速返回成功或者一个ECONNREFUSED 失败,下面的TCP堆栈一定已经收到了一个SYN/ACK或者RST,该主机将被标志位为在运行。 如果连接超时了,该主机就标志位为down掉了。这种方法也用于IPv6 连接,因为Nmap目前还不支持原始的IPv6报文。
- -PA [portlist] (TCP ACK Ping)
- TCP ACK ping和刚才讨论的SYN ping相当类似。区别就是设置TCP的ACK标志位而不是SYN标志位。 ACK报文表示确认一个建立连接的尝试,但该连接尚未完全建立。 所以远程主机应该总是回应一个RST报文, 因为它们并没有发出过连接请求到运行Nmap的机器,如果它们正在运行的话。-PA选项使用和SYN探测相同的默认端口(80),也可以用相同的格式指定目标端口列表。如果非特权用户尝试该功能, 或者指定的是IPv6目标,前面说过的connect()方法将被使用。 这个方法并不完美,因为它实际上发送的是SYN报文,而不是ACK报文。提供SYN和ACK两种ping探测的原因是使通过防火墙的机会尽可能大。 许多管理员会配置他们的路由器或者其它简单的防火墙来封锁SYN报文,除非连接目标是那些公开的服务器像公司网站或者邮件服务器。 这可以阻止其它进入组织的连接,同时也允许用户访问互联网。 这种无状态的方法几乎不占用防火墙/路由器的资源,因而被硬件和软件过滤器 广泛支持。Linux Netfilter/iptables 防火墙软件提供方便的 --syn选项来实现这种无状态的方法。 当这样的无状态防火墙规则存在时,发送到关闭目标端口的SYNping探测 (-PS) 很可能被封锁。这种情况下,ACK探测格外有闪光点,因为它正好利用了 这样的规则。另外一种常用的防火墙用有状态的规则来封锁非预期的报文。 这一特性已开始只存在于高端防火墙,但是这些年类它越来越普遍了。 Linux Netfilter/iptables 通过--state选项支持这一特性,它根据连接状态把报文 进行分类。SYN探测更有可能用于这样的系统,由于没头没脑的ACK报文通常会被识别成伪造的而丢弃。解决这个两难的方法是通过即指定 -PS又指定-PA来即发送SYN又发送ACK。
- -PU [portlist] (UDP Ping)
- 还有一个主机发现的选项是UDP ping,它发送一个空的(除非指定了--data-length UDP报文)到指定的端口。端口列表的格式和前面讨论过的-PS和-PA选项还是一样。 如果不指定端口,
- -P*选项(用于选择 ping的类型)
- 名称:nmap 网络探测工具和安全/端口扫描器
- 用法:nmap [扫描类型 ...] [选项] {扫描目标说明}
- 描述:nmap(“Network Mapper(网络映射器)”)是一款开源的网络探测和安全审核的工具。它的设计目标是快速的扫描大型网络,当然用它扫描单个主机也是没问题的。Nmap以新颖的方式使用原始IP报文来发现网络上有哪些主机,那些主机提供社么服务(应用程序名和版本),那些服务运行在什么操作系统(包括版本信息),它们使用什么类型的报文过滤器/防火墙,以及一堆其他的功能。虽然Nmap通常用于安全审核,许多系统管理员和网络管理员也用它来做一些日常的工作,比如查看整个网络的主机和服务的运行。
- Nmap的工作原理:
- 1、探针:探针(Probe)是基于协议功能和特性,使用特定的端口和数据载荷所构建的数据包。
- 例如:使用ARP Ping发现主机。发送的探针如下:
- SENT (0.0904s) ARP who-has 19.168.198.137 tell 192.168.198.133
- 以上发送的探针是一个基于ARP的请求数据包,请求获取主机192.168.198.137的MAC地址,如果目标主机收到该请求,将对应的地址返回给192.168.198.133主机
- 2、指纹信息“就是目标主机响应包的特征信息,如ARP应答报文、TCP标志位、ICMP应带报文等。Nmap根据这些指纹信息即可判断主机的状态和端口状态等。
- 例如:ARP应答报文的指纹信息、
- RCVD (0.0859s) ARP reply 192.168.198.137 is-at 00:0c:29:2e:25:d9
- 从数据包中可以看出,包的信息为ARP reply,即ARP应答报文。根据响应信息可以确定目标主机192.168.198.137是活动的。
- 1、探针:探针(Probe)是基于协议功能和特性,使用特定的端口和数据载荷所构建的数据包。
- Nmap输出的是扫面目标的列表,以及每个目标的补充信息,至于是哪些信息则依赖于所使用的选项,“所感兴趣的端口表格”是其中的关键。那张表列出端口号、协议、服务名称和状态。
- 状态可能是open(开发的),filtered(被过滤的),closed(关闭的),或者unfiltered(未被过滤的)。
- open(开放的)意味着目标机器上的应用程序正在该端口监听连接/报文。
- filtered(被过滤的)意味着防火墙、过滤器或者其他网络障碍阻止了该端口被访问,Nmap无法得知它是open(开放的)还是closed(关闭的)。
- closed(关闭的)端口没有应用程序在它上面监听,但是他们随时可能开放,
- unfiltered(未被过滤的)当端口对Nmap的探测做出响应,但是Nmap无法确定他们是关闭还是开放时,这些端口就被认为是unfiltered(未被过滤的)
- 如果Nmap报告状态组合open|filtered和closed|filtered时,那说明Nmap无法确定该端口处于两个状态中的哪一个状态。当要求进行版本探测时,端口表也可以包含软件的版本信息。
- 当要求进行IP协议扫描时(-sO),Nmap提供关于所有支持的IP协议,而不是正在监听的端口的信息。
- 除了所感兴趣的端口表,Nmap还能提供关于目标主机的进一步信息,包括反向域名、操作系统猜测、设备类型和MAC地址。
- 目标说明
- 除了选项,所有出现在Nmap命令行上的都被视为对目标主机的说明。最简单的情况是指定一个目标IP地址或主机名
- 有时候希望扫描整个网络的相邻主机。为此,Nmap支持CIDR(无类域间路由)风格的地址。您可以附加一个 /numbit在一个IP地址或主机名后面,Nmap将会扫描所有和该参考IP地址具有 numbit相同比特的所有IP地址或主机。
- 例如:192.168.10.0/24 将会扫描192.168.10.0(二进制格式:11000000 10101000 00001010 00000000)和192.168.10.255(二进制格式:11000000 1010000 00001010 11111111)之间的256台主机。 192.168.10.40/24 将会做同样的事情。
- 假设主机 scame.nmap的IP地址时205.217.153.62, scanme.nmap/16将扫描205.217.0.0和205.217.255.255之间的65536个IP地址。
- 所允许的最小值是 /1,这将会扫描半个互联网。最大值是 /32,这将会扫描该主机或IP地址,因为所有的比特都固定了。
- CIDR(无类域间路由)标志位很简洁,但有时不够灵活。
- 例如:你也许想要扫描192.168.0.0/16,但略过任何以.0或者.255结束的IP地址,因为他们通常是广播地址,但是CIDR(无类域间路由)无法做到。
- Nmap可以通过八位字节地址范围支持这样的扫描,你可以用逗号分开的数字或范围列表为IP地址的每个八位字节指定它的范围。
- 例如:192.168.0-255.1-254 将略过在该范围内以.0和.255结束的地址。范围不必限于最后的8位:0-255.0-255.13.37将在整个互联网范围内扫描所有以13.37结束的地址。
- 这种大范围的扫描对互联网的调查研究也许有用。
- IPv6地址只能用规范的IPv6地址或主机名指定,CIDR(无类域间路由)和八位字节范围不支持IPv6,因为他们对于IP v6几乎没什么作用。
- Nmap命令行接受多个主机说明,它们不必是相同类型。命令 namp scanme.nmap 192.168.0.0/8 10.0.0, 1 , 3-7.0-255将和您预期的一样执行。
- 虽然目标通常在命令行指定,下列选项也可以用来控制目标的选择:
- Nmap命令释义
- -iL <inputfilename>(从列表中输入)
- 从inputfilename中读取目标说明。在命令行输入一堆主机名显得很笨拙,然而经常需要这样。
- 例如:您的DHCP服务器可能到处10000个当前租约的列表,而您希望对它们进行扫描。如果您不是使用未授权的静态IP来定位主机,或许您想要扫描所有IP地址。只要生产要扫描的主机的列表,用 -iL 把文件名作为选项传给Nmap。列表中的项都可以是Nmap在命令行上接受的任何格式(IP地址、主机名、CIDR、IPv6、或者八位字节范围)。每一项必须以一个或者多个空格,制表符或者换行符分开。如果您希望Nmap从标准输入而不是实际文件读取列表,您可以用一个连字符(-)作为文件名。
- 从inputfilename中读取目标说明。在命令行输入一堆主机名显得很笨拙,然而经常需要这样。
- -iR<hostnum>(随机选择目标)
- 对于互联网范围内的调查和研究,您也许想随机地选择目标。hostnum选项告诉Nmap生产多少个IP。不符合需要的IP(如特定的私有、组播或者未分配的地址自动略过)。选项 0 意味着永无休止的扫描。记住,一些网管对于未授权的扫描可能会很感冒并加以抱怨(你懂的)。使用该选项的后果自负!
- 如果在某个雨天的下午,嗯,就是下雨天(毕竟雨后有故事),您觉得实在无聊,可以试试这个命令nmap -sS -PS80 -iR 0 -p 80 随机的找一些网站浏览。
- 对于互联网范围内的调查和研究,您也许想随机地选择目标。hostnum选项告诉Nmap生产多少个IP。不符合需要的IP(如特定的私有、组播或者未分配的地址自动略过)。选项 0 意味着永无休止的扫描。记住,一些网管对于未授权的扫描可能会很感冒并加以抱怨(你懂的)。使用该选项的后果自负!
- --exclude<host1[,host2][,host3], ...>(排除主机/网络)
- 如果在您指定的扫描范围有一些主机或者网络不是您的目标,那就用该选项加上以逗号分隔的列表排除它们。该列表用正常的Namp语法,因此它可以包括主机名,CIDR,八位字节范围等等。当您希望扫描的网络包含执行关键任务的服务器,已知的对端口扫描反应强烈的系统或者被其他人看管的子网时,这也许有用
- --excludefile<excludefile>(排除文件中的列表)
- 这和--exclude选项的功能一样,只是所排除的目标时用以 换行符、空格或者制表符分隔的excludefile提供的,而不是在命令行上输入的。
- -iL <inputfilename>(从列表中输入)
- 主机发现
- 任何网络探测任务的最初几个步骤之一就是把一组IP范围(有时该范围是巨大的)缩小为一列活动的或者您感兴趣的主机。扫描每个IP的每个端口很慢,通常也没必要。当然,什么样的主机令您感兴趣主要依赖于扫描的目的。网管也许只对运行的特定服务的主机感兴趣,而从事安全的人士则可能对一个马桶都感兴趣,只要他有IP地址(哈哈哈~)。一个管理员也许仅仅使用ping命令来定位内网上的主机,而一个外部入侵测试人员则可能绞尽脑汁使用各种方法,试图突破防火墙的封锁。
- 由于主机发现的需求五花八门,Nmap提供了一箩筐的选项来定制您的需求。主机发现有时候也叫做ping扫描,但它远远超越世人皆知的ping命令发送简单的ICMP回声请求报文。用户完全可以通过使用列表扫描(-sL)或者通过关闭ping(-P0)跳过ping的步骤,也可以使用多个端口把TCP SYN/ACK,IDP和ICMP任意组合起来玩一玩。这些探测的目的是获得响应,以显示某个IP地址是否是活动的(正在被某主机或者网络设备使用)。在许多网络上,在给定的时间,往往只有小部分的IP地址是活动的。这种情况在基于RFC1918的私有地址空间,如10.0.0.0/8尤其普遍。那个网络有16000000个IP,但一些使用它的公司连1000台机器都没有。主机发现能够找到零星分布于IP地址海洋上的那些机器 。
- 如果没有给出主机发现的选项,Nmap就发送一个TCP ACK报文到80端口和一个ICMP回声请求到每台目标主机。一个例外是ARP扫描用于局域网上的任何目标机器。对于非特权UNIX shell用户,使用connect()系统调用会发送一个SYN报文而不是ACK,这些默认行为和使用-PA 、 -PE选项的效果相同。扫描局域网时,这种主机发现一般就够用了,但是对于安全审核,建议进行全面的探测。
- Nmap命令释义
- -P*选项(用于选择 ping的类型)
- 可以被结合使用。 您可以通过使用不同的TCP端口/标志位和ICMP码发送许多探测报文来增加穿透防守严密的防火墙的机会。另外要注意的是即使您指定了其它 -P*选项,ARP发现(-PR)对于局域网上的目标而言是默认行为,因为它总是更快更有效。
- -sL (列表扫描)
- 列表扫描是主机发现的退化形式,它仅仅列出指定网络上的每台主机, 不发送任何报文到目标主机。默认情况下,Nmap仍然对主机进行反向域名解析以获取 它们的名字。简单的主机名能给出的有用信息常常令人惊讶。Nmap最后还会报告IP地址的总数。列表扫描可以很好的确保您拥有正确的目标IP。 如果主机的域名出乎您的意料,那么就值得进一步检查以防错误地扫描其它组织的网络。既然只是打印目标主机的列表,像其它一些高级功能如端口扫描,操作系统探测或者Ping扫描 的选项就没有了。如果您希望关闭ping扫描而仍然执行这样的高级功能,请继续阅读关于 -P0选项的介绍。
- -sP (Ping扫描)
- 该选项告诉Nmap仅仅 进行ping扫描 (主机发现),然后打印出对扫描做出响应的那些主机。 没有进一步的测试 (如端口扫描或者操作系统探测)。 这比列表扫描更积极,常常用于和列表扫描相同的目的。它可以得到些许目标网络的信息而不被特别注意到。 对于攻击者来说,了解多少主机正在运行比列表扫描提供的一列IP和主机名往往更有价值。系统管理员往往也很喜欢这个选项。 它可以很方便地得出 网络上有多少机器正在运行或者监视服务器是否正常运行。常常有人称它为 地毯式ping,它比ping广播地址更可靠,因为许多主机对广播请求不响应。-sP选项在默认情况下, 发送一个ICMP回声请求和一个TCP报文到80端口。如果非特权用户执行,就发送一个SYN报文 (用connect()系统调用)到目标机的80端口。 当特权用户扫描局域网上的目标机时,会发送ARP请求(-PR),除非使用了--send-ip选项。 -sP选项可以和除(-P0)之外的任何发现探测类型-P* 选项结合使用以达到更大的灵活性。 一旦使用了任何探测类型和端口选项,默认的探测(ACK和回应请求)就被覆盖了。 当防守严密的防火墙位于运行Nmap的源主机和目标网络之间时, 推荐使用那些高级选项。否则,当防火墙捕获并丢弃探测包或者响应包时,一些主机就不能被探测到。
- -P0 (无ping)
- 该选项完全跳过Nmap发现阶段。 通常Nmap在进行高强度的扫描时用它确定正在运行的机器。 默认情况下,Nmap只对正在运行的主机进行高强度的探测如端口扫描、版本测或者操作系统探测。用-P0禁止主机发现会使Nmap对每一个指定的目标IP地址 进行所要求的扫描。所以如果在命令行指定一个B类目标地址空间(/16), 所有 65,536个IP地址都会被扫描。 -P0的第二个字符是数字0而不是字母O。 和列表扫描一样,跳过正常的主机发现,但不是打印一个目标列表, 而是继续执行所要求的功能,就好像每个IP都是活动的。
- -PS [portlist] (TCP SYN Ping)
- 该选项发送一个设置了SYN标志位的空TCP报文。 默认目的端口为80 (可以通过改变nmap.h) 文件中的DEFAULT-TCP-PROBE-PORT值进行配置,但不同的端口也可以作为选项指定。 甚至可以指定一个以逗号分隔的端口列表(如 -PS22,23,25,80,113,1050,35000), 在这种情况下,每个端口会被并发地扫描。 SYN标志位告诉对方您正试图建立一个连接。 通常目标端口是关闭的,一个RST (复位) 包会发回来。 如果碰巧端口是开放的,目标会进行TCP三步握手的第二步,回应一个SYN/ACK TCP报文。然后运行Nmap的机器则会扼杀这个正在建立的连接,发送一个RST而非ACK报文,否则,一个完全的连接将会建立。 RST报文是运行Nmap的机器而不是Nmap本身响应的,因为它对收到 的SYN/ACK感到很意外。Nmap并不关心端口开放还是关闭。 无论RST还是SYN/ACK响应都告诉Nmap该主机正在运行。在UNIX机器上,通常只有特权用户 root 能否发送和接收原始的TCP报文。因此作为一个变通的方法,对于非特权用户, Nmap会为每个目标主机进行系统调用connect(),它也会发送一个SYN 报文来尝试建立连接。如果connect()迅速返回成功或者一个ECONNREFUSED 失败,下面的TCP堆栈一定已经收到了一个SYN/ACK或者RST,该主机将被标志位为在运行。 如果连接超时了,该主机就标志位为down掉了。这种方法也用于IPv6 连接,因为Nmap目前还不支持原始的IPv6报文。
- -PA [portlist] (TCP ACK Ping)
- TCP ACK ping和刚才讨论的SYN ping相当类似。区别就是设置TCP的ACK标志位而不是SYN标志位。 ACK报文表示确认一个建立连接的尝试,但该连接尚未完全建立。 所以远程主机应该总是回应一个RST报文, 因为它们并没有发出过连接请求到运行Nmap的机器,如果它们正在运行的话。-PA选项使用和SYN探测相同的默认端口(80),也可以用相同的格式指定目标端口列表。如果非特权用户尝试该功能, 或者指定的是IPv6目标,前面说过的connect()方法将被使用。 这个方法并不完美,因为它实际上发送的是SYN报文,而不是ACK报文。提供SYN和ACK两种ping探测的原因是使通过防火墙的机会尽可能大。 许多管理员会配置他们的路由器或者其它简单的防火墙来封锁SYN报文,除非连接目标是那些公开的服务器像公司网站或者邮件服务器。 这可以阻止其它进入组织的连接,同时也允许用户访问互联网。 这种无状态的方法几乎不占用防火墙/路由器的资源,因而被硬件和软件过滤器 广泛支持。Linux Netfilter/iptables 防火墙软件提供方便的 --syn选项来实现这种无状态的方法。 当这样的无状态防火墙规则存在时,发送到关闭目标端口的SYNping探测 (-PS) 很可能被封锁。这种情况下,ACK探测格外有闪光点,因为它正好利用了 这样的规则。另外一种常用的防火墙用有状态的规则来封锁非预期的报文。 这一特性已开始只存在于高端防火墙,但是这些年类它越来越普遍了。 Linux Netfilter/iptables 通过--state选项支持这一特性,它根据连接状态把报文 进行分类。SYN探测更有可能用于这样的系统,由于没头没脑的ACK报文通常会被识别成伪造的而丢弃。解决这个两难的方法是通过即指定 -PS又指定-PA来即发送SYN又发送ACK。
- -PU [portlist] (UDP Ping)
- 还有一个主机发现的选项是UDP ping,它发送一个空的(除非指定了--data-length UDP报文)到指定的端口。端口列表的格式和前面讨论过的-PS和-PA选项还是一样。 如果不指定端口,
- -P*选项(用于选择 ping的类型)