Nocturnal
Recon
Ports
Starting Nmap 7.95 ( https://nmap.org ) at 2025-05-06 16:37 CST
Nmap scan report for nocturnal.htb (10.129.192.119)
Host is up (0.11s latency).
Not shown: 98 closed tcp ports (reset)
PORT STATE SERVICE
22/tcp open ssh
80/tcp open http
Nmap done: 1 IP address (1 host up) scanned in 1.76 seconds
目标开放22,80端口。经典的linux服务器。
浏览目标网页信息:
是一个自建的web服务,快速scan一下,未发现敏感信息。
dirsearch -u http://nocturnal.htb/ -w /usr/share/wordlists/seclists/Discovery/Web-Content/quickhits.txt
/usr/lib/python3/dist-packages/dirsearch/dirsearch.py:23: DeprecationWarning: pkg_resources is deprecated as an API. See https://setuptools.pypa.io/en/latest/pkg_resources.html
from pkg_resources import DistributionNotFound, VersionConflict
_|. _ _ _ _ _ _|_ v0.4.3
(_||| _) (/_(_|| (_| )
Extensions: php, aspx, jsp, html, js | HTTP method: GET | Threads: 25 | Wordlist size: 2563
Output File: /home/Hackthebox/Nocturnal/reports/http_nocturnal.htb/__25-05-06_16-42-20.txt
Target: http://nocturnal.htb/
[16:42:20] Starting:
[16:42:24] 302 - 0B - /admin.php -> login.php
[16:42:26] 301 - 178B - /backups -> http://nocturnal.htb/backups/
[16:42:26] 403 - 564B - /backups/
[16:42:29] 200 - 644B - /login.php
[16:42:31] 200 - 649B - /register.php
[16:42:33] 403 - 564B - /uploads/
[16:42:33] 302 - 3KB - /view.php -> login.php
在创建账号后,测试功能点。存在一个上传功能点和一个查看(view.php)功能。
在view.php存在两个参数:username和file。
且可对这两个参数进行遍历测试。获得了两个用户名:tobias和amanda,以及在amanda下存在一个privacy.odt文件,下载下来后。获得了amanda的密码并成功登陆系统。admin panel中发现存在一个备份功能。以及可对系统文件进行查看,在admin.php中发现参数passowrd在进行函数cleanEntry黑名单检测后直接拼接进了command参数里,在随后被php中的proc_open函数执行。
function **cleanEntry**($entry) {
$blacklist_chars = [';', '&', '|', '$', ' ', '`', '{', '}', '&&'];
foreach ($blacklist_chars as $char) {
if (strpos($entry, $char) !== false) {
return false; // Malicious input detected
}
}
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);
}
sleep(2);
$logContents = file_get_contents($logFile);
if (strpos($logContents, 'zip error') === false) {
echo "<div class='backup-success'>";
echo "<p>Backup created successfully.</p>";
echo "<a href='" . htmlspecialchars($backupFile) . "' class='download-button' download>Download Backup</a>";
echo "<h3>Output:</h3><pre>" . htmlspecialchars($logContents) . "</pre>";
echo "</div>";
} else {
echo "<div class='error-message'>Error creating the backup.</div>";
}
unlink($logFile);
}
}
接下来构造绕过,黑名单对命令行中的常见符号进行了绕过。这里我们可以尝试进行编码绕过(PHP会自动对提交的请求进行解码操作)。
该命令逻辑为:zip -x './backups/*' -r -P <password> <backupFile> . > <logFile> 2>&1 &
其中password可控。payload=\"123\"%0aid%0a#
。直接反弹shell出错,远程下载shell文件并运行。
Frist foothold
在应用文件夹中获得了一个数据库文件,dump下来后得到了tobias的密码。ssh登录后,进行内网信息搜集。发现本地存在一个8080端口服务,ssh端口转发后。
没有版本信息,查看它的一些文件信息:发现他的xss文件版本为3.2。合理猜测目标版本信息为3.2+,不行再看其他的。
存在一个CVE-2023-46818。这个漏洞需要认证用户。看了下其他漏洞,都需要认证用户才能进行利用。结合我们现有凭据和搜索相关信息,ispconfig默认用户为admin。尝试登陆。可行。
结合EXP获取了rootshell。可写ssh私钥。
Summary
考察了命令注入中的绕过,和现有CVE漏洞的判断与利用。