内容简介:2019年4月29日上午9:00,第五届XCTF国际联赛分站赛——*CTF 2019国际赛宣告圆满落幕。据官方报道,本次赛事共有来自71个国家和地区的1026支队伍参赛,参赛人数达5078人。安胜ISEC团队本着学习交流、共同提高的目的,与各队伍同台竞技、互相切磋,最终获得第五名的成绩。
2019年4月29日上午9:00,第五届XCTF国际联赛分站赛——*CTF 2019国际赛宣告圆满落幕。据官方报道,本次赛事共有来自71个国家和地区的1026支队伍参赛,参赛人数达5078人。安胜ISEC团队本着学习交流、共同提高的目的,与各队伍同台竞技、互相切磋,最终获得第五名的成绩。
榜单结果
本次比赛面向全球CTF战队,在全球不同地点同时开赛。从4月27日早上9:00开始,比赛持续48小时,赛题分为pwn、reverse、crypto、web、misc几大类型,偏重于二进制,考察点从基本的汇编指令,到更深一步的高级漏洞利用都有涉及,需要参赛选手有较强的二进制基础,更考验队员之间的默契配合程度。
想知道我们的参赛选手们是如何见招拆招、攻克一道道难题的吗?别急,WriteUp解题思路看这里…..
MISC
misc1:She
Enjoy the game!
HINT:Please combine numbers in the order of the rooms
解题
通过分析下载文件发现是使用RPG Makr XP制作的一款游戏,下载RPG Maker XP V1.03 .exe软件,创建新项目,将项目中的Game.rxproj放到She目录下,打开文件即可进行游戏编辑,通过分析代码将第一只BOOS的攻击改为1。
图1
通过老鹰后,显示一些提示,会有幽灵找你,碰到要重新开始,通过编辑器将幽灵删除。
图2
有9个门,测试后37无条件打开,双击门判断门打开的前提条件,发现382157这个顺序,按照该顺序获取到的数值是371269,按照房间顺序排列得到213697。
图3
根据提示将拿到的数字进行MD5加密,得到d6f3fdffbcb462607878af65d059f274,即为flag。
misc2:babyflash
Recently my younger brother learnt how to make a flash.
Here’s his first work.
解题
用JPEXS反编译flash.swf得到441张黑白图片和1个mp3文件。
图4
令黑的为1、白的为0利用 python 处理。
图5
图6
生成二维码。
图7
得到*ctf{half flag &,用audacity打开mp3以频谱图显示。
图8
最后flag*ctf{half flag &&_the_rest}。
misc3:otaku
One day,you and your otaku friend went to the comic expo together and he had a car accident right beside you.Before he died,he gave you a USB hard disk which contained this zip.Please find out his last wish.
提示:The txt is GBK encoding.
解题
用winhex等 工具 打开压缩包去掉伪加密09标识,得到doc的一段话。
图9
Hello everyone, I am Gilbert. Everyone thought that I was killed, but actually I survived. Now that I have no cash with me and I’m trapped in another country. I cant contact Violet now. She must be desperate to see me and I dont want her to cry for me. I need to pay 300 for the train, and 88 for the meal. Cash or battlenet point are both accepted. I dont play the Hearthstone, and I dont even know what is Rastakhans Rumble.
利用python处理,将此写入txt,编码为gbk。
根据注释:
压缩软件:winrar版本 5.70 beta 2
配置:zip压缩文件(低压缩率)
压缩方式:标准
下载winrar
图10
压缩后进行明文攻击,密钥从1开始。
图11
成功得到口令My_waifu,再解压图片zsteg flag.png,最后得到flag*ctf{vI0l3t_Ev3rg @RdeN }。
图12
misc4:Sokoban
Lets play another Sokoban game.
You only have 60 seconds to complete 25 levels,the number of boxes is greater than or equal to 1,less than or equal to 3,and the map size is at most 12*10.
$ nc 34.92.121.149 9091
解题
根据题目提示进行nc连接。
图13
发现是一个推箱子的游戏,需要找到最优解(路径最短),且在60秒内完成25个关卡。
C++编程实现找到最优解并提交通关。
文件夹下两个CPP为源文件,a为编译后的脚本部分代码:
图14
运行结果:
图15
二、CRYPTO
crypto1:babyprng
$ nc 34.92.185.118 10002
解题
根据题目提示进行nc连接。
图16
下载py文件,根据程序了解,需要输入四个字符(字母数字)和随机的一串字符进行sha256加密,密文要等于给的那串。
py脚本:
图17
输入正确的四个字符后进入下一步,需要输入十六进制数。按题目中的程序,十六进制数有取值范围,使用py脚本暴力破解符合条件的数。
图18
图19
由于原本题目中的size为100000,本地根本跑不出来,修改size数值后获取了一个十六进制数。
图20
crypto2:babyprng2
nc 34.92.185.118 10003
解题
第二题和第一题类似,第一步还是sha256,只是第二步多了些十六进制数匹配和数值修改。
py脚本:
图21
图22
这里size数值取1,十六进制数为5个,得到结果0004350106。
但在本地测试数值是否正确时,提交几遍后才出flag。在赛题环境中手动提交一直失败,而且在重新跑过脚本后出来的结果又不同,怀疑为脚本问题,但本地提交多次都成功,可能为最后随机数的问题,最终以一个 PHP 脚本提交答案。
图23
获取flag。
图24
crypto3:notcurves
!!!this challenge is under maintaince. !!! For the sake of fairness you can download the old script.
this challenge is up now! the file has been updated, you can download the old script at here.$ nc 34.85.45.159 20005
解题
分析Python脚本源程序,发现其是两层加密,第一层是破解SHA256,求出输入字符的前4个字符,其破解SHA256的Python源代码如下。
图25
将上面破解求出的4个字母字符,提交服务器即可进入第二层破解算法。
图26
分析上述代码,进入这里的时候,前面很多应该是扰乱代码,输入”5”可进入下一步,输入一个坐标点(u,v),使其满足条件:(u*v)%p==0,这里的p是两个15比特素数的乘积,尝试多次输入两个素数,才使其满足前面的条件。后来总结时发现其实是可以输入(0,0)的,这可能是出题者的一个失误。
图27
三、WEB
web1:mywebsql
图28
提示:
图29
解题
通过admin/admin弱口令登录。
图30
找到一个Mywebsql漏洞:
https://github.com/eddietcc/CVEnotes/blob/master/MyWebSQL/RCE/readme.md
Create a test table (code) and write a shell code in this table.
图31
Shell地址:
图32
使用 perl 反弹shell。
图33
转义单引号并url编码,根目录下有readflag和flag文件,执行readflag脚本提示一个算术题,需提交答案。由于无法直接输入,所以需要脚本实现结果的输入。
图34
使用PHP的proc_open来执行/readflag,并算出随机算式的答案重定向到程序中获取flag,附上脚本代码。
图35
web2:Echohub
how2stack
图36
提示:
run.sh =>#!/bin/sh service —status-all | awk {print $4}| xargs -i service {} start sleep infinity;
I am sorry for that sandbox.php
is basically no use, so this challenge can be solved more easily.
解题
进入题目,发现在data中提交任意字符都会返回phpinfo,而提交长度过大时会提示emmmmmm…Dont attack me!,查看页面代码,发现提示:
图37
提交之后得到源代码。查看phpinfo,发现disable_functions禁用很多,但是move_uploaded_file函数拼错了,所以可以利用其上传文件到指定目录,但open_basedir中的目录不存在,所以实际上无法使用。发现stream_socket_client、fputs、fgets、create_function这些函数没有禁止,所以可以利用其构造一个简易的phpshell。
查看index.php代码,通过混淆加密的方式加密代码,解密之后,查看源代码,提示“emmmmmm…Dont attack me!”时应该是出现了栈溢出,采用srand函数使用时间戳对随机数进行布种,而时间戳可以通过phpinfo中的server变量得到,故本题中的随机数都可以预判。
预判其栈结构。
图38
修改index.php代码,将关键部分改掉,改成可以生成poc的程序。
图39
图40
图41
图42
这样就形成简易版poc程序,可以得到一个在30秒后执行命令的exp,由于php的create_function函数存在注入漏洞,通过该poc程序,调用create_function函数,就可以执行任意代码。
这就是构造完毕的exp,在服务器上观察一个端口,该exp成功执行后,就可以得到一个php的shell,可以执行任意php代码,执行结果通过ob_flush();flush();可以输出到页面上,也可以赋值给$s变量回显到 shell 上。
图43
图44
接下来就跟0ctf-2019一样,这里引用某篇文章说明。
图45
虽然这个没有真正做出来,但指明了方向,即使用php-fpm修改php_value来执行命令,php_value中虽然无法修改disable_functions,但是可以修改sendmail_path的地址达到命令执行的效果,而虽然禁用了mail,但是php中发送邮件的函数很多,例如error_log函数。
图46
然后在发送数据包的地方输出。(服务器禁用了fsocket系列函数,所以该poc无法正常运行。)
图47
然后在服务器上再观察一次端口,将phpshell中得到的BASE64_CODE通过stream_socket_client发送给php-fpm,这样就能在服务器上运行任意命令了,此时反弹一个cmdshell回来。
图48
得到cmdshell后,执行readflag,发现输出跟之前的题目类似,则使用之前题目readflag的程序,通过eval得到flag。
图49
图50
四、REVERSE
reverse1:yy
Do you love yy ?
解题
程序逻辑:
根据给定的规则解析并处理输入。
思路:
};
根据输入取表并更新buffer,使用round_key加密buffer(aes_cbc_encrypt),字符
表示进行下一轮处理(重置buffer),将得到的结果与加密串比较;输入字符与box的对应关系;
aes_cbc_decrypt即可得到flag;
flag:
CTF{yy_funct10n_1s_h4rd_and_n0_n33d_to_r3v3rs3} 。reverse2:Obfuscating Macros II
You have seen something like this before,I guess.
解题
程序类似表达式计算。
程序逻辑:
根据输入的两个DWORD64进行计算,并与给定的两个DWORD64比较。
思路:
程序有固定的处理模式: if (xx) { do stuff };
在对应的模式处下断即可得到完整的处理逻辑。
flag:*CTF{fUnfl @tCf9 }。
reverse3:Matr1x
What information is hidden in the matrix?
解题
3魔方
程序逻辑:
魔方每个面上的点都有1个值,计为DWORD v[6][3][3],根据输入旋转魔方,计算每个面上点的值。
sum(corner + center) == 给定的值1,
sum(middle + center) == 给定的值2,
计算每个面上的点与另一个数组的点乘, 得到6个DWORD作为flag输出。
思路:
6)、middle(46)、center(6)。
CTF{..}作为过滤条件即可得到flag。flag: *CTF{7h1S_Cu63_is_m4g1c}。
reverse4:fanoGo
Do you kown go & fano encode?
$ nc 34.92.37.22 10001
解题
Go程序
程序逻辑:
以字典文件corpus.txt初始化编码器;
if Fano.Decode(输入) == 给定字符串:输出flag。
思路:
程序中同时存在Fano.Encode函数,patch程序调用Fano.Encode(给定字符串)并输出。
flag:*CTF{NUY4a3E5D9186hVzejoyItr7xHBcmOpv}。
五、PWN
pwn1:quicksort
I’m very quick!
$ nc 34.92.96.238 10000
解题
1.输入存在栈溢出;
图51
2.栈溢出覆盖ptr即可实现任意地址任意写;
3.修改ptr指向got表,即可泄漏libc基址;
4.修改atoi为system,输入/bin/sh;即可获得shell。
py脚本:
图52
pwn2:girlfriend
new libc, new life.
$ nc 34.92.96.238 10001
解题
1.Double free;
图53
2.申请大于0x400的堆,然后释放,可以获得main_aren_top的地址;
3.Libc2.29在free时会检查free的地址是否已经在tcache中,要先填满tcache再触发double free;
4.fastbin attack修改free_hook指向system;
5.触发free(“/bin/sh;”)。
py脚本:
图54
图55
pwn3:babyshell
An easy shellcode
$ nc 34.92.37.22 10002
解题
遇到0时就停止检查,在shellcode前加上push 0即可绕过检查。
py脚本:
图56
pwn4:blindpwn
Close your eyes!
$ nc 34.92.37.22 10000
checksec:
Arch:amd64-64-little
RELRO:Partial RELRO
Stack:No canary found
NX:NX enabled
PIE:No PIE (0x400000)
file libc:
libc-2.23.so: ELF 64-bit LSB shared object,
x86-64, version 1 (GNU/Linux),dynamically
linked, interpreter /lib64/ld-linux-x86-64.so.2,
BuildID[sha1]=b5381a457906d279073822a5ceb2
解题
本题没有提供程序,给了服务器和端口,没有aslr和栈保护。
1.链接后提示”Welcome to this blind pwn!”,输入任意内容,提示”Goodbye!”;
2.输入1个超长字符串,没有看到”Goodbye!”,说明溢出了;
3.确定返回地址的位置,修改返回地址(从0x400000开始),直接有返回输出;
4.从输出中得到libc基址,one_gadget get shell。
pwn5:upxofcpp
$ nc 34.92.121.149 10000
解题
1.用upx脱壳;
2.存在UAF漏洞;
3.upx加壳的堆可执行,可以在堆上构造shellcode;
4.申请一个size为6的vec_0和一个size为10的vec_1,释放vec_0后,vec_0的vtb便指向堆,然后释放vec_1,再申请一个size为6的vec_3,直接输入-1,就可以不破坏vec_0的vtb;
5.同上的方法可以使vtb+0x10也指向堆;
6.在vtb+0x10指向的地方构造shellcode;
7.调用show,触发vtb+0x10。
py脚本:
图57
官方题目地址如下,有需要的小伙伴可进行学习探讨:
https://github.com/sixstars/starctf2019以上WriteUp,你get到了吗?
欢迎大家文末留言,共同交流,
也欢迎志同道合的朋友加入ISEC团队。
未来安胜将继续砥砺前行,
以专业的姿态守护网络安全!
安胜作为国内领先的网络安全类产品及服务提供商,秉承“创新为安,服务致胜”的经营理念,专注于网络安全类产品的生产与服务;以“研发+服务+销售”的经营模式,“装备+平台+服务”的产品体系,在技术研究、研发创新、产品化等方面已形成一套完整的流程化体系,为广大用户提供量体裁衣的综合解决方案!
我们拥有独立的技术及产品的预研基地—ISEC实验室,专注于网络安全前沿技术研究,提供网络安全培训、应急响应、安全检测等服务。此外,实验室打造独家资讯交流分享平台—“ISEC安全e站”,提供原创技术文章、网络安全信息资讯、实时热点独家解析等。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。