mirror of
https://github.com/HackTricks-wiki/hacktricks-cloud.git
synced 2026-07-28 22:51:09 -07:00
Translated ['src/pentesting-cloud/aws-security/aws-services/aws-efs-enum
This commit is contained in:
@@ -10,9 +10,9 @@ Amazon Elastic File System (EFS)는 AWS에 의해 **완전 관리형, 확장 가
|
||||
|
||||
**기본적으로**, 마운트할 EFS 폴더는 **`/`**이지만 **다른 이름**을 가질 수 있습니다.
|
||||
|
||||
### 네트워크 액세스
|
||||
### 네트워크 접근
|
||||
|
||||
EFS는 VPC에서 생성되며 **기본적으로 모든 VPC 서브네트워크에서 접근할 수 있습니다**. 그러나 EFS는 보안 그룹을 가집니다. EFS를 마운트하기 위해 **EC2**(또는 다른 AWS 서비스)에 액세스를 제공하려면, **EFS 보안 그룹에서 EC2 보안 그룹으로부터의 인바운드 NFS**(2049 포트) **규칙을 허용해야 합니다**.
|
||||
EFS는 VPC 내에서 생성되며 **기본적으로 모든 VPC 서브네트워크에서 접근 가능**합니다. 그러나 EFS에는 보안 그룹이 있습니다. EFS를 마운트하기 위해 **EC2**(또는 다른 AWS 서비스)에 접근을 허용하려면, **EFS 보안 그룹에서 EC2 보안 그룹으로의 인바운드 NFS**(2049 포트) **규칙을 허용해야** 합니다.
|
||||
|
||||
이것이 없으면 **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]
|
||||
> EFS 마운트 포인트가 동일한 VPC 내에 있지만 다른 서브넷에 있을 수 있습니다. 모든 **EFS 포인트를 찾으려면 `/16` 넷마스크를 스캔하는 것이 좋습니다**.
|
||||
> EFS 마운트 포인트가 같은 VPC 내에 있지만 다른 서브넷에 있을 수 있습니다. 모든 **EFS 포인트를 찾으려면 `/16` 넷마스크를 스캔하는 것이 좋습니다**.
|
||||
|
||||
### EFS 마운트
|
||||
### Mount EFS
|
||||
```bash
|
||||
sudo mkdir /efs
|
||||
|
||||
@@ -55,10 +55,10 @@ 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 접근
|
||||
### IAM Access
|
||||
|
||||
기본적으로 EFS에 대한 네트워크 접근 권한이 있는 누구나 **마운트하고, 읽고 쓸 수 있으며, 루트 사용자로도 가능합니다**. 그러나 파일 시스템 정책이 설정되어 **특정 권한을 가진 주체만 접근할 수 있도록** 할 수 있습니다.\
|
||||
예를 들어, 이 파일 시스템 정책은 **IAM 권한이 없으면** 파일 시스템을 **마운트하는 것도 허용하지 않습니다**:
|
||||
기본적으로 EFS에 대한 네트워크 접근 권한이 있는 누구나 **마운트하고, 읽고 쓸 수 있으며, 심지어 루트 사용자로도** 가능합니다. 그러나 파일 시스템 정책이 설정되어 **특정 권한을 가진 주체만 접근할 수 있도록** 할 수 있습니다.\
|
||||
예를 들어, 이 파일 시스템 정책은 **IAM 권한이 없으면** 파일 시스템을 **마운트하는 것조차 허용하지 않습니다**:
|
||||
```json
|
||||
{
|
||||
"Version": "2012-10-17",
|
||||
@@ -94,38 +94,136 @@ sudo mount -t efs -o tls,iam <file-system-id/EFS DNS name>:/ /efs/
|
||||
```
|
||||
### Access Points
|
||||
|
||||
**액세스 포인트**는 **EFS 파일 시스템**에 대한 **애플리케이션** 특정 진입점으로, 애플리케이션이 공유 데이터 세트에 접근하는 것을 더 쉽게 관리할 수 있게 해줍니다.
|
||||
**Access points**는 **EFS 파일 시스템**에 대한 **애플리케이션**-특정 진입점으로, 애플리케이션이 공유 데이터 세트에 접근하는 것을 더 쉽게 관리할 수 있게 해줍니다.
|
||||
|
||||
액세스 포인트를 생성할 때, 액세스 포인트를 통해 생성된 파일 및 디렉토리에 대한 **소유자 및 POSIX 권한**을 **지정할 수 있습니다**. 또한, 기존 디렉토리를 지정하거나 원하는 권한으로 새 디렉토리를 생성하여 액세스 포인트에 대한 **사용자 정의 루트 디렉토리**를 **정의할 수 있습니다**. 이를 통해 **애플리케이션 또는 사용자별로 EFS 파일 시스템에 대한 접근을 제어**할 수 있어, 공유 파일 데이터를 더 쉽게 관리하고 보호할 수 있습니다.
|
||||
액세스 포인트를 생성할 때, 액세스 포인트를 통해 생성된 파일 및 디렉토리에 대한 **소유자 및 POSIX 권한**을 **지정할 수** 있습니다. 또한, **기존 디렉토리를 지정하거나 원하는 권한으로 새 디렉토리를 생성하여** 액세스 포인트에 대한 **사용자 정의 루트 디렉토리**를 **정의할 수** 있습니다. 이를 통해 **애플리케이션별 또는 사용자별로 EFS 파일 시스템에 대한 접근을 제어**할 수 있어, 공유 파일 데이터를 더 쉽게 관리하고 보호할 수 있습니다.
|
||||
|
||||
**액세스 포인트에서 파일 시스템을 다음과 같이 마운트할 수 있습니다:**
|
||||
**다음과 같은 방법으로 액세스 포인트에서 파일 시스템을 마운트할 수 있습니다:**
|
||||
```bash
|
||||
# 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 권한**이 필요하다는 점에 유의하세요.
|
||||
> NFS 서비스를 **네트워크를 통해 연락할 수 있어야** 하며, EFS에 파일 시스템 **정책**이 있는 경우, 이를 마운트하기 위해 **충분한 IAM 권한**이 필요하다는 점에 유의하십시오.
|
||||
|
||||
액세스 포인트는 다음과 같은 용도로 사용될 수 있습니다:
|
||||
|
||||
- **권한 관리 단순화**: 각 액세스 포인트에 대해 POSIX 사용자 및 그룹을 정의함으로써, 기본 파일 시스템의 권한을 수정하지 않고도 다양한 애플리케이션이나 사용자에 대한 접근 권한을 쉽게 관리할 수 있습니다.
|
||||
- **루트 디렉터리 강제 적용**: 액세스 포인트는 EFS 파일 시스템 내의 특정 디렉터리에 대한 접근을 제한할 수 있어, 각 애플리케이션이나 사용자가 지정된 폴더 내에서 작업하도록 보장합니다. 이는 우발적인 데이터 노출이나 수정을 방지하는 데 도움이 됩니다.
|
||||
- **파일 시스템 접근 용이성**: 액세스 포인트는 AWS Lambda 함수나 AWS Fargate 작업과 연결될 수 있어, 서버리스 및 컨테이너화된 애플리케이션에 대한 파일 시스템 접근을 단순화합니다.
|
||||
- **루트 디렉토리 강제**: 액세스 포인트는 EFS 파일 시스템 내의 특정 디렉토리에 대한 접근을 제한할 수 있어, 각 애플리케이션이나 사용자가 지정된 폴더 내에서 작업하도록 보장합니다. 이는 우발적인 데이터 노출이나 수정을 방지하는 데 도움이 됩니다.
|
||||
- **파일 시스템 접근 용이**: 액세스 포인트는 AWS Lambda 함수나 AWS Fargate 작업과 연결될 수 있어, 서버리스 및 컨테이너화된 애플리케이션에 대한 파일 시스템 접근을 단순화합니다.
|
||||
|
||||
## Privesc
|
||||
## EFS IP 주소
|
||||
|
||||
EFS IP 주소와 관련된 정보를 사용하여, 다음의 Python 스크립트는 EFS 시스템에 대한 세부 정보를 검색하는 데 도움을 줄 수 있습니다. 이 정보는 마운트 시스템 명령을 구축하거나 서브넷 ID에 대한 지식을 바탕으로 추가 열거를 수행하는 데 유용합니다. 또한, 스크립트는 액세스 포인트를 보여주며, 이는 루트 디렉토리나 주요 마운트 경로가 제한된 경우에 유용할 수 있습니다. 이러한 경우, 액세스 포인트는 민감한 정보에 접근할 수 있는 대체 경로를 제공합니다.
|
||||
```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)
|
||||
|
||||
```
|
||||
## 프라이벡스
|
||||
|
||||
{{#ref}}
|
||||
../aws-privilege-escalation/aws-efs-privesc.md
|
||||
{{#endref}}
|
||||
|
||||
## Post Exploitation
|
||||
## 포스트 익스플로이테이션
|
||||
|
||||
{{#ref}}
|
||||
../aws-post-exploitation/aws-efs-post-exploitation.md
|
||||
{{#endref}}
|
||||
|
||||
## Persistence
|
||||
## 지속성
|
||||
|
||||
{{#ref}}
|
||||
../aws-persistence/aws-efs-persistence.md
|
||||
|
||||
Reference in New Issue
Block a user