
Rogue RMI Registry असुरक्षित जावा डिसीरियलाइज़ेशन का शोषण करने वाला, list/lookup/bind विधियों के माध्यम से। Ysoserial गैजेट उत्पन्न करता है और वितरित करता है ताकि कमजोर क्लाइंट पर रिमोट कोड निष्पादन को ट्रिगर किया जा सके।
Ermir एक Evil/Rogue RMI रजिस्ट्री है, यह किसी भी Java कोड पर जो इस पर मानक RMI विधियों (list()/lookup()/bind()/rebind()/unbind()) का कॉल करता है, असुरक्षित डिसीरियलाइज़ेशन का शोषण करता है।
Ermir को rubygems.org से स्थापित करें:
$ gem install ermir
या रिपॉजिटरी क्लोन करें और जेम बनाएँ:
$ git clone https://github.com/hakivvi/ermir.git
$ rake install
Ermir एक cli जेम है, यह 2 cli फ़ाइलों ermir और gadgetmarshal के साथ आता है, ermir वास्तविक जेम है और बाद वाला GadgetMarshaller.java फ़ाइल के लिए एक आकर्षक इंटरफ़ेस है, जो Ysoserial के गैजेट्स को MarshalInputStream आवश्यकताओं से मेल खाने के लिए पुनर्लेखन करता है, आउटपुट को फिर ermir या एक फ़ाइल में पाइप किया जाना चाहिए, कस्टम गैजेट्स के मामले में अपने क्रमबद्ध ऑब्जेक्ट को आउटपुट स्ट्रीम में लिखने के लिए ObjectOutputStream के बजाय MarshalOutputStream का उपयोग करें।
ermir उपयोग:
➜ ~ ermir
Ermir by @hakivvi * https://github.com/hakivvi/ermir.
Info:
Ermir is a Rogue/Evil RMI Registry which exploits unsecure Java deserialization on any Java code calling standard RMI methods on it.
Usage: ermir [options]
-l, --listen bind the RMI Registry to this ip and port (default: 0.0.0.0:1099).
-f, --file path to file containing the gadget to be deserialized.
-p, --pipe read the serialized gadget from the standard input stream.
-v, --version print Ermir version.
-h, --help print options help.
Example:
$ gadgetmarshal /path/to/ysoserial.jar Groovy1 calc.exe | ermir --listen 127.0.0.1:1099 --pipe
gadgetmarshal उपयोग:
➜ ~ gadgetmarshal
Usage: gadgetmarshal /path/to/ysoserial.jar Gadget1 cmd (optional)/path/to/output/file
java.rmi.registry.Registry 5 विधियाँ प्रदान करता है: list(), lookup(), bind(), rebind(), unbind():
public Remote lookup(String name): lookup() रजिस्ट्री में एक बाउंड ऑब्जेक्ट को उसके नाम से खोजता है, रजिस्ट्री एक Remote ऑब्जेक्ट लौटाती है जो खोजे गए रिमोट ऑब्जेक्ट को संदर्भित करता है, लौटाया गया ऑब्जेक्ट MarshalInputStream.readObject() का उपयोग करके पढ़ा जाता है जो ObjectInputStream के ऊपर एक और परत है, मूल रूप से यह प्रत्येक क्लास/प्रॉक्सी डिस्क्रिप्टर (TC_CLASSDESC/TC_PROXYCLASSDESC) के बाद एक URL की अपेक्षा करता है जिसका उपयोग इस क्लास या प्रॉक्सी क्लास को लोड करने के लिए किया जाएगा। यह वही जंगली बग है जिसे jdk7u21 में ठीक किया गया था। (Ermir इस URL को निर्दिष्ट नहीं करता क्योंकि केवल पुराने Java संस्करण ही कमजोर हैं, इसके बजाय यह केवल null लिखता है)। चूंकि Ysoserial गैजेट्स को ObjectOutputStream का उपयोग करके क्रमबद्ध किया जा रहा है, Ermir निर्दिष्ट गैजेट को MarshalInputStream आवश्यकताओं से मेल खाने के लिए क्रमबद्ध करने हेतु gadgetmarshal - के चारों ओर एक रैपर- का उपयोग करता है।

बग रिपोर्ट और पुल अनुरोध GitHub पर https://github.com/hakivvi/ermir पर स्वागत है। यह परियोजना सहयोग के लिए एक सुरक्षित, स्वागत योग्य स्थान होने का इरादा रखती है, और योगदानकर्ताओं से आचार संहिता का पालन करने की अपेक्षा की जाती है।
यह जेम MIT License की शर्तों के तहत ओपन सोर्स के रूप में उपलब्ध है।
Ermir प्रोजेक्ट के कोडबेस, मुद्दा ट्रैकर्स, चैट रूम और मेलिंग सूचियों में बातचीत करने वाले सभी लोगों से आचार संहिता का पालन करने की अपेक्षा की जाती है।

public String[] list(): list() रजिस्ट्री से सभी बाउंड ऑब्जेक्ट्स के नाम पूछता है, जबकि String प्रकार को एक दुर्भावनापूर्ण गैजेट से प्रतिस्थापित नहीं किया जा सकता क्योंकि यह किसी सामान्य ऑब्जेक्ट की तरह नहीं है और इसे readObject() के बजाय readUTF() का उपयोग करके पढ़ा जाता है, हालांकि चूंकि list() String[] लौटाता है जो एक वास्तविक ऑब्जेक्ट है और इसे readObject() का उपयोग करके पढ़ा जाता है, Ermir इस String[] प्रकार के बजाय गैजेट भेजता है।

public void bind(java.lang.String $param_String_1, java.rmi.Remote $param_Remote_2): bind() किसी ऑब्जेक्ट को रजिस्ट्री पर एक नाम से बांधता है, bind() के मामले में रिटर्न प्रकार void है और कुछ भी वापस नहीं किया जा रहा है, हालांकि यदि रजिस्ट्री RMI रिटर्न डेटा पैकेट में निर्दिष्ट करती है कि यह रिटर्न एक अपवादात्मक रिटर्न है, तो क्लाइंट/सर्वर क्लाइंट रिटर्न प्रकार void होने के बावजूद readObject() को कॉल करेगा, इस प्रकार रजिस्ट्री अपने क्लाइंट को अपवाद (आमतौर पर java.lang.ClassNotFoundException) भेजती है, एक बार फिर Ermir एक वैध Exception ऑब्जेक्ट के बजाय क्रमबद्ध गैजेट देगा।

public void rebind(java.lang.String $param_String_1, java.rmi.Remote $param_Remote_2): rebind() पास किए गए नाम की बाइंडिंग को आपूर्ति किए गए रिमोट रेफरेंस से बदल देता है, यह भी void लौटाता है, Ermir bind() की तरह एक अपवाद लौटाता है।
public void unbind(java.lang.String $param_String_1): unbind() RMI रजिस्ट्री में नाम से एक रिमोट ऑब्जेक्ट को अनबाइंड करता है, यह भी void लौटाता है।