
CVE-2023-46604 का गहन तकनीकी विश्लेषण, जो Apache ActiveMQ के OpenWire प्रोटोकॉल में RCE भेद्यता है, जिसमें पैकेट संरचना विवरण और शोषण तंत्र शामिल है।
ActiveMQ एक ब्रोकर है जो JMS का समर्थन करने वाले क्लाइंट्स को शामिल करता है, और Java के साथ-साथ विभिन्न भाषाओं का उपयोग करने वाले सिस्टम्स के बीच संचार को सक्षम बनाता है। साथ ही, यह क्लस्टरिंग सुविधाओं तथा DB और FileSystem के माध्यम से प्रत्येक सिस्टम के बीच स्थिरता और स्थायित्व बनाए रखने वाला एक ओपन-सोर्स मैसेजिंग और इंटीग्रेशन पैटर्न सर्वर है।
OpenWire, Apache ActiveMQ में उपयोग किया जाने वाला एक बाइनरी मैसेजिंग प्रोटोकॉल है। इसे ब्रोकर (ActiveMQ) और क्लाइंट के बीच कुशल डेटा ट्रांसफर के लिए डिज़ाइन किया गया है।
CVE-2023-46604, ActiveMQ में OpenWire प्रोटोकॉल (मार्शल प्रक्रिया में) की एक भेद्यता है। Java-आधारित OpenWire ब्रोकर या क्लाइंट तक नेटवर्क एक्सेस रखने वाला एक दूरस्थ हमलावर, OpenWire प्रोटोकॉल में सीरियलाइज़्ड क्लास प्रकार में हेरफेर करके मनमाना शेल कमांड निष्पादित कर सकता है, जिससे क्लाइंट या ब्रोकर (क्रमशः) क्लासपाथ पर मौजूद किसी भी क्लास को इंस्टेंशिएट कर सकता है। यह APT समूह Andariel द्वारा आमतौर पर उपयोग किए जाने वाले हमले के तरीकों में से एक है।
CVE-2023-46604, OpenWire प्रोटोकॉल के माध्यम से डेटा के आदान-प्रदान की प्रक्रिया में XML कॉल में हेरफेर करके या दुर्भावनापूर्ण डेटा सम्मिलित करके दूरस्थ कमांड निष्पादित करने के रूप में आगे बढ़ता है। OpenWire प्रोटोकॉल मूल रूप से डेटा सीरियलाइज़ेशन और ट्रांसमिशन को संभालता है; यह भेद्यता इस सीरियलाइज़ेशन प्रक्रिया में दुर्भावनापूर्ण क्लास प्रकार की अनुमति का शोषण करती है।
[चित्र] POC
[चित्र] XML
패킷 Header
+----------------------------------------------------------------------------------+
| Packet Length | Command | Command Id | Command response required | CorrelationId |
|---------------|---------|------------|---------------------------|---------------|
| 00000066 | 1f | 00000000 | 00 | 00000000 |
+----------------------------------------------------------------------------------+
패킷 Body
+--------------------------------------------------------------------------------------+
| not-null | not-null | classname-size | classname | not-null | message-size | message |
|----------|----------|----------------|-----------|----------|--------------|---------|
| 01 | 01 | 0043 | ..... | 01 | 0012 | ..... |
+--------------------------------------------------------------------------------------+
OpenWire 패킷 Body 형식
[=If not-null is 1===========]
+----------+ [ +-------+----------------+ ]
| not-null | [ | size | encoded-string | ]
+----------+ [ +-------+----------------+ ]
| byte | [ | short | size octects | ]
+----------+ [ +-------+----------------+ ]
[============================]
[चित्र 1] WireShark OpenWire पैकेट जाँच
[चित्र 2] पैकेट Header का अर्थ
패킷 Header 끊어서 파악
+----------------------------------------------------------------------------------+
| Packet Length | Command | Command Id | Command response required | CorrelationId |
|---------------|---------|------------|---------------------------|---------------|
| 00000066 | 1f | 00000000 | 00 | 00000000 |
+----------------------------------------------------------------------------------+
Packet Length : 00000066 / OpenWire 같은 프로토콜은 기본적으로 패킷을 길이를 명시.
Command : 1f / 는 ExecptionResponse(31)을 명시 하기 위한 설정 31은 16진수(hex)로 1f.
Command Id : 00000000 / 는 int 형태 4바이트 형태 임으로 16진수 표현시 00 00 00 00.
Command response required : 00 / 는 boolean 타입으로 True(01), False(00) 에서 False.
CorrelationId : Command Id와 같은 유형
[चित्र 2] उपरोक्त पैकेट हेडर की समझ में सहायता के लिए, प्रत्येक हेडर आइटम के प्रकार और निर्दिष्ट कोड के स्पष्टीकरण को जोड़ता है। अब जब हमने Header देख लिया है, तो देखते हैं कि Body सामग्री के माध्यम से यह कोड से कैसे गुजरता है।
[चित्र 3] पैकेट Body का अर्थ
패킷 Body 내용 끊어서 파악
+--------------------------------------------------------------------------------------+
| not-null | not-null | classname-size | classname | not-null | message-size | message |
|----------|----------|----------------|-----------|----------|--------------|---------|
| 01 | 01 | 0043 | ..... | 01 | 0012 | ..... |
+--------------------------------------------------------------------------------------+
not-null (01) | / [그림 3]의 첫번째 함수에서 not-null pass
not-null (01) | classname-size (0043) | classname / [그림 3]의 두번째 함수에서 not-null pass, 세번째 함수에서 사이즈 체크 위한
not-null (01) | message-size (0012) | message / [그림 3]의 두번째 함수에서 not-null pass, 세번째 함수에서 사이즈 체크 위한
[चित्र 3] दिखाता है कि पैकेट के Body में निर्धारित मान कैसे कार्य करते हैं। अंत में, [चित्र 4] के माध्यम से, सीरियलाइज़ किए गए डेटा को क्लास लोड और इंस्टेंशिएट किया जाता है।
[चित्र 4] createThrowable के माध्यम से RCE निष्पादन
[चित्र 5] RCE कैलकुलेटर निष्पादन उदाहरण
[चित्र 5] Git Diff (5.17.2 -> 5.17.6)
[चित्र 5] validate Function
अन्य विश्लेषणों के विपरीत, इस भेद्यता में हमले के पैकेट का विश्लेषण करने का कारण यह समझना और अध्ययन करना था कि हमला वास्तव में कैसे निष्पादित होता है।
पैकेट की संरचना और प्रवाह की बारीकी से जाँच करके, हम उस विशिष्ट विधि और उसके क्रिया तंत्र को स्पष्ट रूप से समझ पाए जिसका उपयोग हमलावर सिस्टम से समझौता करने के लिए करता है।