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请求
|
|
在这个实例中执行命令花费了超过2s才返回, 因为Linux操作系统没有收到ARP响应时连续发送了三个ARP请求, 每个请求相隔1秒. 一般来讲ARP响应会在毫秒级返回, 所有没有必要等待很多秒. 过长的等待在扫描机器很多时会造成很长时间的浪费
在局域网使用IP ping扫描还有一个问题, 当目标主机不响应时, 源主机通常会在内核的ARP表中增加一条未完成的记录. ARP表的空间时有限的, 在一些处理不好的操作系统上, 当ARP表满了以后可能会造成不良的影响. 当Nmap使用--send-ip
IP模式时, 有时需要等待数分钟以保证ARP缓存过期以后, 才能开始下一次扫描
ARP扫描解决了这两个问题, Nmap发原始的ARP请求并自己决定重传机制和超时时间. 绕过了系统的ARP缓存. 下面的这个ARP扫描的例子中, ARP扫描只花费了IP包扫描十分之一的时间
|
|
在这个例子中, -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
连接).