GCP - Network Docker Escape

htARTE (HackTricks AWS Red Team Expert)를 통해 AWS 해킹을 처음부터 전문가까지 배워보세요!

HackTricks를 지원하는 다른 방법:

초기 상태

이 기술이 명시된 두 가지 writeup에서 공격자는 GCP에서 관리되는 Docker 컨테이너 내에서 루트 액세스를 획득하고 호스트 네트워크에 액세스할 수 있는 상태를 가지고 있습니다. 또한, CAP_NET_ADMINCAP_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에 알리지 못하도록 하여 응답을 지연시킵니다.

위조를 실행하기 위해 다음 단계가 필요합니다:

  1. Metadata 서버로의 요청을 모니터링하기 위해 tcpdump를 사용하세요:

tcpdump -S -i eth0 'host 169.254.169.254 and port 80' &

다음과 유사한 줄을 찾으세요:

<TIME> IP <LOCAL_IP>.<PORT> > 169.254.169.254.80: Flags [P.], seq <NUM>:<TARGET_ACK>, ack <TARGET_SEQ>, win <NUM>, length <NUM>: HTTP: GET /computeMetadata/v1/?timeout_sec=<SECONDS>&last_etag=<ETAG>&alt=json&recursive=True&wait_for_change=True HTTP/1.1
  1. 올바른 ETAG를 가진 가짜 메타데이터 데이터를 rshijack에 전송하세요:

fakeData.sh <ETAG> | rshijack -q eth0 169.254.169.254:80 <LOCAL_IP>:<PORT> <TARGET_SEQ> <TARGET_ACK>; ssh -i id_rsa -o StrictHostKeyChecking=no wouter@localhost

이 단계에서는 공개 키를 인가하여 해당 개인 키와의 SSH 연결을 활성화합니다.

참고 자료

htARTE (HackTricks AWS Red Team Expert)를 통해 AWS 해킹을 처음부터 전문가까지 배워보세요!

HackTricks를 지원하는 다른 방법:

最終更新