热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

如何滥用DCOM实现横向渗透

一、前言在本文中我们讨论了如何利用DCOM实现横向渗透以及执行载荷,主要原理是找到特定的DCOM注册表键值,这些键值指向“远程”主机上并不存在一些二进制程序。如果\targetadmin$system

一、前言

在本文中我们讨论了如何利用DCOM实现横向渗透以及执行载荷,主要原理是找到特定的DCOM注册表键值,这些键值指向“远程”主机上并不存在一些二进制程序。如果\targetadmin$system32目录中不存在mobsync.exe,那么这种方法很有可能行之有效,而这刚好是Windows 2008 R2以及Windows 2012 R2操作系统上的默认设置。如果我们具备目标主机的管理员权限(通过PowerShell接口),那么我们可以执行如下操作:

- dir \targetsystem32mobsync.exe //该文件应该不存在
- copy evil.exe \targetadmin$system32mobsync.exe
- [activator]::CreateInstance([type]::GetTypeFromCLSID("C947D50F-378E-4FF6-8835-FCB50305244D","target"))

在本文中,我们将回顾一种“新颖的”、“简单”的方法,通过滥用DCOM(Distributed Component Object Model)实现远程载荷执行以及横向渗透。一般来说,这种技术相对比较原始,但可以作为其他常用的已知方法的替代方案。本文的主要内容包括:

1、简单介绍DCOM横向渗透技术(附带参考资料);

2、本文的研究动机;

3、“并不复杂的”DCOM横向渗透方法;

4、建议防御方如何检测/防御此类攻击。

 

二、DCOM背景

在过去的一年半时间内,已经有许多人详细介绍了DCOM横向渗透技术。Matt Nelson(enigma0x3)身先士卒,发表了一系列非常棒的文章,介绍了利用MMC20.ApplicationShellWindowsShellBrowserWindowExcel.Application以及Outlook.Application等D/COM对象的一些横向渗透技术。Philip Tsukerman(@PhilipTsukerman)之前发现并提出了非常有趣的WMI横向渗透技术,也发表了一篇优秀的文章,介绍了DCOM功能的相关背景、横向渗透技术以及防御建议等。几个月之前,我发表了一篇文章,介绍了如何滥用ShellWindowsShellBrowserWindowNavigate以及Navigate2函数,启动可执行文件或者“url”文件,在远程主机上执行攻击载荷。在继续阅读本文之前,我强烈建议大家阅读一下这些资料。

请注意:本文提到的这些想法以及样例可能对资深攻击者来说可能有点小儿科,然而,我相信许多睿智的攻击者会基于风险评估来衡量什么才是最好的操作,因此他们很有可能不会每次都拿出他们的看家本领、工具、策略以及步骤来实现其预期效果以及/或者目标。因此,这里介绍的技术和方法仍然有其价值所在。

 

三、研究动机

几星期之前,我决定虚拟化处理一台老旧笔记本上的操作系统。转换过程非常痛苦,排除一些故障后(伴随着大量重启操作),我终于成功完成虚拟化,配置了正确的虚拟化驱动以及工具。然而,我想研究下这个决定是否足够安全,物理主机上有没有遗留的一些“有趣”的东西。我没有什么规章法则可以遵循,也没有兴趣去做数字取证。我选择好好研究一下注册表,并且很快就找到了一个有趣的CLSID注册表路径,该路径引用了一个二进制文件,该文件很可能是老笔记本上为某个(驱动)程序提供实用功能或者诊断功能的一个程序:

通过简单的DIR命令,我们就知道磁盘上并不存在C:WINDOWSsystem32IntelCpHDCPSvc.exe这个程序:

首先映入我脑海的是四个想法:

1、我并不知道IntelCpHDCPSvc.exe究竟是什么;

2、卸载程序并没有完全卸载老软件的所有注册表项;

3、我应该更仔细地检查和信任主机上那些软件(这又是另一个话题了);

4、这看起来像是一个DCOM应用(我们可以使用Get-CimInstance Win32_DCOMApplication查询语句验证这一点):

