NMAP:网络探索和安全审计手册 Chapter10 生成扫描报告

本章包括以下配方:

  • 以普通格式保存扫描结果

  • 以 XML 格式保存扫描结果

  • 将扫描结果保存到 SQLite 数据库

  • 以可抓取格式保存扫描结果

  • 使用 Zenmap 生成网络拓扑图

  • 生成 HTML 扫描报告

  • 报告漏洞检查

  • 使用 fop 生成 PDF 报告

  • 在 ElasticSearch 中保存 NSE 报告

引言

扫描报告对渗透测试人员和系统管理员都很有用。渗透测试人员需要报告他们的发现,而系统管理员则需要保存网络清单来监控他们的 IT 资产。然而,两者都常犯的一个错误是不使用 Nmap 的报告功能来加快这些报告的生成。

Nmap 可以将扫描结果写成多种格式,用户可以自行决定是生成 HTML 报告,还是用脚本语言读取,或者导入到第三方安全工具中继续测试目标的其他方面。在本章中,我们将介绍与存储和处理扫描报告相关的不同任务。我们首先介绍 Nmap 支持的不同文件格式。然后,我们将介绍一些小技巧,如使用 Zenmap 生成网络拓扑图、报告漏洞检查以及以官方不支持的格式生成报告。完成本章所涉及的任务后,您将完全熟练地为每项任务生成正确的报告。

以正常格式保存扫描结果

Nmap 支持不同格式保存扫描结果。根据需要,您可以选择正常输出、XML 输出和可抓取输出。如果不设置输出选项,默认使用正常输出模式。正常模式保存的输出结果与你在屏幕上看到的结果一样,只是去掉了运行时的信息。该模式以结构合理、易于理解的方式呈现结果。

本食谱向您演示如何在正常模式下将 Nmap 扫描结果保存到文件。

How to do it...

要将扫描结果以正常输出格式保存到文件中,请添加选项 -oN 。该选项只影响输出格式,可与任何端口或主机扫描技术(当然也可与任何其他 Nmap 选项)结合使用:

$ nmap -oN <output file> <target>

扫描完成后,输出结果应保存在指定文件中:

$ nmap -oN scanme.txt scanme.nmap.org
$ cat scanme.txt

# Nmap 7.40SVN scan initiated Thu Dec 29 13:25:54 2016 as: nmap -oN

- scanme.nmap.org
  Nmap scan report for scanme.nmap.org (45.33.32.156)
  Host is up (0.16s latency).
  Other addresses for scanme.nmap.org (not scanned):
  2600:3c01::f03c:91ff:fe18:bb2f
  Not shown: 995 closed ports
  PORT STATE SERVICE
  22/tcp open ssh
  25/tcp filtered smtp
  80/tcp open http
  Generating Scan Reports
  [ 270 ]
  9929/tcp open nping-echo
  31337/tcp open Elite

# Nmap done at Thu Dec 29 09:05:05 2016 -- 1 IP address (1 host up)

scanned in 23.06 seconds

How it works...

Nmap 支持多种输出格式,如正常、XML、可剔除,甚至还有脚本儿童模式(只是为了好玩才添加的)。正常模式易于阅读,如果不打算处理或解析结果,建议使用该模式。生成的输出文件将包含与屏幕上打印的相同信息,但不包含运行时警告。选项 -oN 会将正常模式下的输出保存到 文件中。

There's more...

正常输出选项 (-oN) 可以与其他任何可用的输出选项结合使用。例如,我们可能希望生成 XML 格式的结果,以便导入第三方工具,并以普通模式与同事分享:

$ nmap -oN normal-output.txt -oX xml-output.xml scanme.nmap.org

您可以使用整数或重复 v 或 d 字符的个数来设置verbosity 或 debug 级别:

$ nmap -v2 -oN nmapscan.txt scanme.nmap.org
$ nmap -vv -oN nmapscan.txt scanme.nmap.org
$ nmap -d2 -oN nmapscan-debug.txt scanme.nmap.org
$ nmap -dd -oN nampscan-debug.txt scanme.nmap.org

有关此任务的其他 Nmap 选项,请参阅附录 D "其他输出选项"。

以 XML 格式保存扫描结果

可扩展标记语言(XML)是一种广为人知的树形结构文件格式,由 Nmap 支持。扫描结果可导出或写入 XML 文件,用于分析或其他附加任务。这是最受欢迎的文件格式之一,因为所有编程语言都有非常可靠的库来解析 XML,而且第三方安全工具也广泛支持 XML。

