2019年『代码审计』星球举行的Code-BreakingPuzzles十分顺利,后边我便始终想再来一次相似的主题活动。Code-Breaking归属于极为偏重于Flat共享的代码审计谜团,因此规定题型具备相应的原创性,最好可用十行之内的源代码段落,叙述1个具备实战演练价值的情景。大约在上年肺炎疫情那一段时间,有一个朋友问过我一个难题,他碰到了1个PHP文件涵盖漏洞,但找不着运用方式,对象是跑在Docker里,也没找到过多能够运用的文件。我那时感觉这也是老调重弹的难题了,就跟他讲了好多个我已经知道的方式,但之后我自个下来探讨的情况下又发觉了某些新方式,我觉得还挺合适放进Code-Breaking里做为题型的,就暂放进题库里了。
想不到Code-Breaking始终难产来到2021年,直至十一国庆期間我还在探讨Caddy有关的安全隐患时,不经意间看见一篇文章RCTF2021的Writeup,才发觉这一Flat被用掉了(最开始出現在二零二零年顶峰极客赛事中)。有点儿痛心,因此把全部方式梳理一下下发布了本文,也算没把科研成果消耗掉。这个问题常常在实战演练中碰到了,尤其是白盒的情形下,功能模块点也少,找不着能够被涵盖的文件。一般这时咱们会去试着涵盖某些事件日志、网站系统日志等文件系统。
可是,假如对象在Docker环境中会具备以下特性:
容器总是运转Apache,因此沒有第三方应用系统日志
网站系统日志跳转来到/dev/stdout、/dev/stderr
我们可以查询tp框架的Dockerfile,会发觉几个日志文件都被应用标准输出、标准不正确的软链接取代了:这时涵盖这种网站系统日志会出現include(/dev/pts/0):failedtoopenstream:Permissiondenied的不正确,由于tp框架沒有管理权限涵盖机器设备文件:
因此,运用系统日志涵盖来getshell的方式就难以实现了。
远程涵盖由于默认设置不开启,因此咱们也不当作1个备选项,要想getshell或是须要寻找1个能够控制内容的文件实现涵盖。