AWS - EFS Enum
Reading time: 8 minutes
tip
Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Вивчайте та практикуйте Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Підтримка HackTricks
- Перевірте плани підписки!
- Приєднуйтесь до 💬 групи Discord або групи Telegram або слідкуйте за нами в Twitter 🐦 @hacktricks_live.
- Діліться хакерськими трюками, надсилаючи PR до HackTricks та HackTricks Cloud репозиторіїв на GitHub.
EFS
Основна інформація
Amazon Elastic File System (EFS) представлений як повністю керована, масштабована та еластична мережна файлова система від AWS. Сервіс полегшує створення та налаштування файлових систем, до яких можуть одночасно отримувати доступ кілька EC2 екземплярів та інших сервісів AWS. Ключові особливості EFS включають його здатність автоматично масштабуватися без ручного втручання, забезпечувати доступ з низькою затримкою, підтримувати навантаження з високою пропускною здатністю, гарантувати довговічність даних та безперешкодно інтегруватися з різними механізмами безпеки AWS.
За замовчуванням, папка EFS для монтування буде /
, але вона може мати іншу назву.
Мережевий доступ
EFS створюється в VPC і буде за замовчуванням доступний у всіх підмережах VPC. Однак EFS матиме групу безпеки. Щоб надати доступ EC2 (або будь-якому іншому сервісу AWS) для монтування EFS, потрібно дозволити в групі безпеки EFS вхідне правило NFS (порт 2049) з групи безпеки EC2.
Без цього ви не зможете зв'язатися з NFS сервісом.
Для отримання додаткової інформації про те, як це зробити, перегляньте: https://stackoverflow.com/questions/38632222/aws-efs-connection-timeout-at-mount
Перерахування
# 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 знаходиться в тій же VPC, але в іншій підмережі. Якщо ви хочете бути впевненими, що знайдете всі точки EFS, краще просканувати мережу з маскою /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
За замовчуванням будь-хто з мережевим доступом до EFS зможе монтувати, читати та писати його навіть як користувач root. Однак, політики файлової системи можуть бути встановлені, дозволяючи доступ лише принципалам з конкретними дозволами.
Наприклад, ця політика файлової системи не дозволить навіть змонтувати файлову систему, якщо ви не маєте дозволу 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"
}
}
}
]
}
Або це запобігатиме анонімному доступу:
.png)
Зверніть увагу, що для монтування файлових систем, захищених IAM, ВИ ПОВИННІ використовувати тип "efs" у команді монтування:
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
Точки доступу
Точки доступу є специфічними для застосунку точками входу в EFS файлову систему, які спрощують управління доступом застосунків до спільних наборів даних.
Коли ви створюєте точку доступу, ви можете вказати власника та POSIX дозволи для файлів і каталогів, створених через точку доступу. Ви також можете визначити власний кореневий каталог для точки доступу, вказавши існуючий каталог або створивши новий з бажаними дозволами. Це дозволяє вам контролювати доступ до вашої EFS файлової системи на основі застосунку або користувача, що спрощує управління та захист ваших спільних файлових даних.
Ви можете змонтувати файлову систему з точки доступу за допомогою чогось на кшталт:
# 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
Зверніть увагу, що навіть намагаючись змонтувати точку доступу, вам все ще потрібно зв'язатися з NFS-сервісом через мережу, і якщо у EFS є політика файлової системи, вам потрібні достатні IAM дозволи для її монтування.
Точки доступу можуть використовуватися для наступних цілей:
- Спрощення управління дозволами: Визначивши POSIX користувача та групу для кожної точки доступу, ви можете легко керувати дозволами доступу для різних додатків або користувачів, не змінюючи дозволи основної файлової системи.
- Забезпечення кореневої директорії: Точки доступу можуть обмежувати доступ до конкретної директорії в файловій системі EFS, забезпечуючи, щоб кожен додаток або користувач працював у своїй призначеній папці. Це допомагає запобігти випадковому витоку або модифікації даних.
- Легший доступ до файлової системи: Точки доступу можуть бути асоційовані з функцією AWS Lambda або завданням AWS Fargate, спрощуючи доступ до файлової системи для безсерверних і контейнеризованих додатків.
EFS IP адреса
Використовуючи інформацію, пов'язану з IP адресою EFS, наступний скрипт Python може допомогти у отриманні деталей про систему EFS. Ця інформація корисна для побудови команди системи монтування або виконання подальшої енумерації з знанням ID підмережі. Крім того, скрипт показує точки доступу, які можуть бути цінними, коли коренева директорія або основний шлях монтування обмежені. У таких випадках точки доступу надають альтернативні шляхи для доступу до чутливої інформації.
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)
Привілегії
Після експлуатації
Постійність
tip
Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Вивчайте та практикуйте Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Підтримка HackTricks
- Перевірте плани підписки!
- Приєднуйтесь до 💬 групи Discord або групи Telegram або слідкуйте за нами в Twitter 🐦 @hacktricks_live.
- Діліться хакерськими трюками, надсилаючи PR до HackTricks та HackTricks Cloud репозиторіїв на GitHub.