Jenkins 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)
Jenkins ni chombo kinachotoa njia rahisi ya kuanzisha kuunganishwa endelevu au kutoa endelevu (CI/CD) mazingira kwa karibu mchanganyiko wowote wa lugha za programu na hifadhi za msimbo wa chanzo kwa kutumia pipelines. Zaidi ya hayo, inafanya kazi mbalimbali za kawaida za maendeleo kiotomatiki. Ingawa Jenkins haiondoi hitaji la kuunda scripts kwa hatua za kibinafsi, inatoa njia ya haraka na yenye nguvu zaidi ya kuunganisha mfululizo mzima wa zana za kujenga, kujaribu, na kutekeleza kuliko mtu anavyoweza kujenga kwa urahisi kwa mikono.
Basic Jenkins InformationIli kutafuta kurasa za Jenkins zinazovutia bila uthibitisho kama (/people au /asynchPeople, hii inataja watumiaji wa sasa) unaweza kutumia:
Angalia kama unaweza kutekeleza amri bila kuhitaji uthibitisho:
Bila kuwa na akreditif, unaweza kuangalia ndani ya /asynchPeople/ au /securityRealm/user/admin/search/index?q= kwa majina ya watumiaji.
Unaweza kupata toleo la Jenkins kutoka kwenye njia /oops au /error.
Katika taarifa za msingi unaweza kuangalia njia zote za kuingia ndani ya Jenkins:
Basic Jenkins InformationUtakuwa na uwezo wa kupata mifano ya Jenkins ambazo zinakuruhusu kuunda akaunti na kuingia ndani yake. Rahisi kama hiyo.
Pia ikiwa SSO ufunctionality/plugins zilikuwepo basi unapaswa kujaribu kuingia kwenye programu kwa kutumia akaunti ya majaribio (yaani, akaunti ya majaribio ya Github/Bitbucket). Njia kutoka hapa.
Jenkins haina sera ya nywila na kuzuia nguvu za nywila za majina ya watumiaji. Ni muhimu kujaribu nguvu watumiaji kwani nywila dhaifu au majina ya watumiaji kama nywila yanaweza kutumika, hata majina ya watumiaji yaliyogeuzwa kuwa nywila.
Tumia hii script ya python au hii script ya powershell.
Mashirika mengi yanachanganya mifumo ya usimamizi wa chanzo wa SaaS kama GitHub au GitLab na ufumbuzi wa CI wa ndani, uliojitegemea kama Jenkins au TeamCity. Mpangilio huu unaruhusu mifumo ya CI kupokea matukio ya webhook kutoka kwa wauzaji wa chanzo wa SaaS, hasa kwa ajili ya kuanzisha kazi za pipeline.
Ili kufanikisha hili, mashirika yanawajali mipango ya IP ya mifumo ya SCM, ikiruhusu kufikia mfumo wa CI wa ndani kupitia webhooks. Hata hivyo, ni muhimu kutambua kwamba mtu yeyote anaweza kuunda akaunti kwenye GitHub au GitLab na kuiseti ili kuanzisha webhook, ambayo inaweza kutuma maombi kwa mfumo wa CI wa ndani.
Katika hali hizi tutadhani una akaunti halali ya kufikia Jenkins.
Kulingana na mekanismu ya Uidhinishaji iliyowekwa katika Jenkins na ruhusa ya mtumiaji aliyeathirika, huenda ukawa na uwezo au usiwe na uwezo wa kufanya mashambulizi yafuatayo.
Kwa maelezo zaidi angalia taarifa za msingi:
Basic Jenkins InformationIkiwa umefikia Jenkins unaweza orodhesha watumiaji wengine waliojiandikisha katika http://127.0.0.1:8080/asynchPeople/
Tumia hii script kutupa matokeo ya console ya ujenzi na mabadiliko ya mazingira ya ujenzi ili kutumaini kupata siri za wazi.
Ikiwa mtumiaji aliyeathirika ana mamlaka ya kutosha kuunda/kubadilisha node mpya ya Jenkins na akida za SSH tayari zimehifadhiwa ili kufikia nodi nyingine, anaweza kuiba akida hizo kwa kuunda/kubadilisha node na kuweka mwenyeji ambaye atarekodi akida hizo bila kuthibitisha funguo za mwenyeji:
Kwa kawaida utapata akida za ssh za Jenkins katika mtoa huduma wa kimataifa (/credentials/
), hivyo unaweza pia kuzitupa kama unavyotupa siri nyingine yoyote. Taarifa zaidi katika Sehemu ya Kutupa siri.
Kupata shell katika seva ya Jenkins inampa mshambuliaji fursa ya kuvuja siri zote na mabadiliko ya mazingira na kufanya kazi na mashine nyingine zilizoko katika mtandao mmoja au hata kusanya akida za wingu.
Kwa kawaida, Jenkins itakuwa ikifanya kazi kama SYSTEM. Hivyo, kuathiriwa kwake kutampa mshambuliaji mamlaka ya SYSTEM.
Kuunda/Kubadilisha mradi ni njia ya kupata RCE juu ya seva ya Jenkins:
Jenkins RCE Creating/Modifying ProjectUnaweza pia kupata RCE kwa kutekeleza script ya Groovy, ambayo inaweza kuwa ya siri zaidi kuliko kuunda mradi mpya:
Jenkins RCE with Groovy ScriptUnaweza pia kupata RCE kwa kuunda/kubadilisha pipeline:
Jenkins RCE Creating/Modifying PipelineIli kutumia pipelines bado unahitaji kuwa na ufikiaji wa Jenkins.
Pipelines zinaweza pia kutumika kama mekanismu ya kujenga katika miradi, katika kesi hiyo inaweza kuwekewa faili ndani ya hazina ambayo itakuwa na sintaksia ya pipeline. Kwa kawaida /Jenkinsfile
inatumika:
Pia inawezekana kuhifadhi faili za usanidi wa pipeline mahali pengine (katika hazina nyingine kwa mfano) kwa lengo la kutenganisha ufikiaji wa hazina na ufikiaji wa pipeline.
Ikiwa mshambuliaji ana ufikiaji wa kuandika juu ya faili hiyo atakuwa na uwezo wa kuyabadilisha na kuzindua pipeline bila hata kuwa na ufikiaji wa Jenkins. Inawezekana kwamba mshambuliaji atahitaji kuzidi baadhi ya ulinzi wa tawi (kutegemea jukwaa na mamlaka za mtumiaji wanaweza kuzidiwa au la).
Vichocheo vya kawaida vya kutekeleza pipeline ya kawaida ni:
Ombi la kuvuta kwenye tawi kuu (au labda kwenye matawi mengine)
Kusukuma kwenye tawi kuu (au labda kwenye matawi mengine)
Kusasisha tawi kuu na kusubiri hadi itekelezwe kwa namna fulani
Ikiwa wewe ni mtumiaji wa nje huwezi kutarajia kuunda PR kwenye tawi kuu la hazina ya mtumiaji/taasisi nyingine na kuzindua pipeline... lakini ikiwa ime pangwa vibaya unaweza kabisa kuathiri kampuni kwa kutumia hili.
Katika sehemu ya awali ya RCE tayari ilionyeshwa mbinu ya kupata RCE kwa kubadilisha pipeline.
Inawezekana kutangaza mabadiliko ya mazingira ya maandiko kwa pipeline nzima au kwa hatua maalum. Mabadiliko haya ya mazingira hayapaswi kuwa na taarifa nyeti, lakini mshambuliaji anaweza kila wakati kuangalia usanidi wote wa pipeline/Jenkinsfiles:
Kwa maelezo kuhusu jinsi siri zinavyoshughulikiwa na Jenkins angalia taarifa za msingi:
Basic Jenkins InformationAkreditivu zinaweza kuwa na mipaka kwa watoa huduma wa kimataifa (/credentials/
) au kwa miradi maalum (/job/<project-name>/configure
). Hivyo, ili kuweza kuhamasisha zote unahitaji kushambulia angalau miradi yote ambayo ina siri na kutekeleza mipangilio ya kawaida/iliyoshawishiwa.
Kuna tatizo lingine, ili kupata siri ndani ya env ya pipeline unahitaji kujua jina na aina ya siri. Kwa mfano, ukijaribu kuchota usernamePassword
siri kama string
siri utapata kosa hili:
Hapa kuna njia ya kupakia aina kadhaa za siri za kawaida:
Katika mwisho wa ukurasa huu unaweza kupata aina zote za akreditivu: https://www.jenkins.io/doc/pipeline/steps/credentials-binding/
Njia bora ya kutoa siri zote kwa wakati mmoja ni kwa kuathiri mashine ya Jenkins (kufanya kazi na shell ya nyuma katika node iliyo ndani kwa mfano) na kisha kuvuja funguo kuu na siri zilizofichwa na kuzifungua bila mtandao. Zaidi juu ya jinsi ya kufanya hivi katika sehemu ya Nodes & Agents na katika sehemu ya Post Exploitation.
Kutoka nyaraka: Maagizo ya triggers
yanafafanua njia za kiotomatiki ambazo Pipeline inapaswa kuanzishwa tena. Kwa Pipelines ambazo zimeunganishwa na chanzo kama GitHub au BitBucket, triggers
huenda zisihitajike kwani uunganisho wa msingi wa webhooks tayari utakuwepo. Vichocheo vilivyopo kwa sasa ni cron
, pollSCM
na upstream
.
Mfano wa Cron:
Check other examples in the docs.
A Jenkins instance might have different agents running in different machines. From an attacker perspective, access to different machines means different potential cloud credentials to steal or different network access that could be abuse to exploit other machines.
For more information check the basic information:
Basic Jenkins InformationYou can enumerate the configured nodes in /computer/
, you will usually find the Built-In Node
(which is the node running Jenkins) and potentially more:
It is specially interesting to compromise the Built-In node because it contains sensitive Jenkins information.
To indicate you want to run the pipeline in the built-in Jenkins node you can specify inside the pipeline the following config:
Pipeline katika wakala maalum, na kichocheo cha cron, na mabadiliko ya pipeline na hatua, ikipakia mabadiliko 2 katika hatua na kutuma shell ya kinyume:
Unaweza orodhesha siri kwa kufikia /credentials/
ikiwa una ruhusa za kutosha. Kumbuka kwamba hii itataja tu siri zilizo ndani ya faili credentials.xml
, lakini faili za usanidi wa ujenzi zinaweza pia kuwa na siri zaidi.
Ikiwa unaweza kuona usanidi wa kila mradi, unaweza pia kuona huko majina ya siri (credentials) yanayotumika kufikia hifadhi na siri nyingine za mradi.
Faili hizi zinahitajika ili kufichua siri za Jenkins:
secrets/master.key
secrets/hudson.util.Secret
Siri kama hizo kwa kawaida zinaweza kupatikana katika:
credentials.xml
jobs/.../build.xml
jobs/.../config.xml
Hapa kuna regex ya kuzipata:
Ikiwa umepata neno la siri zinazohitajika kufungua siri hizo, tumia hii script kufungua siri hizo.
Fikia faili la Jenkins config.xml katika /var/lib/jenkins/config.xml
au C:\Program Files (x86)\Jenkis\
Tafuta neno <useSecurity>true</useSecurity>
na badilisha neno true
kuwa false
.
sed -i -e 's/<useSecurity>true</<useSecurity>false</g' config.xml
Restart seva ya Jenkins: service jenkins restart
Sasa nenda kwenye portal ya Jenkins tena na Jenkins haitakuuliza akidi yoyote wakati huu. Unapita kwenye "Manage Jenkins" kuweka neno la siri la msimamizi tena.
Wezesha usalama tena kwa kubadilisha mipangilio kuwa <useSecurity>true</useSecurity>
na restart Jenkins tena.
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)