在本章中,我们将介绍以下配方:
- 了解 Nmap 脚本引擎及其定制
- 了解 Nessus 审核策略及其定制
从前面的章节可以清楚地看到,Nmap 脚本引擎和 Nessus 的合规性审核策略是这两种工具的重要组成部分,用于执行全面的审核和检查。对于用户来说,了解这些组件的工作原理以及定制这些组件以执行特定操作的各种技术非常重要。在本章中,我们将详细介绍 Nmap 脚本引擎和 Nessus 审计文件组合,以创建自定义文件并执行特定操作。
Nmap 脚本引擎用于运行用户编写的自定义脚本,以自动执行网络级操作。通常,Nmap 脚本以.nse
扩展名结尾。这些脚本用于执行以下任务:
- 主机和端口发现:Nmap 被广泛使用的全部目的是执行简单的任务,检查远程主机是否处于活动状态,以及端口的当前状态。
- 版本检测:Nmap 有一个包含各种应用和服务签名的数据库,根据从端口接收到的响应进行检查,以确定端口上运行的服务,有时还包括特定版本。
- 受影响的漏洞:Nmap 脚本引擎允许用户确定特定端口/服务是否易受特定公开漏洞的攻击。它取决于用户编写的脚本,用于查询正在运行的服务中的数据,并根据响应发送自定义数据包,以确定端口/服务是否实际易受攻击。Nmap 脚本使用 Lua 编程语言,我们将研究一些语法作为编写自定义脚本的方法的一部分。所有 Nmap 脚本都分为以下类别:
auth
:这类脚本处理任何与身份验证相关的检查,例如,默认用户名和密码登录,以及匿名和空登录。broadcast
:这类脚本用于动态添加新发现的主机,这些主机将被 Nmap 扫描,允许用户同时执行完整的网络发现和扫描。brute
:此类脚本用于执行暴力攻击,以猜测 HTTP、数据库、FTP 等各种服务的密码。default
:此类脚本与命令行中未提及的特定脚本的所有扫描一起运行。discovery
:此类脚本用于获取网络服务在网络内共享资源的更多信息。dos
:这类脚本是 Nmap 脚本中最不需要的脚本之一。这些脚本用于测试通过破坏服务而导致拒绝服务(DoS攻击的漏洞。exploit
:这些脚本用于攻击特定漏洞。external
:此类脚本使用外部资源执行给定任务。例如,对于任何与 DNS 相关的脚本,Nmap 必须查询本地 DNS 服务器。fuzzer
:此类脚本用于生成随机有效负载,以利用特定服务。服务对这些有效负载的响应可用于确定特定服务是否易受攻击。intrusive
:此类脚本用于直接攻击该漏洞。这些扫描必须在侦察后的稍后阶段使用。malware
:这类脚本允许用户识别远程主机是否受到任何恶意软件的影响或有任何后门打开。safe
:此类脚本用于抓取网络中所有人都可以使用的数据,如横幅、密钥等。version
:此类脚本用于识别和确定远程主机上运行的服务的版本。vuln
:此类脚本用于验证特定漏洞。
以下是nmap
命令中执行脚本所需的参数:
--script <filename>|<category>|<directory>|<expression>
:此参数允许用户指定要执行的脚本,其中文件名、类别、目录和表达式紧随其后,以帮助用户选择脚本。为了让用户执行这些脚本,它们需要存在于 Nmap 安装目录的 scripts 文件夹中:
此处使用的通用语法如下所示:
nmap --script afp-ls.nse <host>
--script-args
:这允许用户在需要时将输入传递给nmap
命令。此处使用的通用语法如下所示:
nmap --script afp-ls.nse --script-args <arguments> <host>
--script-args-file
:允许用户上传文件输入到nmap
命令。此处使用的通用语法如下所示:
nmap --script afp-ls.nse --script-args-file <filename/path> <host>
--script-help <filename>|<category>|<directory>|<expression>
:此参数将允许用户获取有关可使用脚本的更多信息。此处使用的通用语法如下所示:
nmap --script-help <filename>
由于输出量巨大,我们将其保存到D
驱动器中名为output.txt
的文件中。在文本编辑器中打开output
文件以查看帮助消息:
--script-trace
:如果使用,此参数将允许用户查看脚本正在执行的网络通信:
nmap --script afp-ls.nse –script-trace <hostname>
--script-updatedb
:用于更新脚本的数据库,供 Nmap 使用。此处使用的通用语法如下所示:
nmap --script-updatedb
以下是准备 Nmap 脚本时使用的环境变量:
SCRIPT_PATH
:描述脚本的路径SCRIPT_NAME
:描述脚本的名称SCRIPT_TYPE
:此变量用于描述脚本为远程主机调用的规则类型
以下是简单 Nmap 脚本的结构:
//Rule section
portrule = function(host, port)
return port.protocol == "tcp"
and port.number == 25
and port.state == "open"
end
//Action section
action = function(host, port)
return "smtp port is open"
end
Nmap 脚本基本上分为三个部分,在这里讨论。我们将使用中的脚本 https://svn.nmap.org/nmap/scripts/smtp-enum-users.nse 以定义这些类别中的数据为例:
-
Head
本节保存脚本的描述性和依赖性相关数据,下面是支持的各个组件:description
:此字段作为脚本的元数据,描述脚本功能的重要信息,以便用户使用。它试图通过发出VRFY
、EXPN
或RCPT TO
命令来枚举 SMTP 服务器上的用户。此脚本的目标是发现远程系统中的所有用户帐户。该脚本将输出找到的用户名列表。如果强制进行身份验证,脚本将停止查询 SMTP 服务器。如果在测试目标主机时发生错误,则错误将与错误发生之前发现的任何组合的列表一起打印。用户可以指定要使用的方法以及顺序。脚本将忽略重复的方法。如果未指定,脚本将首先使用RCPT
,然后使用VRFY
和EXPN
,如何指定要使用的方法和顺序的示例如下:****
****```
description = [[
smtp-enum-users.methods={EXPN,RCPT,VRFY}
]]
categories = {"auth","external","intrusive"}
author = "Duarte Silva duarte.silva@serializing.me"
license = "Same as Nmap--See https://nmap.org/book/man-legal.html"
dependencies = {"dependant script"}
| Ajp | 卡桑德拉 |
| Amqp | Citrix XML |
| asn1 | 通信 |
| 基地 32 | 信誉 |
| base64 | 简历 |
| 箱子 | 数据文件 |
| 一点 | Dhcp |
| 比特币 | dhcp6 |
| 比特流 | 域名系统 |
| Bjnp | Dnsbl |
| 残酷的人 | Dnssd |
| Eigrp | 德尔达 |
| ftp | Eap |
作为参考,我们可以在[查看脚本 https://svn.nmap.org/nmap/scripts/smtp-enum-users.nse](https://svn.nmap.org/nmap/scripts/smtp-enum-users.nse) 要查看库是如何定义的:
local nmap = require "nmap" local shortport = require "shortport" local smtp = require "smtp" local stdnse = require "stdnse" local string = require "string" local table = require "table" local unpwdb = require "unpwdb"
这些库中定义了各种函数,我们可以使用以下语法传递参数:`<function name>(arg1, arg2, arg3)`。例如,`smtp.check_reply("MAIL", response)`。
* `Rules`:脚本规则用于根据布尔结果 true 或 false 确定是否扫描远程主机。只有当规则返回 true 时,才会扫描主机。以下是脚本在主机上应用的规则:
* `prerule()`:在主机上执行扫描之前执行此规则
* `hostrule(host),portrule(host, port)`:这些规则在使用提供的脚本扫描每组主机后执行
* `postrule()`:所有主机扫描完成后执行此规则
以下是示例脚本`smtp-enum-users.nse`中使用的规则:
portrule = shortport.port_or_service({ 25, 465, 587 }, { "smtp", "smtps", "submission" })
* `Action`:本节包括脚本要执行的操作。一旦执行该操作,它将返回一个特定的结果,根据该结果确定用户看到的最终结果。以下是示例脚本`smtp-enum-users.nse`中的操作部分:
action = function(host, port) local status, result = go(host, port) -- The go function returned true, lets check if it -- didn't found any accounts. if status and #result == 0 then return stdnse.format_output(true, "Couldn't find any accounts") end
有些库要求脚本采用特定格式,并且必须使用 NSEDoc 格式。我们将在本食谱中看到如何将脚本适应这种格式。在这个方法中,我们将看看如何创建一个脚本来识别远程主机上是否存在默认的 Tomcat 文件。
# 准备
要完成此活动,您必须在计算机上满足以下先决条件:
* 您必须安装了 Nmap。
* 您必须具有对要在其上执行扫描的主机的网络访问权限。
要安装 Nmap,您可以按照[第 2 章](02.html)*了解网络扫描工具*中提供的说明进行操作。这将允许您下载兼容版本的 Nmap 并安装所有必需的插件。要检查您的机器是否安装了 Nmap,请打开命令提示符并键入`nmap`。如果安装了 Nmap,您将看到与以下类似的屏幕:

如果看不到前面的屏幕,请将命令提示符控件移动到安装了 Nmap 的文件夹(`C:\Program Files\Nmap`中),重试相同的步骤。如果在此之后没有看到前面的屏幕,请删除并重新安装 Nmap。
要在要进行扫描的主机上填充打开的端口,您需要具有对该特定主机的网络级访问权限。检查您是否可以访问特定主机的一种简单方法是通过 ICMP 向主机发送 ping 数据包。但是,此方法仅在该网络中启用 ICMP 和 ping 时有效。如果禁用 ICMP,则实时主机检测技术会有所不同。我们将在本书后面的章节中更详细地介绍这一点。
为了获得显示的输出,需要安装虚拟机。为了能够运行虚拟机,我建议使用 VMware 的 30 天试用版,可以从[下载并安装 https://www.vmware.com/products/workstation-pro/workstation-pro-evaluation.html](https://www.vmware.com/products/workstation-pro/workstation-pro-evaluation.html) 。
对于测试系统,读者可以从[下载 Metasploitable(Rapid 7 提供的易受攻击的虚拟机)https://information.rapid7.com/download-metasploitable-2017.html](https://information.rapid7.com/download-metasploitable-2017.html) 。按照以下步骤打开 Metasploitable。这提供了各种组件,如操作系统、数据库和易受攻击的应用,这将帮助我们测试本章中的配方。请按照以下说明开始操作:
1. 解压缩下载的 Metasploitable 包
2. 使用安装的 VMware 工作站或 VMware Player 打开`.vxm`文件
3. 使用`msfadmin`/`msfadmin`作为用户名和密码登录
# 怎么做…
执行以下步骤:
1. 打开文本编辑器,定义`Head`、`Rule`、`Action`三个部分,如下图所示:

2. 让我们从`Head`部分开始。以下是`Head`部分中需要提及的参数,代码如下:
-- Head description = [[Sample script to check whether default apache files are present]] author = "Jetty" license = "Same as Nmap--See http://nmap.org/book/man-legal.html" categories = {"default", "safe"} -- Rule -- Action
3. 现在,让我们使用以下代码定义脚本运行所需的库:
local shortport = require "shortport" local http = require "http"
为了让脚本编写端口规则,我们需要使用`shortport`和`http`。我们使用`shortport`生成端口规则,`http`简化与 HTTP 和 HTTPS 页面的通信。
4. 现在让我们从规则部分开始,介绍所包含的`shortport`库中的`shortport`规则。这允许 Nmap 在端口打开时调用操作:
portrule = shortport.http
5. 一旦`Head`和`Rule`部分完成,我们所要做的就是定义`action`页面来执行决定性的操作,并确定 URI 中提到的位置是否存在默认的 Tomcat 文档:
action = function(host, port) local uri = "/tomcat-docs/index.html" local response = http.get(host, port, uri) if ( response.status == 200 ) then return response.body end end
在 action 部分,我们定义了需要检查默认文件的 URI。我们使用`http.get`函数获取响应,并将其保存在变量响应中。然后,我们设置了一个 if 条件来检查从服务器接收到的 HTTP 响应是否包含 HTTP 代码 200,这表示页面已成功获取。现在,为了实际查看网页的内容,我们使用`response.body`打印收到的响应。
6. 让我们尝试并执行我们现在编写的脚本,以检查它是否正常工作或是否需要进行故障排除。以下是脚本的屏幕截图。将其保存到脚本文件夹中名为`apache-default-files.nse`的 Nmap 安装目录:

使用以下语法执行脚本:
nmap --script apache-default-files 192.168.75.128 -p8180 -v

前面的屏幕截图显示脚本已成功执行,检索到的页面是 ApacheTomcat 的默认页面。这意味着主机易受攻击。现在,我们可以将返回变量的值更改为 vulnerable,而不是打印如此繁重的输出。
200 响应并不总是意味着远程主机易受攻击,因为响应可能包含自定义错误消息。因此,建议包含基于正则表达式的条件,以得出相同的结论,然后相应地返回响应。
7. 让我们通过在`Head`部分的脚本中添加以下行,进一步以该格式装饰脚本并为其编写脚本文档:
-- @usage -- nmap --script apache-default-files` -- @output -- PORT STATE SERVICE -- |_apache-default-files: Vulnerable
该脚本现在看起来如下所示:
-- Head description = [[Sample script to check whether default apache files are present]] author = "Jetty" license = "Same as Nmap--See http://nmap.org/book/man-legal.html" categories = {"default", "safe"}
-- @usage -- nmap --script apache-default-files` -- @output -- PORT STATE SERVICE -- |_apache-default-files: Vulnerable
local shortport = require "shortport" local http = require "http"
-- Rule portrule = shortport.http
-- Action action = function(host, port) local uri = "/tomcat-docs/index.html" local response = http.get(host, port, uri) if ( response.status == 200 ) then return "vulnerable" end end
8. 将脚本保存在 Nmap 安装目录的`scripts`文件夹中,并使用以下语法执行:
nmap --script apache-default-files 192.168.75.128 -p8180 -v

# 它是如何工作的。。。
您可以使用类似的技术,通过使用复杂的库和支持复杂编程的 Lua 语言的多个函数来创建复杂的脚本。通过使用`–A`参数,可以根据可用的端口和服务一起执行这些脚本。这将减少用户提及所需的每个脚本的工作量。
# 了解 Nessus 审核策略及其定制
Nessus 审核文件由自定义的基于 XML 的规则组成,这些规则是为各种平台执行配置审核所必需的。这些文件允许用户对当前配置执行基于值和正则表达式的比较,并确定存在的差距。一般而言,预计这些审计文件将按照行业标准基线编制,以便显示实际的合规差距,同时管理团队可以进行强化和合规工作。将保存扩展名为`.audit`的自定义审核文件。
以下是审核文件中检查的通用语法:
我们将了解一些 windows 的标准检查,以便了解各种通用和自定义检查。所有默认检查均以<item>
开头,所有自定义检查均以<custom_item>
开头:
- 值数据:审核文件中的关键字可以根据
value_data
标签分配数据。本节描述了可在审核文件中定义的不同关键字及其可保存的值。value_data
的数据类型为 DWORD。value_data
还可以使用算术符号(如||
、&&
等)向其提供复杂表达式:Check_type
:此属性用于比较从远程主机获取的值是否为策略值,并根据配置的属性返回结果。此属性的某些版本如下所示:CHECK_EQUAL
CHECK_EQUAL_ANY
CHECK_NOT_EQUAL
CHECK_GREATER_THAN
CHECK_GREATER_THAN_OR_EQUAL
- 信息:可选字段,用于添加正在执行的检查信息。其语法如下所示:
info: "Password policy check"
- 访问控制列表格式(ACL):此部分设置包含关键字,可以保存值来检测文件上是否应用了所需的 ACL 设置。ACL 格式支持六种不同类型的访问列表关键字,如下所示:
- 文件访问控制检查(
file_acl
- 注册表访问控制检查(
registry_acl
- 服务访问控制检查(
service_acl
- 启动权限控制检查(
launch_acl
- 访问权限控制检查(
access_acl
- 文件访问控制检查(
上述关键字可用于定义以下关联类型中特定用户的文件权限。对于不同的关键字,这些权限类别可能有不同的更改:
这些关键字对文件夹具有不同的权限集。以下是可以使用file_acl
的语法:
<file_acl: ["name"]>
<user: ["user_name"]>
acl_inheritance: ["value"]
acl_apply: ["value"]
</user>
</acl>
类似的语法可用于所有其他关键字,只需将file_acl
替换为相应的关键字即可。
- **项目:**项目为检查类型,可用于执行预定义的审核检查。这会减少语法,因为策略是预定义的,在这里使用属性调用。以下是项目的结构:
<item>
name: ["predefined_entry"]
value: [value]
</item>
该值可以由用户定义,但名称需要与预定义策略中列出的名称匹配。下面是我们将在此配方中使用的几个关键字和标记,用于创建自定义 Windows 和 Unix 审核文件。
<check_type:"Windows" version:" ">
name: "max_password_age"
type: PASSWORD_POLICY
description: " Maximum password age"
info: "Maximum password age of 60 days is being checked."
Value: "8"
cmd : "cat /etc/login.defs | grep -v ^# | grep PASS_WARN_AGE | awk {'print $2'}"
regex: "^[\\s]*PASS_WARN_AGE\\s+"
expect: "14"
value_type: POLICY_TEXT
'DQAKACIAMQAwACADFSIGHSAPFIUGHPSAIUFHVPSAIUVHAIPUVAPAUIVHAPIVdAA7AA0ACgA='
ps_encoded_args: YES
在这个方法中,我们将考虑创建一个 windows 审计文件来检查系统分区中的可用磁盘空间。
要完成此活动,您必须在计算机上满足以下先决条件:
- 你必须安装 Nessus。
- 您必须具有对要在其上执行扫描的主机的网络访问权限。
要安装 Nessus,您可以按照第 2 章了解网络扫描工具中提供的说明进行操作。这将允许您下载 Nessus 的兼容版本并安装所有必需的插件。要检查您的机器是否安装了 Nessus,请打开搜索栏并搜索Nessus Web Client
。找到并单击后,将在默认浏览器窗口中打开:
如果您确定 Nessus 安装正确,您可以使用https://localhost:8834 直接从浏览器中获取 URL 以打开 Nessus Web 客户端。如果找不到 Nessus Web 客户端,则应删除并重新安装 Nessus。Nessus 的拆卸和安装说明参见第 2 章、了解网络扫描工具。如果您已找到 Nessus Web 客户端,但无法在浏览器窗口中打开它,则需要检查 Nessus 服务是否正在 Windows 服务实用程序中运行:
您可以根据需要使用服务实用程序进一步启动和停止 Nessus。为了使用命令行界面进一步确认安装,您可以导航到安装目录以查看和访问 Nessus 命令行实用程序:
始终建议具有管理员级别或根级别的凭据,以便扫描仪能够访问所有系统文件。与未经认证的扫描相比,这将允许扫描仪执行更深的扫描并填充更好的结果。政策合规模块仅在 Nessus 的付费版本中可用,如 Nessus Professional 或 Nessus Manager。为此,您必须从 Tenable 购买激活密钥,并在设置页面中进行更新,如下图所示:
单击编辑按钮打开一个窗口,输入您从 Tenable 购买的新激活码:
执行以下步骤:
- 打开记事本++或任何文本编辑器。
- 为了创建自定义项目的 Windows 检查,我们需要使用
custom_item
标记开始和结束检查:
<custom_item>
</custom_item>
- 现在,我们需要确定所需的元数据属性并定义它们。在这种情况下,我们将使用
description
和info
:
<custom_item>
description: "Free disk space in system partition#C drive"
info: "Powershell command will output the free space available on C drive"
</custom_item>
- 现在,我们需要定义需要执行的检查类型。Nessus 在 PowerShell 上执行所有 NASL windows 命令,因此检查类型为
AUDIT_POWERSHELL
:
<custom_item>
type: AUDIT_POWERSHELL
description: "Free disk space in system partition#C drive"
info : "Powershell command will output the free space available on C drive"
</custom_item>
- 现在,我们需要定义检查支持的值类型和值数据。在这种情况下,我们将使用策略类型并将
0
设置为MAX
:
<custom_item>
type: AUDIT_POWERSHELL
description: "Free disk space in system partition#C drive"
info : "Powershell command will output the free space available on C drive"
value_type: POLICY_TEXT
value_data: "[0..MAX]"
</custom_item>
- 现在,我们需要传递 PowerShell 要执行的命令以获取
C
驱动器中的可用空间:
<custom_item>
type: AUDIT_POWERSHELL
description: "Free disk space in system partition#C drive"
info : "Powershell command will output the free space available on C drive"
value_type: POLICY_TEXT
value_data: "[0..MAX]"
powershell_args : 'Get-PSDrive C | Select-Object Free'
</custom_item>
- 由于我们没有将编码命令传递给 PowerShell,因此需要使用
ps_encoded_args
属性定义相同的命令:
<custom_item>
type: AUDIT_POWERSHELL
description: "Free disk space in system partition#C drive"
info : "Powershell command will output the free space available on C drive"
value_type: POLICY_TEXT
value_data: "[0..MAX]"
powershell_args : 'Get-PSDrive C | Select-Object Free'
ps_encoded_args: NO
</custom_item>
- 由于它不需要任何细化,并且命令的输出足以让我们知道有多少可用空间,因此我们还将定义
only_show_cmd_output: YES
属性:
<custom_item>
type: AUDIT_POWERSHELL
description: "Free disk space in system partition#C drive"
info : "Powershell command will output the free space available on C drive"
value_type: POLICY_TEXT
value_data: "[0..MAX]"
powershell_args : 'Get-PSDrive C | Select-Object Free'
ps_encoded_args: NO
only_show_cmd_output: YES
</custom_item>
正如我们所看到的,所有审计文件都以check_type
开头和结尾,我们将前面的代码附在同一个文件中:
<check_type:"windows" version:"2">
<custom_item>
type: AUDIT_POWERSHELL
description: "Free disk space in system partition#C drive"
info : "Powershell command will output the free space available on C drive"
value_type: POLICY_TEXT
value_data: "[0..MAX]"
powershell_args : 'Get-PSDrive C | Select-Object Free'
ps_encoded_args: NO
only_show_cmd_output: YES
</custom_item>
</check_type>
- 将扩展名为
.audit
的文件保存到您的系统中,并使用安装过程中创建的凭据登录 Nessus:
- 打开“策略”选项卡,然后单击“使用高级扫描模板创建新策略”。填写所需的详细信息,如保单名称和说明:
- 导航到符合性部分,并在过滤器符合性搜索栏中搜索自定义窗口:
- 选择上载自定义 Windows 审核文件选项:
- 单击添加文件并上载您创建的审核文件:
- 要执行合规性审核,您必须输入 Windows 凭据。导航到凭据部分并单击 Windows 选项:
-
保存策略并导航到“我的扫描”页面以创建新扫描。
-
导航到“用户定义的策略”部分,并选择我们创建的自定义 Windows 审核策略:
- 填写所需的详细信息,如扫描名称和受影响的主机,然后启动扫描:
这些自定义审核文件可用于审核多个平台,因为 NASL 支持多个平台的关键工作和属性,并且这些值是自定义的,特定于这些平台的配置。这允许用户轻松创建审核文件,并根据其需求和基线对其进行自定义,以执行配置审核并识别这些差距。以下是 Nessus 支持执行配置审核的平台列表:
- 窗户:
- Windows 2003 服务器
- Windows 2008 服务器
- Windows Vista
- 视窗 7
- Unix:
- Solaris
- Linux
- FreeBSD/OpenBSD/NetBSD
- HP/UX
- 艾克斯
- 马科斯 X
- 其他平台:
- 思科
- 监控与数据采集****