# AWS - EC2, EBS, ELB, SSM, VPC & VPN Enum

{{#include ../../../../banners/hacktricks-training.md}}

## VPC & Networking

VPCとは何か、その構成要素について学ぶには：

{{#ref}}
aws-vpc-and-networking-basic-information.md
{{#endref}}

## EC2

Amazon EC2は**仮想サーバー**を起動するために利用されます。**セキュリティ**や**ネットワーキング**の設定、**ストレージ**の管理が可能です。Amazon EC2の柔軟性は、リソースを上方および下方にスケールさせる能力に明らかであり、要求の変化や人気の急増に効果的に適応します。この機能により、正確なトラフィック予測の必要性が減少します。

EC2で列挙するのに興味深い項目：

- 仮想マシン
- SSHキー
- ユーザーデータ
- 既存のEC2/AMI/スナップショット
- ネットワーキング
- ネットワーク
- サブネットワーク
- パブリックIP
- 開いているポート
- AWS外の他のネットワークとの統合接続

### インスタンスプロファイル

**EC2インスタンス**上で実行されるアプリケーションに権限を付与するために**ロール**を使用するには、少し追加の設定が必要です。EC2インスタンス上で実行されるアプリケーションは、仮想化されたオペレーティングシステムによってAWSから抽象化されています。この追加の分離のため、AWSロールとその関連する権限をEC2インスタンスに割り当て、それをアプリケーションで利用可能にするための追加のステップが必要です。

この追加のステップは、インスタンスに添付された[_**インスタンスプロファイル**_](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use_switch-role-ec2_instance-profiles.html)の**作成**です。**インスタンスプロファイルにはロールが含まれ**、インスタンス上で実行されるアプリケーションにロールの一時的な資格情報を提供できます。これらの一時的な資格情報は、アプリケーションのAPI呼び出しでリソースにアクセスし、ロールが指定するリソースのみにアクセスを制限するために使用できます。**EC2インスタンスには同時に1つのロールしか割り当てられず**、インスタンス上のすべてのアプリケーションは同じロールと権限を共有します。

### メタデータエンドポイント

AWS EC2メタデータは、Amazon Elastic Compute Cloud (EC2)インスタンスに関する情報で、インスタンスが実行時に利用可能です。このメタデータは、インスタンスID、実行中のアベイラビリティゾーン、インスタンスに関連付けられたIAMロール、インスタンスのホスト名など、インスタンスに関する情報を提供するために使用されます。

{{#ref}}
https://book.hacktricks.wiki/en/pentesting-web/ssrf-server-side-request-forgery/cloud-ssrf.html
{{#endref}}

### 列挙
```bash
# Get EC2 instances
aws ec2 describe-instances
aws ec2 describe-instance-status #Get status from running instances

# Get user data from each ec2 instance
for instanceid in $(aws ec2 describe-instances --profile <profile> --region us-west-2 | grep -Eo '"i-[a-zA-Z0-9]+' | tr -d '"'); do
echo "Instance ID: $instanceid"
aws ec2 describe-instance-attribute --profile <profile> --region us-west-2 --instance-id "$instanceid" --attribute userData | jq ".UserData.Value" | tr -d '"' | base64 -d
echo ""
echo "-------------------"
done

# Instance profiles
aws iam list-instance-profiles
aws iam list-instance-profiles-for-role --role-name <name>

# Get tags
aws ec2 describe-tags

# Get volumes
aws ec2 describe-volume-status
aws ec2 describe-volumes

# Get snapshots
aws ec2 describe-snapshots --owner-ids self

# Scheduled instances
aws ec2 describe-scheduled-instances

# Get custom images
aws ec2 describe-images --owners self

# Get Elastic IPs
aws ec2 describe-addresses

# Get current output
aws ec2 get-console-output --instance-id [id]

# Get VPN customer gateways
aws ec2 describe-customer-gateways
aws ec2 describe-vpn-gateways
aws ec2 describe-vpn-connections

# List conversion tasks to upload/download VMs
aws ec2 describe-conversion-tasks
aws ec2 describe-import-image-tasks

# Get Bundle Tasks
aws ec2 describe-bundle-tasks

# Get Classic Instances
aws ec2 describe-classic-link-instances

# Get Dedicated Hosts
aws ec2 describe-hosts

# Get SSH Key Pairs
aws ec2 describe-key-pairs

# Get Internet Gateways
aws ec2 describe-internet-gateways

# Get NAT Gateways
aws ec2 describe-nat-gateways

# Get subnetworks
aws ec2 describe-subnets

# Get FW rules
aws ec2 describe-network-acls

# Get security groups
aws ec2 describe-security-groups

# Get interfaces
aws ec2 describe-network-interfaces

# Get routes table
aws ec2 describe-route-tables

# Get VPCs
aws ec2 describe-vpcs
aws ec2 describe-vpc-peering-connections
```
### 認証されていないアクセス

{{#ref}}
../../aws-unauthenticated-enum-access/aws-ec2-unauthenticated-enum/README.md
{{#endref}}

### 特権昇格

次のページでは、**EC2の権限を悪用して特権を昇格させる方法**を確認できます：

{{#ref}}
../../aws-privilege-escalation/aws-ec2-privesc/README.md
{{#endref}}

### ポストエクスプロイト

{{#ref}}
../../aws-post-exploitation/aws-ec2-ebs-ssm-and-vpc-post-exploitation/
{{#endref}}

## EBS

Amazon **EBS** (Elastic Block Store) **スナップショット**は、基本的にAWS EBSボリュームの静的な**バックアップ**です。言い換えれば、特定の時点で**EC2**インスタンスに接続されている**ディスク**の**コピー**です。EBSスナップショットは、リージョンやアカウントを跨いでコピーしたり、ダウンロードしてローカルで実行したりできます。

スナップショットには、**ソースコードやAPIキー**などの**機密情報**が含まれている可能性があるため、機会があれば確認することをお勧めします。

### AMIとEBSの違い

**AMI**は**EC2インスタンスを起動するために使用され**、EC2 **スナップショット**は**EBSボリュームに保存されたデータのバックアップと復元に使用されます**。EC2スナップショットは新しいAMIを作成するために使用できますが、AMIとは異なり、アプリケーションを実行するために必要なオペレーティングシステム、アプリケーションサーバー、またはその他のソフトウェアに関する情報は含まれていません。

### 特権昇格

次のページでは、**EBSの権限を悪用して特権を昇格させる方法**を確認できます：

{{#ref}}
../../aws-privilege-escalation/aws-ebs-privesc/README.md
{{#endref}}

## SSM

**Amazon Simple Systems Manager (SSM)**は、EC2インスタンスのフロートをリモートで管理し、その管理をはるかに簡単にします。これらのインスタンスの各々は、**SSMエージェントサービスを実行している必要があり、サービスがAWS APIからアクションを受け取り、それを実行します**。

**SSMエージェント**は、システムマネージャーがこれらのリソースを更新、管理、構成することを可能にします。エージェントは、**AWSクラウド内のシステムマネージャーサービスからのリクエストを処理し**、リクエストに指定された通りに実行します。

**SSMエージェントは**[ **一部のAMIにプリインストールされています**](https://docs.aws.amazon.com/systems-manager/latest/userguide/ami-preinstalled-agent.html)が、インスタンスに[**手動でインストールする必要があります**](https://docs.aws.amazon.com/systems-manager/latest/userguide/sysman-manual-agent-install.html)。また、インスタンス内で使用されるIAMロールには、通信を行うために**AmazonEC2RoleforSSM**ポリシーがアタッチされている必要があります。

### 列挙
```bash
aws ssm describe-instance-information
aws ssm describe-parameters
aws ssm describe-sessions --state [Active|History]
aws ssm describe-instance-patches --instance-id <id>
aws ssm describe-instance-patch-states --instance-ids <id>
aws ssm describe-instance-associations-status --instance-id <id>
```
EC2インスタンスでSystems Managerが実行されているかどうかを確認するには、次のコマンドを実行するだけです:
```bash
ps aux | grep amazon-ssm
```
### プリベス

次のページでは、**SSMの権限を悪用して特権を昇格させる方法**を確認できます：

{{#ref}}
../../aws-privilege-escalation/aws-ssm-privesc/README.md
{{#endref}}

### 永続性

次のページでは、**SSMの権限を悪用して永続性を達成する方法**を確認できます：

{{#ref}}
../../aws-persistence/aws-ssm-persistence/README.md
{{#endref}}

## ELB

**Elastic Load Balancing** (ELB) は、**Amazon Web Services** (AWS) デプロイメントのための**負荷分散サービス**です。ELBは自動的に**受信アプリケーショントラフィックを分散**し、トラフィックの需要に応じてリソースをスケールします。

### 列挙
```bash
# List internet-facing ELBs
aws elb describe-load-balancers
aws elb describe-load-balancers | jq '.LoadBalancerDescriptions[]| select( .Scheme | contains("internet-facing"))|.DNSName'

# DONT FORGET TO CHECK VERSION 2
aws elbv2 describe-load-balancers
aws elbv2 describe-load-balancers | jq '.LoadBalancers[].DNSName'
aws elbv2 describe-listeners --load-balancer-arn <load_balancer_arn>
```
## ランチテンプレートとオートスケーリンググループ

### 列挙
```bash
# Launch templates
aws ec2 describe-launch-templates
aws ec2 describe-launch-templates --launch-template-id <launch_template_id>
## Get details, like user data
aws ec2 describe-launch-template-versions --launch-template-id <launch_template_id>

# Autoscaling
aws autoscaling describe-auto-scaling-groups
aws autoscaling describe-auto-scaling-instances
aws autoscaling describe-launch-configurations
aws autoscaling describe-load-balancer-target-groups
aws autoscaling describe-load-balancers
```
## Nitro

AWS Nitroは、AWS EC2インスタンスの基盤となる**革新的な技術**のスイートです。Amazonによって**セキュリティ、パフォーマンス、信頼性を向上させる**ために導入され、Nitroはカスタム**ハードウェアコンポーネントと軽量ハイパーバイザー**を活用しています。従来の仮想化機能の多くを専用のハードウェアとソフトウェアに抽象化し、**攻撃面を最小限に抑え**、リソース効率を改善します。仮想化機能をオフロードすることで、NitroはEC2インスタンスに**ほぼベアメタルのパフォーマンス**を提供し、リソース集約型アプリケーションに特に有益です。さらに、Nitro Security Chipは**ハードウェアとファームウェアのセキュリティ**を特に確保し、その堅牢なアーキテクチャをさらに強化します。

詳細情報と列挙方法については、以下を参照してください：

{{#ref}}
aws-nitro-enum.md
{{#endref}}

## VPN

VPNは、**オンプレミスネットワーク（サイト間VPN）**または**作業者のラップトップ（クライアントVPN）**を**AWS VPC**に接続し、サービスをインターネットに公開することなくアクセスできるようにします。

#### 基本的なAWS VPNコンポーネント

1. **カスタマーゲートウェイ**:
- カスタマーゲートウェイは、VPN接続のあなたの側を表すためにAWSで作成するリソースです。
- これは、サイト間VPN接続のあなたの側にある物理デバイスまたはソフトウェアアプリケーションです。
- ルーティング情報とネットワークデバイス（ルーターやファイアウォールなど）のパブリックIPアドレスをAWSに提供してカスタマーゲートウェイを作成します。
- VPN接続を設定するための参照ポイントとして機能し、追加料金は発生しません。
2. **仮想プライベートゲートウェイ**:
- 仮想プライベートゲートウェイ（VPG）は、サイト間VPN接続のAmazon側のVPN集中装置です。
- あなたのVPCに接続され、VPN接続のターゲットとして機能します。
- VPGはVPN接続のAWS側エンドポイントです。
- あなたのVPCとオンプレミスネットワーク間の安全な通信を処理します。
3. **サイト間VPN接続**:
- サイト間VPN接続は、オンプレミスネットワークを安全なIPsec VPNトンネルを介してVPCに接続します。
- このタイプの接続にはカスタマーゲートウェイと仮想プライベートゲートウェイが必要です。
- データセンターやネットワークとAWS環境間の安全で安定した一貫した通信に使用されます。
- 通常、定期的で長期的な接続に使用され、接続を介して転送されたデータ量に基づいて請求されます。
4. **クライアントVPNエンドポイント**:
- クライアントVPNエンドポイントは、クライアントVPNセッションを有効にし管理するためにAWSで作成するリソースです。
- 個々のデバイス（ラップトップ、スマートフォンなど）がAWSリソースまたはオンプレミスネットワークに安全に接続できるようにするために使用されます。
- サイト間VPNとは異なり、全体のネットワークを接続するのではなく、個々のクライアント向けに設計されています。
- クライアントVPNでは、各クライアントデバイスがVPNクライアントソフトウェアを使用して安全な接続を確立します。

[**AWS VPNの利点とコンポーネントについての詳細情報はこちらで見つけることができます**](aws-vpc-and-networking-basic-information.md#vpn)。

### 列挙
```bash
# VPN endpoints
## Check used subnetwork, authentication, SGs, connected...
aws ec2 describe-client-vpn-endpoints

## Get AWS network info related to the vpn endpoint
aws ec2 describe-client-vpn-target-networks --client-vpn-endpoint-id <id>

## Get AWS subnet & ip range the VPN iconnected to
aws ec2 describe-client-vpn-routes --client-vpn-endpoint-id <id>

## Check authorization rules
aws ec2 describe-client-vpn-authorization-rules --client-vpn-endpoint-id <id>

## Get current connections to the VPN endpoint
aws ec2 describe-client-vpn-connections --client-vpn-endpoint-id <id>

# Get VPN gateways and check with which VPC each is connected
aws ec2 describe-vpn-gateways

# Get VPN site-to-site connections
aws ec2 describe-vpn-connections
```
### ローカル列挙

**ローカル一時資格情報**

AWS VPN Clientを使用してVPNに接続する際、ユーザーは通常**AWSにログイン**してVPNにアクセスします。その後、VPN接続を確立するために**AWS資格情報が作成され、ローカルに保存されます**。これらの資格情報は**$HOME/.config/AWSVPNClient/TemporaryCredentials/<region>/temporary-credentials.txt**に保存され、**AccessKey**、**SecretKey**、および**Token**が含まれています。

資格情報はユーザー`arn:aws:sts::<acc-id>:assumed-role/aws-vpn-client-metrics-analytics-access-role/CognitoIdentityCredentials`に属します（TODO: この資格情報の権限についてさらに調査する）。

**opvn設定ファイル**

**VPN接続が確立された場合**、システム内で**`.opvn`**設定ファイルを検索する必要があります。さらに、**$HOME/.config/AWSVPNClient/OpenVpnConfigs**に**設定**が見つかる場所の1つです。

#### **ポストエクスプロイト**

{{#ref}}
../../aws-post-exploitation/aws-vpn-post-exploitation/README.md
{{#endref}}

## 参考文献

- [https://docs.aws.amazon.com/batch/latest/userguide/getting-started-ec2.html](https://docs.aws.amazon.com/batch/latest/userguide/getting-started-ec2.html)

{{#include ../../../../banners/hacktricks-training.md}}
