🥕

【HackTheBox】Union Writeup

2023/12/31に公開

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ユーザーに切り替えることを忘れて、ウェブサイトのソースコードを見てみます。

firewall.php
<?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対策がありました。

index.php
<?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