
Beacon によって生成されたファイルをディスクの代わりにメモリへ書き込む CobaltStrike ツールキット
MemFiles は CobaltStrike 用のツールキットで、オペレーターが Beacon プロセスによって生成されたファイルをターゲットシステムのディスクに書き込むのではなく、メモリに書き込むことを可能にします。Windows 7、10、11 で正常にテストされており、対応するサーバーバージョンも問題なく動作するはずです。MemFiles は x64 Beacon のみに対応しています。
これは、NTDLL.dll 内の複数の異なる NtAPI をフックし、それらの API への呼び出しを Beacon プロセスメモリ空間に注入された関数にリダイレクトすることで実現されます。
MemFiles は、Beacon プロセス内にクリーンでアンフックされた NTDLL のコピーがあることを前提としています。EDR フックが残っている Beacon プロセスでの MemFiles の動作可能性については保証されません。MemFiles を使用する前に NTDLL を修復/更新してください!
MemFiles ツールキット内には「特別な」存在しないディレクトリが定義されています。この特別なディレクトリに書き込まれたファイルは MemFiles によってキャプチャされ、メモリに書き込まれ、その後 Teamserver にダウンロードできます。
MemFiles は、Beacon プロセス内で実行され、出力を特定のディレクトリに書き込むように指示できるほとんどの(すべてではありません)ツールと互換性があります。動作に昇格された特権は必要ありません。
これには以下が含まれます:
-BOF
-inline-executeAssembly などを使用してインラインで実行される .NET アセンブリ
-Inline-Execute-PE などを使用してインラインで実行される PE
これらはすべて、関連する NtAPI がフックされている Beacon プロセス内で実行されるため、互換性があります。
MemFiles は以下のようなものでは動作しません:
-execute-assembly
-shell
-run
これらはすべて、NtAPI がフックされていない別のプロセスを起動するため、互換性がありません。
MemFiles は、Beacon プロセス内で実行された場合、Rubeus、SharpHound、Procdump、Powershell などのツールで正常にテストされています。

リポジトリをクローンし、必要に応じて /PIC/Source/NtCreateFile.c と /PIC/Source/NtOpenFile.c の両方の 56 行目で定義されている hookdir 変数を変更します。この変数は、MemFiles に作成中のファイルをインターセプトする必要があることを知らせる「特別な」ディレクトリです。hookdir 変数はデフォルトで "redteam" に設定されています。この変数がターゲットシステム上の実際のディレクトリではないこと、および両方のファイルで同じであることを確認してください!

'make all' を実行して、必要な BOF と PIC 関数の両方をコンパイルします。
MemFiles.cna を CobaltStrike クライアントにロードします。CobaltStrike が実行されているディレクトリがユーザーによって書き込み可能であることを確認してください。MemFiles は、MemFiles が機能するために必要なデータの可用性を確保するために、そこにテキストファイル (memfiles.txt) を作成します。
MemFiles は、Teamserver にコールインする各新しい Beacon にインストールされるように構成できます。これは、MemFiles->Config メニュー項目を使用して実現されます。デフォルトでは、MemFiles は新しい Beacon に自動インストールされません。これはグローバル設定であることに注意してください。2 つのクライアントが Teamserver に接続され、両方に MemFiles.cna がロードされている場合、クライアント A が「Install on beacon initial」設定を切り替えると、その変更はクライアント B にも反映されます!

MemFiles は、BOF を実行する 4 つのターゲット向けコマンドと、プロジェクトのデータ構造を操作する 1 つの内部コマンドで構成されています。
ターゲット向け:
内部データ構造:
meminit は、Beacon プロセスに MemFiles をインストールする役割を担います。
MemFiles によってフックされる NtAPI のリストは次のとおりです:
meminit は以下の主要なアクションを実行します:
memlist は、特定の Beacon について MemFiles によって現在メモリに保存されているすべてのファイルを表示するために使用されます。

