Exchange SSRF漏洞从proxylogon到proxyshell(一)

admin 2021年12月22日00:58:11评论168 views字数 4397阅读14分39秒阅读模式

前几天Exchange又爆出一个新洞,类似于之前的ProxyLogon。本片文章更多注重于基础。

一. 调试环境

C#语言类似与Java,同样可以很轻松的反编译。在我的Java线上课程中第一节课就是讲解Java调试的原理,方法以及环境。如图Exchange SSRF漏洞从proxylogon到proxyshell(一)

对于分析Exchange漏洞来讲,与java没有什么不同,同样搭建调试环境。Exchange类似于OA应用,只不过运行在IIS中。

首先下载dnspy,找到Exchange安装目录下的Dll文件,类似于Java的jar包。拖入dnspy中,并附加到Exchange相关的IIS进程中。

Exchange SSRF漏洞从proxylogon到proxyshell(一)

通过附加进程,即可通过dnspy调试IIS服务器中相关的应用。在Exchange中其实存在很多应用,例如AutoDiscover,ecp等,在IIS目录中是这样的。Exchange SSRF漏洞从proxylogon到proxyshell(一)

那么我们应该附加到哪个进程呢,可以看图Exchange SSRF漏洞从proxylogon到proxyshell(一)

找到应用程序名,在附加到进程的进程参数中,可以看到应用程序名,点击附加即可调试该web应用。

再运行一下proxylogon的exp,即可成功触发断点。Exchange SSRF漏洞从proxylogon到proxyshell(一)

二. proxylogon ssrf分析

首先我们要了解proxylogon ssrf漏洞的分析。对于Exchange来讲,很多功能都是通过Exchange发送响应的http请求到处理的组件。而且Exchange在向自己的组件发送http请求的时候,也会自动添加认证。这也就是Exchange绕过认证的原理。

首先分析proxylogon的ssrf漏洞 Exchange对于每一个请求,都会调用Microsoft.Exchange.FrontEndHttpProxy.dll!Microsoft.Exchange.HttpProxy.ProxyModule.SelectHandlerForUnauthenticatedRequest去处理。

微软可能是这样想的,对于某些请求的资源,比如说js,png等资源文件,没有必要通过认证才可以访问。所以微软默认对于这类资源文件的请求是不做认证的。在ProxyModule.SelectHandlerForUnauthenticatedRequest中,会通过大量的if-else去询问各个Handle能否处理。

Exchange SSRF漏洞从proxylogon到proxyshell(一)

Microsoft.Exchange.HttpProxy.BEResourceRequestHandler中,通过后缀名来判断本次请求是否为请求静态资源,并且请求中是否存在 Cookie的key为X-BEResource,代码如图。Exchange SSRF漏洞从proxylogon到proxyshell(一)

Exchange SSRF漏洞从proxylogon到proxyshell(一)

最终通过多态,调用ProxyRequestHandler的run方法。

Exchange SSRF漏洞从proxylogon到proxyshell(一)

proxyRequestHandle.InternalBeginCalculateTargetBackEnd中,通过多态,实际调用BEResourceRequestHandler. ResolveAnchorMailbox 方法,获取Cookie值为X-X-BEResourceExchange SSRF漏洞从proxylogon到proxyshell(一)

通过BackEndServer.FromString方法,将Cookie通过~分割,分为FQDN与版本。Exchange SSRF漏洞从proxylogon到proxyshell(一)

proxyRequestHandle.BeginProxyRequest方法中,首先调用GetTargetBackEndServerUrl获取需要请求的地址。Exchange SSRF漏洞从proxylogon到proxyshell(一)

可以看到,其实通过上面的那一步获取到的fqdn地址作为请求的url。

proxyRequestHandle.BeginProxyRequest方法中,随后会调用CreateServerRequest向上一步获取到的url对象发起请求。

CreateServerRequest方法中,调用PrepareServerRequest创建请求。PrepareServerRequest方法中,调用proxyRequestHandle.ShouldBlockCurrentOAuthRequest判断是否有权限发起该请求。Exchange SSRF漏洞从proxylogon到proxyshell(一)

proxyRequestHandle.ShouldBlockCurrentOAuthRequest判断比较糙,只是简单返回ProxyToDownLevel的值。

只有ProxyToDownLevel在GetTargetBackEndServerUrl方法中将其设置为true时才调用该方法。此方法检查用户是否已通过身份验证,如果未通过验证,则返回HTTP 401错误。  幸运的是,我们可以GetTargetBackEndServerUrl通过修改Cookie中的服务器版本来防止设置此值。如果版本大于Server.E15MinVersion,ProxyToDownLevel则为false。进行此更改后,我们成功通过了后端服务(自动发现服务)的身份验证。详细代码见上面的图

剩下的部分,就是正常的SSRF请求。不过这个SSRF相比较其他而言,还可以将Post请求体的内容,当前http的请求头,一并通过http发送。恰巧还会自己添加认证信息。

三. proxyshell ssrf部分分析

在微软的通告中,提到在autodiscover服务中存在一处ssrf漏洞。原理很有可能与proxyshell的原理相类似。同样我们寻找ProxyRequestHandler的子类。

