AWS - IAM & STS Unauthenticated Enum
Enumerate Roles & Usernames in an account
Assume Role Brute-Force
이 기술은 더 이상 작동하지 않습니다. 역할이 존재하든 존재하지 않든 항상 다음 오류가 발생합니다:
An error occurred (AccessDenied) when calling the AssumeRole operation: User: arn:aws:iam::947247140022:user/testenv is not authorized to perform: sts:AssumeRole on resource: arn:aws:iam::429217632764:role/account-balanceasdas
다음을 실행하여 테스트할 수 있습니다:
aws sts assume-role --role-arn arn:aws:iam::412345678909:role/superadmin --role-session-name s3-access-example
필요한 권한 없이 역할을 가정하려고 시도하면 AWS 오류 메시지가 트리거됩니다. 예를 들어, 권한이 없는 경우 AWS는 다음과 같이 반환할 수 있습니다:
이 메시지는 역할의 존재를 확인하지만 해당 가정 역할 정책이 귀하의 추정을 허용하지 않음을 나타냅니다. 반면, 존재하지 않는 역할을 가정하려고 시도하면 다른 오류가 발생합니다:
흥미로운 점은 기존 및 비기존 역할을 구별하는 방법이 다른 AWS 계정 간에도 적용될 수 있다는 것입니다. 유효한 AWS 계정 ID와 대상 워드리스트를 사용하면 내재적인 제한 없이 계정에 있는 역할을 나열할 수 있습니다.
이 스크립트를 사용하여 잠재적 주체를 나열하여 이 문제를 악용할 수 있습니다.
Trust Policies: Brute-Force Cross Account roles and users
IAM 역할의 신뢰 정책을 구성하거나 업데이트하는 것은 어떤 AWS 리소스나 서비스가 해당 역할을 가정하고 일시적 자격 증명을 획득할 수 있는지를 정의하는 것을 포함합니다. 정책에서 지정된 리소스가 존재하는 경우, 신뢰 정책이 성공적으로 저장됩니다. 그러나 리소스가 존재하지 않는 경우, 잘못된 주체가 제공되었다는 오류가 발생합니다.
해당 리소스에 교차 계정 역할 또는 사용자를 지정할 수 있습니다:
arn:aws:iam::acc_id:role/role_name
arn:aws:iam::acc_id:user/user_name
다음은 정책 예시입니다:
GUI
이것은 존재하지 않는 역할을 사용할 때 발생하는 오류입니다. 역할이 존재하는 경우 정책이 오류 없이 저장됩니다. (오류는 업데이트 시 발생하지만 생성 시에도 작동함)
CLI
이 프로세스를 https://github.com/carlospolop/aws_tools를 사용하여 자동화할 수 있습니다.
bash unauth_iam.sh -t user -i 316584767888 -r TestRole -w ./unauth_wordlist.txt
Pacu를 사용하는 경우:
run iam__enum_users --role-name admin --account-id 229736458923 --word-list /tmp/names.txt
run iam__enum_roles --role-name admin --account-id 229736458923 --word-list /tmp/names.txt
예제에서 사용된
admin
역할은 pacu에 의해 생성해야 하는 정책을 생성하기 위해 가장하려는 귀하의 계정의 역할입니다.
Privesc
역할이 잘못 구성되어 누구든지 그 역할을 가정할 수 있게 허용된 경우:
제3자 OIDC 연맹
공격자는 그냥 가정할 수 있습니다.
Github Actions workflow를 읽을 수 있는 경우를 상상해보십시오. 이 workflow는 AWS 내부의 role에 액세스하고 있습니다. 이 신뢰는 다음과 같은 trust policy가 있는 역할에 액세스할 수 있게 할 수 있습니다:
이 신뢰 정책은 올바를 수도 있지만 더 많은 조건의 부재로 인해 믿음을 가져서는 안 됩니다. 이전 역할은 Github Actions에서 누구나에 의해 가정될 수 있기 때문입니다! org 이름, repo 이름, env, branch와 같은 다른 사항들도 조건으로 명시해야 합니다...
또 다른 잠재적인 잘못된 구성은 다음과 같은 조건을 추가하는 것입니다:
콜론(:) 앞의 와일드카드(*)에 주목하세요. org_name1과 같은 조직을 생성하고 Github Action에서 롤을 가정할 수 있습니다.
참고 자료
最終更新