
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 を複数回実行しようとすると問題が発生する可能性があります。エラーが発生した場合は、ウィンドウを閉じて再度起動してください。
Visual Studio がすぐに利用できない場合は、代わりに MinGW-w64 を使用してプロキシ DLL をコンパイルできます。たとえば Ubuntu プラットフォームでは、MinGW は次のようにインストールできます:sudo apt install g++-mingw-w64-x86-64-win32 g++-mingw-w64-i686-win32
# 32 ビット DLL を作成
i686-w64-mingw32-g++ -c -o <target>.o <target>.cpp -D ADD_EXPORTS
i686-w64-mingw32-g++ -o <target>.dll <target>.o <target>.def -s -shared -Wl,--subsystem,windows
# 64 ビット DLL を作成
x86_64-w64-mingw32-g++ -c -o <target>.o <target>.cpp -D ADD_EXPORTS
x86_64-w64-mingw32-g++ -o <target>.dll <target>.o <target>.def -s -shared -Wl,--subsystem,windows
ライブラリを 64 ビットにするか 32 ビットにするかの指定を含め、ビルドプロセスを自動化するには:
bash ./build.sh を実行します。.dll 以外で終わる場合は、必要に応じてコンパイルされたファイルの名前を変更します。VU#114757 で概説されているように、古い Acronis ソフトウェアには複数の権限昇格の脆弱性が含まれています。
openssl.cnf の配置。C:\ProgramData\Acronis ディレクトリの不適切な ACL。Crassus はこれらの問題を両方とも自動的に発見します。

コンパイルした curl.dll ファイルを C:\ProgramData\Acronis\Agent\var\atp-downloader\ ディレクトリに配置し、新しい Process Monitor ブートログで再起動すると、calc.exe を実行するペイロードが SYSTEM 権限で実行されていることがわかります。

脆弱な Acronis ソフトウェアは、2 つの異なる場所から openssl.cnf の読み込みを試みます。テンプレートの openssl.cnf ファイルを c:\jenkins_agent\workspace\tp-openssl-win-vs2013\17\product\out\standard\vs_2013_release\openssl\ssl に、32 ビットの calc.dll ペイロードを c:\tmp に配置します。

VU#240785 で概説されているように、古い Atlassian Bitbucket ソフトウェアは、インストールディレクトリの弱い ACL が原因で権限昇格に対して脆弱です。C:\Program Files\ やその他の ACL 制限された場所の外部にインストールされる Windows ソフトウェアと同様に、ソフトウェアインストーラがターゲットディレクトリに明示的に ACL を設定する必要があります。
Crassus は、このソフトウェアを使用して権限昇格を達成するための多くの方法を発見します。以下を含みます:

Crassus の出力で、c:\atlassian\bitbucket\7.9.1\elasticsearch\bin\elasticsearch-service-x64.exe が特権を持っていることがわかりますが、実行中であるため単純に置き換えることはできません。ただし、別のトリックを使用してハイジャックできます。そのディレクトリの名前を変更し、同じ名前の新しいディレクトリを作成し、同じ名前のペイロードを配置するだけです。

Process Monitor のブートログで再起動すると、植え付けられた elasticsearch-service-x64.exe ファイルが実際のものの代わりに実行されていることを確認できます(Windows 電卓アイコンに基づく)。

VU#287178 で概説されているように、古いバージョンの McAfee ソフトウェアは openssl.cnf を介した権限昇格に対して脆弱です。見てみましょう:

このブートログに openssl.cnf への 2 つの異なる参照がある理由を確認するには、results.csv ファイルを参照します。

D:\ パスからの openssl.cnf ファイルの読み込みは、手動によるさらなる調査が必要です。このようなパスを読み込む可能性は、問題のプラットフォームとシステムへのアクセス権に依存します。オプティカルディスクを作成して、オプティカルドライブにも解決されるパスを参照する openssl.cnf ファイルを提供できる可能性があります。
SQL Server 2022 は、非標準の場所にインストールされていない限り、弱い ACL による権限昇格に対して明らかに脆弱ではありません。C:\Program Files 以外の場所にインストールされた場合、Crassus は権限昇格の可能性を複数明らかにします。特権コンポーネントを含むほとんどの Windows アプリケーションは、本質的にセキュアな ACL が既に設定されていないディレクトリにインストールされた場合、この方法で悪用可能と思われます。

Crassus が、ユーザーが植え付けたり変更したりできるファイルの特権読み込みを報告した場合、それが必ずしも悪用可能なシナリオであるとは限りません。Crassus は 潜在的に 興味深いファイルタイプを探しますが、Process Monitor ログファイルは、そのファイルが存在した場合に関連プロセスがそれで 何をしていたか を直接示すわけではありません。プログラムアイコンの抽出のように単純な場合もあります。Process Monitor でファイル操作のコールスタックを調査すると、何が行われていたかのヒントが得られる可能性があります。または、より簡単な brute force の方法を好む場合は、単にファイルを配置し、新しい Process Monitor ブートログで動作を調査します。また、Crassus がライブラリを見つけられず、どのエクスポートが存在すべきかを知ることができないか、または Crassus が見つけたエクスポートが適切な DLL コンパイルを妨げる方法で競合する場合もあります。そのような場合、Crassus は関数名をエクスポートしない DLL を作成することにフォールバックします。ターゲットアプリケーションがライブラリを読み込む方法によっては、期待される関数名や序数がないと、ターゲットアプリケーションがライブラリを正常に読み込めない可能性があります。このシナリオでは、プロキシ DLL がどのようなものであるべきかを判断するために手動での対応が必要になります。
Crassus は、関心のあるパスを発見するために特権ファイル操作を探します。特権プロセスと非特権プロセスの両方がパスにアクセスするが、存在する可能性のあるものを実行するのは非特権プロセスだけであるシナリオに遭遇する可能性があります。あるいは、親プロセスが特権で実行されるが、子プロセスをより低い権限で明示的に生成する場合もあります。
特にソフトウェアを初めてインストールするときやアップデートをインストールするときに、Process Monitor は悪用可能に見えるがシステムが起動するたびには発生しないファイル操作をログに記録することがあります。このようなイベントが発生した後の最初の再起動時に、これらの操作を悪用できる可能性があります。このようなエッジケースを避けるために、以降のブートログに同じ報告されたファイル操作が含まれていることを確認してください。
タイポ、バグ、新機能など、Crassus は以下の点に同意する限り、貢献を広く受け付けています: