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

admin 2022年11月4日18:26:28评论393 views1字数 8229阅读27分25秒阅读模式

本期作者

李昕

信息安全部高级安全工程师


前言


当前各种渗透测试工具层出不穷且更新速度快,安全产品对各类渗透工具的检测难度也随之不断上升。过去几年中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的流量特征分析与检测


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的过程中也可以选择使用固定证书甚至使用自己构建的证书。

新型渗透工具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指纹特征提取进行分析和验证。

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


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为主。

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


在c2木马通过http协议连接sliver服务端的流量中,没有得到可以明显区别于正常业务流量的特征,可以通过多次抓包寻找规律性特征;

新型渗透工具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,文件后缀固定为.html

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


path和filename元素数组如下:

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


2. cookie名称

根据代码逻辑是从ServerConfig.Cookies[]中随机取一个,Cookie的所有可能值也已硬编码在代码中,总共包含6个预定义元素,但这些是golang http开发常用的元素,因此需要注意不可单独作为一个特征使用。

总结出以下特征:从固定数组中随机选择的cookie名称=32位字符与数组的随机组合

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


3. cookie值

cookie即为初次建立会话时交换的seesionID,由第一次建立会话后服务端返回,固定为32位长度,该cookie将用于后面的poll session交互。

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


4. 参数

构建好包括host和path的baseurl后,代码中先通过RandomEncoder()生成一个nonce值,用作初始的参数值(这一点在官方文档中略有提及,sliver服务端会忽略一切不包含nonce值的请求,目的是为了防止攻击者嗅探)

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


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流量检测降低误报的重要特征。

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


 3.2 snort规则编写


规则1:start session & get publickey

POST /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两个流联动检测:

Request

1. POST

2. 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. 文件后缀:.html

5. 参数名称和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: "Sliver HTTP implant beacon -response&set-cookie";flow:to_client,established;content:"Set-Cookie";http_header;pcre:"/^Set-Cookie:s*(PHPSESSID|SID|SSID|APISID|csrf-state|AWSALBCORS)=[a-z0-9]{32};s*HttpOnly$/i";sid:9000003;flowbit:isset,name;classtype:trojan-activity;)


 3.3 规则验证


将上述规则添加进流量检测设备WAF/IPS,使用sliver执行http C2连接行为,经测试可准确检测http C2木马连接,在b站办公及业务流量中暂未发现误报,规则上线前还需要结合业务流量特征进行评估和规则调整,以避免大量误报产生。

C2连接测试:

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


WAF告警截图:

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


IPS告警截图:

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


04 Sliver https特征提取与规则验证


当前大部分C2工具为了逃避检测更加倾向于使用https协议,但即使流量被加密,我们仍然可以通过不同工具客户端和服务器之间的TLS协商特征特征来进行检测,JA3 是根据TLS协商过程中client hello和Server hello包的特征进行检测,而并非是检测通信内容,因此能够更加有效地检测https恶意流量。


 4.1 https流量ja3特征提取


JA3 收集client Hello 数据包中以下字段的字节的十进制值;SSL 版本、接受的密码、扩展列表、椭圆曲线和椭圆曲线格式。然后,它按顺序将这些值连接在一起,使用“,”来分隔每个字段,并使用“-”来分隔每个字段中的每个值,以下为debian 8 上sliver v1.5.24的TLS协商特征,我们可写出该版本sliver的ja3指纹特征。

SSL版本:0x0303(16进制)=771(10进制)

接受的密码:0xc02b;0xc02f;……..

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


扩展列表:0x0005;0x000a;0x000b。。。。

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


椭圆曲线:0x001d;0x0017;0x0018;0x0019

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


椭圆曲线格式:0

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


将上述字段转化成十进制并用-连接:771,49195-49199-49196-49200-52393-52392-49161-49171-49162-49172-156-157-47-53-49170-10-4865-4866-4867,5-10-11-13-65281-18-43-51,29-23-24-25,0 ,通过md5加密成32位,计算出debian 8上sliver 的ja3指纹如下:19e29534fd49dd27d09234e639c4057e

用同样的方式提取ja3s指纹信息,TLSVersion : TLS版本信息、Ciphers : 支持的密码套件、Extensions : 支持的扩展项,计算出ja3s指纹如下:f4febc55ea12b31ae17cfb7e614afda8


 4.2 规则编写


suricata已集成ja3检测,可直接使用ja3指纹编写suricata规则。

#ja3指纹-sliver 1.5.24Alert tls 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 <- any any(msg:”疑似C2工具sliver https加密通信行为”;ja3s.hash;content:” f4febc55ea12b31ae17cfb7e614afda8”;sid:1003)


 4.3 规则验证


  • 使用sliver 生成后门文件MARKED_SHOOT

  • Sliver服务端开启监听端口443

  • 客户端运行后门文件并开启抓包,成功建立https连接

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


  • Suricata进行流量包检测


  • 查看suricata检测日志

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


05 小结


本文通过对 Sliver 源代码和功能进行分析给出了检测思路,同时这些思路也适用于其他恶意软件框架,由于Sliver的http 请求构造均为硬编码逻辑,修改http构造规律对于专业开发者和黑客来说并不难,因此该特征可能在不久的将来即可被绕过。但是,针对一种渗透工具的研究不应该局限于流量特征,sliver在很多场景中的使用方式都为我们提供了新的检测思路。例如终端远控木马特征提取,进程间的异常调用关系检测进程注入,而本文中提及的https流量的ja3/ja3s特征检测则不依赖于配置和环境,攻击者更加难以绕过。后续我们也将更加集中于研究新型渗透工具的底层技术,输出更加有效且不易绕过的检测特征。


以上是今天的分享内容,如果你有什么想法或疑问,欢迎大家在留言区与我们互动,如果喜欢本期内容的话,请给我们点个赞吧!



原文始发于微信公众号(哔哩哔哩技术):新型渗透工具Sliver的流量特征分析与检测

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年11月4日18:26:28
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   新型渗透工具Sliver的流量特征分析与检测http://cn-sec.com/archives/1390986.html

发表评论

匿名网友 填写信息