下面的配方教您如何将扫描结果保存为 XML 格式。

How to do it...

要将扫描结果以 XML 格式保存到文件中,请添加选项 -oX <文件名>,如以下命令所示:

$ nmap -oX <filename> <target>

扫描完成后,将写入包含扫描结果的新文件:

$nmap -p80 -oX scanme.xml scanme.nmap.org
$cat scanme.xml
<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE nmaprun>
<?xml-stylesheet href="file:///usr/local/bin/../share/nmap/nmap.xsl"
type="text/xsl"?>
<!-- Nmap 7.40SVN scan initiated Thu Dec 29 14:53:00 2016 as: nmap -
oX - -p80 scanme.nmap.org -->
<nmaprun scanner="nmap" args="nmap -oX - -p80 scanme.nmap.org"
start="1483051980" startstr="Thu Dec 29 14:53:00 2016"
version="7.40SVN" xmloutputversion="1.04">
<scaninfo type="syn" protocol="tcp" numservices="1" services="80"/>
<verbose level="0"/>
<debugging level="0"/>
<host starttime="1483051991" endtime="1483051991"><status state="up"
reason="reset" reason_ttl="52"/>
<address addr="45.33.32.156" addrtype="ipv4"/>
<hostnames>
<hostname name="scanme.nmap.org" type="user"/>
<hostname name="scanme.nmap.org" type="PTR"/>
</hostnames>
<ports><port protocol="tcp" portid="80"><state state="open"
reason="syn-ack" reason_ttl="52"/><service name="http"
method="table" conf="3"/></port>
</ports>
<times srtt="130218" rttvar="98336" to="523562"/>
</host>
<runstats><finished time="1483051991" timestr="Thu Dec 29 14:53:11
2016" elapsed="10.53" summary="Nmap done at Thu Dec 29 14:53:11
2016; 1 IP address (1 host up) scanned in 10.53 seconds"
exit="success"/><hosts up="1" down="0" total="1"/>
</runstats>
</nmaprun>

How it works...

XML 格式被广泛采用,所有编程语言都有强大的解析库。因此,许多 Nmap 用户在保存扫描结果进行后处理时更喜欢 XML 格式。当您以这种格式保存扫描结果时,Nmap 还包含额外的调试信息。

生成的 XML 文件将包含以下信息:

  • 主机和端口状态
  • 服务
  • 时间戳
  • 执行的命令
  • Nmap 脚本引擎输出
  • 运行统计和调试信息

There's more...

如果希望打印 XML 结果而不是将其写入文件,请将选项 -oX 设置为 -,如以下命令所示:

$ nmap -oX - scanme.nmap.org

Nmap 生成的 XML 文件引用了 XSL 样式表。XSL 用于在网络浏览器中查看 XML 文件。默认情况下,它指向本地的 nmap.xsl 副本,但可以使用选项 --stylesheet 设置其他样式表:

$ nmap -oX results.xml --stylesheet <stylesheet url> <target>

不过,由于同源策略(SOP)的限制,现代网络浏览器不允许使用远程 XSL 样式表。为避免出现问题,我建议将样式表放在与要查看的 XML 文件相同的文件夹中。

如果不打算在网络浏览器中查看 XML 文件,可以使用选项 --no-stylesheet 删除对 XSL 样式表的引用,从而节省一些磁盘空间,如下命令所示:

$ nmap -oX results.xml --no-stylesheet scanme.nmap.org

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 脚本都已更新以支持该功能。如果您正在编写自己的脚本,我强烈建议您学习支持 XML 结构输出的所有可能方法。

有关与此任务相关的其他 Nmap 选项,请参阅附录 D "附加输出选项"。

将扫描结果保存到 SQLite 数据库

开发人员将信息存储在 SQL 数据库中,因为使用灵活的 SQL 查询可以直接提取信息。然而,Nmap 还没有正式包含这项功能。PBNJ 是一套使用 Nmap 检测主机、端口和服务的网络监控工具。

下面的食谱将向您展示如何将扫描结果存储到 SQLite 和 MySQL 数据库中。

Getting ready

PBNJ 是由 Joshua D. Abraham 编写的一套用于监控网络完整性的工具。如果你运行的是基于 Debian 的系统,可以使用以下命令安装它:

