CVE-2019-1388 – hhupd.exe
Windows 证书对话框 (hhupd.exe) 中存在权限提升漏洞,允许攻击将权限提升至 SYSTEM,已记录为 CVE-2019-1388。
hhupd.exe 被称为 HTML Help 1.32 Update,由 Microsoft Corporation 开发。
此 CVE 影响许多 Windows 版本,包括 Windows 7、8、10 至 1903 版本以及服务器 2008 – 2019 至 1903 版本
现在我们要做的就是单击“页面”按钮,然后单击“另存为”.
在 Windows 10 上,有一个齿轮图标取代了“页面”选项卡。
就像我们之前看到的 Procmon 突破一样,我们只需要在 TOP 搜索栏中输入“cmd.exe”,它就会突破 IE 并产生一个 SYSTEM shell。
Windows 证书对话框 (hhupd.exe) 中存在权限提升漏洞,允许攻击将权限提升至 SYSTEM,已记录为 CVE-2019-1388。
hhupd.exe 被称为 HTML Help 1.32 Update,由 Microsoft Corporation 开发。
此 CVE 影响许多 Windows 版本,包括 Windows 7、8、10 至 1903 版本以及服务器 2008 – 2019 至 1903 版本
现在我们要做的就是单击“页面”按钮,然后单击“另存为”.
在 Windows 10 上,有一个齿轮图标取代了“页面”选项卡。
就像我们之前看到的 Procmon 突破一样,我们只需要在 TOP 搜索栏中输入“cmd.exe”,它就会突破 IE 并产生一个 SYSTEM shell。
利用 CVE-2021-1675.ps1 漏洞利用打印后台处理程序
在机器上获得了 PS1 脚本,就可以将其复制到当前 HTTP 服务器运行的同一目录中。这将允许直接下载到目标的内存中。
有了工作目录中的 PowerShell 脚本,我们现在可以使用以下echo命令将以下函数附加到脚本的底部:echo Invoke-Nightmare -DriverName '"Xerox" -NewUser "pwnt" -NewPassword "Password123"' >> CVE-2021-1675.ps1
此命令将创建一个名为pwnt 的新用户,密码为Password123,然后脚本会将该用户添加到本地管理员组。
在脚本底部硬编码命令将允许它在使用 IEX 将脚本下载到内存时自动执行。
使用net user命令可以确认当前不存在名为“pwnt”的用户。
脚本执行后,从输出中可以看到漏洞利用程序创建了一个恶意 DLL,该 DLL 创建了指定的用户,然后将其添加到本地管理员组。然后,漏洞利用程序清理并删除该 DLL.
看到 RDP 已打开,可以使用xfreerdp通过 RDP 进入受害者机器,然后使用“以管理员身份运行”打开 cmd 提示符以启用我们的所有权限。
在机器上获得了 PS1 脚本,就可以将其复制到当前 HTTP 服务器运行的同一目录中。这将允许直接下载到目标的内存中。
有了工作目录中的 PowerShell 脚本,我们现在可以使用以下echo命令将以下函数附加到脚本的底部:echo Invoke-Nightmare -DriverName '"Xerox" -NewUser "pwnt" -NewPassword "Password123"' >> CVE-2021-1675.ps1
此命令将创建一个名为pwnt 的新用户,密码为Password123,然后脚本会将该用户添加到本地管理员组。
在脚本底部硬编码命令将允许它在使用 IEX 将脚本下载到内存时自动执行。
使用net user命令可以确认当前不存在名为“pwnt”的用户。
脚本执行后,从输出中可以看到漏洞利用程序创建了一个恶意 DLL,该 DLL 创建了指定的用户,然后将其添加到本地管理员组。然后,漏洞利用程序清理并删除该 DLL.
看到 RDP 已打开,可以使用xfreerdp通过 RDP 进入受害者机器,然后使用“以管理员身份运行”打开 cmd 提示符以启用我们的所有权限。
使用 Bloodhound 枚举“support”帐户
由于无法以该用户身份在 DC 上获得立足点,因此可以使用 bloodhound.py 远程提取域中的所有权利和关系。
我使用以下命令执行了 bloodhound.py,在我的工作目录中创建了 4 个 JSON 文件,这些文件可以输入到 Bloodhound 的 GUI 中。
确认创建了四个 JSON 文件后,可以启动neo4j和bloodhound控制台并将其加载到图形系统中。
进入 Bloodhound 仪表板后,我将四个 JSON 文件上传到 UI。
上传后,可以利用“分析”选项卡下的预建查询来查找有关域的信息,查询是“到达高价值目标的最短路径”查询,它转储了大量信息。
显示了有关已经枚举(组)的svc_backup帐户的信息;
在“出站控制权限”>“一级对象控制”下,我发现当前用户有一个特别有趣的权限。“support”帐户可以更改audit2020帐户的密码。
由于无法以该用户身份在 DC 上获得立足点,因此可以使用 bloodhound.py 远程提取域中的所有权利和关系。
我使用以下命令执行了 bloodhound.py,在我的工作目录中创建了 4 个 JSON 文件,这些文件可以输入到 Bloodhound 的 GUI 中。
确认创建了四个 JSON 文件后,可以启动neo4j和bloodhound控制台并将其加载到图形系统中。
进入 Bloodhound 仪表板后,我将四个 JSON 文件上传到 UI。
上传后,可以利用“分析”选项卡下的预建查询来查找有关域的信息,查询是“到达高价值目标的最短路径”查询,它转储了大量信息。
显示了有关已经枚举(组)的svc_backup帐户的信息;
在“出站控制权限”>“一级对象控制”下,我发现当前用户有一个特别有趣的权限。“support”帐户可以更改audit2020帐户的密码。
通过 RDP 实现持久系统访问
为了通过 RDP 建立持久性,将使用rdesktop立即跳转到 SYSTEM shell,而无需输入凭据!为此,将利用名为utilman.exe的内置工具作为建立持久后门的手段。
需要更改 HKLM 注册表项或 C:\Windows\System32 中的 utilman.exe,因此我们需要提升权限来设置我们的持久性。
此时,utilman 已设置好,当单击“轻松访问”时,它会生成一个 SYSTEM shell;但是,我们还需要进行一项配置,以便我们可以通过 RDP 获取 Windows 的登录屏幕。
可以使用rdesktop进入 Windows 的登录屏幕,但前提是计算机已禁用“要求计算机使用网络级别身份验证进行连接”,而现代 Windows 计算机上默认启用此功能。
可以绕过这个问题并通过注册表禁用网络级别的身份验证,这允许我们连接到 RDP 而无需提供用户/密码组合进行“预身份验证”。
现在,所需的注册表项已被修改,以使此攻击起作用,我们可以使用以下命令使用rdesktop获取 SYSTEM shell权限
为了通过 RDP 建立持久性,将使用rdesktop立即跳转到 SYSTEM shell,而无需输入凭据!为此,将利用名为utilman.exe的内置工具作为建立持久后门的手段。
需要更改 HKLM 注册表项或 C:\Windows\System32 中的 utilman.exe,因此我们需要提升权限来设置我们的持久性。
此时,utilman 已设置好,当单击“轻松访问”时,它会生成一个 SYSTEM shell;但是,我们还需要进行一项配置,以便我们可以通过 RDP 获取 Windows 的登录屏幕。
可以使用rdesktop进入 Windows 的登录屏幕,但前提是计算机已禁用“要求计算机使用网络级别身份验证进行连接”,而现代 Windows 计算机上默认启用此功能。
可以绕过这个问题并通过注册表禁用网络级别的身份验证,这允许我们连接到 RDP 而无需提供用户/密码组合进行“预身份验证”。
现在,所需的注册表项已被修改,以使此攻击起作用,我们可以使用以下命令使用rdesktop获取 SYSTEM shell权限
使用 PsExec 成为本地系统帐户
如果您是使用 Specops Deploy 的管理员,您可能有过以下经历:当您在本地计算机上尝试部署应用程序时,可以毫无问题地部署它,但当您尝试部署它时,似乎无法让它工作。这篇博客文章可能会对您的问题有所启发。
使用 Specops Deploy 部署应用程序时,本地系统是执行安装的帐户。为了确保您的应用程序以与 Specops Deploy App 完全相同的方式安装,您需要充当本地系统帐户。为此,我推荐使用 Sysinternals 的一款名为PsExec.exe的小工具
从 PsTools解压内容并将 PsExec.exe 复制到 C:\Windows\System32
以管理员身份打开命令提示符并输入以下命令:
PsExec.exe -s -i cmd.exe
复制
通过使用 PsExec.exe,您将在系统上下文中打开新的命令提示符,并且执行所有操作的帐户将是本地系统帐户。这是 Specops Deploy App 在安装应用程序时使用的相同帐户。
如果您是使用 Specops Deploy 的管理员,您可能有过以下经历:当您在本地计算机上尝试部署应用程序时,可以毫无问题地部署它,但当您尝试部署它时,似乎无法让它工作。这篇博客文章可能会对您的问题有所启发。
使用 Specops Deploy 部署应用程序时,本地系统是执行安装的帐户。为了确保您的应用程序以与 Specops Deploy App 完全相同的方式安装,您需要充当本地系统帐户。为此,我推荐使用 Sysinternals 的一款名为PsExec.exe的小工具
从 PsTools解压内容并将 PsExec.exe 复制到 C:\Windows\System32
以管理员身份打开命令提示符并输入以下命令:
PsExec.exe -s -i cmd.exe
复制
通过使用 PsExec.exe,您将在系统上下文中打开新的命令提示符,并且执行所有操作的帐户将是本地系统帐户。这是 Specops Deploy App 在安装应用程序时使用的相同帐户。
在单台远程计算机上使用 PsExec
要开始使用 PsExec,只需关闭现有的 PowerShell 控制台并启动一个新控制台。如果想在命令提示符中使用它,可以启动命令提示符。只需确保启动提升的会话,因为 PsExec 需要管理员权限才能在远程计算机上运行程序。非管理员也可以在本地使用 PsExec
PsExec 语法
PsExec 的语法相当简单,如下所示:
psexec [ \\computer [ ,computer2 [ ,... ] | file ]][ -u 用户[ -p 密码][ -ns ][ -r 服务名称][ -h ][ -l ][ -s|-e ][ -x ][ -i [会话]][ -c 可执行文件[ -f|-v ]][ -w 目录][ -d ][ - <优先级>][ -an,n,... ] cmd [参数]
如果觉得语法很复杂,随着使用,它会变得清晰。首次运行 PsExec 时,将看到最终用户许可协议 (EULA)
要开始使用 PsExec,只需关闭现有的 PowerShell 控制台并启动一个新控制台。如果想在命令提示符中使用它,可以启动命令提示符。只需确保启动提升的会话,因为 PsExec 需要管理员权限才能在远程计算机上运行程序。非管理员也可以在本地使用 PsExec
PsExec 语法
PsExec 的语法相当简单,如下所示:
psexec [ \\computer [ ,computer2 [ ,... ] | file ]][ -u 用户[ -p 密码][ -ns ][ -r 服务名称][ -h ][ -l ][ -s|-e ][ -x ][ -i [会话]][ -c 可执行文件[ -f|-v ]][ -w 目录][ -d ][ - <优先级>][ -an,n,... ] cmd [参数]
如果觉得语法很复杂,随着使用,它会变得清晰。首次运行 PsExec 时,将看到最终用户许可协议 (EULA)
以 LocalSystem 帐户运行进程
LocalSystem 帐户是预定义帐户,在本地计算机上具有广泛的权限。它由操作系统在安装期间创建。LocalSystem 帐户的安全令牌包括安全标识符“NT AUTHORITY\System”和“BUILTIN\Administrators”。
这些帐户对大多数系统对象具有不受限制的访问权限。在 LocalSystem 帐户下运行进程或程序的优点是该进程将具有对所有系统资源的不受限制的访问权限。
PsExec 最强大的功能之一是它能够使用 LocalSystem 帐户权限启动进程(或程序)。此功能最常被黑客恶意利用。
成功使用 LocalSystem 帐户权限运行恶意进程,要以 LocalSystem 帐户启动进程,可以将 -s 开关与 PsExec 一起使用
开关使 PsExec使用 Web 服务器上的 LocalSystem 帐户启动cmd.exe进程。
此处使用的 /c 开关属于cmd.exe本身,这对于动态运行命令然后终止它非常有用。
想运行单个命令而不必在远程计算机上启动cmd.exe的交互式控制台会话时,它特别有用。不要将其与 PsExec 的 -c 开关混淆,后者对于在默认路径中不存在程序时将程序复制到远程计算机非常有用。
LocalSystem 帐户是预定义帐户,在本地计算机上具有广泛的权限。它由操作系统在安装期间创建。LocalSystem 帐户的安全令牌包括安全标识符“NT AUTHORITY\System”和“BUILTIN\Administrators”。
这些帐户对大多数系统对象具有不受限制的访问权限。在 LocalSystem 帐户下运行进程或程序的优点是该进程将具有对所有系统资源的不受限制的访问权限。
PsExec 最强大的功能之一是它能够使用 LocalSystem 帐户权限启动进程(或程序)。此功能最常被黑客恶意利用。
成功使用 LocalSystem 帐户权限运行恶意进程,要以 LocalSystem 帐户启动进程,可以将 -s 开关与 PsExec 一起使用
开关使 PsExec使用 Web 服务器上的 LocalSystem 帐户启动cmd.exe进程。
此处使用的 /c 开关属于cmd.exe本身,这对于动态运行命令然后终止它非常有用。
想运行单个命令而不必在远程计算机上启动cmd.exe的交互式控制台会话时,它特别有用。不要将其与 PsExec 的 -c 开关混淆,后者对于在默认路径中不存在程序时将程序复制到远程计算机非常有用。
ADMIN$ 共享,这是位于 Windows 设备上的隐藏共享。只有具有管理权限的用户才能访问 ADMIN$。
服务控制管理器 (SCM)位于 Windows 客户端和服务器上。SCM 管理在 Windows 设备上运行的程序和服务。
远程过程调用 (RPC)是一种允许客户端和服务器之间进行通信的网络协议。例如,SCM 有一个接口 (svcctl),其中包含一些操作(例如 CreateServiceW)。操作类似于过程命令。如果 IT 管理员想要执行某个过程(例如在远程服务器上使用 SCM 创建服务),则管理员的客户端会发送 RPC 请求以调用服务器上的特定接口和操作 (svcctl:CreateServiceW)。调用接口和操作的操作会运行该过程。
命名管道:通过服务器消息块 (SMB) 文件共享协议实现对等通信的进程。通常,读取和写入文件操作是通过命名管道发送的。
具有管理权限的用户必须遵循基本工作流程才能启动 PsExec。首先,管理员通过 SMB 将可执行文件 PSEXESVC.exe 上传到远程服务器上的 ADMIN$ 共享 (1)。接下来,管理员发送 RPC 请求以连接到 SCM并启动将运行 PSEXESVC.exe 的服务 (2)。启动 PsExec 服务并在管理员和远程服务器之间建立 SMB 命名管道 (3)。管理员现在可以使用 PsExec 命令行界面发送命令(例如,psexec \remote cmd )并通过命名管道接收输出。
服务控制管理器 (SCM)位于 Windows 客户端和服务器上。SCM 管理在 Windows 设备上运行的程序和服务。
远程过程调用 (RPC)是一种允许客户端和服务器之间进行通信的网络协议。例如,SCM 有一个接口 (svcctl),其中包含一些操作(例如 CreateServiceW)。操作类似于过程命令。如果 IT 管理员想要执行某个过程(例如在远程服务器上使用 SCM 创建服务),则管理员的客户端会发送 RPC 请求以调用服务器上的特定接口和操作 (svcctl:CreateServiceW)。调用接口和操作的操作会运行该过程。
命名管道:通过服务器消息块 (SMB) 文件共享协议实现对等通信的进程。通常,读取和写入文件操作是通过命名管道发送的。
具有管理权限的用户必须遵循基本工作流程才能启动 PsExec。首先,管理员通过 SMB 将可执行文件 PSEXESVC.exe 上传到远程服务器上的 ADMIN$ 共享 (1)。接下来,管理员发送 RPC 请求以连接到 SCM并启动将运行 PSEXESVC.exe 的服务 (2)。启动 PsExec 服务并在管理员和远程服务器之间建立 SMB 命名管道 (3)。管理员现在可以使用 PsExec 命令行界面发送命令(例如,psexec \remote cmd )并通过命名管道接收输出。