ProxyLogon
利用链复现
零鉴科技
简介
Proxylogon是CVE-2021-26855漏洞的别名,该漏洞允许攻击者绕过身份验证并冒充管理员,将此漏洞与另一个后身份验证的任意文件写漏洞 CVE-2021-27065 串在一起,可以完成exchange上的RCE。默认情况下,所有受影响的组件都容易受到攻击。
CVE-2021-26855 是一个SSRF 漏洞,问题出现在将客户端请求代理到服务端时,该漏洞可以获取用户的sid,实现了无交互攻击链中最重要的第一步。
CVE-2021-27065 是一个任意文件写漏洞。虽然不能完全控制要写入的内容,但是文件名与路径可以任意设置,当我们以 .aspx 为后缀创建文件,并在文件中插入一句话木⻢后,就可以实现远程控制。
受影响的Exchange版本:
Exchange Server 2019 < 15.02.0792.010
Exchange Server 2019 < 15.02.0721.013
Exchange Server 2016 < 15.01.2106.013
Exchange Server 2013 < 15.00.1497.012
原理浅析
CVE-2021-26855
本质上是因为Exchange对BackEnd的请求缺乏来源性校验,导致可以通过构造特定结构的Cookies,直接对BackEnd发起请求,造成SSRF。
利用CVE-2021-26855漏洞时发出的post数据包:
其中要留意的关键点有两个,一是请求的url地址,二是Cookies。
下面的分析参考知道创宇
1、URL地址
首先,url中的/ecp/08gl.js
不是一个存在的文件,而是一个虚拟路径,这么做的原因是为了能够调用BEResourceRequestHandler进行后端的请求。为了达到这个目的,我们所构造的数据包要满足ProtocolType为Ecp(也就是以 /ecp/xxx.xxx 进行请求),并且需要CanHandle返回true。
在CanHandle()中,使用GetBEResouceCookie()判断请求包中是否存在 X-BEResource字段的Cookies,使用IsResourceRequest()判断url地址。
在IsResourceRequest()中判断了传入的路径的后缀,只要是以下列举出来的后缀名都会返回true。
因此,/ecp/08gl.js
实际上仅需要满足/ecp/xxx.合法后缀名
即可。
2、Cookies
关键点在于BEResourceRequestHandler.ResolveAnchorMailbox函数,该函数直接提取出Cookie中的 X-BEResource 字段,并用其生成 BackEndServe实例,最终向BackEnd发出请求。
因此X-BEResource 用于代理请求,其格式为[fqdn]~BackEndServerVersion,BackEndServerVersion 应该大于1941962752。
后序BackEndServer.FromString会调用一系列拼接和解析函数,这里就略过了。最后指向BackEnd 的url类似这样:
`这其中name没有做检查和限制,‘#’ 用于在有url请求参数时分隔参数``https://[name@FQDN:444/autodiscover/autodiscover.xml?#]:443/ecp/target.js`
后续如果需要通过ssrf去访问的api,修改:444后的url地址即可。
CVE-2021-27065
该漏洞具体位置在exchange管理中心(ecp)的虚拟目录配置窗口,需要administrator权限才可进行操作。
点击上方的修改按钮,在内部URL(InternalUrl)和外部URL(ExternUrl)中都可以填入payload,两者都限制了最大长度为255,并且会将url里的%
全部编码为%25
。
这里首选修改外部URL,因为修改了内部URL可能会让某些内部服务失去作用,引起目标的警觉。
最后,选择重置按钮,这个操作将会把原先的对虚拟目录的设置进行保存,而后将当前服务的虚拟目录配置恢复为默认配置。因为exchange并没有对以下的路径和保存的文件名进行检测和限制,所以在此可以填入任意的路径和文件名,造成任意文件写漏洞。
写入的文件格式如下:
实际上,除了autodiscover以外,其他服务(ECP,EWS,Mapi,EAS,OAB,OWA,EAS)都可以设置内部URL和外部URL,同时也可以进行重置操作,因此利用RCE可以不仅限于OAB服务。
例如,ECP服务:
攻击链
因此,本次利用的exchange漏洞是一个攻击链,将CVE-2021-26855和CVE-2021-27065两个漏洞结合在一起。首先通过ssrf获取到administrator的权限,再利用此时的权限来完成任意文件写操作,最终完成RCE。
复现
需要获取到目标exchange中有效的邮箱名称(任意)
POC 向/owa/auth/xxx.js发出请求,若返回的数据包为NegotiateSecurityContext failed with for host 'xxx' with status 'TargetUnknown'
,则说明当前的exchange服务器存在ssrf漏洞,并且通过返回包的头部字段X-FEServer,可以获取exchange的FQDN
使用内置的autodiscover服务获取LegacyDN信息。
Autodiscover(自动发现)是自Exchange Server 2007开始推出的一项自动服务,用于自动配置用户在Outlook中邮箱的相关设置,简化用户登陆使用邮箱的流程。如果用户账户是域账户且当前位于域环境中,通过自动发现功能用户无需输入任何凭证信息即可登陆邮箱。
使用exchange的mapi over http特性,通过触发报错来获取用户的SID。
SID也就是安全标识符(Security Identifiers),是标识用户、组和计算机帐户的唯一的号码。在第一次创建该帐户时,将给网络上的每一个帐户发布一个唯一的 SID。在域中,对象的SID=域的SID + RID
即使在未知administrator邮箱名称的情况下,也可以通过普通用户的邮箱名称来获取域SID,接着再替换RID为500,即能得到当前域中Administrator的SID。
`- user1's SID: S-1–5–21–3698125033–3xxxxxxxxx–xxxxxxxx2–3102` `- admin's SID: S-1-5-21-3698125033-3xxxxxxxxx-xxxxxxxx2-500`
使用SID向后端proxylogon.ecp发起认证请求,获取身份认证中所需的ASP.NET_SessionID和msExchEcpCanary值,注意此时获取到的身份信息权限已为Administrator。
通过上述的准备工作,我们已经获取到了带有administrator权限的身份认证信息,因此后续只需要按照顺序发送重置虚拟目录的数据包即可。
第一步:获取RawIdentity
第二步:准备payload
替换第一步中获取到的RawIdentity,并在ExternalUrl中填入payload。
【注意事项】: ExternalUrl对应的值为最大长度为255的url地址,所以必须带上http://
或者https://
,同时%
符号将会被编码为%25
第三步:写入webshell
在FilePathName中填入webshell的地址(任意)。
【注意事项】: webshell无法覆盖已存在的文件
攻击痕迹会残留在以下目录中:
%PROGRAMFILES%\Microsoft\Exchange Server\V15\Logging\HttpProxy
%PROGRAMFILES%\Microsoft\Exchange Server\V15\Logging directory
HttpProxy下的日志文件会详细记录下所有通过httpproxy来访问后端的记录,包括访问时间,uri地址,来源ip,user-agent,返回状态码等。
官方给出的检测脚本:
Import-Csv -Path (Get-ChildItem -Recurse -Path "$env:PROGRAMFILES\Microsoft\Exchange Server\V15\Logging\HttpProxy" -Filter '*.log').FullName | Where-Object { $_.AnchorMailbox -like 'ServerInfo~*/*' -or $_.BackEndCookie -like 'Server~*/*~*'} | select DateTime, AnchorMailbox, UrlStem, RoutingHint, ErrorCode, TargetServerVersion, BackEndCookie, GenericInfo, GenericErrors, UrlHost, Protocol, Method, RoutingType, AuthenticationType, ServerHostName, HttpStatus, BackEndStatus, UserAgent
清理痕迹:
Get-ChildItem -Recurse -Path "$env:PROGRAMFILES\Microsoft\Exchange Server\V15\Logging\HttpProxy\Ecp" -Filter '*.log' | % {(Get-Content $_.FullName) | where {$_ -notmatch "yourIP"} | Set-Content $_.FullName}
【注意事项】:当天的日志因为会被W3wp.exe(IIS Application Pool Process)占用而无法修改
攻击痕迹会残留在以下目录中:
%PROGRAMFILES%\Microsoft\Exchange Server\V15\Logging\ECP\Server
官方给出的检测脚本:
Select-String -Path "$env:PROGRAMFILES\Microsoft\Exchange Server\V15\Logging\ECP\Server\*.log" -Pattern 'Set-.+VirtualDirectory'
此日志会详细记录ecp相关的所有请求(包括一部分http头信息和post body)。
清理痕迹:
Get-ChildItem -Recurse -Path "$env:PROGRAMFILES\Microsoft\Exchange Server\V15\Logging\ECP\Server" -Filter '*.log' | % {(Get-Content $_.FullName) | where {$_ -notmatch "Set-.+VirtualDirectory"} | Set-Content $_.FullName}
【注意事项】:当天的日志因为会被W3wp.exe(IIS Application Pool Process)占用而无法修改
WD已经能够准确识别出webshell以及CVE-2021-27065漏洞,并拒绝程序对webshell的访问
监控的目录如下:
C:\Program Files\Microsoft\Exchange Server\V15\FrontEnd\HttpProxy\owa\auth\xxx.aspx
C:\Program Files\Microsoft\Exchange Server\V15\FrontEnd\HttpProxy\ecp\auth\xxx.aspx
**【2021-04-16测试】:**写入webshell的内容仅包含</script>
标签也会被windows defender查杀
不被wd查杀的路径:
C:\Program Files\Microsoft\Exchange Server\V15\FrontEnd\HttpProxy\owa\auth\Current\themes\resources\xxx.aspx
C:\Program Files\Microsoft\Exchange Server\V15\FrontEnd\HttpProxy\owa\auth\Current\scripts\premium\xxx.aspx
C:\Program Files\Microsoft\Exchange Server\V15\FrontEnd\HttpProxy\owa\auth\15.1.2044\themes\resources\xxx.aspx
C:\Program Files\Microsoft\Exchange Server\V15\FrontEnd\HttpProxy\owa\auth\15.1.2044\scripts\premium\xxx.aspx
[IIS Install Path]\aspnet_client\
[IIS Install Path]\aspnet_client\system_web\
及其他iis web目录
RCE:
参考