首页
社区
课程
招聘
[原创]hitcon-2017-babyfirst-revenge (看雪ctf版)writeup
发表于: 2天前 800

[原创]hitcon-2017-babyfirst-revenge (看雪ctf版)writeup

2天前
800

我愿称之为“第三方 WP 都只差最后半步”的一题。

原题本身并不新,核心还是利用长度不超过 5 的命令,通过文件名、续行符和 ls -t 拼出长命令。

但是看雪环境有几个额外问题:

Step.0 准备一个 80 端口可用的服务器

需要一台靶机能够访问的 HTTP 服务器。

我这里使用 FRP,把本地 8000 端口映射到公网服务器的 80 端口:

本地 HTTP 服务需要实现两个功能:

建议记录 User-Agent。公网 80 端口会有大量扫描日志,靶机的请求大概是:

Step.1 为什么不能直接照抄第三方 WP

不少 WP 使用下面的第一阶段:

问题是这台机器>>和|都莫名其妙写不进去,可能是ngx或者什么拦截了...

原题 sandbox 是:

但是看雪靶机前面有网关反代,PHP 看到的 REMOTE_ADDR 是网关内网地址,而不是攻击者出口 IP。

所以第三方 WP 中这种操作会失败:

然后访问:

算出来的目录根本不是当前 sandbox。

因此最好直接把命令结果通过 HTTP POST 回传,不要依赖猜 sandbox 路径。

有第三方 WP 使用类似下面的技巧:

它的前提是攻击者持有一个足够短的字母域名,例如:

因为 echo 在字典序上排在 wgezx 等文件名前面,所以:

展开后才会变成:

如果直接把域名替换成数字 IP,数字文件名会排在 echo 前面:

此时 * 展开后的第一个单词就不再是 echo,而是数字文件名,命令直接失败。

如果把点号放在文件名开头,例如:

又会创建隐藏文件,默认 ls 根本不会把它们列出来。

理论上有多种 WP 使用:

我也构造出了对应命令,而且服务器确实收到了靶机的请求:

说明 curl 成功了。

但是返回的 payload 没有继续执行。使用:

做测试,也没有观察到对应延时。

所以不要在这个环境里赌管道,直接改成:

落盘以后再执行,稳定很多。

Step.2 第一阶段:构造 ls -t>g

这里使用 Orange 官方 exploit 的第一阶段。

按顺序请求:

每个命令长度都小于等于 5。

这个阶段会利用特殊文件名和续行符,把文件 _ 拼成一个脚本,其中有效命令是:

之后执行:

就会按照文件修改时间倒序,把当前目录中的文件名写入 g

注意 ls -t 也会把 _g 自身以及第一阶段的残留文件列进去,但这些多余行会因续行符拼接成无效命令而报错,不影响有效命令的执行。

Step.3 第二阶段:拼出下载命令

假设公网服务器是:

我们要构造:

把它按文件名和续行符拆成:

由于 ls -t 是新文件在前,所以实际创建文件时要反过来,从最后一段开始创建:

然后执行:

含义分别是:

服务器上应该能看到:

这一步成功以后,就获得了稳定的任意命令执行能力。

Step.4 回传命令结果

在公网服务器的 index.html 中放:

重新执行:

服务器会收到:

回显中的关键内容是:

以及根目录下的:

内容为:

Step.5 查询 MySQL

把远程 index.html 改成:

再次执行:

数据库返回:

最终查询结果:

Flag

总结

这题真正可用的路线是:

第三方 WP 的主要问题不是思路错误,而是看雪环境把它们依赖的条件拆掉了:

哎哎喜欢加难度....


冰与火的战歌:Windows内核攻防实战高级班!从零到实战,融合AI与Windows内核攻防全技术栈,打造具备自动化能力的内核开发高手。

最后于 1天前 被the_hs编辑 ,原因: ip忘记脱敏了
收藏
免费 0
打赏
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回