Jenkins Security
Основна інформація
Jenkins - це інструмент, який пропонує простий спосіб створення середовища постійної інтеграції або постійної доставки (CI/CD) для майже будь-якої комбінації мов програмування та сховищ коду за допомогою конвеїрів. Крім того, він автоматизує різноманітні рутинні завдання розробки. Хоча Jenkins не усуває потребу у створенні скриптів для окремих кроків, він надає швидший та надійніший спосіб інтеграції всієї послідовності інструментів збірки, тестування та розгортання, ніж можна легко побудувати вручну.
pageBasic Jenkins InformationНеаутентифікована енумерація
Для пошуку цікавих сторінок Jenkins без аутентифікації, таких як (/people або /asynchPeople, які перераховують поточних користувачів), ви можете використовувати:
Перевірте, чи можете ви виконувати команди без необхідності аутентифікації:
Без облікових даних ви можете переглянути вміст шляху /asynchPeople/ або /securityRealm/user/admin/search/index?q= для імен користувачів.
Можливо, ви зможете отримати версію Jenkins зі шляху /oops або /error
Відомі вразливості
Вхід
У базовій інформації ви можете перевірити всі способи входу в Jenkins:
pageBasic Jenkins InformationРеєстрація
Ви зможете знайти екземпляри Jenkins, які дозволяють вам створити обліковий запис та увійти в нього. Так просто.
SSO Вхід
Також, якщо функціональність SSO/plugins були присутні, вам слід спробувати увійти до програми за допомогою тестового облікового запису (тобто тестового Github/Bitbucket облікового запису). Хитрість з тут.
Брутфорс
Jenkins не має політики паролю та захисту від брутфорсу імен користувачів. Важливо брутфорсити користувачів, оскільки можуть використовуватися слабкі паролі або імена користувачів як паролі, навіть імена користувачів у зворотному порядку як паролі.
Поштовха пароля
Використовуйте цей скрипт Python або цей скрипт PowerShell.
Обхід білого списку IP-адрес
Багато організацій поєднують системи управління джерелами на основі SaaS (SCM), такі як GitHub або GitLab, з внутрішнім, самостійно розгортаним CI рішенням, таким як Jenkins або TeamCity. Ця настройка дозволяє системам CI отримувати події веб-гачків від постачальників контролю версій SaaS, переважно для спрацювання робочих процесів конвеєру.
Для досягнення цього організації включають в білий список діапазони IP-адрес платформ SCM, дозволяючи їм отримувати доступ до внутрішньої системи CI через веб-гачки. Однак важливо зауважити, що будь-хто може створити акаунт на GitHub або GitLab та налаштувати його для спрацювання веб-гачка, потенційно надсилаючи запити до внутрішньої системи CI.
Внутрішні зловживання Jenkins
У цих сценаріях ми будемо припускати, що у вас є дійсний обліковий запис для доступу до Jenkins.
Залежно від налаштованого механізму Авторизації в Jenkins та дозволів компрометованого користувача ви можете або не можете виконати наступні атаки.
Для отримання додаткової інформації перегляньте базову інформацію:
pageBasic Jenkins InformationПерелік користувачів
Якщо ви маєте доступ до Jenkins, ви можете переглянути інших зареєстрованих користувачів за адресою http://127.0.0.1:8080/asynchPeople/
Вивантаження збірок для пошуку текстових секретів
Використовуйте цей скрипт для вивантаження виводів консолі збірок та змінних середовища збірок, щоб, можливо, знайти текстові секрети.
Викрадення SSH-даних для входу
Якщо компрометований користувач має достатньо привілеїв для створення/зміни нового вузла Jenkins і SSH-дані для доступу до інших вузлів вже збережені, він може викрасти ці дані, створивши/змінивши вузол та встановивши хост, який буде записувати дані для входу без перевірки ключа хоста:
Зазвичай ви знайдете SSH-дані для Jenkins у глобальному постачальнику (/credentials/
), тому ви також можете їх витягти, як і будь-яку іншу секретну інформацію. Додаткова інформація в розділі Витягання секретів.
RCE в Jenkins
Отримання оболонки на сервері Jenkins дає зловмиснику можливість витікати всі секрети та змінні середовища та експлуатувати інші машини, що знаходяться в одній мережі або навіть збирати облікові дані хмари.
За замовчуванням Jenkins буде виконуватися як SYSTEM. Таким чином, компрометація надасть зловмиснику привілеї SYSTEM.
RCE Створення/Зміна проекту
Створення/зміна проекту - це спосіб отримати RCE на сервері Jenkins:
pageJenkins RCE Creating/Modifying ProjectRCE Виконання Groovy скрипту
Ви також можете отримати RCE, виконавши Groovy скрипт, який може бути більш прихованим, ніж створення нового проекту:
pageJenkins RCE with Groovy ScriptRCE Створення/Зміна конвеєра
Ви також можете отримати RCE, створивши/змінивши конвеєр:
pageJenkins RCE Creating/Modifying PipelineЕксплуатація конвеєра
Для експлуатації конвеєрів вам все ще потрібно мати доступ до Jenkins.
Побудова конвеєрів
Конвеєри також можуть бути використані як механізм побудови в проектах, у цьому випадку може бути налаштований файл всередині репозиторію, який міститиме синтаксис конвеєра. За замовчуванням використовується /Jenkinsfile
:
Також можливо зберігати файли конфігурації конвеєра в інших місцях (у інших репозиторіях, наприклад) з метою відокремлення доступу до репозиторію та доступу до конвеєра.
Якщо зловмисник має право на запис у цей файл, він зможе його змінити та потенційно запустити конвеєр, навіть не маючи доступу до Jenkins. Можливо, зловмисникові доведеться обійти деякі захисти гілок (залежно від платформи та привілеїв користувача, їх можна обійти або ні).
Найпоширеніші способи запуску власного конвеєра:
Pull request до основної гілки (або, можливо, до інших гілок)
Push до основної гілки (або, можливо, до інших гілок)
Оновлення основної гілки та очікування, поки воно буде виконано якимось чином
Якщо ви є зовнішнім користувачем, ви не повинні очікувати створення PR до основної гілки репозиторію іншого користувача/організації та запуску конвеєра... але якщо він погано налаштований, ви можете повністю компрометувати компанії, просто експлуатуючи це.
RCE конвеєра
У попередньому розділі RCE вже було вказано техніку для отримання RCE, змінюючи конвеєр.
Перевірка змінних середовища
Можливо оголосити змінні середовища у вигляді чіткого тексту для всього конвеєра або для конкретних етапів. Ці змінні середовища не повинні містити конфіденційної інформації, але зловмисник завжди може перевірити всі конфігурації конвеєра/Jenkinsfiles:
Витяг секретів
Для отримання інформації про те, як зазвичай обробляються секрети в Jenkins, перегляньте базову інформацію:
pageBasic Jenkins InformationОблікові дані можуть бути обмежені глобальними постачальниками (/credentials/
) або конкретними проектами (/job/<project-name>/configure
). Тому, щоб витягти всі з них, вам потрібно компрометувати принаймні всі проекти, які містять секрети, і виконати власні/зіпсовані конвеєри.
Є ще одна проблема: для того, щоб отримати секрет всередині env конвеєру, вам потрібно знати назву та тип секрету. Наприклад, якщо ви спробуєте завантажити секрет usernamePassword
як секрет типу string
, ви отримаєте цю помилку:
Ось як завантажити деякі типові типи секретів:
В кінці цієї сторінки ви можете знайти всі типи облікових даних: https://www.jenkins.io/doc/pipeline/steps/credentials-binding/
Найкращий спосіб витягти всі секрети одночасно - це компрометувати машину Jenkins (запустивши зворотний shell, наприклад, на вбудованому вузлі) і потім витікати основні ключі та зашифровані секрети і розшифровувати їх офлайн. Докладніше про це можна дізнатися в розділі Вузли та агенти та в розділі Післяексплуатаційний розділ.
Тригери
З документації: Директива triggers
визначає автоматизовані способи, якими повинен бути перезапущений конвеєр. Для конвеєрів, які інтегровані з джерелом, таким як GitHub або BitBucket, triggers
можуть бути непотрібні, оскільки інтеграція на основі веб-гачків вже, ймовірно, присутня. Доступні тригери наразі - cron
, pollSCM
та upstream
.
Приклад Cron:
Перевірте інші приклади в документації.
Вузли та агенти
Екземпляр Jenkins може мати різні агенти, які працюють на різних машинах. З точки зору атакування, доступ до різних машин означає різні потенційні облікові дані хмари для крадіжки або різний мережевий доступ, який можна використовувати для експлуатації інших машин.
Для отримання додаткової інформації перегляньте базову інформацію:
pageBasic Jenkins InformationВи можете перелічити налаштовані вузли в /computer/
, де зазвичай знайдете **Вбудований вузол
** (який є вузлом, на якому працює Jenkins) та, можливо, ще декілька:
Особливо цікаво скомпрометувати вбудований вузол, оскільки він містить чутливу інформацію Jenkins.
Щоб вказати, що ви хочете запустити конвеєр на вбудованому вузлі Jenkins, ви можете вказати в конвеєрі наступну конфігурацію:
Повний приклад
Пайплайн на конкретному агенті, з тригером cron, зі змінними середовища пайплайну та етапу, завантаженням 2 змінних на кроці та відправленням зворотного шелу:
Післяексплуатаційний етап
Metasploit
Секрети Jenkins
Ви можете переглянути список секретів, звернувшись до /credentials/
, якщо у вас є достатньо дозволів. Зверніть увагу, що це буде лише список секретів у файлі credentials.xml
, але файли конфігурації збірки можуть також містити більше секретів.
Якщо ви можете переглядати конфігурацію кожного проекту, ви також можете побачити там назви секретів (паролів), які використовуються для доступу до репозиторію та інші секрети проекту.
З Groovy
pageJenkins Dumping Secrets from GroovyЗ диску
Ці файли потрібні для розшифрування секретів Jenkins:
secrets/master.key
secrets/hudson.util.Secret
Такі секрети зазвичай можна знайти в:
credentials.xml
jobs/.../build.xml
jobs/.../config.xml
Ось регулярний вираз для їх пошуку:
Розшифрування секретів Jenkins офлайн
Якщо ви витягли необхідні паролі для розшифрування секретів, скористайтеся цим скриптом для розшифрування цих секретів.
Розшифрування секретів Jenkins з Groovy
Створення нового адміністратора
Отримайте доступ до файлу конфігурації Jenkins у
/var/lib/jenkins/config.xml
абоC:\Program Files (x86)\Jenkins\
Знайдіть слово
<useSecurity>true</useSecurity>
та змініть словоtrue
наfalse
.sed -i -e 's/<useSecurity>true</<useSecurity>false</g' config.xml
Перезапустіть сервер Jenkins:
service jenkins restart
Тепер знову перейдіть на портал Jenkins, і Jenkins не буде запитувати жодних облікових даних на цей раз. Перейдіть до "Керування Jenkins", щоб знову встановити пароль адміністратора.
Увімкніть знову безпеку, змінивши налаштування на
<useSecurity>true</useSecurity>
і знову перезапустіть Jenkins.
Посилання
Last updated