目录

域渗透之 Windows Access Token 攻击

域渗透之 Windows Access Token 攻击

Windows Access Token 简介

Windows Access Token 概念

微软官方的定义如下:

An access token is an object that describes the security context of a process or thread.The information in token includes the identity and privileges of the user account associatedwith the process or thread.

Windows Access Token(访问令牌),它是一个描述进程或者线程安全上下文的一个对象。不同的用户登录计算机后,都会生成一个 Access Token,这个 Token 在用户创建进程或者线程时会被使用,不断的拷贝,这也就解释了 A 用户创建一个进程而该进程没有 B 用户的权限。当用户注销后,系统将会使主令牌切换为模拟令牌,不会将令牌清除,只有在重启机器后才会清除。

Access Token 分为两种(主令牌、模拟令牌)

Windows Access Token 分类

1、primary token 这种令牌通常用于本地及远程 RDP 登录

2、impersonation token 这种则通常用于各种非交互式的登录,比如,netuse,wmi,winrm等等

登录方式

  • 交互式登录
    • console login (type 2)
    • rdp login (type 10)
    • psexec (type 2)
  • 网络登录
    • wmi (type 3)
    • winrm (type 3)

Windows Access Token 组成

  • 用户帐户的安全标识符(SID)
  • 用户所属的组的 SID
  • 用于标识当前登录会话的登录 SID
  • 用户或用户组所拥有的权限列表
  • 所有者 SID
  • 主要组的 SID
  • 访问控制列表
  • 访问令牌的来源
  • 令牌是主要令牌还是模拟令牌
  • 限制 SID 的可选列表
  • 目前的模拟等级
  • 其他统计数据

关于 SID

安全标识符(Security identifiers),简称为 SID,分别是 OwnerSidGroupSid。所谓 SID 就是每次当我们创建一个用户或一个组的时候,系统会分配给该用户或组一个唯一 SID,当你重新安装系统后,也会得到一个唯一的 SID。SID 是唯一的,不随用户的删除而分配到另外的用户使用。请记住,SID 永远都是唯一的。SIF 是由计算机名、当前时间、当前用户态线程的 CPU 耗费时间的总和三个参数决定以保证它的唯一性。

例:S-1-5-21-1763234323-321265751-1234321321-500(whoami/user)

Windows Access Token 产生过程

用户使用凭据(用户密码)进行认证 –> 登录 session 创建 –> windows 返回用户的 sid 和用户所在组的 sid –> LSA 创建一个 Access token —> 使用凭据成功认证 –> 登录 session —> token —> 进程、线程

https://geekby.oss-cn-beijing.aliyuncs.com/MarkDown/20200511155641.png-water_print

后渗透中的令牌模拟

cobalt strike 模拟令牌

使用 steal_token 模拟令牌,rev2self 恢复令牌

https://geekby.oss-cn-beijing.aliyuncs.com/MarkDown/20200511155846.png-water_print

metasploit 模拟令牌

incognito 模块,同样 rev2self 恢复令牌

https://geekby.oss-cn-beijing.aliyuncs.com/MarkDown/20200511160407.png-water_print

获取任意进程的令牌权限

手动令牌模拟

模拟过程:

openprocess() –> openprocesstoken() –> impersonateloggedonuser() –> duplicatetokenex() –> createprocesswithtokenw()

openprocess

https://geekby.oss-cn-beijing.aliyuncs.com/MarkDown/20200511161046.png-water_print

openprocesstoken

https://geekby.oss-cn-beijing.aliyuncs.com/MarkDown/20200511161136.png-water_print

impersonateloggedonuser

https://geekby.oss-cn-beijing.aliyuncs.com/MarkDown/20200511161220.png-water_print

duplicatetokenex

https://geekby.oss-cn-beijing.aliyuncs.com/MarkDown/20200511161255.png-water_print

createprocesswithtokenw

https://geekby.oss-cn-beijing.aliyuncs.com/MarkDown/20200511161349.png-water_print

Bypass Protect Process

并不是所有的进程都是可以被操作的

https://geekby.oss-cn-beijing.aliyuncs.com/MarkDown/20200511161605.png-water_print

只获取 system 权限的进程:

1
get-token where-object {$_.username-eq 'NT AUTHORITY\SYSTEM' -and $_ownername -ne 'NT AUTHORITY\SYSTEM'} | select-object processname, processsid | format-table

然后经过测试发现像 csrss、 service、 wininit、smss 等 token 获取失败。

https://geekby.oss-cn-beijing.aliyuncs.com/MarkDown/20200511162053.png-water_print

使用 Access Token 进行 BypassUAC

Fuzzy Security 利用 Windows 令牌实现 UAC 绕过

https://github.com/fuzzysecurity/powershell-suit/blob/master/UAC-TokenMagic.ps1

https://geekby.oss-cn-beijing.aliyuncs.com/MarkDown/20200511162556.png-water_print