一起学习 代码审计、安全开发、web攻防、逆向等。。。
私信联系
4.0 2019年12月2日 更新 Cobalt Strike 4.0 手册
奇安信 A-TEAM
https://blog.ateam.qianxin.com/
https://github.com/QAX-A-Team
Cobalt Strike 是一款 美国Red Team开发的 商业GUI框架式 优秀的渗透测试工具 简称CS
为对手模拟渗透测试 和红队行动而设计的 协作工具平台,
主要用于执行有目标的攻击和模拟高级威胁者的后渗透行动。
可以利用网络漏洞获取主机权限后、从一个强大的图形界面控制所有的活动。
因可以调用Mimikatz等其他知名工具并且可以作为团队服务使用,
因此广受网络安全人员喜爱。
Cobalt Strike 前身名为 Armitage,
我们可以将 Armitage 看作是 Metasploit 框架的图形化版本,因此可见,Cobalt Strike 与 Metasploit 的兼容性十分良好.
Metasploit(MSF)是一个免费的、开源的可下载的框架,旨在方便渗透测试,它是由 Ruby 语言编写的模板框架,具有很好的扩展性,
便于渗透测试人员开发、使用和定制工具模板
扩展性很强,整合各种平台,独立的框架,不依赖于其他框架提供了丰富的第三方接口,
可以添加插件 来丰富CS的功能以及攻击效率。
拥有多种协议主机上线方式
Cobalt Strike可以生成不同类型的shellcode,用于与目标系统建立通信和控制。
核心组件是 Beacon,一个可以在内存中执行的动态链接库(DLL)。
它集成了
远程控制、
信息收集、
内网渗透、
快速内网提权、
端口转发、
横向移动、
进行长久权限维持、
凭据导出、
socket代理、
数据渗出、
office攻击,
生成恶意文件、文件捆绑,托管网页攻击、发起社工钓鱼攻击、等功能。
流量特征很明显,
蓝队成员在流量中发现相关特征 那么基本也就宣告了个权限的丢失,
而且还有可能被疏远反制。
需要对CS进行一些修改
和对VPS的地址进行保护,
尽可以降低被发现后造成权限丢失和被溯源反制的事情发生概率,
加大蓝队的溯源难度。
Cabaltstrike3.13版本
3.13版本文件架构如下
│ Scripts 用户安装的插件
│ Log 每天的日志
│ c2lint 检查profile的错误异常
│ cobaltstrike
│ cobaltstrike.jar 客户端程序
│ icon.jpg LOGO
│ license.pdf 许可证文件
│ readme.txt
│ releasenotes.txt
│ teamserver 服务端程序
│ update
│ update.jar 更新程序
└─third-party 第三方工具,里面放的vnc dll
专门用于对其他对象身上发生的事件或状态改变进行监听和相应处理的对象,
当被监视的对象发生情况时,立即采取相应的行动。
在许多的渗透测试工具中,例如empire,metasploit,cobaltstrike中都有Listner的存在。
用来接收目标主机权限的模块。
创建Listener的步骤:Cobaltstrike-->监听器
根据shellcode的类型,
选择合适的传输协议(如HTTP、HTTPS、DNS、TCP、SMB等)
windows/beacon_dns/reverse_dns_txt
windows/beacon_dns/reverse_http
windows/beacon_tcp/bind_tcp
windows/beacon_http/reverse_http
windows/beacon_https/reverse_https
windows/beacon_smb/bind_pipe
windows/foreign/reverse_http
windows/foreign/reverse_https
windows/foreign/reverse_tcp
连接到Cobalt Strike的监听器。
根据shellcode的配置,发送一些基本信息(如系统信息、用户名、进程ID等)给Cobalt Strike,
并接收一些指令(如加载插件、执行命令等)。
根据shellcode的功能,执行相应的操作(如创建反向Shell、注入VNC、上传下载文件等),
并将结果返回给Cobalt Strike。
Cobaltstrike3.13版本,其中内置了九个Listener。
Listener 可以看作为与 Beacon 相反的一种形式,
Beacon 负责命令执行,并将数据回传,
而 Listener 负责整合其他框架或会话。
总的来说,Beacon 属于对内监听器,Listener 属于对外监听器
常用于将 Cobalt Strike 与 Metasploit 框架(包括其他支持 MSF 框架的产品)进行整合,
最终实现信息整合与 Payload 分发等等功能
(透视监听器)
Pivot Listeners 与对等 C2 的概念密不可分,
Pivot Listeners 支持绑定 Beacon 与 SSH 会话,
绑定后可以对他们进行反向连接,从而减少 C&C 框架中的连接数量
Beacon的中文名为信标
Beacon 是 Cobalt Strike 运行在目标主机上的 Payload ,工作方式与Metasploit Framework Payload类似。
我们可以将它视为 “窃听器” ,在隐蔽信道上为我们提供服务,用于长期控制受感染主机。
Beacon的功能包括以下几点:
使用HTTP或DNS检查是否有待执行任务
可连接到多个C2域名
能够在分段传输后自动迁移
可以配合各种方式(可执行文件、Word 文档、目标主机上的漏洞) 来传递 Beacon
如果有人劫持了你的通信流量,并可以监听到你的Beacon向Team Server传回的数据
Beacon 的安全设计其实与 OPSEC 这一概念是密不可分的,
OPSEC 的全称是 Operations security,OPSEC 本质上就是在行动阶段就将对立方作为假想敌融入行动计划。
早期的远控没有考虑到被对立方发现、溯源的可能性,长期直连受控端,最终导致行动暴露
Beacon 技术最早实现应该是 2017 年泄露的 CIA 的蜂巢(Hive)计划,
里面的一项分支技术叫做蜂巢信标基础设施(Hive Beacon Infrastructure),感兴趣的可以看一下这个文件
https://wikileaks.org/vault7/document/hive-Operating_Environment/hive-Operating_Environment.pdf
列举几点 Beacon 的安全设计:
Beacon 有重放保护机制
Beacon 的任务请求和任务输出都是被加密的
使用团队服务器的公钥加密传输的元数据,只有团队服务器才能解密这些信息
Beacon stage 在连接时会验证Team Server
传输 Payload 到目标系统时,会验证团队服务器密钥,确保只接受来自团队服务器的任务
Beacon 设置睡眠(Sleep)和抖动(Jitter)时间,
Sleep 控制 Beacon 在再次请求前必须睡眠多长时间,
Jitter 会改变睡眠时间,从而显示出随机性
Beacon stagers 没有任何安全机制
Raphael在设计Cobalt Strike的时候已经充分的考虑到了它的安全性问题
当你启动Team Server并创建了Beacon Listener时,Team Server就会创建公钥对来保证后续传输过程的安全性。
我们以分段传输payload为例,详细讲解一下Cobalt Strike的安全特性。
公钥也会被一起发送:
第一步就是要发送关于beacon session的元数据(Metadata)元数据中包含了用户、PID、电脑名称、IP地址等等基础信息,
同时元数据中也包括了Beacon stage创建的一个随机会话密钥。
为了保证安全性,Beacon stage会使用公钥加密元数据(含会话密钥),这意味着只有Team Server才能够解密该数据包。
团队服务器会使用会话密钥加密这些任务,Beacon stage也会使用会话密钥来解密任务列表。
Beacon stage也会使用会话密钥对任务输出加密。
通过TeamServer生成了shellcode/beacon文件后,并在靶机上执行该文件,会产生以下行为:
会在 C2 上下载载荷执行, 即 Stage 过程,
Stageless 则省去了这一步.
会主动向我们提前设置好的 Listener 发送 有关 Beacon 的信息
如系统类型, 版本, 当前用户, 称之为 Metadata.
之后, Beacon 根据设置的睡眠时间进入睡眠状态,
攻击者通过TeamServer发现目标机器已上线
Team Server 控制器接收到请求后会检查是否有待执行的任务,
如果有
C2 就会响应发送 Metadata 的请求
将任务(异步或同步)下发到Beacon。
Beacon 将会收到有关 Task 的具体内容和唯一的 Task ID, 并依次执行任务.
执行完毕后, Beacon 将各 Task 回显的数据与对应的 Task ID 依次上传至 C2, 然后再次进入睡眠状态.
其中 Beacon 发送 Metadata 时一般使用 GET,
上传回显数据时使用 POST.
Beacon的生成有两种模式
Beacon会分段的加载shellcode
具体表现为,通过不断的向Listener发起请求,最终获取一个完整的shellcode并执行
生成时则包含完整的shellcode。
Beacon 的通信分为以下两种:
异步模式下通信频率低、速度慢,
Beacon 固定一段时间(由 Sleep 时间决定,可调整)向 Teamserver 发起通信,主动请求任务列表、接受本次命令并回传上次执行命令后的结果
然后进入SLEEP状态。
实时控制
由 Client 发出的指令通过 Teamserver(或再经过外部 C2)直接转发给 Beacon 并执行命令
大致可以将 Beacon 分为以下四类:
HTTP Beacon 与 HTTPS Beacon 的差别仅仅是在通信协议上的不同,
相比 HTTP Beacon ,HTTPS Beacon 多了 SSL/TLS 协议,可以保证数据传输中信息不被截取或发生中间人攻击等
传输层安全性协议(英语:Transport Layer Security,缩写:TLS)
前身称为安全套接层(英语:Secure Sockets Layer,缩写:SSL)是一种安全协议,
目的是为互联网通信提供安全及数据完整性保障,可以将 TLS 看作 SSL 的加强版本
Cobalt Strike 4.5 版本 HTTPS Beacon 使用的是 TLS v1.2
一般情况下,使用 Get 方式请求任务,使用 Post 方式回传数据,通信大致过程如下:
Windows 命名管道(Name Pipe)
在介绍 SMB Beacon 前
Windows 命名管道是我们必不可少的前置知识储备
因 Cobalt Strike 原生仅支持 Windows ,我们这里只介绍 Windows 的管道技术
命名管道,顾名思义,就像是数字世界中的孪生兄弟,与我们日常生活中看到的管道有着相似的概念。
一个管道具有两端,一段负责向管道写入数据,另一端负责从管道读取数据,
在 Windows 中存在两种管道,即命名管道和匿名管道,具体特性如下:
命名管道(Named Pipe):适用于持久性、跨进程、双向通信的场景
匿名管道(Anonymous Pipe):适用于临时、有亲缘关系的进程间的单向数据传递
亲缘关系:当一个进程(称为父进程)创建了另一个进程(称为子进程),这两个进程之间就存在亲缘关系,父进程创建子进程后,子进程通常会继承一些父进程的属性和环境
匿名管道由于其仅能在本地使用且只支持单向通信的特性,在像 Beacon 这样的应用场景中无法满足需求,
而命名管道的双向且持久的特性为 Beacon 类似的通信需求提供了合适的基础,
以上几点注定了 Cobalt Strike 会选择命名管道
SMB 协议
SMB 协议和 Windows 命名管道的关系可以类比成交通规则和交通路网,
Windows 命名管道相当于一条条点对点的公路,但是单有交通路网是无法进行交通运输的,
有了交通规则,即 SMB 协议才可以实现数据的传输
SMB 全称是 Server Message Block,该协议最初由微软开发,
用于在Windows系统中实现文件和打印机共享,后来被广泛用于其他操作系统和网络设备中,我们常用的内网目录共享有些就是通过 SMB 协议实现的
前提条件:
1.具有SMB Beacon的主机必须接受端口445上的连接。
2.只能链接由同一Cobalt Strike实例管理的Beacon。
SMB Beacon 使用命名管道并通过一个父 Beacon 进行通信,
需要连接到Parent Beacon使用,所有任务均从parent Beacon接收,并通过parent Beacon返回任务结果。
命名管道是Windows进程间通信机制,允许两者间通信、互相查看和操作对方的文件。
Cobalt Strike使用这种方式在进程与进程或主机与主机之间通信
管道通信的进程可以是本地主机上的两个进程,也可以和远程主机上的进程通过网络进行通信
SMB Beacon 一般在面对域渗透有机器不出网的场景使用率较高,
并且与 Cobalt Strike 中的生成 Payload 的操作是兼容的,
简单来说就是使用可以 SMB Beacon 来 Cobalt Strike 原生携带的工具执行各种攻击和渗透测试操作,而不会出现兼容性问题,
但某些需要分段传输 Payload 的功能如:
packages 模块、Web Driveby 模块需要用户进行额外操作
(Beacon Covert Peer-to-Peer Communication)
使用 link [host] [pipe] 命令
可以使一个当前的正在控制的 Beacon 连接到等待连接的 SMB Beacon ,
连接后现有 Beacon 和 SMB Beacon 的操作将会同步
当机器 2 无法直接与 Teamserver 通信时,便可使用 SMB Beacon 来带出机器权限
注:
目标机器必须开启 445 端口才可使用 SMB Beacon
如果需要手动运行 SMB Beacon ,需要从一个父级 Beacon 连接到它,
并且这两个 Beacon 需要属于同一 Cobalt Strike 主体
一旦 Beacon 使用了这种连接方式,无法再使用 DNS 或 HTTP 协议进行通信
SMB Beacon 同一时间只能连接一个父 Beacon,
切换父 Beacon 的时候需要在原 Beacon 上先执行一次 unlink 操作
取消连接 SMB Beacon 时,它并不会使它消失,而是进入等待连接状态
(Beacon Peer as a Payload)
当攻击者想对已经植入 HTTP Beacon 主机提权时,
可以选择将 SMB Beacon 作为 Payload 进行派分和通信,当使用此种方法进行通信时,IP 后会存在 ∞∞ 字符
同时,进行提权后作为 Payload 通信的 SMB Beacon 也可以转为进行隐蔽点对点通信
实践可参考:https://www.youtube.com/watch?v=D9tMyRUKSPA
在 Listeners 中生成 SMB Beacon并保存
中已经上线的目标主机 -> 右键 -> spawn -> 选中Listeners ->choose
运行成功 external 可以看到 ∞∞ 这个字符 ,这就是派生的SMB Beacon
主Beacon上 用link host链接它 或者unlink host断开它
链接SMB Beacon命令:link 192.168.23.130
Spawn介绍
beacon> help spawn
Use: spawn [x86|x64] [listener]
spawn [listener]
Spawn an x86 or x64 process and inject shellcode for the listener.
spawn 这个功能,中文意思是“产卵”,
功能就是可以派生出更多的Beacon 让一个团队分布式渗入。
通常我们在团队主服务器上给队友来派生Beacon 这样只要主服务器权限不掉,还能继续操作。
尽量派生出多个Beacon,让我们的操作都在子Beacon。
这里简单叙述下
如何操作从主服务器 派生到 其他队友服务器的过程:
队友服务器Listeners生成 > 团队服务器 Listeners生成 使用队友ip>Spawn
让队友的服务器生成监听
然后团队服务器生成server ip指向队友。
灵活的运用Spawn 不仅可以使团队效率提高,也能较好的维持权限,同时还能结合MSF。
参考链接:https://www.cnblogs.com/lalalaxiaoyuren/p/14117945.html
DNS 协议可以使用 UDP 或者 TCP 进行传输,
使用的端口号都为 53。
但大多数情况下 DNS 都使用 UDP 进行传输
如果接收者 B 没有请求者 A 所需要的准确内容,
接收者 B 将告诉请求者 A,如何去获得这个内容,但是自己并不去发出请求,相当于从根域名开始查询直到找到目标域名
如果 A 请求 B,那么 B 作为请求的接收者一定要给 A 想要的答案
使用DNS来完成Beacon check in的工作,如果DNS返回的记录解析为有需要执行的任务,
那Beacon会使用HTTP来完成获取任务这一过程。
DNS Beacon 原理
DNS Beacon 同时利用了这两种查询方式,详细过程见下图:
其中第 1 步和 11 步属于递归查询,
而第 2 步至第 10 步属于迭代查询,
简单来说就是在层层迭代后,本地 DNS 服务器终于找到了目标域名对应的域名服务器,
而它找到的域名服务器实际上是 Cobalt Strike C2 服务器,最终再由本地 DNS 服务器返回信息给受控主机
数据传递方式
DNS Beacon 支持以下三种 DNS 记录通道传递beacon 和 task list:
A 记录(mode dns):A记录是最常见的DNS记录形式,一个A记录指向一个网站或域名的IP地址
AAAA 记录(mode dns6):AAAA记录是IPv6协议的一部分,这意味着它们被用来为互联网上的主机分配IPv6地址
TXT 记录(mode dns-txt):允许你以文本格式添加关于你的域名的额外信息,是 DNS Beacon 的默认传递方式
DNS Beacon 与 HTTP(S) Beacon 最大的区别是
心跳时不会主动回传被控端的数据,仅有一个最后通联时间返回,
使用 Beacon 控制台输入checkin可使心跳时返回数据,
但如果通过 DNS Beacon 对受控主机执行命令时则会自动执行checkin返回数据
注:
使用的所有域名必须要与 Cobalt Strike Teamserver 服务器绑定
Teamserver 服务器属于内网环境时,需要将公网 IP 的 53 端口映射到内网的 Teamserver 服务器
何为 Socket
Socket 是个略微抽象的概念,
大家可以把 Socket 理解为我们生活中的快递驿站,假设快递公司只知道每个包裹的驿站地址,而驿站负责将包裹再次配送到每家每户
为什么需要Socket进行网络通信?
当操作系统接收到一个数据包的时候,如果只有IP地址(驿站地址),它没法判断应该发给哪个应用程序,
所以,操作系统抽象出 Socket 接口(快递驿站),每个应用程序需要各自对应到不同的 Socket,
数据包才能根据 Socket 正确地发到对应的应用程序
一个 Socket 就是由 IP 地址和端口号(范围是0~65535)组成,
可以把 Socket 简单理解为 IP 地址加端口号,
端口号总是由操作系统分配,它是一个0~65535之间的数字,
其中小于1024的端口属于特权端口,需要管理员权限,
大于1024的端口可以由任意用户的应用程序打开
当使用 Socket 连接后:
对服务器端来说,它的 Socket 是指定的 IP 地址和指定的端口号
对客户端来说,它的 Socket 是它所在计算机的 IP 地址和一个由操作系统分配的随机端口号
TCP Beacon 使用 TCP socket
通过父 Beacon 进行通信,且对同一主机和跨网主机都适用。
TCP Beacon 整体来说与 SMB Beacon 的特性相同,都需要从父 Beacon 对他进行控制,包括兼容性方面也与 SMB Beacon 一致
如果勾选了 Bind to localhost only 就是仅绑定 127.0.0.1 本地 IP,即无法访问远程主机;
默认不勾选则是绑定在 0.0.0.0,即监听所有主机
名词 翻译 注释
Artifact Kit Artifact 工件集
Data Channel 数据通道
Data Model 数据模型
External C2 外置 C2
Foreign Listener(s) 对外监听器
Keystroke Logger 键盘记录器
Malleable C2 Profile C2 拓展文件
Named Pipe(s) 命名管道
Network Indicators 网络流量指标
Payload Staging 分阶段投递 Payload
Peer-to-peer Communication 对等通信
Peer-to-peer C2 对等 C2
Pipe 管道
Pivot Graph Pivot 图
Port Bending Redirector 端口弯曲重定向器
例如,接受来自 80 或 443 端口的连接
但将连接路由到团队服务器开在另一个端口上的连接,这样的重定向器。
Post-Exploitation 后渗透
PowerShell one-liner PowerShell单行程序
Session 会话
Sessions Table 会话表
Strategic Cyber LLC
StrategicCyber 责任有限公司
Cobalt Strike 是 Strategic Cyber 责任有限公司的产品
System Profiler 是一个探针
Targets Table 目标表
Token 令牌
BeaconCommands
===============
Command Description
------- -----------
browserpivot 注入受害者浏览器进程
bypassuac 绕过UAC
cancel 取消正在进行的下载
cd 切换目录
checkin 强制让被控端回连一次
clear 清除beacon内部的任务队列
connect Connect to a Beacon peerover TCP
covert 部署Covert VPN客户端
cp 复制文件
dcsync 从DC中提取密码哈希
desktop 远程VNC
dllinject 反射DLL注入进程
dllload 使用LoadLibrary将DLL加载到进程中
download 下载文件
downloads 列出正在进行的文件下载
drives 列出目标盘符
elevate 尝试提权
execute 在目标上执行程序(无输出)
execute-assembly 在目标上内存中执行本地.NET程序
exit 退出beacon
getprivs Enable system privileges oncurrent token
getsystem 尝试获取SYSTEM权限
getuid 获取用户ID
hashdump 转储密码哈希值
help 帮助
inject 在特定进程中生成会话
jobkill 杀死一个后台任务
jobs 列出后台任务
kerberos_ccache_use 从ccache文件中导入票据应用于此会话
kerberos_ticket_purge 清除当前会话的票据
kerberos_ticket_use 从ticket文件中导入票据应用于此会话
keylogger 键盘记录
kill 结束进程
link Connect to a Beacon peerover a named pipe
logonpasswords 使用mimikatz转储凭据和哈希值
ls 列出文件
make_token 创建令牌以传递凭据
mimikatz 运行mimikatz
mkdir 创建一个目录
mode dns 使用DNS A作为通信通道(仅限DNS beacon)
mode dns-txt 使用DNS TXT作为通信通道(仅限D beacon)
mode dns6 使用DNS AAAA作为通信通道(仅限DNS beacon)
mode http 使用HTTP作为通信通道
mv 移动文件
net net命令
note 备注
portscan 进行端口扫描
powerpick 通过Unmanaged PowerShell执行命令
powershell 通过powershell.exe执行命令
powershell-import 导入powershell脚本
ppid Set parent PID forspawned post-ex jobs
ps 显示进程列表
psexec Use a service to spawn asession on a host
psexec_psh Use PowerShell to spawn asession on a host
psinject 在特定进程中执行PowerShell命令
pth 使用Mimikatz进行传递哈希
pwd 当前目录位置
reg Query the registry
rev2self 恢复原始令牌
rm 删除文件或文件夹
rportfwd 端口转发
run 在目标上执行程序(返回输出)
runas 以另一个用户权限执行程序
runasadmin 在高权限下执行程序
runu Execute a program underanother PID
screenshot 屏幕截图
setenv 设置环境变量
shell cmd执行命令
shinject 将shellcode注入进程
shspawn 生成进程并将shellcode注入其中
sleep 设置睡眠延迟时间
socks 启动SOCKS4代理
socks stop 停止SOCKS4
spawn Spawn a session
spawnas Spawn a session as anotheruser
spawnto Set executable tospawn processes into
spawnu Spawn a session underanother PID
ssh 使用ssh连接远程主机
ssh-key 使用密钥连接远程主机
steal_token 从进程中窃取令牌
timestomp 将一个文件时间戳应用到另一个文件
unlink Disconnect from parentBeacon
upload 上传文件
wdigest 使用mimikatz转储明文凭据
winrm 使用WinRM在主机上生成会话
wmi 使用WMI在主机上生成会话
argue 进程参数欺骗
GitHub - SkyBlueEternal/Cobalt_Strike_wiki: Cobalt Strike系列
https://forum.butian.net/share/2430
https://www.liaoxuefeng.com/wiki/1252599548343744/1305207629676577
https://hstechdocs.helpsystems.com/manuals/cobaltstrike/current/userguide/content/topics/welcome_main.htm#
https://blog.ateam.qianxin.com/CobaltStrike4.0%E7%94%A8%E6%88%B7%E6%89%8B%E5%86%8C_%E4%B8%AD%E6%96%87%E7%BF%BB%E8%AF%91.pdf
https://segmentfault.com/a/1190000039039275
https://www.bilibili.com/video/BV16b411i7n5p=1&vd_source=2d89987c744dfaecf63d5a95427a4398
https://www.cnblogs.com/xuanlvsec/p/14201986.html
https://blog.51cto.com/u_14028678/3838403