0x00:简介
GateOne 是一款使用 HTML5 技术编写的网页版 SSH 终端模拟器。基于现代的 HTML5 技术,无需任何浏览器插件、支持多个 SSH 进程、可以嵌入到其他任意应用程序中、支持使用 JavaScript,Python 甚至纯 CSS 编写的插件、支持 SSH 进程副本,打开多个进程而无需重复输入密码、 支持各种服务器端的日志功能,支持 Keberos-based 单点登录甚至活动目录、 支持操作日志记录,具有操作记录回放功能。
0x01:分析
查看文件gateone / core / server.py在第3692行中,您可以找到设置处理程序的位置。
可以看到downloads /没有使用Tornado附带的StaticFileHandler,但是使用的是作者本人编写的方法,该方法可能存在漏洞。
可以在第924行找到get方法的定义:
代码语言:javascript复制def get(self, path, include_body=True):
session_dir = self.settings['session_dir']
user = self.current_user
if user and 'session' in user:
session = user['session']
else:
logger.error(_("DownloadHandler: Could not determine use session"))
return # Something is wrong
filepath = os.path.join(session_dir, session, 'downloads', path)
abspath = os.path.abspath(filepath)
if not os.path.exists(abspath):
self.set_status(404)
self.write(self.get_error_html(404))
return
if not os.path.isfile(abspath):
raise tornado.web.HTTPError(403, "%s is not a file", path)
注意关键部分。可以看到该路径被拼写为文件路径,而没有任何过滤。有目录遍历,并且可以读取任何文件。
0x02:复现
使用官方docker镜像构建测试环境。
1、拉取docker镜像
代码语言:javascript复制docker pull liftoff/gateone
2、运行docker
代码语言:javascript复制#Command
docker run [-d/-t] -p [443]:8000 -h [hostname] --name gateone liftoff/gateone gateone
#For example, if 443 is occupied on the server, please use another unused port.
docker run -t -p 443:48620 -h Rats --name gateone liftoff/gateone gateone
代码语言:javascript复制安装后,请访问https:// ip:port.如果浏览器可能报告它不安全,请忽略它。
注:仅做本地环境测试,切勿外部测试。违者后果自负。
文章来源:
代码语言:javascript复制https://github.com/liftoff/GateOne/issues/747