Dll Hijacking
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Bug bounty tip: sign up for Intigriti, a premium bug bounty platform created by hackers, for hackers! Join us at https://go.intigriti.com/hacktricks today, and start earning bounties up to $100,000!
DLL Hijackingは、信頼されたアプリケーションを操作して悪意のあるDLLを読み込ませることを含みます。この用語は、DLL Spoofing、Injection、Side-Loadingなどのいくつかの戦術を含みます。主にコード実行、持続性の達成、そしてあまり一般的ではない特権昇格に利用されます。ここでは昇格に焦点を当てていますが、ハイジャックの方法は目的に関係なく一貫しています。
DLLハイジャックにはいくつかの方法があり、各アプリケーションのDLL読み込み戦略に応じて効果が異なります:
DLL Replacement: 本物のDLLを悪意のあるDLLと入れ替え、オプションでDLL Proxyingを使用して元のDLLの機能を保持します。
DLL Search Order Hijacking: 悪意のあるDLLを正当なDLLの前に検索パスに配置し、アプリケーションの検索パターンを悪用します。
Phantom DLL Hijacking: アプリケーションが存在しない必要なDLLだと思い込んで読み込む悪意のあるDLLを作成します。
DLL Redirection: %PATH%
や.exe.manifest
/ .exe.local
ファイルの検索パラメータを変更して、アプリケーションを悪意のあるDLLに誘導します。
WinSxS DLL Replacement: WinSxSディレクトリ内で正当なDLLを悪意のあるDLLに置き換えます。この方法はDLLサイドローディングに関連しています。
Relative Path DLL Hijacking: コピーしたアプリケーションと共にユーザーが制御するディレクトリに悪意のあるDLLを配置し、Binary Proxy Execution技術に似ています。
システム内の欠落しているDLLを見つける最も一般的な方法は、sysinternalsからprocmonを実行し、次の2つのフィルターを設定します:
そして、ファイルシステムアクティビティのみを表示します:
一般的に欠落しているdllを探している場合は、これを数秒間実行します。 特定の実行可能ファイル内の欠落しているdllを探している場合は、**"Process Name" "contains" "<exec name>"**のような別のフィルターを設定し、それを実行してイベントのキャプチャを停止する必要があります。
特権を昇格させるための最良のチャンスは、特権プロセスが読み込もうとする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レジストリキーによって指定されたアプリケーションごとのパスを含まないことに注意してください。DLL検索パスを計算する際にApp Pathsキーは使用されません。
これは、SafeDllSearchModeが有効な場合のデフォルトの検索順序です。無効にすると、現在のディレクトリが2番目の位置に昇格します。この機能を無効にするには、HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\SafeDllSearchModeレジストリ値を作成し、0に設定します(デフォルトは有効です)。
LoadLibraryEx関数がLOAD_WITH_ALTERED_SEARCH_PATHで呼び出されると、検索はLoadLibraryExが読み込んでいる実行可能モジュールのディレクトリから始まります。
最後に、dllは名前だけでなく絶対パスを指定して読み込まれる可能性があることに注意してください。その場合、そのdllはそのパス内でのみ検索されます(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がフルパスで特定されたかどうかに関係なく、モジュール名のみで示されたかのように行われます。
Requirements:
異なる特権(水平または側方移動)で動作するか、動作するプロセスを特定し、DLLが欠落していることを確認します。
DLLが検索される任意のディレクトリに書き込みアクセスがあることを確認します。この場所は、実行可能ファイルのディレクトリまたはシステムパス内のディレクトリである可能性があります。
はい、要件は見つけるのが難しいです。デフォルトでは、特権のある実行可能ファイルがDLLを欠落させているのは奇妙ですし、システムパスフォルダーに書き込み権限を持つのはさらに奇妙です(デフォルトではできません)。しかし、誤って設定された環境ではこれは可能です。 運が良ければ要件を満たしている場合、UACMEプロジェクトを確認できます。プロジェクトの主な目的はUACをバイパスすることですが、使用できるWindowsバージョンのDLLハイジャックのPoC**が見つかるかもしれません(おそらく書き込み権限のあるフォルダーのパスを変更するだけで済みます)。
フォルダー内の権限を確認するには、次のようにします:
And すべてのフォルダーのパーミッションを確認する PATH 内:
You can also check the imports of an executable and the exports of a dll with:
あなたはまた、実行可能ファイルのインポートとdllのエクスポートを確認することができます:
For a full guide on how to abuse Dll Hijacking to escalate privileges with permissions to write in a System Path folder check:
Writable Sys Path +Dll Hijacking PrivescWinpeas は、システムPATH内の任意のフォルダーに書き込み権限があるかどうかを確認します。 この脆弱性を発見するための他の興味深い自動化ツールは、PowerSploit関数:Find-ProcessDLLHijack、Find-PathDLLHijack、および _Write-HijackDll_です。
利用可能なシナリオを見つけた場合、成功裏にそれを悪用するための最も重要なことの1つは、実行可能ファイルがインポートするすべての関数を少なくともエクスポートするdllを作成することです。とにかく、Dll Hijackingは、中程度の整合性レベルから高い整合性レベルに昇格するために便利です(UACをバイパス)または高い整合性からSYSTEMに昇格するために。 有効なdllを作成する方法の例は、実行のためのdllハイジャックに焦点を当てたこのdllハイジャック研究の中にあります:https://www.wietzebeukema.nl/blog/hijacking-dlls-in-windows。 さらに、次のセクションでは、テンプレートとして役立つか、エクスポートされた非必須関数を持つdllを作成するためのいくつかの基本的なdllコードを見つけることができます。
基本的に、Dllプロキシは、読み込まれたときに悪意のあるコードを実行することができるDllですが、実際のライブラリへのすべての呼び出しを中継することによって、期待通りに機能することもできます。
ツールDLLirantまたはSpartacusを使用すると、実行可能ファイルを指定し、プロキシ化したいライブラリを選択してプロキシ化されたdllを生成することができます。または、Dllを指定して、プロキシ化されたdllを生成することもできます。
Get rev shell (x64):
メーターpreterを取得する (x86):
ユーザーを作成する (x86のバージョンしか見ていませんでした):
いくつかのケースでは、コンパイルしたDllは、被害者プロセスによってロードされるいくつかの関数をエクスポートする必要があります。これらの関数が存在しない場合、バイナリはそれらをロードできず、エクスプロイトは失敗します。
バグバウンティのヒント: ハッカーによって、ハッカーのために作られたプレミアム バグバウンティプラットフォーム Intigritiにサインアップ しましょう!今日、https://go.intigriti.com/hacktricks に参加して、最大 $100,000 のバウンティを獲得し始めましょう!
AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE) GCPハッキングを学び、実践する: HackTricks Training GCP Red Team Expert (GRTE)