#cpan -i Shell
#apt-get install pbnj

要了解在其他支持 Perl 的系统上安装 PBNJ 的要求和方法,请访问 http://pbnj.sourceforge.net/docs.html。

How to do it...

运行 scanpbnj 并使用选项 -a 传递 Nmap 参数:

#scanpbnj -a <Nmap arguments> <target>

要对目标 0xdeadbeefcafe.com 进行快速扫描,我们需要使用以下命令:

#scanpbnj -a "-F" 0xdeadbeefcafe.com
--------------------------------------
Starting Scan of 52.20.139.72
Inserting Machine
Scan Complete for 52.20.139.72
--------------------------------------

Scanpbnj 会将结果存储在 config.yaml 文件或设置参数中配置的数据库中。默认情况下,scanpbnj 会将 data.dbl 文件写入当前工作目录。

How it works...

编写 PBNJ 的目的是帮助系统管理员监控其网络资产。它执行 Nmap 扫描,并将返回的信息存储在配置的 SQLite 或 MySQL 数据库中。

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 的所有执行选项。

There's more...

PBNJ 还有一个名为 outputpbnj 的脚本,用于提取和显示数据库中存储的信息。要列出可用的查询,请运行以下命令:

$outputpbnj --list

例如,要运行查询以列出记录的机器,请使用以下命令:

$outputpbnj -q machines

要检索服务清单,请使用以下命令:

#outputpbnj -q services

以 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,unknownos

请注意,该软件已经有一段时间没有更新了。有些字段无法正确识别,如操作系统 CPE 字段。不过,这个工具对盘点任务仍然很有用,所以我决定将其纳入本章。

解决输出问题

在编写本书时,出现了一个无法运行 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

以可提取格式保存扫描结果

保存扫描结果时,Nmap 支持不同的文件格式。根据需要,您可以选择普通格式、grepable 格式和 XML 格式。加入 grepable 格式是为了帮助用户从日志中提取信息,而无需编写解析器,因为这种格式可以用标准 Unix 工具读取/解析。虽然这一功能已被弃用,但仍有一些人认为它有助于快速完成工作。

在下面的食谱中,我们将向您演示如何以 grepable 模式输出 Nmap 扫描结果。

How to do it...

要将扫描结果保存为可提取格式的文件,请添加 -oG <文件名> 选项,如以下命令所示:

$ nmap -oG <output file> <target>

扫描完成后,输出文件就会出现:

$ nmap -F -oG scanme.grep scanme.nmap.org
$ cat nmap.grep
# Nmap 7.40SVN scan initiated Thu Dec 29 15:21:44 2016 as: nmap -F -
oG scanme.grep scanme.nmap.org
Host: 45.33.32.156 (scanme.nmap.org)Status: Up
Host: 45.33.32.156 (scanme.nmap.org)Ports: 22/open/tcp//ssh///,
25/filtered/tcp//smtp///, 80/open/tcp//http///Ignored State: closed
(97)
# Nmap done at Thu Dec 29 15:21:56 2016 -- 1 IP address (1 host up)
scanned in 11.38 seconds

How it works...

在 grepable 模式下,每个主机都放在同一行,格式为 <字段名称>:<值>,每个字段用制表符(tab)分隔。字段数量取决于扫描时使用的 Nmap 选项。

有八个可能的输出字段:

  • Host: 该字段始终包含 IP 地址和反向 DNS 名称(如果有)。
  • Status: 该字段有三种可能的值--向上、向下或未知
  • Ports: 在该字段中,端口条目用逗号和空格分隔,每个条目用斜线字符 (/) 分成七个字段
  • Protocols: 使用 IP 协议 (-sO) 扫描时将显示此字段
  • Ignored: 该字段显示被忽略的端口状态数
  • OS: 该字段仅在使用操作系统检测 (-O) 时显示
  • Seq index: 该字段仅在使用操作系统检测 (-O) 时显示
  • IP ID seq: 该字段仅在使用操作系统检测 (-O) 时显示

There's more...

如前所述,grepable 模式已被弃用。来自 Nmap 脚本引擎的任何输出都不包含在此格式中,因此如果使用 NSE,则不应使用此模式。或者,您可以指定一个额外的输出选项,将此信息存储在另一个文件中:

$ nmap -oX results-with-nse.xml -oG results.grep scanme.nmap.org

