渗透技巧——Windows 帐户的 RID Hijacking
layout: post title: 渗透技巧——Windows 帐户的 RID Hijacking
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,如下图
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 权限才能读取
举例如图
帐户 a 的注册表默认值为 0x3e9
注:帐户 a 为普通用户权限
详细信息的注册表位置为 HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Account\Users\000003E9
详细信息如下图
F 键的内容如下图
偏移位置 0x30f
和 0x31f
对应 RID
由于是 litte-endian 字节存储,所以上图中从 F 键获得的 RID 值为 0x03E9
,转换为十进制为 1001
使用帐户 a 登录,执行 whoami /all
获得帐户 a 的 SID,如下图
内容相同
测试 1: 伪造成内置管理员帐户 ADMINISTRATOR
将帐户 a 的 RID 修改为 500(固定值,表示 windows 系统内置管理员 ADMINISTRATOR),对应十六进制为 01F4
,如下图
注:帐户 a 需要重新登录才能生效
登录帐户 a,帐户 a 继承了 ADMINISTRATOR 的权限,成为了管理员
登录用户名为: 原用户名.机器名,如下图
用户文件夹也随之改变,如下图
直观理解:
帐户 a 变成了新帐户 a.WIN-BH7SVRRDGVA,继承了 ADMINISTRATOR 的权限
测试 2: 伪造成管理员帐户 1
新建管理员帐户 1,RID 为 1000(0x03e8),如下图
将帐户 a 的 RID 修改为 1000(0x03e8)
修改后如下图
重新登录帐户 a
帐户 a 继承了帐户 1 的权限,成为了管理员
登录用户名变为 1,执行 whoami /all
输出的用户名为 a,但 RID 为 1000(帐户 1 的 RID),如下图
环境变量对应为用户 1,如下图
直观理解:
帐户 a 变成了原有帐户 1,继承了 1 的权限,但在部分功能的显示上还保留帐户 a
0x04 编写脚本的实现思路
实现思路
- 获得 system 权限
- 读取指定帐户的注册表信息
- 修改固定偏移地址,指定为新的 RID
- 导入注册表,完成修改
具体实现细节上可参考文章 《渗透技巧——Windows 系统的帐户隐藏》 中的说明
参考代码:https://github.com/3gstudent/Windows-User-Clone
由于功能较为简单,因此实现代码留给读者完成
msf 对应的实现模块: windows/manage/rid_hijack
0x05 利用分析
对于 RID Hijacking,实现原理上很简单: 定位帐户的注册表文件,修改代表 RID 信息的位置即可
但在利用上存在以下不足:
- 帐户重新登录才能生效
- 环境变量被修改,影响正常使用
- 用户名的显示存在问题,容易被发现
- 模拟 ADMINISTRATOR 的权限会新建用户文件夹
利用场景
- 启用帐户 guest,修改 RID,登录帐户 guest,获得高权限
- 修改低权限用户 RID,登录获得高权限
0x06 防御检测
站在防御的角度,攻击者首先需要获得当前系统的 system 权限
检测思路:
- 查看注册表
HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Account\
下的信息是否存在异常 - 帐户 guest 是否被开启
0x07 小结
本文介绍了 RID Hijacking 的实现方法,分析利用条件,给出防御建议。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
下一篇: Covenant 利用分析
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论