
ドラフト: ディスカッション のリクエスト
この文書は、OST C&C 仕様書バージョン 1 の概要を提供します。 また、メッセージとそれらのメッセージ内のフィールドの詳細な説明を提供することを目的としています。
この仕様書の背後にある動機は、逐語的に実装できる、または単にプロジェクト開発者へのインスピレーションとして役立つ C&C メッセージングプロトコル(タスキング、構造化出力、ピアツーピアルーティングを含む)を提供することです。 この文書は C&C が何であるかを説明することを意図したものではありません。 読者は C&C が何であり、何に使用されるかを理解していることを前提としています。
キーワード "MUST"、"MUST NOT"、"REQUIRED"、"SHALL"、"SHALL NOT"、"SHOULD"、"SHOULD NOT"、"RECOMMENDED"、"MAY"、"OPTIONAL" は、[RFC2119] に記載されているとおりに解釈されるものとします。
この仕様書は以下の前提を置きます。
以下は、この文書全体で使用される用語のリストです。
インプラントメタデータ: インプラントがチームサーバーに自身について報告する情報。
タスクリクエスト: インプラントに実行させるために与えられるタスク。
タスクレスポンス: 特定のタスクのステータスと出力(あれば)。
セッションキー: インプラントがメッセージを暗号化するために使用する一意の暗号化キー。
各タスクリクエストおよびレスポンスメッセージは、以下の 16 バイトのヘッダーを持たなければなりません(MUST)。```text | Byte | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | | -------------------------------------------------------------| | 0 | Type | Code | Flags | Label | | -------------------------------------------------------------| | 1 | Identifier | Length | | -------------------------------------------------------------|
- **Type**: 1バイト整数。このタスクの「タイプ」です。[[Task Types and Codes](https://github.com/rasta-mouse/ost-c2-spec?tab=readme-ov-file#task-types-and-codes)] を参照してください。
- **Code**: 1バイト整数。指定されたTypeに対する「サブコード」です。[[Task Types and Codes](https://github.com/rasta-mouse/ost-c2-spec?tab=readme-ov-file#task-types-and-codes)] を参照してください。
- **Flags**: 2バイト整数。メッセージの状態を表すビット単位のフラグのセットです。[[Task Flags](https://github.com/rasta-mouse/ost-c2-spec?tab=readme-ov-file#task-flags)] を参照してください。
- **Label**: 4バイト整数。同じタスクに関連する複数のメッセージを関連付けるための一意のラベルです。
- **Identifier**: 4バイト整数。断片化されたメッセージを正しい順序で構築するために使用される連続識別子です。
- **Length**: 4バイト整数。タスクデータの全長です。
## タスクタイプとコード```text
|------------------|--------------------------|
| Type | Code |
|------------------|--------------------------|
| 0 - NOP | 0 |
|------------------|--------------------------|
| 1 - Exit | 0 |
|------------------|--------------------------|
| 2 - Set | 0 - Sleep/Jitter |
| | 1 - SpawnTo |
| | 2 - BlockDLLs |
| | 3 - PPID |
|------------------|--------------------------|
| 3 - File | 0 - Copy |
| | 1 - Move |
| | 2 - Delete |
| | 3 - Upload |
| | 4 - Download |
|------------------|--------------------------|
| 4 - Directory | 0 - Print |
| | 1 - Change |
| | 2 - Create |
| | 3 - Copy |
| | 4 - Move |
| | 5 - List |
| | 6 - Delete |
|------------------|--------------------------|
| 5 - WhoAmI | 0 |
|------------------|--------------------------|
| 6 - Process | 0 - List |
| | 1 - Kill |
| | 2 - Inject Spawn |
| | 3 - Inject Explicit |
|------------------|--------------------------|
| 7 - Registry | 0 - Query |
| | 1 - Add |
| | 2 - Delete |
|------------------|--------------------------|
| 8 - RPortFwd | 0 - Start |
| | 1 - Data |
|------------------|--------------------------|
| 9 - Environment | 0 - Get |
| | 1 - Set |
|------------------|--------------------------|
| 10 - SOCKS | 0 - Connect |
| | 1 - Data |
| | 2 - Close |
|------------------|--------------------------|
| 11 - Tokens | 0 - List |
| | 1 - Make |
| | 2 - Steal |
| | 3 - Use |
| | 4 - Revert |
| | 5 - Delete |
| | 6 - Purge |
|------------------|--------------------------|
| 12 - Run | 0 |
|------------------|--------------------------|
| 13 - ItemStore | 0 - List |
| | 1 - Add |
| | 2 - Delete |
| | 3 - Purge |
|------------------|--------------------------|
| 14 - LocalExec | 0 - .NET |
| | 1 - BOF |
| | 2 - Managed PowerShell |
| | 3 - Unmanaged PowerShell |
|------------------|--------------------------|
| 15 - PrintScreen | 0 |
|------------------|--------------------------|
| 16 - RemoteExec | 0 - WinRM |
| | 1 - WMI |
| | 2 - PsExec |
| | 3 - SSH |
|------------------|--------------------------|
| 17 - Link | 1 - Link SMB |
| | 2 - Link TCP |
|------------------|--------------------------|
| 18 - Unlink | 0 |
|------------------|--------------------------|
| 19 - P2P | 0 - Acknowledge |
| | 1 - PassThru |
|------------------|--------------------------|
| 20 - Jobs | 0 - List |
| | 1 - Kill |
|---------------------------------------------|
一部のフラグは相互に排他的であり、一緒に設定してはなりません(MUST NOT)。 フラグが設定されていない場合、タスクは正常に完了したとみなされるべきであり(SHOULD)、関連する出力(ある場合)は断片化されません(NOT fragmented)。```text
| Value | Description |
|---|---|
| 0 | No flags |
| 1 | Task Error |
| 2 | Task Running (as job) |
| 4 | Message is fragmented, more to follow |
| 8 | Message is fragmented, no more to follow |
## タスクデータ
タスクデータはヘッダーに追加され、特定のタスクタイプとコードに応じたバイナリ構造で構成されます。 各タスク要求および応答メッセージタイプは、[[メッセージ定義](https://github.com/rasta-mouse/ost-c2-spec?tab=readme-ov-file#message-definitions)]で定義されています。
不要な場合、タスク要求または応答にデータを付与することは必須ではありません。
## 暗号化タスクメッセージ
送信前に、タスクヘッダーとタスクデータが結合され、インプラントのセッションキーでAES暗号化されます。```text
| Byte | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| ------------------------------------ |
| 0 | Iv |
| 8 | |
| ------------------------------------ |
| 16 | Checksum |
| 24 | |
| 32 | |
| 40 | |
| ------------------------------------ |
| 48 | Data |
| .. | |
| ------------------------------------ |
インプラントは、タスクデータを受信または送信する前に、チームサーバーに自身を登録しなければなりません(MUST)。
インプラントは [IMPLANT-METADATA] メッセージを生成し、チームサーバーの公開RSA鍵で暗号化して、チームサーバーに送信します。