nmap主机发现的原理与ping类似,发送探测包到目标主机,如果收到回复,则说明目标主机是开启的。
主机发现常用参数如下所示
参数 | 说明 |
---|---|
-sn | ping扫描,只进行主机发现,不进行端口扫描 |
-PE/PP/PM | 使用ICMP echo、timestamp、netmask请求包发现主机 |
-PS/PA/PU/PY[portlist] | 使用TCP SYN/ACK或者SCTP INIT/ECHO方式发现主机 |
-sL | 列表扫描,仅将指定的目标IP列举出来,不进行主机发现 |
-Pn | 将所有主机视为开启,跳过发现过程 |
-n/-R | -n表示不进行DNS解析,-R表示总是进行DNS解析 |
默认情况下,nmap会扫描1000个最有可能开放的TCP端口。nmap通过探测将端口分为六个状态。open 开放、closed 关闭、filtered 被防火墙IDS/IPS屏蔽无法确定、unfiltered未屏蔽但是否开放还需进一步确定、open|filtered 可能为开放或者屏蔽、closed|filtered 可能为关闭或者屏蔽。
nmap的扫描参数非常之多,常见的扫描参数如下所示
参数 | 说明 |
---|---|
-p <port range> | 扫描指定端口。该参数支持单个端口、端口范围、协议筛选。例如,-p 22指定端口为22、-p1-888指定扫描端口范围为1-888、-p U\T\S:<IP>指定协议为UDP、TCP、SCTP |
-F | 快速模式,仅扫描top100的端口 |
-A | 全面扫描,使用nmap所有功能进行扫描,很慢 |
-T4 | 指定扫描过程使用的时序,共六个级别(0-5),级别越高扫描速度越快,但是容易被防火墙或者IDS检测并被屏蔽 |
-v | 显示冗余信息,显示扫描的细节 |
这是nmap默认的扫描方式,通常称为半开放扫描。该方法发送SYN到目标端口,如果收到SYN/ACK回复,则可以判定端口是开放的;如果收到RST,则说明端口是关闭的。如果无回复,则说明端口被屏蔽了。因为该方法仅仅发送SYN包到目标主机的特定端口,但不建立完整的TCP连接,因此较为隐蔽,效率较高适用范围较广。
向目的主机发送ACK包,如果收到RST包,则说明端口没有被防火墙屏蔽;没有收到RST包,则说明端口被屏蔽了。该方式只用于确认防火墙是否屏蔽某个端口。
这三种方式称为秘密扫描,因为相对比较隐蔽。向目的主机端口发送TCP FIN包或者Xmas tree包或者NULL包,如果收到对方的RST包,则说明端口是关闭的。否则说明端口是开放的或者被屏蔽了。
UDP扫描用于判断UDP端口的情况,向目标主机的UDP端口发送探测包,如果收到回复ICMP port unreachable则说明端口是关闭的,否则说明端口是开放的或者被屏蔽了。因此可以通过反向排除法来判断哪些UDP端口可能处于开放状态。
版本探测用于确定目标主机开放端口上运行的具体应用程序及其版本信息。
nmap首先检查opne与open|filtered状态的端口是否在排除端口列表内,如果在排除列表内,则将该端口剔除。如果是TCP端口则尝试建立TCP连接,在等待时间内收到目标主机发送的banner信息。nmap将接收的banner与nmap服务探针数据库进行对比,查找对应应用程序的名字与版本信息。
版本探测的主要参数为-sV。版本探测可以更好地识别对端主机服务的对应版本,防止管理员修改默认服务端口导致判断失误的情况。例如,目标主机将ssh的默认端口号22改为2222,那么普通扫描只能判断2222端口号开启,而无法判断2222端口上运行了什么应用程序。通过加上参数-sV可以判断目的主机对应端口上的应用程序的信息。
从扫描结果可以看出,目标主机的22端口对应的服务版本为openssh 7.4.
nmap拥有丰富的系统数据库nmapos数据库,可以识别2600多种操作系统与设备类型。使用的参数为-O,通过该参数可以判断目标主机操作系统及版本。从扫描结果可以看出目的主机操作系统可能为Windows7或者Windows8.1。
nmap除了上述的探测扫描功能之外,还存在着上百个nse脚本,这些脚本使用Lua语言编写,包括十四个类别。nse脚本可以进行更复杂的网络版本探测、漏洞探测、后门探测及利用。
nse脚本使用参考Nmap的NSE脚本使用