Cobalt Strike 4.8 用户指南-第七节后渗透(2)
7.18、权限提升
某些后渗透命令需要系统管理员级别的权限。Beacon 包含多个选项,可帮助你提升访问权限,包括以下内容:
在 Beacon 控制台中键入 help 以查看可用的命令。键入 help,后跟命令名称以查看详细帮助。
# 1、利用漏洞提升
elevate
- 此命令列出了在 Cobalt Strike
中注册的权限升级漏洞。
elevate [exploit] [listener]
- 此命令尝试使用特定的漏洞进行提升。
你还可以通过 beacon -> Access -> Elevate
进行选择。
选择一个监听器,选择漏洞利用程序,然后点击Launch
运行漏洞利用程序。
你可以利用 Elevate Kit
向 Cobalt Strike
添加权限升级漏洞。Elevate Kit
是一个Aggressor
脚本,它将多个开源权限升级漏洞整合到Cobalt Strike
中。项目地址:https://github.com/rsmudge/ElevateKit。
runasadmin
-该命令本身会列出在 Cobalt Strike
注册的权限提升命令。
runasadmin [exploit] [command + args]
-此命令尝试在提权的上下文中运行指定的命令。
只是在提权的临时环境中运行一次命令,不直接把当前会话提升权限。这个过程其实就 是[启动一个新进程]→[提权进程]→[执行命令]→[退出进程]。
Cobalt Strike
将提权的漏洞利用命令和会话范围的漏洞利用命令分开,因为一些用于提权的攻击是派生会话的自然机会。其他攻击产生一个运行此命令的原语。从一个「运行此命令」的原语派生一个会话会将把大量武器化的决策交到你的工具开发人员手中(这不总是有利的)。使用 runasadmin
,你可以自己选择可执行文件写入磁盘上并运行它,运行 PowerShell 单行程序,或者在某些程度上削弱目标。
如果想使用PowerShell
单行程序来派生会话,可以通过beacon -> Access -> One-liner
。
此对话框将在 Beacon 会话中设置仅本地主机的 Web 服务器,以托管payload stage
,并返回下载和运行此payload stage
的 PowerShell
命令。
该Web
服务只能使用一次。一旦连接过一次,它就会自我清理,停止为你的payload
提供服务。
如果你使用此工具运行 TCP
或 SMB Beacon
,则需要使用 connect
或 link
来手动控制payload
。另外,请注意,如果你尝试使用 x64 payload
- 如果你的 $PATH
中是 x86 的PowerShell ,则会失败。
Cobalt Strike
没有很多内置的提权选项。提权漏洞利用的开发不是Fortra
公司的工作重点。不过,通过 Cobalt Strike
的Aggressor Script
编程语言集成权限升级漏洞很容易。要了解这看起来像什么,请下载 Elevate Kit
(https://github.com/cobalt-strike/ElevateKit)。Elevate Kit
是一个Aggressor
脚本,它将多个开源权限升级漏洞整合到了Cobalt Strike
中。
# 2、使用已知凭证提权
runas [DOMAIN\user] [password] [command]
- 该命令使用另一个用户的凭据,以该用户身份运行命令。runas
命令不会返回任何输出。不过你可以在非特权环境下使用 runas
。
spawnas [DOMAIN\user] [password] [command]
使用其他用户的凭证来以其他用户身份派生一个会话。这个命令派生一个临时的进程并将你的 payload stage
注入进那个进程。你也可以通过 [beacon] -> Access -> Spawn As
来运行此命令。
使用这两个命令时,请注意,SID 不是 500 的账号的凭据会派生一个中等完整性上下文中的 payload
。 你需要使用 Bypass UAC
来提权至一个高完整性上下文。另外要注意,你应该从特定账户可以读取的工作文件夹中运行这些命令。
# 3、获取System
getsystem
- 该命令冒充 SYSTEM
帐户的令牌。此访问级别可让你执行管理员用户无法执行的特权操作。
获取SYSTEM
的另一种方法是创建一个运行payload
的服务。 使用elevate svc-exe [listener]
命令可以执行此操作。此命令会在目标磁盘上落地一个运行 payload
的可执行文件、创建一个服务来运行此 exe
,获取对 payload
的控制,然后清理服务和可执行文件。
# 4、Bypass UAC
Microsoft在Windows Vista中引入了用户帐户控制(UAC),并在Windows 7中进行了完善。UAC非常类似于Unix中的sudo。用户日常使用正常特权。当用户需要执行特权操作时,系统会询问用户是否要提升权限。
Cobalt Strike附带了一些UAC绕过攻击。如果当前用户不是管理员,这些攻击将不起作用。要检查当前用户是否在管理员组里,使用 run whoami /groups
命令。
elevate uac-token-duplication [listener]
- 该命令会派生一个权限提升的临时进程,并向其中注入payload stage
。此工具使用一个 UAC
漏洞,允许一个非提权的进程使用从一个提权的进程窃取的令牌来启动一个任意进程。为了利用该漏洞,攻击者需要移除提升 token 中的一些权限。新的会话将反映这些受限的权限。如果“始终通知”设置为最高级别,此攻击要求提权的进程已经运行在当前桌面 会话中(作为同一用户)。该攻击适用于 Windows 7 和 2018 年 11 月更新之前的 Windows 10。
runasadmin uac-token-duplication [command]
- 这与上述攻击相同,但该变种会在提升的上下文中运行你选择的命令。
runasadmin uac-cmstplua [command]
- 此命令尝试绕过 UAC
并在提升的上下文中运行命令。此攻击依赖于一个COM对象,该对象自动从某些进程(Microsoft 签名的,位于 c:\windows\*目录下的)上下文中提权。
# 5、特权
getprivs
-该命令启用分配给你的当前访问令牌的特权。
# 7.19、Mimikatz
Beacon
集成了 mimikatz
。使用 mimikatz [pid] [arch] [module::command] <args>
注入到指定进程来运行 mimikatz
命令。使用 mimikatz
(不带 [pid] 和 [arch] 参数)生成一个临时进程来运行 mimikatz
命令。
一些 mimikatz
命令必须以SYSTEM
身份运行才能工作。在命令前面加上感叹号 (!),以强制 mimikatz
在运行命令之前提升到 SYSTEM
。例如 mimikatz !lsa::cache
将恢复系统缓存的加盐密码哈希。使用mimikatz [pid] [arch] [!module::command] <args>
或 mimikatz [!module::command] <args>
(不带 [pid] 和 [arch] 参数)。
如果需要使用 Beacon
当前的访问令牌运行 mimikatz
命令,你可以在命令前添加 @
前缀,以强制mimikatz
模拟Beacon
当前的访问令牌。例如,mimikatz @lsadump::dcsync
将使用Beacon
的当前访问令牌在 mimikatz
中运行 dcsync
命令。使用 mimikatz [pid] [arch] [@module::command] <args>
或 mimikatz [@module::command] <args>
(不带 [pid] 和 [arch] 参数)。
如果要在单行中运行多个 mimikatz
命令,请使用分号 (;) 字符分隔多个mimikatz
命令。命令的最大长度为 511 个字符。例如:mimikatz crypto::capi ; crypto::certificates /systemstore:local_machine /store:my /export
。
# 7.20、凭证和哈希收集
要转储哈希值,请通过[beacon] -> Access -> Dump Hashes
。还可以在 Beacon
控制台使用 hashdump [pid] [x86|x64]
命令,将 hashdump
工具注入指定进程。使用 hashdump
(不含 [pid] 和 [arch] 参数)派生一个临时进程,并将 hashdump
工具注入其中。这些命令将派生一个作业,注入 LSASS
并转储当前系统上本地用户的密码哈希值。该命令需要管理员权限。如果注入 pid
,该进程需要管理员权限。
使用logonpasswords [pid] [arch]
注入指定进程以转储明文凭据和NTLM
哈希值使用 logonpasswords
(不含 [pid] 和 [arch] 参数)派生一个临时进程来转储明文凭据和 NTLM
哈希值。此命令使用 mimikatz
并需要管理员权限。
使用 dcsync [pid] [arch] [DOMAIN.fqdn] <DOMAIN\user>
注入指定进程以提取NTLM
密码散列。。指定一个用户只获取其哈希值,使用 dcsync [DOMAIN.fqdn] <DOMAIN\user>
。该命令派生一个临时进程来提取NTLM
密码哈希值。该命令使用 mimikatz
从域控制器中提取域用户的NTLM
密码哈希值。此命令需要域管理员信任关系。
使用 chromedump [pid] [arch]
注入指定进程以从 Google Chrome
恢复凭据。使用 chromedump
(不带 [pid] 和 [arch] 参数)派生成一个临时进程,以从 Google Chrome
恢复凭证信息。此命令将使用 Mimikatz
恢复凭证信息,并且应在用户上下文下运行。
使用上述命令转储的凭证由 Cobalt Strike 收集并存储在凭证数据模型中。通过 View->Credentials
以提取当前团队服务器上的凭据。
# 7.21、端口扫描
beacon
有一个内置的端口扫描器。使用portscan [pid] [arch] [targets] [ports] [arp|icmp|none] [max Connections]
注入指定进程以对指定主机运行端口扫描。使用 portscan [targets] [ports] [arp|icmp|none] [max Connections]
(不带 [pid] 和 [arch] 参数)派生一个临时进程来对指定主机运行端口扫描。
[targets
选项是以逗号分隔的要扫描的主机列表。你也可以指定 IPv4 地址范围(如 192.168.1.128-192.168.2.240、192.168.1.0/24)。
[ports]
选项是以逗号分隔的要扫描的端口列表。你也可以指定端口范围(如 1-65535)。
[arp|icmp|none]
目标发现选项指示端口扫描工具如何确定主机是否处于活动状态。 arp
选项使用 ARP
来查看系统是否响应指定的地址。icmp
选项发送 ICMP
回显请求。none
选项则让端口扫描工具假定所有主机都是存活的。
[max connections]
选项限制了端口扫描工具在同一时间尝试连接的数量。端口扫描工具使用异步 I/O,因此可以同时处理大量连接。数值越大,端口扫描的速度越快。默认值为 1024。
端口扫描程序会在 Beacon
和团队服务器通讯的这个过程中不停运行,有结果报告时,它会将其发送到Beacon
控制台。Cobalt Strike
会处理这些信息,并根据发现的主机更新目标模型。
你也可以通过 [beacon] -> Explore -> Port Scanner
启动端口扫描工具。
# 7.22、网络和主机枚举
Beacon
的 net
模块提供了在 Windows
活动目录网络中查询和发现目标的工具。
使用net [pid] [arch] [command] [arguments]
将网络和主机枚举工具注入到指定进程中。使用 net [command] [arguments]
(不带 [pid] 和 [arch] 参数)派生一个临时进程并将网络和主机枚举工具注入其中。net domain
命令是一个例外,它是以 BOF.net 域的形式实现的。
Beacon
的 net
模块中的命令建立在 Windows
网络枚举API
的基础之上。其中大部分命令可直接替换Windows
中的许多内置 net
命令(也有一些独特的功能)。以下命令可供使用:
computers
- 列出域(组)中的主机
dclist
- 列出域控制器。 (填充目标模型)
domain
- 显示该主机的域
domain_controllers
- 列出域(组)中的 DC
domain_trusts
- 列出域信任
group
- 列出组和组中的用户
localgroup
- 列出本地组和本地组中的用户。(在横向移动时,当你需要查找谁是另一个系统的本地管理员时,这个功能非常有用)。
logons
-列出登录到主机的用户
sessions
- 列出主机上的会话
share
- 列出主机上的共享
user
- 列出用户和用户信息
time
- 显示主机的时间
view
- 列出域中的主机(浏览器服务)。 (填充目标模型)
# 7.23、信任关系
Windows 单点登录的核心是访问令牌。当用户登录 Windows 主机时,会生成一个访问令牌。该令牌包含有关用户及其权限的信息。访问令牌还包含当前用户与网络上其他系统进行身份验证所需的信息。模拟或生成令牌,Windows 将使用其信息对你访问的网络资源进行身份验证。
使用steal_token [pid]
或steal_token [pid] <OpenProcessToken access mask>
从现有进程中窃取访问令牌。
# 1、令牌存储
令牌存储有助于热插拔访问令牌。使用token-storesteal [pid,...] <OpenProcessToken access mask>
窃取访问令牌并存储它。要立即应用窃取的令牌,请使用 token-storesteal-and-use [pid] <OpenProcessToken access mask>
。
token-store show
命令列出令牌存储中当前可用的访问令牌。使用 token-store use [id]
将访问令牌应用于当前 Beacon
。
token-storeremove[id,...]
和 token-storeremove-all
命令可用于从存储中删除存储的令牌。
如果你想查看哪些进程正在运行,请使用 ps
。getuid
命令将打印你当前的令牌。使用 rev2self
恢复到原来的令牌。
OpenProcessToken access mask
建议值:
blank = default (TOKEN_ALL_ACCESS)0 = TOKEN_ALL_ACCESS11 = TOKEN_ASSIGN_PRIMARY | TOKEN_DUPLICATE | TOKEN_QUERY (1+2+8)Access mask values:STANDARD_RIGHTS_REQUIRED . . . . : 983040TOKEN_ASSIGN_PRIMARY . . . . . . : 1TOKEN_DUPLICATE . . . . . . . . : 2TOKEN_IMPERSONATE . . . . . . . : 4TOKEN_QUERY . . . . . . . . . . : 8TOKEN_QUERY_SOURCE . . . . . . . : 16TOKEN_ADJUST_PRIVILEGES . . . . : 32TOKEN_ADJUST_GROUPS . . . . . . : 64TOKEN_ADJUST_DEFAULT . . . . . . : 128TOKEN_ADJUST_SESSIONID . . . . . : 256
OpenProcessToken access mask' 有助于使用“SYSTEM”用户从进程中窃取令牌,和你遇到此错误:"Could not open process token: {pid} (5)"
你可以在 Malleable C2
全局选项中使用“.steal_token_access_mask”设置首选默认值。
如果你知道某个用户的凭据,请使用 make_token [DOMAIN\user] [password]
生成一个传递这些凭据的令牌。该令牌是你当前令牌的副本,包含修改后的单点登录信息。它将显示你当前的用户名。这是预期行为。
Beacon
命令: pth [pid] [arch] [DOMAIN\user] [ntlm hash]
注入指定进程以生成并模拟令牌。使用pth [DOMAIN\user] [ntlm hash]
(不带 [pid] 和 [arch] 参数)派生一个临时进程来生成并模拟令牌。此命令使用 mimikatz
生成并模拟一个令牌,该令牌使用指定的 DOMAIN
、用户和 NTLM
哈希作为单点登录凭据。当你与网络资源交互时,Beacon
将传递此哈希值。
Beacon
的 Make Token
对话框([beacon] -> Access-> Make Token
)是上述命令的前端。它将显示凭证模型的内容,并使用正确的命令将选定的凭证条目变成访问令牌。
# 2、Kerberos票据
黄金票据是自行生成的 Kerberos
票据。最常见的是伪造具有域管理员权限的黄金票据。
通过[beacon] -> Access -> Golden Ticket
从 Cobalt Strike
伪造一张黄金票据。提供以下信息,Cobalt Strike
就会使用 mimikatz
生成黄金票据,并将其注入你的 kerberos
托盘。
1、你想要伪造票据的用户。
2、你要伪造票据的域。
3、域的 SID
4、域控制器上krbtgt
用户的NTLM
哈希值。
使用kerberos_ticket_use [/path/to/ticket]
来将 Kerberos
票据注入当前会话。这将允许 Beacon
使用此票据的权限与远程系统进行交互。
使用 kerberos_ticket_purge
来清除任何与你的会话相关联的 Kerberos
票据。
# 7.24、横向移动
一旦你拥有了目标上的域管理员或域用户(本地管理员)的令牌,你就可以滥用这种信任关系来控制目标。Cobalt Strike
的 Beacon
有几个用于横向移动的内置选项。
输入jump
以列出使用 Cobalt Strike
注册的横向移动选项。运行 jump [module] [target] [listener]
以尝试在远程目标上运行payload
。
Jump模块 | 架构 | 描述 |
---|---|---|
psexec | x86 | 使用一个服务来运行一个服务可执行文件 |
psexec64 | x64 | 使用一个服务来运行一个服务可执行文件 |
psexec_psh | x86 | 使用一个服务来运行一个 PowerShell 单行程序 |
winrm | x86 | 通过 WinRM 来运行一个 PowerShell 脚本 |
winrm64 | x64 | 通过 WinRM 来运行一个 PowerShell 脚本 |
单独运行 remote-exec
,可以列出在 Cobalt Strike
注册的远程执行模块。使用 remote-exec [module] [target] [command + args]
尝试在远程目标上运行指定命令。
Remote-exec 模块 | 描述 |
---|---|
psexec | 通过服务控制管理器远程执行 |
winrm | 通过 WinRM(PowerShell)远程执行 |
wmi | 通过 WMI (PowerShell)远程执行 |
横向移动是一个类似于特权提升的领域,在此领域中一些攻击呈现出自然的在远程目标上派生会话的原语集。一些攻击仅仅给一个可执行原语。 jump
和 remote-exec
命令之间的分离给了你自主决定如何去武器化仅执行原语的灵活性。
Aggressor Script
有一个 API
可以添加新模块以进行jump
和remote-exec
。有关更多信息,请参阅 Aggressor Script
文档(特别是 Beacon
章节)。
# 7.25、横向移动(GUI)
Cobalt Strike
还提供了一个图形用户界面,使横向移动更加方便。切换到 View -> Targets。导航至**[target]** -> Jump,然后选择所需的横向移动选项。
要使用此对话框:
首先,决定横向移动要使用哪个信任。如果想使用其中一个信标中的令牌,请选中Use session’s current access token
框。如果想使用凭证或哈希值进行横向移动,也可以。从凭证存储中选择凭证,或填写User
、Password
和Domain
字段。Beacon
会使用此信息来为你生成一个访问令牌。记住,你需要在高权限的上下文(管理员权限)中执行这些操作才能生效。
接下来,选择用于横向移动的监听器。SMB Beacon
通常是不错的选择。
最后,选择要从哪个会话执行横向移动攻击。Cobalt Strike
的异步进攻模式要求每次攻击都从一个受损系统中执行。
在没有 Beacon
会话的情况下,无法执行此攻击。如果是内部行动,可考虑hook
一个由自己控制的 Windows
系统,并以此为起点,利用凭据或哈希值攻击其他系统。
点击 Launch
(启动)。Cobalt Strike
将激活选定 Beacon
的标签页并对其发出命令。攻击的反馈会显示现在 Beacon
的控制台中。
# 7.26、其他命令
Beacon
还有一些其他命令没有在上面介绍。
clear
命令将清除 Beacon
的任务列表。如果你犯了错误,请使用这个。
输入 exit
来要求 Beacon
退出。
使用kill [pid]
终止一个进程。
使用timestomp
将一个文件的 “已修改”、“已访问 ”和 “已创建 ”时间戳伪造成与另一个文件相同的时间戳。
# 说明
本文由笔者在Cobalt Strike官方用户指南原文(https://hstechdocs.helpsystems.com/manuals/cobaltstrike/current/userguide/content/topics/welcome_main.htm)基础上编译,如需转载请注明来源。