5.5 KiB
Writable Sys Path +Dll Hijacking Privesc
{{#include ../../../banners/hacktricks-training.md}}
Introduzione
Se hai scoperto che puoi scrivere in una cartella di System Path (nota che questo non funzionerà se puoi scrivere in una cartella di User Path) è possibile che tu possa escalare i privilegi nel sistema.
Per fare ciò puoi abusare di un Dll Hijacking dove andrai a hijackare una libreria che viene caricata da un servizio o processo con più privilegi dei tuoi, e poiché quel servizio sta caricando una Dll che probabilmente non esiste nemmeno nell'intero sistema, cercherà di caricarla dal System Path dove puoi scrivere.
Per ulteriori informazioni su cosa è Dll Hijacking controlla:
{{#ref}} ./ {{#endref}}
Privesc con Dll Hijacking
Trovare una Dll mancante
La prima cosa di cui hai bisogno è identificare un processo in esecuzione con più privilegi di te che sta cercando di caricare una Dll dal System Path in cui puoi scrivere.
Il problema in questi casi è che probabilmente quei processi sono già in esecuzione. Per trovare quali Dll mancano ai servizi devi avviare procmon il prima possibile (prima che i processi vengano caricati). Quindi, per trovare le .dll mancanti fai:
- Crea la cartella
C:\privesc_hijacking
e aggiungi il percorsoC:\privesc_hijacking
alla variabile d'ambiente System Path. Puoi farlo manualmente o con 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")
}
- Avvia
procmon
e vai suOptions
-->Enable boot logging
e premiOK
nel prompt. - Poi, riavvia. Quando il computer si riavvia,
procmon
inizierà a registrare eventi il prima possibile. - Una volta che Windows è avviato, esegui di nuovo
procmon
, ti dirà che è stato in esecuzione e ti chiederà se vuoi memorizzare gli eventi in un file. Rispondi sì e memorizza gli eventi in un file. - Dopo che il file è stato generato, chiudi la finestra di
procmon
aperta e apri il file degli eventi. - Aggiungi questi filtri e troverai tutti i Dll che alcuni processi hanno cercato di caricare dalla cartella del System Path scrivibile:

Dll mancanti
Eseguendo questo su una macchina virtuale (vmware) Windows 11 gratuita ho ottenuto questi risultati:

In questo caso gli .exe sono inutili, quindi ignorali, le DLL mancanti erano di:
Servizio | Dll | Riga di comando |
---|---|---|
Task Scheduler (Schedule) | WptsExtensions.dll | C:\Windows\system32\svchost.exe -k netsvcs -p -s Schedule |
Diagnostic Policy Service (DPS) | Unknown.DLL | C:\Windows\System32\svchost.exe -k LocalServiceNoNetwork -p -s DPS |
??? | SharedRes.dll | C:\Windows\system32\svchost.exe -k UnistackSvcGroup |
Dopo aver trovato questo, ho trovato questo interessante post sul blog che spiega anche come abuse WptsExtensions.dll for privesc. Che è ciò che stiamo per fare ora.
Sfruttamento
Quindi, per escalare i privilegi stiamo per dirottare la libreria WptsExtensions.dll. Avendo il percorso e il nome dobbiamo solo generare la dll malevola.
Puoi provare a usare uno di questi esempi. Potresti eseguire payload come: ottenere una rev shell, aggiungere un utente, eseguire un beacon...
Warning
Nota che non tutti i servizi vengono eseguiti con
NT AUTHORITY\SYSTEM
, alcuni vengono eseguiti anche conNT AUTHORITY\LOCAL SERVICE
che ha meno privilegi e non sarai in grado di creare un nuovo utente per abusare delle sue autorizzazioni.
Tuttavia, quell'utente ha il privilegioseImpersonate
, quindi puoi usare il potato suite per escalare i privilegi. Quindi, in questo caso, una rev shell è una migliore opzione rispetto a cercare di creare un utente.
Al momento della scrittura, il servizio Task Scheduler è eseguito con Nt AUTHORITY\SYSTEM.
Avendo generato la dll malevola (nel mio caso ho usato una rev shell x64 e ho ottenuto una shell di ritorno ma Defender l'ha uccisa perché proveniva da msfvenom), salvala nel System Path scrivibile con il nome WptsExtensions.dll e riavvia il computer (o riavvia il servizio o fai qualsiasi cosa per rieseguire il servizio/programma interessato).
Quando il servizio viene riavviato, la dll dovrebbe essere caricata ed eseguita (puoi riutilizzare il trucco di procmon per controllare se la libreria è stata caricata come previsto).
{{#include ../../../banners/hacktricks-training.md}}