hacktricks/windows-hardening/windows-local-privilege-escalation/dll-hijacking/writable-sys-path-+dll-hijacking-privesc.md

9 KiB

Writable Sys Path +Dll Hijacking Privesc

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥

Introducción

Si descubres que puedes escribir en una carpeta de la Ruta del Sistema (ten en cuenta que esto no funcionará si puedes escribir en una carpeta de la Ruta del Usuario), es posible que puedas escalar privilegios en el sistema.

Para hacerlo, puedes abusar de un Dll Hijacking donde vas a secuestrar una biblioteca que está siendo cargada por un servicio o proceso con más privilegios que los tuyos, y debido a que ese servicio está cargando una Dll que probablemente ni siquiera existe en todo el sistema, intentará cargarla desde la Ruta del Sistema donde puedes escribir.

Para obtener más información sobre qué es el Dll Hijacking, consulta:

{% content-ref url="../dll-hijacking.md" %} dll-hijacking.md {% endcontent-ref %}

Privesc con Dll Hijacking

Encontrar una Dll faltante

Lo primero que necesitas es identificar un proceso que se esté ejecutando con más privilegios que tú y que esté intentando cargar una Dll desde la Ruta del Sistema en la que puedes escribir.

El problema en estos casos es que probablemente esos procesos ya estén en ejecución. Para encontrar qué Dlls faltan en los servicios que necesitas, debes lanzar procmon lo antes posible (antes de que se carguen los procesos). Entonces, para encontrar las Dlls faltantes, haz lo siguiente:

  • Crea la carpeta C:\privesc_hijacking y agrega la ruta C:\privesc_hijacking a la variable de entorno de la Ruta del Sistema. Puedes hacer esto 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")
}
  • Ejecute procmon y vaya a Options --> Enable boot logging y presione OK en el mensaje.
  • Luego, reinicie. Cuando la computadora se reinicie, procmon comenzará a grabar eventos lo antes posible.
  • Una vez que Windows se inicie, ejecute procmon nuevamente, le indicará que ha estado en ejecución y le preguntará si desea almacenar los eventos en un archivo. Diga y almacene los eventos en un archivo.
  • Después de que se genere el archivo, cierre la ventana abierta de procmon y abra el archivo de eventos.
  • Agregue estos filtros y encontrará todas las Dll que algún proceso intentó cargar desde la carpeta de ruta del sistema escribible:

Dlls perdidas

Al ejecutar esto en una máquina virtual (vmware) gratuita de Windows 11, obtuve estos resultados:

En este caso, los .exe son inútiles, así que ignórelos, las DLL perdidas eran de:

Servicio Dll Línea de comandos
Programador de tareas (Schedule) WptsExtensions.dll C:\Windows\system32\svchost.exe -k netsvcs -p -s Schedule
Servicio de directiva de diagnóstico (DPS) Unknown.DLL C:\Windows\System32\svchost.exe -k LocalServiceNoNetwork -p -s DPS
??? SharedRes.dll C:\Windows\system32\svchost.exe -k UnistackSvcGroup

Después de encontrar esto, encontré esta interesante publicación de blog que también explica cómo abusar de WptsExtensions.dll para la escalada de privilegios. Que es lo que haremos ahora.

Explotación

Entonces, para escalar privilegios, vamos a secuestrar la biblioteca WptsExtensions.dll. Teniendo la ruta y el nombre, solo necesitamos generar la DLL maliciosa.

Puede intentar usar cualquiera de estos ejemplos. Podría ejecutar cargas útiles como: obtener una shell inversa, agregar un usuario, ejecutar un beacon...

{% hint style="warning" %} Tenga en cuenta que no todos los servicios se ejecutan con NT AUTHORITY\SYSTEM algunos también se ejecutan con NT AUTHORITY\LOCAL SERVICE que tiene menos privilegios y no podrá crear un nuevo usuario abusar de sus permisos.
Sin embargo, ese usuario tiene el privilegio seImpersonate, por lo que puede usar la suite de patatas para escalar privilegios. Entonces, en este caso, una shell inversa es una mejor opción que intentar crear un usuario. {% endhint %}

En el momento de escribir esto, el servicio Programador de tareas se ejecuta con Nt AUTHORITY\SYSTEM.

Habiendo generado la DLL maliciosa (en mi caso usé una shell inversa x64 y obtuve una shell de vuelta, pero Defender la mató porque era de msfvenom), guárdela en la ruta del sistema escribible con el nombre WptsExtensions.dll y reinicie la computadora (o reinicie el servicio o haga lo que sea necesario para volver a ejecutar el servicio/programa afectado).

Cuando se reinicie el servicio, la DLL debería cargarse y ejecutarse (puede reutilizar el truco de procmon para verificar si la biblioteca se cargó como se esperaba).

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