Me parece que a d4t4s3c, alma máter de esta emergente plataforma bautizada como VulNyx, le conocí justamente resolviendo máquinas en otra plataforma de similares características, allí tenía unas cuantas. Pero en algún momento, si no estoy errado a principio de este 2023 abandonó aquella plataforma para iniciar este proyecto suyo y desde entonces ha estado trabajando duro en generar contenido (creando máquinas) y que ha ido compartiendo con la comunidad. Al fin y al cabo, todos nosotros los receptores somos los principales beneficiados ya que tenemos estos entornos para practicar y mejorar nuestra habilidades, todo a coste 0 y sin mayores requerimientos que armarse de ganas para aprender. Olé por ello d4t4s3c!

El día de hoy y para abrir la veda les traigo esta máquina llamada Internal, vayamos ya con su resolución…

Resumen:

  • Escaneo de puertos y servicios
  • Revisión de aplicaciones web
  • Explotación de LFI (Local File Inclusion)
  • Acceso mediante usuario sin privilegios
  • Identificación de aplicación interna (VNC)
  • Escalada de privilegios
  • Validaciones finales en el objetivo

Enumeración

Después de descargar la maquina e importarla en VirtualBox, la inicio, espero unos segundos y le lanzo un escaneo de puertos y servicios con Nmap:

sudo nmap -sS -sV -v 10.10.5.47

Aplicaciones web

Dejando de lado el servicio de SSH, entendiendo que el puerto 22 se trata de un puerto para la administración y gestión del host, nos centramos en la revisión de las aplicaciones web disponibles.

Primero en el puerto TCP 80 se observa la siguiente página web:

Mientras que por el puerto TCP 9999, se observa lo siguiente:

Por ahora dejaremos de lado esta aplicación, dado que no contamos con las credenciales requeridas.

Revisando el código fuente ofrecido por la aplicación web del puerto TCP 80, se identifica el siguiente fichero PHP, el cual resulta de interés:

Llevamos la petición original a BurpSuite para su análisis.

Observemos en esta última captura como a través del parámetro item se define el fichero index.html. Que entendiendo la respuesta del servidor, se presumen que se trata del contenido de dicho fichero html.
Si intentamos llamar a otro fichero que conocemos, en este caso uno con extensión PHP, lo que obtenemos una respuesta bastante reveladora.

Nuevamente y en base a la respuesta, presuponemos que la aplicación web puede verse afectada por una vulnerabilidad de LFI (Local File Inclusion). Por el momento tenemos cierto control sobre el fichero que queremos que presente como respuesta el servidor.

Explotación de LFI (Local File Inclusion)

Lo siguiente será «jugárnosla» a intentar leer un fichero interno del sistema, en este caso el típico passwd del directorio /etc, ya que debería ser accesible para todos los usuarios del sistema. Para llegar hasta dicho recurso del sistema, realizaremos un recorrido de directorios (directory traversal) típico. En este caso, asumimos que nuestra ubicación origen es: /var/www/html, por tanto nuestro payload quedaría de la siguiente forma:

Sin embargo la respuesta no fue la deseada.

Después de algunas validaciones en la inserción logramos hallar que muy probablemente existe algún tipo de control en el servidor que pretende neutralizar la vulnerabilidad de LFI. Sin embargo dicho control está lejos de ser efectivo y mediante la siguiente técnica es posible evadir los controles implementados en el servidor para este punto:

Es decir, entendiendo que la aplicación web no permite insertar en el parámetro item la siguiente cadena de caracteres ../, podemos generar otra cadena distinta ....// que complementa la anterior y conseguirá que, si bien el conjunto ../ sea removido de nuestra inserción, al hacerlo finalmente consigue formar la cadena deseada (../) sin volver a validarlo o revalidarlo. Básicamente en la captura anterior, dejo marcado en amarillo lo que aparentemente remueve de nuestra inserción inicial. Con esto finalmente llegamos a explotar de forma exitosa el LFI (Local File Inclusion).

Del resultado obtenido, nos quedaremos especialmente con los siguientes 2 usuarios del sistema:

Aprovechando esta vulnerabilidad web, podremos valernos del directorio /proc del servidor para enumerar los procesos del sistema. En este caso tomando de base algunas guías de Linux y siguiendo el tip que me soltó d4t4s3c (muchas gracias por el empujón tío!), procedí con la enumeración. Partiendo inicialmente por el directorio self, al que le acompañé el subdirectorio cmdline, que básicamente revela el comando de inicio del proceso en cuestión:

Esta petición la use de base e inmediatamente la llevé al Intruder de BurpSuite:

Tomemos en cuenta la siguiente descripción antes de continuar con la técnica:

Por tanto la misión aquí estará en identificar todos aquellos identificadores numéricos válidos en forma de directorio. Para ello en la pestaña Payloads marcaremos como tipo Numbers y emplearemos un rango que va de 1 a 5000.

Para ganar algo de agilidad en la revisión de los resultados, tomaremos en cuenta la respuesta del servidor cuando una petición no genera respuesta como tal (eso es indicativo de que el directorio X no existe), como se ve a continuación:

Que lo definiremos como valor a filtrar, en este caso gracias a la opción de Grep – Match, de la siguiente manera:

Revisando los resultados, obtenemos la siguiente respuesta del servidor, la cual es muy reveladora:

