AWS - EFS Enum
Reading time: 9 minutes
tip
Lernen & üben Sie AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Lernen & üben Sie GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Lernen & üben Sie Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Unterstützen Sie HackTricks
- Überprüfen Sie die Abonnementpläne!
- Treten Sie der 💬 Discord-Gruppe oder der Telegram-Gruppe bei oder folgen Sie uns auf Twitter 🐦 @hacktricks_live.
- Teilen Sie Hacking-Tricks, indem Sie PRs an die HackTricks und HackTricks Cloud GitHub-Repos senden.
EFS
Grundlegende Informationen
Amazon Elastic File System (EFS) wird von AWS als vollständig verwaltetes, skalierbares und elastisches Netzwerkdateisystem präsentiert. Der Dienst erleichtert die Erstellung und Konfiguration von Dateisystemen, die gleichzeitig von mehreren EC2-Instanzen und anderen AWS-Diensten zugegriffen werden können. Die Hauptmerkmale von EFS umfassen die Fähigkeit, automatisch ohne manuelles Eingreifen zu skalieren, einen latenzarmen Zugriff bereitzustellen, hochdurchsatzfähige Workloads zu unterstützen, Datenhaltbarkeit zu garantieren und nahtlos mit verschiedenen AWS-Sicherheitsmechanismen zu integrieren.
Standardmäßig wird der EFS-Ordner, der gemountet werden soll, /
sein, könnte jedoch einen anderen Namen haben.
Netzwerkzugang
Ein EFS wird in einer VPC erstellt und wäre standardmäßig in allen VPC-Subnetzen zugänglich. Der EFS wird jedoch eine Sicherheitsgruppe haben. Um einem EC2 (oder einem anderen AWS-Dienst) den Zugriff auf das Mounten des EFS zu gewähren, ist es erforderlich, in der EFS-Sicherheitsgruppe eine eingehende NFS (Port 2049) Regel von der EC2-Sicherheitsgruppe zuzulassen.
Ohne dies werden Sie den NFS-Dienst nicht kontaktieren können.
Für weitere Informationen darüber, wie dies zu tun ist, siehe: https://stackoverflow.com/questions/38632222/aws-efs-connection-timeout-at-mount
Aufzählung
# 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
Es könnte sein, dass der EFS-Mountpunkt im selben VPC, aber in einem anderen Subnetz ist. Wenn Sie sicherstellen möchten, dass Sie alle EFS-Punkte finden, wäre es besser, die /16
-Netzmaske zu scannen.
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-Zugriff
Standardmäßig kann jeder mit Netzwerkzugang zum EFS das Dateisystem einbinden, lesen und schreiben, sogar als Root-Benutzer. Es könnten jedoch Dateisystemrichtlinien vorhanden sein, die nur bestimmten Benutzern mit spezifischen Berechtigungen den Zugriff erlauben.
Zum Beispiel wird diese Dateisystemrichtlinie nicht einmal das Einbinden des Dateisystems erlauben, wenn Sie nicht die IAM-Berechtigung haben:
{
"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"
}
}
}
]
}
Oder dies wird anonymen Zugriff verhindern:
.png)
Beachten Sie, dass Sie zum Einhängen von Dateisystemen, die durch IAM geschützt sind, den Typ "efs" im Einhängebefehl verwenden MÜSSEN:
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
Zugriffspunkte
Zugriffspunkte sind anwendungsspezifische Einstiegspunkte in ein EFS-Dateisystem, die es einfacher machen, den Anwendungszugriff auf gemeinsame Datensätze zu verwalten.
Wenn Sie einen Zugriffspunkt erstellen, können Sie den Eigentümer und die POSIX-Berechtigungen für die Dateien und Verzeichnisse, die über den Zugriffspunkt erstellt werden, spezifizieren. Sie können auch ein benutzerdefiniertes Stammverzeichnis für den Zugriffspunkt definieren, entweder indem Sie ein vorhandenes Verzeichnis angeben oder ein neues mit den gewünschten Berechtigungen erstellen. Dies ermöglicht es Ihnen, den Zugriff auf Ihr EFS-Dateisystem auf Anwendungs- oder Benutzerebene zu steuern, was die Verwaltung und Sicherung Ihrer gemeinsamen Dateidaten erleichtert.
Sie können das Dateisystem von einem Zugriffspunkt mit etwas wie:
# 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
Beachten Sie, dass Sie selbst beim Versuch, einen Zugriffspunkt zu mounten, in der Lage sein müssen, den NFS-Dienst über das Netzwerk zu kontaktieren, und wenn das EFS eine Richtlinie für das Dateisystem hat, benötigen Sie ausreichende IAM-Berechtigungen, um es zu mounten.
Zugriffspunkte können für die folgenden Zwecke verwendet werden:
- Vereinfachung der Berechtigungsverwaltung: Durch die Definition eines POSIX-Benutzers und einer Gruppe für jeden Zugriffspunkt können Sie die Zugriffsberechtigungen für verschiedene Anwendungen oder Benutzer einfach verwalten, ohne die Berechtigungen des zugrunde liegenden Dateisystems zu ändern.
- Durchsetzung eines Stammverzeichnisses: Zugriffspunkte können den Zugriff auf ein bestimmtes Verzeichnis innerhalb des EFS-Dateisystems einschränken, sodass jede Anwendung oder jeder Benutzer innerhalb seines zugewiesenen Ordners arbeitet. Dies hilft, versehentliche Datenexposition oder -änderung zu verhindern.
- Einfacherer Zugriff auf das Dateisystem: Zugriffspunkte können mit einer AWS Lambda-Funktion oder einer AWS Fargate-Aufgabe verknüpft werden, was den Zugriff auf das Dateisystem für serverlose und containerisierte Anwendungen vereinfacht.
EFS-IP-Adresse
Mit den Informationen zur EFS-IP-Adresse kann das folgende Python-Skript dabei helfen, Details über das EFS-System abzurufen. Diese Informationen sind nützlich, um den Mount-Systembefehl zu erstellen oder weitere Enumeration mit Kenntnis der Subnetz-ID durchzuführen. Darüber hinaus zeigt das Skript Zugriffspunkte an, die wertvoll sein können, wenn das Stammverzeichnis oder der primäre Mount-Pfad eingeschränkt ist. In solchen Fällen bieten die Zugriffspunkte alternative Pfade, um auf sensible Informationen zuzugreifen.
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
Post Exploitation
Persistence
tip
Lernen & üben Sie AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Lernen & üben Sie GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Lernen & üben Sie Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Unterstützen Sie HackTricks
- Überprüfen Sie die Abonnementpläne!
- Treten Sie der 💬 Discord-Gruppe oder der Telegram-Gruppe bei oder folgen Sie uns auf Twitter 🐦 @hacktricks_live.
- Teilen Sie Hacking-Tricks, indem Sie PRs an die HackTricks und HackTricks Cloud GitHub-Repos senden.