Nmap是一款用于网络发现和安全审计的网络安全工具,通常情况下,Nmap用于:
列举网络主机清单
管理服务升级调度
监控主机
服务运行状况
Nmap可以检测目标主机是否在线、端口开放情况、侦测运行的服务类型及版本信息、侦测操作系统与设备类型等信息。
系统管理员可以利用Nmap来探测工作环境中未经批准使用的服务器,黑客通常会利用Nmap来搜集目标电脑的网络设定,从而计划攻击的方法。
Nmap通常用在信息搜集阶段,用于搜集目标机主机的基本状态信息。扫描结果可以作为漏洞扫描、漏洞利用和权限提升阶段的输入。
Nmap不仅可以用于扫描单个主机,也可以适用于扫描大规模的计算机网络
Nmap是一个功能强大的网络扫描工具,用于发现主机、服务和开放端口等信息。
扫描单个主机或主机范围
nmap target nmap 192.168.1.1 nmap example.com nmap 192.168.1.1-100
扫描整个子网
nmap 192.168.1.0/24
扫描多个目标
nmap target1 target2 target3
扫描特定端口
nmap -p port target nmap -p 80,443 example.com
扫描常见端口
nmap -F target
指定扫描技术
nmap -sS target # TCP SYN 扫描 nmap -sT target # TCP 连接扫描 nmap -sU target # UDP 扫描
指定扫描范围
nmap -p1-100 target # 扫描端口范围 nmap -sS -p- target # 扫描所有65535个TCP端口
扫描速度和详细级别
nmap -T4 target # 设置扫描速度 nmap -v target # 详细输出
指定输出格式
nmap -oN output.txt target # 输出到文本文件 nmap -oX output.xml target # 输出到XML文件
禁用主机发现
nmap -Pn target # 禁用Ping扫描
指定脚本扫描
nmap --script scriptname target # 执行特定脚本
这些是Nmap的一些基本用法,但Nmap具有更多高级功能和选项,可以根据需要进行深入研究和学习。
在使用Nmap进行端口扫描时,有三种基本的扫描类型。它们分别是:
- TCP连接扫描 (-sT)
- SYN "半开放"扫描 (-sS)
- UDP扫描 (-sU)
要理解TCP连接扫描 ,最重要的是对 TCP三次握手熟悉。
三次握手包括三个阶段。首先,连接的终端向目标服务器发送一个带有SYN标志的TCP请求。然后,服务器用一个包含SYN标志和ACK标志的TCP响应确认此数据包。最后,我们的终端通过发送一个带有ACK标志的TCP请求来完成握手。
TCP连接扫描通过依次与每个目标端口执行三次握手来工作。换句话说,Nmap尝试连接到每个指定的TCP端口,并通过接收到的响应确定服务是否开放。
与TCP扫描类似,SYN扫描用于扫描目标或目标的TCP端口范围;然而,这两种扫描类型的工作方式略有不同。SYN扫描有时被称为“半开放”扫描,或“隐秘”扫描。
TCP扫描与目标执行完整的三次握手,而SYN扫描在从服务器收到SYN/ACK后发送一个RST TCP数据包(这可以防止服务器重复尝试请求)。
这对我们有很多优势:
- 它可以用来绕过旧版入侵检测系统,因为它们正在寻找完整的三次握手。对于现代IDS解决方案来说,情况通常不再是这样;正是因为这个原因,SYN扫描仍然经常被称为“隐秘”扫描。
- SYN扫描通常不会被打开端口上侦听的应用程序记录,因为标准做法是在建立连接后记录连接。这再次体现了SYN扫描的隐蔽性。
- 由于不必为每个端口完成(和断开)三次握手,SYN扫描比标准TCP连接扫描快得多。
然而,SYN扫描也有一些缺点,即:
- 它们需要sudo权限才能在Linux中正确工作。这是因为SYN扫描需要创建原始数据包的能力(与完整的TCP握手相反),这是仅root用户默认拥有的特权。
- 不稳定的服务有时会被SYN扫描关闭,如果客户端为测试提供了生产环境,则可能会出现问题。
总的来说,优点胜过缺点。
因此,如果具有sudo权限运行,则SYN扫描是Nmap使用的默认扫描。如果没有sudo权限运行,则Nmap默认使用我们在前面任务中看到的TCP连接扫描。
在使用SYN扫描识别关闭和过滤端口时,与使用TCP连接扫描相同的规则适用。
如果端口关闭,则服务器将以RST TCP数据包做出响应。如果防火墙过滤了端口,则TCP SYN数据包要么被丢弃,要么被伪造成TCP重置。
与TCP不同,UDP连接是无状态的。这意味着,UDP连接不是通过来回的“握手”来建立连接,而是依靠将数据包发送到目标端口,并希望它们能到达。这使得UDP非常适用于速度优先于质量的连接(例如视频共享),但是缺乏确认使得UDP扫描变得更加困难(也更加缓慢)。
当一个数据包发送到一个打开的UDP端口时,不应该有响应。当这种情况发生时,Nmap将端口标记为 open|filtered。换句话说,它怀疑该端口是开放的,但可能已经被防火墙过滤。如果它收到UDP响应(这是非常不寻常的),那么该端口将被标记为open。更常见的情况是没有响应,此时请求会第二次发送以进行双重检查。如果仍然没有响应,则端口将被标记为 *open|filtered*,并且Nmap继续进行扫描。
当一个数据包发送到一个关闭的UDP端口时,目标应该用包含端口不可达消息的ICMP(ping)数据包做出响应。这清楚地标识了关闭的端口,Nmap会将其标记为关闭并继续进行扫描。
由于很难确定UDP端口是否真正开放,与各种TCP扫描相比,UDP扫描往往非常缓慢(在良好连接下扫描前1000个端口需要大约20分钟)。因此,通常最好使用启用了 --top-ports
使用 nmap -sU --top-ports 20
在扫描UDP端口时,Nmap通常发送完全空的请求 -- 仅仅是原始的UDP数据包。也就是说,对于通常由众所周知的服务占用的端口,它将发送一个特定于协议的有效载荷,这更有可能引发响应,并得出更准确的结果。
在黑盒分配中第一次连接到目标网络时,我们想看看哪些IP地址包含活动主机,哪些不包含。
其中一种方法是使用Nmap执行所谓的“ping扫描”。这正如其名字所示:Nmap向指定网络的每个可能的IP地址发送一个ICMP数据包。当它收到响应时,它将标记响应的IP地址为活动。
要执行ping扫描,我们使用 -sn 开关与IP范围结合使用,IP范围可以用连字符(-)或CIDR表示法指定。例如,我们可以使用以下命令扫描192.168.0.x网络:
- nmap -sn 192.168.0.1-254
或者
- nmap -sn 192.168.0.0/24
-sn 开关告诉Nmap不要扫描任何端口 -- 强制其主要依赖ICMP回显数据包(或者在本地网络上运行时使用sudo或直接作为根用户的ARP请求)来识别目标。
除了ICMP回显请求外,-sn 开关还将导致nmap向目标的端口443发送TCP SYN数据包,并向目标的端口80发送TCP ACK(或如果未以根用户身份运行,则发送TCP SYN)数据包。
Nmap脚本引擎(NSE)是Nmap的一个非常强大的补充,它相当大地扩展了Nmap的功能。NSE脚本使用 Lua 编程语言编写,可用于各种用途:从扫描漏洞到自动化对其的利用。NSE特别适用于侦察,但是值得注意的是脚本库有多么庞大。
有许多可用的类别。一些有用的类别包括:
- safe:不会影响目标
- intrusive:不安全:可能会影响目标
- vuln:扫描漏洞
- exploit:尝试利用漏洞
- auth:尝试绕过运行服务的认证(例如,匿名登录FTP服务器)
- brute:尝试对运行服务的凭据进行暴力破解
- discovery:尝试查询运行服务以获取有关网络的更多信息(例如,查询SNMP服务器)。
要运行特定的脚本,我们将使用 --script=
可以通过用逗号分隔它们来以这种方式同时运行多个脚本。例如:--script=smb-enum-users,smb-enum-shares。
某些脚本需要参数(例如,如果它们正在利用经过身份验证的漏洞,则需要凭据)。这些参数可以使用 --script-args Nmap开关提供。例如,http-put 脚本(用于使用PUT方法上传文件)就需要两个参数:要上传文件的URL和磁盘上文件的位置。例如:
nmap -p 80 --script http-put --script-args http-put.url='/dav/shell.php',http-put.file='./shell.php'
注意,参数由逗号分隔,并且与相应的脚本用句点连接(即
Nmap提供了一个选项:-Pn,告诉Nmap在扫描之前不要费心ping主机。这意味着Nmap将始终将目标主机视为活动的,有效地绕过ICMP阻塞;但是,它的代价是可能需要很长时间才能完成扫描(如果主机确实死了,那么Nmap仍将检查和重复检查每个指定的端口)。