-
-
[原创]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 在字典序上排在 w、ge、zx 等文件名前面,所以:
展开后才会变成:
如果直接把域名替换成数字 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内核攻防全技术栈,打造具备自动化能力的内核开发高手。