AWS - S3, Athena & Glacier Enum
Tip
सीखें और अभ्यास करें AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
सीखें और अभ्यास करें GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
सीखें और अभ्यास करें Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks का समर्थन करें
- देखें subscription plans!
- शामिल हों 💬 Discord group या telegram group या हमें फ़ॉलो करें Twitter 🐦 @hacktricks_live.
- PRs सबमिट करके hacking tricks साझा करें HackTricks और HackTricks Cloud github repos.
S3
Amazon S3 एक सेवा है जो आपको बड़े मात्रा में डेटा स्टोर करने की अनुमति देती है।
Amazon S3 डेटा को REST पर सुरक्षा प्रदान करने के लिए कई विकल्प देता है। विकल्पों में Permission (Policy), Encryption (Client and Server Side), Bucket Versioning और MFA based delete शामिल हैं। user इनमें से किसी भी विकल्प को सक्षम करके डेटा सुरक्षा प्राप्त कर सकता है। Data replication AWS की एक आंतरिक सुविधा है जहाँ S3 automatically replicates each object across all the Availability Zones और इस मामले में organization को इसे सक्षम करने की आवश्यकता नहीं होती।
With resource-based permissions, आप अपने bucket के sub-directories के लिए permissions अलग से परिभाषित कर सकते हैं।
Bucket Versioning and MFA based delete
जब bucket versioning सक्षम होता है, तो किसी भी कार्रवाई जो फ़ाइल को बदलने की कोशिश करती है, फ़ाइल का एक नया version बनाएगी, साथ ही उसी की पिछली सामग्री भी रखेगी। इसलिए यह उसकी सामग्री overwrite नहीं करेगा।
Moreover, MFA based delete S3 bucket में फ़ाइलों के versions को delete होने से रोकेगा और साथ ही Bucket Versioning को disable होने से भी। इसलिए एक attacker इन फ़ाइलों को alter नहीं कर पाएगा।
S3 Access logs
यह संभव है कि किसी bucket के लिए S3 access login को सक्षम किया जाए (जो डिफ़ॉल्ट रूप से disabled होता है) और logs को किसी दूसरे bucket में save किया जाए ताकि पता चल सके कि कौन bucket को access कर रहा है (दोनों buckets एक ही region में होने चाहिए)।
S3 Presigned URLs
यह संभव है कि एक presigned URL generate किया जाए जिसे आमतौर पर bucket में निर्दिष्ट फ़ाइल तक access the specified file करने के लिए उपयोग किया जा सके। A presigned URL looks like this:
https://<bucket-name>.s3.us-east-1.amazonaws.com/asd.txt?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=ASIAUUE8GZC4S5L3TY3P%2F20230227%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20230227T142551Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Security-Token=IQoJb3JpZ2luX2VjELf%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FwEaCXVzLWVhc3QtMSJHMEUCIBhQpdETJO3HKKDk2hjNIrPWwBE8gZaQccZFV3kCpPCWAiEAid3ueDtFFU%2FOQfUpvxYTGO%2BHoS4SWDMUrQAE0pIaB40qggMIYBAAGgwzMTgxNDIxMzg1NTMiDJLI5t7gr2EGxG1Y5CrfAioW0foHIQ074y4gvk0c%2B%2Fmqc7cNWb1njQslQkeePHkseJ3owzc%2FCwkgE0EuZTd4mw0aJciA2XIbJRCLPWTb%2FCBKPnIMJ5aBzIiA2ltsiUNQTTUxYmEgXZoJ6rFYgcodnmWW0Et4Xw59UlHnCDB2bLImxPprriyCzDDCD6nLyp3J8pFF1S8h3ZTJE7XguA8joMs4%2B2B1%2FeOZfuxXKyXPYSKQOOSbQiHUQc%2BFnOfwxleRL16prWk1t7TamvHR%2Bt3UgMn5QWzB3p8FgWwpJ6GjHLkYMJZ379tkimL1tJ7o%2BIod%2FMYrS7LDCifP9d%2FuYOhKWGhaakPuJKJh9fl%2B0vGl7kmApXigROxEWon6ms75laXebltsWwKcKuYca%2BUWu4jVJx%2BWUfI4ofoaGiCSaKALTqwu4QNBRT%2BMoK6h%2BQa7gN7JFGg322lkxRY53x27WMbUE4unn5EmI54T4dWt1%2Bg8ljDS%2BvKfBjqmAWRwuqyfwXa5YC3xxttOr3YVvR6%2BaXpzWtvNJQNnb6v0uI3%2BTtTexZkJpLQYqFcgZLQSxsXWSnf988qvASCIUhAzp2UnS1uqy7QjtD5T73zksYN2aesll7rvB80qIuujG6NOdHnRJ2M5%2FKXXNo1Yd15MtzPuSjRoSB9RSMon5jFu31OrQnA9eCUoawxbB0nHqwK8a43CKBZHhA8RoUAJW%2B48EuFsp3U%3D&X-Amz-Signature=3436e4139e84dbcf5e2e6086c0ebc92f4e1e9332b6fda24697bc339acbf2cdfa
एक presigned URL cli से उस principal के credentials का उपयोग करके बनाया जा सकता है जिसके पास object तक access है (यदि जिस account का आप उपयोग कर रहे हैं उसके पास access नहीं है, तो एक छोटा presigned URL बनाया जाएगा पर वह बेकार होगा)
aws s3 presign --region <bucket-region> 's3://<bucket-name>/<file-name>'
Note
presigned URL जेनरेट करने के लिए आवश्यक केवल अनुमति वही है जो दी जा रही है, इसलिए पिछले कमांड के लिए principal को आवश्यक केवल अनुमति
s3:GetObjectहै
यह भी संभव है कि अन्य अनुमतियों के साथ presigned URLs बनाए जा सकें:
import boto3
url = boto3.client('s3').generate_presigned_url(
ClientMethod='put_object',
Params={'Bucket': 'BUCKET_NAME', 'Key': 'OBJECT_KEY'},
ExpiresIn=3600
)
S3 एन्क्रिप्शन तंत्र
DEK means Data Encryption Key और यह वह कुंजी है जिसे हमेशा उत्पन्न किया जाता है और डेटा को एन्क्रिप्ट करने के लिए उपयोग किया जाता है।
सर्वर-साइड एन्क्रिप्शन S3 प्रबंधित कुंजियों के साथ, SSE-S3
यह विकल्प न्यूनतम कॉन्फ़िगरेशन की आवश्यकता रखता है और उपयोग की जाने वाली एन्क्रिप्शन कुंजियों का सारा प्रबंधन AWS द्वारा किया जाता है। आपको बस अपना डेटा अपलोड करें और S3 बाकी सभी पहलुओं को संभाल लेगा। किसी S3 account के प्रत्येक bucket को एक bucket key आवंटित की जाती है।
- एन्क्रिप्शन:
- Object Data + created plaintext DEK –> Encrypted data (stored inside S3)
- Created plaintext DEK + S3 Master Key –> Encrypted DEK (stored inside S3) और plain text मेमोरी से हटा दिया जाता है
- डिक्रिप्शन:
- Encrypted DEK + S3 Master Key –> Plaintext DEK
- Plaintext DEK + Encrypted data –> Object Data
कृपया ध्यान दें कि इस मामले में the key is managed by AWS (rotation केवल हर 3 साल)। यदि आप अपनी खुद की key उपयोग करते हैं तो आप उसे rotate, disable और access control लागू कर सकेंगे।
सर्वर-साइड एन्क्रिप्शन KMS प्रबंधित कुंजियों के साथ, SSE-KMS
यह विधि S3 को आपकी data encryption keys जनरेट करने के लिए key management service का उपयोग करने की अनुमति देती है। KMS आपको यह निर्धारित करने में बहुत अधिक लचीलापन देता है कि आपकी कुंजियाँ कैसे प्रबंधित होंगी। उदहारण के लिए, आप CMK को disable, rotate और access controls लागू कर सकते हैं, और उनके उपयोग का audit AWS Cloud Trail के माध्यम से कर सकते हैं।
- एन्क्रिप्शन:
- S3 KMS CMK से data keys का अनुरोध करता है
- KMS CMK का उपयोग करके DEK का जोड़ा (plaintext और encrypted) जनरेट करता है और उन्हें S3 को भेजता है
- S3 plaintext key का उपयोग करके डेटा को एन्क्रिप्ट करता है, एन्क्रिप्टेड डेटा और एन्क्रिप्टेड key स्टोर करता है और मेमोरी से plain text key हटा देता है
- डिक्रिप्शन:
- S3 ऑब्जेक्ट के एन्क्रिप्टेड data key को डिक्रिप्ट करने के लिए KMS से अनुरोध करता है
- KMS CMK के साथ data key को डिक्रिप्ट करता है और इसे S3 को वापस भेजता है
- S3 ऑब्जेक्ट डेटा को डिक्रिप्ट कर लेता है
सर्वर-साइड एन्क्रिप्शन customer provided keys के साथ, SSE-C
यह विकल्प आपको अपनी स्वयं की master key प्रदान करने का अवसर देता है जिसे आप AWS के बाहर पहले से उपयोग कर रहे हो सकते हैं। आपकी customer-provided key तब आपके डेटा के साथ S3 को भेजी जाएगी, जहां S3 आपके लिए एन्क्रिप्शन करेगा।
- एन्क्रिप्शन:
- यूज़र ऑब्जेक्ट डेटा + Customer key को S3 को भेजता है
- Customer key का उपयोग डेटा को एन्क्रिप्ट करने के लिए किया जाता है और एन्क्रिप्टेड डेटा स्टोर किया जाता है
- भविष्य के key validation के लिए customer key का एक salted HMAC मान भी स्टोर किया जाता है
- customer key मेमोरी से हटा दी जाती है
- डिक्रिप्शन:
- यूज़र customer key भेजता है
- key को स्टोर किए गए HMAC मान के विरुद्ध मान्य किया जाता है
- फिर customer provided key का उपयोग डेटा को डिक्रिप्ट करने के लिए किया जाता है
क्लाइंट-साइड एन्क्रिप्शन with KMS, CSE-KMS
SSE-KMS की तरह, यह भी key management service का उपयोग करके आपके data encryption keys जनरेट करता है। हालाँकि, इस बार KMS को client द्वारा कॉल किया जाता है न कि S3। एन्क्रिप्शन क्लाइंट-साइड होता है और फिर एन्क्रिप्टेड डेटा स्टोरेज के लिए S3 को भेजा जाता है।
- एन्क्रिप्शन:
- Client KMS से data key के लिए अनुरोध करता है
- KMS plaintext DEK और CMK के साथ encrypted DEK वापस करता है
- दोनों keys वापस भेजे जाते हैं
- क्लाइंट फिर plaintext DEK से डेटा को एन्क्रिप्ट करता है और S3 को एन्क्रिप्टेड डेटा + encrypted DEK भेजता है (जो एन्क्रिप्टेड डेटा के metadata के रूप में S3 में सेव होता है)
- डिक्रिप्शन:
- क्लाइंट को एन्क्रिप्टेड डेटा और encrypted DEK भेजा जाता है
- क्लाइंट KMS से CMK का उपयोग करके encrypted key को डिक्रिप्ट करने के लिए कहता है और KMS plaintext DEK वापस भेजता है
- क्लाइंट अब एन्क्रिप्टेड डेटा को डिक्रिप्ट कर सकता है
क्लाइंट-साइड एन्क्रिप्शन customer provided keys के साथ, CSE-C
इस तंत्र का उपयोग करते हुए, आप अपनी स्वयं की प्रदान की गई कुंजियों का उपयोग कर सकते हैं और AWS-SDK क्लाइंट का उपयोग करके अपने डेटा को S3 पर भेजने से पहले एन्क्रिप्ट कर सकते हैं।
- एन्क्रिप्शन:
- क्लाइंट एक DEK जनरेट करता है और plaintext डेटा को एन्क्रिप्ट करता है
- फिर, अपनी custom CMK का उपयोग करके वह DEK को एन्क्रिप्ट करता है
- एन्क्रिप्टेड डेटा + एन्क्रिप्टेड DEK को S3 को सबमिट करता है जहाँ यह स्टोर होता है
- डिक्रिप्शन:
- S3 एन्क्रिप्टेड डेटा और DEK भेजता है
- चूँकि क्लाइंट के पास वह CMK पहले से मौजूद है जिसका उपयोग DEK को एन्क्रिप्ट करने में हुआ था, क्लाइंट DEK को डिक्रिप्ट करता है और फिर plaintext DEK का उपयोग करके डेटा को डिक्रिप्ट कर लेता है
इन्यूमरेशन
AWS orgs को समझौता करने के पारंपरिक मुख्य तरीकों में से एक सार्वजनिक रूप से पहुँच योग्य buckets का समझौता करना है। आप इस पेज पर public buckets enumerators in this page** पा सकते हैं।**
# Get buckets ACLs
aws s3api get-bucket-acl --bucket <bucket-name>
aws s3api get-object-acl --bucket <bucket-name> --key flag
# Get policy
aws s3api get-bucket-policy --bucket <bucket-name>
aws s3api get-bucket-policy-status --bucket <bucket-name> #if it's public
# list S3 buckets associated with a profile
aws s3 ls
aws s3api list-buckets
# list content of bucket (no creds)
aws s3 ls s3://bucket-name --no-sign-request
aws s3 ls s3://bucket-name --recursive --no-sign-request
# list content of bucket (with creds)
aws s3 ls s3://bucket-name
aws s3api list-objects-v2 --bucket <bucket-name>
aws s3api list-objects --bucket <bucket-name>
aws s3api list-object-versions --bucket <bucket-name>
# copy local folder to S3
aws s3 cp MyFolder s3://bucket-name --recursive
# delete
aws s3 rb s3://bucket-name –-force
# download a whole S3 bucket
aws s3 sync s3://<bucket>/ .
# move S3 bucket to different location
aws s3 sync s3://oldbucket s3://newbucket --source-region us-west-1
# list the sizes of an S3 bucket and its contents
aws s3api list-objects --bucket BUCKETNAME --output json --query "[sum(Contents[].Size), length(Contents[])]"
# Update Bucket policy
aws s3api put-bucket-policy --policy file:///root/policy.json --bucket <bucket-name>
##JSON policy example
{
"Id": "Policy1568185116930",
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Stmt1568184932403",
"Action": [
"s3:ListBucket"
],
"Effect": "Allow",
"Resource": "arn:aws:s3:::welcome",
"Principal": "*"
},
{
"Sid": "Stmt1568185007451",
"Action": [
"s3:GetObject"
],
"Effect": "Allow",
"Resource": "arn:aws:s3:::welcome/*",
"Principal": "*"
}
]
}
# Update bucket ACL
aws s3api get-bucket-acl --bucket <bucket-name> # Way 1 to get the ACL
aws s3api put-bucket-acl --bucket <bucket-name> --access-control-policy file://acl.json
aws s3api get-object-acl --bucket <bucket-name> --key flag #Way 2 to get the ACL
aws s3api put-object-acl --bucket <bucket-name> --key flag --access-control-policy file://objacl.json
##JSON ACL example
## Make sure to modify the Owner’s displayName and ID according to the Object ACL you retrieved.
{
"Owner": {
"DisplayName": "<DisplayName>",
"ID": "<ID>"
},
"Grants": [
{
"Grantee": {
"Type": "Group",
"URI": "http://acs.amazonaws.com/groups/global/AuthenticatedUsers"
},
"Permission": "FULL_CONTROL"
}
]
}
## An ACL should give you the permission WRITE_ACP to be able to put a new ACL
dual-stack
You can access an S3 bucket through a dual-stack endpoint by using a virtual hosted-style or a path-style endpoint name. These are useful to access S3 through IPv6.
Dual-stack endpoints use the following syntax:
bucketname.s3.dualstack.aws-region.amazonaws.coms3.dualstack.aws-region.amazonaws.com/bucketname
Privesc
आप निम्न पृष्ठ पर देख सकते हैं कि कैसे abuse S3 permissions to escalate privileges:
Unauthenticated Access
S3 Post Exploitation
Persistence
Other S3 vulns
S3 HTTP Cache Poisoning Issue
According to this research किसी भी bucket की response को ऐसे cache किया जा सकता था जैसे वह किसी दूसरे bucket की हो। इसका दुरुपयोग करके, उदाहरण के लिए javascript file responses को बदलकर और S3 का उपयोग करके static code स्टोर करने वाले किसी भी पेज को compromise किया जा सकता था।
Amazon Athena
Amazon Athena एक interactive query service है जो Amazon Simple Storage Service (Amazon S3) में सीधे standard SQL का उपयोग करके डेटा को आसानी से analyze करने में मदद करती है।
आपको उन monitored S3 buckets में दिखाई देने वाली सामग्री के format के साथ एक relational DB table तैयार करना होगा। फिर, Amazon Athena logs से DB को populate कर पाएगा, ताकि आप उस पर query चला सकें।
Amazon Athena उस क्षमता का समर्थन करता है कि वह पहले से encrypted S3 data को query कर सके और यदि इसे configure किया गया हो तो Athena query के results को भी encrypt कर सकती है जिन्हें फिर S3 में store किया जा सकता है।
This encryption of results is independent of the underlying queried S3 data, अर्थात् भले ही S3 data encrypted न हो, queried results को encrypt किया जा सकता है। ध्यान रखने योग्य बात यह है कि Amazon Athena केवल उन डेटा का समर्थन करता है जो निम्न S3 encryption methods के साथ encrypted किए गए हों: SSE-S3, SSE-KMS, and CSE-KMS।
SSE-C और CSE-C समर्थित नहीं हैं। इसके अतिरिक्त, यह समझना महत्वपूर्ण है कि Amazon Athena केवल उन्हीं encrypted objects पर query चलाएगा जो उसी region में हैं जहाँ query चल रही है। यदि आपको KMS का उपयोग करके encrypted S3 data को query करने की आवश्यकता है, तो Athena user को यह query करने के लिए specific permissions चाहिए होंगे।
Enumeration
# Get catalogs
aws athena list-data-catalogs
# Get databases inside catalog
aws athena list-databases --catalog-name <catalog-name>
aws athena list-table-metadata --catalog-name <catalog-name> --database-name <db-name>
# Get query executions, queries and results
aws athena list-query-executions
aws athena get-query-execution --query-execution-id <id> # Get query and meta of results
aws athena get-query-results --query-execution-id <id> # This will rerun the query and get the results
# Get workgroups & Prepared statements
aws athena list-work-groups
aws athena list-prepared-statements --work-group <wg-name>
aws athena get-prepared-statement --statement-name <name> --work-group <wg-name>
# Run query
aws athena start-query-execution --query-string <query>
संदर्भ
- https://cloudsecdocs.com/aws/defensive/tooling/cli/#s3
- https://docs.aws.amazon.com/AmazonS3/latest/userguide/dual-stack-endpoints.html
Tip
सीखें और अभ्यास करें AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
सीखें और अभ्यास करें GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
सीखें और अभ्यास करें Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks का समर्थन करें
- देखें subscription plans!
- शामिल हों 💬 Discord group या telegram group या हमें फ़ॉलो करें Twitter 🐦 @hacktricks_live.
- PRs सबमिट करके hacking tricks साझा करें HackTricks और HackTricks Cloud github repos.
HackTricks Cloud

