Payload Artifact 和反病毒规避
Strategic Cyber
责任有限公司会定期回答有关规避的问题。
Cobalt Strike
是否能够绕过
AV
产品?它能绕过哪些 AV
产品?它多久检查一次? Cobalt Strike 默认的
Artifact
可能会被大多数终端安全解决方案拦截。规避不是
Cobalt Strike
默认产品的目的。但是 Cobalt Strike
确实提供了灵活性。
作为操作员可以改变
Cobalt Strike
在它的工作流中使用的可执行文件、
DLL
、
applet
和脚本模板。 你也可以以多种不同的格式导出 Cobalt Strike
的
Beacon payload
,这样可以与用于帮助规避的第三方工具一起工作。
传统的反病毒产品使用签名来识别已知的恶意程序。如果我们把一些被标记的恶意
shellcode
注入一个 可执行文件,那么反病毒产品会识别 shellcode
并把此可执行文件标为恶意。 为了打败这种检测,攻击者通常会以某种方式混淆 shellcode
并将其放入二进制文件中。这种混淆过程
会打败使用简单的字符串搜索来识别恶意代码的反病毒产品。很多反病毒产品会进行更严苛的检测。这些反病毒产品模拟一个可执行程序在一个虚拟沙盒中的执行。 在执行的每个模拟步骤中,这个反病毒产品会检测在模拟的进程空间中的已知的恶意部分。如果已知的 恶意部分出现,反病毒产品会把这个可执行文件或 DLL
标记为恶意的。这项技术打败了许多编码器和程序包,它们试图去从基于签名的反 AV
产品中隐藏已知的恶意部分。
Cobalt Strike
对此的应对策略是很简单的。这个反病毒沙盒有一些限制。这不是完整的虚拟机。有一些反病毒沙盒不会模拟的系统行为。这个 Artifact
工件集是一些可执行文件和
DLL
模板的集合,这些可执行文件和 DLL
模板依赖于一些反病毒产品不会模拟来还原二进制中的
shellcode
的行为。
一些技术
生成可执行文件和
DLL
,这些可执行文件和 DLL
通过命名管道为
shellcode
服务,通过命名管道传输
shellcode
。如果反病毒沙箱不模拟命名管道,就发现不了那些已知的恶意 shellcode
Veil 规避框架
Veil
是一个流行的框架,用于生成可以通过某些防病毒产品的可执行文件。你可以使用
Veil
来为 Cobalt Strike 的
payload
生成可执行文件。通过
Attacks
→
Packages
→
Payload Generator
。
选择你想要为其生成可执行文件的监听器。选择
Veil
作为输出类型,按
Generate
按钮来保存输出
文件。
启动
Veil
规避框架并选择你想要使用的技术。
Veil
最终会询问关于
shellcode
的生成选项。选择
Veil的“
使用自定义
shellcode”
的选项,把
shellcode
粘贴在
Cobalt Strike
的
payload
生成器使用的文件内容中。按 Enter
键然后你就会获得一个新鲜出炉的
Veil
制作的可执行文件。
后渗透
Beacon 控制台
在一个
Beacon
会话上单击右键并选择
interact
(交互)来打开
Beacon
的控制台。这个控制台是你的Beacon
会话的主用户接口。这个
Beacon
控制台允许你看哪个任务被发送到了
Beacon
和
Beacon何时下载任务。这个 Beacon
控制台也是命令输出和展示其他信息的地方。
在
Beacon
控制台的输入和输出之间是一个状态栏。这个状态栏包含关于当前会话的信息。在它的默认 配置中,这个状态栏显示目标的 NetBIOS
名称,用户名和 当前会话的
PID
,以及
Beacon
最近一次连到团队服务器的时间。
向
Beacon
发出的每个命令,无论是通过
GUI
还是控制台,都会在此窗口中显示出来。如果一个队友发送了一个命令,Cobalt Strike
会在命令前显示他们的昵称。
Beacon 菜单
在一个
Beacon
上或在一个
Beacon
的控制台内单击右键来获取
Beacon
菜单。这和与用来打开
Beacon
控制台(点击菜单中的
Interact
)相同的菜单.
- Access 子菜单包含对凭据的操作和提权在内的一些选项。
- Explore 子菜单包含信息探测和与目标系统交互的一些选项。
- 通过 Pivoting 子菜单你可以通过一个 Beacon 来配置工具来搭建流量隧道。
- 通过 Session 菜单你可以管理当前 Beacon 会话。
异步和交互式操作
请注意,
Beacon
是一个异步的
payload
。命令不会立即执行。每个命令都会先进入队列。当
Beacon 连接到你的时候。它会下载这些命令并挨个执行它们。此时,Beacon
会将所有的输出报告给你。如果 输入有误,使用 clear
命令来清理当前
Beacon
的命令队列。默认情况下,Beacon
每
60
秒连接到你一次。你可以使用
Beacon
的
sleep
命令修改这个时间设置。 使用 sleep
接着一个秒数来指定
Beacon
连接到你的频率。你也可以指定第二个参数,这个参数必须 是一个0
到
99
之间的数字。这个数字就是抖动因子。
Beacon
会根据你指定的抖动因子的百分比随机变 化下次连接到你的时间。比如, sleep 300 20
这条命令,会使得
Beacon
睡眠
300
秒,另外有
20% 的抖动因子。这意味着 Beacon
在每次连接到你之后会随机睡眠
240 - 300
秒
会话传递
Cobalt Strike
的
Beacon
最初是一个稳定的生命线,让你可以保持对受害主机的访问权限。从一开始, Beacon 的主要目的就是向其他的
Cobalt Strike
监听器传递权限。 使用 spawn
命令来为一个监听器派生一个会话。此
spawn
命令接受一个架构(如:
x86
,
x64
)和一 个监听器作为其参数。 默认情况下, spawn 命令会在
rundll32.exe
中派生一个会话。管理员通过查看告警可能会发现rundll32.exe 定期与
Internet
建立连接这种异常现象。为了更好的隐蔽性,你可以找到更合适的程序 (如 Internet Explorer
) 并使用
spawnto
命令来说明在派生新会话时候会使用
Beacon
中的哪个程 序。
spawnto
命令会要求你指明架构(
x86
还是
x64
)和用于派生会话的程序的完整路径。单独输入
spawnto
命令然后按
enter
会指示
Beacon
恢复至其默认行为。
输入
inject
+
进程
id +
监听器名来把一个会话注入一个特定的进程中。使用
ps
命令来获取一个当前系统上的进程列表。使用 inject [pid] x64
来将一个
64
位
Beacon
注入一个
64
位进程中.spawn 和
inject
命令都将一个
payload stage
注入进内存中。如果
payload stage
是
HTTP
、 HTTPS 或
DNS Beacon
并且它无法连接到你,那么你将看不到一个会话。如果
payload stage
是一个
绑定的
TCP
或
SMB
的
Beacon
,这些命令会自动地尝试连接到并控制这些
payload
。
使用
dllinject [pid]
来将一个反射性
DLL
注入到一个进程中。
使用
shinject [pid] [
架构
] [/
路径
/.../file.bin]
命令来从一个本地文件中注入
shellcode
到一
个目标上的进程中。
使用
shspawn [
架构
] [/
路径
/.../file.bin]
命令会先派生一个新进程(这个新进程是 spawn to
命令指定的可执行文件),然后把指定的
shellcode
文件(
file.bin
)注入到这个进程中。
使用
dllload [pid] [c:\
路径
\...\file.dll]
来在另一个进程中加载磁盘上的
DLL
文件。
备用父进程
使用
ppid [pid]
命令来为你的
Beacon
会话运行的程序分配一个备用父进程。这是一种使你的活动 目标上的正常行为融合的方法。当前 Beacon
会话必须有调用备用父进程的权限并且最好是备用父进程和你的 Beacon
存在相同的桌面会话中。输入单独一个不带任何参数的
ppid
命令,会让
Beacon
使用其本身的进程作为父进程、不使用伪造的父进程。
runu
命令将使用另一个进程作为父进程来执行命令,这个命令将以其备用父进程的权限和桌面会话来执行命令。当前的 Beacon
会话必须有到备用父进程的完整权限。
spawnu
命令会派生一个临时的进程,作为一个特定进程的子进程,并将一个 Beacon payload stage
注入进此进程。
spawnto
的值控制用哪一个程序来作为临时进程。
伪造进程参数
不是所有的命令都能做参数伪造,每个会话都有一个内部列表,里面存着可以用来做参数伪造的命令。 当 Beacon
运行一个匹配列表的命令时,
Beacon
会:
- 1. 以挂起状态启动匹配的进程(使用伪参数)
- 2. 使用实参更新进程内存
- 3. 恢复进程
这样做的结果是,记录进程启动的主机检测程序将看到假参数。这有助于掩盖你的真实活动。
使用
argue [
命令
] [
假参数
]
来将命令加入到此内部列表中。
[
命令
]
部分可能会包含环境变量
argue [command]
命令来从此内部列表中移除一个命令,
单独的
argue
命令会在列出这个内部列表中的命令。 进程匹配逻辑是精确的。如果 Beacon
尝试启动
net.exe
程序,它不会从它的内部列表中匹配
net
、 NET.EXE,或
c:\windows\system32\net.exe
。它将仅仅匹配
net.exe
。 x86 Beacon 只能伪造
x86
子进程中的参数。同样的,
x64 Beacon
仅仅能伪造
x64
子进程中的参数。 实际参数被写入保存着伪参数的内存空间。如果实际参数比伪参数长,命令启动就会失败
子进程中阻止(非微软签名的)DLL 加载
使用
blockdlls start
来请求
Beacon
使用一个二进制签名策略启动子进程,该策略会从进程空间中
阻止所有非微软的
DLL
。使用
blockdlls stop
来禁用此行为。这个特性要求
Windows 10
。
上传和下载文件
download
命令会下载请求的文件。你不需要在一个带有空格的文件名前后打引号。
Beacon
被设计为低速提取数据。在每次连接到团队服务器时,Beacon
会下载它的任务要求获取的每一个文件的固定大小的块。这个块的大小取决于 Beacon
当前的数据通道。
HTTP
和
HTTPS
通道会拉取
512kb
的数据块.
输入
downloads
命令来查看当前
Beacon
正在进行的文件下载列表。使用
cancel
命令加一个文件名 来取消正在进行的一个下载任务。你可以在你的 cancel
命令中使用通配符来一次取消多个文件下载任务.
在
Cobalt Strike
中通过
View
→
Downloads
来查看你的团队迄今为止已下载的文件 。此选项卡中仅显示完成的下载内容。下载的文件被存储在团队服务器中。要把文件传回到你的系统上,先高亮选中这些文件,然后点击 Sync Files
(同步文件)。
Cobalt Strike
会将选择的文件下载到你的系统上你指定的文件夹下。
upload
命令将上传一个文件到目标主机上。
当你上传一个文件时,有时你会想改变此文件的时间戳来使其混入同一文件夹下的其他文件中。使用 timestomp 命令来完成此工作。
timestomp
命令会将一个文件的修改属性访问属性和创建时间数据与另一个文件相匹配
文件浏览器
Beacon
的文件浏览器为你提供了一个探索受害系统上的文件的机会。通过
[Beacon]
→
Explore
→ File Browser 来打开文件浏览器。 文件浏览器会请求 Beacon
的当前工作目录列表,当结果返回之后,文件浏览器就会显示具体的文件目 录。 文件浏览器的左侧是一棵文件树,该树将已知的驱动器和文件夹组织到一个视图中,文件浏览器的右侧展示了当前文件夹的内容。
每个文件浏览器都会缓存接收到的文件夹列表。彩色文件夹表示该文件夹的内容位于此文件浏览器的缓 存中。你可以导航到缓存的文件夹而不生成一个新的文件列表请求。按 Refresh
会要求
Beacon
更新当 前内容夹。
一个深灰色的文件夹表示该文件夹的内容不在此文件浏览器缓存中。点击树中的一个文件夹来使
Beacon
生成一个任务来列出此文件夹下的内容(并更新它的缓存)。双击右侧当前文件夹视图中的深灰色文件夹可以执行相同操作。 要转到一个文件夹,点击右侧详细文件视图中的文件夹按钮,该按钮在文件路径旁边。如果父文件夹在 该文件浏览器的缓存中,你就会立刻看到结果。如果父文件夹不在文件浏览器的缓存中,浏览器就会生 成一个任务来列出父文件夹的内容。 在一个文件上单击右键来下载或删除它。