AWS - Nitro Enum

htARTE (HackTricks AWS Red Team 전문가)로부터 AWS 해킹을 제로부터 전문가까지 배우세요!

다른 HackTricks 지원 방법:

기본 정보

AWS Nitro는 AWS EC2 인스턴스의 기본 플랫폼을 형성하는 혁신적인 기술 모음입니다. Amazon에 의해 소개된 Nitro는 보안, 성능 및 신뢰성을 향상시키기 위해 사용자 정의 하드웨어 구성 요소 및 가벼운 하이퍼바이저를 활용합니다. Nitro는 전통적인 가상화 기능의 많은 부분을 전용 하드웨어 및 소프트웨어로 추상화하여 공격 표면을 최소화하고 리소스 효율성을 향상시킵니다. 가상화 기능을 오프로드함으로써 Nitro는 EC2 인스턴스가 거의 베어 메탈 성능을 제공할 수 있게 하여 리소스 집약적인 응용 프로그램에 특히 유용합니다. 또한 Nitro 보안 칩은 특히 하드웨어 및 펌웨어의 보안을 보장하여 견고한 아키텍처를 더욱 확고히 합니다.

Nitro Enclaves

AWS Nitro Enclaves는 Amazon EC2 인스턴스 내에서 안전한 격리된 컴퓨팅 환경을 제공하며, 고도로 민감한 데이터를 처리하기 위해 특별히 설계되었습니다. AWS Nitro 시스템을 활용하여 이러한 Enclaves는 견고한 격리 및 보안을 보장하여 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에서 실행할 수 있는 이미지들은 도커 이미지를 기반으로 하며, 따라서 다음과 같이 도커 이미지로부터 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

Enclaves 열거

EC2 호스트를 침입하면 다음과 같이 실행 중인 엔클레이브 이미지 목록을 얻을 수 있습니다:

nitro-cli describe-enclaves

그 실행 중인 엔클레이브 이미지 내부에 쉘을 얻는 것은 불가능합니다. 왜냐하면 그것이 엔클레이브의 주요 목적이기 때문입니다. 그러나 --debug-mode 매개변수를 사용하면 해당 이미지의 stdout을 얻을 수 있습니다.

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

Enclaves 종료

공격자가 EC2 인스턴스를 침투하더라도 기본적으로 그들 안에 쉘을 얻을 수는 없지만, 다음을 사용하여 종료할 수 있습니다:

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

Vsock

안클레이브 실행 이미지와 통신하는 유일한 방법은 vsocks를 사용하는 것입니다.

**가상 소켓 (vsock)**은 리눅스의 소켓 패밀리로, 가상 머신(VMs)과 그들의 하이퍼바이저 또는 VMs 통신을 용이하게 하는 것을 목적으로 특별히 설계되었습니다. Vsock은 호스트의 네트워킹 스택에 의존하지 않고 효율적인 양방향 통신을 가능하게 합니다. 이를 통해 VMs는 네트워크 구성 없이도 통신할 수 있으며, 32비트 Context ID (CID)와 포트 번호를 사용하여 연결을 식별하고 관리합니다. vsock API는 TCP와 UDP와 유사한 스트림 및 데이터그램 소켓 유형을 지원하며, 가상 환경에서 사용자 수준 응용 프로그램에 대한 다재다능한 도구를 제공합니다.

따라서, vsock 주소는 다음과 같이 보입니다: <CID>:<Port>

안클레이브 실행 이미지의 CIDs를 찾으려면 다음 명령을 실행하고 **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>
```bash
# Using socat
socat VSOCK-LISTEN:<port>,fork EXEC:"echo Hello from server!"

Vsock 클라이언트

예시:

最終更新