CVE-2022-43781 Bitbucket Server & Data Center 环境变量注入导致RCE
# 环境
下载7.6.17版本 https://www.atlassian.com/software/bitbucket/download-archives
调试 C:\Atlassian\Bitbucket\7.6.17\bin\_start-webapp.bat
|
|
# 分析
7.6.17和7.6.19 diff
这个地方将用户名放入env环境变量
补丁要求用户名不能有空白字符,典型。我们需要看这个空白字符在哪用到了,以及对我们漏洞利用起了什么作用。
在创建仓库的时候,会通过com.atlassian.stash.internal.scm.git.command.CreateCommand
调用git实现创建仓库。最终会执行到
com.atlassian.bitbucket.internal.process.nu.NuNioProcessHelper#run
|
|
DefaultNioProcessConfigurer更新TEMP环境变量
RemoteUserNioProcessConfigurer 更新用户名环境变量
然后com.atlassian.bitbucket.internal.process.nu.NuNioProcessHelper#createProcessBuilder
创建NuProcessBuilder实例来执行命令
接着调用NuProcessBuilder实例的run方法 com.zaxxer.nuprocess.NuProcessBuilder#run
|
|
在prepareEnvironment中,将this.environment从map转为string[]
|
|
并且map to string[],然后分平台继续运行命令com.zaxxer.nuprocess.windows.WindowsProcess#run
在prepareProcess中将刚才处理的string[]转为char[],交给NuKernel32.CreateProcessW 用windows api执行命令。
getEnvironment函数
getEnvironmentBlock()函数中
以\u0000
作为分界符
当开启用户注册时,注册一个用户名为test\0xx=xx
的用户,那么之前的REMOTE_USER会把用户名put进去,经过处理后会注入一个xx=xx
的环境变量。
那么思考,注入环境变量之后怎么rce?
二进制文件是git.exe
,在Git文档中环境变量部分,有GIT_EXTERNAL_DIFF,用这个可以执行自定义命令。
注册一个testa\00GIT_EXTERNAL_DIFF=$(cmd /c calc)
随便点个仓库看commit diff
弹计算器时,成功注入环境变量
但是执行命令用$(cmd /c calc)
会卡住,因为调用win的git sh执行的cmd命令是cmd C:/ calc
|
|
这个地方可以改命令为$(powershell calc)
就行了。具体利用需要自己变exp就行了。
搜了一下,发现这个空字节环境变量注入是com.zaxxer.nuprocess
库的问题。
https://github.com/brettwooldridge/NuProcess/security/advisories/GHSA-cxgf-v2p8-7ph7
在这个advisories中,提到了:
This vulnerability can only be exploited to inject command line arguments on Linux.
所以除了这个命令注入以外,还可以注入环境变量。
# 参考
文笔垃圾,措辞轻浮,内容浅显,操作生疏。不足之处欢迎大师傅们指点和纠正,感激不尽。
如果你觉得这篇文章对你有所帮助,欢迎赞赏或关注微信公众号~