-
[AWS] flAWS Challenge - Level6Infra/CloudSecurity 2023. 7. 18. 15:02
문제확인
=> 문제가 총 7개인줄 알았는데 마지막 문제이다(답지를 마지막에 보여주니까 6개가 맞긴했네.. ㅎㅎ) 어쨌든 이번 문제에서는 Credential을 주고 해당 user에는 SecurityAudit policy를 Attach 했다고 한다. 이 계정을 가지고 무엇을 발견할 수 있는지 찾으라는데 쉽지않다..ㄷㄷ
Credential 등록
aws configure --profile end
=> 우선 우리가 알고있는 Credential을 이용해서 aws cli를 활용해보자. 추가적으로 준 힌트는 SecurityAudit policy이니까 이를 기반으로 찾아보면 뭐라도 나올 것이다.
SecurityAudit Policy
=> SecurityAudit Policy에 대해 찾아보니 User가 Custom하게 만든 policy가 아닌 Amazon에서 관리하는 policy라고 한다. 즉, 이미 Amazon에서 만들어 놓은 정책이다. 관련해서 공식페이지에 이것저것 내용이 있는데 우선은 해당 계정에 이 policy말고 어떤 policy가 더 Attach 되어있는지 확인해보아야겠다는 생각이 들었다.
aws-cli을 통한 IAM 확인
aws --profile end iam get-user aws --profile end iam list-attached-user-policies --user-name Level6
=> iam user가 뭐가있는지 확인했고 찾은 Level6라는 user에 어떤 policy가 Attach 되어있는지 확인했고 MySecurityAudit과 list_apigateways라는 이름의 2가지 policy가 존재했다.
policy 내용 확인
aws --profile end iam get-policy --policy-arn arn:aws:iam::975426262029:policy/MySecurityAudit aws --profile end iam get-policy --policy-arn arn:aws:iam::975426262029:policy/list_apigateways
=> 여기서는 딱히 도움될만한 정보는 없었고 policy version과 이름에서 알 수 있는 직관적인 Description이 작성되어있었다.
특정 version의 IAM policy 확인
aws --profile end iam get-policy-version --policy-arn arn:aws:iam::975426262029:policy/list_apigateways --version-id v4 aws --profile end iam get-policy-version --policy-arn arn:aws:iam::975426262029:policy/MySecurityAudit --version-id v1
=> list_apigateways라는 policy가 arn:aws:apigetway:us-west-2::/restapis/*"라는 resource를 GET 할 수 있다는 내용의 사용자 지정 IAM policy였다는 것을 확인할 수 있었다. MySecurityAudit와 list_apigateways policy 모두 Resource ARN을 확인했을 때 사용자 관리형 policy인 것을 알 수 있었다(하지만 해설에서는 AWS policy라고 한다. 내생각은 아닌 거같은데 그냥 비슷하게 만들었다는 걸 그렇게 표현한건가..?? AWS console에서 직접 AWS managed policy인 SecurityAudit과 비교해봐도 완전히 똑같진 않았다...)
=> 어찌되었던 우선 비교적 짧은 정책 list_apigateways 내용인 arn:aws:apigetway:us-west-2::/restapis/*"라는 resource에 대해 GET을 호출 할 수 있다는 점을 이용해보기로 했다.
apigateway에서 REST API 호출에 필요한 값 구하기
aws --profile end apigateway get-rest-apis
=> API Gateway에서 REST API를 호출하기 위해서는 {restapi_id}, {region}, {stage_name} 값이 필요하다.. 하지만 현재 문제에서 제공해준 credential 권한으로는 apigateway의 get-rest-apis가 불가했다.
MySecurityAuidt을 통해 가능한 Action 확인
정책 모두보기는 아래 더보기 참고
더보기{ "PolicyVersion": { "Document": { "Version": "2012-10-17", "Statement": [ { "Action": [ "acm:Describe*", "acm:List*", "application-autoscaling:Describe*", "athena:List*", "autoscaling:Describe*", "batch:DescribeComputeEnvironments", "batch:DescribeJobDefinitions", "clouddirectory:ListDirectories", "cloudformation:DescribeStack*", "cloudformation:GetTemplate", "cloudformation:ListStack*", "cloudformation:GetStackPolicy", "cloudfront:Get*", "cloudfront:List*", "cloudhsm:ListHapgs", "cloudhsm:ListHsms", "cloudhsm:ListLunaClients", "cloudsearch:DescribeDomains", "cloudsearch:DescribeServiceAccessPolicies", "cloudtrail:DescribeTrails", "cloudtrail:GetEventSelectors", "cloudtrail:GetTrailStatus", "cloudtrail:ListTags", "cloudwatch:Describe*", "codebuild:ListProjects", "codedeploy:Batch*", "codedeploy:Get*", "codedeploy:List*", "codepipeline:ListPipelines", "codestar:Describe*", "codestar:List*", "cognito-identity:ListIdentityPools", "cognito-idp:ListUserPools", "cognito-sync:Describe*", "cognito-sync:List*", "datasync:Describe*", "datasync:List*", "dax:Describe*", "dax:ListTags", "directconnect:Describe*", "dms:Describe*", "dms:ListTagsForResource", "ds:DescribeDirectories", "dynamodb:DescribeContinuousBackups", "dynamodb:DescribeGlobalTable", "dynamodb:DescribeTable", "dynamodb:DescribeTimeToLive", "dynamodb:ListBackups", "dynamodb:ListGlobalTables", "dynamodb:ListStreams", "dynamodb:ListTables", "ec2:Describe*", "ecr:DescribeRepositories", "ecr:GetRepositoryPolicy", "ecs:Describe*", "ecs:List*", "eks:DescribeCluster", "eks:ListClusters", "elasticache:Describe*", "elasticbeanstalk:Describe*", "elasticfilesystem:DescribeFileSystems", "elasticloadbalancing:Describe*", "elasticmapreduce:Describe*", "elasticmapreduce:ListClusters", "elasticmapreduce:ListInstances", "es:Describe*", "es:ListDomainNames", "events:DescribeEventBus", "events:ListRules", "firehose:Describe*", "firehose:List*", "fsx:Describe*", "fsx:List*", "gamelift:ListBuilds", "gamelift:ListFleets", "glacier:DescribeVault", "glacier:GetVaultAccessPolicy", "glacier:ListVaults", "globalaccelerator:Describe*", "globalaccelerator:List*", "greengrass:List*", "guardduty:Get*", "guardduty:List*", "iam:GenerateCredentialReport", "iam:Get*", "iam:List*", "iam:SimulateCustomPolicy", "iam:SimulatePrincipalPolicy", "iot:Describe*", "iot:List*", "kinesis:DescribeStream", "kinesis:ListStreams", "kinesis:ListTagsForStream", "kinesisanalytics:ListApplications", "kms:Describe*", "kms:List*", "lambda:GetAccountSettings", "lambda:GetPolicy", "lambda:List*", "license-manager:List*", "logs:Describe*", "logs:ListTagsLogGroup", "machinelearning:DescribeMLModels", "mediaconnect:Describe*", "mediaconnect:List*", "mediastore:GetContainerPolicy", "mediastore:ListContainers", "opsworks-cm:DescribeServers", "organizations:List*", "quicksight:Describe*", "quicksight:List*", "ram:List*", "rds:Describe*", "rds:DownloadDBLogFilePortion", "rds:ListTagsForResource", "redshift:Describe*", "rekognition:Describe*", "rekognition:List*", "robomaker:Describe*", "robomaker:List*", "route53:Get*", "route53:List*", "route53domains:GetDomainDetail", "route53domains:GetOperationDetail", "route53domains:ListDomains", "route53domains:ListOperations", "route53domains:ListTagsForDomain", "route53resolver:List*", "s3:ListAllMyBuckets", "sagemaker:Describe*", "sagemaker:List*", "sdb:DomainMetadata", "sdb:ListDomains", "securityhub:Get*", "securityhub:List*", "serverlessrepo:GetApplicationPolicy", "serverlessrepo:List*", "sqs:GetQueueAttributes", "sqs:ListQueues", "ssm:Describe*", "ssm:ListDocuments", "storagegateway:List*", "tag:GetResources", "tag:GetTagKeys", "transfer:Describe*", "transfer:List*", "translate:List*", "trustedadvisor:Describe*", "waf:ListWebACLs", "waf-regional:ListWebACLs", "workspaces:Describe*" ], "Resource": "*", "Effect": "Allow" } ] }, "VersionId": "v1", "IsDefaultVersion": true, "CreateDate": "2019-03-03T16:42:45+00:00" } }
=> 바로 위에서 시도했던 내용에 대한 Action이 없어서 불가했다는 것을 알 수 있었으며 해당 정책을 확인하던 중 Lambda가 눈에 들어왔다. apigateway 호출에 관련되어서 혹시나 lamdba함수가 존재하진 않을까? 라는 생각이 들어 확인해보았다.
Lambda function 확인
aws --profile end lambda list-functions
=> python 2.7로 동작하는 Lambda 함수의 이름 Level6를 알 수 있었다.
Lambda 함수에 대한 IAM policy 확인
aws --profile end lambda get-policy --function-name Level6
=> Lambda 함수에 대한 IAM policy 확인을 통해 execute-api ARN을 알 수 있었고 execute-api ARN내의 "s33ppypa75"값이 바로 rest-api-id이므로 REST API호출에 필요한 rest-api-id를 얻을 수 있었다. 또한 리소스 경로가 "/level6" 이라는 것도
알 수 있었다.
stageName 구하기
aws --profile end apigateway get-stages --rest-api-id s33ppypa75
=> 마지막으로 rest-api-id를 가지고 Prod라는 Stage Name까지 구할 수 있었다.
AWS REST API 호출 URL 진행
https://s33ppypa75.execute-api.us-west-2.amazonaws.com/Prod/level6
=> region은 이미 알고있으므로 위해서 구한 rest-api-id와 stage name을 통해 REST API GET을 진행해보자!! 그랬더니?? 마지막 페이지에 대한 경로를 response해주었다
끝~ 난줄알았는데..
=> 일단 flAWS는 all clear어로 끝났다.. 엥? 하지만 flaws2가 있었자나~??? 다음 포스팅부터는 flaws2를 진행해보도록 하겠다!! 굉장히 재미있는 challenge인 것 같다.
반응형'Infra > CloudSecurity' 카테고리의 다른 글
[AWS] flAWS2 Challenge - Level2(Attacker) (0) 2023.07.19 [AWS] flAWS2 Challenge - Level1(Attacker) (0) 2023.07.19 [AWS] flAWS Challenge - Level5 (0) 2023.07.17 [AWS] flAWS Challenge - Level4 (0) 2023.07.16 [AWS] flAWS Challenge - Level3 (0) 2023.07.16 댓글