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 c2ccb2054..7d6664cd8 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 @@ -39,9 +39,9 @@ aws efs describe-replication-configurations sudo nmap -T4 -Pn -p 2049 --open 10.10.10.0/20 # or /16 to be sure ``` > [!CAUTION] -> Potrebbe essere che il punto di montaggio EFS si trovi all'interno della stessa VPC ma in una subnet diversa. Se vuoi essere sicuro di trovare tutti i **punti EFS sarebbe meglio scansionare il netmask `/16`**. +> Potrebbe essere che il punto di montaggio EFS si trovi all'interno della stessa VPC ma in una subnet diversa. Se vuoi essere sicuro di trovare tutti i **punti EFS sarebbe meglio scansionare il `/16` netmask**. -### Monta EFS +### Mount EFS ```bash sudo mkdir /efs @@ -57,7 +57,7 @@ sudo mount -t efs :/ /efs/ ``` ### IAM Access -Per **definizione** chiunque abbia **accesso alla rete per l'EFS** sarà in grado di montare, **leggere e scrivere anche come utente root**. Tuttavia, potrebbero essere in vigore politiche del File System **che consentono solo ai principi con permessi specifici** di accedervi.\ +Per **definizione**, chiunque abbia **accesso alla rete all'EFS** sarà in grado di montarlo, **leggerlo e scriverlo anche come utente root**. Tuttavia, potrebbero essere in vigore politiche del File System **che consentono solo ai principi con permessi specifici** di accedervi.\ Ad esempio, questa politica del File System **non consentirà nemmeno di montare** il file system se **non hai il permesso IAM**: ```json { @@ -85,20 +85,20 @@ Oppure questo **prevenirà l'accesso anonimo**:
-Nota che per montare file system protetti da IAM DEVI utilizzare il tipo "efs" nel comando di montaggio: +Nota che per montare i file system protetti da IAM DEVI utilizzare il tipo "efs" nel comando di montaggio: ```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 ``` -### Punti di Accesso +### Access Points -I **punti di accesso** sono punti di ingresso **specifici per l'applicazione** **in un file system EFS** che rendono più facile gestire l'accesso dell'applicazione a set di dati condivisi. +**I punti di accesso** sono **punti di accesso** specifici per l'**applicazione** **in un file system EFS** che rendono più facile gestire l'accesso dell'applicazione a set di dati condivisi. Quando crei un punto di accesso, puoi **specificare il proprietario e i permessi POSIX** per i file e le directory creati tramite il punto di accesso. Puoi anche **definire una directory radice personalizzata** per il punto di accesso, specificando una directory esistente o creando una nuova con i permessi desiderati. Questo ti consente di **controllare l'accesso al tuo file system EFS su base per applicazione o per utente**, rendendo più facile gestire e proteggere i tuoi dati file condivisi. -**Puoi montare il File System da un punto di accesso con qualcosa come:** +**Puoi montare il file system da un punto di accesso con qualcosa come:** ```bash # Use IAM if you need to use iam permissions sudo mount -t efs -o tls,[iam],accesspoint= \ @@ -113,6 +113,104 @@ Gli access point possono essere utilizzati per i seguenti scopi: - **Imporre una directory radice**: Gli access point possono limitare l'accesso a una directory specifica all'interno del file system EFS, garantendo che ogni applicazione o utente operi all'interno della propria cartella designata. Questo aiuta a prevenire esposizioni o modifiche accidentali dei dati. - **Accesso più semplice al file system**: Gli access point possono essere associati a una funzione AWS Lambda o a un'attività AWS Fargate, semplificando l'accesso al file system per applicazioni serverless e containerizzate. +## Indirizzo IP EFS + +Utilizzando le informazioni relative all'indirizzo IP EFS, il seguente script Python può aiutare a recuperare dettagli sul sistema EFS. Queste informazioni sono utili per costruire il comando di montaggio del sistema o per eseguire ulteriori enumerazioni con la conoscenza dell'ID della subnet. Inoltre, lo script mostra gli access point, che possono essere preziosi quando la directory radice o il percorso di montaggio principale è ristretto. In tali casi, gli access point forniscono percorsi alternativi per accedere a informazioni sensibili. +```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}}