GitStack <= 2.3.10 远程命令执行漏洞分析-【CVE-2018-5955】
GitStack
GitStack是一款win平台下的Git可视化平台。其最新版本2.3.10存在一个远程命令执行漏洞(CVE-2018-5955),对应下载地址: https://gitstack.com/download/ 。
安装完成后,登陆入口在 http://192.168.248.130/registration/login/?next=/gitstack/ 。默认用户名/密码分别为: admin/admin
漏洞分析
一些“小”漏洞
views.py
中的问题太多了,为后续的命令执行利用,这里仅列一些。目测开发者在开发的时候想这些接口开放着也没关系。。
用户相关rest_user
首先在app/rest/views.py
中定义了rest_user
方法:
在默认情况下:
使用GET方式可以直接查看GitStack仓库的用户列表,存在未授权访问信息泄露漏洞
通过POST方法,指定username和password可以直接添加仓库用户,存在任意用户添加漏洞:
通过PUT方法,以JSON格式即可重置任意用户密码:
project相关
任意创建repo
|
|
直接POST一个name即可创建对应的project,不过在POST的时候需要带上CSRF_TOKEN
CSRF_TOKEN的获得如下,访问登陆页面,比如 http://192.168.248.130/registration/login/?next=/gitstack/ ,查看源代码:
任意repo添加user
|
|
按照下面这个格式即可添加:
远程命令执行漏洞
默认情况下GitStack的Web Interface
接口时开启的。访问http://xx/web/index.php
也即访问gitphp
目录下的index.php.
第 153 行进行了认证操作:
GitPHP_Authentication
定义在gitphp/include/Authentication.class.php
中:
当访问index.php
时指定了参数p,也即project_name
,会通过$this->readRepositoryReadUsers()
将该project对应的user提取出来。倘若该project并非公开,即everyone
并不在$users
中,则进入authenticated
阶段。
可以看到,在这部分的认证中,采用了HTTP Basic Authentication
的方式
根据php手册,当PHP以Apache模块方式运行时可以用 header()函数来向客户端浏览器发送认证请求信息。而当用户输入用户名和密码后,包含有URL的PHP脚本将会把变量PHP_AUTH_USER
,PHP_AUTH_PW
和AUTH_TYPE
分别被设定为用户名,密码和认证类型。也就是说,这里的username
与password
即我们可控,且未加以过滤的变量:
在确认输入的用户名($username
)在project的用户列表后,开始进行真正的认证操作。首先是获取认证类型$authMethod = $this->getAuthMethod();
:
gitstacksettings
的默认值在data/settings.ini
中设定,其中:
也即在默认情况下采用的是file
方式的认证方法,程序流程进入:
此处的流程就是将project的用户信息从/data/passwdfile
读出,经过一定的处理,然后通过openssl来进行响应的验证。注意这里的代码:
我们传入的$password
直接拼接到了语句中,然后exec执行,这里即存在命令执行漏洞,且由于并不需要认证成功。
Exploit
不过这里的任意命令执行漏洞有一些限制,它需要在进行HTTP Basic Authentication
时在用户名处填入project的用户列表中的某一个,然后通过在密码处注入payload,才能到达exec
处。因此结合前面第一部分的未授权访问/任意添加用户等等漏洞,可以梳理如下两种方法:
通过
GET /rest/user
获取到所有的用户列表,然后直接进行爆破,总有某些用户是属于选择的project的用户列表中的。脚本如下:通过
POST /rest/user
添加用户x,接着创建repo,将用户x加入到repo中,然后基于用户x的认证来进行rce。第二种方法的脚本见 https://blogs.securiteam.com/index.php/archives/3557 ,不搬运了。