PersistBOF
共通の永続化メカニズムを自動化するためのツール。現在、Print Monitor(SYSTEM)、Time Provider(Network Service)、スタートフォルダショートカットハイジャック(User)、Junctionフォルダ(User)、Xllアドイン(User)をサポートしています。
Usage
リポジトリをクローンし、makeを実行し、.cnaをCobalt Strikeクライアントに追加します。
CSコンソールで「help persist-ice」を実行。
構文:
- persist-ice [PrintMon, TimeProv, Shortcut, Junction, Xll] [persist or clean] [arg1] [arg2];
テクニック概要
これらのテクニックはすべて、DLLファイルを別途ディスクに配置する必要があります。これは意図的にBOFの一部ではありません。
Xll Add-in
xlAutoOpen()をエクスポートするDLLを作成します。.dllを.xllにリネームし、%appdata%\Microsoft\Addinsに配置します。Excelが開かれるたびに通知なしで読み込まれます。レジストリキーをHKEY_CURRENT_USER\SOFTWARE\Microsoft\Office{バージョン番号}\Excel\Optionsに書き込みます。複数存在する可能性があるため、正しいバージョン番号を指定します。
例:
- persist-ice Xll persist XllName.xll 16
- persist-ice Xll clean XllName.xll 16 > レジストリキーを削除し、DLLの削除を試みます。
Print Monitor
DLLはBOFを実行する前に、ディスク上かつPATH内の場所(DLL検索順序)に存在している必要があります。そうでなければ失敗します。DLLは即座にspoolsv.exeによってSYSTEMとして読み込まれます。これは管理者からSYSTEMへの権限昇格や永続化に使用できます。システム起動時に実行されます。実行には昇格が必要です。
- プロジェクト内のPrint Monitor DLLのデモ
例:
- upload NotMalware.dll to C:\Windows\NotMalware.dll
- persist-ice PrintMon persist TotesLegitMonitor NotMalware.dll
- すぐにSYSTEMとして実行されます
- 削除されるまで起動時に実行されます
- persist-ice PrintMon clean TotesLegitMonitor C:\Windows\NotMalware.dll > レジストリキーを削除し、DLLをアンロードし、正しいパスが指定されればDLLの削除を試みます。成功するはずです。
Time Provider
BOF実行後、起動時にsvchost.exeによってNETWORK SERVICEとして読み込まれます(ポテトの準備を!)。実行には昇格が必要です。
- プロジェクト内のTime Provider DLLのデモ
例:
- persist-ice TimeProv persist TotesLegitTimeProvider C:\anywhere\NotMalware.dll
- persist-ice TimeProv clean TotesLegitTimeProvider C:\anywhere\NotMalware.dll > レジストリキーを削除し、正しいパスが指定されればDLLの削除を試みます。プロセスによってDLLがアンロードされないため、おそらく失敗します。
Junction Folder
Vault 7リークで示されたものと同じテクニック。ユーザーログイン時に実行。昇格不要。DLLはexplorer.exeに読み込まれます。
注意: 正しく動作させるには、COMサーバーDLLである必要があります。実行しようとしている内容に応じて、DllRegisterServer、DllMain、またはDllGetClassObjectからコードを実行できます。他の必要なエクスポートも実装してください。
例:
- persist-ice Juction persist TotesLegitFolder C:\user-writable-folder\NotMalware.dll Save CLSID
- persist-ice Juction clean TotesLegitFolder C:\user-writable-folder\NotMalware.dll 6be5e092-90cc-452d-be83-208029e259e0 > レジストリキー、ジャンクションフォルダを削除し、DLLの削除を試みます。
Start Folder Hijack
新しくユーザー書き込み可能なフォルダを作成し、ハイジャック可能なWindowsバイナリをそのフォルダにコピーし、スタートアップフォルダにショートカットを作成します。ユーザーログイン時に実行。昇格不要。
例:
- persist-ice Shortcut persist C:\TotesLegitFolder C:\Windows\System32\Dism.exe > プロキシDLLとしてDLLをdismcore.dllとしてC:\TotesLegitFolderにアップロードします。
- persist-ice Shortcut clean C:\TotesLegitFolder C:\Windows\System32\Dism.exe > 新しいフォルダ内のすべてのファイルを削除し、その後フォルダ自体を削除しようとします。DLLがプロセス内でまだ読み込まれている場合、これは失敗します。
References
https://stmxcsr.com/persistence/print-monitor.html
https://stmxcsr.com/persistence/time-provider.html
https://pentestlab.blog/2019/10/28/persistence-port-monitors/
https://blog.f-secure.com/hunting-for-junction-folder-persistence/
https://attack.mitre.org/techniques/T1547/010/
https://attack.mitre.org/techniques/T1547/003/
https://attack.mitre.org/techniques/T1547/009/