长亭百川云 - 文章详情

Cobalt Strike几种不那么常见的上线方式小记

王小明的事

38

2024-07-13

引子

我有一个朋友,很喜欢下定论,还很能BB。我痛恨下定论,也很能BB,所以我们伴随着剁手指这种赌注进行技术交流的结果大多数都是在众人的哄笑中其中一人的面红耳赤,因为抬杠总要有输赢(当然是我赢得多嘻嘻)。不过把东西都摊在明面上也好,我认为对外的知识辐射可以让一个人获得成长,像这种深刻的方式更甚。虽然争论不是他死就是我亡,但是总要好过把自己架的高高在上只会指指点点却输不起。

说到cobalt strike(后文简称cs)新出的Pivot Listeners上线方式,朋友使用的时候没找到选这个 Listener的地方,在跟他的朋友商量之后得出结论:这是个BUG。在一旁苟着的我敏锐的嗅到了锤他的机会,遂有此文。

这里不只单独介绍Pivot Listeners,顺带说一下几个不那么常见的上线方式,仅做记录之用,水平过于有限导致疏漏在所难免,还请看官师傅们不吝石锤。

192.168.231.129有两张网卡,一个可以连接外部互联网,一个不能。192.168.231.128只有一个网卡,不能连接外部互联网。

smb

"SMB Beacon使用命名管道通过父Beacon进行通信,这种点对点通信借助Beacons在同一台主机上实现,它同样也适用于外部的互联网。Windows当中借助在SMB协议中封装命名管道进行通信,因此,命名为SMB Beacon。"个人感觉该类型的listener比较适用于目标机器无法连接外网的情况,同时也在一定程度上可以起到规避防火墙的作用。在Attacks - > Packages - > Windows Executable(S)这里支持导出该类型listener对应的可执行文件或者dll等。配合可执行文件使用的命令是link和unlink,目标机器那边运行完可执行文件在跳板机这边link过去,目标机器就可以上线**。**

新建smb类型的listener

带着账号密码psexec到靶机得到system权限的会话

以用户权限在靶机上运行smbbeacon.exe,然后link过去,得到用户权限的会话

虽然cs这边看上去不是实时通信,但是两台机器其实是连接的状态

unlink会直接把目标IP刚刚通过smb上线的两个会话全部断开,不过link这个IP两次仍然可以把两个会话都link回来。通过可执行文件上线的会话,unlink之后smbbeacon.exe的进程并没有退出,link一次会重新连接上线。通过psexec上线的system权限会话也可以通过同样的命令link回来。

下图可见,unlink退掉了所有会话。link一次,通过exe上线的普通用户权限会话成功重连上线。同时根据external栏IP地址后面的符号形状也可以判断当前与目标机器的在线状态。

此时的状况从pivot Graph界面来看如下

bind

在3.13版本当中新增了两个listener相关的功能,其一就是bind形式的TCP Beacon,另外一个reverse形式的Pivot Listeners,这里说说bind先,reverse放在后面说。和smb不同的是,bind这里使用的是"TCP套接字通过父信标进行通信",Attacks -> Packages -> Windows Executable (S)这里同样可以生成对应的beacon payload。命令格式同smb相似,不过此处连接目标IP的命令不是link,而是connect。取消连接目标机器的话对应的命令与smb同为unlink

新建bind_tcp类型的会话

选择bind类型监听器psexec到靶机得到system权限的会话

以用户权限在靶机上运行bind_tcp_beacon.exe,然后connect过去,得到用户权限的会话

这里有一点需要注意一下,创建bind_tcp类型listener的时候填写的IP和端口信息大概是扯淡的,目标机器打开4444端口是写死的,有需求的话可以自行去源码里面修改一下

如下图所示,加上之前上线的smb类型会话,使用unlink命令退掉了全部的3个会话。link命令成功重连回来一个smb类型会话,connect命令成功把psexec上线的system权限bind类型会话重连回来,但是connect第二次却无法重连通过bind_tcp_beacon.exe上线的普通用户权限会话。区别就在这里,在我们unlink的时候,smbbeacon.exe只是断开了会话连接但是该进程还在,但是bind_tcp_beacon.exe随着连接的断开进程也会退掉。

