對象存儲攻防案例

云上存儲己經是企業中常見的一款云上產品,伴隨著云上業務的發展,對象存儲作為云原生一項重要的能力,暴露出一系列的安全問題,其中的權限配置是管理人員不可忽視的,從攻擊者的視角來看幾大云存儲的攻擊方法與利用。

1 對象存儲

對象存儲中可以有多個桶(Bucket),然后把對象(Object)放在桶里,對象又包含了三個部分:Key、Data 和 Metadata。

1.1 Bucket

存儲空間(Bucket)是用戶用于存儲對象(Object)的容器,所有的對象都必須隸屬于某個存儲空間。存儲空間具有各種配置屬性,包括地域、訪問權限、存儲類型等。用戶可以根據實際需求,創建不同類型的存儲空間來存儲不同的數據。

  • 同一個存儲空間的內部是扁平的,沒有文件系統的目錄等概念,所有的對象都直接隸屬于其對應的存儲空間。
  • 每個用戶可以擁有多個存儲空間。
  • 存儲空間的名稱在 OSS 范圍內必須是全局唯一的,一旦創建之后無法修改名稱。
  • 存儲空間內部的對象數目沒有限制。

1.2 Object

對象(Object)是 OSS 存儲數據的基本單元,也被稱為 OSS 的文件。和傳統的文件系統不同,對象沒有文件目錄層級結構的關系。對象由元信息(Object Meta),用戶數據(Data)和文件名(Key)組成,并且由存儲空間內部唯一的 Key 來標識。

Key 是指存儲桶中的唯一標識符,例如一個 URL 為:https://geekby.oss-cn-beijing.aliyuncs.com/MarkDown/202203171716980.png,這里的 geekby 是存儲桶 Bucket 的名稱,/MarkDown/202203171716980.png 就是 Key。

對象元信息是一組鍵值對,表示了對象的一些屬性,比如最后修改時間、大小等信息,同時用戶也可以在元信息中存儲一些自定義的信息。可以簡單的理解成數據的標簽、描述之類的信息,這點不同于傳統的文件存儲,在傳統的文件存儲中這類信息是直接封裝在文件里的,有了元數據的存在,可以大大的加快對象的排序、分類和查找。

Data 就是存儲的數據本體。

2 對象存儲的利用方式

2.1 Object 遍歷

在創建 Bucket 時,可以選擇是否公開,默認是 private 的權限,如果在錯誤的配置下,給了 Listobject 權限,就會導致可遍歷存儲桶。

2.1.1 阿里云

在此時如果選擇公有讀的話,會出現兩種情況:

  • 在只配置讀寫權限設置為公有讀或公共讀寫的情況下,無法列出對象,但能夠直接讀取對應的文件(正常情況)
  • 如果想列出 Object 對象,需要在 Bucket 授權策略中設置 ListObject 即可

2.2 Bucket 桶爆破

當不知道 Bucket 名稱的時候,可以通過爆破獲得 Bucket 名稱,這有些類似于目錄爆破,只不過目錄爆破一般通過狀態碼判斷,而這個通過頁面的內容判斷。

2.2.1 阿里云

  • AccessDenied:存在存儲桶,但無權限訪問

  • InvalidBucketName:表示存儲桶的名稱不符合規范,屬于無效的存儲桶名稱

  • NoSuchBucket:表示不存在這個存儲桶

2.3 特定的 Bucket 策略配置

特定的策略配置的指的是,如果管理員設置了某些 IP,UA 才可以請求該存儲桶的話,此時如果錯誤的配置了 GetBucketPolicy,可導致攻擊者獲取策略配置

2.3.1 阿里云

通過直接訪問:http(s)://url/?policy 來確定是否對 Bucket 具有讀取權限

可以看到,管理員配置了對于任意認證主主體開放了所有 Action 的權限。

2.4 任意文件上傳與覆蓋

如果在配置存儲桶時,管理員錯誤的將存儲桶權限,配置為可寫,這將會導致攻擊者可上傳任意文件到存儲桶中,或覆蓋已經存在的文件

2.4.1 阿里云

如果目標的對象存儲支持 html 解析,那就可以利用任意文件上傳進行 XSS 釣魚、掛暗鏈、掛黑頁、供應鏈投毒等操作。

2.6 Bucket 接管

假設管理員通過域名解析并綁定了一個存儲桶,但是管理員將存儲桶刪除后,沒有將域名解析的 CNAME 刪除,這時會訪問域名就會出現 NoSuchBucket 。因此可以登錄自己的阿里云賬號,創建同樣的 Bucket 即可。

2.6.1 阿里云

在阿里云下,當 Bucket 顯示 NoSuchBucket 說明是可以接管的,如果顯示 AccessDenied 則不行。

2.7 Bucket 可修改

如果擁有 Bucket Policy 的編輯權限,可以通過上傳或修改一個新的配置,進而實現攻擊(拒絕服務或者修改訪問策略)

2.7.1 阿里云

可以通過直接 PUT 一個配置,達到攻擊的目的。

aliyun oss bucket-policy oss://securitytest-geekby --method put ./oss.json