FortiBleed — Active Fortinet Credential Compromise | Sentinel Hunting

Threat Overview

A joint FBI and U.S. Secret Service advisory dated 6 October 2026 describes ongoing FortiBleed operations against Internet-facing Fortinet FortiGate firewalls and SSL VPN gateways. The campaign leverages previously leaked or reused credentials, credential stuffing, password spraying, and legacy SHA-256 password hashes exposed in stolen configuration data. The advisory cites SOCRadar verification of more than 86,644 compromised devices in 194 countries, a historical measurement rather than a fresh count of newly compromised devices. Attackers validate access, create new firewall administrators, may remove or change original administrator accounts to lock out defenders, and can expand into Active Directory environments. The advisory links initial-access broker activity to downstream INC/Lynx and Payload ransomware affiliates. This is not a newly assigned FortiOS zero-day; patching alone may not evict access obtained with valid credentials or surviving API keys.

References

FBI / U.S. Secret Service — joint cybersecurity advisory, 6 Oct 2026

The Hacker News — advisory coverage, 7 Oct 2026

Fortinet — analysis of reported credential compromise

Impacted Systems

**Vendor/product:** Fortinet FortiGate running FortiOS; Internet-facing SSL VPN gateways and exposed administrative interfaces. **Deployment:** customer-managed hardware/virtual firewalls, not FortiAnalyzer itself. **Prerequisites:** stolen/reused credentials, accessible login surfaces, or legacy hashes obtained from previous device/configuration compromise; no single new vulnerable FortiOS version or universal CVE is established by this advisory. **Relevant versions:** Fortinet documentation describes PBKDF2 admin-password storage introduced in FortiOS 7.2.11, 7.4.8 and 7.6.1, but upgraded systems may retain legacy hashes until passwords are changed/rehashed. **Fixed version:** no single patch/build cures stolen credentials; use supported FortiOS and enforce credential/API-key rotation. **Ports:** VPN/admin interface ports are deployment-specific; some reported actor beacon traffic used 4332/4432.

Why this matters

Exposed security gateways provide privileged access to internal networks. Continued use of previously compromised credentials, creation of new admin accounts, and lockouts can persist despite firmware updates and lead to ransomware intrusions.

Exploitation Status

**Confirmed government reporting:** FBI/USSS describe an ongoing credential-compromise campaign and administrator lockouts; historical June–July IPs and usernames are included in the advisory. **Third-party measurement:** 86,644 is SOCRadar-verified historical exposure, not a current live compromised-host census. **Assessment:** reported attacker IPs and usernames are corroboration aids, not standalone proof. The campaign is not established as exploitation of CVE-2024-23113 or any single newly disclosed FortiOS vulnerability.

What this hunt looks for

Available Microsoft Sentinel Fortinet firewall event telemetry, CEF/CommonSecurityLog, Syslog, network egress, and Windows SecurityEvent logs where ingested. FortiAnalyzer inventory alone does not prove FortiGate admin events are forwarded or normalized into CommonSecurityLog.

Required logs

CommonSecurityLog FortiGate VPN/authentication failure logs and SourceUserName; CommonSecurityLog network flow; ports alone are weak signals; CommonSecurityLog with FortiGate administration audit messages; CommonSecurityLog with administrative usernames in normalized or raw text; CommonSecurityLog with source/destination IPs; IOCs historical June-July 2026; FortiGate configuration logs forwarded to CommonSecurityLog; SecurityEvent 4625 with source IP and target username populated; SecurityEvent account-management auditing; requires incident correlation; Syslog containing FortiOS device events; may need connector-specific parser

Hunt 1: First pass — FortiGate administrative account additions or deletions

Required telemetry: CommonSecurityLog with FortiGate administration audit messages

CommonSecurityLog
| where TimeGenerated >= ago(30d)
| where DeviceVendor has "Fortinet" or DeviceProduct has "FortiGate"
| extend Detail=strcat(tostring(column_ifexists("Message",""))," ",tostring(column_ifexists("AdditionalExtensions",""))," ",tostring(DeviceEventClassID))
| where Detail has_any ("admin","administrator","user","account") and Detail has_any ("add","added","create","created","delete","deleted","change","modified")
| project TimeGenerated, DeviceName, SourceIP, SourceUserName, DeviceAction, DeviceEventClassID, Detail
| order by TimeGenerated desc

Hunt 2: FBI/USSS-reported FortiBleed infrastructure in perimeter traffic

Required telemetry: CommonSecurityLog with source/destination IPs; IOCs historical June-July 2026

let IOCs=dynamic(["45.154.12.132","154.202.59.169","103.27.186.156","45.155.250.158","193.8.187.2","193.8.187.42","85.11.187.8","104.28.155.27","185.136.15.43","185.136.15.66","185.199.199.56","193.8.186.33","45.227.254.210","77.91.118.10","80.75.212.113","87.251.64.13","87.251.64.16","87.251.64.17","87.251.64.44","66.175.220.111"]);
CommonSecurityLog
| where TimeGenerated >= ago(30d)
| where SourceIP in (IOCs) or DestinationIP in (IOCs)
| project TimeGenerated, SourceIP, DestinationIP, DestinationPort, DeviceVendor, DeviceProduct, DeviceAction, DeviceName
| order by TimeGenerated desc

Hunt 3: FortiGate authentication failures and spraying across usernames

