[HTB] Prying Eyes Walkthrough

题目难度和一血时间
一道 medium 难度的题,就是比较难的了。居然两天独立解决了

首先看代码,这是一个帖子网站,发现有 sql migrate,可以看到用户名和密码的 hash。再看调用 sql 的代码,大概是一些 utils,而且不是直接拼起来,那大概是没有漏洞。

然后我们看发帖子的地方,有一个上传文件,可以上传一个帖子的封面。后端使用 ImageMagick 做处理,会把那个图片转成一个 avif 然后公开。搜到了一个漏洞,ImageMagick 读 png 的时候有一个 lfi。链接。网上可以找到几个 github 复现。Trick:搭建一个 docker image 专门用于测试那个版本的 ImageMagick,然后用 volume 挂载一下本地文件夹,就可以很轻松地执行老版本的 ImageMagick,也不需要老是传文件。

接下来我们直接把那个有恶意代码的 png 上传。上传之后我们可以下载那个转格式之后的 avif,但是 avif 格式好像没法复现出来。为了检验我们的攻击是否成功,使用控制变量法,上传一个包含不存在的路径的 png,服务器返回了错误。也就是说攻击确实成功了,但是转格式之后没办法把信息返回来。

那么接下来的想法就是改那个命令行接口。最外面接口长这样:

外层接口
其中 convertParams 来自
convertParams
根据语法,一个对象里面出现重复 key 的时候,按后面的算。也就是说我们没办法改 format 这个参数。但是前面的参数还是能改的。找到这个 convert 函数的 doc源码,发现这个源码说自己是包装了 convert 命令行,漏洞还不小:
源码
相当于是把参数拼接起来,而且最后一行就很离谱。那么我们只需要给这东西传点奇奇怪怪的参数就可以改变命令行。这里其实有可能直接拿到 shell 权限,比如在命令中间插入一些 $() 之类的。不过这东西没那么简单,如果是这个库有这么严重的漏洞,也不会有人用了。这题不需要这个科技。为了保证在传参数之后会有漏洞,先用一个测试代码:
test.js
对生成结果用 identify a.png 发现生成的图片的确按照 crop=100x100 执行了!

接下来看看什么样的参数能覆盖掉目标格式。输入 convert 显示了非常多的参数,然后根据 nodejs convert 的代码我们可以发现它大概是这样的:

convert -option1 value1 -option2 value2 - AVIF:-

其中减号是从 stdin 输入,输出到 stdout。AVIF: 是指定格式。我们现在要选一个参数,尽量能覆盖掉 AVIF 格式让它用 png 格式,或者输出另一个结果到文件里。经过瞪眼法看 convert 的参数,我发现了几个参数:

参数
如果加上 print,会输出另一个指令的结果。但是这里好像用不了,或者说可能会很复杂,因为服务器要从 stdout 读一个图片。

这个 -write 参数就很友好了。我们直接加一个 -write a.png,发现这个指令不仅执行了转 avif,还把图片转成 png 存下来了。这就是我们想要的结果。

接下来我们用 burpsuite 拦截指令并且修改参数。一开始改的是它带的 rotate 参数,但是返回错误说它必须要是 [0,360] 之间且是 90 的倍数。看起来是对格式有一些检查。阅读代码发现用了 ajv,可以看到检查的模板 post.json。经过一些学习,发现 ajv 有一个参数叫做 additionalProperties:

additionalProperties
The value of the keyword should be either a boolean or a JSON Schema.
If the value is true the keyword is ignored.

也就是我传它本来就有的参数不行,但是如果它服务器没有这个 additionalProperties=false,我传另一个参数就行。刚好这里没有,所以我们去前面那个 convert 的文档里随便选一个参数改掉。

最终的结果呈现大概是这样:

修改参数
上传这个帖子之后我们去 uploads/a.png 下载文件,用别人写的 python(其实不用也可以)把文件信息解出来,再用 bytes.fromhex 读 Raw profile type 就拿到 flag 了。


总结

独立解决了。解决之后在网上居然没找到题解

一个反差的地方在于,虽然花了很多时间折腾了很久,最后那个 payload 居然仅仅是造一个 png,改一个参数,下载一个文件。这中间我花了很多时间去折腾工具的使用,包括运行那个版本的 ImageMagick,检查每一步攻击是否成功。最后还是得用控制变量法。另外,我对着转化之后的 avif 处理了很久,第二天通过控制变量法,发现不管 png 读的文件内容是什么,生成的 avif 都一样。如果能早点发现的话可以省下不少时间。我甚至还去看了 ImageMagick 的源码,但是这么大一个项目还是得用断点调试,看是不太行的。这方面可能属于 pwn,目前还不太熟悉这些工具。不过本地 docker 总算是熟练使用了。

我的五一假期就这么没了

  • 28
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值