AWS - IAM & STS Unauthenticated Enum

htARTE (HackTricks AWS Red Team 전문가)를 통해 AWS 해킹을 처음부터 전문가까지 배우세요!

HackTricks를 지원하는 다른 방법:

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는 다음과 같이 반환할 수 있습니다:

An error occurred (AccessDenied) when calling the AssumeRole operation: User: arn:aws:iam::012345678901:user/MyUser is not authorized to perform: sts:AssumeRole on resource: arn:aws:iam::111111111111:role/aws-service-role/rds.amazonaws.com/AWSServiceRoleForRDS

이 메시지는 역할의 존재를 확인하지만 해당 가정 역할 정책이 귀하의 추정을 허용하지 않음을 나타냅니다. 반면, 존재하지 않는 역할을 가정하려고 시도하면 다른 오류가 발생합니다:

An error occurred (AccessDenied) when calling the AssumeRole operation: Not authorized to perform sts:AssumeRole

흥미로운 점은 기존 및 비기존 역할을 구별하는 방법이 다른 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

다음은 정책 예시입니다:

{
"Version":"2012-10-17",
"Statement":[
{
"Effect":"Allow",
"Principal":
{
"AWS":"arn:aws:iam::216825089941:role\/Test"
},
"Action":"sts:AssumeRole"
}
]
}

GUI

이것은 존재하지 않는 역할을 사용할 때 발생하는 오류입니다. 역할이 존재하는 경우 정책이 오류 없이 저장됩니다. (오류는 업데이트 시 발생하지만 생성 시에도 작동함)

CLI

### You could also use: aws iam update-assume-role-policy
# When it works
aws iam create-role --role-name Test-Role --assume-role-policy-document file://a.json
{
"Role": {
"Path": "/",
"RoleName": "Test-Role",
"RoleId": "AROA5ZDCUJS3DVEIYOB73",
"Arn": "arn:aws:iam::947247140022:role/Test-Role",
"CreateDate": "2022-05-03T20:50:04Z",
"AssumeRolePolicyDocument": {
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::316584767888:role/account-balance"
},
"Action": [
"sts:AssumeRole"
]
}
]
}
}
}

# When it doesn't work
aws iam create-role --role-name Test-Role2 --assume-role-policy-document file://a.json
An error occurred (MalformedPolicyDocument) when calling the CreateRole operation: Invalid principal in policy: "AWS":"arn:aws:iam::316584767888:role/account-balanceefd23f2"

이 프로세스를 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

역할이 잘못 구성되어 누구든지 그 역할을 가정할 수 있게 허용된 경우:

{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "*"
},
"Action": "sts:AssumeRole"
}
]
}

제3자 OIDC 연맹

공격자는 그냥 가정할 수 있습니다.

Github Actions workflow를 읽을 수 있는 경우를 상상해보십시오. 이 workflow는 AWS 내부의 role에 액세스하고 있습니다. 이 신뢰는 다음과 같은 trust policy가 있는 역할에 액세스할 수 있게 할 수 있습니다:

{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Federated": "arn:aws:iam::<acc_id>:oidc-provider/token.actions.githubusercontent.com"
},
"Action": "sts:AssumeRoleWithWebIdentity",
"Condition": {
"StringEquals": {
"token.actions.githubusercontent.com:aud": "sts.amazonaws.com"
}
}
}
]
}

이 신뢰 정책은 올바를 수도 있지만 더 많은 조건의 부재로 인해 믿음을 가져서는 안 됩니다. 이전 역할은 Github Actions에서 누구나에 의해 가정될 수 있기 때문입니다! org 이름, repo 이름, env, branch와 같은 다른 사항들도 조건으로 명시해야 합니다...

또 다른 잠재적인 잘못된 구성은 다음과 같은 조건을 추가하는 것입니다:

"StringLike": {
"token.actions.githubusercontent.com:sub": "repo:org_name*:*"
}

콜론(:) 앞의 와일드카드(*)에 주목하세요. org_name1과 같은 조직을 생성하고 Github Action에서 롤을 가정할 수 있습니다.

참고 자료

htARTE (HackTricks AWS Red Team Expert)로부터 제로에서 히어로까지 AWS 해킹 배우기 htARTE (HackTricks AWS Red Team Expert)!

HackTricks를 지원하는 다른 방법:

最終更新