Nmap最全使用方法和原理解释(由浅入深)
端口扫描和主机发现是nmap的核心功能,下面将解释nmap的命令执行的原理 ,为什么?怎么做到的?,最后将总结不同命令的利弊不同使用场景。
一、主机发现
nmap -sL (列表扫描) //列出主机列表,而不向外发送任何报文,进行反向域名解析,但是只有打印主机列表,没有端口
列表扫描它仅仅只是列出指定网络上的每台主机, 不发送任何报文到目标主机,默认情况下,Nmap 依然会对主机进行反向域名解析以获取它们的名字。简单的主机名能给出的有用信息,例如, fw.chi.playboy.com 是花花公子芝加哥办公室的防火墙。Nmap 最后还会报告 IP 地址的总数,列表扫描可以很好的确保您拥有正确的目标 IP。因为这个命令只是打印目标主机的列表,像其它一些高级功能如端口扫描 操作系统探测或者 Ping 扫描 的选项就没有。
nmap -sP (Ping 扫描) //只进行ping扫描有响应的主机,不做其他操作,
该选项Nmap仅进行ping扫描 (主机发现),然后打印出对扫描做出响应的那些 主机,没有进一步的测试 (如端口扫描或者操作系统探测),这比列表扫描更积极,常 常用于和列表扫描相同的目的,它可以得到些许目标网络的信息而不被特别注意到,它可以很方便地得出网络上有多少机器正在运行或者监视服务器是否正常运行,常常有人称它为地毯式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 还是 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 选项来实现这种无状态的方法,当这样的无状态防火墙规则存在时,发送到关闭目标端口的 SYN ping 探测 (-PS) 很可能被封锁。这种情况下,ACK 探测格外有闪光点,因为它正好利用 了 这样的规则。
另外一种常用的防火墙用有状态的规则来封锁非预期的报文,这一特性已开始只存在于高端防火墙,但是这些年类它越来越普遍了,Linux Netfilter/iptables 通过 --state 选项支持这一特性,它根据连接状态把报文进行分类,SYN 探测更有可能用于这样的系统,由于没头没脑的 ACK 报文通常会被识别成伪造的而丢弃。解决这个两难的方法是通 过即指定 -PS 又指定-PA 来即发送 SYN 又发送 ACK。
-PU [portlist]