主动扫描的工具很多,最为优秀的非Nmap莫属,本篇我们主要先介绍使用Nmap进行设备发现,即确定设备是否为活跃设备。

一、Nmap的基本用法

1、对单台设备扫描:nmap IP地址 

android 怎么获取nmap扫描出来的公开端口 nmap扫描手机设备_wireshark

starting nmap:表示版本为7.92,扫描开始时间为2023-03-18 05:17

host is up:给出目标设备状态为up(开机并联网)

not shown:表明在检查的1000个端口中,有995个是关闭的

接下来是一张表,分别是端口、状态、提供的服务

最后一行表明共对一台设备进行扫描,一台状态为up,耗时8.47秒

默认情况下nmap会同时进行活跃状态和端口状态扫描,使用参数 -sn只进行活跃状态扫描

android 怎么获取nmap扫描出来的公开端口 nmap扫描手机设备_linux_02

2、对IP地址不连续的多台设备扫描:nmap IP地址1 IP地址2 IP地址3 ...

为了节约时间我们这里加上参数 -sn

android 怎么获取nmap扫描出来的公开端口 nmap扫描手机设备_网络协议_03

3、对IP地址在连续范围内的多台设备扫描:nmap IP地址的范围

比如我们对192.168.88.1~192.168.88.255的设备进行扫描

内容太长了,我们还是加上-sn (实际扫描的时候根据实际需求选择加或不加)

android 怎么获取nmap扫描出来的公开端口 nmap扫描手机设备_linux_04

 4、对整个子网设备的扫描:nmap IP地址/掩码位数

同样以3中的范围为例

android 怎么获取nmap扫描出来的公开端口 nmap扫描手机设备_网络协议_05

二、使用Nmap进行设备发现

1、使用ARP进行设备发现

ARP(地址解析协议)位于TCP/IP模型的网络层,主要用来解决逻辑地址和物理地址的转换关系。同一网段中的通信一般使用物理地址,不同网段之间的通信一般使用逻辑地址。在同一网段中,所有的设备都会连接到交换机上,这些设备的物理地址的表—ARP表,就存在交换机的内容寻址寄存器上。

思路:构造ARP请求数据包,并广播出去,若得到回应,则说明该设备为活跃设备。

当目标设备与我们处于同一网段时,ARP扫描技术是最佳选择,因为没有任何安全措施会阻止正常的ARP请求。

其实在执行nmap命令时就会默认向同一网段的目标设备发送ARP请求,产生的数据包如下

android 怎么获取nmap扫描出来的公开端口 nmap扫描手机设备_网络协议_06

android 怎么获取nmap扫描出来的公开端口 nmap扫描手机设备_linux_07

 2、使用ICMP进行设备发现

ICMP(因特网控制消息协议)位于网络层,在IP设备、路由器之间传递控制消息。

ICMP的报文可分为两类——差错和查询,Nmap中ICMP活跃设备发现技术使用的是查询报文。

ICMP中适合使用的查询报文有三类:

回送请求和回答:使用参数 -PE 实现(这个过程实际和ping命令是一样的)

语法:nmap -PE 目标设备IP地址

android 怎么获取nmap扫描出来的公开端口 nmap扫描手机设备_tcp/ip_08

向目标设备发送ICMP echo 请求数据包(包中type字段值为8)

若目标在线,且没有防火墙隔离通信,将会收到回应数据包,但可惜的是这种ping的方式已经被很多网络禁止了。

 ② 时间戳请求和回答:使用参数 -PP 实现

语法:nmap -PP 目标设备IP地址

(type字段值为13)

android 怎么获取nmap扫描出来的公开端口 nmap扫描手机设备_网络协议_09

地址掩码请求和回答:使用参数 -PM实现

语法:nmap -PM 目标设备IP地址

(type字段值为17)

android 怎么获取nmap扫描出来的公开端口 nmap扫描手机设备_linux_10

 通常,nmap在进行其他扫描前,都会对目标设备进行ping扫描,若ping扫描没反应,就会直接结束整个扫描过程,我们可以指定无论目标设备是否响应ping扫描,都将整个扫描过程完成。

语法:nmap -Pn 目标设备IP地址

android 怎么获取nmap扫描出来的公开端口 nmap扫描手机设备_网络协议_11

 

3、使用TCP进行设备发现

TCP是一个位于传输层的协议,它的主要过程由 “三次握手” 构成:

主动端发送SYN数据包,被动端回应SYN+ACK数据包,主动端再回应ACK数据包。

① TCP SYN扫描

使用参数 -PS 向目标设备发送SYN标志的数据包,内容部分为空,默认是80端口

若这个端口是开放的,目标设备就会发回一个SYN+ACK数据包,表示同意建立连接,

若是端口关闭的,则发回RST数据包,表示拒绝这次连接。

无论返回什么包,都表明目标是活跃设备。

语法:nmap -PS 端口1 端口2 ... 目标设备IP址

android 怎么获取nmap扫描出来的公开端口 nmap扫描手机设备_wireshark_12

 产生数据包如下: 

android 怎么获取nmap扫描出来的公开端口 nmap扫描手机设备_网络协议_13

在指定端口时常用组合:-PS 22 80,而 -PS 80 443 的意义不大(要么都提供,要么都不提供)

② TCP ACK扫描

使用参数 -PA 向目标设备发送ACK标志的数据包

 同样是以80为默认端口,也可进行指定。

语法:nmap -sn -PA 目标设备IP地址(数据包太多了为了大家看得清楚这里加了参数 -sn )

android 怎么获取nmap扫描出来的公开端口 nmap扫描手机设备_linux_14

产生数据包如下:

android 怎么获取nmap扫描出来的公开端口 nmap扫描手机设备_linux_15

 实际情况中,这种类型的扫描很少能成功,因为目标设备上的安全机制或安全设备将这种ACK数据包直接过滤了。

4、使用UDP进行设备发现

UDP(用户数据包协议)位于传输层,它完成的工作与TCP是相同的,但UDP不是面向连接的。

当一个端口收到一个UDP数据包时,若它是关闭的,就会给源端口发回一个ICMP端口不可达数据包;若它是开放的,就会直接忽略这个数据包,丢弃且不返回任何信息。

对此我们可以完成对UDP端口的探测,但扫描结果可靠性不高。

UDP扫描使用参数 -PU 实现

语法:nmap -PU 目标设备IP地址

android 怎么获取nmap扫描出来的公开端口 nmap扫描手机设备_网络协议_16

 

OK,本篇内容到此为止,后面将会继续介绍使用Nmap对端口、目标系统、目标服务、web服务的扫描以及将扫描结果存为XML文件等。