AWS - Nitro Enum

ゼロからヒーローまでAWSハッキングを学ぶ htARTE(HackTricks AWS Red Team Expert)

HackTricks をサポートする他の方法:

基本情報

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

Nitro Enclaves

AWS Nitro Enclaves は、Amazon EC2 インスタンス内で 高度に機密性の高いデータを処理するために特別に設計された、安全な 隔離されたコンピュート環境 を提供します。AWS Nitro システムを活用することで、これらのエンクレーブは堅牢な 隔離とセキュリティ を確保し、PII や財務記録などの 機密情報の取り扱い に最適です。エンクレーブは、データ露出のリスクを大幅に減らすために、最小限の環境を備えています。さらに、Nitro Enclaves は暗号化アテステーションをサポートし、認証されたコードのみが実行されていることをユーザーが検証できるようにしており、厳格なコンプライアンスとデータ保護基準を維持するために重要です。

Nitro Enclave イメージは EC2 インスタンス内部から実行 され、AWS ウェブコンソールから EC2 インスタンスが Nitro Enclave でイメージを実行しているかどうかを確認することはできません。

Nitro Enclave CLI のインストール

ドキュメントから すべての手順に従ってください。ただし、以下が最も重要です:

# Install tools
sudo amazon-linux-extras install aws-nitro-enclaves-cli -y
sudo yum install aws-nitro-enclaves-cli-devel -y

# Config perms
sudo usermod -aG ne $USER
sudo usermod -aG docker $USER

# Check installation
nitro-cli --version

# Start and enable the Nitro Enclaves allocator service.
sudo systemctl start nitro-enclaves-allocator.service && sudo systemctl enable nitro-enclaves-allocator.service

Nitro Enclave イメージ

Nitro Enclave で実行できるイメージは、Docker イメージをベースにしています。したがって、次のような Docker イメージから Nitro Enclave イメージを作成できます:

# You need to have the docker image accesible in your running local registry
# Or indicate the full docker image URL to access the image
nitro-cli build-enclave --docker-uri <docker-img>:<tag> --output-file nitro-img.eif

Nitro Enclaveのイメージは、拡張子**eif**(Enclave Image File)を使用しています。

出力は次のようになります:

Using the locally available Docker image...
Enclave Image successfully created.
{
"Measurements": {
"HashAlgorithm": "Sha384 { ... }",
"PCR0": "e199261541a944a93129a52a8909d29435dd89e31299b59c371158fc9ab3017d9c450b0a580a487e330b4ac691943284",
"PCR1": "bcdf05fefccaa8e55bf2c8d6dee9e79bbff31e34bf28a99aa19e6b29c37ee80b214a414b7607236edf26fcb78654e63f",
"PCR2": "2e1fca1dbb84622ec141557dfa971b4f8ea2127031b264136a20278c43d1bba6c75fea286cd4de9f00450b6a8db0e6d3"
}
}

イメージの実行

ドキュメントによると、エンクレーブイメージを実行するには、そのメモリに eif ファイルのサイズの少なくとも4倍 を割り当てる必要があります。ファイル内でそれに与えるデフォルトリソースを構成することが可能です。

/etc/nitro_enclaves/allocator.yaml

親EC2インスタンスにも一部のリソースを予約する必要があることを常に覚えておいてください!

リソースを画像に与えることを知った後、構成ファイルを変更した場合、次のようにエンクレーブ画像を実行できます:

# Restart the service so the new default values apply
sudo systemctl start nitro-enclaves-allocator.service && sudo systemctl enable nitro-enclaves-allocator.service

# Indicate the CPUs and memory to give
nitro-cli run-enclave --cpu-count 2 --memory 3072 --eif-path hello.eif --debug-mode --enclave-cid 16

エンクレーブの列挙

EC2ホストを侵害した場合、実行中のエンクレーブイメージのリストを取得することが可能です:

nitro-cli describe-enclaves

それはenclave内の実行中のイメージ内でシェルを取得することはできません。それがenclaveの主な目的ですが、ただし、パラメータ**--debug-modeを使用すると、それのstdout**を取得することが可能です:

ENCLAVE_ID=$(nitro-cli describe-enclaves | jq -r ".[0].EnclaveID")
nitro-cli console --enclave-id ${ENCLAVE_ID}

