目录

namp主机发现

nmap主机发现

在很早之前,由于防火墙很少拦截ICMP echo请求(ping), 所以判断主机是否在线的方法很简单,可以直接使用ping. 现在, 很多网络管理员出于安全考虑, 会屏蔽ICMP ping消息, 所以只使用ICMP已经无法正确判断主机是否在线

所以, 除了ICMP echo请求(ping)判断外, Nmap还提供了其他的很多主机发现技术

TCP SYN Ping

参数: -PS<port list>

-PS参数会发送给对端一个空的SYN请求, 默认发送到80端口, 也可以通过-PS22-25,50,113,1050这种方式来指定端口

主机在线情况下:

  • 如果目标端口关闭, 会返回一个RST响应

  • 如果目标端口开放, 会返回一个SYN/ACK的报文, Nmap会回复一个RST避免真实建立连接

在Unix系统下, 只有特权用户root允许使用raw socket发送TCP包, 对于非特权用户, 使用系统函数connect代替raw TCP包, 如果connect快速的返回成功或者ECONNREFUSED, 说明TCP协议栈一定收到了SYN/ACK或者RST, 此时认为对端是在线的. 反之, 如果connect一直等到超时, 就认为对端不在线.

由于Nmap当前不支持ipv6的裸报文发送,所以针对ipv6的TCP SYN扫描也是使用connect实现的

TCP ACK Ping

参数: -PA<port list>

TCP ACK扫描与SYN扫描差不多, 向目的段发送一个ACK包, ACK表示建立一个TCP连接, 由于本身没有这个连接, 所以对端会发送一个RST包, 一旦对方发送了RST包, 表示对方在线

-PA参数表示ACK扫描, 默认使用80端口, 与SYN扫描一样, 也支持指定端口扫描

与SYN扫描一样, 如果非特权用户执行, 或者是IPv6扫描, 会使用connect来代替raw socket, 所以如果使用非特权用户, 实际上发送的还是SYN而不是ACK

Nmap既提供SYN扫描又提供ACK扫描的原因是为了最大程度的穿透防火墙. 很多网络管理员会在防火墙上配置禁止从外部进入的SYN报文, 除了特定的公共网络服务端口如Web服务, 邮件服务等. 在禁止外部连接到内部的同时, 放通内部用户的Internet访问. 这种配置在一些无状态防火墙中被广泛使用

当防火墙配置了这种规则,SYN扫描就会被屏蔽, 在这种场景下可以使用ACK扫描绕过规则

另外一种情况下, 对端使用有状态的防火墙,会丢弃掉会话过程中异常的包. 这种一般应用在一些高端防火墙上, 现在越来越常见.

在这种场景下, ACK扫描由于报文异常会被直接丢弃掉, 这种情况下, 使用SYN扫描是更好的选择

UDP Ping

参数: -PU<port list>

UDP扫描向目的端口发送一个UDP报文, 默认端口是40,125 , 跟TCP扫描一样, 可以指定端口进行扫描. 一般来说, 使用不常见的端口更好, 因为在这种扫描类型下一般不希望发送到一个开放端口

通常来讲我们会发送一个空的报文到指定端口, 对于一些端口如53和161, 发送带有payload的包更有可能得到响应, 这种时候可以使用--data-length参数发送一个特定长度的随机payload

如果目标主机的端口是关闭的, 我们会收到一个ICMP 端口不可达的报文响应. 这表示目标主机在线. 其他的ICMP错误, 比如说host/network unreachable或者TTL exceeded表示对端主机不在线或不可达. 如果没有响应也表示对端不在线.

如果目标主机端口开放, 大多数服务会忽略空报文, 不返回任何响应.这就是为什么默认端口使用40,125这种很少使用的端口. 有很少的服务,比如chargen协议, 会回复空报文, 一旦有回复, 表示主机在线. 对于特定服务监听的特定端口, 通过定制payload, 可以提高获得响应的概率

UDP扫描最主要的好处是可以突破只过滤TCP协议的防火墙.

ICMP Ping

参数: -PE, -PP, -PM

除了非标的TCP和UDP主机发现,Nmap也提供了标准常见的ICMP Ping扫描能力

Nmap向目标发送一个type 8的ICMP包(ICMP Echo),如果收到一个type 0的ICMP响应(Echo Reply),则认为主机在线。现在很多主机和防火墙会拦截这些包,所以通过互联网只用ICMP包扫描的结果是不可信的。但是对于内部网络的系统管理员,这是一种推荐的高效方式。使用-PE参数启用ICMP Echo扫描

ICMP除了 Echo请求,还有如ICMP Timestamp请求(13), information请求(15),地址掩码请求(17)。这些请求本来的目的是用来查询地址掩码、当前时间戳等信息的,也可以被用来做主机发现。Nmap当前不支持information请求进行扫描,因为当前ICMP information请求的支持不好。Timestamp请求可以通过-PP参数,地址掩码请求可以通过-PM参数启用。Timestamp响应(ICMP code 14)或者地址掩码响应(ICMP code 18)表示服务在线。

这两种扫描方式可以用于网络管理员禁用了ICMP echo请求,但是忘记禁用其他ICMP查询请求的情况下使用

