logo

K8哥哥

没有绝对安全的系统

看我如何模拟Cobalt Strike上线欺骗入侵者

本文于 1378 天之前发表

前言

不知道你有没有遇到过马上线却不能操作的情况,我猜当你网络卡或马写得不好时会出现这个问题
但是人为的你可能没遇到过,首先要欺骗你的远控,得分析你的协议,如果你的马根本不是公开的
网络又是好的,你刚往人家机器里种马,发现马只能上线不能操作,绝对是马有问题,不能甩锅我
人家都不知道你的马的通信原理,流量特征,不可能事先准备好一个程序,让你一发就欺骗你的马
本文主要研究CS这个APT很喜欢用的马,当然TCP的也一样原理,只要构造对应的数据包就可欺骗

远控术语

Cobalt Strike采用的是B/S架构,也就是常说的HTTP协议(HTTPS加密的http,记住都是WEB就不会错了)
Client:客户是上帝,我们想买什么告诉服务员。就是控制端,即通过它来控制对方电脑。不叫服务端哦
Server:服务员,即服务端。以前常说的肉鸡,这个叫被控端不是控制端,叫做什么就做什么不就是服务?
中转:放在VPS,好比现在的快递,可有可无,买家直接见卖家就不需要。CS中转Teamserve就是一个WEB

就是说如果你用IIS或Tomcat搭建的ASP、JSP、PHP、.NET等网站也可以做为中转,即可实现HTTP远控
如果CS不搞客户端,我们便可直接在浏览器上操作和控制目标机器,这就是08年这类码称为B/S架构的原因
CS的客户端就像我们用PY或其它语言实现模拟WEB登陆网站来操作一样,中转是WEB,那么肉鸡上线,它也
一样是HTTP请求来实现,WEB发包、POST提交不管怎么表达都可以,这是渗透基础,即是CS通信采用HTTP

C/S架构:Clinet/Server,主要指的是TCP,客户端和服务端,即便带个中转它也还是叫CS架构
B/S架构: Browser/Server,主要是HTTP,无论直接通过浏览器操作,还是像CS加个中转再用客户端访问
RAT:Remote Admin Tools,远程管理工具,长期以来国内外通用叫法。
C2: 老外的新名词,command&control,从字面上就很好理解命令和控制,不管任何协议马都可这样叫
这种叫法对于不够专业的人来说不会错,因为他根本不需要了解远控到底用什么协议实现,反正都叫C2

当然无论是以前还是现在叫RAT也绝对不会错,叫RAT可能更专业一点,RAT像老戏骨,C2像小鲜肉
看看现在好多远控基本都有CMD和文件管理,甚至只是一个SHELL而已了,我猜这就是C2的由来吧
以前像这样一般只称为后门,随便找一个远控都有CMD、文件管理、屏幕控制、键盘记录等功能
而现在一个CMD和文件管理,在10几年前也很难称为马叫炮灰,现在搞个炮灰一堆BUG还以为很吊
以前只能称为后门,连远控都称不上的,现在只实现了一个CMD执行命令,就说成自己写个远控了
多台机器管理实现不了先不说,只能一对一,断以后就无法控制,连后门都不合格,还TM说成远控

PS:之所以写这一段话,主要是发现不少写马的或渗透的,竟然都分不清楚服务端和控制端

HTTP协议

还有我说HTTP协议(含HTTP/S),还有人说不是HTTP还有HTTPS(首先搞清楚HTTPS是什么,加密的HTTP)
比方说你设计一个HTTP经过特定格式加密,单纯HTTP访问得不到真实数据而已,解不了就不属于HTTP了?
当有一天大家都觉得这个加密好用或安全,给它起个名叫KTTPS,或许可称为新协议,但本质还是HTTP协议。
当然可能有些人要说HTTP也属于TCP,虽说HTTP可通过TCP实现,但是两者有很大区别,通过TCP实现叫伪
为什么因为它不是真正的HTTP,目标WAF禁TCP的时候,TCP实现的就出不来,HTTP只要会操作WEB就行
HTTP比TCP多了一个,允许通过WEB操作来访问,HTTP虽是特殊的TCP,但已经完全变异成了一个新协议。

就像猩猩和人,我们几乎不会说人是猩猩,只会说人是猩猩进化而来的,因为变异太多,可以以新物种定义。
而HTTPS和HTTP,就像戴不戴口罩,戴个口罩就TM不是人了?除了戴个口罩,你的衣食住行哪一样不是人。
你不戴口罩进不了小区,那你就戴口罩就能进去了啊,就像HTTPS(HTTP基础上加SSL协议就可以访问了啊)
HTTP不加SSL访问不了HTTPS,你就说HTTPS不属于HTTP,这和不戴口罩不让进小区,就说你不是人一样
本质是因为你不是人而不让你进吗?而是你不戴口罩,并不是说你不是人所以不让你出入,概念不一样。
所以说我们通常只说TCP协议、HTTP协议(因为已包含HTTPS在内),至少10几年来很少听到有人说HTTPS马
最多只是听说这款http马也支持https,或这个webshell工具支持https站点,这个EXP支持HTTPS站点等

