深入挖掘易受攻击的Windows服务
Brian Fehrman //
权限提升是威胁行为者在入侵系统后的常见目标。拥有提升的权限可以执行诸如提取本地密码哈希、从内存中转储明文凭据以及在系统上安装持久后门等任务。配置不安全的Windows服务可能是权限提升的一种途径。Windows服务通常在提升用户的上下文中运行。如果您能让服务运行您的恶意程序,您的程序很可能会以提升的权限运行。本博客文章讨论了在尝试利用Windows服务时可能出现的两个障碍。
通过存在应用白名单的不安全服务进行本地Windows权限提升
在本节中,我们简要讨论以下条件的场景:
- 您具有对Windows系统的命令行访问权限
- 您是一个无特权用户
- 您具有覆盖特权服务的权限
- 您具有停止/重新启动第3条中提到的易受攻击服务的权限,或者能够通过其他方法停止它(例如使用空白DLL文件使服务崩溃)
- 您可以重新启动系统
- 系统上启用了应用白名单
换句话说,您已经运行了PowerUp或其他本地权限提升脚本,您发现一个服务存在漏洞,您可以轻松覆盖它……但您的恶意二进制文件无法运行,因为应用白名单(AWS)阻止了它的执行。该怎么办?好吧,我们可以转向Casey Smith和其他人披露的一些巧妙的AWS绕过技术。InstallUtil是一个很好的选择,因为模板相当小,您可以轻松自定义程序以执行任何您想要的特权任务(例如,添加用户并将其设为本地管理员,以SYSTEM身份建立C2连接等),C#编写起来很有趣,可以在本地编译,并且还有许多其他好处。
在这个例子中,我们编写的代码用于:
- 创建一个新的本地用户
- 将新用户添加到本地管理员组
- 再次调用InstallUtil运行第二个自定义C#程序,该程序调用远程服务器并建立Meterpreter C2会话
- 通过InstallUtil运行
代码可以使用通常存在于Windows系统上且通常被AWS信任的csc.exe C#编译工具进行编译。假设您的代码位于C:\Users\Public\runthis.cs,可以使用以下命令编译程序。
|
|
我们如何让这与服务一起工作呢?简单!如果您对服务具有写入权限,您可能有权以普通用户身份重新配置服务的某些属性。Windows服务配置工具sc可用于通过配置服务的binPath属性来告诉易受攻击的服务应该运行哪个二进制文件。binPath属性不仅指向二进制文件,还允许您指定命令行参数,就像您直接从命令行调用它一样。假设服务名为ExploitThisService,您的二进制文件位于C:\Users\Public\shell.exe(如上编译命令所示),那么您可以使用以下服务配置命令:
|
|
就这样!重新启动计算机,瞧,您的可执行文件应该在易受攻击服务运行的相同特权上下文中运行。
通过无停止/重新启动权限的不安全服务进行本地Windows权限提升
让我们考虑另一个与本文第一部分类似的场景。然而,在这个场景中,假设您没有停止或重新启动服务的能力。这种缺失的权限实际上很常见。如果无法停止服务,您将无法覆盖可执行文件,并且可能无法更新配置。在这种情况下我们该怎么办?一种可能性是利用程序在执行时搜索所需加载的DLL的方式。
DLL劫持并不是什么新鲜事。概念是您用自己恶意的DLL覆盖程序所需的DLL。程序运行,调用您的DLL,您的代码被执行。但这不是我们在这里讨论的内容。在这种情况下,我们将使用DLL使服务崩溃,以便我们可以覆盖它。
Windows的一个设计决策规定,默认情况下,程序首先在其当前文件夹中查找任何必要的DLL。硬核Windows用户,如果以下陈述有误,请纠正我:所有Windows程序如果未包含在程序中,将至少需要C:\Windows\System32文件夹中的一个DLL。显然,该文件夹路径是广义使用的,我确信人们会因为我提到它可以被更改而嘲笑我……但您明白意思。
那么我们如何利用这一点呢?简单!您是否曾经尝试运行一个程序,却收到一个愤怒的消息,说找不到所需的DLL?可能……如果程序能找到DLL,但DLL已损坏,会发生什么?或者……如果DLL只是一个空白文件?插入灯泡图形
假设易受攻击的服务位于文件夹C:\VulnService\中。以下PowerShell单行命令将解析C:\Windows\System32\目录,获取所有DLL的名称,创建具有相同名称的空白文件,并将它们放置在C:\VulnService\目录中。
|
|
现在,重新启动系统,然后……砰!服务应该崩溃,您现在应该能够用您选择的恶意二进制文件覆盖它,或者更新服务配置以利用前一节中提到的AWS绕过方法。在尝试运行您的二进制文件之前,不要忘记从文件夹中删除空白DLL,否则它可能会与易受攻击的服务落得同样的下场。
您可能注意到这是要复制的很多DLL,并且您可能不需要所有它们。您是对的!我们目前正在通过运行随机程序和使用DLL检查工具来确定加载了哪些DLL来缩小常用所需DLL的列表。有一些常用DLL的列表,我们已经将列表缩小到大约15个左右。一旦我们满意……或者我们对运行随机程序感到厌倦,就会发布它。
我们将指出,我们提到的DLL搜索行为是默认的;这并不意味着它不能更改。您可以通过参考Microsoft发布的本文中的一些方法来更改DLL搜索行为:https://msdn.microsoft.com/en-us/library/windows/desktop/ms682586(v=vs.85).aspx