
最近,Kubernetes 的入口 nginx 控制器中发布了几个新的 CVE。我想我应该仔细研究其中一个 CVE-2023-5044。虽然CVE 公告中有一些详细信息,并且 CVE 记者的帖子中有一些提示,但我找不到任何实际的 PoC,所以我决定看看是否可以写一个!
测试环境设置
通常情况下,设置测试环境的最简单方法是使用KinD。他们有一个页面,其中包含入口设置的说明,效果很好。
一旦我们使用提供的示例应用程序进行了入口设置http://localhost/foo,http://localhost/bar就会命中由入口控制器管理的路径。
试验该漏洞
因此,我们从咨询中知道问题出在注释中nginx.ingress.kubernetes.io/permanent-redirect,因此我想尝试的第一件事就是经典的命令注入,您可以结束所提供的语句并开始一个新指令。在 nginx 的情况下,它使用该;字符,所以我尝试了一下,它似乎有效!
执行到入口控制器 Pod 中,我可以看到此注释所发生的情况是,您提供的任何内容基本上都直接注入到控制器使用的 nginx 配置文件中。
alias我尝试过的一个选项是使用或指令来提供文件,因为这似乎是访问敏感文件(例如对集群具有高权限的控制器的服务帐户令牌)的好方法root。然而这些指令已被禁用,因此无法正常工作。
幸运的是,我记得 nginx 有时支持 lua 脚本,所以我们也许可以使用它。在 ChatGPT 关于具体使用语法的帮助下,我获得了一个可用的 PoC。
nginx.ingress.kubernetes.io/permanent-redirect: https://www.mccune.org.uk;}location ~* "^/flibble(/|$)(.*)" {content_by_lua 'ngx.say(io.popen("cat /var/run/secrets/kubernetes.io/serviceaccount/token"):read("*a"))';}location ~* "^/flibblea(/|$)(.*)" { content_by_lua 'os.execute("touch /you")'
这肯定会更简洁,但它所做的是在我们重定向到的 URL 之后关闭指令location。;}然后就打开一个新的location路径/flibble。当有人调用该路径时,我们运行一个 lua 脚本,该io.popen脚本用于运行操作系统命令,然后使用nginx.say. 之后,我只是放置另一个位置指令来吸收文件中已有的任何不需要的指令(平衡文件中的大括号很重要,否则您的更改将被拒绝)。
完成此操作后,您可以卷曲localhost/flibble并取回对集群具有高权限的入口的服务帐户令牌,特别是集群级别的 GET 机密。
结论
这是一个有趣的漏洞,而且(尽管有点棘手)利用它并不难。然而,就风险而言,这是相当情境性的,因为它需要编辑ingress命名空间中的对象的权限,因此集群外部的攻击者不可能执行该操作。
原文地址:
https://raesene.github.io/blog/2023/10/29/exploiting-CVE-2023-5044/
感谢您抽出

.

.

来阅读本文
点它,分享点赞在看都在这里
原文始发于微信公众号(Ots安全):漏洞利用 Kubernetes ingress-nginx <1.9.0 - API 命令注入