在四个会话全部在线的情况下对smb、bind两种上线方式做一个简单的对比,根据进程占用和连接情况基本可以发现问题所在。

reverse

重点来了,吊人胃口的Pivot Listeners有些不见首不见尾。首先添加windows/beacon_reverse_tcp类型的listener不是在Cobalt Strike -> Listeners当中(不过删除是在这),而是右键单击被控机器在 [beacon] -> Pivoting -> Listener这里添加(该类型listener的添加似乎是无限制的,就是说按照程序的设定来看控了多少机器就可以添加多少,可以串一株幸运草串一个同心圆)。另外相当nice的一点是Linux跳板机上也支持这种操作,嫌麻烦此处留一个小遗憾不再测Linux环境。

然而命令行可见其实其本质是这样的

此时去psexec目标机器发现listener列表里并没有刚刚添加的reverse

回手点到Attacks -> Packages -> Windows Executable (S),发现reverse他在灯火阑珊处

生成exe运行上线,注意图中箭头方向

额外需要注意的一点是,reverse类型的Pivot Listeners同样受unlink命令影响,且同bind_tcp一样,unlink之后进程会直接退出,没有持久化操作的话不去重新运行exe是无法重连上线的,这也应该算是普通beacons的特性之一。

rportfwd

很多工具都可以实现端口转发的功能,端口转发功能在这种相似的环境下可以做的事情也不止上线这一种,这里只是做一个思路记录,所以简单介绍一笔带过。

首先新建一个不存在的listener,我们的意图只是为了生成一个可以连接到跳板机的payload

设置端口转发到外网的msf,msf那边监听就好

实现cs直接把不通外部互联网的机器弹到外网msf上,跟msf生成各种payload再端口转发上线外网无二致

pivots

这是一种比较特殊的场景,权限不是特别稳固(当然为了相对尽量稳固你可以有一个代理圈养观察环节,或者干脆自己造代理),不过隐蔽性会稍稍好一些。

首先网上瞎找一个代理

验证代理可用之后,到Attacks - > Packages - > Windows Executable(S)这里新建一个payload,当然要把刚才的代理填上。需要注意的一点是,这里的socks代理依旧是只支持sock4a

用一种相对蛇皮的方式实现简单的规避,举一反三的话某些白名单环境说不定可以用的上呢

内网的代理

算是上面举一反三想法的简单延伸,假设bind跟reverse我们都不用,直接在跳板机搭建一个代理(甚至有时候跳板机有一个天然的代理),借此上线。

搭建一个Http代理

为无法连接外部互联网的机器生成自带穿透payload

上线

写在最后

看完这些你可能会觉得smb骚得不行,但是金无足赤,跳板机如果控不稳一旦GG一次,通过smb和reverse上线的机器在跳板机重新上线之后似乎是无法重连的(且reverse类型的listener需要删除旧的重新基于新会话创建)。不过bind_tcp还在等你,前提是你建立了一个足够坚固的bind_tcp类型的beacon。

**文笔垃圾,措辞轻浮,内容浅显,操作生疏。不足之处欢迎大师傅们指点和纠正,感激不尽。
**


参考链接:
https://www.cobaltstrike.com/help-pivot-listener
https://www.cobaltstrike.com/help-tcp-beacon
https://www.cobaltstrike.com/help-pivot-listener
https://www.cobaltstrike.com/help-staged-exe
https://www.cobaltstrike.com/help-smb-beacon
https://www.cobaltstrike.com/help-staged-exe
https://www.cobaltstrike.com/help-http-beacon#proxy
https://www.cobaltstrike.com/help-socks-proxy-pivoting
https://www.cobaltstrike.com/help-listener-management
作者老哥好人一生平安

* 封面图背景图片来自:cobaltstrike.com

相关推荐
关注或联系我们
添加百川云公众号,移动管理云安全产品
咨询热线:
4000-327-707
百川公众号
百川公众号
百川云客服
百川云客服

Copyright ©2024 北京长亭科技有限公司
icon
京ICP备 2024055124号-2