Apache Axis1( | 申博官网
登录
  • 欢迎进入申博官网!
  • 如果您觉得申博官网对你有帮助,那么赶紧使用Ctrl+D 收藏申博官网并分享出去吧
  • 这里是申博官方网!
  • 申博官网是菲律宾sunbet官网品牌平台!
  • 申博开户专业品牌平台!

Apache Axis1(<=1.4版本) RCE

申博_行业观察 申博 211次浏览 未收录 0个评论

媒介

2019.6.16 发出了一则破绽预警:
https://www.gdcert.com.cn/index/news_detail/W1BZRDEYCh0cDRkcGw

近来两天刚好在进修WebService相干学问,这个 axis 组件就是一个SOAP引擎,供应建立效劳端、客户端和网关SOAP操纵的基础框架,没见过这类破绽,抱着进修的心态研讨下

触发流程

第一次要求:
org.apache.axis.transport.http.AxisServlet#doPost
->
org.apache.axis.utils.Admin#processWSDD
->
org.apache.axis.AxisEngine#saveConfiguration

第二次要求:
org.apache.axis.transport.http.AxisServlet#doPost
->
freemarker.template.utility.Execute#exec
->
java.lang.Runtime#exec(java.lang.String)

剖析历程

当地环境: jdk1.8_191 、Apache Axis1 1.4 、 Tomcat6

看了几个预警,大多形貌的是 “Apache Axis 中的 FreeMarker 组件/插件存在相干破绽”,我找了半天,没见着 FreeMarker 和 Axis 的合营运用呀emmm,这就让我更猎奇了,由于之前也有过 FreeMarker 模板注入 bypass 的文章(https://xz.aliyun.com/t/4846)
岂非是未受权接见到了 FreeMarker的模板剖析流程?

在 ‘/services/FreeMarkerService’ 这个途径上浪费了很多时刻,回头看向 ‘/services/AdminService’ 的未受权

全局搜一下,以下图:

Apache Axis1(<=1.4版本) RCE

完整和预警公告中的形貌符合,跟进 org.apache.axis.utils.Admin#AdminService 检察以下:

Apache Axis1(<=1.4版本) RCE

轻微相识过 WebService 的带哥可以此时就邃晓了,之前的谁人 service-config.wsdd 设置文件展现的 service 标签就是一个个 WebService 宣布的端口,个中 allowedMethods 则是宣布的函数,如上图的 AdminService 函数,我们可以经由过程 SOAP 的体式格局去挪用效劳端的 AdminService 函数,须要组织的要求大抵以下:

POST /services/AdminService …

他会自动处置惩罚我们通报的xml构造参数,上图中 xml[0] 内容是我们完整可控的,跟进 process 函数,以下:

Apache Axis1(<=1.4版本) RCE

起首挪用了 verifyHostAllowd 函数举行考证,其考证内容大抵以下:

Apache Axis1(<=1.4版本) RCE

粗心是假如效劳端该 WebService 端口的 enableRemoteAdmin 属性为 false 的话,则推断当前接见ip,假如是本机接见则放行,假如是长途接见就抛错

继承跟进 processWSDD 函数,以下:

protected static Document processWSDD(MessageContext msgContext,
                                          AxisEngine engine,
                                          Element root)
        throws Exception
    {
        Document doc = null ;
        String action = root.getLocalName();
        if (action.equals("passwd")) {
            [...]
        }
        if (action.equals("quit")) {
            [...]
        }
        if ( action.equals("list") ) {
            [...]
        }
        if (action.equals("clientdeploy")) {
            // set engine to client engine
            engine = engine.getClientEngine();
        }
        WSDDDocument wsddDoc = new WSDDDocument(root);
        EngineConfiguration config = engine.getConfig();
        if (config instanceof WSDDEngineConfiguration) {
            WSDDDeployment deployment =
                ((WSDDEngineConfiguration)config).getDeployment();
            wsddDoc.deploy(deployment);
        }
        engine.refreshGlobalOptions();
        engine.saveConfiguration();
        doc = XMLUtils.newDocument();
        doc.appendChild( root = doc.createElementNS("", "Admin" ) );
        root.appendChild( doc.createTextNode( Messages.getMessage("done00") ) );
        return doc;
    }

上述代码的几个 if 我都省略了,由于那不重要,不过 action 也是我们完整可控的,然则这几个if中的功用代码基础轻描淡写,不能做到 rce 的结果,此时我们可以完整掌控的就是 root 变量,它被带入了 WSDDDocument 组织函数中,跟进去以下:

Apache Axis1(<=1.4版本) RCE

诶,又对当前标签名作了一次推断,而且看见了 undeployment 和 deployment 这类和 WebService 密切相干的变量名,undeployment 不感兴趣,继承跟进 WSDDDeployment 组织函数:

public WSDDDeployment(Element e)
            throws WSDDException {
        super(e);
        [...]
        elements = getChildElements(e, ELEM_WSDD_SERVICE);
        for (i = 0; i < elements.length; i++) {
            try {
                WSDDService service = new WSDDService(elements[i]);
                deployService(service);
            } catch (WSDDNonFatalException ex) {
                // If it's non-fatal, just keep on going
                log.info(Messages.getMessage("ignoringNonFatalException00"), ex);
            } catch (WSDDException ex) {
                // otherwise throw it upwards
                throw ex;
            }
        }
        [...]
    }

还记得之前的 server-config.wsdd 文件对 service 的形貌内容吗,以下:

<service name="AdminService" provider="java:MSG">
 <namespace>http://xml.apache.org/axis/wsdd/</namespace>
 <parameter name="allowedMethods" value="AdminService"/>
 <parameter name="enableRemoteAdmin" value="ture"/>
 <parameter name="className" value="org.apache.axis.utils.Admin"/>
</service>

如上设置代码,是直接用 service 标签包裹的,所以我们在 WSDDDeployment 组织函数中直接对准 service 关键词,上面贴出来的代码中,ELEM_WSDD_SERVICE 意义以下:

Apache Axis1(<=1.4版本) RCE

起首,这个范例为 Element 的 e 变量是我们从客户端通报的,所以完整可控,在WSDDDeployment 组织函数中,只需 e 的子节点中含有 service 标签就将其还原成 WSDDService 对象,而且挪用 deployService 函数,一起跟进到 WSDDService 的 deployToRegistry 函数中,以下:

Apache Axis1(<=1.4版本) RCE

基础上就没有过量的操纵了,我们先停一停,起首这个初始化历程仅仅是做了注册操纵,虽然我们组织的参数被注册了,然则如今还没有下一步触发的处所,回到org.apache.axis.utils.Admin#processWSDD 中

Apache Axis1(<=1.4版本) RCE

如上,我们掌握的 service 已在 wsddDoc 中注册了,末了会挪用一此 engine.refreshGlobalOptions 和 saveConfiguration ,这意味着方才的初始化操纵很有可以会被保留进设置文件中,那末追念下 axis 的 WebService 操纵好像确实是由设置文件掌握,那末到下次接见该效劳的时刻,是不是是会革新我们自身注册的 service 呢?

测试流程

先下载 Apache Axis 1.4 版本的源码或者是装置包
源码在GitHub上有,装置包在:http://apache.fayea.com/axis/axis/java/1.4/

然后启动项目,直接接见 localhost:8080/servlet/AxisServlet

Apache Axis1(<=1.4版本) RCE

通过异常处理机制实现漏洞利用

0x1:MS09-032简介 2009 年 7 月 5 日,微软爆出了 MPEG-2 视频漏洞,也就是著名的 Microsoft DirectShow MPEG-2 视频 ActiveX 控件远程代码执行漏洞。该漏洞微软编号为 MS09-032,CVE 编号为 CVE-2008-0015,对应补丁号为 KB 973346。 该漏洞存在于微软 DirectShow 组件 msvidctl.dll 中,文件路径: C:\WINDOWS\system32 \ msvidctl.dll,程序员由于粗心大意,将传入参数 buff 误写为&buff,而&buff 附近恰巧存放着 S.E.H 异常处理函数指针,于是可以通过覆盖 S.E.H 并结合 Heap spray 技术实现 exploit。 该漏洞几乎影响到微软当时全部的操作的系统。由于 Vista 和 2008 操作系统上具有一些保护机制,虽然存在漏洞,但是 exploit 代码不能被轻易执行。 0x2:Windows 异常处理机制简介 操作系统或程序在运行时,难免会遇到各种各样的错误,如除零、非法内存访问、文件打开错误、内存不足、磁盘读写错误、外设操作失败

当前只要两个 WebService 端口,在 WEB-INF/server-config.wsdd 中也只要两个 service 标签,以下:

Apache Axis1(<=1.4版本) RCE

(其 enableRemoteAdmin 已被我改成 ture,默以为 false)

那末此时我们随意组织一个POST包,发过去看看能不能新建一个 WebService 端口

Apache Axis1(<=1.4版本) RCE

接见方才的网页:

Apache Axis1(<=1.4版本) RCE

已含有报错,此时看看server-config.wsdd 文件中的 service 标签:

Apache Axis1(<=1.4版本) RCE

如上图,确实是我们自身增加的内容,那末接见一下 /services/a?wsdl

Apache Axis1(<=1.4版本) RCE

虽然报错了,然则这表明,我们在 POST 自定义设置事后,是可以马上见效的,这预计也是 Asix 基于设置文件驱动有关。

那末我们如今可以干什么,这就须要对 WebService 有肯定的相识了,可以将 WebService 看做一个个微型效劳端口,只需有相干设置,可以做到单个函数级别的挪用。那末在我们完整可控设置文件的情况下,这就意味着我们可以挪用”恣意函数”

不能完整做到为所欲为,须要满足 WebService 的划定规矩,比方 端口类 须要有一个 public 的无参组织函数,还要须要当前 ClassLoader 可以找获得指定类,末了也是最贫苦的则是指定函数的参数婚配,没有细致研讨这个老框架,不晓得庞杂范例的传参是不是许可

应用

如今我们晓得可以在有限前提下挪用恣意函数,那末怎样应用?另有和公告中的 freemarker 有啥关联?

在腾讯云的预警中找到了一句:

Apache AXIS中的freemarker组件中挪用template.utility.Execute类时存在长途敕令实行进击

检察 Execute 类:

Apache Axis1(<=1.4版本) RCE

直接将通报进来的参数作为敕令实行的参数,而且参数范例是 List ,那末基础可以肯定这个应当可以应用(List在xml构造中可以看做Array构造)

不过好像少个public无参组织函数?检察一下字节码:

Apache Axis1(<=1.4版本) RCE

本来只是没有反编译出来罢了

那末我们就可以组织两个POST包:

第一个包设置设置文件,将 freemarker.template.utility.Execute 作为一个 WebService 的端口,而且开放 exec 函数,第二个包接见设定的 WebService 端口,而且发送SOAP操纵,挪用效劳端的 freemarker.template.utility.Execute#exec 函数

结果以下:

第一次要求:

Apache Axis1(<=1.4版本) RCE

第二次要求:

Apache Axis1(<=1.4版本) RCE

(以上流程我是将freemarker-2.3.23.jar 增加进 WEB-INF/lib 中的,Axis 自身没有这个jar包)
固然也可以在 Axis 自带的 libs 中征采应用类,所需前提上文已论述过

总结

实在这个破绽和 freemarker 没有啥必然联系,重要是由于 Axis 的未受权接见,但是默许设置下是不许可长途接见 AdminService 端口的,不过照样进修了 Axis 的处置惩罚体式格局,之前所相识到的 WebService 都是经由过程注解操纵,但实在反过来想一想,注解或是设置文件都一样,都须要框架底层自行完成剖析流程


申博|网络安全巴士站声明:该文看法仅代表作者自己,与本平台无关。版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明Apache Axis1(<=1.4版本) RCE
喜欢 (0)
[]
分享 (0)
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址