如果希望打印可 grep 的结果,而不是将其写入文件,请将选项 -oG 设置为 -:

$ nmap -oG - scanme.nmap.org

有关此任务的其他 Nmap 选项,请参阅附录 D "其他输出选项"。

使用 Zenmap 生成网络拓扑图

Zenmap 的拓扑选项卡允许用户获得网络的图形表示。网络图用于 IT 中的多项任务,我们可以从 Nmap 导出拓扑图,省去使用第三方工具绘制拓扑图的麻烦。该选项卡还包括几个可视化选项,用于调整图的视图。

本食谱将向您展示如何使用 Zenmap 生成网络拓扑图的图像。

How to do it...

在 Zenmap 中扫描要映射的网络,添加 --traceroute 选项:

nmap -sV --traceroute scanme.nmap.org

转到名为拓扑的选项卡。现在应该可以看到拓扑图了,如下图所示:

image-20231019200704274

在此视图中,您可以重新排列节点的位置,并应用一些不同的可视化样式。对布局满意后,单击 "保存图形 "将可视化保存为图像文件、PDF、SVG 或 postscript 文件。

How it works...

拓扑选项卡是对 João Paulo S. Medeiros 的 RadialNet (http://www.dca.ufrn.br/~joaomedeiros/radialnet/) 的改编。它为用户提供了一个网络拓扑图,IT 部门可将其用于多种用途,从清查到网络路径追踪。

在 Zenmap 拓扑图中,节点代表主机,边代表主机之间的连接。显然,该功能与 --traceroute 指令配合使用效果最佳,因为该选项允许 Nmap 收集有关网络路径的信息。节点也有颜色和大小之分,代表主机及其端口的状态。还有一些特殊图标用来表示不同类型的设备,如路由器、防火墙或接入点。

There's more...

如果需要在当前拓扑图中添加其他主机,只需扫描目标即可。Zenmap 会跟踪所有扫描,并自动将新网络添加到拓扑视图中。Zenmap 的 "拓扑 "选项卡还提供多种可视化控制,并可对其进行调整。这些控制包括分组、突出显示和动画。

要了解有关可视化控件的更多信息,请访问 http://nmap.org/book/zenmap-topology.html 上的官方文档。

生成 HTML 扫描报告

与其他文件格式相比,HTML 页面的优势在于可以在如今大多数设备都配备的网络浏览器中查看。因此,用户可能会发现用 HTML 生成扫描报告并上传到某个地方以方便访问是非常有用的。

下面的配方将向您展示如何从 XML 结果文件生成 HTML 报告。

Getting ready

为此,我们将使用 XSLT 处理器工具。在不同的平台上有多种选择,但在 Unix 系统上最流行的是名为 xsltproc 的工具;如果你运行的是现代 Linux,很有可能已经安装了该工具。Xsltproc 也适用于 Windows,但需要在系统中添加一些额外的库。

如果你正在寻找其他跨平台的 XSLT(和 XQuery)处理器,它们在 Windows 上更容易安装,请访问 http://saxon.sourceforge.net/。他们提供基于 Java 的解决方案 saxon 的免费版本。

How to do it...

  1. 首先,使用以下命令将扫描结果保存为 XML 格式:
nmap -A -oX results.xml scanme.nmap.org
  1. 现在,运行 xsltproc 将生成的 XML 文件转换为 HTML/CSS:
$xsltproc results.xml -o results.html
  1. HTML 文件应写入你的工作目录。现在,只需用你喜欢的网络浏览器打开它

image-20231019201208120

How it works...

XSL 样式表用于直接从网络浏览器查看 XML 文件。遗憾的是,现代网络浏览器包含更严格的同源策略限制,因此生成 HTML 报告比直接查看 XML 文件更方便。

xsltproc 工具需要以下参数:

$xsltproc <input file> -o <output file>

XSL 样式表的引用包含在 XML 文件中,而样式则取自 XSL 样式表。您需要确保引用的 XSL 样式表是可读的,否则 xsltproc 将失败。默认情况下,Nmap 会将 nmap.xsl 发送到你的安装目录。如果系统中没有 nmap.xsl,可以下载它,将其放在工作目录中,然后使用 --stylesheet 指令:

$nmap --stylesheet /usr/local/share/nmap/nmap.xsl <target>

There's more...

如果系统中没有 XSL 样式表,可以使用 --webxml 指令,让 Nmap 使用以下命令引用在线副本:

nmap -oX results.xml --webxml scanme.nmap.org

要定制报告的外观,可以编辑 XSL 样式表。我建议你从 nmap.xsl 文件开始学习字段名称。

报告漏洞检查

在一些 NSE 脚本的帮助下,Nmap 可以用作漏洞扫描器。虽然这不是 Nmap 的主要目标,但可用的漏洞检测脚本非常棒。NSE 脚本 vuln 库管理并统一由 Nmap 脚本引擎执行的漏洞检查输出。

本食谱将向您展示如何使 Nmap 报告扫描期间执行的漏洞检查。

How to do it...

针对目标启动漏洞类别中的 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

根据设计,只有当漏洞被确认时,你才能看到结果。你可能会认为漏洞脚本没有运行,但事实上,检查是成功的,只是主机被标记为不存在漏洞。

How it works...

参数 --script vuln 会启动 vuln 类别下的所有 NSE 脚本。当确认一个漏洞时,vuln 库会报告多个字段,如名称、描述、CVE、OSVDB、披露日期、风险因素、利用结果、CVSS 分数、参考链接和其他额外信息。

vuln 库由 Djalal Harouni 和 Henri Doreau 创建,用于报告和存储 Nmap 发现的漏洞。该库返回的信息可帮助我们自动生成报告,并向用户提供有关漏洞的详细信息。

There's more...

如果希望 Nmap 报告所有的安全检查,甚至是表明目标不存在漏洞的检查,请设置库参数 vulns.showall:

nmap -sV --script vuln --script-args vulns.showall <target>

现在,每个 NSE 脚本 vuln 都会报告其状态:

 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)

