Writable Sys Path +Dll Hijacking Privesc

Tip

AWS Hackingを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hackingを学び、実践する: HackTricks Training GCP Red Team Expert (GRTE)
Az Hackingを学び、実践する: HackTricks Training Azure Red Team Expert (AzRTE) HackTricks Trainingの全カタログ を閲覧して、評価トラック(ARTA/GRTA/AzRTA)と Linux Hacking Expert (LHE) を確認してください。

HackTricksをサポート

Introduction

もし System Path フォルダに書き込みできる ことが分かった場合(※ User Path フォルダ に書き込めるだけではこれは機能しません)、システム内で 権限昇格 できる可能性があります。

そのためには、Dll Hijacking を悪用します。これは、あなたより より高い権限 で動作するサービスやプロセスが 読み込もうとしているライブラリを hijack し、そのサービスが、おそらくシステム全体に存在しない Dll を読み込もうとするため、あなたが書き込める System Path からそれを読み込もうとする、というものです。

Dll Hijackig とは何かについての詳細は、こちらを確認してください:

Dll Hijacking

Privesc with Dll Hijacking

Finding a missing Dll

最初に必要なのは、あなたより 高い権限 で動作していて、あなたが書き込める System Path から Dll を読み込もうとしている プロセスを特定する ことです。

この手法は、あなたの User PATH だけでなく、Machine/System PATH のエントリに依存することを忘れないでください。したがって、Procmon に時間をかける前に、Machine PATH のエントリを列挙し、どれが書き込み可能かを確認する価値があります:

$machinePath = [Environment]::GetEnvironmentVariable("Path", "Machine") -split ';' | Where-Object { $_ }
$machinePath | ForEach-Object {
$path = $_.Trim()
if ($path) {
Write-Host "`n[*] $path"
icacls $path 2>$null
}
}

この場合の問題は、おそらくそれらのプロセスがすでに実行されていることです。どの Dlls が不足しているかを見つけるには、プロセスが読み込まれる前、できるだけ早く procmon を起動する必要があります。したがって、不足している .dlls を見つけるには、次を行います:

  • 作成 フォルダ C:\privesc_hijacking を作成し、C:\privesc_hijacking のパスを System Path env variable に追加します。これは 手動 でも PS でも行えます:
# Set the folder path to create and check events for
$folderPath = "C:\privesc_hijacking"

# Create the folder if it does not exist
if (!(Test-Path $folderPath -PathType Container)) {
New-Item -ItemType Directory -Path $folderPath | Out-Null
}

# Set the folder path in the System environment variable PATH
$envPath = [Environment]::GetEnvironmentVariable("PATH", "Machine")
if ($envPath -notlike "*$folderPath*") {
$newPath = "$envPath;$folderPath"
[Environment]::SetEnvironmentVariable("PATH", $newPath, "Machine")
}
  • procmon を起動し、Options –> Enable boot logging に移動して、プロンプトで OK を押します。
  • 次に、再起動します。コンピュータが再起動すると、procmon はできるだけ早くイベントの記録を開始します。
  • Windows が起動したら、もう一度 procmon実行します。すると、しばらく実行されていたことが表示され、イベントをファイルに保存したいか尋ねられますyes を選び、イベントをファイルに保存します。
  • ファイルが生成されたら、開いている procmon ウィンドウを閉じ、イベントファイルを開きます
  • 次のフィルタを追加すると、書き込み可能な System Path フォルダからいくつかの proccess が読み込もうとしたすべての Dll を見つけられます:

Tip

Boot logging が必要なのは、そうでなければ観測できないほど早く起動するサービスだけです。対象の service/program をオンデマンドでトリガーできるなら(たとえば、COM interface を操作する、service を再起動する、scheduled task を再実行するなど)、通常は Path contains .dllResult is NAME NOT FOUNDPath begins with <writable_machine_path> のようなフィルタを使った通常の Procmon capture を取るほうが速いです。

Missed Dlls

free の virtual (vmware) Windows 11 machine でこれを実行すると、次の結果になりました:

この場合、.exe は役に立たないので無視してください。見つからなかった DLL は次のものでした:

ServiceDllCMD line
Task Scheduler (Schedule)WptsExtensions.dllC:\Windows\system32\svchost.exe -k netsvcs -p -s Schedule
Diagnostic Policy Service (DPS)Unknown.DLLC:\Windows\System32\svchost.exe -k LocalServiceNoNetwork -p -s DPS
???SharedRes.dllC:\Windows\system32\svchost.exe -k UnistackSvcGroup

これを見つけたあと、WptsExtensions.dll を privesc に悪用する方法 も説明している興味深い blog post を見つけました。これが、これから行うことです。

Other candidates worth triaging

WptsExtensions.dll は良い例ですが、権限の高い services に現れる recurring な phantom DLL はそれだけではありません。最近の hunting rules や公開されている hijack catalog でも、次のような名前が追跡されています:

Service / ScenarioMissing DLLNotes
Task Scheduler (Schedule)WptsExtensions.dllclient systems での古典的な SYSTEM 候補。書き込み可能なディレクトリが Machine PATH にあり、service が起動時に DLL を探索する場合に有効です。
NetMan on Windows Serverwlanhlp.dll / wlanapi.dllserver editions では興味深いです。service が SYSTEM として実行され、一部の build では通常ユーザーがオンデマンドでトリガーできるため、再起動必須のケースより有利です。
Connected Devices Platform Service (CDPSvc)cdpsgshims.dll通常はまず NT AUTHORITY\LOCAL SERVICE になります。それでも token には SeImpersonatePrivilege があることが多いため、RoguePotato / PrintSpoofer と組み合わせられます。

これらの名前は確実な成功ではなく、triage のヒントとして扱ってください。SKU/build に依存し、Microsoft は release 間で動作を変更することがあります。重要なのは、Machine PATH をたどる権限の高い services の missing DLL を探すことです。特に、その service を再起動なしで再トリガーできる場合は重要です。

Exploitation

したがって、権限を昇格するために、library WptsExtensions.dll を hijack します。pathname が分かったので、あとは悪意のある dll を生成するだけです。

これらの例のいずれかを使ってみる ことができます。たとえば、rev shell を取得する、user を追加する、beacon を実行する、などが可能です…

Warning

すべての service が NT AUTHORITY\SYSTEM で実行されるわけではなく、NT AUTHORITY\LOCAL SERVICE で実行されるものもあります。こちらは権限が低く、user を新規作成して権限を悪用することはできません
ただし、その user には seImpersonate privilege があるため、potato suite を使って権限を昇格 できます。したがって、この場合は user を作成しようとするより rev shell のほうが適しています。

執筆時点では Task Scheduler service は Nt AUTHORITY\SYSTEM で実行されています。

悪意のある Dll を生成したら(私の場合は x64 rev shell を使い、shell は返ってきましたが msfvenom 由来だったため defender に殺されました)、それを writable System Path に WptsExtensions.dll という名前で保存し、コンピュータを再起動します(または service を再起動するか、影響を受ける service/program を再実行するのに必要なことを行います)。

service が再起動されると、dll が読み込まれて実行されるはずです(procmon の手法を再利用して、library が期待どおりに読み込まれたか確認できます)。

References

Tip

AWS Hackingを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hackingを学び、実践する: HackTricks Training GCP Red Team Expert (GRTE)
Az Hackingを学び、実践する: HackTricks Training Azure Red Team Expert (AzRTE) HackTricks Trainingの全カタログ を閲覧して、評価トラック(ARTA/GRTA/AzRTA)と Linux Hacking Expert (LHE) を確認してください。

HackTricksをサポート