
Sliver C2 インプラントフレームワーク用の Windows キーロギングモジュール。Raw Input を使用してキーストロークをキャプチャし、オペレーターに開始・停止・取得コマンドを提供します。
この Sliver 向けエクステンションは、主に Sliver がエクステンションをどのように処理するかを学ぶための演習として書かれました
。
この公開インプラントフレームワークの開発に対して、Sliver チーム全体に感謝します。 特に、Sliver がエクステンションをどのように扱うかについて、私の多くの質問に答えてくれた @rkervell に感謝します。
基本的には raw input を使用します。これは、他の一般的なキーロギング手法に対して長所と短所があります。
私がこれを気に入っているのは、他のバイナリへのインジェクションが不要で、特定のコールを頻繁にポーリングして結果を見逃す可能性もないためです。
このコードは、私自身の作業と、インターネットで見つけたいくつかのサンプルを組み合わせたものです。
Visual Studio 2019 でソリューションファイルを開き、x86 と x64 のリリースをビルドします。
これが将来的に armory に含まれるまでの間、Windows システム上でビルドできます。その後、生成された $(solutiondir)\bin フォルダを sliver クライアントに
配置し、extensions install <path to folder> を実行してエクステンションをインストールできます。再起動が必要な場合や、extensions load <path to folder> も実行する必要がある場合があります。
raw_keylogger <cmdid>
以下の cmdid が有効です
0 = stop
1 = start
2 = get keystrokes
すべてがうまくいけば、次のようになります

Sliver の API には、次の2つの主要な部分があります
typedef int (*goCallback)(const char*, int);
extern "C" {
__declspec(dllexport) int __cdecl entrypoint(char* argsBuffer, uint32_t bufferSize, goCallback callback);
}
インプラントは、.json ファイルで定義されている "entrypoint" を呼び出します。これはあなたの entrypoint 関数を指しています(その名前である必要はなく、シグネチャに従うだけで構いません)。
goCallback は出力を go に返すための関数です。callback(string, string_length) のように呼び出されます。
現時点では、エクステンションをコーディングする際に "name" と "command_name" を一致させる必要があります。そうしないと、インプラントは呼び出しのたびにエクステンションをリロードします。
執筆時点では、非BOFエクステンションは厳密に型指定された引数をサポートしていないため、コマンド名の後に cli で指定されたすべてのものが文字列として送信されます。それ以降は、エクステンションのネイティブコード側で処理する必要があります。