Translated ['src/pentesting-cloud/aws-security/aws-services/aws-efs-enum

This commit is contained in:
Translator
2025-02-02 18:22:48 +00:00
parent b970a71ac5
commit 6584d9cfb8

View File

@@ -6,9 +6,9 @@
### 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.
Amazon Elastic File System (EFS) se presenta como un **sistema de archivos de red totalmente 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**.
Por **defecto**, la carpeta EFS a montar será **`/`** pero podría tener un **nombre diferente**.
### Acceso a la Red
@@ -57,7 +57,7 @@ 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á montar, **leer y escribir 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 **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**:
```json
{
@@ -85,7 +85,7 @@ O esto **prevendrá el acceso anónimo**:
<figure><img src="../../../images/image (278).png" alt=""><figcaption></figcaption></figure>
Ten en cuenta que para montar sistemas de archivos protegidos por IAM DEBES usar el tipo "efs" en el comando de montaje:
Tenga en cuenta que para montar sistemas de archivos protegidos por IAM DEBE usar el tipo "efs" en el comando de montaje:
```bash
sudo mkdir /efs
sudo mount -t efs -o tls,iam <file-system-id/EFS DNS name>:/ /efs/
@@ -96,7 +96,7 @@ sudo mount -t efs -o tls,iam <file-system-id/EFS DNS name>:/ /efs/
**Los puntos de acceso** son **puntos de entrada** específicos de **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 archivos 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:**
```bash
@@ -105,14 +105,112 @@ 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 IAM** para montarlo.
> 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 se pueden asociar 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.
- **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.
```bash
Usage: python efs_ip_enum.py <IP_ADDRESS>
```
```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 <IP_ADDRESS>")
sys.exit(1)
ip_address = sys.argv[1]
get_efs_info(ip_address)
```
## Privesc
{{#ref}}
@@ -125,7 +223,7 @@ Los puntos de acceso se pueden utilizar para los siguientes propósitos:
../aws-post-exploitation/aws-efs-post-exploitation.md
{{#endref}}
## Persistence
## Persistencia
{{#ref}}
../aws-persistence/aws-efs-persistence.md