diff --git a/src/pentesting-cloud/aws-security/aws-services/aws-efs-enum.md b/src/pentesting-cloud/aws-security/aws-services/aws-efs-enum.md index 9cfa0b2bb..520ddb6c8 100644 --- a/src/pentesting-cloud/aws-security/aws-services/aws-efs-enum.md +++ b/src/pentesting-cloud/aws-security/aws-services/aws-efs-enum.md @@ -12,11 +12,11 @@ Amazon Elastic File System (EFS) は、AWS によって **完全に管理され ### ネットワークアクセス -EFS は VPC 内に作成され、**デフォルトではすべての VPC サブネットワークでアクセス可能**です。ただし、EFS にはセキュリティグループがあります。EFS をマウントするために **EC2**(または他の AWS サービス)にアクセスを許可するには、EFS セキュリティグループに EC2 セキュリティグループからのインバウンド NFS**(ポート 2049)**ルールを **許可する必要があります**。 +EFS は VPC 内に作成され、**デフォルトではすべての VPC サブネットワークでアクセス可能**です。ただし、EFS にはセキュリティグループがあります。EFS をマウントするために **EC2**(または他の AWS サービス)にアクセスを許可するには、EFS セキュリティグループに EC2 セキュリティグループからのインバウンド NFS**(ポート 2049)**ルールを**許可する必要があります。 -これがないと、**NFS サービスに接続できません**。 +これがないと、**NFS サービスに連絡できません**。 -これを行う方法の詳細については、次を確認してください: [https://stackoverflow.com/questions/38632222/aws-efs-connection-timeout-at-mount](https://stackoverflow.com/questions/38632222/aws-efs-connection-timeout-at-mount) +この方法についての詳細は、次を確認してください: [https://stackoverflow.com/questions/38632222/aws-efs-connection-timeout-at-mount](https://stackoverflow.com/questions/38632222/aws-efs-connection-timeout-at-mount) ### 列挙 ```bash @@ -39,7 +39,7 @@ 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`ネットマスクをスキャンする方が良いでしょう**。 ### Mount EFS ```bash @@ -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 :/ /efs/ ``` -### IAMアクセス +### IAM アクセス **デフォルト**では、**EFSへのネットワークアクセスを持つ誰でも**マウントし、**ルートユーザーとして読み書きすることができます**。ただし、ファイルシステムポリシーが設定されている場合、**特定の権限を持つプリンシパルのみがアクセスできる**ことがあります。\ -例えば、このファイルシステムポリシーは、**IAM権限を持っていない場合**、ファイルシステムを**マウントさせない**ことがあります: +例えば、このファイルシステムポリシーは、**IAM権限を持っていない場合、**ファイルシステムを**マウントすることすら許可しません**: ```json { "Version": "2012-10-17", @@ -94,38 +94,136 @@ sudo mount -t efs -o tls,iam :/ /efs/ ``` ### アクセスポイント -**アクセスポイント**は、**EFSファイルシステム**への**アプリケーション**特有のエントリーポイントであり、アプリケーションが共有データセットにアクセスするのを容易にします。 +**アクセスポイント**は、**EFSファイルシステム**への**アプリケーション**特有のエントリーポイントであり、共有データセットへのアプリケーションアクセスを管理しやすくします。 -アクセスポイントを作成すると、アクセスポイントを通じて作成されるファイルやディレクトリの所有者とPOSIX権限を**指定**できます。また、既存のディレクトリを指定するか、希望する権限で新しいディレクトリを作成することで、アクセスポイントの**カスタムルートディレクトリ**を**定義**することもできます。これにより、アプリケーションまたはユーザーごとにEFSファイルシステムへのアクセスを**制御**でき、共有ファイルデータの管理とセキュリティが容易になります。 +アクセスポイントを作成すると、アクセスポイントを通じて作成されるファイルやディレクトリの**所有者とPOSIX権限**を**指定**できます。また、既存のディレクトリを指定するか、希望する権限で新しいディレクトリを作成することで、アクセスポイントの**カスタムルートディレクトリ**を**定義**することもできます。これにより、**アプリケーションまたはユーザーごとにEFSファイルシステムへのアクセスを制御**でき、共有ファイルデータの管理とセキュリティが容易になります。 -**アクセスポイントからファイルシステムをマウントするには、次のようにします:** +**次のようにアクセスポイントからファイルシステムをマウントできます:** ```bash # Use IAM if you need to use iam permissions sudo mount -t efs -o tls,[iam],accesspoint= \ /efs/ ``` > [!WARNING] -> 注意してください。アクセス・ポイントをマウントしようとする場合でも、**ネットワーク経由でNFSサービスに連絡できる必要があり**、EFSにファイルシステムの**ポリシー**がある場合は、マウントするために**十分なIAM権限**が必要です。 +> 注意してください。アクセスポイントをマウントしようとする場合でも、**ネットワーク経由でNFSサービスに連絡できる必要があり**、EFSにファイルシステムの**ポリシー**がある場合は、マウントするために**十分なIAM権限**が必要です。 -アクセス・ポイントは以下の目的で使用できます: +アクセスポイントは以下の目的で使用できます: -- **権限管理の簡素化**:各アクセス・ポイントにPOSIXユーザーとグループを定義することで、基盤となるファイルシステムの権限を変更することなく、異なるアプリケーションやユーザーのアクセス権限を簡単に管理できます。 -- **ルートディレクトリの強制**:アクセス・ポイントはEFSファイルシステム内の特定のディレクトリへのアクセスを制限でき、各アプリケーションやユーザーが指定されたフォルダー内で操作することを保証します。これにより、偶発的なデータの露出や変更を防ぐことができます。 -- **ファイルシステムアクセスの簡素化**:アクセス・ポイントはAWS Lambda関数やAWS Fargateタスクに関連付けることができ、サーバーレスおよびコンテナ化されたアプリケーションのためのファイルシステムアクセスを簡素化します。 +- **権限管理の簡素化**:各アクセスポイントにPOSIXユーザーとグループを定義することで、基盤となるファイルシステムの権限を変更することなく、異なるアプリケーションやユーザーのアクセス権を簡単に管理できます。 +- **ルートディレクトリの強制**:アクセスポイントはEFSファイルシステム内の特定のディレクトリへのアクセスを制限でき、各アプリケーションやユーザーが指定されたフォルダー内で操作することを保証します。これにより、偶発的なデータの露出や変更を防ぐことができます。 +- **ファイルシステムアクセスの簡素化**:アクセスポイントはAWS Lambda関数やAWS Fargateタスクに関連付けることができ、サーバーレスおよびコンテナ化されたアプリケーションのためのファイルシステムアクセスを簡素化します。 -## Privesc +## EFS IPアドレス + +EFS IPアドレスに関連する情報を使用して、以下のPythonスクリプトはEFSシステムに関する詳細を取得するのに役立ちます。この情報は、マウントシステムコマンドを構築したり、サブネットIDの知識を持ってさらに列挙を行ったりするのに役立ちます。さらに、スクリプトはアクセスポイントを表示し、ルートディレクトリや主要なマウントパスが制限されている場合に価値があります。そのような場合、アクセスポイントは機密情報にアクセスするための代替パスを提供します。 +```bash +Usage: python efs_ip_enum.py +``` + +```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 ") +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