
PowerShell から Slack への C2
このPowerShellモジュールには、Slack APIを利用してコマンド&コントロールチャンネルを作成するさまざまな関数が含まれています。メイン関数であるStart-Shellは、ユーザーが指定したSlackチャンネルに接続し、指定されたSlackチームとユーザーに対して提供されたAPI認証トークンを使用して認証します。チャンネルに入力されたコマンドは、ホスト上でPowerShellによって実行されます。
SlackShellプロジェクトは、API呼び出しにInvoke-RestMethodを使用するため、PowerShell v3以上が必要です。今後の開発でも現在のPowerShellコマンドレットと関数を使用し続ける予定です。ただし、Powershell v2用のポートがSlackShell-Poshv2.psm1として作成されています。
追加のPSスクリプトは、最初にSlackチャンネルにアップロードすることで、実行中のセッションにインポートできます。インポート機能は、デフォルトで https://slack-files.com でホストされているファイルをダウンロードし、メモリ内にインポートします。ファイルはディスクに触れません。逆に、ダウンロード機能を使用して、任意のファイルのローカルコピーをディスクに保存することもできます。
ローカルファイルは、アップロード機能を使用してAPI経由でSlackチャンネルにアップロードできます。
必要に応じて、組み込みのInvoke-Commandコマンドレットを利用してコマンドを実行するための別のPSプロセスを生成できます。
PowerShellで実行するコマンドを監視するためにSlackチャンネルの監視を開始します。$sleep秒ごとにSlackチャンネルに接続し、すべての新しいコマンドを取得します。コマンドはホスト上でPowerShellによって実行されます。
APIを通じて特定のSlackチャンネルにメッセージを送信します。メッセージはテキストヘッダー付きで送信され、メッセージの本文はSlackアタッチメントになります。
新しいプロセスを開始し、ホスト上でPowerShellのコマンドを実行します。PowerShellのStart-Jobメソッドを利用して新しいプロセスを生成し、ジョブが完了するのを待ってから出力を返します。
実行中のプロセスの現在のコンテキストで、ホスト上でPowerShellのコマンドを実行し、出力を返します。
特定のSlackチャンネル内のすべてのメッセージを、最も古い期間から現在まで返します。メッセージはAPI仕様に従ってJSON形式で返されます。
Slack API呼び出しを使用して、指定されたAPIトークンが有効かどうかをテストします。
Slack API呼び出しを使用して、現在Slackチャンネルでホストされているファイルのリストを返します。
ファイルリストを更新し、指定されたファイルをメモリにダウンロードして、新しいモジュールを作成し、そのモジュールをインポートします。そのモジュール固有のコマンドは、Slackチャンネルに直接入力できます。ダウンロードされたファイルはディスクに触れません。 この関数は、追加のテストが行われている間はベータ版と見なす必要があります。一部のモジュールは不安定に動作します
ファイルリストを更新し、指定されたファイルをディスクにダウンロードします。追加の保存パスを含めることができ、デフォルトは現在の場所です。
ローカルファイルをSlackチャンネルにアップロードします。
認証に使用されるAPIトークン。このトークンは、特定のSlackチーム上の特定のユーザーを表します。詳細はこちら: https://api.slack.com/custom-integrations/legacy-tokens
チーム内のどのSlackチャンネルを使用するかを指定するチャンネル識別子。Start-Shellが実行されると、このチャンネル内のすべてのテキストがホスト上のコマンドとして処理されます。チャンネルIDは、WebベースのSlackサイトからチャンネルページにアクセスするときのURLにあります。
例: https://slackteam1.slack.com/messages/ABC123456. チャンネルIDは「ABC123456」です。
Import-Module ./SlackShell.psm1
Start-Shell -Token "xoxp-175828824580-175707545555-176600001223-826315a84e533c482bb7e20e8312fh45k" -Channel "ABC123456" -Sleep 5
トークンの作成に使用されたユーザーとは異なるユーザーとして、同じSlackチャンネルに参加します。別のユーザーとしてチャンネルに書き込まれたものはすべて、スクリプトの開始に使用されたのと同じローカルユーザーコンテキストでホスト上で実行されます。あるいは、「runjob」を使用して、新しく生成されたPowerShellプロセスでコマンドを実行することもできます。
シェルと接続を閉じます。
メインプロセスのコンテキストでディレクトリを変更します。相対パスを使用できます(例: cd ..)
スリープ時間を変更します。
関連付けられたSlackチャンネルで利用可能なファイルを一覧表示します。
指定されたファイルをインポートします。ファイルは、使用中のSlackチャンネルと共有されている必要があります。
指定されたファイルをディスクにダウンロードし、オプションのパスパラメータの場所に保存します。ファイルは、使用中のSlackチャンネルと共有されている必要があります。
ローカルファイルをSlackにアップロードし、使用中のチャンネルと共有します。
新しいPowerShellプロセスで指定されたコマンドを実行します。
PowerShellでSlack APIを操作するためのインスピレーションはWarren Frameによるものです。彼のリポジトリは始めるための優れたリソースでした: https://github.com/RamblingCookieMonster/PSSlack
POSHv2への移植と機能拡張を行ってくれた@thesubtletyに特別な感謝を捧げます。