AWS - EFS Enum
Tip
AWS Hacking’i öğrenin ve pratik yapın:
HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking’i öğrenin ve pratik yapın:HackTricks Training GCP Red Team Expert (GRTE)
Az Hacking’i öğrenin ve pratik yapın:HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks'i Destekleyin
- Abonelik planlarını kontrol edin!
- Katılın 💬 Discord group veya telegram group veya Twitter’da bizi takip edin 🐦 @hacktricks_live.
- PR göndererek hacking tricks paylaşın: HackTricks ve HackTricks Cloud github repos.
EFS
Temel Bilgiler
Amazon Elastic File System (EFS), AWS tarafından tamamen yönetilen, ölçeklenebilir ve elastik bir ağ dosya sistemi olarak sunulmaktadır. Bu hizmet, birden fazla EC2 örneği ve diğer AWS hizmetleri tarafından eşzamanlı olarak erişilebilen dosya sistemleri oluşturmayı ve yapılandırmayı kolaylaştırır. EFS’nin ana özellikleri arasında, manuel müdahale olmadan otomatik olarak ölçeklenme, düşük gecikme süresi erişimi sağlama, yüksek verimlilikte iş yüklerini destekleme, veri dayanıklılığını garanti etme ve çeşitli AWS güvenlik mekanizmalarıyla sorunsuz entegrasyon yer almaktadır.
Varsayılan olarak, bağlanacak EFS klasörü / olacaktır, ancak farklı bir adı olabilir.
Ağ Erişimi
Bir EFS, bir VPC içinde oluşturulur ve varsayılan olarak tüm VPC alt ağlarında erişilebilir olacaktır. Ancak, EFS’nin bir Güvenlik Grubu olacaktır. EFS’yi bağlamak için bir EC2’ye (veya başka bir AWS hizmetine) erişim vermek için, EFS güvenlik grubunda EC2 Güvenlik Grubundan gelen bir NFS (2049 portu) kuralının izin verilmesi gerekir.
Bunu yapmadan, NFS hizmetiyle iletişim kuramazsınız.
Bunu nasıl yapacağınız hakkında daha fazla bilgi için kontrol edin: https://stackoverflow.com/questions/38632222/aws-efs-connection-timeout-at-mount
Sayım
# 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
EFS montaj noktasının aynı VPC içinde ancak farklı bir alt ağda olabileceği ihtimali vardır. Tüm EFS noktalarını bulmak istiyorsanız
/16ağ maskesini taramak daha iyi olacaktır.
EFS’yi Montajla
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 Erişimi
Varsayılan olarak, EFS’ye ağ erişimi olan herkes, kök kullanıcı olarak bile onu bağlayabilir, okuyabilir ve yazabilir. Ancak, Dosya Sistemi politikaları, sadece belirli izinlere sahip ilkelerin erişimine izin verecek şekilde uygulanabilir.
Örneğin, bu Dosya Sistemi politikası, IAM izniniz yoksa dosya sistemini bağlamanıza bile izin vermeyecektir:
{
"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"
}
}
}
]
}
Ya da bu anonim erişimi engelleyecektir:
.png)
IAM ile korunan dosya sistemlerini bağlamak için mount komutunda “efs” türünü KULLANMAK ZORUNDASINIZ:
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
Erişim Noktaları
Erişim noktaları, paylaşılan veri setlerine uygulama erişimini yönetmeyi kolaylaştıran EFS dosya sistemine özgü giriş noktalarıdır.
Bir erişim noktası oluşturduğunuzda, erişim noktası aracılığıyla oluşturulan dosyalar ve dizinler için sahibi ve POSIX izinlerini belirtebilirsiniz. Ayrıca, erişim noktası için özel bir kök dizin tanımlayabilirsiniz, mevcut bir dizini belirterek veya istenen izinlerle yeni bir tane oluşturarak. Bu, EFS dosya sisteminize uygulama veya kullanıcı bazında erişimi kontrol etmenizi sağlar ve paylaşılan dosya verilerinizi yönetmeyi ve güvence altına almayı kolaylaştırır.
Erişim noktasından dosya sistemini şu şekilde bağlayabilirsiniz:
# 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
Erişim noktasını monte etmeye çalışsanız bile, ağ üzerinden NFS hizmeti ile iletişim kurabilmeniz gerektiğini ve EFS’nin bir dosya sistemi politikası varsa, monte etmek için yeterli IAM izinlerine sahip olmanız gerektiğini unutmayın.
Erişim noktaları aşağıdaki amaçlar için kullanılabilir:
- İzin yönetimini basitleştirme: Her erişim noktası için bir POSIX kullanıcı ve grubu tanımlayarak, temel dosya sisteminin izinlerini değiştirmeden farklı uygulamalar veya kullanıcılar için erişim izinlerini kolayca yönetebilirsiniz.
- Kök dizini zorunlu kılma: Erişim noktaları, EFS dosya sistemi içinde belirli bir dizine erişimi kısıtlayabilir, böylece her uygulama veya kullanıcı kendi belirlenen klasörü içinde çalışır. Bu, kazara veri ifşası veya değiştirilmesini önlemeye yardımcı olur.
- Dosya sistemi erişimini kolaylaştırma: Erişim noktaları, bir AWS Lambda işlevi veya bir AWS Fargate görevi ile ilişkilendirilebilir, bu da sunucusuz ve konteynerleştirilmiş uygulamalar için dosya sistemi erişimini basitleştirir.
EFS IP adresi
EFS IP adresi ile ilgili bilgileri kullanarak, aşağıdaki Python betiği EFS sistemi hakkında ayrıntıları almanıza yardımcı olabilir. Bu bilgi, montaj sistemi komutunu oluşturmak veya alt ağ kimliği bilgisi ile daha fazla sayım yapmak için yararlıdır. Ayrıca, betik erişim noktalarını gösterir; bu, kök dizin veya ana montaj yolu kısıtlandığında değerli olabilir. Bu tür durumlarda, erişim noktaları hassas bilgilere erişim sağlamak için alternatif yollar sunar.
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
AWS Hacking’i öğrenin ve pratik yapın:
HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking’i öğrenin ve pratik yapın:HackTricks Training GCP Red Team Expert (GRTE)
Az Hacking’i öğrenin ve pratik yapın:HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks'i Destekleyin
- Abonelik planlarını kontrol edin!
- Katılın 💬 Discord group veya telegram group veya Twitter’da bizi takip edin 🐦 @hacktricks_live.
- PR göndererek hacking tricks paylaşın: HackTricks ve HackTricks Cloud github repos.
HackTricks Cloud

