AWS - EFS Enum

Reading time: 9 minutes

tip

Impara e pratica il hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica il hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Impara e pratica il hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Supporta HackTricks

EFS

Informazioni di base

Amazon Elastic File System (EFS) è presentato come un sistema di file di rete completamente gestito, scalabile ed elastico da AWS. Il servizio facilita la creazione e la configurazione di sistemi di file che possono essere accessibili contemporaneamente da più istanze EC2 e altri servizi AWS. Le caratteristiche principali di EFS includono la sua capacità di scalare automaticamente senza intervento manuale, fornire accesso a bassa latenza, supportare carichi di lavoro ad alta capacità, garantire la durabilità dei dati e integrarsi senza problemi con vari meccanismi di sicurezza AWS.

Per definizione, la cartella EFS da montare sarà / ma potrebbe avere un nome diverso.

Accesso alla rete

Un EFS è creato in una VPC e sarebbe per impostazione predefinita accessibile in tutte le sottoreti VPC. Tuttavia, l'EFS avrà un Gruppo di Sicurezza. Per dare accesso a un EC2 (o a qualsiasi altro servizio AWS) per montare l'EFS, è necessario consentire nel gruppo di sicurezza EFS una regola NFS in entrata (porta 2049) dal Gruppo di Sicurezza EC2.

Senza questo, non sarai in grado di contattare il servizio NFS.

Per ulteriori informazioni su come fare questo controlla: https://stackoverflow.com/questions/38632222/aws-efs-connection-timeout-at-mount

Enumerazione

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

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 la /16 netmask.

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

Per definizione, chiunque abbia accesso alla rete per l'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
{
"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"
}
}
}
]
}

Oppure questo prevenirà l'accesso anonimo:

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  <file-system-id/EFS DNS name>:/ /efs/
# To use a different pforile from ~/.aws/credentials
# You can use: -o tls,iam,awsprofile=namedprofile

Punti di Accesso

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.

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:

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

Nota che anche cercando di montare un access point devi comunque essere in grado di contattare il servizio NFS tramite rete, e se l'EFS ha una policy del file system, hai bisogno di sufficienti permessi IAM per montarlo.

Gli access point possono essere utilizzati per i seguenti scopi:

  • Semplificare la gestione dei permessi: Definendo un utente e un gruppo POSIX per ogni access point, puoi gestire facilmente i permessi di accesso per diverse applicazioni o utenti senza modificare i permessi del file system sottostante.
  • 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 accidentali o modifiche ai 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 è limitato. In tali casi, gli access point forniscono percorsi alternativi per accedere a informazioni sensibili.

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

AWS - EFS Privesc

Post Exploitation

AWS - EFS Post Exploitation

Persistence

AWS - EFS Persistence

tip

Impara e pratica il hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica il hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Impara e pratica il hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Supporta HackTricks