# AWS - EFS Enum {{#include ../../../banners/hacktricks-training.md}} ## EFS ### Basic Information Amazon Elastic File System (EFS) को AWS द्वारा **पूर्ण रूप से प्रबंधित, स्केलेबल, और लचीले नेटवर्क फ़ाइल सिस्टम** के रूप में प्रस्तुत किया गया है। यह सेवा **फ़ाइल सिस्टम** बनाने और कॉन्फ़िगर करने की सुविधा प्रदान करती है जिन्हें कई EC2 उदाहरणों और अन्य AWS सेवाओं द्वारा एक साथ एक्सेस किया जा सकता है। EFS की प्रमुख विशेषताओं में स्वचालित रूप से स्केल करने की क्षमता, निम्न-लेटेंसी एक्सेस प्रदान करना, उच्च-थ्रूपुट कार्यभार का समर्थन करना, डेटा की स्थिरता की गारंटी देना, और विभिन्न AWS सुरक्षा तंत्रों के साथ सहजता से एकीकृत होना शामिल है। **डिफ़ॉल्ट** रूप से, माउंट करने के लिए EFS फ़ोल्डर **`/`** होगा लेकिन इसका **अलग नाम** हो सकता है। ### Network Access EFS एक VPC में बनाया जाता है और **डिफ़ॉल्ट रूप से सभी VPC उपनेटवर्क में सुलभ होगा**। हालाँकि, EFS का एक सुरक्षा समूह होगा। EFS को माउंट करने के लिए **EC2** (या किसी अन्य AWS सेवा) को **EFS सुरक्षा समूह में एक इनबाउंड NFS** (2049 पोर्ट) **नियम की अनुमति देना आवश्यक है**। इसके बिना, आप **NFS सेवा से संपर्क नहीं कर पाएंगे**। इस बारे में अधिक जानकारी के लिए देखें: [https://stackoverflow.com/questions/38632222/aws-efs-connection-timeout-at-mount](https://stackoverflow.com/questions/38632222/aws-efs-connection-timeout-at-mount) ### Enumeration ```bash # Get filesystems and access policies (if any) aws efs describe-file-systems aws efs describe-file-system-policy --file-system-id # Get subnetworks and IP addresses where you can find the file system aws efs describe-mount-targets --file-system-id aws efs describe-mount-target-security-groups --mount-target-id aws ec2 describe-security-groups --group-ids # Get other access points aws efs describe-access-points # Get replication configurations aws efs describe-replication-configurations # Search for NFS in EC2 networks sudo nmap -T4 -Pn -p 2049 --open 10.10.10.0/20 # or /16 to be sure ``` > [!CAUTION] > यह हो सकता है कि EFS माउंट पॉइंट उसी VPC के अंदर हो लेकिन एक अलग सबनेट में। यदि आप सुनिश्चित होना चाहते हैं कि आप सभी **EFS पॉइंट्स खोजें, तो `/16` नेटमास्क को स्कैन करना बेहतर होगा**। ### Mount EFS ```bash sudo mkdir /efs ## Mount found sudo apt install nfs-common sudo mount -t nfs4 -o nfsvers=4.1,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2,noresvport :/ /efs ## Mount with efs type ## You need to have installed the package amazon-efs-utils sudo yum install amazon-efs-utils # If centos sudo apt-get install amazon-efs-utils # If ubuntu sudo mount -t efs :/ /efs/ ``` ### IAM Access By **default** कोई भी जिसे **EFS तक नेटवर्क एक्सेस है** वह इसे माउंट, **पढ़ और लिख सकता है यहां तक कि रूट यूजर के रूप में**। हालाँकि, फ़ाइल सिस्टम नीतियाँ लागू की जा सकती हैं **जो केवल विशिष्ट अनुमतियों वाले प्रिंसिपल को इसे एक्सेस करने की अनुमति देती हैं**।\ उदाहरण के लिए, यह फ़ाइल सिस्टम नीति **यहां तक कि माउंट करने की अनुमति नहीं देगी** यदि आपके पास **IAM अनुमति नहीं है**: ```json { "Version": "2012-10-17", "Id": "efs-policy-wizard-2ca2ba76-5d83-40be-8557-8f6c19eaa797", "Statement": [ { "Sid": "efs-statement-e7f4b04c-ad75-4a7f-a316-4e5d12f0dbf5", "Effect": "Allow", "Principal": { "AWS": "*" }, "Action": "", "Resource": "arn:aws:elasticfilesystem:us-east-1:318142138553:file-system/fs-0ab66ad201b58a018", "Condition": { "Bool": { "elasticfilesystem:AccessedViaMountTarget": "true" } } } ] } ``` या **गुमनाम पहुँच को रोक देगा**:
ध्यान दें कि IAM द्वारा सुरक्षित फ़ाइल सिस्टम को माउंट करने के लिए आपको माउंट कमांड में "efs" प्रकार का उपयोग करना होगा: ```bash sudo mkdir /efs sudo mount -t efs -o tls,iam :/ /efs/ # To use a different pforile from ~/.aws/credentials # You can use: -o tls,iam,awsprofile=namedprofile ``` ### Access Points **Access points** एक **application**-विशिष्ट प्रवेश बिंदु हैं **EFS फ़ाइल प्रणाली** में जो साझा डेटा सेट्स तक एप्लिकेशन पहुंच प्रबंधित करना आसान बनाते हैं। जब आप एक access point बनाते हैं, तो आप **फाइलों और निर्देशिकाओं के लिए मालिक और POSIX अनुमतियाँ** निर्दिष्ट कर सकते हैं जो access point के माध्यम से बनाई जाती हैं। आप access point के लिए **एक कस्टम रूट निर्देशिका** भी परिभाषित कर सकते हैं, या तो एक मौजूदा निर्देशिका निर्दिष्ट करके या इच्छित अनुमतियों के साथ एक नई बनाकर। यह आपको **आपकी EFS फ़ाइल प्रणाली तक पहुंच को प्रति-एप्लिकेशन या प्रति-उपयोगकर्ता आधार पर नियंत्रित करने** की अनुमति देता है, जिससे आपके साझा फ़ाइल डेटा को प्रबंधित और सुरक्षित करना आसान हो जाता है। **आप access point से फ़ाइल प्रणाली को कुछ इस तरह माउंट कर सकते हैं:** ```bash # Use IAM if you need to use iam permissions sudo mount -t efs -o tls,[iam],accesspoint= \ /efs/ ``` > [!WARNING] > ध्यान दें कि एक एक्सेस पॉइंट को माउंट करने की कोशिश करते समय भी आपको **नेटवर्क के माध्यम से NFS सेवा से संपर्क करने में सक्षम होना चाहिए**, और यदि EFS में एक फ़ाइल प्रणाली **नीति** है, तो आपको इसे माउंट करने के लिए **पर्याप्त IAM अनुमतियाँ** चाहिए। एक्सेस पॉइंट का उपयोग निम्नलिखित उद्देश्यों के लिए किया जा सकता है: - **अनुमतियों के प्रबंधन को सरल बनाना**: प्रत्येक एक्सेस पॉइंट के लिए एक POSIX उपयोगकर्ता और समूह को परिभाषित करके, आप बिना अंतर्निहित फ़ाइल प्रणाली की अनुमतियों को संशोधित किए विभिन्न अनुप्रयोगों या उपयोगकर्ताओं के लिए पहुँच अनुमतियों को आसानी से प्रबंधित कर सकते हैं। - **एक रूट निर्देशिका को लागू करना**: एक्सेस पॉइंट EFS फ़ाइल प्रणाली के भीतर एक विशिष्ट निर्देशिका तक पहुँच को प्रतिबंधित कर सकते हैं, यह सुनिश्चित करते हुए कि प्रत्येक अनुप्रयोग या उपयोगकर्ता अपने निर्दिष्ट फ़ोल्डर के भीतर कार्य करता है। यह आकस्मिक डेटा एक्सपोज़र या संशोधन को रोकने में मदद करता है। - **फ़ाइल प्रणाली तक पहुँच को आसान बनाना**: एक्सेस पॉइंट को AWS Lambda फ़ंक्शन या AWS Fargate कार्य के साथ जोड़ा जा सकता है, सर्वरलेस और कंटेनरयुक्त अनुप्रयोगों के लिए फ़ाइल प्रणाली तक पहुँच को सरल बनाते हुए। ## EFS IP पता EFS IP पते से संबंधित जानकारी का उपयोग करते हुए, निम्नलिखित Python स्क्रिप्ट EFS प्रणाली के बारे में विवरण प्राप्त करने में सहायता कर सकती है। यह जानकारी माउंट सिस्टम कमांड बनाने या सबनेट ID के ज्ञान के साथ आगे की गणना करने के लिए उपयोगी है। इसके अतिरिक्त, स्क्रिप्ट एक्सेस पॉइंट दिखाती है, जो तब मूल्यवान हो सकती है जब रूट निर्देशिका या प्राथमिक माउंट पथ प्रतिबंधित हो। ऐसे मामलों में, एक्सेस पॉइंट संवेदनशील जानकारी तक पहुँचने के लिए वैकल्पिक पथ प्रदान करते हैं। ```bash Usage: python efs_ip_enum.py ``` ```python import boto3 import sys def get_efs_info(ip_address): try: session = boto3.Session(profile_name="profile") ec2_client = session.client('ec2') efs_client = session.client('efs') print(f"[*] Enumerating EFS information for IP address: {ip_address}\n") try: response = ec2_client.describe_network_interfaces(Filters=[ {'Name': 'addresses.private-ip-address', 'Values': [ip_address]} ]) if not response['NetworkInterfaces']: print(f"[!] No network interface found for IP address {ip_address}") return network_interface = response['NetworkInterfaces'][0] network_interface_id = network_interface['NetworkInterfaceId'] print(f"[+] Found network interface: {network_interface_id}\n") except Exception as e: print(f"[!] Error retrieving network interface: {str(e)}") return try: efs_response = efs_client.describe_file_systems() file_systems = efs_response['FileSystems'] except Exception as e: print(f"[!] Error retrieving EFS file systems: {str(e)}") return for fs in file_systems: fs_id = fs['FileSystemId'] try: mount_targets = efs_client.describe_mount_targets(FileSystemId=fs_id)['MountTargets'] for mt in mount_targets: if mt['NetworkInterfaceId'] == network_interface_id: try: policy = efs_client.describe_file_system_policy(FileSystemId=fs_id).get('Policy', 'No policy attached') except Exception as e: policy = f"Error retrieving policy: {str(e)}" print("[+] Found matching EFS File System:\n") print(f" FileSystemId: {fs_id}") print(f" MountTargetId: {mt['MountTargetId']}") print(f" DNSName: {fs_id}.efs.{session.region_name}.amazonaws.com") print(f" LifeCycleState: {mt['LifeCycleState']}") print(f" SubnetId: {mt['SubnetId']}") print(f" SecurityGroups: {', '.join(mt.get('SecurityGroups', [])) if mt.get('SecurityGroups') else 'None'}") print(f" Policy: {policy}\n") try: access_points = efs_client.describe_access_points(FileSystemId=fs_id)['AccessPoints'] if access_points: print(f"[+] Access Points for FileSystemId {fs_id}:") for ap in access_points: print(f" AccessPointId: {ap['AccessPointId']}") print(f" Name: {ap.get('Name', 'N/A')}") print(f" OwnerId: {ap['OwnerId']}") posix_user = ap.get('PosixUser', {}) print(f" PosixUser: UID={posix_user.get('Uid', 'N/A')}, GID={posix_user.get('Gid', 'N/A')}") root_dir = ap.get('RootDirectory', {}) print(f" RootDirectory: Path={root_dir.get('Path', 'N/A')}") creation_info = root_dir.get('CreationInfo', {}) print(f" CreationInfo: OwnerUID={creation_info.get('OwnerUid', 'N/A')}, OwnerGID={creation_info.get('OwnerGid', 'N/A')}, Permissions={creation_info.get('Permissions', 'N/A')}\n") else: print(f"[!] No Access Points found for FileSystemId {fs_id}\n") except Exception as e: print(f"[!] Error retrieving access points for FileSystemId {fs_id}: {str(e)}\n") except Exception as e: print(f"[!] Error processing file system {fs_id}: {str(e)}\n") except Exception as e: print(f"[!] General Error: {str(e)}\n") if __name__ == "__main__": if len(sys.argv) != 2: print("Usage: python efs_enum.py ") sys.exit(1) ip_address = sys.argv[1] get_efs_info(ip_address) ``` ## प्रिवेस्क {{#ref}} ../aws-privilege-escalation/aws-efs-privesc/README.md {{#endref}} ## पोस्ट एक्सप्लोइटेशन {{#ref}} ../aws-post-exploitation/aws-efs-post-exploitation/README.md {{#endref}} ## पर्सिस्टेंस {{#ref}} ../aws-persistence/aws-efs-persistence/README.md {{#endref}} {{#include ../../../banners/hacktricks-training.md}}