找回密码
 会员注册
查看: 9|回复: 0

新型渗透工具Sliver的流量特征分析与检测

[复制链接]

5

主题

0

回帖

16

积分

新手上路

积分
16
发表于 2024-10-7 22:59:57 | 显示全部楼层 |阅读模式
本期作者李昕信息安全部高级安全工程师前言当前各种渗透测试工具层出不穷且更新速度快,安全产品对各类渗透工具的检测难度也随之不断上升。过去几年中Cobalt Strike被攻击者在各种场景中频繁使用,但安全防守方已经掌握了检测和阻止Cobalt Strike攻击的一些较为成熟的方法,因此攻击者开始转而使用一些不太知名的类似框架去绕过端点检测和流量检测,这就对安全产品检测规则的覆盖面提出了挑战。为了应对渗透工具的不断更新迭代,我们一直致力于恶意网络流量检测和相关研究工作,包括各种新型挖矿木马、远控工具、扫描工具等等,并将持续输出有效的NIDS/IPS/WAF规则,补充安全产品的检测能力,进而提升网络安全能力,因大多数NIDS和IPS均支持snort规则语法,因此在本文将针对新型渗透工具sliver的流量特征进行分析并给出可落地的snort规则。01 sliver基本介绍sliver包括许多常见的C2框架特性,如支持多个同步操作、多种侦听器类型、用户开发的扩展和有效负载生成;支持生成可在所有操作系统架构下运行的C2木马文件,并在控制端管理所有的会话连接。Sliver支持多种回调协议,包括DNS, Mutual TLS (mTLS), WireGuard和HTTP(S)、HTTP;甚至支持多个被控端连接C2 server并同时管理这些连接。Sliver具备许多攻击者渗透测试过程中的常用功能,包括生成适用于各类操作系统的payload,将恶意代码插入到常见的受信任进程(例如 explorer.exe、regsvr32.exe、svchost.exe 等)中,从而提高操作的隐蔽性和持久性;通过PsExec命令进行横向移动等等。值得一提的是关于payload的大小问题,很多攻击框架都是使用分段的payload,以防止payload过大,另外为了适应不同的攻击场景,可以分阶段进行payload投递。Cobalt Strike是使用stager解决了这个问题,stager是一段很精短的代码,它可以连接下载真正的payload并将其注入内存。攻击者首先投递一个小巧的stager payload,然后通过stager去beacon staging server的某个URL下载完整的payload。但是sliver目前最新版并没有实现这个功能,一个最简单的只包含http beacon的文件都达到了15M以上,官方说明可能会在v1.6实现。02 Cobalt strike特征分析由于目前市面上关于CS的检测与绕过已经有非常多成熟的技术手段,而sliver作为一种用golang编写的C2工具,相信在检测思路上有一些值得学习的地方。目前Cobalt strike比较常见且有效的检测手段可以分为基础特征和高级特征,基础特征极易通过修改默认配置进行绕过,高级特征则不易被绕过。基础特征:1. http请求特征http-beacon通信中,默认使用get方法向/dpixel、/__utm.gif、/pixel.gif等地址发起请求,同时请求头存在cookie字段并且值为base64编码后的非对算算法加密数据,这种方案已绕过且可能与业务流量重合。2. Cobalt Strike默认证书Cobaltstrike的默认证书具备很明显的特征,因此可以根据证书指纹进行识别,如:O=cobaltstrike, OU=AdvancedPenTesting, CN=Major Cobalt Strike,但现在市面上已经有很多修改证书指纹的方法,这种检测方案可以轻易被绕过。同理我们可以观察一下sliver是否使用了具有明显特征的证书,下图为一个sliver IP样本 193.27.228.127使用的证书信息,未发现明显特征。且根据sliver的源代码证书构造逻辑我们可以分析出,每一次https连接默认使用一个随机证书,无明显的固定特征,当然高级的攻击者在使用sliver的过程中也可以选择使用固定证书甚至使用自己构建的证书。高级特征:1. Response响应特征Cobalt Strike服务器基于NanoHTTPD,NanoHTTPD是一个基于java的开源web服务器框架。NanoHTTPD服务器响应中包含一个额外的空字节:"HTTP/1.1"后面是一个空字节(0x20),而在其他web服务器响应中不存在这个空字节。Cobalt Strike 3.13版本已经去除了该特征,从HTTP状态响应中删除了无关的空字节。Sliver使用了go常用的net/http搭建web服务器,暂未发现存在明显特征。2. Ja3/Ja3s指纹检测该检测原理为是通过对服务器和客户端之间的TLS协商进行指纹识别来检测可疑的https流量,ja3和ja3s分别代表tls握手阶段的client-hello、server-hello的数据集合计算出的哈希值(md5),相同版本相同系统下指纹相同,该特征与操作系统、cobaltstrike版本有关,profile文件无法对其修改。在Cobalt Strike的案例中,Client beacon(使用Windows套接字来发起通信)和运行在Kali Linux上的Cobalt Strike服务器的TLS协商就可以产生指纹。这些指纹需要交叉验证才能可靠地发现Cobalt Strike服务器,尽管Cobalt Strike服务器可以通过重定向来部分让这种检测,但仍然有许多Cobalt Strike服务器没有使用这种代理。Ja3收集client hello中的:版本、可接受的密码、扩展列表、椭圆曲线密码、椭圆曲线密码格式。Ja3s收集Server Hello中的版本、可接受的加密算法和扩展列表。1客户端指纹:fa704723a210632b2ff9ad03be418651,CobaltStrike4.1的服务端指纹:5513ab2983a0db88fadd353de0341e7c。从原理来看,该方法对sliver https流量应该同样有效,后文将对sliver的ja3指纹特征提取进行分析和验证。03 Sliver http特征提取与规则验证一般来说,sliver http流量若无明显可与常规流量区分的字段特征,而仅仅通过url、参数、cookie等构造规律作为流量特征,则有一定几率与同类型的golang业务流量相似,且这类特征都极易被修改。因此在实际上线规则时建议尽可能写多个特征做强匹配,降低误报率。另外,规则的误报情况也与业务类型相关联,若以java业务为主则误报的可能性较小。?3.1 http流量特征提取Sliver的C2木马连接服务端有5种类型的消息,使用内置路径段随机生成请求路径,所有路径将具有以下扩展名之一,不同的文件扩展名指示了请求的类型。除了扩展名之外,路径中的所有内容都会被服务器忽略。.woff = Stagers(默认不使用).js = Long poll messages(长消息轮询,加密交互数据).html = Key exchange messages (密钥交换,set-cookie).php = Session messages.png = Close session messages(关闭会话)首先通过抓包分析原始流量,检查request和response中是否有明显特征,可以看到http c2会话中最多的是Key exchange messages和Long poll messages这两种类型的消息,本文特征提取也将以这两种message为主。在c2木马通过http协议连接sliver服务端的流量中,没有得到可以明显区别于正常业务流量的特征,可以通过多次抓包寻找规律性特征;在这张图中可以发现,url中包含的路径名称具备一定的重复几率,参数名称和参数值的格式似乎也包含规律,经过多次重复抓包即可验证该特征;但凭此我们暂时无法写出有效的规则,但是依据这个思路可以去阅读sliver源码中关于http请求构造的逻辑代码,从而确定流量特征。直接从构造payload的模块impant开始阅读,可以总结出以下相关特征:固定url路径参数名称的构造规律参数值的长度及规律sessionID/Cookie的交换Cookie的名称生成、cookie值的长度及规律1. Path和filename的组成Httpclient.go的主要作用是向C2 server发起http连接,协议和host都是生成payload的时候写入的,那么我们需要从这段代码里观察出uri的格式,startSessionURL()中显示pathJoinURL()负责拼接path和filename,path及filename根据会话类型的不同,从代码自定义配置数组中用rand随机获取。randomPath决定path的组成数量,以及随机选择path和filename。总结出以下规律:Sliver构造的uri中将随机包含[0,4]个Path,以及一个从固定数组随机选择元素的filename,文件后缀固定为.htmlpath和filename元素数组如下:2. cookie名称根据代码逻辑是从ServerConfig.Cookies[]中随机取一个,Cookie的所有可能值也已硬编码在代码中,总共包含6个预定义元素,但这些是golang http开发常用的元素,因此需要注意不可单独作为一个特征使用。总结出以下特征:从固定数组中随机选择的cookie名称=32位字符与数组的随机组合3. cookie值cookie即为初次建立会话时交换的seesionID,由第一次建立会话后服务端返回,固定为32位长度,该cookie将用于后面的poll session交互。4. 参数构建好包括host和path的baseurl后,代码中先通过RandomEncoder()生成一个nonce值,用作初始的参数值(这一点在官方文档中略有提及,sliver服务端会忽略一切不包含nonce值的请求,目的是为了防止攻击者嗅探)encoderID为EncoderMap[]中的随意选择的任一编码方式,目前支持以下集中:Base64、Hex、Gzip、English 、PNG 、Gzip+English 、Base64+Gzip;nonce值的生成方法为:0到maxN(999999)中的任意数值*101 + encoderID为[0,6)生成nonce值后使用NonceQueryArgement()构造url参数,类似于 :a=a&b=b,参数名从字符串nonceQueryArgs随机选取一个或两个字符组成,nonceQueryArgs = "abcdefghijklmnopqrstuvwxyz_"。参数值是经过处理的nonce值,nonce值会存在0到2个字母被替换成随机字符,并与随机生成的一个字符key进行append,于是最后生成的参数形式为,a=12234u78,依据代码逻辑来看nonce值的长度为1到10位,包含数字和小写字母。参数名和nonce值将会成为sliver http流量检测降低误报的重要特征。?3.2 snort规则编写规则1:start session & get publickeyPOST /oauth2callback/php/samples.html?k=943u66167&wj=03222676 HTTP/1.1Host: test.comUser-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.2234.389 Safari/537.36Content-Length: 134Upgrade-Insecure-Requests: 1Accept-Encoding: gzip ...........j.....74Z;......`+.G.)!^...s..9.......NZ?.....e..d...,w^]B..(,............5..|.C.....Y%...df.,m;:M..6x.ABu...........pj...HTTP/1.1 200 OKCache-Control: no-store, no-cache, must-revalidateSet-Cookie: PHPSESSID=bcbfd98683687a7ff7483d7971285979; HttpOnlyDate: Tue, 06 Sep 2022 10:51:21 GMTContent-Length: 112Content-Type: application/x-gzip为避免产生大量误报,以下特征之间为与的关系,且规则设置request和response两个流联动检测:Request1. POST2. path包含1到8个:"php", "api", "upload", "actions", "rest", "v1", "auth", "authenticate","oauth", "oauth2", "oauth2callback", "database", "db", "namespaces"3. 文件名为以下值之一:"login", "signin", "api", "samples", "rpc", "index","admin", "register", "sign-up"4. 文件后缀:.html5. 参数名称和nonce值Response:返回固定cookie值规则如下:# sliver http 流量特征alert tcp any any -> any any (msg: "Sliver HTTP implant beacon -request&getsessionID"; flow:to_server,established;content:"POST";http_method;nocase;content:".html";http_uri;pcre: "/\/(php|api|upload|actions|rest|v1|oauth2callback|authenticate|oauth2|oauth|auth|database|db|namespaces)(.*?)((login|signin|api|samples|rpc|index|admin|register|sign-up)\.html)\?[a-z_]{1,2}=[a-z0-9]{1,10}/i";sid:9000002;flowbit:set,name;flowbit:noalert;classtype:trojan-activity; rev:1; metadata: Sliver;) alert tcp any any any any(msg:”疑似C2工具sliver https加密通信行为-debian8”;ja3.hash;content:”19e29534fd49dd27d09234e639c4057e”;classtype:misc-activity;sid:1001;rev:1)Alert tls any any -> any any(msg:”疑似C2工具sliver https加密通信行为-centos7”;ja3.hash;content:”473cd7cb9faa642487833865d516e578”;classtype:misc-activity;sid:1002;rev:1)#ja3s指纹-sliver 1.5.24Alert tls any any
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 会员注册

本版积分规则

QQ|手机版|心飞设计-版权所有:微度网络信息技术服务中心 ( 鲁ICP备17032091号-12 )|网站地图

GMT+8, 2025-1-10 22:28 , Processed in 0.471697 second(s), 26 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表