# AWS Pentesting

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

## 基本情報

**AWS** 環境の **ペンテスト** を開始する前に、AWS の仕組みについて知っておくべき **基本的なこと** がいくつかあります。これにより、何をすべきか、誤設定をどのように見つけるか、そしてそれをどのように悪用するかを理解するのに役立ちます。

組織の階層、IAM、その他の基本的な概念については、以下で説明されています：

{{#ref}}
aws-basic-information/
{{#endref}}

## 学習用ラボ

- [https://github.com/RhinoSecurityLabs/cloudgoat](https://github.com/RhinoSecurityLabs/cloudgoat)
- [https://github.com/BishopFox/iam-vulnerable](https://github.com/BishopFox/iam-vulnerable)
- [https://github.com/nccgroup/sadcloud](https://github.com/nccgroup/sadcloud)
- [https://github.com/bridgecrewio/terragoat](https://github.com/bridgecrewio/terragoat)
- [https://github.com/ine-labs/AWSGoat](https://github.com/ine-labs/AWSGoat)
- [http://flaws.cloud/](http://flaws.cloud/)
- [http://flaws2.cloud/](http://flaws2.cloud/)

攻撃をシミュレートするためのツール：

- [https://github.com/Datadog/stratus-red-team/](https://github.com/Datadog/stratus-red-team/)
- [https://github.com/sbasu7241/AWS-Threat-Simulation-and-Detection/tree/main](https://github.com/sbasu7241/AWS-Threat-Simulation-and-Detection/tree/main)

## AWS ペンテスター/レッドチームの方法論

AWS 環境を監査するためには、どの **サービスが使用されているか**、何が **公開されているか**、誰が **何にアクセスできるか**、そして内部の AWS サービスと **外部サービス** がどのように接続されているかを知ることが非常に重要です。

レッドチームの観点から、AWS 環境を侵害するための **最初のステップ** は、いくつかの **資格情報** を取得することです。以下はその方法のいくつかです：

- github（または類似のもの）での **漏洩** - OSINT
- **ソーシャル** エンジニアリング
- **パスワード** の再利用（パスワード漏洩）
- AWS ホスティングアプリケーションの脆弱性
- [**サーバーサイドリクエストフォージェリ**](https://book.hacktricks.wiki/en/pentesting-web/ssrf-server-side-request-forgery/cloud-ssrf.html) メタデータエンドポイントへのアクセス
- **ローカルファイル読み取り**
- `/home/USERNAME/.aws/credentials`
- `C:\Users\USERNAME\.aws\credentials`
- 第三者の **侵害**
- **内部** 従業員
- [**Cognito** ](aws-services/aws-cognito-enum/index.html#cognito)資格情報

または **認証されていないサービス** を侵害することによって：

{{#ref}}
aws-unauthenticated-enum-access/
{{#endref}}

または **レビュー** を行っている場合は、これらの役割で **資格情報を要求する** ことができます：

{{#ref}}
aws-permissions-for-a-pentest.md
{{#endref}}

> [!NOTE]
> 資格情報を取得した後は、それらの資格情報が **誰に属しているか**、および **何にアクセスできるか** を知る必要があります。そのため、いくつかの基本的な列挙を実行する必要があります：

## 基本的な列挙

### SSRF

AWS 内のマシンで SSRF を見つけた場合は、トリックについてはこのページを確認してください：

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

### Whoami

最初に知っておくべきことの一つは、あなたが誰であるか（どのアカウントにいるか、AWS 環境に関する他の情報）です：
```bash
# Easiest way, but might be monitored?
aws sts get-caller-identity
aws iam get-user # This will get your own user

# If you have a Key ID
aws sts get-access-key-info --access-key-id=ASIA1234567890123456

# Get inside error message
aws sns publish --topic-arn arn:aws:sns:us-east-1:*account id*:aaa --message aaa

# From metadata
TOKEN=`curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600"`
curl -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/dynamic/instance-identity/document
```
> [!CAUTION]
> 企業は**カナリアトークン**を使用して**トークンが盗まれ使用されている**かどうかを特定する場合があります。使用する前にトークンがカナリアトークンであるかどうかを確認することをお勧めします。\
> 詳細については[**このページを確認してください**](aws-services/aws-security-and-detection-services/aws-cloudtrail-enum.md#honeytokens-bypass)。

### 組織の列挙

{{#ref}}
aws-services/aws-organizations-enum.md
{{#endref}}

### IAMの列挙

十分な権限がある場合、**AWSアカウント内の各エンティティの権限を確認すること**は、あなたや他のアイデンティティが何をできるか、また**権限を昇格させる方法**を理解するのに役立ちます。

IAMを列挙するための十分な権限がない場合、**ブルートフォースで盗む**ことでそれらを特定できます。\
**列挙とブルートフォースの方法**については以下を確認してください：

{{#ref}}
aws-services/aws-iam-enum.md
{{#endref}}

> [!NOTE]
> 現在、**あなたの資格情報に関する情報を持っている**（そして、もしあなたがレッドチームであれば、**検出されていないことを願っています**）。環境で使用されているサービスを特定する時が来ました。\
> 次のセクションでは、**一般的なサービスを列挙する方法**をいくつか確認できます。

## サービスの列挙、ポストエクスプロイト & 永続性

AWSには驚くべき数のサービスがあり、以下のページでは**基本情報、列挙**のチートシート\*\*、\*\***検出を回避する方法**、**永続性**を取得する方法、その他の**ポストエクスプロイト**のトリックについての情報が見つかります：

{{#ref}}
aws-services/
{{#endref}}

手動で**すべての作業を行う必要はありません**。以下の投稿では、[**自動ツール**](#automated-tools)に関する**セクション**を見つけることができます。

さらに、この段階で**認証されていないユーザーに公開されているサービスを**発見したかもしれません。それらを悪用できるかもしれません：

{{#ref}}
aws-unauthenticated-enum-access/
{{#endref}}

## 権限昇格

異なるリソースに対して**少なくとも自分の権限を確認できる**場合、**さらに権限を取得できるかどうかを確認できます**。少なくとも以下の権限に焦点を当てるべきです：

{{#ref}}
aws-privilege-escalation/
{{#endref}}

## 公開されたサービス

AWSサービスを列挙しているときに、いくつかのサービスが**インターネットに要素を公開している**のを見つけたかもしれません（VM/コンテナのポート、データベースやキューサービス、スナップショットやバケットなど）。\
ペンテスター/レッドチームとして、**機密情報や脆弱性**を見つけられるかどうかを常に確認すべきです。これにより、**AWSアカウントへのさらなるアクセス**が得られるかもしれません。

この本では、**公開されたAWSサービスを見つける方法とそれを確認する方法**に関する**情報**を見つけることができるはずです。**公開されたネットワークサービスの脆弱性を見つける方法**については、特定の**サービス**を以下で**検索**することをお勧めします：

{{#ref}}
https://book.hacktricks.wiki/
{{#endref}}

## 組織の侵害

### ルート/管理アカウントから

管理アカウントが組織内に新しいアカウントを作成すると、新しいアカウントに**新しいロール**が作成され、デフォルトで**`OrganizationAccountAccessRole`**と名付けられ、**管理アカウント**に新しいアカウントにアクセスするための**AdministratorAccess**ポリシーが付与されます。

<figure><img src="../../images/image (171).png" alt=""><figcaption></figcaption></figure>

したがって、子アカウントに管理者としてアクセスするには、次のことが必要です：

- **管理**アカウントを**侵害**し、**子アカウントのID**と**ロールの名前**（デフォルトでOrganizationAccountAccessRole）を見つけて、管理アカウントが管理者としてアクセスできるようにします。
- 子アカウントを見つけるには、AWSコンソールの組織セクションに移動するか、`aws organizations list-accounts`を実行します。
- ロールの名前を直接見つけることはできないため、すべてのカスタムIAMポリシーを確認し、**以前に発見した子アカウントに対する`sts:AssumeRole`を許可するもの**を検索します。
- **管理アカウント内の**`sts:AssumeRole`権限を持つ**プリンシパル**を**侵害**し、子アカウントのロールに対して**`sts:AssumeRole`権限を持つ**（管理アカウントから誰でもなりすますことを許可している場合でも、外部アカウントであるため、特定の`sts:AssumeRole`権限が必要です）。

## 自動ツール

### リコン

- [**aws-recon**](https://github.com/darkbitio/aws-recon): Rubyで書かれたマルチスレッドのAWSセキュリティに特化した**インベントリ収集ツール**。
```bash
# Install
gem install aws_recon

# Recon and get json
AWS_PROFILE=<profile> aws_recon \
--services S3,EC2 \
--regions global,us-east-1,us-east-2 \
--verbose
```
- [**cloudlist**](https://github.com/projectdiscovery/cloudlist): Cloudlistは、クラウドプロバイダーからアセット（ホスト名、IPアドレス）を取得するための**マルチクラウドツール**です。
- [**cloudmapper**](https://github.com/duo-labs/cloudmapper): CloudMapperは、Amazon Web Services (AWS) 環境を分析するのに役立ちます。現在、セキュリティ問題の監査を含む、はるかに多くの機能が含まれています。
```bash
# Installation steps in github
# Create a config.json file with the aws info, like:
{
"accounts": [
{
"default": true,
"id": "<account id>",
"name": "dev"
}
],
"cidrs":
{
"2.2.2.2/28": {"name": "NY Office"}
}
}

# Enumerate
python3 cloudmapper.py collect --profile dev
## Number of resources discovered
python3 cloudmapper.py stats --accounts dev

# Create HTML report
## In the report you will find all the info already
python3 cloudmapper.py report --accounts dev

# Identify potential issues
python3 cloudmapper.py audit --accounts dev --json > audit.json
python3 cloudmapper.py audit --accounts dev --markdow > audit.md
python3 cloudmapper.py iam_report --accounts dev

# Identify admins
## The permissions search for are in https://github.com/duo-labs/cloudmapper/blob/4df9fd7303e0337ff16a08f5e58f1d46047c4a87/shared/iam_audit.py#L163-L175
python3 cloudmapper.py find_admins --accounts dev

# Identify unused elements
python3 cloudmapper.py find_unused --accounts dev

# Identify publivly exposed resources
python3 cloudmapper.py public --accounts dev

python cloudmapper.py prepare #Prepare webserver
python cloudmapper.py webserver #Show webserver
```
- [**cartography**](https://github.com/lyft/cartography): Cartographyは、インフラストラクチャ資産とそれらの関係を直感的なグラフビューで統合するPythonツールで、Neo4jデータベースによって支えられています。
```bash
# Install
pip install cartography
## At the time of this writting you need neo4j version 3.5.*

# Get AWS info
AWS_PROFILE=dev cartography --neo4j-uri bolt://127.0.0.1:7687 --neo4j-password-prompt  --neo4j-user neo4j
```
- [**starbase**](https://github.com/JupiterOne/starbase): Starbaseは、クラウドインフラストラクチャ、SaaSアプリケーション、セキュリティコントロールなどのサービスやシステムから資産と関係を収集し、Neo4jデータベースに基づいた直感的なグラフビューに表示します。
- [**aws-inventory**](https://github.com/nccgroup/aws-inventory): (python2を使用) これは、アカウント内で作成されたすべての[**AWSリソース**](https://docs.aws.amazon.com/general/latest/gr/glos-chap.html#resource)を**発見しようとする**ツールです。
- [**aws_public_ips**](https://github.com/arkadiyt/aws_public_ips): これは、AWSアカウントに関連付けられた**すべてのパブリックIPアドレス**（IPv4/IPv6の両方）を**取得する**ツールです。

### Privesc & Exploiting

- [**SkyArk**](https://github.com/cyberark/SkyArk)**:** スキャンされたAWS環境で最も特権のあるユーザーを発見します。AWS Shadow Adminsを含みます。powershellを使用します。**`Check-PrivilegedPolicy`**関数内で**特権ポリシーの定義**を見つけることができます。[https://github.com/cyberark/SkyArk/blob/master/AWStealth/AWStealth.ps1](https://github.com/cyberark/SkyArk/blob/master/AWStealth/AWStealth.ps1)。
- [**pacu**](https://github.com/RhinoSecurityLabs/pacu): Pacuは、クラウド環境に対する攻撃的セキュリティテストのために設計されたオープンソースの**AWSエクスプロイトフレームワーク**です。**列挙**、**ミスコンフィギュレーションの発見**、およびそれらの**エクスプロイト**が可能です。**`user_escalation_methods`**辞書内で[https://github.com/RhinoSecurityLabs/pacu/blob/866376cd711666c775bbfcde0524c817f2c5b181/pacu/modules/iam__privesc_scan/main.py#L134](https://github.com/RhinoSecurityLabs/pacu/blob/866376cd711666c775bbfcde0524c817f2c5b181/pacu/modules/iam__privesc_scan/main.py#L134)に**特権権限の定義**があります。
- pacuは**自分のプライベートパスのみをチェックします**（アカウント全体ではありません）。
```bash
# Install
## Feel free to use venvs
pip3 install pacu

# Use pacu CLI
pacu
> import_keys <profile_name> # import 1 profile from .aws/credentials
> import_keys --all # import all profiles
> list # list modules
> exec iam__enum_permissions # Get permissions
> exec iam__privesc_scan # List privileged permissions
```
- [**PMapper**](https://github.com/nccgroup/PMapper): Principal Mapper (PMapper)は、AWSアカウントまたはAWS組織のAWS Identity and Access Management (IAM)の設定におけるリスクを特定するためのスクリプトとライブラリです。これは、アカウント内の異なるIAMユーザーとロールを有向グラフとしてモデル化し、**特権昇格**のチェックや、攻撃者がAWS内のリソースやアクションにアクセスするために取る可能性のある代替パスを確認できるようにします。**privesc**パスを見つけるために使用される**権限**は、[https://github.com/nccgroup/PMapper/tree/master/principalmapper/graphing](https://github.com/nccgroup/PMapper/tree/master/principalmapper/graphing)の`_edges.py`で終わるファイル名にあります。
```bash
# Install
pip install principalmapper

# Get data
pmapper --profile dev graph create
pmapper --profile dev graph display # Show basic info
# Generate graph
pmapper --profile dev visualize # Generate svg graph file (can also be png, dot and graphml)
pmapper --profile dev visualize --only-privesc # Only privesc permissions

# Generate analysis
pmapper --profile dev analysis
## Run queries
pmapper --profile dev query 'who can do iam:CreateUser'
pmapper --profile dev query 'preset privesc *' # Get privescs with admins

# Get organization hierarchy data
pmapper --profile dev orgs create
pmapper --profile dev orgs display
```
- [**cloudsplaining**](https://github.com/salesforce/cloudsplaining): Cloudsplainingは、最小特権の違反を特定し、リスク優先のHTMLレポートを生成するAWS IAMセキュリティ評価ツールです。\
それは、潜在的に**過剰な権限**を持つ顧客、インラインおよびAWSの**ポリシー**、およびそれらにアクセスできる**プリンシパル**を示します。（それは特権昇格だけでなく、他の興味深い権限もチェックするため、使用を推奨します）。
```bash
# Install
pip install cloudsplaining

# Download IAM policies to check
## Only the ones attached with the versions used
cloudsplaining download --profile dev

# Analyze the IAM policies
cloudsplaining scan --input-file /private/tmp/cloudsplaining/dev.json --output /tmp/files/
```
- [**cloudjack**](https://github.com/prevade/cloudjack): CloudJackは、分離されたRoute53とCloudFrontの構成の結果として、AWSアカウントの**サブドメインハイジャック脆弱性**を評価します。
- [**ccat**](https://github.com/RhinoSecurityLabs/ccat): ECRリポジトリのリスト -> ECRリポジトリをプル -> バックドアを仕掛ける -> バックドアを仕掛けたイメージをプッシュ
- [**Dufflebag**](https://github.com/bishopfox/dufflebag): Dufflebagは、公開されたElastic Block Storage (**EBS**)スナップショットを**検索**して、誤って残された可能性のある秘密を探すツールです。

### 監査

- [**cloudsploit**](https://github.com/aquasecurity/cloudsploit)**:** AquaのCloudSploitは、Amazon Web Services (AWS)、Microsoft Azure、Google Cloud Platform (GCP)、Oracle Cloud Infrastructure (OCI)、およびGitHubを含む**クラウドインフラストラクチャ**アカウントの**セキュリティリスク**を検出するために設計されたオープンソースプロジェクトです（ShadowAdminsは探しません）。
```bash
./index.js --csv=file.csv --console=table --config ./config.js

# Compiance options: --compliance {hipaa,cis,cis1,cis2,pci}
## use "cis" for cis level 1 and 2
```
- [**Prowler**](https://github.com/prowler-cloud/prowler): Prowlerは、AWSのセキュリティベストプラクティスの評価、監査、インシデントレスポンス、継続的な監視、ハードニング、およびフォレンジック準備を行うためのオープンソースのセキュリティツールです。
```bash
# Install python3, jq and git
# Install
pip install prowler
prowler -v

# Run
prowler <provider>
prowler aws --profile custom-profile [-M csv json json-asff html]
```
- [**CloudFox**](https://github.com/BishopFox/cloudfox): CloudFoxは、未知のクラウド環境での状況認識を得るのに役立ちます。これは、ペネトレーションテスターや他の攻撃的セキュリティ専門家がクラウドインフラストラクチャ内の悪用可能な攻撃経路を見つけるために作成されたオープンソースのコマンドラインツールです。
```bash
cloudfox aws --profile [profile-name] all-checks
```
- [**ScoutSuite**](https://github.com/nccgroup/ScoutSuite): Scout Suiteは、クラウド環境のセキュリティポスチャー評価を可能にするオープンソースのマルチクラウドセキュリティ監査ツールです。
```bash
# Install
virtualenv -p python3 venv
source venv/bin/activate
pip install scoutsuite
scout --help

# Get info
scout aws -p dev
```
- [**cs-suite**](https://github.com/SecurityFTW/cs-suite): Cloud Security Suite (python2.7を使用し、メンテナンスされていないようです)
- [**Zeus**](https://github.com/DenizParlak/Zeus): ZeusはAWS EC2 / S3 / CloudTrail / CloudWatch / KMSのベストハードニングプラクティスのための強力なツールです（メンテナンスされていないようです）。システム内のデフォルト設定されたクレデンシャルのみをチェックします。

### Constant Audit

- [**cloud-custodian**](https://github.com/cloud-custodian/cloud-custodian): Cloud Custodianは、パブリッククラウドアカウントとリソースを管理するためのルールエンジンです。ユーザーは**適切に管理されたクラウドインフラストラクチャを有効にするポリシーを定義**することができます。これは、組織が持つ多くのアドホックスクリプトを軽量で柔軟なツールに統合し、統一されたメトリクスとレポートを提供します。
- [**pacbot**](https://github.com/tmobile/pacbot)**: Policy as Code Bot (PacBot)**は、**クラウドのための継続的なコンプライアンス監視、コンプライアンス報告、およびセキュリティ自動化のプラットフォーム**です。PacBotでは、セキュリティおよびコンプライアンスポリシーがコードとして実装されます。PacBotによって発見されたすべてのリソースは、これらのポリシーに対して評価され、ポリシーの適合性が測定されます。PacBotの**自動修正**フレームワークは、事前定義されたアクションを実行することによってポリシー違反に自動的に対応する能力を提供します。
- [**streamalert**](https://github.com/airbnb/streamalert)**:** StreamAlertは、サーバーレスの**リアルタイム**データ分析フレームワークであり、**定義したデータソースとアラートロジックを使用して、任意の環境からデータを取り込み、分析し、アラートを出す**ことを可能にします。コンピュータセキュリティチームは、StreamAlertを使用して、インシデント検出と対応のために毎日テラバイトのログデータをスキャンします。

## DEBUG: Capture AWS cli requests
```bash
# Set proxy
export HTTP_PROXY=http://localhost:8080
export HTTPS_PROXY=http://localhost:8080

# Capture with burp nor verifying ssl
aws --no-verify-ssl ...

# Dowload brup cert and transform it to pem
curl http://127.0.0.1:8080/cert --output Downloads/certificate.cer
openssl x509 -inform der -in Downloads/certificate.cer -out Downloads/certificate.pem

# Indicate the ca cert to trust
export AWS_CA_BUNDLE=~/Downloads/certificate.pem

# Run aws cli normally trusting burp cert
aws ...
```
## 参考文献

- [https://www.youtube.com/watch?v=8ZXRw4Ry3mQ](https://www.youtube.com/watch?v=8ZXRw4Ry3mQ)
- [https://cloudsecdocs.com/aws/defensive/tooling/audit/](https://cloudsecdocs.com/aws/defensive/tooling/audit/)

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