I tant! Como dirían nuestro amigos de Cataluña. Lo que tenemos aquí es nada más y nada menos que un juego de credenciales. Inmediatamente validamos que las mismas nos sirven para conectar por SSH:

hydra -l admin -p '4dM1Nt3rN4LP4zZ' ssh://10.10.5.47

Acceso mediante usuario sin privilegios

Después de la validación con Hydra ya solo queda conectar al servidor mediante el puerto TCP 22:

Identificamos el directorio accesible y obtenemos la primera flag del usuario admin:

Identificación de aplicación interna (VNC)

Con el acceso conseguido, volvemos a la enumeración del host. Esta vez identificamos un sutil directorio llamado así con 3 puntos:

Accedemos al mismo y observamos su contenido:

Este fichero comprimido zip, que se encuentra protegido con contraseña, la cual resultó ser la misma contraseña de acceso del usuario admin, cuenta con el siguiente fichero llamado passwd, por el momento nos los reservamos:

Continuando con la enumeración identificamos la siguiente aplicación interna disponible en el puerto TCP 5901:

Dado que podremos no saber de cabeza de que se trata este puerto o a que servicio se encuentra asociado, validaremos potenciales banner del mismo, en este caso mediante un intento de conexión por telnet obtenemos el siguiente dato:

Dado, que todavía no me dice mucho ese banner, lo que haré es googlear un poco y ver de que se trata:

Los primeros resultados del buscador son bastante claro, estamos frente a una instancia de VNC.

Luego y apoyado en la asombrosa utilidad de pspy (descrita en su GitHub como: Monitor linux processes without root permissions) obtenemos la siguiente pista:

Escalada de privilegios

Listo, la escalada de privilegios parece ir por esta vía del VNC. Por tanto y para una mayor comodidad nos traeremos el puerto local mediante técnica de Port Forwarding. Esta vez empleando la poderosa herramienta Chisel (que por cierto, nunca antes he tenido la oportunidad de comentarlo, pero esta herramienta la conocí gracias al colega mexicano ZK). Para ello debemos realizar las siguiente configuraciones:

En el equipo del atacante (es decir en nuestro host de Parrot OS):

./chisel_1.8.1_linux_amd64 server --port 6699 --reverse

Mientras que en el equipo objetivo (la máquina Internal):

./chisel client 10.10.5.4:6699 R:5901:127.0.0.1:5901

Es decir, primero estamos definiendo nuestro host de ataque como un servidor (en este entorno de Chisel), en el se dispone del puerto TCP 6699. Ya luego en el equipo objetivo, empleando ese mismo puerto TCP 6699 se realiza el reenvío del puerto TCP 5901. Si la configuración es correcta, obtendremos un resultado como este:

Esto hará que en nuestro host de atacante (mi máquina Parrot OS), ahora se disponga del puerto TCP 5901, como si contáramos con el servicio VNC levantado, pero esto es una referencia del equipo objetivo, muy cómodo desde luego. Validaremos el establecimiento mediante Nmap:

Listo, contando con el fichero passwd que logramos obtener anteriormente y mediante la utilidad vncviewer realizaremos una conexión al host objetivo:

vncviewer 127.0.0.1::5901 -passwd passwd

Al ser válida la autenticación obtendremos la siguiente ventana que otorga un acceso al equipo objetivo totalmente privilegiado:

Para una mayor versatilidad y mediante Ncat establezco una conexión reversa, que recibo de la siguiente manera en el puerto TCP 4477:

Después del tratamiento de la TTY ya puedo disponerme a obtener la última flag del reto, en este caso la del superusuario root:

Validaciones finales

No quiero terminar la máquina sin hacer unas breves validaciones finales y que también pongan en valor las configuraciones y las acciones adoptadas por el creador de la máquina (en este caso, el bueno de d4t4s3c).

En el home del root, primero observemos el directorio oculto .vnc que contiene algunos ficheros internos de la instancia de VNC, entre lo más destacado es el fichero passwd , que por lo visto se trata del mismo fichero (inequívoco) que encontramos en aquel recurso comprimido zip llamado internalkey.zip.

Luego, en el directorio home del usuario admin identificamos este script python interesante:

Cuyo contenido se ve tal que así (extracto):

El mismo se trata de la aplicación que se ofrece por el puerto TCP 9999 y que vimos muy al inicio de este writeup. Observemos que el inicio del mismo se encuentra definido en el crontab del usuario:

Por último en este punto, volvamos a la aplicación web del puerto TCP 9999 y empleemos las credenciales para autenticarnos. Como se observa el resultado no lleva a lo que se conoce coloquialmente como agujero de conejo (rabbit hole):

Las credenciales van codificadas en Base64 en la cabecera Authorization:

De lado de la aplicación web ofrecida por el puerto TCP 80, el fichero PHP existente tiene la siguiente composición:

Aquí se puede apreciar el control que se realiza en la inserción que se recoge por el parámetro item. Como se observa, a través de la funcionalidad de PHP str_replace se intenta neutralizar algunas cadenas no permitidas, entre las que se destaca el mencionado ../, que lo reemplaza por una cadena vacía y posteriormente lo incluye a la ruta /var/www/html. Es evidente que este control es insuficiente.

Y nada más por hoy, una máquina que me ha resultado muy entretenida y que nos sirve en este blog para estrenarnos con una nueva sección en la que traeremos la resolución de las máquinas de esta emergente plataforma VulNyx, no dudéis en darle una oportunidad!

Referencias: