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 kwa muda mrefu au kutoa kwa muda mrefu (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 brute-force kwa majina ya watumiaji. Ni muhimu kujaribu brute-force 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 cha SaaS kama GitHub au GitLab na ufumbuzi wa CI wa ndani, uliojiendesha kama Jenkins au TeamCity. Mpangilio huu unaruhusu mifumo ya CI kupokea matukio ya webhook kutoka kwa wauzaji wa chanzo cha SaaS, hasa kwa ajili ya kuanzisha kazi za pipeline.
Ili kufanikisha hili, mashirika yanapitia orodha ya 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 ukaweza au usiweze 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 vigezo vya mazingira ya ujenzi ili kutumaini kupata siri za wazi.
Ikiwa mtumiaji aliyeathiriwa ana mamlaka ya kutosha kuunda/kubadilisha node mpya ya Jenkins na akili za SSH tayari zimehifadhiwa ili kufikia nodi nyingine, anaweza kuiba akili hizo kwa kuunda/kubadilisha node na kuweka mwenyeji ambaye atarekodi akili hizo bila kuthibitisha funguo za mwenyeji:
Kwa kawaida utapata akili 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 env na kufanya kazi na mashine nyingine zilizoko katika mtandao huo au hata kusanya akili 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 kuundwa 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).
Mhamasishaji wa kawaida zaidi wa kutekeleza pipeline maalum 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 env ya maandiko wazi kwa pipeline nzima au kwa hatua maalum. Mabadiliko haya ya env 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 mpangilio unahitaji kujua jina na aina ya siri. Kwa mfano, unajaribu kupakia usernamePassword
siri kama string
siri utapata kosa hili:
Hapa kuna njia ya kupakia aina kadhaa za siri za kawaida:
At the end of this page you can find all the credential types: https://www.jenkins.io/doc/pipeline/steps/credentials-binding/
Njia bora ya dump all the secrets at once ni kwa compromising mashine ya Jenkins (kufanya kazi na reverse shell katika built-in node kwa mfano) na kisha leaking master keys na encrypted secrets na kuzi-decrypt offline. Zaidi kuhusu jinsi ya kufanya hivi katika Nodes & Agents section na katika Post Exploitation section.
From the docs: The triggers
directive defines the automated ways in which the Pipeline should be re-triggered. For Pipelines which are integrated with a source such as GitHub or BitBucket, triggers
may not be necessary as webhooks-based integration will likely already be present. The triggers currently available are cron
, pollSCM
and upstream
.
Cron example:
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 pipeline na hatua za mazingira, ikipakia vigezo 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 nenosiri la msimamizi tena.
Wezesha usalama tena kwa kubadilisha mipangilio kuwa <useSecurity>true</useSecurity>
na restart Jenkins tena.
Jifunze & fanya mazoezi ya AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Jifunze & fanya mazoezi ya GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)