zoukankan      html  css  js  c++  java
  • 看我如何模拟Cobalt Strike上线欺骗入侵者

    前言

    不知道你有没有遇到过马上线却不能操作的情况,我猜当你网络卡或马写得不好时会出现这个问题
    但是人为的你可能没遇到过,首先要欺骗你的远控,得分析你的协议,如果你的马根本不是公开的
    网络又是好的,你刚往人家机器里种马,发现马只能上线不能操作,绝对是马有问题,不能甩锅我
    人家都不知道你的马的通信原理,流量特征,不可能事先准备好一个程序,让你一发就欺骗你的马
    本文主要研究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流量或者抓到样本,给他模拟上线,让他有得看没得吃
    他在客户端那边只会看到机器在线,就是死活控不了,然后他就想是不是目标环境奇葩
    还是说网络太卡或有什么问题,能上线就是不能操作,哈哈,一直在上线却啥事也不能做

    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会将命令放在心跳包中,返回的结果如下:

    ^Zd........N...&....%COMSPEC%.... /C net user k8gege..AAAAAAAAAA.<....g..I9.....
    
    5e5a69740000002e0000004e000000260000000925434f4d535045432500000013202f43206e6574
    2075736572206b387465616d00004141414141414141414100e488fc2a22f737b0067ac4384c4971
    

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

    img

    返回CMD结果

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

    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-60a3b595b7mk8gege
    ................0=W1..LGCN..
    

    结语

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

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

  • 相关阅读:
    java反序列化盲打与手工测试
    centos7下面利用服务启动empire后门的方法
    部分APP无法代理抓包的原因及解决方法(flutter 应用抓包)
    代码审计入门之Jeeplus代码审计
    代码审计新手入门-xdcms_v1.0
    Web应用安全模糊测试之路
    java代码审计文章集合
    Java框架级SSM代码审计思路
    [翻译] 使用Frida来hack安卓APP(一)
    基于Websocket接口的SQL注入利用
  • 原文地址:https://www.cnblogs.com/k8gege/p/12390265.html
Copyright © 2011-2022 走看看