2.隐藏账户
【实验原理】
隐藏账户,顾名思义就是在控制面板与开机选择中看不见的账户。它可以用输账号密码的方式进入。有了隐藏账户别人不会发现,即使别人设了密码也可以直接进入而不删掉密码。只要在输密码阶段用ctrl+alt+del就可以自己输密码进入。通过“$”符创建在命令行中不会显示的用户账户,从注册表中导出该用户信息,在命令行窗口下删除用户,导入注册表,隐藏账户创建完成
🕵️♂️ 隐藏账户实验原理拆解
描述的是 Windows 系统中一种通过特殊符号 + 注册表操作实现的隐藏账户技术,核心是让账户在常规界面(控制面板、登录界面)中不可见,但仍可通过手动输入账号密码登录。
✨ 核心实现步骤拆解
创建带
$符号的隐藏用户- 在命令行中创建用户名末尾带
$的账户(如test$),这类账户在常规用户列表中会被隐藏。 - 示例命令:
cmd
net user test$ 123456 /add - 这个
$符号是关键,它会让系统在默认的用户枚举中 “忽略” 该账户。
- 在命令行中创建用户名末尾带
导出该用户的注册表信息
- 打开注册表编辑器(
regedit),定位到:plaintext
HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Account\Users - 找到刚创建的
test$对应的子项,将其导出为.reg文件备份。
- 打开注册表编辑器(
命令行删除该用户
- 在命令行中执行删除命令:
cmd
net user test$ /del - 此时系统会从 SAM 数据库中移除该用户,但我们已备份了它的注册表信息。
- 在命令行中执行删除命令:
导入注册表恢复隐藏账户
- 双击之前导出的
.reg文件,将用户信息重新导入注册表。 - 完成后,该账户会重新存在于系统中,但因为注册表中没有对应的 “可见性” 标记,所以在登录界面、控制面板和
net user命令中都不会显示,实现了真正的隐藏。
- 双击之前导出的
🔒 登录方式与安全提示
- 登录方法:在登录界面按
Ctrl+Alt+Del切换到经典登录框,手动输入隐藏的用户名(如test$)和密码即可登录。 - ⚠️ 重要风险提示:
- 这种技术极易被用于恶意入侵,未经授权创建隐藏账户属于违法行为。
- 现代 Windows 系统(如 Win10/11、Server 2016+)已加强了 SAM 权限和安全策略,该方法可能失效或触发安全警报。
- 仅可在自己拥有完全控制权的实验环境中学习,严禁用于破坏他人系统或窃取信息。
📌 实验本质
这是利用了 Windows 早期版本对$结尾用户名的隐藏特性,结合注册表备份恢复的技巧,实现了 “账户存在但不可见” 的效果,是渗透测试与系统安全研究中的经典案例
【实验步骤】
1.命令行创建隐藏账户
右键点击开始,选择运行,输入cmd,查看用户。
添加普通隐藏用户“hack$”,注意这里需要满足密码策略的要求。
隐藏账户提权添加到Administrators组中
命令行查看用户
选择“开始”->“Windows管理工具”->“计算机管理”->“本地用户和组”->“用户”查看用户。
一、$ 后缀用户到底藏在哪?(重点)
Windows 原生规则(Win7~Win11 都一样):
- 用户名以 **$ 结尾 **(如 `hack$`):
- CMD:net user→默认不显示(这是它唯一 “隐藏” 的地方)
- 计算机管理 → 本地用户和组(lusrmgr.msc)→一定会显示
- 控制面板 → 用户账户→会显示
- 登录界面→会显示(除非你额外改注册表)
1. 先把现象对应到规则
你现在:
- 建了
hack$(带 $ 结尾) - 图形界面(计算机管理 → 用户):能看到 hack$
- 命令行
net user:看不到 hack$
这不是你做错了,也不是系统 bug,这是 Windows原生设计。
2. 为什么net user看不见?(命令行规则)
net user内部调用了一个系统 API:NetUserEnum。 这个 API 写死了一条过滤规则:
默认不枚举、不返回以
$结尾的用户名
所以:
net user→ 直接被过滤掉 →看不到net user hack$→ 指名道姓查 →能看到
Windows 这么设计,本来是为了隐藏一些系统服务账号(比如 IIS、SQL 这类后台用的账号),不让管理员随手net user就看到一堆系统账号,界面干净点。
结论:$ 后缀 = 被 NetUserEnum 过滤 = 命令行默认不显示。
3. 为什么图形界面(lusrmgr.msc)还能看到?(GUI 规则)
图形界面不走 NetUserEnum 那套过滤!
lusrmgr.msc(本地用户和组)是直接读SAM 数据库里的全部用户,不跳过 $ 结尾的账户。
流程大概是:
- SAM 里有啥用户 → 图形界面就列啥
- 不管你名字是不是
$结尾 - 所以
hack$一定会显示
2.注册表创建隐藏账户
WindowsSAM 注册表项是系统存放所有本地账户、密码哈希、权限配置的核心数据库,正常管理员都无权限直接查看,这一步就是篡改 SAM 实现彻底隐身。
选择“开始”->“运行”,输入“regedit”打开注册表编辑器。
打开“HKEY_LOCAL_MACHINE\SAM\SAM”,无法查看SAM下的内容,需要选中“SAM”右键单击选择“权限”。(SAM 存储全部本地用户数据,默认权限锁定,普通管理员无法读取 / 修改)
1️⃣ 为什么要给SAM注册表项加管理员权限?
HKEY_LOCAL_MACHINE\SAM\SAM是 Windows 的 “账户密码保险柜”,系统默认把它锁死了,就算是管理员也没有读取 / 修改权限。- 你现在要做的是修改账户的底层信息,不把权限打开,连里面的内容都看不到,更别说复制粘贴了。
- 所以这一步是给管理员解锁 “保险柜钥匙”,让你能读写里面的账户数据。
添加管理员权限。
刷新注册表编辑器界面。
打开“HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Account\Users\Names”找到“hack$”用户,选中并查看其类型。
“hack$”用户的类型为“0x3ed”,选中“Users”中“000003E9”查看其内容(类型以实际为准)
定位刚创建的hack$账户对应的注册表项编号
2️⃣ 为什么要找到hack$对应的注册表项编号(比如000003E9)?
- 每个 Windows 本地用户,在 SAM 里都有一个唯一的RID(相对 ID),
0x3E9就是hack$这个用户的 RID,对应的注册表项就是000003E9。 - 这个编号就是账户在系统底层的 “身份证号”,后面所有修改权限的操作,都要通过这个编号找到对应的账户。
- 找到它,你才能拿到
hack$的底层配置,才能对它进行 “权限改造”。
查看管理员“Administrator”的注册表内容。
查看“Administrator”对应类型的注册表信息
双击“000001F4”中的“F”值,在弹窗中右键单击鼠标选择“全选”,再次右键单击选择“复制”
点击“确定”并选择“000003E9”中的“F”值进行编辑,右键单击“全选”,右键单击“粘贴”。
3️⃣ 为什么要复制Administrator账户的F值,粘贴到hack$的F值里?
这是整个流程最核心、最关键的一步,也是实现 “克隆管理员” 的关键:
- 注册表
F值,是账户的权限 / 身份核心数据,里面包含了账户的管理员权限标识、登录权限、安全描述符等关键信息。 - 你把
Administrator的F值复制给hack$,就相当于把 “管理员的身份卡” 复制给了hack$。 - 这样一来,系统底层会把
hack$识别成和Administrator完全一样的管理员账户,拥有和真正管理员完全相同的权限。
粘贴完成后点击“确定”,选中“000003E9”并右键选择“导出”。
输入文件名“user”保存在桌面上。
同样的,导出“hack$”的注册表信息。保存到桌面。
4️⃣ 为什么要导出这两个注册表项?
- 导出
000003E9(hack$的用户配置)和Names\hack$(用户名映射)的注册表文件,是为了备份篡改后的账户数据。 - 因为下一步你要把
hack$从系统里删掉,而删掉之后,本地用户管理器和net user就找不到它了,但只要把导出的注册表文件再导入,系统就会直接从注册表加载这个账户,不会再被用户管理器识别。
一、先解释:这里的用户管理器指什么
日常说的「用户管理器」,主要就是这两个系统组件:
- 图形界面:
lusrmgr.msc(本地用户和组 / 计算机管理里的用户列表) - 命令行接口:
net user、wmic useraccount这类查询用户的命令
它们统一调用系统用户管理接口,读取系统标准用户库;而我们后面做的注册表影子账户,会绕过这套接口,所以在上面两处都看不到。
二、假设:不提前导出注册表,直接执行net user hack$ /del删除账户
分两层讲结果:
1. 执行删除命令时发生了什么
net user 用户名 /del是标准账户删除操作: 系统会同时做两件事:
- 在系统用户管理列表里移除该账户;
- 同步删除 SAM 注册表中对应
Names\hack$+ 对应 RID 项(000003ED)。
👉 也就是说:你之前修改的 F 值、权限配置,会跟着一起被删掉。
2. 删完之后还能不能登录、保留篡改的权限?
完全不能。
- 注册表内
hack$整条数据被清空,系统底层已经没有这个账户; - 无法用
hack$账号密码登录系统; - 之前复制过来的管理员权限、篡改的注册表配置全部失效;
- 相当于前面所有改
F值的操作全部白费。
三、反过来:为什么必须「先导出 → 再删用户 → 再导入」?
完整逻辑链:
- 改 F 值:把
hack$底层权限改成管理员; - 导出注册表:把改好的完整账户数据单独存成
.reg文件(相当于 “存档备份”); - 执行
net user /del:系统正常删除账户,原生 SAM 里的这条账户数据被清除; - 双击 reg 文件导入: 把备份好的账户数据重新写回 SAM 注册表。
关键变化:
- 现在这个账户不是通过「用户管理器」创建的,是直接手写进注册表;
- 系统标准用户查询接口(
net user、本地用户和组)遍历不到这类特殊写入的账户; - 但系统登录、权限校验会读取 SAM 底层数据,所以依然可以正常登录、保有管理员权限。
四、一句话总结
- 用户管理器=
net user+ 本地用户和组图形界面,是系统公开的用户查询入口; - 不导出直接删账户 → SAM 里账户数据连带篡改内容一起删除,账户消失、无法登录;
- 先导出再删除再导入 → 脱离公开用户列表,变成注册表级影子账户,隐身且可正常登录使用。
打开命令行窗口,删除用户“hack$”。
查看用户
双击桌面上的两个注册表信息将其导入注册表,选择“是”。
命令行中查看用户。
“本地用户和组”中查看用户
命令行中查看用户“hack$”,隐藏账户创建成功。
如果想验证登录隐藏账户,需进行以下操作。打开“运行”输入“gpedit.msc”命令,打开本地组策略编辑器,找到“计算机配置->Windows设置”->“安全设置”->“本地策略”->“安全选项”,在右侧的内容中找到“交互式登录:不显示最后的用户名”,右键点击进入“属性”窗口开启该功能,开启后可尝试切换用户登录隐藏账户。
1. 这个策略本身是什么?
交互式登录:不显示最后的用户名是 Windows 的一项安全策略:
- 默认情况下,系统登录界面会显示上一次成功登录的用户名,方便用户直接点选登录;
- 开启这个策略后,登录界面不再显示上一次登录的用户名,而是只显示空白的用户名输入框。
2. 为什么要给隐藏账户开这个?
这和你之前做的注册表后门是配套的,目的就是避免留下痕迹:
- 如果你用
hack$登录过系统,默认情况下,下次开机的登录界面就会直接显示hack$这个名字,这就直接暴露了后门账户; - 开启这个策略后,不管谁最后登录,界面都不显示用户名,别人就不会看到
hack$,也不会起疑心; - 它是整个 “影子账户” 流程的最后一步:让账户在登录界面也消失,做到从命令行、图形用户列表、登录界面都看不到痕迹。
3. 补充说明:它不影响登录,只是隐藏痕迹
开启这个策略后:
- 你还是可以用
hack$账号密码正常登录,只是登录时必须手动输入用户名和密码,不能点选; - 它不会影响账户的权限和存在,只是让系统不把账户名 “写在脸上”。
一句话总结
这一步的核心目的,就是擦除隐藏账户的登录痕迹,避免在登录界面暴露后门,让整个攻击链路更隐蔽。
注销当前用户,或者切换用户尝试使用hack$用户进行登录。可以成功登录
