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 fa8099a03..4cdd781b1 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 @@ -55,10 +55,10 @@ sudo yum install amazon-efs-utils # If centos sudo apt-get install amazon-efs-utils # If ubuntu sudo mount -t efs :/ /efs/ ``` -### Acesso IAM +### IAM Access -Por **padrão**, qualquer pessoa com **acesso à rede do EFS** poderá montar, **ler e escrever nele, mesmo como usuário root**. No entanto, políticas de Sistema de Arquivos podem estar em vigor **permitindo apenas que principais com permissões específicas** acessem.\ -Por exemplo, esta política de Sistema de Arquivos **não permitirá nem mesmo montar** o sistema de arquivos se você **não tiver a permissão IAM**: +Por **padrão**, qualquer pessoa com **acesso à rede ao EFS** poderá montar, **ler e escrever nele, mesmo como usuário root**. No entanto, políticas de sistema de arquivos podem estar em vigor **permitindo apenas que principais com permissões específicas** acessem.\ +Por exemplo, esta política de sistema de arquivos **não permitirá nem mesmo montar** o sistema de arquivos se você **não tiver a permissão IAM**: ```json { "Version": "2012-10-17", @@ -85,7 +85,7 @@ Ou isso **impedirá o acesso anônimo**:
-Observe que para montar sistemas de arquivos protegidos por IAM, você DEVE usar o tipo "efs" no comando de montagem: +Observe que para montar sistemas de arquivos protegidos pelo IAM, você DEVE usar o tipo "efs" no comando de montagem: ```bash sudo mkdir /efs sudo mount -t efs -o tls,iam :/ /efs/ @@ -110,22 +110,120 @@ sudo mount -t efs -o tls,[iam],accesspoint= \ Os pontos de acesso podem ser usados para os seguintes propósitos: - **Simplificar a gestão de permissões**: Ao definir um usuário e grupo POSIX para cada ponto de acesso, você pode gerenciar facilmente as permissões de acesso para diferentes aplicações ou usuários sem modificar as permissões do sistema de arquivos subjacente. -- **Impor um diretório raiz**: Os pontos de acesso podem restringir o acesso a um diretório específico dentro do sistema de arquivos EFS, garantindo que cada aplicação ou usuário opere dentro de sua pasta designada. Isso ajuda a prevenir a exposição acidental de dados ou modificação. +- **Impor um diretório raiz**: Os pontos de acesso podem restringir o acesso a um diretório específico dentro do sistema de arquivos EFS, garantindo que cada aplicação ou usuário opere dentro de sua pasta designada. Isso ajuda a prevenir a exposição acidental ou modificação de dados. - **Acesso mais fácil ao sistema de arquivos**: Os pontos de acesso podem ser associados a uma função AWS Lambda ou a uma tarefa AWS Fargate, simplificando o acesso ao sistema de arquivos para aplicações sem servidor e containerizadas. +## Endereço IP do EFS + +Usando as informações relacionadas ao endereço IP do EFS, o seguinte script Python pode ajudar a recuperar detalhes sobre o sistema EFS. Essas informações são úteis para construir o comando do sistema de montagem ou realizar uma enumeração adicional com conhecimento do ID da sub-rede. Além disso, o script mostra os pontos de acesso, que podem ser valiosos quando o diretório raiz ou o caminho de montagem principal está restrito. Nesses casos, os pontos de acesso fornecem caminhos alternativos para acessar informações sensíveis. +```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}} ../aws-privilege-escalation/aws-efs-privesc.md {{#endref}} -## Post Exploitation +## Pós Exploração {{#ref}} ../aws-post-exploitation/aws-efs-post-exploitation.md {{#endref}} -## Persistence +## Persistência {{#ref}} ../aws-persistence/aws-efs-persistence.md