这个仓库是我对 IngressNightmare 漏洞的研究。它包含了存在漏洞的 Ingress 部署文件、漏洞利用程序本身以及共享对象载荷。
CVE 索引列表:
auth-url 注解注入auth-tls-match-cn 注解注入只是一些参考资料:
此漏洞的根源在于缺乏适当的输入清理。当你发送 AdmissionReview 请求时,它会创建一个临时的 NGINX 配置,随后使用 nginx -t 命令测试其有效性。参见已缓解该 bug 的源代码。
能够控制被测试配置的内容,使我们可以利用大量配置字段来注入畸形配置:
auth-url - 未经适当清理,允许我们添加 # 和 \n。我们将使用这个注入点。auth-tls-match-cn - 只要求该字段以 CN= 开头并且是有效的正则表达式。ing.UID - UID 会原样写入配置。NGINX 配置仅仅被测试这一事实,略微减少了我方可使用的指令数量。剩下的指令之一是 ssl_engine,它允许我们加载共享库。这是一个很好的切入点。但我们如何将 .so 文件放入 pod 文件系统呢?
WIZ 的聪明人想出了一个主意:发送一个以我们的 .so 对象为请求体的请求,如果它足够大,NGINX 会将其保存到 procfs 中的一个文件里!我们还可以调整 Content-Length,让 NGINX 等待更多数据,从而使其将文件在 procfs 中保留一段时间。实际的 PID 和 FD 编号需要猜测。
更多信息,请阅读 WIZ 研究团队撰写的原始分析文章。
漏洞利用代码相当不言自明。所以请直接查看源码。
克隆仓库:
git clone https://github.com/I3r1h0n/IngressNightterror
cd IngressNightterror
启动一个 docker k3s 镜像:
cd stand
docker compose up -d
部署 NGINX Ingress:
如果你使用 Linux/Mac,可以通过脚本部署:
./k8s/setup.sh
如果你在 Windows 上,或者想更精细地控制部署过程,请手动执行以下步骤:
部署 NGINX Ingress:
kubectl --kubeconfig=./output/kubeconfig.yaml apply -f ./k8s/ingress.yaml
现在你可以使用 ./output 中提供的配置来使用 kubectl。别忘了使用 ingress-nginx 命名空间。
重要提示:ingress.yaml 是基于存在漏洞的 NGINX Ingress 制作的
该 payload 是一个简单的反向代理。使用以下命令构建之前,别忘了修改端口和 IP 地址:
make all
它将使用 docker 容器 gcc:latest 构建共享对象。
向最初发现该漏洞的 WIZ 研究团队以及 NGINX Ingress 维护者致以崇高敬意。
由 I3r1h0n 制作。