# AWS - EFS Enum

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

## EFS

### Informations de base

Amazon Elastic File System (EFS) est présenté comme un **système de fichiers réseau entièrement géré, évolutif et élastique** par AWS. Le service facilite la création et la configuration de **systèmes de fichiers** qui peuvent être accessibles simultanément par plusieurs instances EC2 et d'autres services AWS. Les principales caractéristiques d'EFS incluent sa capacité à évoluer automatiquement sans intervention manuelle, à fournir un accès à faible latence, à prendre en charge des charges de travail à haut débit, à garantir la durabilité des données et à s'intégrer parfaitement à divers mécanismes de sécurité AWS.

Par **défaut**, le dossier EFS à monter sera **`/`** mais il pourrait avoir un **nom différent**.

### Accès réseau

Un EFS est créé dans un VPC et serait **par défaut accessible dans tous les sous-réseaux VPC**. Cependant, l'EFS aura un groupe de sécurité. Afin de **donner accès à un EC2** (ou tout autre service AWS) pour monter l'EFS, il est nécessaire de **permettre dans le groupe de sécurité EFS une règle NFS entrante** (port 2049) **en provenance du groupe de sécurité EC2**.

Sans cela, vous **ne pourrez pas contacter le service NFS**.

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
# 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]
> 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`**.

### Mount EFS
```bash
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

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** :
```json
{
"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"
}
}
}
]
}
```
Ou cela **empêchera l'accès anonyme** :

<figure><img src="../../../images/image (278).png" alt=""><figcaption></figcaption></figure>

Notez que pour monter des systèmes de fichiers protégés par IAM, vous DEVEZ utiliser le type "efs" dans la commande de montage :
```bash
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
```
### Points d'accès

**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 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
# 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]
> Notez qu'en essayant de monter un point d'accès, vous devez toujours être en mesure de **contacter le service NFS via le réseau**, et si l'EFS a une **politique** de système de fichiers, vous avez besoin de **suffisantes autorisations IAM** pour le monter.

Les points d'accès peuvent être utilisés pour les objectifs suivants :

- **Simplifier la gestion des autorisations** : En définissant un utilisateur et un groupe POSIX pour chaque point d'accès, vous pouvez facilement gérer les autorisations d'accès pour différentes applications ou utilisateurs sans modifier les autorisations du système de fichiers sous-jacent.
- **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, qui peuvent ê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 <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}}
../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}}
