GCP - Network Docker Escape

Support HackTricks

Initial State

Katika maandiko yote mawili ambapo mbinu hii imeelezwa, washambuliaji walifanikiwa kupata root access ndani ya Docker container inayosimamiwa na GCP ikiwa na ufikiaji wa mtandao wa mwenyeji (na uwezo wa CAP_NET_ADMIN na CAP_NET_RAW).

Attack Explanation

Katika mfano wa Google Compute Engine, ukaguzi wa kawaida wa trafiki ya mtandao unaonyesha maombi mengi ya plain HTTP requests kwa metadata instance kwenye 169.254.169.254. Google Guest Agent, huduma ya chanzo wazi, mara kwa mara hufanya maombi kama haya.

Agenti hii imeundwa ili kufuatilia mabadiliko katika metadata. Kwa kuzingatia, metadata inajumuisha sehemu ya funguo za umma za SSH. Wakati funguo mpya za umma za SSH zinapoongezwa kwenye metadata, agenti kiotomatiki inaidhinisha katika faili ya .authorized_key. Inaweza pia kuunda mtumiaji mpya na kuwajumuisha kwenye sudoers ikiwa inahitajika.

Agenti inafuatilia mabadiliko kwa kutuma ombi la kurejesha thamani zote za metadata kwa njia ya kurudiarudia (GET /computeMetadata/v1/?recursive=true). Ombi hili limeundwa ili kumlazimisha seva ya metadata kutuma jibu tu ikiwa kuna mabadiliko yoyote katika metadata tangu urejelezi wa mwisho, unaotambulika kwa Etag (wait_for_change=true&last_etag=). Zaidi ya hayo, parameter ya timeout (timeout_sec=) imejumuishwa. Ikiwa hakuna mabadiliko yanayotokea ndani ya muda ulioainishwa, seva inajibu kwa thamani zisizobadilika.

Mchakato huu unaruhusu IMDS (Instance Metadata Service) kujibu baada ya sekunde 60 ikiwa hakuna mabadiliko ya usanidi yaliyotokea, na kuunda dirisha la uwezekano wa kuingiza jibu bandia la usanidi kwa agenti wa wageni.

Mshambuliaji anaweza kutumia hii kwa kufanya Man-in-the-Middle (MitM) attack, akidanganya jibu kutoka kwa seva ya IMDS na kuingiza funguo mpya za umma. Hii inaweza kuwezesha ufikiaji usioidhinishwa wa SSH kwa mwenyeji.

Escape Technique

Ingawa ARP spoofing haiwezi kufanya kazi kwenye mitandao ya Google Compute Engine, toleo lililobadilishwa la rshijack lililotengenezwa na Ezequiel linaweza kutumika kwa kuingiza pakiti katika mawasiliano ili kuingiza mtumiaji wa SSH.

Toleo hili la rshijack linaruhusu kuingiza nambari za ACK na SEQ kama hoja za amri, kurahisisha kudanganya jibu kabla ya jibu halisi la seva ya Metadata. Zaidi ya hayo, script ndogo ya Shell inatumika kurudisha payload iliyoundwa kwa njia maalum. Payload hii inasababisha Google Guest Agent kuunda mtumiaji wouter akiwa na funguo maalum ya umma katika faili ya .authorized_keys.

Script inatumia ETag ile ile ili kuzuia seva ya Metadata kutangaza mara moja kwa Google Guest Agent kuhusu thamani tofauti za metadata, hivyo kuchelewesha jibu.

Ili kutekeleza kudanganya, hatua zifuatazo zinahitajika:

  1. Fuatilia maombi kwa seva ya Metadata kwa kutumia tcpdump:

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

Tafuta mstari unaofanana na:

<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. Tuma metadata bandia na ETAG sahihi kwa 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

Hatu hii inaruhusu funguo ya umma, ikiruhusu muunganisho wa SSH na funguo binafsi inayolingana.

Marejeo

Support HackTricks

Last updated