DDCTF2020 WriteUp
Web#
Web签到#
尝试注册并登录,提示不是admin。
由于token是jwt,尝试用jwtcrack爆破密码,得到secret:1。
修改jwt payload userRole为ADMIN,登录后得到客户端文件。
逆向客户端,发现签名为HMAC-SHA256,密钥为DDCTFWithYou。
构造command payload并发送,发现为spring的spel注入。RCE得到flag。
1 | import json |
卡片商店#
首先存在溢出,直接大数字借卡片然后还卡片得到100以上卡片,兑换后拿到hint:url: /flag , SecKey: Udc13VD5adM_c10nPxFu@v12。
根据Cookie和404的表现,推断出使用的gin+gin-contrib/sessions。修改sessions代码,在get时输出payload内容,然后解析Cookie。发现admin字段为false。改为true后,拿到flag。
可能需要patch一下sessions的go代码 显示session字段
1 | package main |
Easy Web#
尝试访问/web/index.php,发现一个“后台”,图片为get路径,存在目录穿越,可以从WEB-INF目录获取项目xml配置文件及字节码。
逆向后发现使用了shiro,路由的权限判断在FilterChainDefinitionMapBuilder。推断出存在shiro安全过滤的模式匹配bug,/web/index.php绕过了权限判断,路由至/web/index。
访问;/web/68759c96217a32d5b368ad2965f625ef/index进入admin界面,发现thymeleaf注入。
绕过过滤执行函数可以列目录和读文件。flag在/flag_is_here
exp:
1 | import requests |
Reverse#
Android Reverse 1#
AES->xxtea->MD5
题目给出MD5输入。xxtea密钥为\x02\x02\x03\x04,解密时将IDA F5代码反向跑就行。AES密钥为1234567890123456,根据字符串输出找到CSDN上实现的源代码,直接解密,得到flag。
Reverse xxtea:
1 |
|
AES: https://blog.csdn.net/shaosunrise/article/details/80219950
Android Reverse 2#
在re1的基础上增加了ollvm混淆和secshell壳。脱壳后MainActivity逻辑未变,逆向libnative-lib.so。
单步调试,发现结构与1相同,但在xxtea之前将密钥数值乘10。
修改密钥后解密出flag。
Misc#
decrypt#
重要代码:
1 | def encrypt_bits(self, b): |
boxed和unboxed在同一组key加密时为相同值,故可以用中途相遇法进行搜索。先枚举k3,k4得到unboxed列表,再枚举k0,k1,k2并二分查找表,查看是否有相同的。为了保证结果对所有分组适用,需要多验证几个分组(代码验证了10组)。
时间复杂度:$O(n^{3}\log n^2)$。
空间复杂度:$O(n^2)$
由于异或关系以及sbox的值不超过$2^{12}$,key的值也不会超过4096,此程序能在几个小时内跑出。
exp:
1 |
|
SECRET_KEYS = [3488,2863,726,602,138]