AWS - EFS Enum
Reading time: 8 minutes
tip
AWS 해킹 배우기 및 연습하기:HackTricks Training AWS Red Team Expert (ARTE)
GCP 해킹 배우기 및 연습하기: HackTricks Training GCP Red Team Expert (GRTE)
Azure 해킹 배우기 및 연습하기:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks 지원하기
- 구독 계획 확인하기!
- **💬 Discord 그룹 또는 텔레그램 그룹에 참여하거나 Twitter 🐦 @hacktricks_live를 팔로우하세요.
- HackTricks 및 HackTricks Cloud 깃허브 리포지토리에 PR을 제출하여 해킹 트릭을 공유하세요.
EFS
기본 정보
Amazon Elastic File System (EFS)는 AWS에 의해 완전 관리형, 확장 가능 및 탄력적인 네트워크 파일 시스템으로 제공됩니다. 이 서비스는 여러 EC2 인스턴스 및 기타 AWS 서비스가 동시에 접근할 수 있는 파일 시스템의 생성 및 구성을 용이하게 합니다. EFS의 주요 기능에는 수동 개입 없이 자동으로 확장할 수 있는 능력, 저지연 액세스 제공, 고처리량 작업 부하 지원, 데이터 내구성 보장, 다양한 AWS 보안 메커니즘과의 원활한 통합이 포함됩니다.
기본적으로, 마운트할 EFS 폴더는 **/
**이지만 다른 이름을 가질 수 있습니다.
네트워크 접근
EFS는 VPC 내에서 생성되며 기본적으로 모든 VPC 서브네트워크에서 접근 가능합니다. 그러나 EFS에는 보안 그룹이 있습니다. EFS를 마운트하기 위해 EC2(또는 다른 AWS 서비스)에 접근을 허용하려면, EFS 보안 그룹에서 EC2 보안 그룹으로부터의 인바운드 NFS(2049 포트) 규칙을 허용해야 합니다.
이것이 없으면 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에 대한 네트워크 접근 권한이 있는 누구나 이를 마운트하고, 루트 사용자로서 읽고 쓸 수 있습니다. 그러나 파일 시스템 정책이 설정되어 특정 권한이 있는 주체만 접근할 수 있도록 할 수 있습니다.
예를 들어, 이 파일 시스템 정책은 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
Access Points
Access points는 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 주소
EFS IP 주소와 관련된 정보를 사용하여, 다음의 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 해킹 배우기 및 연습하기:HackTricks Training AWS Red Team Expert (ARTE)
GCP 해킹 배우기 및 연습하기: HackTricks Training GCP Red Team Expert (GRTE)
Azure 해킹 배우기 및 연습하기:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks 지원하기
- 구독 계획 확인하기!
- **💬 Discord 그룹 또는 텔레그램 그룹에 참여하거나 Twitter 🐦 @hacktricks_live를 팔로우하세요.
- HackTricks 및 HackTricks Cloud 깃허브 리포지토리에 PR을 제출하여 해킹 트릭을 공유하세요.