Required telemetry: CommonSecurityLog FortiGate VPN/authentication failure logs and SourceUserName

CommonSecurityLog
| where TimeGenerated >= ago(7d)
| where DeviceVendor has "Fortinet" or DeviceProduct has "FortiGate"
| extend Detail=strcat(tostring(column_ifexists("Message",""))," ",tostring(column_ifexists("AdditionalExtensions","")))
| where Detail has_any ("login","authentication","auth","vpn")
| where Detail has_any ("fail","failed","denied","invalid")
| summarize Failures=count(), Users=dcount(SourceUserName), UserSamples=make_set(SourceUserName,8), Targets=make_set(DestinationIP,8) by SourceIP, bin(TimeGenerated,1h)
| where Failures >= 15 or Users >= 5
| order by Failures desc

Hunt 4: FortiGate reported rogue administrator names

Required telemetry: CommonSecurityLog with administrative usernames in normalized or raw text

CommonSecurityLog
| where TimeGenerated >= ago(30d)
| where DeviceVendor has "Fortinet" or DeviceProduct has "FortiGate"
| extend Detail=strcat(tostring(column_ifexists("Message",""))," ",tostring(column_ifexists("AdditionalExtensions",""))," ",tostring(SourceUserName))
| where Detail has_any ("forticloud-tech","forti_support2","fortiAdmin","adminsslvpn","support_fortinet","forticloud-sync","fgtsecure","system_config","districtadmin","gttadmin","roadmin","pakedge","itadmin","IT_Manager","fgtsec")
| project TimeGenerated, DeviceName, SourceIP, SourceUserName, DeviceEventClassID, Detail
| order by TimeGenerated desc

Hunt 5: FortiGate API-token and management configuration changes

Required telemetry: FortiGate configuration logs forwarded to CommonSecurityLog

CommonSecurityLog
| where TimeGenerated >= ago(30d)
| where DeviceVendor has "Fortinet" or DeviceProduct has "FortiGate"
| extend Detail=strcat(tostring(column_ifexists("Message",""))," ",tostring(column_ifexists("AdditionalExtensions","")))
| where Detail has_any ("api-user","api_user","api","token","trusted-host","super_admin","mfa","two-factor","ssh")
| where Detail has_any ("add","create","delete","change","edit","modify","set","unset","login")
| project TimeGenerated, DeviceName, SourceIP, SourceUserName, DeviceEventClassID, Detail
| order by TimeGenerated desc

Hunt 6: FortiGate Syslog fallback — admin creation, lockout, and SSH access

Required telemetry: Syslog containing FortiOS device events; may need connector-specific parser

Syslog
| where TimeGenerated >= ago(30d)
| where SyslogMessage has_any ("fortigate","fortios","forticloud","adminsslvpn","forti_support2","super_admin") or ProcessName has "forti"
| where SyslogMessage has_any ("login","admin","user","ssh","password","disabled","delete","added","created")
| project TimeGenerated, Computer, ProcessName, SeverityLevel, SyslogMessage
| order by TimeGenerated desc

Hunt 7: Windows follow-on password spraying after VPN compromise

Required telemetry: SecurityEvent 4625 with source IP and target username populated

SecurityEvent
| where TimeGenerated >= ago(7d) and EventID == 4625
| extend IP=tostring(column_ifexists("IpAddress","")), Target=tostring(column_ifexists("TargetUserName",""))
| where isnotempty(IP) and IP !in ("-","127.0.0.1","::1")
| summarize Failures=count(), Accounts=dcount(Target), SampleAccounts=make_set(Target,8), Hosts=dcount(Computer) by IP, bin(TimeGenerated,1h)
| where Failures >= 20 and Accounts >= 5
| order by Failures desc

Hunt 8: Windows privileged-account creation or group changes after suspected VPN access

Required telemetry: SecurityEvent account-management auditing; requires incident correlation

SecurityEvent
| where TimeGenerated >= ago(14d) and EventID in (4720,4728,4732,4756,4738)
| project TimeGenerated, Computer, Account, EventID, Activity, TargetAccount=tostring(column_ifexists("TargetUserName","")), EventData=tostring(column_ifexists("EventData",""))
| order by TimeGenerated desc

Hunt 9: FortiBleed beacon relay and unusual outbound management ports

Required telemetry: CommonSecurityLog network flow; ports alone are weak signals

CommonSecurityLog
| where TimeGenerated >= ago(30d)
| where DestinationPort in (4332,4432) or DestinationIP in ("45.154.12.132","45.155.250.158","85.11.187.8")
| project TimeGenerated, SourceIP, DestinationIP, DestinationPort, DeviceVendor, DeviceProduct, DeviceAction, DeviceName
| order by TimeGenerated desc

Detection Notes

**Highest signal:** unexpected FortiGate admin creation/deletion, privileged API-user changes, valid access from previously reported infrastructure, or a suspicious account change paired with new VPN access. **Noise:** vendor support accounts and legitimate administrator changes can overlap named indicators; IPs were observed primarily June–July 2026 and may have been reassigned. **Critical gaps:** many FortiGate connectors send logs to vendor-specific custom tables rather than CommonSecurityLog; event field mappings vary; VPN failure logs may omit normalized SourceUserName. SecurityEvent 4625 is a lateral-movement pivot, not proof of FortiBleed. Correlate with known firewall asset inventory and authorized change windows. No customer-specific Sentinel execution occurred.

Leave a Reply