通過錯誤配置的 AWS Cognito 接管 AWS 帳戶
環境背景
- 被測應用程序只有一個登錄頁面,沒有公開注冊功能
- 目標應用程序使用披露應用程序客戶端 ID、用戶池 ID、身份池 ID 和區域信息的 AWS Cognito JavaScript 開發工具包
- AWS cognito 配置錯誤以允許注冊新用戶
- 注冊并登錄以獲得經過身份驗證的身份的 AWS 臨時令牌
- AWS 令牌可以訪問用于提升訪問權限的 Lambda 函數
Amazon Cognito
Amazon Cognito 管理用戶身份驗證和授權 (RBAC)。用戶池允許登錄和注冊功能。身份池(聯合身份)允許經過身份驗證和未經身份驗證的用戶使用臨時憑證訪問 AWS 資源。
簡而言之,用戶池存儲所有用戶,身份池使這些用戶能夠訪問 AWS 服務。
下圖顯示了 AWS Cognito 身份驗證和授權流程。用戶通過用戶池進行身份驗證,成功身份驗證后,用戶池將 3 個 JWT 令牌(ID、Access 和 Refresh)分配給用戶。ID JWT 被傳遞到身份池,以便接收分配給身份提供者角色的臨時 AWS 憑證。

攻擊過程
在最近的一次滲透測試中,我們偶然發現了一個登錄頁面。它沒有暴露其他與身份驗證相關的功能,例如忘記密碼或注冊頁面。

經過進一步調查,我們發現該應用程序使用 AWS Cognito 通過 JavaScript 開發工具包進行身份驗證和授權。客戶端上的 JavaScript SDK 通過 JavaScript 配置文件公開了 App Client ID、User Pool ID、Identity Pool ID 和區域信息等數據。對于 AWS Cognito 的 JavaScript SDK需要此信息才能訪問 Cognito 用戶池并驗證用戶。
Amazon Cognito 具有經過身份驗證和未經身份驗證的模式來為用戶生成 AWS 臨時憑證。任何人都可以使用特定的 API 調用獲得未經身份驗證的訪問權限。因此,我們嘗試通過使用未經身份驗證的身份訪問 AWS 憑證,但對未經身份驗證的身份的訪問被禁用。

此處列出了將 AWS 服務暴露給未經身份驗證的身份領域的 一個有趣的案例研究:
我們發現該應用程序通過 AWS Cognito 錯誤配置無意中暴露了一些功能。使用 AppClientId,我們在 Amazon Cognito 用戶池中創建了一個用戶。確認電子郵件與確認代碼一起發送到指定的電子郵件。

測試后發現:我們可以使用 ConfirmSignUp API 從注冊電子郵件中收到的令牌確認用戶帳戶。

現在,當我們使用新注冊的帳戶登錄應用程序時,應用程序響應錯誤,“用戶不屬于任何組”。故該應用需要應用程序內授予的組權限才可以訪問。
我們意識到,該應用程序實際上驗證了一個新創建的用戶并返回了訪問令牌,但不允許該用戶訪問任何頁面,因為該用戶不屬于任何有權訪問該應用程序的組。

現在我們已經驗證了訪問權限和 ID 令牌。這些值可用于為經過身份驗證的身份生成臨時 AWS 憑證。

現在我們可以使用 AWS 命令行界面 (CLI) 與 AWS 服務進行交互:

使用“aws sts get-caller-identity”命令,可以確定令牌工作正常。

通過利用我們的云服務枚舉腳本,可以觀察到 AWS 令牌對 AWS Lambda 函數具有完全權限。這使我們能夠探索客戶端的 AWS Lambda 配置。我們首先查看 Lambda 函數列表:
aws lambda 列表函數

我們發現其中一個 Lambda 函數 (RotateAccessKeys-CIS) 的 IAM 策略過于寬松。
aws iam list-attached-role-policies --role-name IAM-CIS

我們決定修改 Lambda 函數代碼 (RotateAccessKeys-CIS),使其按要求工作,但另外執行了一個允許從環境變量讀取 AWS 憑證的命令。
我們從突出顯示的代碼位置下載了 Lambda 函數代碼。
aws lambda get-function --function-name RotateAccessKeys-CIS --query 'Code.Location'

下載代碼中的“lambda_handler”函數被修改為打印環境變量。

此外,我們創建了一個包含修改后代碼的 ZIP 文件,以便它在上傳和調用包后執行修改后的 Lambda 函數。

Lambda 函數“RotateAccessKeys-CIS”現已更新。
aws lambda update-function-code --function-name RotateAccessKeys-CIS --zip-file fileb:///root//lambda_function.zip

一旦 Lambda 函數代碼按預期更新,我們使用下面提到的命令調用它。此命令調用該函數并在包含 AWS 臨時憑證的屏幕上打印日志。
aws lambda invoke --function-name RotateAccessKeys-CIS out --log-type Tail --query 'LogResult' --output text | base64 -d

我們重復了相同的步驟,并確定了一組具有完全 IAM 訪問權限的臨時憑證。
接下來,我們使用新的 AWS 憑證配置 AWS CLI 以創建新用戶“nirahua”,并使用以下命令將名為 AdministratorAccess 的 AWS 托管策略附加到用戶。