エンクレーブの終了

攻撃者がEC2インスタンスを侵害した場合、デフォルトではそれらの内部にシェルを取得することはできませんが、次のコマンドでそれらを終了することができます:

nitro-cli terminate-enclave --enclave-id ${ENCLAVE_ID}

Vsock(Vソックス)

エンクレーブ実行イメージと通信する唯一の方法は、vsocksを使用することです。

仮想ソケット(vsock)は、Linuxのソケットファミリーであり、仮想マシン(VM)とそれらのハイパーバイザー、またはVM同士の通信を容易にするために特別に設計されています。 Vsockは、ホストのネットワーキングスタックに依存せずに、効率的で双方向の通信を可能にします。これにより、VMはネットワーク構成なしでも通信できるようになります。32ビットのコンテキストID(CID)とポート番号を使用して接続を識別および管理します。 vsock APIは、TCPとUDPに類似したストリームおよびデータグラムソケットタイプの両方をサポートし、仮想環境のユーザーレベルアプリケーションに対する多目的なツールを提供します。

したがって、vsockアドレスは次のようになります:<CID>:<Port>

エンクレーブ実行イメージのCIDを見つけるには、次のコマンドを実行して**EnclaveCID**を取得できます:

nitro-cli describe-enclaves

[
{
"EnclaveName": "secure-channel-example",
"EnclaveID": "i-0bc274f83ade02a62-enc18ef3d09c886748",
"ProcessID": 10131,
    "EnclaveCID": 16,
    "NumberOfCPUs": 2,
"CPUIDs": [
1,
3
],
"MemoryMiB": 1024,
"State": "RUNNING",
"Flags": "DEBUG_MODE",
"Measurements": {
"HashAlgorithm": "Sha384 { ... }",
"PCR0": "e199261541a944a93129a52a8909d29435dd89e31299b59c371158fc9ab3017d9c450b0a580a487e330b4ac691943284",
"PCR1": "bcdf05fefccaa8e55bf2c8d6dee9e79bbff31e34bf28a99aa19e6b29c37ee80b214a414b7607236edf26fcb78654e63f",
"PCR2": "2e1fca1dbb84622ec141557dfa971b4f8ea2127031b264136a20278c43d1bba6c75fea286cd4de9f00450b6a8db0e6d3"
}
}
]

ホストからは、CIDがどのポートを公開しているかを知る方法はありません!https://github.com/carlospolop/Vsock-scannerのようなvsockポートスキャナーを使用しない限り。

Vsockサーバー/リスナー

ここにいくつかの例があります:

シンプルなPythonリスナー

```python #!/usr/bin/env python3

From

https://medium.com/@F.DL/understanding-vsock-684016cf0eb0

import socket

CID = socket.VMADDR_CID_HOST PORT = 9999

s = socket.socket(socket.AF_VSOCK, socket.SOCK_STREAM) s.bind((CID, PORT)) s.listen() (conn, (remote_cid, remote_port)) = s.accept()

print(f"Connection opened by cid={remote_cid} port={remote_port}")

while True: buf = conn.recv(64) if not buf: break

print(f"Received bytes: {buf}")

</details>  

<details>  

### AWS Nitro Enum  

#### EC2 Nitro Instances  

Nitro instances are a new hypervisor for EC2 instances that enables better performance and security. Nitro instances use Nitro cards to offload tasks from the main CPU, improving overall performance.  

#### Nitro API Endpoints  

- `nitro-enclave` - Used for launching EC2 instances with Nitro Enclaves.  
- `nitro-security` - Used for managing Nitro Security Groups.  
- `nitro-smartnic` - Used for managing Nitro SmartNICs.  

#### Nitro Security Groups  

Nitro Security Groups are used to control traffic to and from Nitro-based instances. They act as a firewall controlling inbound and outbound traffic.  

#### Nitro SmartNIC  

Nitro SmartNICs are network interface cards that offload network processing from the main CPU. They improve network performance and reduce the load on the main CPU.  

#### Nitro Enclaves  

Nitro Enclaves are isolated environments for sensitive data processing. They provide a secure environment for processing confidential data within an EC2 instance.  

</details>
```bash
# Using socat
socat VSOCK-LISTEN:<port>,fork EXEC:"echo Hello from server!"

Vsock クライアント

例:

最終更新