作者: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如何提升殺傷力的
如果只是在非預期的目錄寫一個文件的話并不能達成反制效果,因此有如下幾種方法可以參考使用(未經測試僅供參考):
- 對于類unix系統可以寫入crontab,增加定時任務,反彈shell回來
- 對于Windows系統可以寫入開始菜單啟動項,或者dll劫持
- 可以把攻擊工具的腳本給替換掉,下次執行就能上線
除此之外,可以通過發來的包的TTL值判斷操作系統(Windows默認是128,Linux是64或者255),實現更精準的反制
0x09展望
很顯然,這種手法不只適用于Git/Svn泄露的利用程序,什么DS_STORE,Java任意文件下載利用,估計都跑不了。
本文由 Seebug Paper 發布,如需轉載請注明來源。本文地址:http://www.bjnorthway.com/1662/
暫無評論