0x00 前言

在之前的文章《渗透技巧——Windows系统的帐户隐藏》介绍过利用帐户克隆建立隐藏帐户的技巧,是通过复制目标帐户对应注册表项F键的值,使得隐藏帐户获得了相同的权限。

如果换一种思路,将目标帐户对应注册表项F键的部分内容覆盖已有帐户,那么已有帐户能否获得目标帐户的权限呢?

这就是本文将要介绍的方法——RID Hijacking

注:

该方法最早公开于2017年12月,地址如下:

http://csl.com.co/rid-hijacking/

0x01 简介

本文将要介绍以下内容:

  • RID劫持的方法

  • 编写脚本的实现思路

  • 利用分析

  • 防御检测

0x02 相关概念

SID

全称Security Identifiers(安全标识符),是Windows系统用于唯一标识用户或组的可变长度结构

官方说明地址:

https://msdn.microsoft.com/en-us//library/windows/desktop/aa379594(v=vs.85).aspx

SID包含以下信息:

  • The revision level of the SID structure

  • 48-bit identifier authority value

  • relative identifier (RID)

实例

Windows命令行执行whoami /all可获得当前用户的SID,如下图

image.png

SID为: S-1-5-21-2752016420-1571072424-526487797-1001

S表示该字符串是SID 1表示SID的版本号 5-21-2752016420-1571072424-526487797对应ID authority 1001表示RID

RID

Windows系统帐户对应固定的RID:

  • 500: ADMINISTRATOR

  • 501: GUEST

  • 502: krbtgt(域环境)

  • 512: Domain Admins(域环境)

  • 513: Domain Users(域环境)

  • 514: Domain Guests(域环境)

  • 515: Domain Computers(域环境)

  • 516: Domain Controllers(域环境)

0x03 RID劫持方法

对于Windows系统来说,注册表HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Account\Users\Names下包含当前系统的所有帐户列表,每个帐户的默认键值对应该帐户详细信息的注册表位置(即RID的十六进制表示)

注:

需要获得system权限才能读取

举例如图

image.png

帐户a的注册表默认值为0x3e9

注:

帐户a为普通用户权限

详细信息的注册表位置为HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Account\Users\000003E9

详细信息如下图

image.png

F键的内容如下图


image.png

偏移位置0x30f0x31f对应RID

由于是litte-endian字节存储,所以上图中从F键获得的RID值为0x03E9,转换为十进制为1001

使用帐户a登录,执行whoami /all获得帐户a的SID,如下图

image.png

内容相同

测试1: 伪造成内置管理员帐户ADMINISTRATOR

将帐户a的RID修改为500(固定值,表示windows系统内置管理员ADMINISTRATOR),对应十六进制为01F4,如下图

image.png

注:

帐户a需要重新登录才能生效

登录帐户a,帐户a继承了ADMINISTRATOR的权限,成为了管理员

登录用户名为: 原用户名.机器名,如下图

image.png

用户文件夹也随之改变,如下图

image.png

直观理解:

帐户a变成了新帐户a.WIN-BH7SVRRDGVA,继承了ADMINISTRATOR的权限

测试2: 伪造成管理员帐户1

新建管理员帐户1,RID为1000(0x03e8),如下图


image.png

将帐户a的RID修改为1000(0x03e8)

修改后如下图


image.png

重新登录帐户a

帐户a继承了帐户1的权限,成为了管理员

登录用户名变为1,执行whoami /all输出的用户名为a,但RID为1000(帐户1的RID),如下图

image.png

环境变量对应为用户1,如下图

image.png

直观理解:

帐户a变成了原有帐户1,继承了1的权限,但在部分功能的显示上还保留帐户a

0x04 编写脚本的实现思路

实现思路

  1. 获得system权限

  2. 读取指定帐户的注册表信息

  3. 修改固定偏移地址,指定为新的RID

  4. 导入注册表,完成修改

具体实现细节上可参考文章《渗透技巧——Windows系统的帐户隐藏》中的说明

参考代码:

https://github.com/3gstudent/Windows-User-Clone

由于功能较为简单,因此实现代码留给读者完成

msf对应的实现模块: windows/manage/rid_hijack

0x05 利用分析

对于RID Hijacking,实现原理上很简单: 定位帐户的注册表文件,修改代表RID信息的位置即可

但在利用上存在以下不足:

  • 帐户重新登录才能生效

  • 环境变量被修改,影响正常使用

  • 用户名的显示存在问题,容易被发现

  • 模拟ADMINISTRATOR的权限会新建用户文件夹

利用场景

  1. 启用帐户guest,修改RID,登录帐户guest,获得高权限

  2. 修改低权限用户RID,登录获得高权限

0x06 防御检测

站在防御的角度,攻击者首先需要获得当前系统的system权限

检测思路:

  • 查看注册表HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Account\下的信息是否存在异常

  • 帐户guest是否被开启

0x07 小结

本文介绍了RID Hijacking的实现方法,分析利用条件,给出防御建议

渗透技巧——Windows帐户的RID Hijacking

安全脉搏SecPulse.Com独家发文,作者: 3gstudent