GCP - Network Docker Escape
초기 상태
이 기술이 명시된 두 가지 writeup에서 공격자는 GCP에서 관리되는 Docker 컨테이너 내에서 루트 액세스를 획득하고 호스트 네트워크에 액세스할 수 있는 상태를 가지고 있습니다. 또한, CAP_NET_ADMIN
및 CAP_NET_RAW
기능을 가지고 있습니다.
공격 설명
Google Compute Engine 인스턴스에서는 네트워크 트래픽의 정기적인 검사를 통해 169.254.169.254
의 메타데이터 인스턴스로의 다양한 일반 HTTP 요청이 발견됩니다. Google Guest Agent라는 오픈 소스 서비스가 이러한 요청을 자주 수행합니다.
이 에이전트는 메타데이터의 변경 사항을 모니터링하기 위해 설계되었습니다. 특히, 메타데이터에는 SSH 공개 키 필드가 포함되어 있습니다. 새로운 공개 SSH 키가 메타데이터에 추가되면, 에이전트는 자동으로 .authorized_key
파일에서 해당 키를 인가합니다. 필요한 경우 새로운 사용자를 sudoers에 추가할 수도 있습니다.
에이전트는 모든 메타데이터 값을 재귀적으로 검색하기 위해 요청을 보내며 (GET /computeMetadata/v1/?recursive=true
), 이 요청은 메타데이터 서버가 마지막 검색 이후 메타데이터에 변경 사항이 있는 경우에만 응답을 보내도록 설계되었습니다. 이는 Etag로 식별됩니다 (wait_for_change=true&last_etag=
). 또한, timeout 매개변수 (timeout_sec=
)가 포함됩니다. 지정된 timeout 내에 변경 사항이 발생하지 않으면, 서버는 변경되지 않은 값으로 응답합니다.
이 과정을 통해 IMDS (Instance Metadata Service)는 구성 변경이 발생하지 않은 경우, 60초 후에 응답할 수 있도록 하여 가짜 구성 응답을 주입할 수 있는 창문을 만들 수 있습니다.
공격자는 이를 악용하여 Man-in-the-Middle (MitM) 공격을 수행하고, IMDS 서버로부터의 응답을 위조하고 새로운 공개 키를 삽입할 수 있습니다. 이를 통해 호스트로의 무단 SSH 액세스가 가능해집니다.
탈출 기술
Google Compute Engine 네트워크에서는 ARP 스푸핑이 효과가 없지만, Ezequiel이 개발한 rshijack의 수정 버전을 사용하여 패킷 주입에 사용할 수 있습니다.
이 버전의 rshijack은 ACK 및 SEQ 번호를 명령줄 인수로 입력할 수 있도록 하여 실제 메타데이터 서버 응답 이전에 응답을 위조하는 것을 용이하게 합니다. 또한, 작은 셸 스크립트를 사용하여 특별히 조작된 페이로드를 반환합니다. 이 페이로드는 Google Guest Agent가 .authorized_keys
파일에 지정된 공개 키를 가진 사용자 wouter
를 생성하도록 유도합니다.
이 스크립트는 동일한 ETag를 사용하여 메타데이터 서버가 즉시 다른 메타데이터 값을 Google Guest Agent에 알리지 못하도록 하여 응답을 지연시킵니다.
위조를 실행하기 위해 다음 단계가 필요합니다:
Metadata 서버로의 요청을 모니터링하기 위해 tcpdump를 사용하세요:
다음과 유사한 줄을 찾으세요:
올바른 ETAG를 가진 가짜 메타데이터 데이터를 rshijack에 전송하세요:
이 단계에서는 공개 키를 인가하여 해당 개인 키와의 SSH 연결을 활성화합니다.
참고 자료
最終更新