Files
hacktricks-cloud/src/pentesting-cloud/aws-security/aws-services/aws-efs-enum.md

10 KiB

AWS - EFS Enum

{{#include ../../../banners/hacktricks-training.md}}

EFS

Información Básica

Amazon Elastic File System (EFS) se presenta como un sistema de archivos de red completamente gestionado, escalable y elástico por AWS. El servicio facilita la creación y configuración de sistemas de archivos que pueden ser accedidos simultáneamente por múltiples instancias de EC2 y otros servicios de AWS. Las características clave de EFS incluyen su capacidad para escalar automáticamente sin intervención manual, proporcionar acceso de baja latencia, soportar cargas de trabajo de alto rendimiento, garantizar la durabilidad de los datos e integrarse sin problemas con varios mecanismos de seguridad de AWS.

Por defecto, la carpeta de EFS a montar será / pero podría tener un nombre diferente.

Acceso a la Red

Un EFS se crea en una VPC y sería por defecto accesible en todas las subredes de la VPC. Sin embargo, el EFS tendrá un Grupo de Seguridad. Para dar acceso a un EC2 (o cualquier otro servicio de AWS) para montar el EFS, es necesario permitir en el grupo de seguridad de EFS una regla NFS entrante (puerto 2049) del Grupo de Seguridad de EC2.

Sin esto, no podrás contactar el servicio NFS.

Para más información sobre cómo hacer esto, consulta: https://stackoverflow.com/questions/38632222/aws-efs-connection-timeout-at-mount

Enumeración

# Get filesystems and access policies (if any)
aws efs describe-file-systems
aws efs describe-file-system-policy --file-system-id <id>

# Get subnetworks and IP addresses where you can find the file system
aws efs describe-mount-targets --file-system-id <id>
aws efs describe-mount-target-security-groups --mount-target-id <id>
aws ec2 describe-security-groups --group-ids <sg_id>

# 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

Puede ser que el punto de montaje de EFS esté dentro de la misma VPC pero en una subred diferente. Si quieres asegurarte de encontrar todos los puntos de EFS, sería mejor escanear la máscara de red /16.

Mount EFS

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 <IP>:/ /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 <file-system-id/EFS DNS name>:/ /efs/

IAM Access

Por defecto, cualquier persona con acceso a la red al EFS podrá montarlo, leer y escribir en él incluso como usuario root. Sin embargo, las políticas del sistema de archivos podrían estar en vigor solo permitiendo a los principales con permisos específicos acceder a él.
Por ejemplo, esta política del sistema de archivos no permitirá ni siquiera montar el sistema de archivos si no tienes el permiso de IAM:

{
"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"
}
}
}
]
}

O esto prevendrá el acceso anónimo:

Tenga en cuenta que para montar sistemas de archivos protegidos por IAM DEBE usar el tipo "efs" en el comando de montaje:

sudo mkdir /efs
sudo mount -t efs -o tls,iam  <file-system-id/EFS DNS name>:/ /efs/
# To use a different pforile from ~/.aws/credentials
# You can use: -o tls,iam,awsprofile=namedprofile

Puntos de Acceso

Los puntos de acceso son puntos de entrada específicos de la aplicación a un sistema de archivos EFS que facilitan la gestión del acceso de la aplicación a conjuntos de datos compartidos.

Cuando creas un punto de acceso, puedes especificar el propietario y los permisos POSIX para los archivos y directorios creados a través del punto de acceso. También puedes definir un directorio raíz personalizado para el punto de acceso, ya sea especificando un directorio existente o creando uno nuevo con los permisos deseados. Esto te permite controlar el acceso a tu sistema de archivos EFS de manera específica por aplicación o por usuario, facilitando la gestión y seguridad de tus datos de archivo compartidos.

Puedes montar el sistema de archivos desde un punto de acceso con algo como:

# Use IAM if you need to use iam permissions
sudo mount -t efs -o tls,[iam],accesspoint=<access-point-id> \
<file-system-id/EFS DNS> /efs/

Warning

Tenga en cuenta que incluso al intentar montar un punto de acceso, aún necesita poder contactar el servicio NFS a través de la red, y si el EFS tiene una política de sistema de archivos, necesita suficientes permisos de IAM para montarlo.

Los puntos de acceso se pueden utilizar para los siguientes propósitos:

  • Simplificar la gestión de permisos: Al definir un usuario y grupo POSIX para cada punto de acceso, puede gestionar fácilmente los permisos de acceso para diferentes aplicaciones o usuarios sin modificar los permisos del sistema de archivos subyacente.
  • Hacer cumplir un directorio raíz: Los puntos de acceso pueden restringir el acceso a un directorio específico dentro del sistema de archivos EFS, asegurando que cada aplicación o usuario opere dentro de su carpeta designada. Esto ayuda a prevenir la exposición o modificación accidental de datos.
  • Acceso más fácil al sistema de archivos: Los puntos de acceso pueden asociarse con una función de AWS Lambda o una tarea de AWS Fargate, simplificando el acceso al sistema de archivos para aplicaciones sin servidor y en contenedores.

Dirección IP de EFS

Utilizando la información relacionada con la dirección IP de EFS, el siguiente script de Python puede ayudar a recuperar detalles sobre el sistema EFS. Esta información es útil para construir el comando del sistema de montaje o realizar una enumeración adicional con conocimiento del ID de subred. Además, el script muestra los puntos de acceso, que pueden ser valiosos cuando el directorio raíz o la ruta de montaje principal están restringidos. En tales casos, los puntos de acceso proporcionan rutas alternativas para acceder a información sensible.

Usage: python efs_ip_enum.py <IP_ADDRESS>
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 <IP_ADDRESS>")
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

{{#ref}} ../aws-post-exploitation/aws-efs-post-exploitation.md {{#endref}}

Persistence

{{#ref}} ../aws-persistence/aws-efs-persistence.md {{#endref}}

{{#include ../../../banners/hacktricks-training.md}}