いくつかのフィールドが表示されます。ユーザーにとって最も関連性が高く関心のあるものは、ファイルの名前と保存されたデータの長さです。
memfetch は、特定の Beacon について MemFiles によってメモリに保存されたファイルを実際に取得するために使用されます。
デフォルトでは、memfetch は MemFiles によって保存され、「ハンドル」が閉じられているすべてのファイルを取得します。この設計上の選択は、プログラム/アプリケーションが書き込みを完了していないファイルをダウンロードしようとすることに関連する問題を回避するために行われました。
つまり、プログラム/アプリケーションがファイルに対して開いたハンドルを閉じない場合、そのファイルは memfetch によってダウンロードされません。
これは、memfetch で "force" 引数を使用することで軽減できます。つまり、ハンドルの状態に関係なくすべてのファイルをメモリから取得するには、'memfetch force' を使用します。
memfetch がメモリから取得したファイルはダウンロードとして Teamserver に送り返され、CobaltStrike の Downloads タブを介して Teamserver からクライアントに同期できます。
ファイルが Teamserver によってダウンロードされると、Beacon プロセスのメモリから消去され、そのエントリは memlist で表示されなくなります。
memclean は、Beacon プロセスから MemFiles をクリーンアップして削除する役割を担います。
MemFiles の標準的な使用例は、MemFiles をインストールし、Beacon の存続期間中インストールしたままにすることです。ただし、MemFiles をツールと組み合わせてファイル出力をキャプチャして取得し、その後 MemFiles をアンインストールしてそのアーティファクトがメモリに残らないようにしたい場合は、memclean を使用して、meminit が実行される前の元の状態に Beacon プロセスを戻すことができます。
これには以下が含まれます:
memclean がこれらのアクションを実行する前に、MemFiles によってメモリに保存されたファイルを強制的にダウンロードすることに注意してください。MemFiles を単一のツールで使用してから削除する場合は、memfetch の使用をスキップして、memclean だけを使用してファイルの取得と MemFiles の Beacon プロセスからの削除を一度に行うことができます。
memtable は、MemFiles が現在インストールされている Beacon に関する情報を表示および追跡するために使用されます。また、グローバル構成情報も表示します。
各 CobaltStrike クライアントには独自の memtable があります。MemFiles は、接続されているすべての CobaltStrike クライアント間でのデータの同期を確保するために多大な努力を払っており、すべてのオペレーターがすべての Beacon で MemFiles を使用できるようにしています。詳細については、「Design Considerations and Commentary」を参照してください。

meminit コマンドを使用して、Beacon に MemFiles を初期化します。これは、MemFiles->Config メニューでオプションを切り替えることによって自動的に行われるように構成できます。

MemFiles が初期化されると、お気に入りのツールを使用してファイルをメモリに書き込むことができます! その方法は特定のツールによって異なります。複数のファイルを出力するディレクトリを指定できるものもありますが、ツールによって作成される単一のファイルに絶対パスを指定できるものもあります。いくつかの例を以下に示します:
ここでは、SharpHound が生成したすべてのファイルを c:\redteam\ ディレクトリ(特別な MemFiles ディレクトリ)に出力し、ファイルを zip 圧縮しないように指定しています。MemFiles はメモリからファイルを読み取るプログラムをサポートしておらず、書き込みのみをサポートしているため、SharpHound の zip 機能は機能しません。

Rubeus では "dump" コマンドが使用され、すべてのコンソール出力を(特別なディレクトリにある)ファイルに送信するように指示します。

この例では、Inline-Execute-PE を使用して powershell.exe を Beacon プロセスにロードし、'Get-ADUser' を実行してドメインユーザーのリストを取得しています。パイプと 'out-file' を使用して、データをメモリに書き込んでから取得できます。

ファイルを取得するには、memfetch を実行します:

MemFiles の使用が終了したとき、および/または Beacon プロセスにインストールしたままにしたくないときは、memclean を実行します:

上記の例では、まだダウンロードされていないファイルがあったことに注意してください。memclean はこのファイルをダウンロードし、MemFiles をアンインストールする前にメモリから消去します。
memtable を使用して MemFiles のステータスと構成を照会します。長時間の操作中は、memtable から死んだ/古い Beacon のエントリをクリアして、乱雑にならないようにします。

はじめにで強調したように、MemFiles が機能するには Beacon プロセス内にクリーンな NTDLL のコピーが必要です。これは、NtFunction 内の元のバイトを読み取り、特定のバイトをトランポリンにコピーし、そのトランポリンが後で MemFiles が干渉すべきではない NtFunction への通常の呼び出しを完了するために使用されるためです。このテーマについては、「Technical Details, Design Considerations, and Commentary」セクションで詳しく説明します。
MemFiles は各ファイルに対して最初に 1048576 バイトを割り当てます。データがメモリに書き込まれると、より大きなファイルを保持するために、必要に応じてこの割り当てを拡張できます。