可以使用以下键盘快捷键。
Shortcut(快捷键)
Where(在哪使用)
Action
Ctrl+A
console
选择所有文本
Ctrl+F
console
打开查找工具搜索控制台
Ctrl+K
console
清空控制台
Ctrl+Minus
console
减小字体大小
Ctrl+Plus
console
增加字体大小
Ctrl+0
console
重置字体大小
Down
console
显示命令历史记录中的下一个命令
Escape
console
清除编辑框
Page Down
console
向下滚动半个屏幕
Page Up
console
向上滚动半个屏幕
Tab
console
完成当前命令(在某些控制台类型中)
Up
console
显示命令历史记录中的上一个命令
Ctrl+B
everywhere
将当前选项卡发送到 Cobalt Strike 窗口底部
Ctrl+D
everywhere
关闭当前选项卡
Ctrl+Shift+D
everywhere
关闭除当前选项卡之外的所有选项卡
Ctrl+E
everywhere
清空 Cobalt Strike 窗口的底部(撤消 Ctrl+B)
Ctrl+I
everywhere
选择要交互的会话
Ctrl+Left
everywhere
切换到上一个选项卡
Ctrl+O
everywhere
打开首选项
Ctrl+R
everywhere
重命名当前选项卡
Ctrl+Right
everywhere
切换到下一个选项卡
Ctrl+T
everywhere
截取当前选项卡的屏幕截图(结果发送到团队服务器)
Ctrl+Shift+T
everywhere
截取 Cobalt Strike 的屏幕截图(结果发送到团队服务器)
Ctrl+W
everywhere
在独立窗口中打开当前标签页
Ctrl+C
graph
将sessions安排成一个圆圈
Ctrl+H
graph
按层次结构排列seesions
Ctrl+Minus
graph
缩小
Ctrl+P
graph
保存图形显示的图片
Ctrl+Plus
graph
放大
Ctrl+S
graph
将会话排列在堆栈中
Ctrl+0
graph
重置为默认缩放级别
Ctrl+F
tables
打开查找工具过滤表格内容
Ctrl+A
targets
选择所有主机
Escape
targets
清除选定的主机
Tip:默认键盘快捷键的完整列表可从菜单中获得(Help -> Default Keyboard Shortcuts)
#16.2、Beacon命令行为和 OPSEC 注意事项一名优秀的操作员应该了解自己的工具,并知道该工具是如何代表自己实现目标的。本文档介绍了 Beacon 的命令,并提供了有关哪些命令会注入远程进程、哪些命令会生成作业以及哪些命令依赖 cmd.exe 或 powershell.exe 的背景信息。
API-only
以下命令内置于 Beacon 中,并依赖 Win32 API 来实现其目标:
cd、 cp、 connect、 download、 drives、 exit、 getprivs、 getuid、 inline-execute、 jobkill、 kill、 link、 ls、 make_token、 mkdir、 mv、 ps、 pwd、 rev2self、 rm、 rportfwd、 rportfwd_local、 setenv、 socks、 steal_token、 token_store、 unlink、 upload
House-keeping Commands
以下命令内置于 Beacon 中,用于配置Beacon或执行内务处理操作。其中一些命令(例如,清除、下载、帮助、模式、注释)不会生成 Beacon 执行的任务。
argue、 beacon_config、 beacon_gate、 blockdlls、 cancel、 checkin、 clear、 data-store、 downloads、 file_browser、 help、 history、 jobs、 mode dns、 mode dns-txt、 mode dns6、 note、 powershell-import、 ppid、 process_browser、 sleep、 socks stop、 spawnto、 sycall-method、 windows_error_code、 ! (run a command from history)
内联执行(BOF)
以下命令以Beacon内部对象文件的形式实现。Beacon 对象文件是按照特定约定编写的编译C程序,在 Beacon 会话中执行。该功能在运行完成后会被清理。
clipboard、 dllload、 elevate svc-exe、 elevate uac-token-duplication、 getsystem、 jump psexec、 jump psexec64、 jump psexec_psh、 kerberos_ccache_use、 kerberos_ticket_purge、 kerberos_ticket_use、 net domain、 reg query、 reg queryv、 remote-exec psexec、 remote-exec wmi、 runasadmin uac-cmstplua、 runasadmin uac-token-duplication、 timestomp
portscan 和 covertvpn 对话框中的网络接口解析也使用 Beacon 对象文件。
OPSEC建议
Beacon 对象文件的内存由 Malleable C2 的进程注入块的设置控制。
后渗透作业(Fork&Run)
许多 Beacon 后渗透功能会生成一个进程并向该进程注入功能。有些人称这种模式为 fork&run。 Beacon 这样做有多种原因:(i) 如果功能崩溃,这可以保护代理。 (ii) 从历史上看,该方案使x86 Beacon能够无缝启动 x64 后渗透任务。这一点至关重要,因为 Beacon 直到 2016 年才推出 x64 版本。 (iii) 某些功能可以针对特定的远程进程。这允许事后操作在不同的上下文中发生,而无需在其他上下文中迁移或生成有效负载。(iv)这一设计决策可将后渗透执行操作产生的大量干扰(线程、可疑内容)阻挡在 Beacon 进程空间之外。以下是使用这种模式的功能:
Fork&Run Only
covertvpn
execute-assembly
powerpick
Target Explicit Process Only
browserpivot
psinject
Fork&Run or Target Explicit Process
chromedump
dcsync
desktop
hashdump
keylogger
logonpasswords
mimikatz
net *
portscan
printscreen
pth
screenshot
screenwatch
ssh
ssh-key
OPSEC建议
使用 spawnto 命令更改 Beacon 将启动的进程,以执行后渗透作业。默认进程是 rundll32.exe(你可能不希望使用它)。ppid 命令也将更改这些工作运行的父进程。blockdlls 命令将停止某些安全产品的用户空间挂钩。 Malleable C2 的process-inject块可以对进程注入过程进行大量控制。 Malleable C2 的 post-ex 块为这些 postex DLL 本身提供了多个 OPSEC 选项。对于具有显式注入选项的功能,请考虑注入到当前的 Beacon 进程中。Cobalt Strike 可检测并执行不同于远程注入的自我注入。
显式注入不会在后渗透作业完成后清理任何内存。建议注入到可以安全终止的进程中,以清理内存中的artifacts。
进程程执行
这些命令产生一个新进程:
execute
run
runas
runu
OPSEC建议
ppid 命令将更改由execute 运行的命令的父进程。 ppid 命令不会影响 runas 或runu。
进程执行(cmd.exe)
shell 命令依赖于 cmd.exe。使用 run 运行命令,无需cmd.exe即可获得输出结果。
pth 命令依靠 cmd.exe 通过命名管道向 Beacon 传递令牌。传递令牌的命令模式是某些基于主机的安全产品寻找的指标。请阅读《如何使用 Mimikatz 传递哈希值https://blog.cobaltstrike.com/2015/05/21/how-to-pass-the-hash-with-mimikatz/》,了解如何手动执行此操作。
进程执行(powershell.exe)
以下命令启动 powershell.exe 以代表你执行某些任务。
jump
winrm
jump winrm64
powershell
remote-exec winrm
OPSEC建议
使用 ppid 命令更改powershell.exe运行所在的父进程。使用POWERSHELL_COMMAND Aggressor脚本钩子更改 PowerShell 命令及其参数的格式。Jump winrm、jump winrm64和 powershell [导入脚本时] 命令处理的PowerShell内容太大,无法容纳在单个命令行中。为了解决这个问题,这些功能在 Beacon 会话中的独立 Web 服务器上托管一个脚本。使用 POWERSHELL_DOWNLOAD_CRADLE Aggressor Script 钩子来构建用于下载这些脚本的下载平台。
进程注入(远程)
后渗透利用作业命令(前面提到的)也依赖于进程注入。注入远程进程的其他命令是:
dllinject
dllload
execute-dll <pid>
inject
shinject
OPSEC建议
Malleable C2 的process-inject块对进程注入过程提供了很多控制。当 beacon 退出注入的进程时,它不会从内存中清除自身,并且当 stage.sleep_mask 设置为 true 时,它将不再被屏蔽。随着 4.5 版本的发布,大部分堆内存将被清除并释放。如果您不想在渗透期间留下内存痕迹,建议不要退出Beacon。当你完成渗透任务后,建议重新启动所有目标系统以删除任何残留的内存中的artifacts。
进程注入(Spawn&Inject)
这些命令派生一个临时进程并向其中注入payload或 shellcode:
elevate uac-token-duplication
execute-dll
shspawn
spawn
spawnas
spawnu
spunnel
spunnel_local
OPSEC建议
使用spawnto命令设置要使用的临时进程。ppid 命令可为大多数命令设置父进程。blockdlls 命令将阻止某些安全产品的用户态钩子。Malleable C2 的process-inject块可对进程注入过程进行大量控制。Malleable C2 的 post-ex 块提供了调整 Beacon 内存规避选项的选项。
创建服务
以下Beacon内部命令可创建服务(在当前主机或远程目标上)以运行命令。这些命令使用 Win32 API 创建和操作服务。
elevate svc-exe
jump psexec
jump psexec64
jump psexec_psh
remote-exec psexec
OPSEC建议
这些命令默认使用由随机字母和数字组成的服务名称。Aggressor 脚本的PSEXEC_SERVICE 钩子允许你更改这一行为。这些命令中的每一个(jump psexec_psh 和remote-exec psexec 除外)都会生成一个服务 EXE 并将其上传到目标。 Cobalt Strike 的内置服务 EXE 生成 rundll32.exe [不带参数],向其中注入payload,然后退出。这样做是为了立即清理可执行文件。使用 Artifact Kit 可以更改生成的 EXE 的内容和行为。
#16.3、Unicode 支持Unicode 是将世界语言中的字符映射到一个固定的数字或编码点。本文档介绍了 Cobalt Strike 对Unicode文本的支持。
编码
Unicode 是字符到数字(代码点)的映射,但它不是一种编码。编码是通过将单个序列或字节序列映射到该映射中的代码点来为它们分配含义的一致方法。
Java 应用程序在内部使用 UTF-16 编码存储和处理字符。UTF-16 是一种使用两个字节表示常用字符的编码。较罕见的字符用四个字节表示。Cobalt Strike 是一个 Java 应用程序,在内部,Cobalt Strike 能够存储、操作和显示世界上各种书写系统的文本。在 Java 核心平台上,这并不存在真正的技术障碍。
在 Windows 世界中,情况有些不同。Windows 中表示字符的选项可以追溯到 DOS 时代。DOS 程序使用 ASCII 文本和漂亮的方框图字符。将数字 0-127 映射为 US ASCII 和将 128-255 映射为漂亮的方框图字符的常用编码有一个名字。它就是编码 437。编码段 437 有多种变体,将漂亮的方框图字符与特定语言的字符混合在一起。这种编码集合被称为 OEM 编码。如今,每个 Windows 实例都有一个全局 OEM 编码设置。该设置决定了如何解释程序写入控制台的字节输出。要正确解释 cmd.exe 的输出,了解目标的 OEM 编码非常重要。
有趣的事情还在继续。DOS 程序需要方框绘图字符,但 Windows 程序不一定需要。因此,Windows 有 ANSI 编码的概念。这是一个全局设置,就像 OEM 编码一样。ANSI 编码决定了 ANSI Win32 API 如何将字节序列映射到代码点。一种语言的 ANSI 编码放弃了漂亮的方框图字符,转而使用在该编码所设计的语言中有用的字符。编码并不一定局限于将一个字节映射为一个字符。可变长度编码可以用单字节表示最常用的字符,然后用多字节序列表示其他字符。
但 ANSI 编码并不是全部。 Windows API 通常同时具有 ANSI 和 Unicode 变体。 API 的 ANSI 变体接受并解释文本参数,如上所述。 Unicode Win32 API 需要使用 UTF-16 编码的文本参数。
在 Windows 中,可能存在多种编码情况。OEM 编码可以用目标配置语言来表示一些文本。ANSI 编码可以表示更多文本,主要是目标语言配置的文本。UTF-16编码可以包含任何码位。还有 UTF-8,它是一种可变长度编码,对 ASCII 文本来说空间效率高,但也可以包含任何码位。
Beacon
Cobalt Strike 的 Beacon 会报告目标的 ANSI 和 OEM 编码,作为会话元数据的一部分。Cobalt Strike 会根据需要,使用这些值将文本输入编码为目标编码。Cobalt Strike 还会根据需要,使用这些值对目标编码的文本输出进行解码。

