NMAP:网络探索和安全审计手册 Chapter1 基础知识

作者:保利诺·卡尔德隆(Paulino Calderon)

本章将介绍以下食谱:

  • 构建 Nmap 的源代码

  • 查找网络中的实时主机

  • 列出目标主机上的开放端口

  • 对目标主机上运行的操作系统和服务进行指纹识别

  • 针对目标主机使用 NSE 脚本

  • 从文件读取目标

  • 扫描 IP 地址范围

  • 扫描互联网上的随机目标

  • 收集网络服务器签名

  • 使用 Nmap 和 Ndiff 远程监控服务器

  • 使用 Nping 制作 ICMP echo 回复

  • 使用 Zenmap 管理多个扫描配置文件

  • 使用 Ncat 针对网络连接运行 Lua 脚本

  • 使用 Ncrack 发现弱口令系统

  • 使用 Rainmap Lite 从网络浏览器远程启动 Nmap 扫描

1、引言

Network Mapper (Nmap) 最初由 Gordon Fyodor Lyon 在臭名昭著的 Phrack 杂志第 7 卷第 51 期 (https://nmap.org/p51-11.html) 上发布。如今,它已被誉为信息安全行业网络侦察和安全审计的最佳工具之一。第一个公开版本是作为高级端口扫描器推出的,并附有一篇介绍端口发现技术研究的论文。它已发展成为一个重要的、功能齐全的工具,包括其他几个优秀的子项目,如 Ncrack、Ncat、Nping、Zenmap 和 Nmap 脚本引擎(所有这些都可在 https://nmap.org/ 上获取)。官方网站对 Nmap 的描述如下:

"Nmap(网络映射器)是一款用于网络发现和安全审计的免费开源(许可证)实用程序。许多系统和网络管理员也发现它在网络清查、管理服务升级计划以及监控主机或服务正常运行时间等任务中非常有用。Nmap 以新颖的方式使用原始 IP 数据包来确定网络上有哪些主机、这些主机提供哪些服务(应用程序名称和版本)、它们运行什么操作系统(和操作系统版本)、使用什么类型的数据包过滤器/防火墙,以及数十种其他特征。它的设计目的是快速扫描大型网络,但对单个主机也能正常工作。Nmap 可在所有主流计算机操作系统上运行,Linux、Windows 和 Mac OS X 均有官方二进制软件包。

项目中的其他工具是为满足用户的特殊需求而创建的。Nping (https://nmap.org/nping/) 专门从事网络数据包制作。

Ncrack (https://nmap.org/ncrack/) 专注于网络身份验证破解。Ncat (htt ps://nmap.org/ncat/) 是 Netcat 的增强版,允许用户读取、写入、重定向和修改网络数据。Zenmap (https://nmap.org/zenmap/) 是一个跨平台图形用户界面,注重实用性。最后,Nmap 脚本引擎(Nmap Scripting Engine)(https://nmap.org/book/nse.html)从目标获取扫描信息,并为用户编写附加任务脚本提供接口。

Nmap 的社区非常活跃,所以我建议您经常关注发布的版本和最新补丁。公告和讨论在开发邮件列表中进行,因此如果您想为项目做出贡献,我建议您订阅该列表。

第一章是为新手准备的。从构建 Nmap 开始,我们将熟悉 Nmap 项目的所有工具。在短短几个菜谱中,你将了解到 Nmap 的灵活性和强大功能,但随着章节的深入,我们将深入了解其内部结构,不仅学习如何使用工具,还学习如何扩展工具和创建自己的工具。本章所选的实用任务将帮助你对本地和远程系统进行指纹识别、映射网络、制作自定义网络数据包,甚至识别存在弱口令的系统。

2、安装最新的Nmap(基于源码包)

在下面的配方中,我们将使用 Nmap 项目中包含的工具,因此最好现在就安装最新版本。本食谱将介绍如何从开发源代码库中下载最新的源代码拷贝,并在基于 UNIX 的系统中安装 Nmap 和相关工具。

我们总是喜欢使用最新稳定版本的软件源,因为预编译包的准备需要时间,我们可能会错过一个补丁或一个新的 NSE 脚本。下面的食谱将展示配置、构建和维护 Nmap 项目最新副本的过程。

准备工作

在继续之前,你需要有一个正常工作的互联网连接,并能访问 subversion 客户端。基于 Unix 的平台自带一个名为 subversion (svn) 的命令行客户端。要检查系统中是否已安装该客户端,只需打开终端并键入以下命令即可:


$ svn

如果找不到该命令,请使用你喜欢的软件包管理器安装 svn 或从源代码中构建它。从源代码编译 svn 的说明不在本书的讨论范围之内,但网上有大量相关文档。请使用你喜欢的搜索引擎查找适合你系统的具体说明。

构建 Nmap 时,我们还需要额外的库,例如 OpenSSL 的开发定义或 make 命令。在基于 Debian 的系统中,尝试使用下面的命令来安装缺少的依赖项:


#apt-get install libssl-dev autoconf make g++

请注意,OpenSSL 是可选的,Nmap 也可以在没有它的情况下构建;但是,Nmap 将被削弱,因为它使用 OpenSSL 实现与多精度整数、散列和编码/解码相关的功能,以检测服务和 Nmap 脚本引擎。

如何做...

  1. 首先,我们需要从官方源代码库中获取一份源代码副本。要下载开发分支的最新版本,我们可以使用 checkout(或 co)命令:

$svn co --username guest https://svn.nmap.org/nmap

  1. 现在你应该能看到下载的文件列表和已签出修订版<修订版号>的信息。现在,在你的工作目录下有一个包含源代码的新目录。安装完所需的依赖项后,我们就可以使用标准程序编译 Nmap 了:configure、make 和 make install。进入包含源代码的目录,输入以下内容:

$./configure

  1. 如果配置过程成功完成,你应该会看到一些漂亮的 ASCII 图像(图像是随机选择的,所以你不一定会看到这个):

1697075340509

  1. 要编译 Nmap,请使用 make:

$make

  1. 现在,你应该能在当前工作目录下看到 nmap 二进制文件。最后,要在系统中安装 Nmap,请使用管理权限执行 make install:

#make install

操作完成后,您将看到 NMAP SUCCESFULLY INSTALLED(NMAP 成功安装)信息。

工作原理...

https://svn.nmap.org/nmap 上托管的 SVN 代码库包含 Nmap 的最新稳定版本,具有全球读取权限,允许任何人获取源代码副本。我们从头开始构建该项目,以获得最新的补丁和功能。本食谱中描述的安装过程还安装了 Zenmap、Ndiff 和 Nping。

还有更多...

编译 Nmap 的过程与编译其他基于 Unix 的应用程序类似,但有几个编译时间变量可以调整,以配置安装。建议无法从源代码编译 Nmap 的用户使用预编译二进制文件。推荐使用基于 Unix 的系统,因为 Windows 存在一些限制,详情请访问 https://nmap.org/book/inst-windows.html。

实验分支

如果你想尝试开发团队的最新成果,可以在名为 nmap-exp 的文件夹中找到该项目的多个实验分支。该文件夹中存储的代码并不能保证一直工作,因为在准备合并到生产环境之前,它一直被用作沙盒。该文件夹的 subversion URL 是 https://svn.nmap.org/nmap-exp/。

更新本地nmap

Nmap 项目非常活跃(尤其是在夏季),因此不要忘记定期更新您的副本。如果您保存了 svn 代码库的工作副本,可以在该目录下执行以下命令轻松完成更新:


$svn up

$make

#make install

自定义配置步骤

如果不需要其他 Nmap 实用程序,如 Nping、Ndiff 或 Zenmap,可以使用不同的 configure 指令在配置步骤中省略安装:


./configure --without-ndiff

./configure --without-zenmap

./configure --without-nping

如需配置指令的完整列表,请使用 --help 命令参数:


$./configure --help

预编译软件包

没有编译器的用户可以在 https://nmap.org/download.html 找到适用于所有主要平台的预编译 Nmap 软件包。使用预编译软件包时,请确保使用的是最新版本,以免错过重要的修复或增强功能。

3、主机发现

查找本地网络中的实时主机是渗透测试人员和系统管理员列举网段上活动机器的一项常见任务。Nmap 比传统的 ping 工具具有更高的检测率,因为它比传统的 ICMP echo 请求发送更多的探测来发现主机。

本食谱介绍如何使用 Nmap 执行 ping 扫描,以查找本地网络中的活动主机。

如何做...

使用以下命令对网段进行 ping 扫描:


#nmap -sn <target>

结果将包括在 ping 扫描期间对 Nmap 发送的任何数据包做出响应的所有主机,即指定网段上的活动机器:


Nmap scan report for 192.168.0.1

Host is up (0.0025s latency).

MAC Address: F4:B7:E2:0A:DA:18 (Hon Hai Precision Ind.)

Nmap scan report for 192.168.0.2

Host is up (0.0065s latency).

MAC Address: 00:18:F5:0F:AD:01 (Shenzhen Streaming Video Technology

Company Limited)

Nmap scan report for 192.168.0.3

Host is up (0.00015s latency).

MAC Address: 9C:2A:70:10:84:BF (Hon Hai Precision Ind.)

Nmap scan report for 192.168.0.8

Host is up (0.029s latency).

MAC Address: C8:02:10:39:54:D2 (LG Innotek)

Nmap scan report for 192.168.0.10

Host is up (0.0072s latency).

MAC Address: 90:F6:52:EE:77:E9 (Tp-link Technologies)

Nmap scan report for 192.168.0.11

Host is up (0.030s latency).

MAC Address: 80:D2:1D:2C:20:55 (AzureWave Technology)

Nmap scan report for 192.168.0.18

Host is up (-0.054s latency).

MAC Address: 78:31:C1:C1:9C:0A (Apple)

Nmap scan report for 192.168.0.22

Host is up (0.030s latency).

MAC Address: F0:25:B7:EB:DD:21 (Samsung Electro Mechanics)

Nmap scan report for 192.168.0.5

Host is up.

Nmap done: 256 IP addresses (9 hosts up) scanned in 27.86 seconds

如果在本地以太网网络上以特权用户身份执行 Nmap 的 Ping 扫描,还可以识别 MAC 地址和供应商。

工作原理...

Nmap 选项 -sn 禁用端口扫描,但启用发现阶段,使 Nmap 执行 ping 扫描。根据权限的不同,Nmap 默认使用不同的技术来完成这项任务:如果以权限用户身份执行,则向 443 端口发送 TCP SYN 数据包、向 80 端口发送 TCP ACK 数据包以及 ICMP echo 和时间戳请求;如果由不能发送原始数据包的用户执行,则通过 connect() syscall 向 80 端口和 443 端口发送 SYN 数据包。以特权用户身份扫描本地以太网网络时,也会启用 ARP/邻居发现功能。通过 ARP/邻居发现阶段发送的 ARP 请求,可以识别 MAC 地址和供应商。

还有更多...

Nmap 支持多种主机发现技术,即使在最受限制的环境中,也可以定制探针来有效扫描主机。重要的是,我们要了解所支持技术的内部原理,以便正确应用它们。现在,让我们进一步了解 Nmap 的主机发现功能。

路由跟踪

Ping 扫描允许跟踪目标的路由信息。使用 Nmap 选项 -- traceroute 可以跟踪从扫描机器到目标主机的路由:


#nmap -sn --traceroute google.com microsoft.com

Nmap scan report for google.com (216.58.193.46)

Host is up (0.16s latency).

Other addresses for google.com (not scanned):

2607:f8b0:4012:805::200e

rDNS record for 216.58.193.46: qro01s13-in-f14.1e100.net

TRACEROUTE (using port 443/tcp)

HOP RTT ADDRESS

1 1.28 ms 192.168.0.1

2 ...

3 158.85 ms 10.165.1.9

4 ... 5

6 165.50 ms 10.244.158.13

7 171.18 ms 10.162.0.254

8 175.33 ms 200.79.231.81.static.cableonline.com.mx

(200.79.231.81)

9 183.16 ms 10.19.132.97

10 218.60 ms 72.14.203.70

11 223.35 ms 209.85.240.177

12 242.60 ms 209.85.142.47

13 ...

14 234.79 ms 72.14.233.237

15 235.17 ms qro01s13-in-f14.1e100.net (216.58.193.46)

Nmap scan report for microsoft.com (23.96.52.53)

Host is up (0.27s latency).

Other addresses for microsoft.com (not scanned): 23.100.122.175

104.40.211.35 104.43.195.251 191.239.213.197

TRACEROUTE (using port 443/tcp)

HOP RTT ADDRESS

- Hops 1-9 are the same as for 216.58.193.46

10 183.27 ms 10.19.132.30

11 231.26 ms 206.41.108.25

12 236.77 ms ae5-0.atb-96cbe-1c.ntwk.msn.net (104.44.224.230)

13 226.22 ms be-3-0.ibr01.bn1.ntwk.msn.net (104.44.4.49)

14 226.89 ms be-1-0.ibr02.bn1.ntwk.msn.net (104.44.4.63)

15 213.92 ms be-3-0.ibr02.was05.ntwk.msn.net (104.44.4.26)

16 251.91 ms ae71-0.bl2-96c-1b.ntwk.msn.net (104.44.8.173)

17 ... 19

20 220.70 ms 23.96.52.53

Nmap done: 2 IP addresses (2 hosts up) scanned in 67.85 seconds

在主机发现过程中运行 Nmap 脚本引擎

Nmap 脚本引擎可在 ping 扫描期间启用,以获取更多信息。与其他 NSE 脚本一样,它的执行取决于指定的 hostrule。要在 ping 扫描时执行 NSE 脚本,我们只需使用 Nmap 选项 -- script <file,folder,category> 即可,就像我们通常在端口/服务检测扫描时调用 NSE 脚本一样:


#nmap -sn --script dns-brute websec.mx

Nmap scan report for websec.mx (54.210.49.18)

Host is up.

rDNS record for 54.210.49.18: ec2-54-210-49-18.compute-

1.amazonaws.com

Host script results:

| dns-brute:

| DNS Brute-force hostnames:

| ipv6.websec.mx - 54.210.49.18

| web.websec.mx - 198.58.116.134

| www.websec.mx - 54.210.49.18

|_ beta.websec.mx - 54.210.49.18

在发现网络中的实时主机时,另一个值得尝试的有趣 NSE 脚本是 broadcast-ping 脚本:


$ nmap -sn --script broadcast-ping 192.168.0.1/24

Pre-scan script results:

| broadcast-ping:

| IP: 192.168.0.11 MAC: 80:d2:1d:2c:20:55

| IP: 192.168.0.18 MAC: 78:31:c1:c1:9c:0a

|_ Use --script-args=newtargets to add the results as targets

探索更多 ping 扫描技术

Nmap 支持多种使用不同协议的 ping 扫描技术。例如,默认的无参数 ping 扫描命令 (nmap -sn )以特权用户身份在内部执行 -PS443 -PA80 -PE -PP 选项,这些选项与端口 443 的 TCP SYN、端口 80 的 TCP ACK 以及 ICMP echo 和时间戳请求相对应。

在第 2 章 "网络探索 "中,您将进一步了解 Nmap 支持的下列 ping 扫描技术:

  • PS/PA/PU/PY [portlist]: 对给定端口进行 TCP SYN/ACK、UDP 或 SCTP 发现

  • PE/PP/PM: ICMP echo、时间戳和掩码请求发现探测

  • PO [协议列表]: IP 协议 ping

4、端口扫描

本食谱介绍如何使用 Nmap 确定远程主机上的端口状态,这是一个用来识别正在运行的服务的过程,通常称为端口扫描。这是 Nmap 最擅长的任务之一,因此学习与端口扫描相关的 Nmap 基本选项非常重要。

如何做...

要启动默认扫描,最起码需要一个目标。目标可以是 IP 地址、主机名或网络范围:


$nmap scanme.nmap.org

扫描结果将显示获得的所有主机信息,如 IPv4(和 IPv6,如果可用)地址、反向 DNS 名称和带有服务名称的有趣端口。所有列出的端口都有状态。标记为已打开的端口特别值得关注,因为它们代表目标主机上运行的服务:


Nmap scan report for scanme.nmap.org (45.33.32.156)

Host is up (0.16s latency).

Other addresses for scanme.nmap.org (not scanned):

2600:3c01::f03c:91ff:fe18:bb2f

Not shown: 995 closed ports

PORT STATE SERVICE

22/tcp open ssh

25/tcp filtered smtp

80/tcp open http

9929/tcp open nping-echo

31337/tcp open Elite

Nmap done: 1 IP address (1 host up) scanned in 333.35 seconds

工作原理...

基本默认 Nmap 扫描 nmap 执行简单的端口扫描,返回端口列表。此外,它还会从 Nmap 随附的数据库中返回服务名称,以及列出的每个端口的端口状态。

Nmap 将端口分为以下几种状态:

  • Open: 打开,表示服务正在此端口上监听连接。

  • Closed: 已关闭,表示已收到探测,但结论是此端口上没有服务在运行。

  • Filtered: 已过滤,表示没有收到探针的迹象,因此无法确定状态。它还表示探针被某种过滤掉了。

  • Unfiltered :未过滤,表示已收到探针,但无法建立状态。

  • Open/Filtered:开放/已过滤,表示端口已被过滤或打开,但无法建立状态。

  • Close/Filtered:关闭/已过滤,表示端口已被过滤或关闭,但无法建立状态。

即使是这种最简单的端口扫描,Nmap 也会在后台做许多可以配置的事情。Nmap 首先使用 DNS 名称解析将主机名转换为 IPv4 地址。如果希望使用不同的 DNS 服务器,请使用 --dns-servers <serv1[,serv2],...>,如果希望跳过这一步,请使用-n,如下所示:


$ nmap --dns-servers 8.8.8.8,8.8.4.4 scanme.nmap.org

然后,它会执行主机发现过程,检查主机是否存活(请参阅在网络中查找存活主机说明)。要跳过这一步,请按如下步骤使用 -Pn:


$ nmap -Pn scanme.nmap.org

然后,Nmap 使用反向 DNS 查询将 IPv4 或 IPv6 地址转换回主机名。使用 -n 跳过这一步,如下所示:


$ nmap -n scanme.nmap.org

最后,它会根据用户权限启动 SYN 隐身扫描或 TCP 连接扫描。

还有更多...

端口扫描是目前最强大的功能之一,我们必须了解影响扫描行为的不同技术和 Nmap 选项。

特权与非特权

默认情况下,以特权用户身份运行最简单的端口扫描命令 nmap 会启动 SYN 隐身扫描,而无法创建原始数据包的非特权用户则会使用 TCP 连接扫描技术。这两种技术的区别在于,TCP 连接扫描使用高级 connect() 系统调用来获取端口状态信息,这意味着每个 TCP 连接都是完全完成的,因此速度较慢。SYN 隐身扫描使用原始数据包发送特制的 TCP 数据包,通过一种称为半开放的技术检测端口状态。

扫描特定端口范围

在扫描过程中正确设置端口范围将非常方便。您可能要查找使用特定端口通信或特定服务的受感染机器,而不太关心其他端口。缩小端口列表还能优化性能,这在扫描多个目标时非常重要。

参数 -p 有几种可接受的格式:

  • 端口列表:

# nmap -p80,443 localhost

  • 指定端口范围:

# nmap -p1-100 localhost

  • 所有端口:

# nmap -p- localhost

  • 按协议划分的特定端口:

# nmap -pT:25,U:53 <target>

  • 服务名称:

# nmap -p smtp <target>

  • 服务名称模糊搜索:

# nmap -p smtp* <target>

  • 仅在 Nmap 服务中登记的端口:

# nmap -p[1-65535] <target>

选择网络接口(网卡)

Nmap 会尝试自动检测您的活动网络接口;然而,在某些情况下它会失败,或者我们需要选择不同的接口来测试网络问题。要强制 Nmap 使用不同的网络接口进行扫描,请使用参数 -e:


#nmap -e <interface> <target>

#nmap -e eth2 scanme.nmap.org

如果遇到警告信息:无法为系统路由找到合适的接口,则需要手动设置网络接口。

更多端口扫描技术

在本食谱中,我们介绍了 Nmap 使用的两种默认扫描方法: SYN 隐身扫描(SYN Stealth Scan)和 TCP 连接扫描(TCP Connect Scan)。然而,Nmap 支持更多的端口扫描技术。使用 nmap -h 或访问 https://nmap.org/book/man-port-scanning-techniques.html 了解更多。

5、操作系统和服务识别

版本检测和操作系统检测是 Nmap 最受欢迎的两个功能。Nmap 以拥有最全面的操作系统和服务指纹数据库而闻名。了解平台(操作系统)和服务的确切版本,对于查找安全漏洞或监控网络中任何未经授权的更改非常有价值。服务指纹还可以揭示目标的其他信息,如可用模块和特定协议信息。

本教程演示了如何使用 Nmap 对远程主机的操作系统和运行服务进行指纹识别。

如何做...

  1. 要启用服务检测,请在端口扫描命令中添加 Nmap 选项 -sV:

$ nmap -sV <target>

  1. 选项 -sV 会添加一个表格,其中包含一列名为 VERSION 的附加列,显示特定的服务版本(如果已识别)。附加信息将用括号括起来。

  2. 要启用操作系统检测,在扫描命令中添加 Nmap 选项 -O。请注意,操作系统检测要求 Nmap 以特权用户身份运行:

  3. 现在,结果将包括端口列表底部的操作系统信息:

工作原理...

Nmap 选项 -sV 可以进行服务检测,返回额外的服务和版本信息。服务检测是 Nmap 最受欢迎的功能之一,因为它在很多情况下都非常有用,例如识别安全漏洞、确保服务在指定端口上运行或补丁已成功打上。

该功能的工作原理是向可疑的开放端口列表发送在 nmap-service-probes 文件中定义的不同探测器。探针的选择基于它们用于识别服务的可能性。

如果你对其内部工作原理感兴趣,可以在 https://nmap.org/book/vscan.html 找到关于服务检测模式如何工作以及文件格式如何使用的详细文档。

-O选项告诉Nmap通过使用TCP、UDP和ICMP协议针对打开和关闭的端口发送多个探测器来尝试操作系统检测。操作系统检测模式非常强大,这要归功于 Nmap 的用户社区,他们义务地提供了识别各种系统的指纹,包括住宅路由器、IP 网络摄像头、操作系统和许多其他硬件设备。值得注意的是,操作系统检测需要原始数据包,因此运行 Nmap 时需要足够的权限。

操作系统检测期间发送的测试和探测的完整文档可在 https://nmap.org/book/osdetect-methods.html 上找到。

Nmap 使用通用平台枚举(CPE)作为服务和操作系统检测的命名方案。信息安全行业使用该约定来识别软件包、平台和系统。

还有更多...

操作系统和版本检测扫描选项可以全面配置,在调整性能时非常强大。让我们了解一些与这些扫描模式相关的 Nmap 选项。

增加版本检测强度

在版本检测过程中,可以通过以下方法增加或减少探针数量

使用参数 --version-intensity [0-9] 改变扫描强度、

如下所示:


# nmap -sV --version-intensity 9 <target>

这个 Nmap 选项对由于配置更改而运行在非默认端口上的服务非常有效。

由于配置更改而运行在非默认端口上的服务。

攻击性检测模式

Nmap 有一个特殊的标志来激活攻击性检测,即 -A。攻击模式 启用操作系统检测 (-O)、版本检测 (-sV)、脚本扫描 (-sC) 和跟踪路由 (-- traceroute)。该模式发送的探测器更多,被检测到的可能性也更大,但能提供大量有价值的主机信息。提供了大量有价值的主机信息。您可以使用 以下命令进行攻击性检测:


# nmap -A <target>

Nmap scan report for scanme.nmap.org (45.33.32.156)

Host is up (0.071s latency).

Other addresses for scanme.nmap.org (not scanned):

2600:3c01::f03c:91ff:fe18:bb2f

Not shown: 994 closed ports

PORT STATE SERVICE VERSION

22/tcp open ssh OpenSSH 6.6.1p1 Ubuntu 2ubuntu2.3

(Ubuntu Linux; protocol 2.0)

| ssh-hostkey:

| 1024 ac:00:a0:1a:82:ff:cc:55:99:dc:67:2b:34:97:6b:75 (DSA)

| 2048 20:3d:2d:44:62:2a:b0:5a:9d:b5:b3:05:14:c2:a6:b2 (RSA)

|_ 256 96:02:bb:5e:57:54:1c:4e:45:2f:56:4c:4a:24:b2:57 (ECDSA)

25/tcp filtered smtp

80/tcp open http Apache httpd 2.4.7 ((Ubuntu))

|_http-server-header: Apache/2.4.7 (Ubuntu)

|_http-title: Go ahead and ScanMe!

514/tcp filtered shell

9929/tcp open nping-echo Nping echo

31337/tcp open tcpwrapped

Device type: WAP|general purpose|storage-misc

Running (JUST GUESSING): Actiontec embedded (98%), Linux 2.4.X|3.X

(98%), Microsoft Windows 7|2012|XP (96%), BlueArc embedded (91%)

OS CPE: cpe:/h:actiontec:mi424wr-gen3i cpe:/o:linux:linux_kernel

cpe:/o:linux:linux_kernel:2.4.37 cpe:/o:linux:linux_kernel:3.2

cpe:/o:microsoft:windows_7 cpe:/o:microsoft:windows_server_2012

cpe:/o:microsoft:windows_xp::sp3 cpe:/h:bluearc:titan_2100

Aggressive OS guesses: Actiontec MI424WR-GEN3I WAP (98%), DD-WRT

v24-sp2 (Linux 2.4.37) (98%), Linux 3.2 (98%), Microsoft Windows 7

or Windows Server 2012 (96%), Microsoft Windows XP SP3 (96%),

BlueArc Titan 2100 NAS device (91%)

No exact OS matches for host (test conditions non-ideal).

Network Distance: 2 hops

Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

TRACEROUTE (using port 80/tcp)

HOP RTT ADDRESS

1 0.08 ms 192.168.254.2

2 0.03 ms scanme.nmap.org (45.33.32.156)

OS and Service detection performed. Please report any incorrect

results at https://nmap.org/submit/ .

Nmap done: 1 IP address (1 host up) scanned in 208.05 seconds

配置操作系统检测

如果操作系统检测失败,可以使用参数 --osscan-guess 强迫 Nmap 猜测操作系统。

猜测操作系统:


#nmap -O --osscan-guess <target>

要只在扫描条件理想时启动操作系统检测,请使用参数 --osscan-limit :


#nmap -O --osscan-limit <target>

在 "详细 "模式下进行操作系统检测

尝试在 "冗长 "模式下进行操作系统检测,以查看更多主机信息,如 TCP 和 IP ID 序列号值:


#nmap -O -v <target>

IP ID 序列号可在 IP ID 序列生成标签下找到。请注意,增量 IP ID 序列号可能会被端口扫描技术(如空闲扫描)滥用:


#nmap -O -v 192.168.0.1

Initiating Ping Scan at 11:14

Scanning 192.168.0.1 [4 ports]

Completed Ping Scan at 11:14, 0.00s elapsed (1 total hosts)

Initiating Parallel DNS resolution of 1 host. at 11:14

Completed Parallel DNS resolution of 1 host. at 11:14, 0.02s elapsed

Initiating SYN Stealth Scan at 11:14

Scanning 192.168.0.1 [1000 ports]

Discovered open port 80/tcp on 192.168.0.1

Completed SYN Stealth Scan at 11:14, 13.80s elapsed (1000 total ports)

Initiating OS detection (try #1) against 192.168.0.1

Retrying OS detection (try #2) against 192.168.0.1

Nmap scan report for 192.168.0.1

Host is up (0.11s latency).

Not shown: 998 closed ports

PORT STATE SERVICE

80/tcp open http

514/tcp filtered shell

Device type: WAP|general purpose|storage-misc

Running (JUST GUESSING): Actiontec embedded (99%), Linux 2.4.X|3.X

(99%), Microsoft Windows 7|2012|XP (96%), BlueArc embedded (91%)

OS CPE: cpe:/h:actiontec:mi424wr-gen3i cpe:/o:linux:linux_kernel

cpe:/o:linux:linux_kernel:2.4.37 cpe:/o:linux:linux_kernel:3.2

cpe:/o:microsoft:windows_7 cpe:/o:microsoft:windows_server_2012

cpe:/o:microsoft:windows_xp::sp3 cpe:/h:bluearc:titan_2100

Aggressive OS guesses: Actiontec MI424WR-GEN3I WAP (99%), DD-WRT

v24-sp2 (Linux 2.4.37) (98%), Linux 3.2 (97%),

Microsoft Windows 7 or Windows Server 2012 (96%), Microsoft

Windows XP SP3 (96%),

BlueArc Titan 2100 NAS device (91%)

No exact OS matches for host (test conditions non-ideal).

TCP Sequence Prediction: Difficulty=259 (Good luck!)

IP ID Sequence Generation: Incremental

Read data files from: /usr/local/bin/../share/nmap

OS detection performed. Please report any incorrect results at

https://nmap.org/submit/ .

Nmap done: 1 IP address (1 host up) scanned in 32.40 seconds

Raw packets sent: 1281 (59.676KB) | Rcvd: 1249 (50.520KB)

提交新的操作系统和服务指纹

Nmap 的准确性来自多年来通过用户提交收集的数据库。我们帮助更新这个数据库是非常重要的。Nmap 会通知您何时可以提交未识别的操作系统、设备或服务,为项目做出贡献。

请花时间提交您的贡献,因为Nmap的检测能力直接来自数据库。请访问 https://nmap.org/cgi-bin/submit.cgi? 提交新指纹或更正。

6、针对目标主机使用 NSE 脚本

Nmap项目引入了一个名为Nmap脚本引擎(Nmap Scripting Engine)的功能,允许用户通过Lua脚本扩展Nmap的功能。NSE 脚本非常强大,已经成为 Nmap 的主要优势之一,可以执行从高级版本检测到漏洞利用等任务。脚本种类繁多(超过 500 种),可帮助用户使用从扫描中获得的目标信息执行各种任务。

下面的配方介绍了如何运行 NSE 脚本,以及配置其执行的不同选项。

如何做...

使用 Nmap 选项 -sC 启用脚本扫描。该模式将选择属于默认类别的所有 NSE 脚本,并针对我们的目标执行这些脚本:


$nmap -sC <target>

$nmap -sC scanme.nmap.org

Nmap scan report for scanme.nmap.org (45.33.32.156)

Host is up (0.14s latency).

Other addresses for scanme.nmap.org (not scanned):

2600:3c01::f03c:91ff:fe18:bb2f

Not shown: 995 closed ports

PORT STATE SERVICE

22/tcp open ssh

| ssh-hostkey:

| 1024 ac:00:a0:1a:82:ff:cc:55:99:dc:67:2b:34:97:6b:75 (DSA)

| 2048 20:3d:2d:44:62:2a:b0:5a:9d:b5:b3:05:14:c2:a6:b2 (RSA)

|_ 256 96:02:bb:5e:57:54:1c:4e:45:2f:56:4c:4a:24:b2:57 (ECDSA)

25/tcp filtered smtp

80/tcp open http

|_http-title: Go ahead and ScanMe!

9929/tcp open nping-echo

31337/tcp open Elite

Nmap done: 1 IP address (1 host up) scanned in 24.42 seconds

在这种情况下,结果包括 ssh-hostkey 和 http-title 脚本的输出。

执行的脚本数量取决于脚本的主机或端口规则。

工作原理...

工作原理...

Nmap 选项 -sC 启用脚本扫描模式,它告诉 Nmap 选择默认脚本并在主机或端口规则匹配时执行它们。

NSE 脚本分为以下几类:

  • auth:该类别用于与用户身份验证相关的脚本

  • broadcast:广播: 这是一类非常有趣的脚本,使用广播请求来收集信息

  • brute:蛮横: 该类别用于帮助进行暴力破解密码审计的脚本

  • default:默认: 这一类脚本在执行脚本扫描(-sC)时被执行

  • discovery: 该类别用于与主机和服务发现相关的脚本。

  • dos: 该类别用于与拒绝服务攻击相关的脚本

  • exploit: 此类脚本用于利用安全漏洞

  • external:外部: 此类脚本用于依赖第三方服务的脚本

  • fuzzer:模糊器: 此类脚本用于侧重于模糊处理的 NSE 脚本

  • intrusive:侵入性: 此类脚本可能会导致某些程序崩溃或产生大量网络噪声;系统管理员可能认为具有侵入性的脚本属于此类脚本

  • malware:恶意软件: 此类别用于与恶意软件检测相关的脚本

  • safe:安全: 此类脚本在任何情况下都是安全的

  • version:版本: 该类别包含用于高级版本控制的脚本

  • vuln: 此类别用于与安全漏洞相关的脚本

还有更多...

让我们了解一些自定义 Nmap 脚本引擎所需的 Nmap 选项。有些脚本需要正确配置,因此熟悉所有 Nmap 脚本引擎选项非常重要。

NSE 脚本参数

--script-args 标志用于设置 NSE 脚本的参数。例如,如果要设置 useragent HTTP 库参数,可以使用下面的命令:


$ nmap --script http-title --script-args http.useragent="Mozilla 999"

<target>

为 NSE 脚本设置参数时也可以使用别名。例如,您有以下代码:


$ nmap -p80 --script http-trace --script-args path <target>

您可以使用下面的代码来代替前面的代码:


$ nmap -p80 --script http-trace --script-args http-trace.path <target>

脚本选择

用户可以在扫描时使用 Nmap 选项 --script <filename or path/folder/category/expression> 选择特定脚本:


$nmap --script <filename or path/folder/category/expression> <target>

例如,运行 NSE 脚本 dns-brute 的命令如下:


$nmap --script dns-brute <target>

Nmap 脚本引擎还支持同时执行多个脚本:


$ nmap --script http-headers,http-title scanme.nmap.org

Nmap scan report for scanme.nmap.org (74.207.244.221)

Host is up (0.096s latency).

Not shown: 995 closed ports

PORT STATE SERVICE

22/tcp open ssh

25/tcp filtered smtp

80/tcp open http

| http-headers:

| Date: Mon, 24 Oct 2011 07:12:09 GMT

| Server: Apache/2.2.14 (Ubuntu)

| Accept-Ranges: bytes

| Vary: Accept-Encoding

| Connection: close

| Content-Type: text/html

|

|_ (Request type: HEAD)

|_http-title: Go ahead and ScanMe!

646/tcp filtered ldp

9929/tcp open nping-echo

此外,还可按类别、表达式或文件夹选择 NSE 脚本:

  • 运行 vuln 类别中的所有脚本:

$ nmap -sV --script vuln <target>

  • 在服务版本探测时,运行version、discovery脚本:

$ nmap -sV --script="version,discovery" <target>

  • 运行所有脚本,但漏洞利用类脚本除外:

$ nmap -sV --script "not exploit" <target>

  • 运行除 http-brute 和 http-slowloris 以外的所有 HTTP 脚本:

$ nmap -sV --script "(http-*) and not(http-slowloris or http-brute)" <target>

如上例所示,表达式允许对脚本进行精细选择,因此非常方便。

调试 NSE 脚本

要调试 NSE 脚本,请使用 --script-trace。这将启用已执行脚本的堆栈跟踪,以帮助您调试脚本的执行。请记住,有时您可能需要使用 -d[1-9] 标志来提高调试级别,以找出问题的根源:


$ nmap -sC --script-trace <target>

$ nmap --script http-headers --script-trace scanme.nmap.org

NSOCK INFO [18.7370s] nsock_trace_handler_callback(): Callback:

CONNECT SUCCESS for EID 8 [45.33.32.156:80]

NSE: TCP 192.168.0.5:47478 > 45.33.32.156:80 | CONNECT

NSE: TCP 192.168.0.5:47478 > 45.33.32.156:80 | 00000000:

48 45 41 44 20 2f 20 48 54 54 50 2f 31 2e 31 0d HEAD / HTTP/1.1

00000010: 0a 43 6f 6e 6e 65 63 74 69 6f 6e 3a 20 63 6c 6f

Connection: clo

00000020: 73 65 0d 0a 55 73 65 72 2d 41 67 65 6e 74 3a 20 se

User- Agent:

00000030: 4d 6f 7a 69 6c 6c 61 2f 35 2e 30 20 28 63 6f 6d

Mozilla/5.0 (com

00000040: 70 61 74 69 62 6c 65 3b 20 4e 6d 61 70 20 53 63 patible;

Nmap Sc

00000050: 72 69 70 74 69 6e 67 20 45 6e 67 69 6e 65 3b 20 ripting

Engine;

00000060: 68 74 74 70 73 3a 2f 2f 6e 6d 61 70 2e 6f 72 67

https://nmap.org

00000070: 2f 62 6f 6f 6b 2f 6e 73 65 2e 68 74 6d 6c 29 0d

/book/nse.html)

00000080: 0a 48 6f 73 74 3a 20 73 63 61 6e 6d 65 2e 6e 6d Host:

scanme.nm

00000090: 61 70 2e 6f 72 67 0d 0a 0d 0a ap.org

[Output removed to save space]Nmap scan report for scanme.nmap.org

(45.33.32.156)

Host is up (0.14s latency).

Other addresses for scanme.nmap.org (not scanned):

2600:3c01::f03c:91ff:fe18:bb2f

Not shown: 995 closed ports

PORT STATE SERVICE

22/tcp open ssh

25/tcp filtered smtp

80/tcp open http

| http-headers:

| Date: Sun, 24 Apr 2016 19:52:13 GMT

| Server: Apache/2.4.7 (Ubuntu)

| Accept-Ranges: bytes

| Vary: Accept-Encoding

| Connection: close

| Content-Type: text/html

|

|_ (Request type: HEAD)

9929/tcp open nping-echo

31337/tcp open Elite

Nmap done: 1 IP address (1 host up) scanned in 18.89 seconds

添加新脚本

在某些情况下,您会想试试 Nmap 官方没有包含的脚本。要测试新脚本,只需将它们复制到 Nmap 目录内的 /scripts 中,然后运行以下命令更新脚本数据库:


# nmap --script-updatedb

更新脚本数据库后,只需像使用 --script 选项一样选择它们即可。此外,你还可以通过设置相对或绝对脚本路径作为参数,在不将脚本纳入数据库的情况下执行脚本:


# nmap --script /root/loot/nonofficial.nse <target>

https://secwiki.org/w/Nmap/External_Script_Library Wiki 页面试图跟踪所有由于各种原因无法正式包含在 Nmap 中的脚本。我建议您访问该页面,因为里面有一些很棒的脚本。

7、批量扫描目标

很多时候,我们需要处理多个目标,但在命令行中键入目标列表不太现实。幸运的是,Nmap 支持从外部文件加载目标。

本食谱演示如何在 Nmap 中扫描从外部文件加载的目标。

如何做...

将目标列表输入文件,每个目标用新行、制表符或空格隔开:


$cat targets.txt

192.168.1.23

192.168.1.12

要从 targets.txt 文件加载目标,请使用 Nmap 选项 -iL <文件名>:


$ nmap -iL targets.txt

除了通过 --exclude 或 --exclude-file 设置的排除规则外,该功能可与任何扫描选项或方法结合使用。使用 -iL 时,--exclude 和 --exclude-file 选项标志将被忽略。

工作原理...

Nmap 选项 -iL 告诉 Nmap 从 文件加载目标。Nmap 支持多种格式的输入文件。输入文件中包含的目标列表可以用空格、制表符或换行符分隔。任何排除项都应反映在输入目标文件中。

还有更多...

您也可以在同一文件中使用不同的目标格式。在下面的文件中,我们指定了一个 IP 地址和一个 IP 范围:


$ cat targets.txt

192.168.1.1

192.168.1.20-30

您可以使用字符 # 在目标列表中输入注释:


$ cat targets.txt

# FTP servers

192.168.10.3

192.168.10.7

192.168.10.11

从扫描中排除主机列表

Nmap 也支持参数 --exclude-file 来排除 中列出的目标:


$ nmap --exclude-file dontscan.txt 192.168.1.1/24

8、网段扫描

很多时候,渗透测试人员和系统管理员需要扫描的不是一台机器,而是一系列主机。Nmap 支持不同格式的 IP 地址范围,我们必须知道如何处理它们。

本食谱解释如何在使用 Nmap 扫描时处理 IP 地址范围。

如何做...

  1. 打开终端,输入以下命令

$ nmap <IP address range>

  1. 例如,要扫描 192.168.1.0 至 192.168.1.255,请使用以下命令:

$ nmap 192.168.1.0-255

  1. 或者,您也可以使用以下任何一种符号:

$ nmap 192.168.*

$ nmap 192.168.0/24

$ nmap 192.168.1.0 192.168.1.1 192.168.1.2 ... 192.168.1.254 192.168.1.255

工作原理...

Nmap 支持多种目标格式,允许用户处理 IP 地址范围。最常见的格式是指定目标的 IP 或主机,但它也支持从文件、范围读取目标,甚至可以生成随机目标列表。

任何不是有效选项的参数都会被 Nmap 作为目标读取。这意味着我们可以告诉 Nmap 在一条命令中扫描多个范围,如下面的命令所示:


# nmap -p25,80 -O -T4 192.168.1.1/24 scanme.nmap.org/24

在 Nmap 中,有几种方法可以处理 IP 范围:

  • 多主机规范

  • 八进制范围寻址(也支持通配符)

  • CIDR 符号

要扫描 IP 地址 192.168.1.1、192.168.1.2 和 192.168.1.3,可以使用以下命令:


$ nmap 192.168.1.1 192.168.1.2 192.168.1.3

我们还可以使用"-"来指定八位位组范围。例如,要扫描主机 192.168.1.1、192.168.1.2 和 192.168.1.3,我们可以使用表达式 192.168.1.1-3,如以下命令所示:


$ nmap 192.168.1.1-3

Octect 范围符号还支持通配符,因此我们可以使用表达式 192.168.1.* 从 192.168.1.0 扫描到 192.168.1.255:


$ nmap 192.168.1.*

在指定目标时,也可以使用 CIDR 符号。CIDR 符号由一个 IP 地址和一个后缀组成。最常用的网络后缀是 /8、/16、/24 和 /32。要使用 CIDR 符号扫描 192.168.1.0-255 中的 256 台主机,可使用以下命令:


$ nmap 192.168.1.0/24

还有更多...

此外,如图所示,还可以通过指定 --exclude 排除选项参数,将主机排除在范围之外:


$ nmap 192.168.1.1-255 --exclude 192.168.1.1

$ nmap 192.168.1.1-255 --exclude 192.168.1.1,192.168.1.2

否则,你可以将排除列表写入文件,然后用--exclude-file 读取:


$ cat dontscan.txt

192.168.1.1

192.168.1.254

$ nmap --exclude-file dontscan.txt 192.168.1.1-255

CIDR 符号

无类域间路由(CIDR)符号(发音为 cider)是一种用于指定 IP 地址及其路由后缀的紧凑方法。与有类寻址相比,CIDR 的粒度更细,允许使用长度可变的子网掩码,因此受到广泛欢迎。

CIDR 符号由 IP 地址和网络后缀指定。网络或 IP 后缀代表网络位数。IPv4 地址为 32 位,因此网络位数可以是 0 到 32。最常见的后缀是 /8、/16、/24 和 /32。

为直观起见,请看下面的 CIDR 到网络掩码转换表:

| CIDR | Netmask |

| ---- | --------------- |

| /8 | 255.0.0.0 |

| /16 | 255.255.0.0 |

| /24 | 255.255.255.0 |

| /32 | 255.255.255.255 |

例如,192.168.1.0/24 表示从 192.168.1.0 到 192.168.1.255 之间的 256 个 IP 地址。而 50.116.1.121/8 则代表 50.0-255.0-255.0-255 之间的所有 IP 地址。网络后缀 /32 也有效,代表单个 IP。

9、扫描互联网上的随机目标

Nmap 支持一个非常有趣的功能,允许我们对互联网上的随机目标运行扫描。虽然不建议(可能也不合法)盲目地进行攻击性扫描,但这在进行需要随机主机样本的研究时非常有用。

本食谱向您展示如何生成随机主机作为 Nmap 扫描的目标。

如何做...

  1. 要随机生成包含 n 台主机的目标列表,请使用以下 Nmap 命令:

$ nmap -iR <n>

  1. 例如,要生成一个包含 100 个目标的列表,我们可以使用以下命令:

$ nmap -iR 100

  1. 现在,让我们检查一下 ICMP 在远程服务器中的常见程度。让我们对三个随机目标进行 ping 扫描:

$ nmap -sn -iR 3

Nmap scan report for host86-190-227-45.wlms-broadband.com

(86.190.227.45)

Host is up (0.000072s latency).

Nmap scan report for 126.182.245.207

Host is up (0.00023s latency).

Nmap scan report for 158.sub-75-225-31.myvzw.com (75.225.31.158)

Host is up (0.00017s latency).

Nmap done: 3 IP addresses (3 hosts up) scanned in 0.78 seconds

工作原理...

参数 -iR 100 命令 Nmap 生成 100 个外部 IP 地址,并在指定扫描中将其用作目标。目标分配可以与任何扫描标志组合使用。

虽然这是一个进行互联网研究的有用功能,但我建议您小心使用这个标志。Nmap 无法控制其生成的外部 IP 地址;这意味着在生成的列表中可能存在被严密监控的重要机器。为了避免麻烦,请明智使用此功能。

还有更多...

要让 Nmap 生成无限数量的 IP 并无限期运行,可使用以下命令将参数 -iR 设置为 0:


$ nmap -iR 0

例如,要查找在线随机 NFS 共享,可以使用以下命令:


$ nmap -p2049 --open -iR 0

端口扫描的法律问题

未经许可进行端口扫描是不受欢迎的,在某些国家甚至是非法的。我建议您研究一下当地的法律,了解您可以做什么,以及端口扫描在您的国家是否受到禁止。您还需要咨询您的 ISP,因为他们可能有自己的相关规定。

Nmap 的官方文档有一篇关于端口扫描所涉及的法律问题的精彩文章,请访问 https://nmap.org/book/legal-issues.html。我建议每个考虑进行全网研究扫描的人都读一读。

10、收集网络服务器的签名

Nmap 是一个令人惊叹的信息收集工具,使用 Nmap 脚本引擎可以完成的任务种类繁多,令人叹为观止。广受欢迎的服务 ShodanHQ (https://www.shodan.io/) 提供了一个 HTTP 横幅数据库,可用于分析漏洞的影响。用户可以通过服务横幅了解各国在线设备的数量。ShodanHQ 使用自己内置的房屋工具来收集数据,但 Nmap 也能轻松完成这项任务。

在下面的配方中,我们将看到如何使用 Nmap 无限期扫描网络服务器并收集它们的 HTTP 头信息。

如何做...

打开终端,输入以下命令


$ nmap -p80,443 -Pn -T4 --open --script http-headers,http-title,ssl-cert -- script-args http.useragent="A friendly web crawler (http://calderonpale.com)",http-headers.useget -oX random-webservers.xml - iR 0

该命令将启动一个 Nmap 实例,该实例将无限期运行,查找 80 和 443 端口的网络服务器,然后将输出保存到 random-webservers.xml 中。每台打开 80 或 443 端口的主机都会返回类似下面的内容:


Nmap scan report for XXXX

Host is up (0.23s latency).

PORT STATE SERVICE

80/tcp open http

|_http-title: Protected Object

| http-headers:

| WWW-Authenticate: Basic realm="TD-8840T"

| Content-Type: text/html

| Transfer-Encoding: chunked

| Server: RomPager/4.07 UPnP/1.0

| Connection: close

| EXT:

|

|_ (Request type: GET)

工作原理...

下面的命令将告诉 Nmap 只检查端口 80 或 443 (-p80,443),不 ping (-Pn),并使用激进定时模板 (-T4)。如果端口 80 或 443 打开,Nmap 将运行 NSE 脚本 http-title、http-headers 和 ssl-cert(--sscript http-headers,http-title,ssl-cert)来收集服务器头和网络服务器标题;如果检测到 HTTPS,我们还将从 SSL 证书(如果有)中提取信息:


$nmap -p80 -Pn -T4 --open --script http-headers,http-title --script-args http.useragent="A friendly web crawler (http://calderonpale.com)",http-headers.useget -oX random-webservers.xml - iR 0

传递的脚本参数用于在请求中设置 HTTP 用户代理(--script-args http.useragent="A friendly web crawler (http://calderonpale.com)"),并使用 GET 请求检索 HTTP 头信息(--script-args http-headers.useget)。

最后,参数 -iR 0 可以让 Nmap 无限制地生成外部 IP 地址,并将结果保存在 XML 格式的文件中(-oX random-webservers.xml)。

还有更多...

Nmap 的 HTTP 库支持缓存,但如果您计划扫描许多主机,就需要考虑缓存文件。缓存存储在一个临时文件中,随着每个新请求的增加而增加。如果该文件开始变得过大,缓存查找就会耗费大量时间。

你可以通过设置 http-max-cache-size=0 库参数来禁用 HTTP 库的缓存系统,如下命令所示:


$ nmap -p80 --script http-headers --script-args http-max-cache-size=0 -iR 0

HTTP NSE 库具有高度可配置性。阅读附录 A《HTTP、HTTP 管道和网络爬行配置选项》,了解更多可用高级选项。

11、使用 Nmap 和 Ndiff 远程监控服务器

使用 Nmap 项目中的工具,我们可以建立一个简单但功能强大的监控系统。因为我们的监控系统依赖于 Nmap,所以我们可以监控 Nmap 可以收集到的任何信息。要检测网络上的变化,我们需要比较两次扫描的结果:基本状态或已知良好状态和最后一次扫描的结果。现在是介绍 Ndiff 的最佳时机。

Ndiff 的设计目的是解决使用传统 diff 命令和两个 XML 扫描结果时出现的问题。它通过消除误报和生成更可读的输出来比较文件,非常适合需要跟踪扫描结果的人。

本食谱介绍了如何使用 bash 脚本、cron、Nmap 和 Ndiff 来建立一个监控系统,在检测到网络中的更改时通过电子邮件向用户发出警报。

准备就绪

在本食谱中,我们假定系统已配置为通过 mail 命令发送邮件。如果你想更改通知方式,只需更新 bash 脚本即可。你可以使用 curl 将数据 POST 到你最喜欢的社交网络,或者运行一个脚本来重启服务。可能性是无限的。

如何做...

要使用 Nmap 建立一个简单的监控系统,我们需要做几件事:

创建目录 /usr/local/share/nmap-mon/(或任何您喜欢的位置),以存储监控系统所需的所有文件。

  1. 扫描目标,并将结果以 XML 格式保存在刚创建的目录中:

# nmap -oX base_results.xml -sV -Pn <target>

生成的 base_results.xml 文件将用作您的基础文件,这意味着它应反映已知的良好版本和端口。

  1. 在先前创建的目录中创建 nmap-mon.sh 文件,并粘贴以下代码:

#!/bin/bash

#Bash script to email admin when changes are detected in a network

using Nmap and Ndiff.

#

#Don't forget to adjust the CONFIGURATION variables.

#Paulino Calderon <calderon@websec.mx>

#

#CONFIGURATION

#

NETWORK="YOURTARGET"

ADMIN=YOUR@EMAIL.COM

NMAP_FLAGS="-n -sV -Pn -p- -T4"

BASE_PATH=/usr/local/share/nmap-mon/

BIN_PATH=/usr/local/bin/

BASE_FILE=base.xml

NDIFF_FILE=ndiff.log

NEW_RESULTS_FILE=newscanresults.xml

BASE_RESULTS="$BASE_PATH$BASE_FILE"

NEW_RESULTS="$BASE_PATH$NEW_RESULTS_FILE"

NDIFF_RESULTS="$BASE_PATH$NDIFF_FILE"

if [ -f $BASE_RESULTS ]

then

echo "Checking host $NETWORK"

${BIN_PATH}nmap -oX $NEW_RESULTS $NMAP_FLAGS $NETWORK

${BIN_PATH}ndiff $BASE_RESULTS $NEW_RESULTS > $NDIFF_RESULTS

if [ $(cat $NDIFF_RESULTS | wc -l) -gt 0 ]

then

echo "Network changes detected in $NETWORK"

cat $NDIFF_RESULTS

echo "Alerting admin $ADMIN"

mail -s "Network changes detected in $NETWORK" $ADMIN <

$NDIFF_RESULTS

fi

fi

  1. 根据系统情况更新配置值:

NETWORK="YOURTARGET"

ADMIN=YOUR@EMAIL.COM

NMAP_FLAGS="-sV -Pn -p- -T4"

BASE_PATH=/usr/local/share/nmap-mon/

BIN_PATH=/usr/local/bin/

BASE_FILE=base.xml

NDIFF_FILE=ndiff.log

NEW_RESULTS_FILE=newscanresults.xml

  1. 输入以下命令使 nmap-mon.sh 可执行:

# chmod +x /usr/local/share/nmap-mon/nmap-mon.sh

  1. 现在运行 nmap-mon.sh 脚本,确保其正常运行。

# /usr/local/share/nmap-mon/nmap-mon.sh

  1. 启动 crontab 编辑器,定期自动执行脚本:

# crontab -e

  1. 添加以下定时任务

0 /usr/local/share/nmap-mon/nmap-mon.sh

现在,当 Ndiff 检测到您的网络发生变化时,您应该会收到电子邮件警报。

工作原理...

Ndiff 是一个比较两个 Nmap 扫描的工具。想想传统的 diff,但却是 Nmap 扫描报告的 diff。在 bash 和 cron 的帮助下,我们设置了一个定期执行的任务,扫描我们的网络,比较当前状态和旧状态,找出它们之间的差异。我们使用一些基本的 bash 脚本来执行监控扫描,然后执行 Ndiff 来比较结果:


if [ $(cat $NDIFF_RESULTS | wc -l) -gt 0 ]

then

echo "Network changes detected in $NETWORK"

cat $NDIFF_RESULTS

echo "Alerting admin $ADMIN"

mail -s "Network changes detected in $NETWORK" $ADMIN < $NDIFF_RESULTS

fi

还有更多...

您可以通过修改 cron 行来调整扫描的间隔时间:


0 /usr/local/share/nmap-mon/nmap-mon.sh

要更新基础文件,只需覆盖位于 /usr/local/share/nmap-mon/ 的基础文件即可。请记住,当我们更改扫描参数以创建基础文件时,也需要在 nmap-mon.sh 中更新这些参数。

监控特定服务

要监控某些特定服务,需要更新 nmap-mon.sh 中的扫描参数:


NMAP_FLAGS="-sV -Pn"

例如,如果要监控网络服务器,可以使用以下参数:


NMAP_FLAGS="-sV --script http-google-safe -Pn -p80,443"

这些参数设置端口扫描只扫描 80 和 443 端口,此外,这些参数还包括 http-google-safe 脚本,用于检查网络服务器是否已被 Google 安全浏览服务标记为恶意。

12、利用 Nping 制作和传输自定义 ICMP 包

Nping 是一款旨在简化制作网络数据包过程的实用程序。它在调试和排除网络通信故障以及执行流量分析时非常有用。

本食谱将介绍 Nping,并介绍制作和传输自定义 ICMP 数据包的过程。

如何做...

假设我们想使用 Nping 以 echo reply 回应 ICMP echo 请求包。第一个 ICMP echo 请求数据包的源 IP 是 192.168.0.10,ICMP ID 是 520,数据字符串是单词 ping。有了这些信息,我们就可以用下面的命令来编写回复了:


#nping --icmp -c 1 --icmp-type 0 --icmp-code 0 --source-ip192.168.0.5 -- dest-ip 192.168.0.10 --icmp-id 520 --icmp-seq 0--data-string 'ping'

在输出中,您将看到已发送的 ICMP echo 回复数据包,其中包含从 ICMP echo 请求数据包中提取的值:


SENT (0.0060s) ICMP [192.168.0.5 > 192.168.0.10 Echo reply

(type=0/code=0) id=520 seq=0] IP [ttl=64 id=10898 iplen=32 ]

Max rtt: N/A | Min rtt: N/A | Avg rtt: N/A

Raw packets sent: 1 (32B) | Rcvd: 0 (0B) | Lost: 1 (100.00%)

Nping done: 1 IP address pinged in 1.01 seconds

工作原理...

Nping 允许轻松配置 TCP、UDP、ARP 和 ICMP 数据包中大多数字段的值。以下命令将使用从 ICMP echo 请求数据包中获取的值发送 ICMP echo 回复数据包:


#nping --icmp -c 1 --icmp-type 0 --icmp-code 0 --source-ip192.168.0.5 -- dest-ip 192.168.0.10 --icmp-id 520 --icmp-seq 0 --data-string 'ping'

让我们根据参数对其进行细分:

  • --icmp: 将 ICMP 设置为要使用的协议。

  • --c 1: 数据包计数。只发送一个数据包。

  • --icmp-type 0 --icmp-code 0:设置 ICMP 类型和代码。该类型对应于 echo 回复信息。

  • --source-ip 192.168.0.5 --dest-ip 192.168.0.10: 设置源 IP 地址和目标 IP 地址。

  • --icmp-id 520: 设置请求数据包的 ICMP 标识符

  • --icmp-seq 0: 此项设置 ICMP 序列号。

  • --data-string 'ping': 设置数据字符串。

还有更多...

Nping 可以通过参数设置 TCP、UDP、ARP 和 ICMP 数据包中的大部分字段,但提供的自定义功能比我们提供的要多得多。除了有趣的定时和性能选项外,Nping 还支持名为 echo 的模式,在排除防火墙或路由问题时非常方便。我强烈建议你浏览 https://nmap.org/nping/ 上的文档,熟悉这个强大的工具,并了解它在哪些情况下可以派上用场。

13、使用 Zenmap 管理多个扫描配置文件

扫描配置文件是 Nmap 选项和参数的组合,可以用来节省启动 Nmap 扫描的时间。

本食谱是关于在 Zenmap 中添加、编辑和删除扫描配置文件。

如何操作...

让我们添加一个用于扫描 Web 服务器的新配置文件:

  1. 启动 Zenmap。

  2. 点击主工具栏上的配置文件。

  3. 点击新建配置文件或命令(Ctrl + P)。将启动 "配置文件编辑器"。

  4. 在 "配置文件 "选项卡上输入配置文件名称和描述。

  5. 启用版本检测,并在扫描选项卡中选择 TCP 连接扫描 (-sT)。

  6. 在 Ping 选项卡中启用扫描前不 ping (-Pn)。

  7. 在 "脚本 "选项卡中启用以下脚本:

  • hostmap-ip2hosts

  • http-apache-negotiation

  • http-apache-server

  • http-auth-finder

  • http-backup-finder

  • http-config-backup

  • http-cors

  • 跨域策略

  • http-csrf

  • 默认帐户

  • http-devframework

  • http-dombased-xss

  • http-enum

  • http-exif-spider

  • http-favicon

  • http-git

  • http-iis-short-name-brute

  • http-iis-short-name-brute

  • http 方法

  • http-mobileversion-checker

  • http-ntlm-info

  • http-open-proxy

  • http-open-redirect

  • http-trace

  • http-php-version

  • http-php-version

  • http-robots.txt

  • http-server-header

  • http-shellshock

  • http-svn-info

  • http-title

  1. 然后,转到 "目标 "选项卡,点击 "要扫描的端口"(-p)并输入 80、443。

  2. 单击 "保存更改 "保存更改:

1697079592013

您的新扫描配置文件应该可以在 "配置文件 "下拉菜单中找到。

工作原理...

使用编辑器创建配置文件后,我们将得到以下 Nmap 命令:


$ nmap -sT -sV -p 80,443 -T4 -v -Pn --script hostmap-ip2hosts,http-apache-negotiation,http-apache-server-status,http-auth-finder,http-backup-finder,http-config-backup,http-cors,http-cross-domain-policy,http-csrf,http-default-accounts,http-devframework,http-dombased-xss,http-exif-spider,http-git,http-headers,http-iis-short-name-brute,http-methods,http-ntlm-info,http-open-proxy,http-open-redirect,http-phpself-xss,http-robots.txt,http-server-header,http-shellshock,http-svn-info,http-title,http-waf-detect <target>

使用配置文件向导,我们启用了服务扫描 (-sV),将扫描端口设置为 80 和 443,配置了 ping 选项 (-Pn),并选择了大量与 HTTP 相关的脚本,以便从该网络服务器收集尽可能多的信息。我们现在保存了这条命令,以便将来对新目标进行扫描。

还有更多...

可通过用户界面自定义扫描配置文件。创建新的扫描配置文件时,可以使用默认扫描配置文件作为模板。让我们回顾一下如何使用扫描配置文件。

Zenmap 扫描配置文件

预定义的 Zenmap 扫描配置文件可以帮助新手熟悉 Nmap。我建议您分析这些配置文件,以了解 Nmap 可用的扫描技术,以及一些有用的选项组合:

  • 密集扫描:nmap -T4 -A -v

  • 密集扫描加 UDP:nmap -sS -sU -T4 -A -v

  • 密集扫描,所有 TCP 端口:nmap -p 1-65535 -T4 -A -v

  • 密集扫描,无 ping: nmap -T4 -A -v -Pn

  • Ping 扫描:nmap -sn

  • 快速扫描: nmap -T4 -F

  • 快速扫描加: nmap -sV -T4 -O -F -version-light

  • 快速跟踪路由: nmap -sn -traceroute

  • 常规扫描: nmap

  • 慢速全面扫描: nmap -sS -sU -T4 -A -v -PE -PP -PS80,443 - PA3389 -PU40125 -PY -g 53 --script default or discovery and safe

您可以在 https://github.com/cldrn/rainmap-lite/wiki/Scanning-profiles 上找到更多扫描配置文件。

编辑或删除扫描配置文件

要编辑或删除扫描配置文件,需要从配置文件下拉菜单中选择要修改的条目。单击主工具栏上的配置文件,然后选择编辑所选配置文件 (Ctrl+E)。

编辑器将启动,允许您编辑或删除所选配置文件。

14、使用 Ncat 针对网络连接运行 Lua 脚本

Ncat 允许用户以一些非常有趣的方式读取、写入、重定向和修改网络数据。可以将其视为传统工具 netcat 的增强版。一旦连接建立成功,Ncat 就能以不同方式运行外部命令。其中一种方式是借助 Lua 脚本,这些脚本就像程序一样,允许用户执行任何他们想执行的任务。

下面的示例将告诉你如何使用 Ncat 运行包含在 Lua 脚本中的 HTTP 服务器。

如何做...

  1. 在 Ncat 中通过网络连接运行 Lua 脚本非常简单,只需使用 --lua-exec 选项指向要执行的 Lua 脚本和要连接的监听端口或主机即可:

$ncat --lua-exec <path to Lua script> --listen 80

  1. 要使用 Ncat 启动网络服务器,请在 Ncat 的脚本文件夹中找到 httpd.lua 脚本并使用该命令:

$ncat --lua-exec /path/to/httpd.lua --listen 8080 --keep-open

  1. Ncat 将开始监听 8080 端口,并执行连接时指定的 Lua 程序。您可以将网络浏览器指向该方向,检查输出中是否出现 Got a request for 消息,以验证脚本是否正确运行。

工作原理...

如果你使用过 netcat,就会对 Ncat 比较熟悉。同样,Ncat 也可以进入监听(--listen)和连接模式。不过,netcat 缺少 --lua-exec 选项,而该选项的作用是在网络套接字上执行外部 Lua 程序。对于测试或调试各种服务的脚本任务来说,这个选项非常方便。使用这种执行模式的主要优势在于,程序是跨平台的,因为它们是在同一个内置解释器上执行的。

httpd.lua 脚本是随 Ncat 一起发布的一个示例,用于说明服务模拟,但很明显,我们的选择是无限的。Lua 是一种非常强大的语言,只需几行脚本就能完成许多任务。

还有更多...

Ncat 提供了大量选项,在 https://nmap.org /ncat/guide/index.html 上有详细说明。请不要忘记在此停留并阅读完整的文档。

用 Ncat 执行外部命令的其他方法

Ncat 支持三个执行外部程序的选项:

--exec:运行命令时不解释 shell

--sh-exec:通过向系统 shell 传递字符串来执行命令

--lua-exec:使用内置解释器运行 Lua 脚本。

15、使用 Ncrack 对系统进行弱口令扫描

Ncrack 是一款网络身份验证破解工具,用于识别存在弱口令的系统。它非常灵活,支持 FTP、SSH、Telnet、HTTP(S)、POP3(S)、SMB、RDP、VNC、SIP、Redis、PostgreSQL 和 MySQL 等常用网络协议。

在本食谱中,你将学习如何安装 Ncrack 以查找存在弱密码的系统。

准备

https://nmap.org/ncrack/ 获取最新的 Ncrack 稳定版。目前的最新版本是 0.5:


$wget https://nmap.org/ncrack/dist/ncrack-0.5.tar.gz

解压缩文件并进入新目录:


$ tar -zxf ncrack-0.5.tar.gz

$ cd ncrack-0.5

使用以下命令配置并构建 Ncrack:


$./configure && make

最后,将其安装到系统中:


#make install

现在你可以在系统的任何地方使用 Ncrack 了。

如何做...

要对 SSH 服务器进行基本字典攻击,请使用以下命令:


$ncrack ssh://<target>:<port>

Ncrack 将使用默认设置攻击运行在指定 IP 地址和端口上的 SSH 服务器。这可能需要一些时间,具体取决于网络条件:


Starting Ncrack 0.5 ( http://ncrack.org ) at 2016-04-03 21:10 EEST

Discovered credentials for ssh on 192.168.1.2 22/tcp:

192.168.1.2 22/tcp ssh: guest 12345

Ncrack done: 1 service scanned in 56 seconds.

Ncrack finished.

在这种情况下,我们成功找到了来宾账户的凭据。应该有人更清楚,12345 并不是一个好密码。

工作原理...

Ncrack 将目标的主机名或 IP 地址以及要攻击的服务作为参数。

目标和服务的定义如下:


<[service-name]>://<target>:<[port-number]>

最简单的命令需要一个目标和服务说明。运行前面所示扫描的另一种方法如下:


$ncrack 192.168.1.2:22

Starting Ncrack 0.5 ( http://ncrack.org ) at 2016-01-03 22:10 EEST

Discovered credentials for ssh on 192.168.1.2 22/tcp:

192.168.1.2 22/tcp ssh: guest 12345

192.168.1.2 22/tcp ssh: admin money$

Ncrack done: 1 service scanned in 156.03 seconds.

Ncrack finished.

在这种情况下,Ncrack 会根据目标中给出的端口号自动检测 SSH 服务,并使用 Ncrack 随附的默认字典执行密码审计攻击。幸运的是,这次我们发现了两个密码较弱的账户。

还有更多...

正如我们所见,Ncrack 提供了几种指定目标的不同方法,但它通过一些有趣的功能(如暂停和恢复攻击的能力)将其提升到了一个新的水平。我们将简要探讨其中的一些选项,但我强烈建议你阅读 https://nmap.org/ncrack/man.html 上的官方文档,了解完整的选项列表。

配置身份验证选项

如果没有调整身份验证过程的选项,Ncrack 就不是一个好的网络登录破解程序。Ncrack 用户可以使用自己的用户名和密码列表,如果其中包含的列表(在 /lists 目录中)不够用,可以使用 -U 和 -P 选项:


$ ncrack -U <user list file> -P <password list file> <[service-name]>://<target>:<[port-number]>

否则,我们可能需要使用选项 --user 和 --pass 测试特定的用户名或密码:


$ ncrack --user <username> <[service-name]>://<target>:<[port-number]>

$ ncrack --pass <password> <[service-name]>://<target>:<[port-number]>

暂停和恢复攻击

Ncrack 支持使用 --resume 选项恢复未完成的扫描。如果你不得不停止一个破解会话,只需通过前一个会话的文件名恢复即可:


$ncrack --resume cracking-session <[service-name]>://<target>:<[port-number]>

如果我们想设置会话的文件名,请使用 --save 选项:


$ncrack --save cracking-session <[service-name]>://<target>:<[port-number]>

16、使用 Rainmap Lite 从网络浏览器远程启动 Nmap 扫描

Rainmap Lite 是一个网络应用程序,用于从任何网络浏览器运行 Nmap 扫描。它设计得非常轻便,依赖的组件也尽可能少。它非常适合安装在远程服务器上,然后在旅途中通过手机登录并安排扫描。

在本食谱中,您将学习如何使用 Rainmap Lite 启动 Nmap 扫描。

准备

要运行 Rainmap Lite,我们需要下载代码并按以下步骤运行应用程序:

  1. 获取最新稳定版本的 Rainmap Lite:

$git clone https://github.com/cldrn/rainmap-lite.git

  1. 安装 Django 和唯一的项目依赖项 lxml:

$ pip install Django

$ pip install lxml

  1. 将工作目录更改为新创建的文件夹,并创建数据库模式:

$python manage.py migrate

  1. 加载默认扫描配置文件:

$python manage.py loaddata nmapprofiles

  1. 找到 nmaper-cronjob.py,更新 BASE_URL、SMTP_SERVER、SMTP_USER、SMTP_PASS 和 SMTP_PORT 变量,以反映您的安装情况。

  2. 运行应用程序:


#python manage.py runserver 127.0.0.1:8080

  1. 添加定期执行代理的 cron 任务:

/5 * cd <App path> && /usr/bin/python nmaper-cronjob.py >> /var/log/nmaper.log 2>&1

  1. 最后,别忘了添加管理用户:

$ python manage.py createsuperuser

如何做...

将您喜欢的网络浏览器指向运行 Rainmap Lite 的 URL。如果您按照前面描述的步骤操作,它应该运行在 8080 端口上。

界面设计尽可能减少输入。只需填写目标字段,从下拉列表中选择扫描配置文件,并输入您希望接收报告的电子邮件地址。准备好后点击 "扫描",将扫描添加到队列中:

1697078772364

工作原理...

Rainmap Lite 是一个简单的 Django 应用程序,允许用户通过任何网络浏览器安排和运行 Nmap 扫描。该应用程序易于安装在任何服务器上,非常适合安装在远程 VPS 上,使用该界面安排扫描并与团队共享结果。

一个重要的方面是,它基于标准的 cron 代理,以减少依赖的数量。未来可能会实现更强大的队列。

这个项目还很年轻,最初只是一个个人项目,我决定在 2016 年 Blackhat US Arsenal 大会上与大家分享。如有任何错误报告或建议,请直接发送到项目的 GitHub 页面:

https://github.com/cldrn/rainmap-lite

还有更多...

扫描配置文件可通过管理控制台自定义。扫描配置文件在每个版本中都会更新,您也可以将自己的配置文件贡献到项目的维基站点 https://github.com/cldrn/rainmap-lite/wiki/Scanning-profiles。

自定义参数

通过选中自定义 Nmap 参数选项的复选框,可以在不访问管理控制台的情况下即时添加自定义参数:

1697078704274