La máquina Cap es una máquina fácil de HTB.
Resumen de conceptos trabajados en Cap:
• Enumerate ports/services (nmap) • IDOR • SSH access • Privilege Escalation SSH access • Capabilities |
Si es tu primera máquina en Hack The Box y no sabes cómo conectarte a la máquina del laboratorio, te recomiendo que visites este post donde te cuento cómo introducirte en esta plataforma.
A continuación, para conectarte a la máquina, tendrás que establecer la conexión con la máquina víctima de HTB conectándote a la VPN desde la carpeta donde la tengas descargada, y desde ahí ejecutarás el comando «sudo openvpn NOMBRE_VPN.ovpn».
Estructura del contenido
ENUMERACIÓN -> ESCANEO DE PUERTOS
Para asegurarme de que la máquina víctima está activa y puedo conectarme a ella, le lanzo o bien un PING con trace route (opcional) o directamente un nmap, de esta forma:
ping -c 1 10.10.10.245 -R
Vemos que el ping nos responde con el ttl de la máquina de 63, maquina Linux, que en realidad serían 64 pero HTB por la conexión con un nodo intermediario, lo reduce en 1 unidad.
Otra forma de ver si la máquina está activa o levantada es a través del comando nmap:
nmap -sn 10.10.10.245
Donde nos dice que efectivamente la máquina está activa «up».
Una vez comprobado que la máquina está activa, vamos a lanzar un nmap con permisos de root para ver qué puertos están abiertos y exportar el resultado en un fichero llamado «Escaneo»:
sudo nmap -p- --open -sS --min-rate 5000 -vvv -n -Pn 10.10.10.245 -oG Escaneo
La explicación de cada comando de consulta sería:
La idea de este escaneo es detectar puertos abiertos en la dirección IP especificada.
sudo
: es un comando en Linux que te permite ejecutar otros comandos con privilegios de administrador. Para escaneos de red que requieren acceso a niveles bajos del sistema, como este, necesitas permisos elevados.
nmap
: nmap es una herramienta de código abierto muy popular para escanear redes. Se usa principalmente para descubrir hosts activos en una red y ver los servicios que se ofrecen.
-p-
: esta opción le indica a nmap que escanee todos los puertos del 1 al 65535. Si no usáramos esta opción, nmap solo escanearía los 1000 puertos más comunes.
--open
: este parámetro le dice a nmap que solo muestre los puertos que están abiertos. Si omitieras --open
, nmap mostraría también los puertos que están cerrados o filtrados.
-sS
: especifica el tipo de escaneo que se va a realizar. En este caso, es un escaneo SYN, también conocido como «escaneo sigiloso» o TCP SYN scan. Este tipo de escaneo no establece una conexión completa con el puerto, solo envía un paquete SYN y espera una respuesta. Si el puerto está abierto, responde con un SYN-ACK; si está cerrado, responde con un RST (reset). Es una técnica común porque es más rápida y menos detectable.
--min-rate 5000
: este parámetro establece la velocidad mínima del escaneo en 5000 paquetes por segundo, lo que significa que nmap intentará enviar al menos 5000 solicitudes cada segundo. Esto puede hacer que el escaneo sea más rápido, pero también puede aumentar las posibilidades de que sea detectado por sistemas de seguridad.
-vvv
: Los -vvv
se refieren al nivel de información o detalles en la salida que muestra nmap mientras escanea. Cuantos más v
, más detallada será la información en tiempo real. En este caso, -vvv
indica el nivel máximo de detalle.
-n
: esta opción le indica a nmap que no resuelva nombres de dominio (DNS). Es decir, solo utilizará direcciones IP sin intentar convertirlas en nombres de host. Esto hace que el escaneo sea más rápido, ya que no se detiene para resolver el nombre de cada dirección IP.
-Pn
: le dice a nmap que no haga un «ping» a la dirección IP antes de escanearla. Por defecto, nmap intenta hacer un ping para ver si el host está activo antes de escanear los puertos. Con -Pn
, nmap asumirá que el host está activo y procederá directamente al escaneo de puertos, útil si el host bloquea pings.
10.10.10.245
: esta es la dirección IP del objetivo que queremos escanear.
-oG Escaneo
: este parámetro especifica el formato de salida y el nombre del archivo donde se guardarán los resultados del escaneo. -oG
indica que la salida estará en un formato grepeable (fácil de analizar con herramientas de búsqueda de texto). Escaneo
es el nombre del archivo de salida donde se guardarán los resultados.
Después el escaneo me devuelve que los puertos 21 ftp, 22 ssh y 80 http están abiertos.
Sabiendo que estos puertos están abiertos, lo que hacemos a continuación es lanzar una serie de scripts básicos de reconocimiento de nmap para ver qué servicios y versiones corren por esos puertos:
nmap -sCV -p21,22,80 10.10.10.245
también podemos lanzar un comando completo que recoja todo como:
sudo nmap -sCV -p- --open --min-rate 5000 -n -vvv -Pn 10.10.10.245 -oG Scan
Vemos aquí que por ejemplo por el puerto 22 corre un OpenSSH de versión superior a 7.7. Las iguales o inferiores a 7.7 son vulnerables si lo analizamos por searchsploit, por lo que no está en principio aquí el vector de entrada.
Vemos si por ejemplo existe algún exploit para la versión del puerto ftp vsftpd 3.0.3, nos saca una opción de DoS que no queremos aplicar en este caso:
por lo que vamos a explorar el puerto web 80.
Por consola con el comando whatweb puedes ver esa IP en lugar de verlo directamente en el navegador:
vemos que para esa IP hay una página que devuelve un código 200 y que parece ser un panel de información de data:
Entonces lo que hacemos es analizar este panel de dashboard y vemos algo de información como: usuario Nathan, y unas opciones en el panel a la izqda…
Ataque IDOR (Insecure Direct Object Reference)
Parece que la opción «Security Snapshot» de la izquierda (si haces hovering la ruta es /capture ) va cambiando y generando nuevas urls con la opción de poder Descargar esa información.
Por ejemplo: http://10.10.10.245/data/6
Si más adelante vuelves a clicar, ya no tienes la /data/6 si no por ejemplo /data/2
Probamos con incluir un valor directamente de cero en la ruta para ver la respuesta, y efectivamente nos devuelve información con la opción de descargarnos el informe, por lo que nos lo descargamos y lo analizamos para ver qué contiene.
parece que modificando el valor de la ruta puedes acceder a información que de forma natural de funcionamiento de la página no tendrías, por lo que estamos ante un posible ataque IDOR.
Un ataque IDOR (Insecure Direct Object Reference, o Referencia Directa a Objetos Insegura) es una vulnerabilidad de seguridad común en aplicaciones web que permite a un atacante acceder a recursos o datos sin la debida autorización. Ocurre cuando una aplicación expone referencias directas a objetos internos, como archivos, IDs de bases de datos, o registros, sin verificar que el usuario tiene permisos para acceder a esos objetos.
Para analizar el contenido de ese fichero donde se están registrando información sobre paquetes de red, vamos a usar la herramienta tshark y vamos a incluir una serie de parámetros para facilitar la extracción de los datos que nos interesa ver:
tshark -r 0.pcap -Tfields -e tcp.payload 2>/dev/null | xxd -ps -r
Es decir:
tshark -r 0.pcap
:
tshark
: herramienta de análisis de red que viene junto con Wireshark. Sirve para inspeccionar paquetes de red y analizar capturas en un formato legible.-r 0.pcap
: Le indica atshark
que lea el archivo de captura0.pcap
. Este archivo contiene paquetes de red que han sido capturados previamente.
-T fields -e tcp.payload
:
-T fields
: Le dice atshark
que solo muestre ciertos campos en lugar de la salida completa.-e tcp.payload
: Especifica que solo queremos ver el campotcp.payload
, que contiene los datos transmitidos en el nivel de la capa de aplicación en los paquetes TCP. Básicamente, extrae el contenido real de los paquetes TCP.
2>/dev/null
:
2>/dev/null
: Redirige los mensajes de error generados portshark
adev/null
, lo que significa que no se mostrarán en la pantalla. Esto es útil si solo quieres ver los datos de salida sin mensajes de error o advertencias.
|
:
- Este símbolo es un pipe (tubería), que permite enviar la salida de un comando como entrada para otro comando.
xxd -ps -r
:
xxd
: Es una herramienta para ver archivos en formato hexadecimal o convertir datos hexadecimales en datos binarios.-ps
: Indica axxd
que interprete la entrada como una serie de pares de caracteres hexadecimales (como el resultado deltcp.payload
).-r
: Le indica axxd
que convierta los datos hexadecimales en datos «legibles» o en su formato original. Esto es útil para reconstruir el contenido deltcp.payload
en su forma binaria o legible.
Podemos ver información interesante en el detalle del contenido de ese archivo como la PASS.
Acceso por SSH
Teniendo esa PASS y con el usuario Nathan, vamos a intentar acceder por ssh:
y efectivamente hemos podido acceder y ver la user.txt flag.
Sin embargo este usuario no tiene permisos de root en la máquina:
ESCALADA DE PRIVILEGIOS CON CAPABILITES
En este punto, vemos los permisos id y de sudoers por si ese usuario pudiera tener permisos especiales de ejecución como root, y parece que no:
Teniendo eso en cuento vamos a ver si hay algún binario que nos permite abusar del privilegio de root.
Con esta línea vamos a buscar archivos con el bit SUID (Set User ID) activado. El valor 4000
representa este permiso especial en octal. Los archivos con este permiso se ejecutan con los privilegios de su propietario (root), incluso si quien los ejecuta es un usuario diferente.
find / -perm -4000 -user root 2>/dev/null | xargs ls- l
Hay muchos pero son los comunes por lo que parece que no podemos abusar de ninguno.
Teniendo en cuenta que la máquina se llama «Cap» es posible que mediante la opción de Linux Capabilities podamos encontrarlas y vemos si un archivo vulnerable o mal configurado tiene el bit SUID activo y es propiedad de root, y así cualquier usuario como Nathan puede ejecutarlo con privilegios de root.
getcap -r / 2>/dev/null
Este comando usa la herramienta getcap
para buscar archivos en el sistema que tengan capabilities asignadas. Vamos a ver qué hace cada parte del comando:
Desglose del Comando
getcap -r /
getcap
: Es una herramienta en Linux que se utiliza para mostrar las capabilities de archivos. Las capabilities permiten asignar permisos específicos a archivos sin darles acceso completo como root.-r /
: Le indica agetcap
que realice una búsqueda recursiva comenzando desde el directorio raíz (/
). Esto significa que buscará en todo el sistema de archivos.
2>/dev/null
2>/dev/null
: Redirige los mensajes de error (descriptor de archivo2
) a/dev/null
.
Si vemos la línea de python 3.8 , este archivo tiene las siguientes capabilities:
cap_net_bind_service
: Permite que el archivo pueda asociarse a puertos de red por debajo del 1024, que normalmente requieren permisos de root.cap_setuid
: Permite que el archivo cambie su UID efectivo (identificador de usuario). Esto es importante porque podría usarse para cambiar de usuario, lo que en ciertos casos podría permitir la escalación de privilegios.
Posible riesgo: La combinación de estas capabilities significa que cualquier script o proceso que use python3.8
podría, en teoría, manipular puertos de red y cambiar su UID.
Linux Capabilities es un sistema más granular que permite asignar permisos específicos a un proceso en lugar de usar el sistema SUID, que otorga todos los permisos de root. Capabilities divide los permisos de root en unidades más pequeñas (capabilities), como CAP_NET_ADMIN
para administración de red o CAP_SYS_MODULE
para cargar módulos del kernel. Esto ayuda a mejorar la seguridad al evitar la necesidad de usar SUID en muchos casos.
Si ahora vamos a GTFObins en Python y Capabilities , podemos ver el CAP_SETUID que podemos aplicar para comprometer la máquina:
Ajustas la petición teniendo en cuenta lo anterior, y ya tendríamos permisos de root y podríamos acceder a la flag de root:
python3.8 -c 'import os; os.setuid(0); os.system("bash")'