Atlantis Security
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Atlantis u suštini pomaže vam da pokrenete terraform iz Pull Requests sa vašeg git servera.
Idite na atlantis releases page na https://github.com/runatlantis/atlantis/releases i preuzmite onaj koji vam odgovara.
Kreirajte lični token (sa pristupom repozitorijumu) vašeg github korisnika.
Izvršite ./atlantis testdrive
i to će kreirati demo repo koji možete koristiti da komunicirate sa atlantis.
Možete pristupiti web stranici na 127.0.0.1:4141.
Atlantis podržava nekoliko git hostova kao što su Github, Gitlab, Bitbucket i Azure DevOps. Međutim, da bi pristupio repozitorijumima na tim platformama i izvršio akcije, potrebno je da ima određeni privilegovan pristup (barem prava za pisanje). Dokumentacija preporučuje da se kreira korisnik na ovim platformama posebno za Atlantis, ali neki ljudi mogu koristiti lične naloge.
U svakom slučaju, iz perspektive napadača, Atlantis nalog će biti veoma interesantan za kompromitovanje.
Atlantis koristi opcionalno Webhook secrets da bi potvrdio da su webhook-ovi koje prima sa vašeg Git hosta legitimni.
Jedan način da to potvrdite bio bi da dozvolite zahteve da dolaze samo sa IP adresa vašeg Git hosta, ali lakši način je korišćenje Webhook Secret-a.
Napomena: osim ako ne koristite privatni github ili bitbucket server, moraćete da izložite webhook krajnje tačke internetu.
Atlantis će izlagati webhook-ove kako bi git server mogao da mu šalje informacije. Iz perspektive napadača, bilo bi zanimljivo znati da li možete slati poruke.
Atlantis pokreće Terraform jednostavno izvršavajući terraform plan
i apply
komande na serveru na kojem je Atlantis hostovan. Baš kao kada pokrećete Terraform lokalno, Atlantis treba kredencijale za vaš specifični provajder.
Na vama je kako obezbedite kredencijale za vaš specifični provajder Atlantis-u:
Atlantis Helm Chart i AWS Fargate Module imaju svoje mehanizme za kredencijale provajdera. Pročitajte njihovu dokumentaciju.
Ako pokrećete Atlantis u oblaku, mnogi oblaci imaju načine da daju pristup API-ju oblaka aplikacijama koje se na njima pokreću, npr:
AWS EC2 Roles (Pretražite "EC2 Role")
Mnogi korisnici postavljaju promenljive okruženja, npr. AWS_ACCESS_KEY
, gde se Atlantis pokreće.
Drugi kreiraju potrebne konfiguracione datoteke, npr. ~/.aws/credentials
, gde se Atlantis pokreće.
Koristite HashiCorp Vault Provider da dobijete kredencijale provajdera.
Kontejner u kojem Atlantis radi će verovatno sadržati privilegovane kredencijale za provajdere (AWS, GCP, Github...) koje Atlantis upravlja putem Terraforma.
Podrazumevano, Atlantis će pokrenuti web stranicu na portu 4141 na localhost-u. Ova stranica samo omogućava da omogućite/onemogućite atlantis apply i proverite status plana repozitorijuma i otključate ih (ne dozvoljava da se stvari menjaju, tako da nije toliko korisna).
Verovatno je nećete naći izloženu internetu, ali izgleda da podrazumevano nema potrebnih kredencijala za pristup (a ako ih ima, atlantis
:atlantis
su podrazumevani).
Konfiguracija za atlantis server
može se specificirati putem komandnih linijskih zastavica, promenljivih okruženja, konfiguracione datoteke ili kombinacije tri.
Možete pronaći ovde listu zastavica koje podržava Atlantis server.
Vrednosti se biraju u ovom redosledu:
Zastavice
Promenljive okruženja
Konfiguraciona datoteka
Napomena: u konfiguraciji možete pronaći zanimljive vrednosti kao što su tokeni i lozinke.
Neke konfiguracije utiču na kako se upravlja repozitorijumima. Međutim, moguće je da svaki repozitorijum zahteva različite postavke, tako da postoje načini da se specificira svaki repozitorijum. Ovo je redosled prioriteta:
Repo /atlantis.yml
datoteka. Ova datoteka se može koristiti da specificira kako atlantis treba da tretira repozitorijum. Međutim, podrazumevano neke ključeve nije moguće specificirati ovde bez nekih zastavica koje to omogućavaju.
Verovatno je potrebno da bude dozvoljeno zastavicama kao što su allowed_overrides
ili allow_custom_workflows
.
Server Side Config: Možete je proslediti sa zastavicom --repo-config
i to je yaml koji konfiguriše nove postavke za svaki repozitorijum (regexi su podržani).
Podrazumevane vrednosti.
PR Protections
Atlantis omogućava da naznačite da li želite da PR bude odobren
od strane nekog drugog (čak i ako to nije postavljeno u zaštiti grane) i/ili da bude spajiv
(zaštite grane su prošle) pre nego što se izvrši apply. Sa bezbednosnog stanovišta, preporučuje se postaviti obe opcije.
U slučaju da je allowed_overrides
True, ova podešavanja mogu biti prepisana u svakom projektu putem datoteke /atlantis.yml
.
Scripts
Konfiguracija repozitorijuma može specificirati skripte koje će se izvršiti pre (pre workflow hooks) i posle (post workflow hooks) kada se workflow izvrši.
Ne postoji opcija da se specificiraju ove skripte u repo /atlantis.yml
datoteci.
Workflow
U konfiguraciji repozitorijuma (server side config) možete specificirati novi podrazumevani workflow, ili kreirati nove prilagođene workflow-e. Takođe možete specificirati koji repozitorijumi mogu pristupiti novim generisanim. Zatim, možete dozvoliti atlantis.yaml datoteci svakog repozitorijuma da specificira workflow koji će se koristiti.
Ako je server side config zastavica allow_custom_workflows
postavljena na True, workflow-i se mogu specificirati u atlantis.yaml
datoteci svakog repozitorijuma. Takođe je potencijalno potrebno da allowed_overrides
takođe specificira workflow
da prepiše workflow koji će se koristiti.
Ovo će u osnovi dati RCE na Atlantis serveru bilo kojem korisniku koji može pristupiti tom repozitorijumu.
Provera Conftest Politika
Atlantis podržava pokretanje server-side conftest politika protiv izlaza plana. Uobičajeni slučajevi korišćenja ovog koraka uključuju:
Odbijanje korišćenja liste modula
Potvrđivanje atributa resursa u trenutku kreiranja
Hvatanje nenamernih brisanja resursa
Sprečavanje bezbednosnih rizika (npr. izlaganje sigurnih portova javnosti)
Možete proveriti kako da ga konfigurišete u dokumentaciji.
U dokumentaciji možete pronaći opcije koje možete koristiti za pokretanje Atlantisa:
Ako tokom eksploatacije naiđete na ovu grešku: Error: Error acquiring the state lock
Možete je ispraviti pokretanjem:
Ako imate pristup za pisanje u repozitorijum, moći ćete da kreirate novu granu i generišete PR. Ako možete izvršiti atlantis plan
(ili možda se automatski izvršava) moći ćete da RCE unutar Atlantis servera.
Možete to uraditi tako što ćete naterati Atlantis da učita spoljašnji izvor podataka. Samo stavite payload kao što je sledeći u main.tf
datoteku:
Tajni napad
Možete izvesti ovaj napad čak i na tajniji način, prateći ove sugestije:
Umesto da direktno dodate rev shell u terraform datoteku, možete učitati spoljašnji resurs koji sadrži rev shell:
Možete pronaći rev shell kod na https://github.com/carlospolop/terraform_external_module_rev_shell/tree/main/modules
U spoljnim resursima, koristite ref funkciju da sakrijete terraform rev shell kod u grani unutar repozitorijuma, nešto poput: git@github.com:carlospolop/terraform_external_module_rev_shell//modules?ref=b401d2b
Umesto da kreirate PR za master da pokrenete Atlantis, napravite 2 grane (test1 i test2) i kreirajte PR od jedne do druge. Kada završite napad, samo uklonite PR i grane.
Možete dumpovati tajne korišćene od strane terraform pokretanjem atlantis plan
(terraform plan
) tako što ćete staviti nešto poput ovoga u terraform datoteku:
Ako imate pristup za pisanje u repozitorijum, moći ćete da kreirate novu granu i generišete PR. Ako možete izvršiti atlantis apply
, moći ćete da RCE unutar Atlantis servera.
Međutim, obično ćete morati da zaobiđete neke zaštite:
Mergeable: Ako je ova zaštita postavljena u Atlantis-u, možete pokrenuti atlantis apply
samo ako je PR spojiv (što znači da zaštita grane mora biti zaobiđena).
Proverite potencijalne zaštite grane zaobilaženja
Approved: Ako je ova zaštita postavljena u Atlantis-u, neki drugi korisnik mora odobriti PR pre nego što možete pokrenuti atlantis apply
Po defaultu, možete zloupotrebiti Gitbot token da zaobiđete ovu zaštitu
Pokretanje terraform apply
na malicioznom Terraform fajlu sa local-exec.
Samo treba da se pobrinete da neki payload poput sledećih završi u main.tf
fajlu:
Sledite preporukama iz prethodne tehnike da izvršite ovaj napad na diskretniji način.
Kada pokrećete atlantis plan
ili atlantis apply
, terraform se pokreće ispod, možete proslediti komande terraformu iz atlantisa komentarišući nešto poput:
Nešto što možete proći su env varijable koje mogu biti korisne za zaobilaženje nekih zaštita. Proverite terraform env varijable na https://www.terraform.io/cli/config/environment-variables
Pokretanje malicioznih prilagođenih build komandi navedenih u atlantis.yaml
datoteci. Atlantis koristi atlantis.yaml
datoteku iz grane pull zahteva, ne iz master
.
Ova mogućnost je pomenuta u prethodnom odeljku:
Ako je server side config zastavica allow_custom_workflows
postavljena na True, tokovi rada mogu biti navedeni u atlantis.yaml
datoteci svake repozitorijuma. Takođe je potencijalno potrebno da allowed_overrides
takođe specificira workflow
da bi se prepisao tok rada koji će se koristiti.
Ovo će u osnovi dati RCE na Atlantis serveru bilo kojem korisniku koji može pristupiti tom repozitorijumu.
Ako je server side config oznaka allowed_overrides
konfigurisana za apply_requirements
, moguće je da repozitorijum modifikuje plan/apply zaštite kako bi ih zaobišao.
Ako neko pošalje atlantis plan/apply
komentare na vašim validnim pull request-ima, to će uzrokovati da terraform radi kada to ne želite.
Štaviše, ako nemate podešeno u branch protection da traži da se ponovo proceni svaki PR kada se novi commit pošalje na njega, neko bi mogao da napisuje zloćudne konfiguracije (proverite prethodne scenarije) u terraform konfiguraciji, pokrene atlantis plan/apply
i dobije RCE.
Ovo je podešavanje u Github branch zaštitama:
Ako uspete da ukradete webhook secret koji se koristi ili ako nema webhook secret koji se koristi, mogli biste pozvati Atlantis webhook i izvršiti atlantis komande direktno.
Bitbucket Cloud ne podržava webhook secrets. Ovo bi moglo omogućiti napadačima da lažiraju zahteve iz Bitbucket-a. Osigurajte da dozvoljavate samo Bitbucket IP adrese.
To znači da bi napadač mogao da napravi lažne zahteve ka Atlantis-u koji izgledaju kao da dolaze iz Bitbucket-a.
Ako specificirate --repo-allowlist
, onda bi mogli samo da lažiraju zahteve koji se odnose na te repozitorijume, tako da bi najveća šteta koju bi mogli da naprave bila planiranje/aplikacija na vašim repozitorijumima.
Da biste to sprečili, dozvolite Bitbucket-ove IP adrese (vidi Outbound IPv4 adrese).
Ako ste uspeli da dobijete pristup serveru ili barem ste dobili LFI, postoje neke zanimljive stvari koje biste trebali pokušati da pročitate:
/home/atlantis/.git-credentials
Sadrži vcs pristupne akreditive
/atlantis-data/atlantis.db
Sadrži vcs pristupne akreditive sa više informacija
/atlantis-data/repos/<org_name>
/
<repo_name>/<pr_num>/<workspace>/<path_to_dir>/.terraform/terraform.tfstate
Terraform stanje datoteke
Primer: /atlantis-data/repos/ghOrg_/_myRepo/20/default/env/prod/.terraform/terraform.tfstate
/proc/1/environ
Env varijable
/proc/[2-20]/cmdline
Cmd linija atlantis server
(može sadržati osetljive podatke)
Pošto bilo ko može komentarisati na javnim pull request-ima, čak i sa svim dostupnim bezbednosnim mitigacijama, i dalje je opasno pokretati Atlantis na javnim repozitorijumima bez pravilne konfiguracije bezbednosnih podešavanja.
--allow-fork-prs
Ako radite na javnom repozitorijumu (što nije preporučljivo, vidi iznad), ne biste trebali postaviti --allow-fork-prs
(podrazumevano je false) jer bilo ko može otvoriti pull request iz svog fork-a ka vašem repozitorijumu.
--repo-allowlist
Atlantis zahteva da navedete allowlist repozitorijuma sa kojih će prihvatati webhooks putem --repo-allowlist
zastavice. Na primer:
Specifični repozitorijumi: --repo-allowlist=github.com/runatlantis/atlantis,github.com/runatlantis/atlantis-tests
Cela vaša organizacija: --repo-allowlist=github.com/runatlantis/*
Svaki repozitorijum u vašem GitHub Enterprise instalaciji: --repo-allowlist=github.yourcompany.com/*
Svi repozitorijumi: --repo-allowlist=*
. Korisno kada ste u zaštićenoj mreži, ali opasno bez takođe postavljenog webhook secret-a.
Ova zastavica osigurava da vaša Atlantis instalacija nije korišćena sa repozitorijumima koje ne kontrolišete. Vidi atlantis server --help
za više detalja.
Ako su napadači koji šalju pull request-e sa zloćudnim Terraform kodom u vašem modelu pretnje, onda morate biti svesni da odobrenja za terraform apply
nisu dovoljna. Moguće je pokrenuti zloćudni kod u terraform plan
koristeći external
data source ili specificirajući zloćudnog provajdera. Ovaj kod bi mogao da eksfiltrira vaše akreditive.
Da biste to sprečili, mogli biste:
Ugraditi provajdere u Atlantis sliku ili hostovati i odbiti izlaz u produkciji.
Implementirati protokol za registraciju provajdera interno i odbiti javni izlaz, tako da kontrolišete ko ima pristup za pisanje u registru.
Izmeniti vašu server-side repo konfiguraciju's plan
korak da validira upotrebu zabranjenih provajdera ili data source-ova ili PR-ova od neodobrenih korisnika. Takođe možete dodati dodatnu validaciju u ovom trenutku, npr. zahtevajući "thumbs-up" na PR-u pre nego što dozvolite da plan
nastavi. Conftest bi mogao biti od pomoći ovde.
Atlantis bi trebao da se pokreće sa Webhook secret-ima postavljenim putem $ATLANTIS_GH_WEBHOOK_SECRET
/$ATLANTIS_GITLAB_WEBHOOK_SECRET
environment varijabli. Čak i sa postavljenom --repo-allowlist
zastavicom, bez webhook secret-a, napadači bi mogli slati zahteve ka Atlantis-u predstavljajući se kao repozitorijum koji je na allowlisti. Webhook secrets osiguravaju da webhook zahtevi zapravo dolaze od vašeg VCS provajdera (GitHub ili GitLab).
Ako koristite Azure DevOps, umesto webhook secret-a dodajte osnovno korisničko ime i lozinku.
Azure DevOps podržava slanje osnovnog autentifikacionog header-a u svim webhook događajima. Ovo zahteva korišćenje HTTPS URL-a za vašu webhook lokaciju.
Ako koristite webhook secrets, ali je vaš saobraćaj preko HTTP-a, tada bi webhook secrets mogli biti ukradeni. Omogućite SSL/HTTPS koristeći --ssl-cert-file
i --ssl-key-file
zastavice.
Veoma se preporučuje omogućiti autentifikaciju u web servisu. Omogućite BasicAuth koristeći --web-basic-auth=true
i postavite korisničko ime i lozinku koristeći --web-username=yourUsername
i --web-password=yourPassword
zastavice.
Takođe možete proslediti ovo kao environment varijable ATLANTIS_WEB_BASIC_AUTH=true
ATLANTIS_WEB_USERNAME=yourUsername
i ATLANTIS_WEB_PASSWORD=yourPassword
.
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)