Exchange SSRF漏洞从proxylogon到proxyshell(一)

回到最开始的Microsoft.Exchange.FrontEndHttpProxy.dll!Microsoft.Exchange.HttpProxy.ProxyModule.SelectHandlerForUnauthenticatedRequest中,这里同样也支持调用AutodiscoverProxyRequestHandlerExchange SSRF漏洞从proxylogon到proxyshell(一)

在ProxyRequestHandler.GetTargetBackEndServerUrl中,已经修复了proxylogon的漏洞。但是,可以通过GetClientUrlForProxy方法,同样可以获取SSRF的请求地址。

在GetClientUrlForProxy中,如果我们的请求符合IsAutodiscoverV2Request函数的请求,那么将会UrlHelper.RemoveExplicitLogonFromUrlAbsoluteUri函数移除多余的部分,并与localhost拼接为ssrf的请求地址。Exchange SSRF漏洞从proxylogon到proxyshell(一)

Exchange SSRF漏洞从proxylogon到proxyshell(一)

其实就是从url中,移除不需要的部分。例如对于/Autodiscover/[email protected]/mapi/nspi来讲,如果explicitLogonAddress为/Autodiscover/[email protected],那么最终请求的地址为localhost/mapi/napi

explicitLogonAddress值在EwsAutodiscoverProxyRequestHandler.ResolveAnchorMailbox中复制,从请求参数的Email中获取

Exchange SSRF漏洞从proxylogon到proxyshell(一)

最终payload

Exchange SSRF漏洞从proxylogon到proxyshell(一)

如果服务器存在漏洞,则返回当前权限。

GET /Autodiscover/[email protected]/mapi/nspi HTTP/2
Host: localhost
Accept: */*
Cookie: Email=Autodiscover/[email protected]
Content-Length: 0

下一部分将分享exp的编写方法

欢迎大家报名线上java课程,从代码审计的角度讲解基础漏洞以及Java特有的安全漏洞。

Java安全课程目录,由于篇幅原因只分享部分课程目录,前面还会有很多基础的内容,我会整理为pdf文档发给大家。

第一章

Classloader 原理以及在java安全中的使用

主要讲解Classloader的原理,不同classloader的类型,双亲委派模型以及如何通过反射调用defineClass。在后面的java漏洞利用中,classloader作为将类与JVM的桥梁将会扮演很重要的角色。

讲解内容

classloader的原理,以及如何动态加载一个class文件

双亲委派模型

Tomcat中classloader的讲解,在tomcat中,并没有完全遵守双亲委派模型。为了实现更好的隔离,tomcat使用另外一种方式实现classloader 几种常见的classloader的使用讲解以及在不同漏洞中的利用方法

第二章

Java asm字节码的使用指南。在java反序列化的payload中,需要动态生成一个javaclass文件。可以通过手工,根据jvm指令构造。也可以通过javaassist自带的编译器构造。

讲解内容

动态生成字节码在java中的作用 javaassist的使用指南 java asm的使用指南 java asm在ysoserial中的使用情况 再探Java 反射原理,使用java asm实现反射机制

第四章

java反序列化协议解析, java 序列化的流协议解读 java ObjectInputstream代码解析 如何实现python读写java 流 python生成 8u20gadget 8u20 漏洞的原理 python生成反序列化Gadget的方法

第七章

内存马实战与查杀。为了更好地对抗ids,waf设备。利用注入内存马技术,修改java中间件中url对应对象的路由部分。在很多waf规则防护中,一般只认为用户请求的url的后缀为jsp才会产生webshell请求,但是我们可以将请求某个静态文件的路由映射到webshell对象中去骗过waf等安全设备

讲解内容:

中间件的简单架构,这里主要讲解tomcat,介绍四大组件 J2ee标准,主要是servlet这几个标准,主要是在servlet3.0中,支持动态添加servlet,filter 如何插入内存马。可能更多会讲如何跨webapp应用插入内存马 如何查杀。对于内存马,不光要会插,还要会清除

java 漏洞实战分析

调试分析weblogic漏洞 讲解内容     T3协议漏洞 如何调试weblogic T3协议,以及T3协议内容大致讲解 如何diff补丁包 如何判断目标服务器是否存在T3反序列化漏洞(查看黑名单等方法 如何实现T3协议回显代码(cve-2020-2555 + nashorn的回显),报错回显 T3协议如何与IIOP协议配合绕过Nat 如何应急响应weblogic服务器以及如何在不停机的情况下打热补丁 weblogic xmldecoder漏洞

欢迎对于课程有兴趣的学员积极报名参加课程,详情联系下方客服。

期待你的加入!

Exchange SSRF漏洞从proxylogon到proxyshell(一)

Exchange SSRF漏洞从proxylogon到proxyshell(一)


本文始发于微信公众号(宽字节安全):Exchange SSRF漏洞从proxylogon到proxyshell(一)

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2021年12月22日00:58:11
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   Exchange SSRF漏洞从proxylogon到proxyshell(一)https://cn-sec.com/archives/454593.html

发表评论

匿名网友 填写信息