使用 fop 生成 PDF 报告

用户还可以生成 PDF 格式的 Nmap 扫描报告。虽然 Nmap 不支持生成 PDF 报告,但我们可以使用名为 fop 的工具来完成这项任务。

下面的配方将向您展示如何生成 PDF 格式的扫描报告。

Getting ready

Format Object Printer (FOP) 是一个 Apache 项目,用于将 XML-FO 转换为 PDF 文件。在继续之前,您需要安装该软件。请从 http://www.apache.org/dyn/closer.cgi/xmlgraphics/fop 下载并将二进制文件放到系统路径中。

您还需要 Nmap 附带的样式表。请在 Nmap 安装目录中找到 nmap-fo.xsl 文件。如果没有,可以从 https://github.com/nmap/nmap/blob/master/docs/nmap-fo.xsl 下载。

How to do it...

扫描目标并以 XML 模式保存输出:

$nmap -oX scanme.xml scanme.nmap.org

现在,我们使用 fop 应用 XSL 样式表,并通过以下命令生成 PDF 报告:

$fop -xml <nmap input xml> -xsl <nmap style sheet> -pdf <output file>

PDF 报告将以参数 -pdf 中指定的名称生成。

How it works...

XSL 格式化对象(XSL-FO)是 XSL 的一部分,设计用于格式化 XML 文档和生成 PDF 文件。fop 工具是 Apache Foundation 的一部分,我们使用它来使用所提供的 XSL 样式表转换 XML 扫描报告。

生成 PDF 扫描报告的过程包括首先生成 XML 报告。该报告将作为 fops 的输入。除 PDF 格式外,fop 还支持大量输出选项,值得一试。

There's more...

您可以通过编辑退出或创建新的 XSL 样式表来定制报告。有关 XSL 转换、XPath 和 XSL-FO 的更多信息,请访问 https://www.w3.org/Style/XSL/。

生成其他格式的报告

fop 支持多种输出格式,可使用相同的 XSL 样式表生成。例如,要生成包含扫描报告的 PNG 图像文件,请使用以下命令:

$fop -xml <nmap input xml> -xsl <nmap style sheet> -png <output file>

在 ElasticSearch 中保存 NSE 报告

ElasticSearch 是一种分布式 NoSQL 数据库,用于处理大量记录。对于全网扫描,将结果存储在 ElasticSearch 实例中可能是个好主意。Nmap 不支持将结果直接导出到 ElasticSearch;不过,我们可以在 xmlstarlet 的帮助下完成这项任务。

下面的配方将向你展示如何生成可插入 ElasticSearch 实例的 JSON 对象。

Getting ready

