[AWS] flAWS Challenge - Level6
flAWS - Level 6
_____ _ ____ __ __ _____ | || | / || |__| |/ ___/ | __|| | | o || | | ( \_ | |_ | |___ | || | | |\__ | | _] | || _ || ` ' |/ \ | | | | || | | \ / \ | |__| |_____||__|__| \_/\_/ \___| flAWS - Level 6 Lesson learned The IP address 169.254.169.254 is a magic
level6-cc4c404a8a8b876167f5e70a7d8c9880.flaws.cloud
문제확인
=> 문제가 총 7개인줄 알았는데 마지막 문제이다(답지를 마지막에 보여주니까 6개가 맞긴했네.. ㅎㅎ) 어쨌든 이번 문제에서는 Credential을 주고 해당 user에는 SecurityAudit policy를 Attach 했다고 한다. 이 계정을 가지고 무엇을 발견할 수 있는지 찾으라는데 쉽지않다..ㄷㄷ
Credential 등록
aws configure --profile end
=> 우선 우리가 알고있는 Credential을 이용해서 aws cli를 활용해보자. 추가적으로 준 힌트는 SecurityAudit policy이니까 이를 기반으로 찾아보면 뭐라도 나올 것이다.
SecurityAudit Policy
SecurityAudit - AWS Managed Policy
SecurityAudit SecurityAudit is an AWS managed policy that: The security audit template grants access to read security configuration metadata. It is useful for software that audits the configuration of an AWS account. Using this policy You can attach Securi
docs.aws.amazon.com
=> SecurityAudit Policy에 대해 찾아보니 User가 Custom하게 만든 policy가 아닌 Amazon에서 관리하는 policy라고 한다. 즉, 이미 Amazon에서 만들어 놓은 정책이다. 관련해서 공식페이지에 이것저것 내용이 있는데 우선은 해당 계정에 이 policy말고 어떤 policy가 더 Attach 되어있는지 확인해보아야겠다는 생각이 들었다.
aws-cli을 통한 IAM 확인
iam — AWS CLI 1.29.4 Command Reference
Description Identity and Access Management (IAM) is a web service for securely controlling access to Amazon Web Services services. With IAM, you can centrally manage users, security credentials such as access keys, and permissions that control which Amazon
docs.aws.amazon.com
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 호출에 필요한 값 구하기
Amazon API Gateway에서 REST API 호출 - Amazon API Gateway
이 페이지에 작업이 필요하다는 점을 알려 주셔서 감사합니다. 실망시켜 드려 죄송합니다. 잠깐 시간을 내어 설명서를 향상시킬 수 있는 방법에 대해 말씀해 주십시오.
docs.aws.amazon.com
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"
}
}
lambda — AWS CLI 1.29.5 Command Reference
Note: You are viewing the documentation for an older major version of the AWS CLI (version 1). AWS CLI version 2, the latest major version of AWS CLI, is now stable and recommended for general use. To view this page for the AWS CLI version 2, click here. F
docs.aws.amazon.com
=> 바로 위에서 시도했던 내용에 대한 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 - The End
_____ _ ____ __ __ _____ | || | / || |__| |/ ___/ | __|| | | o || | | ( \_ | |_ | |___ | || | | |\__ | | _] | || _ || ` ' |/ \ | | | | || | | \ / \ | |__| |_____||__|__| \_/\_/ \___| flAWS - The End Lesson learned It is common to give people and entities r
theend-797237e8ada164bf9f12cebf93b282cf.flaws.cloud
=> 일단 flAWS는 all clear어로 끝났다.. 엥? 하지만 flaws2가 있었자나~??? 다음 포스팅부터는 flaws2를 진행해보도록 하겠다!! 굉장히 재미있는 challenge인 것 같다.