From b42dfe1729cba1c91cd6ff74156ef417b5dd8be2 Mon Sep 17 00:00:00 2001 From: Translator Date: Sun, 2 Feb 2025 18:22:45 +0000 Subject: [PATCH] Translated ['src/pentesting-cloud/aws-security/aws-services/aws-efs-enum --- .../aws-security/aws-services/aws-efs-enum.md | 110 +++++++++++++++++- 1 file changed, 104 insertions(+), 6 deletions(-) diff --git a/src/pentesting-cloud/aws-security/aws-services/aws-efs-enum.md b/src/pentesting-cloud/aws-security/aws-services/aws-efs-enum.md index 8f380157b..f97fa5a88 100644 --- a/src/pentesting-cloud/aws-security/aws-services/aws-efs-enum.md +++ b/src/pentesting-cloud/aws-security/aws-services/aws-efs-enum.md @@ -16,7 +16,7 @@ Un EFS est créé dans un VPC et serait **par défaut accessible dans tous les s Sans cela, vous **ne pourrez pas contacter le service NFS**. -Pour plus d'informations sur la façon de faire cela, consultez : [https://stackoverflow.com/questions/38632222/aws-efs-connection-timeout-at-mount](https://stackoverflow.com/questions/38632222/aws-efs-connection-timeout-at-mount) +Pour plus d'informations sur la façon de procéder, consultez : [https://stackoverflow.com/questions/38632222/aws-efs-connection-timeout-at-mount](https://stackoverflow.com/questions/38632222/aws-efs-connection-timeout-at-mount) ### Énumération ```bash @@ -41,7 +41,7 @@ sudo nmap -T4 -Pn -p 2049 --open 10.10.10.0/20 # or /16 to be sure > [!CAUTION] > Il se peut que le point de montage EFS soit dans le même VPC mais dans un sous-réseau différent. Si vous voulez être sûr de trouver tous les **points EFS, il serait préférable de scanner le masque de sous-réseau `/16`**. -### Monter EFS +### Mount EFS ```bash sudo mkdir /efs @@ -57,8 +57,8 @@ sudo mount -t efs :/ /efs/ ``` ### IAM Access -Par **défaut**, toute personne ayant **un accès réseau à l'EFS** pourra le monter, **le lire et y écrire même en tant qu'utilisateur root**. Cependant, des politiques de système de fichiers pourraient être en place **n'autorisant que les principaux avec des autorisations spécifiques** à y accéder.\ -Par exemple, cette politique de système de fichiers **ne permettra même pas de monter** le système de fichiers si vous **n'avez pas l'autorisation IAM** : +Par **défaut**, toute personne ayant **un accès réseau à l'EFS** pourra le monter, **le lire et y écrire même en tant qu'utilisateur root**. Cependant, des politiques de système de fichiers pourraient être en place **n'autorisant que les principaux avec des permissions spécifiques** à y accéder.\ +Par exemple, cette politique de système de fichiers **ne permettra même pas de monter** le système de fichiers si vous **n'avez pas la permission IAM** : ```json { "Version": "2012-10-17", @@ -81,7 +81,7 @@ Par exemple, cette politique de système de fichiers **ne permettra même pas de ] } ``` -Ou cela **préventera l'accès anonyme** : +Ou cela **empêchera l'accès anonyme** :
@@ -96,7 +96,7 @@ sudo mount -t efs -o tls,iam :/ /efs/ **Les points d'accès** sont des points d'entrée **spécifiques à l'application** **dans un système de fichiers EFS** qui facilitent la gestion de l'accès des applications aux ensembles de données partagés. -Lorsque vous créez un point d'accès, vous pouvez **spécifier le propriétaire et les permissions POSIX** pour les fichiers et répertoires créés via le point d'accès. Vous pouvez également **définir un répertoire racine personnalisé** pour le point d'accès, soit en spécifiant un répertoire existant, soit en créant un nouveau avec les permissions souhaitées. Cela vous permet de **contrôler l'accès à votre système de fichiers EFS sur une base par application ou par utilisateur**, facilitant ainsi la gestion et la sécurisation de vos données de fichiers partagées. +Lorsque vous créez un point d'accès, vous pouvez **spécifier le propriétaire et les permissions POSIX** pour les fichiers et répertoires créés via le point d'accès. Vous pouvez également **définir un répertoire racine personnalisé** pour le point d'accès, soit en spécifiant un répertoire existant, soit en en créant un nouveau avec les permissions souhaitées. Cela vous permet de **contrôler l'accès à votre système de fichiers EFS sur une base par application ou par utilisateur**, facilitant ainsi la gestion et la sécurisation de vos données de fichiers partagées. **Vous pouvez monter le système de fichiers à partir d'un point d'accès avec quelque chose comme :** ```bash @@ -113,6 +113,104 @@ Les points d'accès peuvent être utilisés pour les objectifs suivants : - **Imposer un répertoire racine** : Les points d'accès peuvent restreindre l'accès à un répertoire spécifique au sein du système de fichiers EFS, garantissant que chaque application ou utilisateur opère dans son dossier désigné. Cela aide à prévenir l'exposition ou la modification accidentelle des données. - **Accès au système de fichiers plus facile** : Les points d'accès peuvent être associés à une fonction AWS Lambda ou à une tâche AWS Fargate, simplifiant l'accès au système de fichiers pour les applications sans serveur et conteneurisées. +## Adresse IP EFS + +En utilisant les informations relatives à l'adresse IP EFS, le script Python suivant peut aider à récupérer des détails sur le système EFS. Ces informations sont utiles pour construire la commande de montage du système ou effectuer une énumération supplémentaire avec la connaissance de l'ID de sous-réseau. De plus, le script montre les points d'accès, ce qui peut être précieux lorsque le répertoire racine ou le chemin de montage principal est restreint. Dans de tels cas, les points d'accès fournissent des chemins alternatifs pour accéder à des informations sensibles. +```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) + +``` ## Privesc {{#ref}}