作者:DriverTom
原文鏈接:https://drivertom.blogspot.com/2021/08/git.html

0x00 關于本文

是的沒錯我又去蹂躪安全工具了,和以前我單個單個地欺負不同,這次發現的攻擊手段是通用的,可以通殺大部分源碼泄露漏洞利用程序。

本文會包含常見泄露漏洞的原理介紹(Git/Svn),利用工具自身的安全風險分析,簡單易懂的POC制作方式,針對常見工具的攻擊測試,以及提升反制威力的方法及展望。

0x01Git泄露:漏洞原理介紹

Git是什么大家應該都很清楚(不知道Git是啥的人多半是不肯來光臨這個博客的)

有些開發人員直接把代碼clone到服務器的web目錄來部署,但是開發人員或許不知道的是,clone下來的不只是代碼,還有一個.git目錄,這個目錄被叫做版本庫。攻擊者可以通過訪問這個目錄,解析其中的文件,dump整站源碼。

想要更深入地理解Git泄露漏洞,了解攻擊流程,就需要了解.git目錄的結構

tree一下這個目錄,發現內容如下

index文件中包含了這個項目中的各個文件的信息,包括文件路徑和Git對象的對應的40位哈希值。在這里我們不需要對Git對象理解的很深入,只需要知道里面包含了文件內容,是讓攻擊者垂涎欲滴的東西就可以了。

想要拿到Git對象,就需要轉去objects目錄。objects目錄存放了所有的git對象,對于一個git對象,40位哈希的前兩位會作為目錄名,而后面的38位會作為文件名,存在objects下面。舉個例子,一個Git對象那個的hash是cb75d8439f004f41d5f85ffa5f8d017df395651a,那么它就會被存在cb/75d8439f004f41d5f85ffa5f8d017df395651a。

知道了這些信息之后,就可以知道Git泄露攻擊是如何進行的了,首先攻擊者訪問index文件,解析后得到文件名和對象哈希。接著按著對象哈希一個一個去objects目錄獲取到Git對象,解析后得到文件。

0x02 Git泄露利用工具的安全風險

顯而易見的,手動解析index文件并去下載然后再去解析Git對象是一項煩人又重復的活,因此有大量的工具被開發出來解放黑客們的雙手。這些工具可以將整個攻擊流程自動化,自動下載項目的所有文件,并且重建整個項目的目錄結構。

但是在這個過程中存在一個嚴重的安全風險,這些工具在重建項目的目錄結構的時候,往往沒有考慮到路徑穿越風險,而是直接將目錄連接起來,因此通過創建惡意的git目錄可以在攻擊者的磁盤中寫入任意文件,實現遠程代碼執行!

0x03 簡單易懂的POC制作方式

直接用git工具制作POC是不可行的,它會提示文件在倉庫之外

好在有個叫做GitPython的庫不關心這個問題,因此可以用GitPython來生成POC。

首先在倉庫外的某個目錄放一個文件,該文件會寫入到攻擊者的電腦上的相同路徑。

接著打開python,用GitPython將其加入項目中然后commit,注意,要用../../../(很多個../)加上文件的絕對路徑的方式來加入。

在下圖生成的POC中,POC只是為了證明可以寫到非預期目錄,只加了一個../

在執行完了后,整個git項目的文件夾就成了蜜罐

0x04 對常見工具的測試

為了試驗該手段的通用性,使用常見工具對蜜罐進行測試,以文件是否成功寫入到非預定目錄為判斷標準。

一個成功的例子如圖,dumpall工具將tohacker.txt寫到了預期目錄192.168.208.190_None之外。

測試結果如下表所示

工具名稱 工具地址 攻擊是否成功
GitHack https://github.com/lijiejie/GitHack
GitHack https://github.com/BugScanTeam/GitHack
dumpall https://github.com/0xHJK/dumpall
GitHacker https://github.com/WangYihang/GitHacker
dvcs-ripper https://github.com/kost/dvcs-ripper
git-dumper https://github.com/arthaud/git-dumper

在測試的工具中,除了dvcs-ripper外全部攻擊成功(dvcs-ripper失敗原因還沒分析),證明了該反制手段的通用性

0x05 Svn泄露原理

Svn和Git類似,也是一種版本管理工具。 有些開發人員在部署的時候偷懶,沒有通過”export“的方式將代碼導出,而是直接拷貝目錄,導致下面的.svn文件夾也被拷貝了。(嗯,和Git泄露如出一轍啊) 和Git不同,Svn的泄露有兩種可能的情況。 當Svn版本小于1.6的情況下(也有說1.7的,沒試),.svn文件夾中的entries會以明文存儲目錄和文件信息。其中包含了文件名,這個時候訪問/.svn/text-base/文件名-.svn-base就可以拿到文件。
當Svn版本更高的情況下,.svn文件夾中的entries不會包含目錄和文件信息,攻擊者首先需要訪問/.svn/wc.db文件,這個文件是個sqlite3數據庫,其中的Node表中包含了文件的信息,包括文件名和哈希等。在獲取到這些信息后,訪問/.svn/pristine/哈希的前兩位/哈希.svn-base即可訪問到文件。舉個例子,有一個文件對應的哈希是a94a8fe5ccb19ba61c4c0873d391e982fbbd3, 那其路徑為/.svn/pristine/a9/a94a8fe5ccb19ba61c4c0873d391e987982fbbd3.svn-base。

0x06 簡單易懂的POC制作方式

針對低版本的Svn,我抄襲了 高版本的Svn有些復雜,于是我找了個網站來生成Svn項目,并用TortoiseSVN添加文件再checkout到目錄中,這個時候就可以看到.svn目錄了。接著再用SQLite編輯工具編輯目錄中的wc.db中的Node表,更改文件目錄為惡意路徑。最后再如法炮制放置文件即可

0x07 對常見工具的測試

測試的方式和標準與測試Git泄露利用工具的標準一致,但是優先測試低版本的泄露,如果低版本的泄露無效再測試高版本的(人都是懶惰的),測試結果如下表所示

工具名稱 工具地址 攻擊是否成功
svnExploit https://github.com/admintony/svnExploit
SvnHack https://github.com/callmefeifei/SvnHack/ 是(必須放在根目錄)
Seay-Svn https://github.com/Introspelliam/tools/
dumpall https://github.com/0xHJK/dumpall 是(只支持高版本)
svn-extractor https://github.com/anantshri/svn-extractor 是 (只支持高版本)
dvcs-ripper https://github.com/kost/dvcs-ripper 否(跑不起來且不想跑,perl寫的東西沒一個用著省心的)

在測試的工具中,除了dvcs-ripper外全部攻擊成功(這玩意跑都跑不起來),證明了該反制手段的通用性

0x08如何提升殺傷力的

如果只是在非預期的目錄寫一個文件的話并不能達成反制效果,因此有如下幾種方法可以參考使用(未經測試僅供參考):

  1. 對于類unix系統可以寫入crontab,增加定時任務,反彈shell回來
  2. 對于Windows系統可以寫入開始菜單啟動項,或者dll劫持
  3. 可以把攻擊工具的腳本給替換掉,下次執行就能上線

除此之外,可以通過發來的包的TTL值判斷操作系統(Windows默認是128,Linux是64或者255),實現更精準的反制

0x09展望

很顯然,這種手法不只適用于Git/Svn泄露的利用程序,什么DS_STORE,Java任意文件下載利用,估計都跑不了。


Paper 本文由 Seebug Paper 發布,如需轉載請注明來源。本文地址:http://www.bjnorthway.com/1662/