针对某堡垒机漏洞分析(一)
字数 1041 2025-08-06 18:07:37

开源堡垒机登录绕过漏洞分析与复现

漏洞概述

本文档详细分析了一个开源堡垒机系统中存在的登录绕过漏洞。该漏洞允许攻击者在无需提供正确密码的情况下,通过构造特定的请求绕过身份验证机制,直接获取系统访问权限。开发商已发布补丁修复此漏洞。

环境搭建

1. 源码下载

  • 从官方渠道下载受影响版本的源码
  • 注意选择特定版本的安装包

2. 虚拟机搭建步骤

# 解压安装包
tar -zxvf xxx.tar.gz

# 进入解压目录
cd xxx

# 执行安装脚本(需要管理权限)
sudo ./setup.sh

安装注意事项:

  • 安装路径默认为/usr/local/teleport(直接回车使用默认路径)
  • 可自定义安装路径,但路径中不能包含:
    • 中文字符
    • 空格

3. 访问WEB界面

安装完成后,通过以下URL访问WEB管理界面:

http://[IP地址]:7190

源码分析

关键目录结构

漏洞相关源码位于:

xxx/data/www/teleport/webroot/app

路由分析

  1. 首先查看框架的路由文件,确定登录处理流程
  2. 重点关注登录处理类DoLoginHandler(TPBaseJsonHandler)

登录机制分析

系统提供四种登录方式,本次分析关注:

TP_LOGIN_AUTH_USERNAME_PASSWORD_CAPTHA

登录参数要求

登录请求需要以JSON形式POST提交以下参数:

  • type
  • captcha
  • username
  • password
  • remember

关键代码流程

  1. 登录验证通过user.login()方法进行:
err, user_info, msg = user.login(self, username, login_type=login_type, password=password, oath_code=oath)
  1. 验证逻辑分析:
  • 首先获取username并从数据库查询对应记录
  • 比对用户输入与数据库记录
  • 关键漏洞点在于if password is not None:条件判断
  • 当password为null时可以跳过密码验证逻辑
  1. 用户信息处理:
if len(user_info['surname']) == 0:
    user_info['surname'] = user_info['username']
return TPE_OK, user_info, msg

漏洞原理

  • 攻击者可构造不包含有效password的请求
  • 系统在password为null时会跳过密码验证
  • 仅验证username是否存在后即返回成功
  • 成功绕过后系统会为会话赋予登录状态:
self._user = user_info
self._user['_is_login'] = True

漏洞验证

构造Payload

{
    "type": 2,
    "username": "admin",
    "password": null,
    "captcha": "xxxx",
    "oath": "",
    "remember": false
}

验证结果

  • 返回code为0表示成功绕过
  • 刷新首页即可进入后台管理界面

漏洞总结

漏洞关键点

  1. 密码验证存在逻辑缺陷,password为null时可绕过
  2. 系统仅验证username存在性即认为认证成功
  3. 会话管理在验证通过后直接赋予登录状态

审计经验

  1. Python源码审计应从路由入手,理清请求处理流程
  2. 重点关注认证相关的条件判断逻辑
  3. 注意参数为null时的处理情况
  4. 该漏洞难度不大,仔细审计即可发现

修复建议

  1. 强制要求password参数不能为null
  2. 增加完整的认证检查流程
  3. 更新到开发商发布的最新补丁版本

附录

相关代码片段

# 登录验证关键代码
err, user_info, msg = user.login(self, username, login_type=login_type, password=password, oath_code=oath)
if err != TPE_OK:
    if err == TPE_NOT_EXISTS:
        err = TPE_USER_AUTH
        msg = '用户名或密码错误'
        syslog.sys_log({'username': '???', 'surname': '???'}, self.request.remote_ip, TPE_NOT_EXISTS, '登录失败,用户`{}`不存在'.format(username))
    return self.write_json(err, msg)

self._user = user_info
self._user['_is_login'] = True

参考信息

  • 漏洞发布日期:2022-09-07
  • 影响版本:特定版本的开源堡垒机
  • 漏洞类型:认证绕过
开源堡垒机登录绕过漏洞分析与复现 漏洞概述 本文档详细分析了一个开源堡垒机系统中存在的登录绕过漏洞。该漏洞允许攻击者在无需提供正确密码的情况下,通过构造特定的请求绕过身份验证机制,直接获取系统访问权限。开发商已发布补丁修复此漏洞。 环境搭建 1. 源码下载 从官方渠道下载受影响版本的源码 注意选择特定版本的安装包 2. 虚拟机搭建步骤 安装注意事项: 安装路径默认为 /usr/local/teleport (直接回车使用默认路径) 可自定义安装路径,但路径中不能包含: 中文字符 空格 3. 访问WEB界面 安装完成后,通过以下URL访问WEB管理界面: 源码分析 关键目录结构 漏洞相关源码位于: 路由分析 首先查看框架的路由文件,确定登录处理流程 重点关注登录处理类 DoLoginHandler(TPBaseJsonHandler) 登录机制分析 系统提供四种登录方式,本次分析关注: 登录参数要求 登录请求需要以JSON形式POST提交以下参数: type captcha username password remember 关键代码流程 登录验证通过 user.login() 方法进行: 验证逻辑分析: 首先获取username并从数据库查询对应记录 比对用户输入与数据库记录 关键漏洞点在于 if password is not None: 条件判断 当password为null时可以跳过密码验证逻辑 用户信息处理: 漏洞原理 攻击者可构造不包含有效password的请求 系统在password为null时会跳过密码验证 仅验证username是否存在后即返回成功 成功绕过后系统会为会话赋予登录状态: 漏洞验证 构造Payload 验证结果 返回code为0表示成功绕过 刷新首页即可进入后台管理界面 漏洞总结 漏洞关键点 密码验证存在逻辑缺陷,password为null时可绕过 系统仅验证username存在性即认为认证成功 会话管理在验证通过后直接赋予登录状态 审计经验 Python源码审计应从路由入手,理清请求处理流程 重点关注认证相关的条件判断逻辑 注意参数为null时的处理情况 该漏洞难度不大,仔细审计即可发现 修复建议 强制要求password参数不能为null 增加完整的认证检查流程 更新到开发商发布的最新补丁版本 附录 相关代码片段 参考信息 漏洞发布日期:2022-09-07 影响版本:特定版本的开源堡垒机 漏洞类型:认证绕过