为此,我们需要使用一套名为 xmlstarlet 的工具来处理 XML 文档。在基于 Debian 的系统中,你可以使用以下命令安装它:

apt-get install xmlstarlet

对于其他系统,请访问 XMLStarlet 官方网站 http://xmlstar.sourceforge.net/ 获取安装说明。

How to do it...

  1. 扫描目标并以 XML 模式保存输出:
$nmap -sC -oX scanme.xml scanme.nmap.org
  1. 现在使用之前生成的文件作为输入,运行以下 xmlstarlet 命令(可从 https://secwiki.org/w/Xmlstarlet_commands 复制该命令):
$xmlstarlet sel -t -m "//host/ports/port/script" -o "{ip:'" -v "ancestor::host/address[@addrtype='ipv4']/@addr" -o "', proto:'" -v "../@protocol" -o "', port:" -v "../@portid" -o ", service:'" -v "../service/@name" -o "', script:'" -v "@id" -o "', script-output:'" -v "@output" -o "'}" -n scanme.xml
  1. 该命令将生成如下 JSON 对象:
{ip:'45.33.32.156', proto:'tcp', port:80, service:'http', script:'http-title', script-output:'Go ahead and ScanMe!'}
  1. 将其保存到文本文件中,然后使用以下命令将其插入到 ElasticSearch 实例中:
$ curl -s -XPOST <ElasticSearch instance> -d @<input file> -v
  1. 如果成功,您应该会看到类似下面的回复:
$ curl -s -XPOST search-test-gmoopxkvyojuoqqvklzp3lghbu.us-east-1.es.amazonaws.com/scans/1 -d @test-data.json -v
 * Trying 52.204.89.67...
 * Connected to search-test-gmoopxkvyojuoqqvklzp3lghbu.us-east-
 1.es.amazonaws.com (52.204.89.67) port 80 (#0)
 > POST /scans/1 HTTP/1.1
 > Host: search-test-gmoopxkvyojuoqqvklzp3lghbu.us-east-
 1.es.amazonaws.com
 > User-Agent: curl/7.47.0
 > Accept: */*
 > Content-Length: 116
 > Content-Type: application/x-www-form-urlencoded
 >
 * upload completely sent off: 116 out of 116 bytes
 < HTTP/1.1 201 Created
 < Access-Control-Allow-Origin: *
 < Content-Type: application/json; charset=UTF-8
 < Content-Length: 135
 < Connection: keep-alive
 <
 * Connection #0 to host search-test-
 gmoopxkvyojuoqqvklzp3lghbu.us-east-1.es.amazonaws.com left
intact
{"_index":"scans","_type":"1","_id":"AVlQ6vkuClDyoPd9vuBS","_versio
n":1,"_shards":
 {"total":2,"successful":1,"failed":0},"created":true}

How it works...

这就是 XML 输出多么灵活的一个例子。在本章中,我们曾将 XML 报告转换为 HTML、PDF 甚至 PNG 报告!这次,xmlstarlet 从 XML 扫描结果中生成了一个有效的 JSON 对象,并将其插入到 ElasticSearch 实例中。XMLstarlet 可用于查询、编辑和转换 XML 文档。它是一个功能强大的工具,一开始可能会让人望而生畏,但如果我们掌握了它,就会发现它的价值无穷。

在前面的示例中,我们使用 XPATH 表达式和输出字符串专门提取了服务和 NSE 脚本信息,并将其格式化为 JSON 对象,可直接插入 ElasticSearch。

{ip:'45.33.32.156', proto:'tcp', port:80, service:'http', script:'http-title', script-output:'Go ahead and ScanMe!'}

There's more...

XMLStarlet 可轻松用于其他解析任务。让我们过滤开放端口的 IP 地址:

$xmlstarlet sel -t -m "//host[ports/port/state/@state='open']" -v "address[@addrtype='ipv4']/@addr" -n scanme.xml 

要选择具有特定开放端口的 IP 地址,我们可以使用以下方法。例如,让我们找出谁可以访问 443 端口:

$xmlstarlet sel -t -m "//host[ports/port[@protocol='tcp' and @portid='443']/state/@state='open']" -v "address[@addrtype='ipv4']/@addr" -n scanme.xml

正如你所看到的,可能性是无限的。我将继续在 SecWiki 中发布更多有用的 XMLStarlet 命令,因此我鼓励大家时常访问本页面:

https://secwiki.org/w/Xmlstarlet_commands