시나리오 개요
In this scenario, you are presented with a signup and login page with AWS Cognito in the backend. You need to bypass restrictions and exploit misconfigurations in Amazon Cognito in order to elevate your privileges and get Cognito Identity Pool credentials.
AWS Cognito를 활용한 로그인 페이지, 제한을 우회하고 잘못설정된 Cognito를 Exploit해서 권한상승 후 Cognito Identity Pool Credential을 탈취하라
시나리오 목표
Cognito IdentityPool Credential을 획득
시나리오 세팅
./cloudgoat.py create vulnerable_cognito
solutions 디렉토리 내의 vulnerable_cognito 시나리오 제작 Terraform이 실행된다.
시나리오의 시작은 API Gateway의 URL로부터 시작된다.
Solution
1. 제공된 API Gateway URL에서 Cognito ClientID값을 획득
로그인과 회원가입 기능을 제공하는 Cognito임을 확인할 수 있다. 회원가입을 하려고 하면 email 검증에 막혀 특정 이메일 주소 이외에는 가입할 수 없이 막혀있는 것을 볼 수 있다.
페이지 소스를 확인하면 Cognito API를 사용하기 위해 작성한 javascript 구문을 발견할 수 있다.
해당 Script 내에 Cognito의 UserPoolID와 ClientID가 평문으로 작성되어 있다.
2. 획득한 ClientID를 바탕으로 CLI를 통해 임의의 이메일을 인증 (sign-up)
먼저 해당 페이지에 가입을 해야하기 때문에, 제한이 걸려있는 웹이 아닌 CLI를 이용해 가입을 진행한다.
aws cognito-idp sign-up --client-id [ClientID] \
--username [사용자이메일] --password [패스워드] --region us-east-1
ClientId를 획득했으므로 cognito-idp의 sign-up API를 통해 임의의 이메일로 가입할 수 있다.
3. 이메일로 전송된 인증코드를 통해 가입 인증 (confirm-sign-up)
API를 통해 가입을 진행하면 해당 이메일 주소로 confirm 코드가 담긴 메일이 발송된다.
4. 로그인 후 Access token 획득
웹을 통해 해당 계정으로 로그인 하면 다음과 같이 Reader 권한으로 접속된 것을 볼 수 있다.
LocalStorage를 확인하면 accessToken, idToken, refreshToken가 담겨있는 것을 볼 수 있다.
5. user 정보 가져오기
accessToken을 바탕으로 해당 계정의 user 정보를 가져와본다.
aws cognito-idp get-user --access-token [accessToken] --region us-east-1
user 정보를 보면 userAttribute에 custom:으로 시작하는 custom attribute가 존재하는 것을 볼 수 있다.
문제에서 권한 상승을 이야기했기에, 해당 부분을 변조해 보도록한다.
6. user attribute의 변조를 통해 계정 권한 상승
aws cognito-idp update-user-attributes --access-token [accessToken] --region us-east-1 \
--user-attributes '[{"Name": "custom:access", "Value": "admin"}]'
다시 user 정보를 확인하면 Attribute가 잘 업데이트 된 것을 볼 수 있다.
7. admin 레벨로 상승한 계정에서 key credential을 탐색
다시 웹에서 로그인하면 확실히 계정의 권한이 상승한 것을 확인할 수 있다.
다시 LocalStorage를 확인하면 몇 가지 항목이 더 생성된 것을 볼 수 있다. 이들 중 주요한 항목은 아래와 같다.
각 항목의 value값을 이용한다.
- idToken
- identityId
- accessToken
이 항목들을 바탕으로 최종적으로 Identity Pool Credential을 획득한다. (region 설정을 까먹지 말자)
aws cognito-identity get-credentials-for-identity --identity-id [identityId] \
--logins "cognito-idp.us-east-1.amazonaws.com/{UserPoolId}={idToken}" \
--region us-east-1
Identity Pool Credential을 획득하였다.
번외
획득하거나 주어진 Credential의 권한 체크를 위해 사용되는 툴이 존재한다.
AWS의 모든 API에 bruteforce 형식으로 동작을 체크하는 툴 정도로 보인다.