Writable Sys Path +Dll Hijacking Privesc

Tip

Impara e pratica AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Impara e pratica Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE) Sfoglia il catalogo completo di HackTricks Training per i percorsi di assessment (ARTA/GRTA/AzRTA) e Linux Hacking Expert (LHE).

Supporta HackTricks

Introduzione

Se hai scoperto di poter scrivere in una cartella del System Path (nota che questo non funzionerà se puoi scrivere in una cartella del User Path), è possibile che tu possa escalare i privilegi nel sistema.

Per farlo puoi abusare di un Dll Hijacking, in cui andrai a hijackare una library in fase di caricamento da parte di un service o process con più privilegi dei tuoi, e poiché quel service sta caricando una Dll che probabilmente non esiste nemmeno nell’intero sistema, proverà a caricarla dal System Path in cui puoi scrivere.

Per maggiori info su cos’è il Dll Hijackig controlla:

Dll Hijacking

Privesc con Dll Hijacking

Trovare una Dll mancante

La prima cosa di cui hai bisogno è identificare un process in esecuzione con più privilegi dei tuoi che sta cercando di caricare una Dll dal System Path in cui puoi scrivere.

Ricorda che questa tecnica dipende da una voce Machine/System PATH, non solo dal tuo User PATH. Quindi, prima di perdere tempo con Procmon, conviene enumerare le voci del Machine PATH e verificare quali sono scrivibili:

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

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 così:

  • Crea la cartella C:\privesc_hijacking e aggiungi il path C:\privesc_hijacking alla variabile di ambiente System Path. Puoi farlo manualmente oppure 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 su Options –> Enable boot logging e premi OK nel prompt.
  • Poi, riavvia. Quando il computer viene riavviato procmon inizierà a registrare gli eventi il prima possibile.
  • Una volta che Windows è avviato esegui procmon di nuovo, ti dirà che è stato in esecuzione e ti chiederà se vuoi salvare gli eventi in un file. Rispondi yes e salva gli eventi in un file.
  • Dopo che il file è stato generato, chiudi la finestra aperta di procmon e apri il file degli eventi.
  • Aggiungi questi filtri e troverai tutte le Dll che qualche processo ha cercato di caricare dalla cartella writable System Path:

Tip

Il boot logging è necessario solo per i servizi che si avviano troppo presto per poterli osservare altrimenti. Se puoi attivare il servizio/program target on demand (per esempio, interagendo con la sua interfaccia COM, riavviando il servizio o rilanciando un task pianificato), di solito è più veloce mantenere una normale cattura di Procmon con filtri come Path contains .dll, Result is NAME NOT FOUND, e Path begins with <writable_machine_path>.

Missed Dlls

Eseguendo questo in una free virtual (vmware) Windows 11 machine ho ottenuto questi risultati:

In questo caso gli .exe sono inutili quindi ignorali, le DLL mancanti erano:

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

Dopo aver trovato questo, ho trovato questo interessante post sul blog che spiega anche come abuse WptsExtensions.dll for privesc. Ed è quello che faremo ora.

Other candidates worth triaging

WptsExtensions.dll è un buon esempio, ma non è l’unico phantom DLL ricorrente che compare nei servizi privilegiati. Le regole moderne di hunting e i cataloghi pubblici di hijack tracciano ancora nomi come:

Service / ScenarioMissing DLLNotes
Task Scheduler (Schedule)WptsExtensions.dllClassico candidato SYSTEM sui sistemi client. Utile quando la directory writable si trova nel Machine PATH e il servizio verifica la DLL durante l’avvio.
NetMan on Windows Serverwlanhlp.dll / wlanapi.dllInteressante sulle server editions perché il servizio gira come SYSTEM e può essere attivato on demand da un utente normale in alcune build, rendendolo migliore dei casi che richiedono solo il riavvio.
Connected Devices Platform Service (CDPSvc)cdpsgshims.dllDi solito produce prima NT AUTHORITY\LOCAL SERVICE. Spesso è ancora sufficiente perché il token ha SeImpersonatePrivilege, quindi puoi concatenarlo con RoguePotato / PrintSpoofer.

Considera questi nomi come indizi di triage, non come vittorie garantite: dipendono da SKU/build, e Microsoft può cambiare il comportamento tra una release e l’altra. Il punto importante è cercare DLL mancanti in servizi privilegiati che attraversano il Machine PATH, soprattutto se il servizio può essere riattivato senza riavviare.

Exploitation

Quindi, per escalate privileges andremo a hijackare la libreria WptsExtensions.dll. Avendo il path e il nome ci basta generare la dll malevola.

Puoi provare a usare uno qualsiasi di questi esempi. Potresti eseguire payload come: ottenere una rev shell, aggiungere un utente, eseguire un beacon…

Warning

Nota che non tutti i service vengono eseguiti con NT AUTHORITY\SYSTEM alcuni vengono eseguiti anche con NT AUTHORITY\LOCAL SERVICE che ha meno privilegi e non potrai creare un nuovo utente abusando dei suoi permessi.
Tuttavia, quell’utente ha il privilegio seImpersonate, quindi puoi usare la potato suite to escalate privileges. Quindi, in questo caso una rev shell è un’opzione migliore che provare a creare un utente.

Al momento della stesura, il servizio Task Scheduler viene eseguito con Nt AUTHORITY\SYSTEM.

Dopo aver generato la Dll malevola (nel mio caso ho usato una x64 rev shell e ho ottenuto una shell, ma defender l’ha uccisa perché proveniva da msfvenom), salvala nel writable System Path con il nome WptsExtensions.dll e riavvia il computer (o riavvia il servizio o fai tutto ciò che serve 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 verificare se la libreria è stata caricata come previsto).

References

Tip

Impara e pratica AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Impara e pratica Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE) Sfoglia il catalogo completo di HackTricks Training per i percorsi di assessment (ARTA/GRTA/AzRTA) e Linux Hacking Expert (LHE).

Supporta HackTricks