HackMyVM-Rsscross
Sweet dreams are made of this
甜蜜的梦由此组成
Who am I to disagree?
我有何资格不附和
Travel the world and the seven seas
我环游世界和七大洋
Everybody’s looking for something
每个人皆有欲求
靶机ip:192.168.56.53
难度:高
涉及内容:
信息收集:目录爆破、敏感文件泄露(.tar 源码泄露)。
Web 漏洞利用:
- 双重 URL 编码绕过 Apache 解析拦截。
- Server-Side Request Forgery (SSRF) 结合目录穿越。
- Node.js 危险函数
Function()导致的动态代码执行(RCE)。 - 利用
String.fromCharCode绕过 HTML 实体转义 (htmlspecialchars) 及长度限制。
密码学与凭据收集:数据库配置审计、MD5 哈希爆破(识别 echo 默认追加换行符 \n 的实战陷阱)。
横向移动 (Lateral Movement):利用 sudo 错误配置与 GTFOBins(groff -U 宏执行)提权至其他用户。
垂直提权 (Privilege Escalation):
- 文件权限配置不当(利用属组的写权限
-rw-rw-r--)。 - Python 模块劫持/插件注入(篡改
add_language.py)结合sudo提权至 Root。
端口扫描
1 | |
目录爆破
1 | |
app.tar泄露了网站源码。
经过代码审计,主要突破点在以下几点。
node.js以及GetRss/index.php
1 | |
1 | |
后台未授权访问:
/admin/目录下的article.manage.php和article.add.php没有任何身份校验,可以直接增删改文章。过滤机制:后台对输入的参数使用了
htmlspecialchars(..., ENT_QUOTES)进行全局转义,并且对title和author限制了最大长度 10 个字符,堵死了直接在此处进行传统 XSS 或代码注入的可能。但content字段没有长度限制。SSRF 接口:前台
/GetRss/index.php/存在一个 SSRF 漏洞,它会将 URL 最后的路径作为$id,拼接到http://localhost:3000/api/后并使用 cURL 发起请求。内部 Node.js 服务:3000 端口运行着一个 Express 服务,它会去请求本机的
Rssinfo/index.php/id,并通过正则表达式提取页面中的var passage = {...};字符串,最后致命地使用了Function()()动态执行这段提取出的字符串。
目标是让 3000 端口的 Node.js 服务执行我们的恶意 Node.js 代码(反弹 Shell)。 由于 /Rssinfo 页面的输出受限于 10 字符,我们需要让 Node.js 服务去请求前台的 /article.show.php(该页面会完整输出无长度限制的 content 字段)。
我们需要克服两个关键的拦截点:
- 拦截点 1 (Payload 语法被破坏):PHP 的
htmlspecialchars会将引号"、'转换为实体,导致 JS 语法报错。- 绕过:使用 JS 的
String.fromCharCode()将 Payload 转换为 ASCII 码,实现无引号的命令执行。
- 绕过:使用 JS 的
- 拦截点 2 (Apache 404 拦截):如果直接通过 SSRF 访问
/..%2f..%2f进行目录穿越,Apache 会在解析层将其还原为实际路径并报 404 错误,导致请求根本无法到达 PHP 脚本。- 绕过:使用双重 URL 编码(Double URL Encoding),将
%编码为%25,即发送%252f。
- 绕过:使用双重 URL 编码(Double URL Encoding),将
先准备好反弹的payload
1 | |
转换为node.js形式
1 | |
使用 String.fromCharCode 进行 ASCII 编码绕过过滤,最终构造成符合 Node.js 正则匹配的格式:
1 | |
现在发表新文章构造payload
1 | |
本地开启监听4444端口准备触发
1 | |
触发请求后,Apache 将解码后的 %2f 传递给 PHP,PHP 通过 cURL 请求内部的 3000 端口。Node.js 接收到 http://localhost/article.show.php?id=7 的响应,正则提取出我们伪造的无引号 JS 代码并放入 Function() 中执行。
此时,攻击机的 Netcat 成功接收到反弹回来的 Shell,获取服务器权限。
1 | |
之前的connect.php有泄露mysql的用户名和密码,连上去可以得到一串哈希。
1 | |
1 | |
这里也是比较坑人的,问了提示才知道因为echo password | md5sum没有加-n参数,导致正常的john和hashcat是跑不出来的,魔鬼藏在细节中。
(之前就被这种小细节坑过,还不长记性)
用下面的脚本爆破出密码。
1 | |
1 | |
也是成功爆破出了密码。
1 | |
之前到处扒拉的时候四处查找,看zb组所属的文件,发现了这个东西。
1 | |
目前有两条线索,一个是可以以mob的身份执行groff,一个是zb也就是我们可以修改这个python文件。
先遵循第一条线索,groff是个Linux 系统自带的一个非常古老的文本排版和格式化工具。
groff -U(不安全模式)允许执行内置的 .sy 系统调用宏,我们可以利用它复制 bash 并赋予 SUID 权限。
1 | |
我们可以这样来获得权限
1 | |
写公钥进去稳定权限
1 | |
这里就柳暗花明了,zb用户可以朝插件写入后门,先提前写好后门,而我们要做的就是以mob用户的身份去执行
1 | |
1 | |