j0rd1s3rr4n0/HydroFlowConsole

GitHub: j0rd1s3rr4n0/HydroFlowConsole

一款故意包含 pickle 反序列化漏洞的水力发电控制面板教学靶场,用于演示工控环境下的会话篡改与权限提升攻击。

Stars: 3 | Forks: 1

# HydroFlow Console

HydroFlow Console banner

**HydroFlow Console** 是一个水力发电控制面板的教学模拟器。它模拟了带有涡轮机、闸门和环境条件的大坝物理行为。该应用程序包含一个故意设计的不安全的会话处理实现(使用 `pickle`),仅用于教育目的。 ## 🚀 安装 ``` pip install -r requirements.txt python app.py ``` 访问 `/login` 登录页面。只有用户 `l.perez` 可以免密登录。登录后,前往 `/dashboard` 查看控制面板。使用 `/logout` 登出。主页 `/` 显示包含团队信息的欢迎页面。 ## Docker (.tar) 构建并运行: ``` docker compose up --build ``` 导出镜像为 .tar: ``` docker build -t hydroflow:latest . docker save -o hydroflow-image.tar hydroflow:latest ``` 从 .tar 导入镜像: ``` docker load -i hydroflow-image.tar docker run --rm -p 8080:8080 hydroflow:latest ``` 从源码 .tar(代码归档)构建: ``` tar -xf hydroflow-src.tar -C /tmp/hydroflow cd /tmp/hydroflow docker build -t hydroflow:latest . ``` ## 🔐 认证 登录表单收集用户名和密码。成功登录会生成一个 `session` cookie,其中包含一个带有用户名和角色(`viewer`、`engineer` 或 `admin`)的字典。该 cookie 使用 `pickle` 序列化并进行 base64 编码。在 `/dashboard` 上,该 cookie 会被反序列化以控制用户访问权限。 ## 🧪 Cookie 利用 由于会话 cookie 未经过签名或加密,因此可以被篡改。通过将其从 base64 解码,修改 `role` 并重新编码,你可以实现权限提升。例如,将 `role: viewer` 更改为 `admin` 即可获得完全访问权限。 反序列化使用: ``` pickle.loads(base64.b64decode(request.cookies.get("session"))) ``` 这在设计上是不安全的,如果未经验证,则允许注入恶意对象。 ## ⚙️ 模拟与物理模型 启动时,所有闸门均关闭,涡轮机关闭。后台线程每 3 秒更新一次模拟。 ### 常量和变量 * `NUM_GATES` = 5 * `MAX_LEVEL` = 250 m * `DAM_AREA` = 1000 m² * `WATER_DENSITY` = 1000 kg/m³ * `GRAVITY` = 9.81 m/s² * `RPM_MIN` = 2000, `RPM_WARN` = 4500, `RPM_MAX` = 5000 * `PRESSURE_MAX` = 100 bar * `POWER_MAX` = 200 MW ### 天气与流入量 随机天气影响流入量: * 晴天 → 0.2 m³/s * 雨天 → 1.0 m³/s * 暴雨 → 2.7 m³/s + 60秒计时器 ### 水动力学 流出量取决于打开的闸门: ``` flow = open_gates * 1.0 water_level += inflow - flow ``` 压力计算方式: ``` pressure = water_level * 1.12 ``` ### 涡轮机与功率 如果打开的闸门超过两个,涡轮机将启动: ``` target_rpm = max(pressure * 8, RPM_MIN) ``` 每 1000 rpm 会使涡轮温度升高 1 °C。功率输出: ``` P = ρ * g * Q * H / 1_000_000 ``` ### 故障条件 * **大坝坍塌**:压力 > 100 bar 或溢流超过 60秒 * **过载**:功率 > 200 MW 触发 500 错误并显示 `flag{electric_power}`。 ## 💻 界面 仪表板使用 Bootstrap 和 Chart.js 显示: * 水位 * 压力 * 流出量 * RPM 与温度 * 产生的功率 管理员可以打开/关闭闸门并更新固件。天气信息包括湿度和风速。一个迷你导航栏显示已登录的用户和登出选项。 ## ⚙️ 固件与 Autopilot Autopilot 将压力保持在 45–55 bar 之间。可以通过将 `firmware7331.bin` 文件上传到 `/firmware/update` 并包含以下内容来切换它: ``` autopilot: on warnings: on ``` 管理员有一个指向更新页面的快捷方式。默认固件包含在 `firmware_uploads/` 中。 ## 🧑‍💻 漏洞利用脚本 在 `Exploit/` 文件夹中: * `exploit.py`:使用 Selenium 劫持浏览器,修改 cookie,并上传固件。 * `exploitv2.py`:使用 `urllib` 伪造 cookie,禁用 autopilot,并触发系统故障。 两者都演示了通过篡改 cookie 和固件带来的安全漏洞。 ## 🛑 免责声明 **本项目仅供教育使用。** 在实际应用中,切勿将 `pickle` 用于用户可控的数据。 ## 🧑 作者 由 **Jordi Serrano (@j0rd1s3rr4n0)** 创建 # HydroFlow Console (西班牙语) **HydroFlow Console** 是一个水力发电控制面板的教学模拟器。它模拟了带有涡轮机、闸门和天气条件的大坝物理行为。该应用程序包含一个基于 `pickle` 的故意设计的漏洞,旨在用于教育目的。 ## 🚀 安装 ``` pip install -r requirements.txt python app.py ``` 访问 `/login` 并输入用户名和密码(只有 `l.perez` 可以无密码进入)。然后打开 `/dashboard`。使用 `/logout` 注销。主页 (`/`) 显示欢迎信息和团队。 ## Docker (.tar) 构建并运行: ``` docker compose up --build ``` 导出镜像为 .tar: ``` docker build -t hydroflow:latest . docker save -o hydroflow-image.tar hydroflow:latest ``` 从 .tar 导入镜像: ``` docker load -i hydroflow-image.tar docker run --rm -p 8080:8080 hydroflow:latest ``` 从代码的 .tar (源码) 构建: ``` tar -xf hydroflow-src.tar -C /tmp/hydroflow cd /tmp/hydroflow docker build -t hydroflow:latest . ``` ## 🔐 认证 登录会生成一个 `session` cookie,其中包含一个带有用户名和角色(`viewer`、`engineer` 或 `admin`)的字典。该 cookie 使用 `pickle` 序列化并使用 base64 编码。进入 `/dashboard` 时,它会被解码并根据角色授予权限。 ## 🧪 Cookie 利用 由于 cookie 未经过签名或加密,因此可以被篡改。只需将其从 base64 解码,将 `role` 更改为 `admin`,重新编码并重新加载即可。 服务器通过以下方式对其进行反序列化: ``` pickle.loads(base64.b64decode(request.cookies.get("session"))) ``` 这在设计上是不安全的,甚至允许注入恶意对象。 ## ⚙️ 模拟与物理模型 启动时,所有闸门均关闭,涡轮机关闭。后台线程每 3 秒更新一次状态。 ### 常量与变量 * `NUM_GATES` = 5 * `MAX_LEVEL` = 250 m * `DAM_AREA` = 1000 m² * `WATER_DENSITY` = 1000 kg/m³ * `GRAVITY` = 9.81 m/s² * `RPM_MIN` = 2000, `RPM_WARN` = 4500, `RPM_MAX` = 5000 * `PRESSURE_MAX` = 100 bar * `POWER_MAX` = 200 MW ### 天气与流入量 每个循环生成随机天气: * 晴天 → 0.2 m³/s * 雨天 → 1.0 m³/s * 暴雨 → 2.7 m³/s + 60秒计时器 ### 水动力学 流量取决于打开的闸门数量: ``` flow = open_gates * 1.0 water_level += inflow - flow ``` 压力计算如下: ``` pressure = water_level * 1.12 ``` ### 涡轮机与功率 如果打开的闸门超过两个: ``` target_rpm = max(pressure * 8, RPM_MIN) ``` 每 1000 rpm 增加 1 °C。产生的功率: ``` P = ρ * g * Q * H / 1_000_000 ``` ### 故障条件 * **大坝坍塌**:压力 > 100 bar 或持续溢流 * **电力过载**:功率 > 200 MW 触发 500 错误并显示 `flag{electric_power}`。 ## 💻 界面 仪表板使用 Bootstrap 和 Chart.js 显示: * 水位 * 压力 * 流量 * RPM 与温度 * 产生的功率 管理员可以打开闸门并上传固件。天气信息包括湿度和风速。有一个包含用户和 logout 的头部导航栏。 ## ⚙️ 固件与 Autopilot Autopilot 将压力保持在 45 至 55 bar 之间。可以通过将 `firmware7331.bin` 文件上传到 `/firmware/update` 禁用它,内容如下: ``` autopilot: on warnings: on ``` 默认固件位于 `firmware_uploads/` 中。 ## 🧑‍💻 漏洞利用脚本 在 `Exploit/` 文件夹中: * `exploit.py`:使用 Selenium 修改 cookie 并上传固件。 * `exploitv2.py`:使用 `urllib` 提升权限并禁用 autopilot。 演示了如何在没有实际认证的情况下修改应用程序的逻辑。 ## ⚠️ 法律声明 **本项目仅供教育目的使用。** 请勿在真实应用程序中将 `pickle` 用于用户可控的数据。 ## 👤 作者 由 **Jordi Serrano (@j0rd1s3rr4n0)** 创建
标签:impacket, OPA, Python, Web安全, 后端开发, 安全教育, 工业互联网, 无后门, 蓝队分析, 请求拦截, 逆向工具, 靶场