mirror of
https://github.com/HackTricks-wiki/hacktricks-cloud.git
synced 2025-12-29 06:03:26 -08:00
Translated ['src/pentesting-cloud/aws-security/aws-services/aws-efs-enum
This commit is contained in:
@@ -6,7 +6,7 @@
|
||||
|
||||
### Grundlegende Informationen
|
||||
|
||||
Amazon Elastic File System (EFS) wird von AWS als ein **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 sind die Fähigkeit, automatisch ohne manuelles Eingreifen zu skalieren, einen latenzarmen Zugriff bereitzustellen, hochdurchsatzfähige Workloads zu unterstützen, die Datenhaltbarkeit zu garantieren und nahtlos mit verschiedenen AWS-Sicherheitsmechanismen zu integrieren.
|
||||
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.
|
||||
|
||||
@@ -14,7 +14,7 @@ Standardmäßig wird der EFS-Ordner, der gemountet werden soll, **`/`** sein, k
|
||||
|
||||
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 nicht in der Lage sein, den NFS-Dienst zu kontaktieren**.
|
||||
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](https://stackoverflow.com/questions/38632222/aws-efs-connection-timeout-at-mount)
|
||||
|
||||
@@ -57,7 +57,7 @@ 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.\
|
||||
Standardmäßig kann jeder mit Netzwerkzugang zum EFS es **einbinden, lesen und schreiben, sogar als Root-Benutzer**. Es könnten jedoch Dateisystemrichtlinien vorhanden sein, die **nur bestimmten Prinzipalen 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:
|
||||
```json
|
||||
{
|
||||
@@ -110,9 +110,107 @@ sudo mount -t efs -o tls,[iam],accesspoint=<access-point-id> \
|
||||
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 Wurzelverzeichnisses**: 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.
|
||||
- **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.
|
||||
```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}}
|
||||
|
||||
Reference in New Issue
Block a user