一般来说,文本与目标编码之间的转换对你来说是透明的。如果你在配置为同一种语言的目标上工作,事情就会按你的预期进行。
在混合语言环境中工作时,命令之间会出现不同的行为。例如,如果输出包含西里尔字母、中文和拉丁字母的字符,有些命令会正确处理。而其他命令则不会。
Beacon 中的大多数命令都使用目标机的 ANSI 编码来编码输入和解码输出。目标机配置的 ANSI 编码可能只能将字符映射到少数书写系统的码位。如果当前目标的 ANSI 编码没有映射西里尔字符,那么 make_token 将无法正确处理使用西里尔字符的用户名或密码。
Beacon 中的某些命令使用 UTF-8 作为输入和输出。一般来说,这些命令在处理混合语言内容时会达到预期效果。这是因为 UTF-8 文本可以将字符映射到任何 Unicode 编码点。
下表记录了哪些 Beacon 命令使用 ANSI 编码以外的其他编码来解码输入和输出:
命令
输入编码
输出编码
hashdump
UTF-8
mimikatz
UTF-8
UTF-8
powerpick
UTF-8
UTF-8
powershell
UTF-16
OEM
psinject
UTF-8
UTF-8
shell
ANSI
OEM
note :熟悉 mimikatz 的人会注意到,mimikatz 内部使用 Unicode Win32 API 和 UTF-16 字符。UTF-8从何而来?Cobalt Strike 与 mimikatz 的接口以 UTF-8 发送输入,并将输出转换为 UTF-8。
SSH Sessions
Cobalt Strike 的 SSH 会话使用 UTF-8 编码进行输入和输出。
Logging
Cobalt Strike 的日志是 UTF-8 编码的文本。
Fonts
你的字体在显示某些书写系统的字符时可能会受到限制。要更改 Cobalt Strike 字体:
转至 Cobalt Strike -> Preferences -> Cobalt Strike 更改 GUI 字体值。这将更改 Cobalt Strike 在其对话框、表格和界面其余部分中使用的字体。
进入 Cobalt Strike -> Preferences -> Console,更改 Cobalt Strike 控制台使用的字体。
Cobalt Strike -> Preferences -> Graph中有一个字体选项,可以更改 Cobalt Strike 的数据透视图使用的字体。
#说明本文由笔者在Cobalt Strike官方用户指南原文(https://hstechdocs.helpsystems.com/manuals/cobaltstrike/current/userguide/content/topics/welcome_main.htm)基础上编译,如需转载请注明来源。