CS心跳包

一般在设计远控时,我们都会对机器进行标记,比如上线特征为A
A对应信息已保存在本地数据库,因此想要确认机器是否还在控
我们只需要发送A标识给客户端,告诉它机器还在控制,即心跳包
而没实战过的人是每次都发送目标信息,这样很容易被目标发现

下面配置好CS让其上线后,我们对服务端进行抓包,其心跳包如下
CS也是一样,因为是BS模式HTTP协议,它的心跳特征存在Cookie里
非正常cookie写法,一段很长的加密数据,可以止来判断是否中招

img

上线验证

使用Ladon Exp生成器可以提交WEB数据包,类似Firefox上的HackBar但更高级
区别在于可生成Ladon插件或独立EXE,对于不懂编程的人来说也可“编写”EXP
img

运行LadonPoc.exe发现CS上线,执行一次就上线一次,说明思路没错
img

欺骗入侵者

假设我们在内网中发现别人的CS流量或者抓到样本,给他模拟上线,让他有得看没得吃
他在客户端那边只会看到机器在线,就是死活控不了,然后他就想是不是目标环境奇葩
还是说网络太卡或有什么问题,能上线就是不能操作,哈哈,一直在上线却啥事也不能做

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import urllib2
import time
### Cobalt Strike Cheat by K8gege
def cscheat():
opener = urllib2.build_opener()
opener.addheaders.append(('Cookie', 'Qk1UsVjTNpW6aR0327yD57Zkt1m6XWurvM+bR0xqOqGnXsatzGHpnccfgqmruH6dnJudEzijQhC0NCtoAxdA90rso7NAfBrfRrktO5B4FjZX6LEBxIyzEwQ71Jk1ttM8VY6luE5k+PMLk6DAmWUoGoJmvAl/qp4qreuWumv52TM='))
res = opener.open("http://192.168.1.102:800/dpixel")
content = res.read()
print content

while True:
print(time.strftime('%Y-%m-%d %X',time.localtime()))
cscheat()
time.sleep(5)

img

读取CMD指令

当客户端下达CMD命令时,中转TeamServer会将命令放在心跳包中,返回的结果如下:

1
2
3
4
^Zd........N...&....%COMSPEC%.... /C net user k8gege..AAAAAAAAAA.<....g..I9.....

5e5a69740000002e0000004e000000260000000925434f4d535045432500000013202f43206e6574
2075736572206b387465616d00004141414141414141414100e488fc2a22f737b0067ac4384c4971

测试多次发现不管执行多长的命令 都会出现/C空格 和两个00加至少一个A
所以我们截取 2F4320 和 000041 之间的值,再解密即为CS下发的CMD命令

img

返回CMD结果

将CS的命令执行结果提交到submit.php页面,即可实现回显,数据包如下

1
2
3
4
5
6
7
8
9
10
11
12
POST /submit.php?id=60871 HTTP/1.1
Accept: */*
Content-Type: application/octet-stream
User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1)
Host: 192.168.1.102:800
Content-Length: 68
Connection: Keep-Alive
Cache-Control: no-cache

...@...
........win-60a3b595b7m\k8gege
................0=W1..LGCN..

结语

通过本文我们了解了CS心跳包机制、下达指令、回显等原理,并玩弄入侵者
有兴趣的话,可以自行抓包实现自己的CS服务端,甚至支持对Linux的控制
也可以实现CS远控的密罐,把CS下达的指令提取出来,返回假的CMD命令结果
即能收集目标证据以及意图,还能将他玩弄于鼓掌之中,搞死他,哈哈

PS:之所以有这篇文章,是因为昨晚有人在群里讨论,CS能不能支不支持Linux
目前CS的shellcode以及beacon(核心功能DLL)都是WINDOWS系统才能执行。
而CS对于Linux的控制目前仅是SSH会话,想真正支持就得自己实现服务端
不要说让其支持Linux,用个GO来实现,兼容全平台都可以,只是很麻烦
因为不开源,每一个动作都要自己去分析它的数据包,很多功能也很费时
其实早在去年的这个时间就想实现Linux服务端,所以抓包研究了下。
当时就应该有这篇文章了,只是因为忙,懒得编辑文字,后面忘了发。

扫码加入K8小密圈