前言
前端时间在某社区看到有师傅发了,我就整理了一下,因为之前看过这套堡垒机的pythonweb,并把目前网上公开的漏洞分析了下,做个记录~~~
水平太cai,请大伙批评指正~~~
分析
- 环境搭建(3.5.6-rc6版本)在官网下载安装包,tar命令解压,进入目录,以管理员身份运行./setup.sh即可(直接enter选择默认路径)。
访问主机7190端口:
搭建环境遇到的问题:用的是centos7虚拟机搭建,遇到ping到主机却telnet不到7190端口的问题,查询资料后关闭centos7防火墙即可。
- 漏洞分析
- 逻辑缺陷看webroot:
python的应用没怎么看过,不过应该是大同小异,路由结构在app/controller/__init__.py:看登录认证相关:
转到app.controller.auth.DoLoginHandler:
通过app.model.user.login判断返回信息,这里将username、password和oath参数带入,跟进app.model.user.login:
然后password判断(代码太长,没有展开):
逻辑缺陷在于,在用户密码password为空时,没有对应的控制逻辑,导致登录绕过。
正常请求的json为:
{"type":2,"username":"admin","password":"admin","captcha":"xcj9","oath":"","remember":false}
那么将password变为null,即可绕过:
{"type":2,"username":"admin","password":null,"captcha":"xcj9","oath":"","remember":false}
- 任意文件读取(后台)在app.controller.audit.DoGetFileHandler中,对应路由为:
通过f参数获取filename信息:
跟踪filename:
filename直接就拼接到file,然后open:
但要满足下列条件:
if act is None or _type is None or rid is None or filename is None: self.set_status(400) # 400=错误请求 return self.write('invalid param, `rid` and `f` must present.') if act not in ['size', 'read']: self.set_status(400) return self.write('invalid param, `act` should be `size` or `read`.') if _type not in ['rdp', 'ssh', 'telnet']: self.set_status(400) return self.write('invalid param, `type` should be `rdp`, `ssh` or `telnet`.')
- 逻辑缺陷看webroot: