AWS - EFS Enum

Tip

Ucz się & ćwicz AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Ucz się & ćwicz GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Ucz się & ćwicz Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Wspieraj HackTricks

EFS

Podstawowe informacje

Amazon Elastic File System (EFS) jest przedstawiany jako w pełni zarządzany, skalowalny i elastyczny system plików sieciowych przez AWS. Usługa ułatwia tworzenie i konfigurowanie systemów plików, które mogą być jednocześnie dostępne przez wiele instancji EC2 i inne usługi AWS. Kluczowe cechy EFS obejmują jego zdolność do automatycznego skalowania bez interwencji ręcznej, zapewnianie dostępu o niskim opóźnieniu, wsparcie dla obciążeń o wysokiej przepustowości, gwarancję trwałości danych oraz bezproblemową integrację z różnymi mechanizmami bezpieczeństwa AWS.

Domyślnie folder EFS do zamontowania będzie /, ale może mieć inną nazwę.

Dostęp sieciowy

EFS jest tworzony w VPC i będzie domyślnie dostępny we wszystkich podsieciach VPC. Jednak EFS będzie miał Grupę Bezpieczeństwa. Aby dać dostęp do EC2 (lub jakiejkolwiek innej usługi AWS) do zamontowania EFS, należy zezwolić w grupie bezpieczeństwa EFS na przychodzącą regułę NFS (port 2049) z Grupy Bezpieczeństwa EC2.

Bez tego nie będziesz w stanie skontaktować się z usługą NFS.

Aby uzyskać więcej informacji na ten temat, sprawdź: https://stackoverflow.com/questions/38632222/aws-efs-connection-timeout-at-mount

Enumeracja

# 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

Może się zdarzyć, że punkt montowania EFS znajduje się w tej samej VPC, ale w innej podsieci. Jeśli chcesz mieć pewność, że znajdziesz wszystkie punkty EFS, lepiej zeskanować maskę sieciową /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

Domyślnie każdy, kto ma dostęp do sieci EFS, będzie mógł zamontować, czytać i pisać, nawet jako użytkownik root. Jednak polityki systemu plików mogą być wprowadzone, zezwalając tylko na dostęp dla podmiotów z określonymi uprawnieniami.
Na przykład, ta polityka systemu plików nie pozwoli nawet na zamontowanie systemu plików, jeśli nie masz uprawnienia 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"
}
}
}
]
}

Lub to zapobiegnie dostępowi anonimowemu:

Zauważ, że aby zamontować systemy plików chronione przez IAM, MUSISZ użyć typu “efs” w poleceniu montowania:

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

Punkty dostępu

Punkty dostępu to specyficzne dla aplikacji punkty wejścia do systemu plików EFS, które ułatwiają zarządzanie dostępem aplikacji do wspólnych zbiorów danych.

Kiedy tworzysz punkt dostępu, możesz określić właściciela i uprawnienia POSIX dla plików i katalogów tworzonych przez punkt dostępu. Możesz również zdefiniować niestandardowy katalog główny dla punktu dostępu, określając istniejący katalog lub tworząc nowy z pożądanymi uprawnieniami. Umożliwia to kontrolowanie dostępu do systemu plików EFS na poziomie aplikacji lub użytkownika, co ułatwia zarządzanie i zabezpieczanie wspólnych danych plikowych.

Możesz zamontować system plików z punktu dostępu za pomocą czegoś takiego:

# 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

Zauważ, że nawet próbując zamontować punkt dostępu, nadal musisz być w stanie skontaktować się z usługą NFS przez sieć, a jeśli EFS ma politykę systemu plików, potrzebujesz wystarczających uprawnień IAM, aby go zamontować.

Punkty dostępu mogą być używane do następujących celów:

  • Uproszczenie zarządzania uprawnieniami: Definiując użytkownika i grupę POSIX dla każdego punktu dostępu, możesz łatwo zarządzać uprawnieniami dostępu dla różnych aplikacji lub użytkowników bez modyfikowania uprawnień systemu plików.
  • Wymuszenie katalogu głównego: Punkty dostępu mogą ograniczać dostęp do konkretnego katalogu w systemie plików EFS, zapewniając, że każda aplikacja lub użytkownik działa w swoim wyznaczonym folderze. Pomaga to zapobiegać przypadkowemu ujawnieniu lub modyfikacji danych.
  • Łatwiejszy dostęp do systemu plików: Punkty dostępu mogą być powiązane z funkcją AWS Lambda lub zadaniem AWS Fargate, co upraszcza dostęp do systemu plików dla aplikacji bezserwerowych i konteneryzowanych.

Adres IP EFS

Korzystając z informacji związanych z adresem IP EFS, poniższy skrypt w Pythonie może pomóc w uzyskaniu szczegółów dotyczących systemu EFS. Informacje te są przydatne do budowania polecenia systemowego montowania lub przeprowadzania dalszej enumeracji z wiedzą o identyfikatorze podsieci. Dodatkowo skrypt pokazuje punkty dostępu, które mogą być cenne, gdy katalog główny lub główny ścieżka montowania jest ograniczona. W takich przypadkach punkty dostępu zapewniają alternatywne ścieżki do uzyskania dostępu do wrażliwych informacji.

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

AWS - EFS Privesc

Post Exploitation

AWS - EFS Post Exploitation

Persistence

AWS - EFS Persistence

Tip

Ucz się & ćwicz AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Ucz się & ćwicz GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Ucz się & ćwicz Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Wspieraj HackTricks