经过一番Google后,我发现IntelCpHDCPSvc.exe与Intel的内容保护HDCP服务(Intel Content Protection HDCP Service)有关,但对我而言最有意思的是,LocalServer32以及InProcServer32这两个注册表项指向了本应该存在的二进制文件路径,这些不存在的文件可能会带来一些安全隐患。由于实际攻击中我们很少看到IntelCpHDCPSvc的身影,因此我想看看能否找到机会,利用Microsoft Windows Server上已有的、“被遗忘的”DCOM做些坏事。

 

四、 利用“被遗忘的”DCOM进行横向渗透



定位二进制

第一步就是在DCOM应用中找到合适的二进制文件路径。为了完成这个任务,我编写了非常粗糙的PowerShell命令,从打上完整补丁的Windows Server 2012上获取LocalServer32可执行文件以及InProcServer32 DLL信息,具体命令如下:

gwmi Win32_COMSetting -computername 127.0.0.1 | ft LocalServer32 -autosize | Out-String -width 4096 | out-file dcom_exes.txt
gwmi Win32_COMSetting -computername 127.0.0.1 | ft InProcServer32 -autosize | Out-String -width 4096 | out-file dcom_dlls.txt

格式化输出结果并删除冗余信息后,我们可以从Windows 2012主机上得到如下信息:

将两个结果文件拼接起来,删除某些参数字符串后,我们可以使用如下命令测试这些文件在磁盘上的存活情况:

$file = gc C:Userstestdesktopdcom_things.txt
foreach ($binpath in $file) {
$binpath
cmd.exe /c dir $binpath > $null
}

很快就能得到结果:

%SystemRoot%system32mobsync.exe
File Not Found

这个文件的确不存在,如下图所示:

根据How-To Geek的描述,mobsync是“Microsoft同步中心以及脱机文件功能的一个进程”。了解这一点非常好,但因为其他原因,mobsync.exe又开始变得非常有趣起来……


验证AppID以及CLSID

之前我并没有很好地掌握枚举对应的AppID以及CLSID的方法,因此我选择浏览注册表来查找这些信息,如下图所示:

具体一点,在下一阶段中,我们需要[C947D50F-378E-4FF6-8835-FCB50305244D]这个CLSID来创建DCOM对象的实例。

 

五、远程载荷执行/横向渗透

现在我们已经找到了候选的D/COM对象,可以尝试下实现远程载荷执行。在继续处理之前,我们首先要注意满足如下条件:

1、为了远程实例化DCOM对象,我们必须拥有正确的权限,只要具备管理员权限就可以。

2、为了最大化利用载荷执行的价值,我们将以域环境为例进行渗透。在这个例子中,我们将假设自己已经取得了域管理员凭据,然后从Windows 10客户端出发,完成Windows 2012域控制器(DC)上的远程执行任务。

3、其他各种天时地利人和因素……

首先有请我们的恶意载荷登场,并且确保目标系统上并不存在mobsync.exe(添加的某些角色或者管理员的某些操作可能会影响这个条件):

dir C:evil.exe
dir \acmedcadmin$system32mobsync.exe

非常好!目标上并不存在mobsync.exe,并且我们的evil.exe载荷成功规避了各种类型的主机防御机制,因此我们可以将其拷贝到DC上:

copy C:evil.exe \acmedcadmin$system32mobsync.exe
dir \acmedcadmin$system32mobsync.exe

由于我们的二进制程序对DCOM并不“感冒”,因此实例化过程应该会以失败告终,但还是可以成功触发载荷。我们可以来试一下:

[activator]::CreateInstance([type]::GetTypeFromCLSID("C947D50F-378E-4FF6-8835-FCB50305244D","target"))

在Windows 10这台域主机上情况如下:

在Windows 2012域控上情况如下:

非常好!“恶意的”mobsync.exe成功执行了我们的“恶意”notepad.exe载荷!

 

六、附加说明及其他“简单”的方法