IP Protocal Ping

参数: -PO<protocal list>

最新的主机发现选项是IP Protocal Ping, 直接发送IP包, 并在IP包头中设置特定的协议号. 使用的协议列表是可设置的,设置的格式与TCP与UDP主机扫描设置端口的格式是一样的. 如果没有设置特定的协议, 默认会发送ICMP协议包(协议号1), IGMP协议包(协议号2) 和IP-in-IP (协议号4). 注意对于ICMP、IGMP、TCP和UDP协议, 发送时会协议正确的协议头, 使用其他协议的时候除了IP协议头不会携带其他信息 (除非显示设置了--data-length选项)

这种主机发现方式, 报文发送了以后, 如果收到了相应协议的响应, 或者收到一个ICMP 协议不可达 (表示不支持给定的协议)的消息时, 表示目标主机在线

ARP Scan

参数: -PR

在局域网扫描是Nmap最常见的使用场景. 当Nmap尝试发送ICMP echo请求这种裸IP报文时, 操作系统必须先通过ARP获取到目标断的硬件地址. 在下面这个例子中, 尝试在一个本地以太网中执行一个ping扫描, 我们使用--send-ip选项告诉Nmap即使是在本地网络中也发送IP层级的报文(而不是以太网报文). 通过wireshark的抓包可以看到会话中的三个ARP请求

1
2
3
4
5
6
7
8
9
# nmap -n -sn --send-ip 192.168.33.37


Starting Nmap ( https://nmap.org )
  0.000000 00:01:29:f5:27:f2 -> ff:ff:ff:ff:ff:ff ARP Who has 192.168.33.37? 
  0.999836 00:01:29:f5:27:f2 -> ff:ff:ff:ff:ff:ff ARP Who has 192.168.33.37?
  1.999684 00:01:29:f5:27:f2 -> ff:ff:ff:ff:ff:ff ARP Who has 192.168.33.37?
Note: Host seems down. If it is really up, but blocking ping probes, try -Pn
Nmap done: 1 IP address (0 hosts up) scanned in 2.04 seconds

在这个实例中执行命令花费了超过2s才返回, 因为Linux操作系统没有收到ARP响应时连续发送了三个ARP请求, 每个请求相隔1秒. 一般来讲ARP响应会在毫秒级返回, 所有没有必要等待很多秒. 过长的等待在扫描机器很多时会造成很长时间的浪费

在局域网使用IP ping扫描还有一个问题, 当目标主机不响应时, 源主机通常会在内核的ARP表中增加一条未完成的记录. ARP表的空间时有限的, 在一些处理不好的操作系统上, 当ARP表满了以后可能会造成不良的影响. 当Nmap使用--send-ip IP模式时, 有时需要等待数分钟以保证ARP缓存过期以后, 才能开始下一次扫描

ARP扫描解决了这两个问题, Nmap发原始的ARP请求并自己决定重传机制和超时时间. 绕过了系统的ARP缓存. 下面的这个ARP扫描的例子中, ARP扫描只花费了IP包扫描十分之一的时间

1
2
3
4
5
6
7
# nmap -n -sn -PR --packet-trace --send-eth 192.168.33.37

Starting Nmap ( https://nmap.org )
SENT (0.0060s) ARP who-has 192.168.33.37 tell 192.168.0.100
SENT (0.1180s) ARP who-has 192.168.33.37 tell 192.168.0.100
Note: Host seems down. If it is really up, but blocking ping probes, try -Pn
Nmap done: 1 IP address (0 hosts up) scanned in 0.23 seconds

在这个例子中, -PR--send-eth选项其实没有起到什么作用. 因为当Nmap发现检测的地址是本地以太网时, 默认会选择使用ARP扫描. 包括在有线网络或者802.11无线网络中. Nmap这样选择不仅仅是因为ARP扫描更高效, 也是因为它更准确. 主机一般不会屏蔽ARP请求和响应, 但是却有可能会屏蔽IP请求响应. 在局域网本地扫描中, 即使在扫描时你指定了扫描类型(比如-PE或者-PS), Nmap也会选择使用ARP代替. 如果你明确地不想执行ARP扫描, 可以使用--send-ip参数来强制执行IP扫描

让Nmap控制发送以太网包还有一个好处是可以控制源端Mac地址, 如果在一次安全攻击中, 你只有一台机器执行扫描, 从你机器的Mac地址上发送大量的ARP包扫描, 会很快将对手的注意力吸引到你身上, 在这种情况下, 你可以使用--spoof-mac选项来伪造你的Mac地址

默认选项

如果在执行扫描时没有指定任何选项, 在Windows和Unix的特权用户下, Nmap的行为等同于-PE -PS443 -PA80 -PP选项. 这表示Nmap会向目标主机发送一个ICMP echo请求、一个TCP SYN 包, 一个TCP ACK包和一个ICMP timestamp请求包. 有一点除外, 如果目标是在本地以太网上, 那Nmap会发送ARP请求包扫描.

在Unix非特权用户下, 默认行为等同于选项-PS80,443 (对80和443端口使用connect连接).