Translated ['src/pentesting-cloud/aws-security/aws-services/aws-efs-enum

This commit is contained in:
Translator
2025-02-02 18:22:51 +00:00
parent fbca9c5f9a
commit 444430e872
@@ -6,13 +6,13 @@
### 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.
Amazon Elastic File System (EFS) jest przedstawiany jako **w pełni zarządzany, skalowalny i elastyczny system plików w sieci** 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 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**.
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 regułę przychodzącą NFS** (port 2049) **z Grupy Bezpieczeństwa EC2**.
Bez tego **nie będziesz w stanie skontaktować się z usługą NFS**.
@@ -39,9 +39,9 @@ aws efs describe-replication-configurations
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 byłoby przeskanować maskę sieciową `/16`**.
> 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`**.
### Montowanie EFS
### Mount EFS
```bash
sudo mkdir /efs
@@ -96,7 +96,7 @@ sudo mount -t efs -o tls,iam <file-system-id/EFS DNS name>:/ /efs/
**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, albo poprzez określenie istniejącego katalogu, albo poprzez utworzenie nowego 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.
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:**
```bash
@@ -113,6 +113,104 @@ Punkty dostępu mogą być używane do następujących celó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.
```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}}