对于Windows Server 2008来说这种技术也可能有效,因为默认情况下mobsync.exe并没有位于system32目录中。然而,Windows 2016服务器上system32目录中已经存在mobsync.exe

还有其他一些方法有可能会达到类似的DCOM横向渗透效果。前面提到过,系统中有大量对DCOM“感冒”的二进制程序。比较简单的一种方法是(临时性地)“替换”其中某个程序,然后执行类似的调用操作。劫持远程主机上的mshta.exe在实际环境中可能也是一种方法,然而操控远程文件系统(比如文件的复制/移动操作、远程文件权限等)是非常令人头疼的事情,并且也会增加被检测到的风险。

另一种(比较乏味的)方法就是远程操控注册表,修改DCOM程序所对应的CLSID LocalServer32键值,将其指向磁盘上的另一个位置或者远程文件共享。与前一种方法类似,这种方法涉及到注册表权限以及修改操作,也会引入被检测到的额外风险。

对DCOM“感冒”的第三方应用、程序以及实用工具可能提供了一些机会,让我们定位“被遗忘的”DCOM路径,实现类似的横向渗透效果。IntelCpHDCPSvc.exe就是一个典型的例子,但可能并不是最好的选项。然而对某些单位来说,每隔几年就购买并布置全新的、干净的计算机设备是非常正常的一件事情。在设备“刷新”过程中,计算机需要进行维护、打补丁以及升级。删除特定的实用软件以及老的设备驱动后,计算机上很可能会残留一些东西(比如注册表中的DCOM配置信息),这也会给攻击者铺开横向渗透攻击路径。有恒心有毅力的攻击者可能会孜孜不倦地盯着这件事情。

其他版本的Windows上(包括客户端设备)可能会残留对某些DCOM程序的引用,如有需要大家可以尽情探索。

 

七、防御建议



厂商

1、确保卸载实用软件时,删除遗留的DCOM注册表项;

2、不要在注册表中创建指向并不存在的二进制文件的DCOM程序路径。


网络防御方

1、总的说来,防御方应该认真阅读@enigma0x3以及@PhilipTsukerman在博客中给出的建议,针对性地捕捉相关IOC;

2、想使用这些DCOM方法(通常)需要远程主机的特权访问。请保护具备高级权限的域账户,避免本地主机账户复用密码凭据;

3、请确保部署了深度防御控制策略、基于主机的安全产品并监控主机,以检测/阻止可以活动。启用基于主机的防火墙可以阻止RPC/DCOM交互及实例化操作;

4、监控文件系统(以及注册表),关注新引入的元素以及改动;

5、监控环境中可疑的PowerShell操作。如有可能,请强制启用PowerShell的“Constrained Language Mode(约束语言模式)”(这对特权账户来说可能有点难);

6、在DCOM调用“失败”时,目标主机上的System日志中会生成ID为10010的事件(Error, DistributedCOM),其中包含CLSID信息。

 

八、总结

感谢大家阅读本文,如有意见和建议,欢迎随时联系我。


