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 kimsingi inakusaidia kuendesha terraform kutoka kwa Pull Requests kutoka kwa seva yako ya git.
Tembelea ukurasa wa toleo la atlantis katika https://github.com/runatlantis/atlantis/releases na pakua ile inayokufaa.
Unda token ya kibinafsi (ikiwa na ufikiaji wa repo) ya mtumiaji wako wa github
Tekeleza ./atlantis testdrive
na itaunda demo repo ambayo unaweza kutumia ku zungumza na atlantis
Unaweza kufikia ukurasa wa wavuti katika 127.0.0.1:4141
Atlantis inasaidia wahost wa git kadhaa 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.
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.
Atlantis itakuwa ikifichua webhooks ili seva ya git iweze kutuma habari. Kutoka kwa mtazamo wa washambuliaji itakuwa ya kuvutia kujua kama unaweza kutuma ujumbe.
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 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.
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
ndizo za kawaida).
Usanidi wa atlantis server
unaweza kuainishwa kupitia bendera za mistari ya amri, mabadiliko ya mazingira, faili ya usanidi au mchanganyiko wa tatu.
Unaweza kupata hapa orodha ya bendera zinazosaidiwa na seva ya Atlantis
Thamani zinachaguliwa katika mpangilio huu:
Bendera
Mabadiliko ya Mazingira
Faili ya Usanidi
Kumbuka kwamba katika usanidi unaweza kupata thamani za kuvutia kama tokens na nywila.
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:
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.
Huenda ikahitajika kuruhusiwa na bendera kama allowed_overrides
au allow_custom_workflows
Server Side Config: Unaweza kuipitia kwa bendera --repo-config
na ni yaml inayopanga mipangilio mipya kwa kila repo (regexes zinasaidiwa)
Thamani za Default
PR Protections
Atlantis inaruhusu kuashiria ikiwa unataka PR iwe imeidhinishwa
na mtu mwingine (hata kama hiyo haijakubaliwa 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 inasisitiza workflow
ili kufuta workflow ambayo itatumika.
Hii itatoa RCE katika seva ya Atlantis kwa mtumiaji yeyote anayeweza kufikia repo hiyo.
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 the docs.
Katika the docs unaweza kupata chaguzi unazoweza kutumia kuendesha Atlantis:
Ikiwa wakati wa matumizi unakutana na kosa hili: Error: Error acquiring the state lock
Unaweza kulitatua kwa kukimbia:
Ikiwa una ruhusa ya kuandika juu ya hifadhi, utaweza kuunda tawi jipya juu yake na kuunda 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
:
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:
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.
Unaweza dump secrets zinazotumiwa na terraform ukikimbia atlantis plan
(terraform plan
) kwa kuweka kitu kama hiki katika faili ya terraform:
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).
Angalia kupita ulinzi wa tawi
Imeidhinishwa: Ikiwa ulinzi huu umewekwa katika Atlantis, mtumiaji mwingine lazima aidhinishe PR kabla hujaweza kufanya atlantis apply
Kwa kawaida unaweza kutumia token ya Gitbot kupita ulinzi huu
Kufanya terraform apply
kwenye faili mbaya ya Terraform yenye local-exec.
Unahitaji tu kuhakikisha kuwa payload kama hizi inamalizika katika faili ya main.tf
:
Fuata mapendekezo kutoka kwa mbinu ya awali ili kufanya shambulio hili kwa njia ya siri.
Wakati wa kuendesha atlantis plan
au atlantis apply
, terraform inatekelezwa chini, unaweza kupitisha amri kwa terraform kutoka atlantis kwa kuandika kitu kama:
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
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.
Hii itatoa RCE katika seva ya Atlantis kwa mtumiaji yeyote anayeweza kufikia repo hiyo.
Ikiwa bendera ya server side config allowed_overrides
ime sanidiwa apply_requirements
, inawezekana kwa repo kubadilisha mipango/kinga za matumizi ili kuzipita.
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:
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 Cloud haiungi mkono 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 utakuwa wa kupanga/kuomba kwenye repos zako.
Ili kuzuia hili, ruhusu anwani za IP za Bitbucket (angalia anwani za IPv4 za nje).
Ikiwa umeweza kupata ufikiaji wa seva au angalau umepata LFI kuna mambo 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)
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.
--allow-fork-prs
Ikiwa unafanya kazi kwenye repo ya umma (ambayo haipendekezwi, 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 itakayo kubali 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 hatari bila pia kuweka siri ya webhook.
Bendera hii inahakikisha usakinishaji wako wa Atlantis haujatumika na repos usizodhibiti. Angalia atlantis server --help
kwa maelezo zaidi.
Ikiwa washambuliaji wanaowasilisha ombi za 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:
Kuunda watoa huduma ndani ya picha ya Atlantis au mwenyeji na kukataa egress katika uzalishaji.
Tekeleza itifaki ya rejista ya mtoa huduma ndani na kukataa egress ya umma, kwa njia hiyo unadhibiti nani ana ufikiaji wa kuandika kwenye rejista.
Badilisha mipangilio ya repo upande wa seva's plan
hatua 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, kwa mfano, kuhitaji "thumbs-up" kwenye PR kabla ya kuruhusu plan
kuendelea. Conftest inaweza kuwa ya msaada hapa.
Atlantis inapaswa kuendeshwa na siri za Webhook zilizowekwa kupitia mazingira ya $ATLANTIS_GH_WEBHOOK_SECRET
/$ATLANTIS_GITLAB_WEBHOOK_SECRET
. Hata na bendera 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 inasaidia kutuma kichwa cha uthibitishaji wa msingi katika matukio yote ya webhook. Hii inahitaji kutumia URL ya HTTPS kwa eneo lako la webhook.
Ikiwa unatumia siri za webhook lakini trafiki yako iko juu ya HTTP basi siri za webhook zinaweza kuibiwa. Wezesha SSL/HTTPS kwa kutumia bendera za --ssl-cert-file
na --ssl-key-file
.
Inapendekezwa sana kuwezesha uthibitishaji katika huduma ya wavuti. Wezesha BasicAuth kwa kutumia --web-basic-auth=true
na weka jina la mtumiaji na nenosiri kwa kutumia bendera za --web-username=yourUsername
na --web-password=yourPassword
.
Unaweza pia kupitisha hizi kama mazingira ya mabadiliko ATLANTIS_WEB_BASIC_AUTH=true
ATLANTIS_WEB_USERNAME=yourUsername
na 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)