推荐阅读
  • 全面介绍Windows内存管理机制及C++内存分配实例(四):内存映射文件
    本文旨在全面介绍Windows内存管理机制及C++内存分配实例中的内存映射文件。通过对内存映射文件的使用场合和与虚拟内存的区别进行解析,帮助读者更好地理解操作系统的内存管理机制。同时,本文还提供了相关章节的链接,方便读者深入学习Windows内存管理及C++内存分配实例的其他内容。 ... [详细]
  • Python中sys模块的功能及用法详解
    本文详细介绍了Python中sys模块的功能及用法,包括对解释器参数和功能的访问、命令行参数列表、字节顺序指示符、编译模块名称等。同时还介绍了sys模块中的新功能和call_tracing函数的用法。推荐学习《Python教程》以深入了解。 ... [详细]
  • FIN7后门工具伪装成白帽工具进行传播
    fin7,后门,工具,伪装,成,白, ... [详细]
  • 1、PLSQLDeveloper记住登陆密码在使用PLSQLDeveloper时,为了工作方便希望PLSQLDeveloper记住登录Oracle的用户名和密码&#x ... [详细]
  • 本文讨论了在Windows 8上安装gvim中插件时出现的错误加载问题。作者将EasyMotion插件放在了正确的位置,但加载时却出现了错误。作者提供了下载链接和之前放置插件的位置,并列出了出现的错误信息。 ... [详细]
  • 如何在服务器主机上实现文件共享的方法和工具
    本文介绍了在服务器主机上实现文件共享的方法和工具,包括Linux主机和Windows主机的文件传输方式,Web运维和FTP/SFTP客户端运维两种方式,以及使用WinSCP工具将文件上传至Linux云服务器的操作方法。此外,还介绍了在迁移过程中需要安装迁移Agent并输入目的端服务器所在华为云的AK/SK,以及主机迁移服务会收集的源端服务器信息。 ... [详细]
  • 本文介绍了win7系统休眠功能无法启动和关闭的解决方法,包括在控制面板中启用休眠功能、设置系统休眠的时间、通过命令行定时休眠、手动进入休眠状态等方法。 ... [详细]
  • 如何用JNI技术调用Java接口以及提高Java性能的详解
    本文介绍了如何使用JNI技术调用Java接口,并详细解析了如何通过JNI技术提高Java的性能。同时还讨论了JNI调用Java的private方法、Java开发中使用JNI技术的情况以及使用Java的JNI技术调用C++时的运行效率问题。文章还介绍了JNIEnv类型的使用方法,包括创建Java对象、调用Java对象的方法、获取Java对象的属性等操作。 ... [详细]
  • 本文介绍了使用哈夫曼树实现文件压缩和解压的方法。首先对数据结构课程设计中的代码进行了分析,包括使用时间调用、常量定义和统计文件中各个字符时相关的结构体。然后讨论了哈夫曼树的实现原理和算法。最后介绍了文件压缩和解压的具体步骤,包括字符统计、构建哈夫曼树、生成编码表、编码和解码过程。通过实例演示了文件压缩和解压的效果。本文的内容对于理解哈夫曼树的实现原理和应用具有一定的参考价值。 ... [详细]
  • 手把手教你使用GraphPad Prism和Excel绘制回归分析结果的森林图
    本文介绍了使用GraphPad Prism和Excel绘制回归分析结果的森林图的方法。通过展示森林图,可以更加直观地将回归分析结果可视化。GraphPad Prism是一款专门为医学专业人士设计的绘图软件,同时也兼顾统计分析的功能,操作便捷,可以帮助科研人员轻松绘制出高质量的专业图形。文章以一篇发表在JACC杂志上的研究为例,利用其中的多因素回归分析结果来绘制森林图。通过本文的指导,读者可以学会如何使用GraphPad Prism和Excel绘制回归分析结果的森林图。 ... [详细]
  • 在加载一个第三方厂商的dll文件时,提示“找不到指定模块,加载失败”。由于缺乏必要的技术支持,百思不得期间。后来发现一个有用的工具 ... [详细]
  • Mono为何能跨平台
    概念JIT编译(JITcompilation),运行时需要代码时,将Microsoft中间语言(MSIL)转换为机器码的编译。CLR(CommonLa ... [详细]
  • 如何搭建服务器环境php(2023年最新解答)
    导读:本篇文章编程笔记来给大家介绍有关如何搭建服务器环境php的相关内容,希望对大家有所帮助,一起来看看吧。本文目录一览:1、怎么搭建p ... [详细]
  • Windows 11 Insider Preview Build 22621.730/22623.730(KB5017385)发布!
    今天微软官方将Windows11InsiderPreviewBuild22621.730和Build22623.730(KB5017385)发布到Bet ... [详细]
  • Microsoft Dynamics CRM 2013 电子邮件路由器安装程序 介绍
    要安装电子邮件路由器和规则部署向导,运行MicrosoftDynamicsCRM电子邮件路由器安装程序.若要安装电子邮件路由器和规则部署向导,请按照本节 ... [详细]
author-avatar
真实的灿灿1978
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有