跳到主要内容

Windows 账户控制

在 Windows 账户控制中,会涉及到账户增添删改,修改密码,修改密码安全性策略等需求

关于命令提示符

在 Windows 的命令提示符中,指令的大小写是不影响执行效果的,如

net user username /DELETE

和以下指令

net user username /DELETE

是具有等价效果的

查询系统内已存在的用户

net user
关于隐藏账户

如用户名的后缀为 $,例如:test$,则会被系统识别为系统账户(隐藏账户),从而不能在 net user 的结果中出现。面对隐藏账户,可以从注册表内进行搜索,或者看一下控制面板的用户账户管理页面

关于命令行操作

通过命令行操作用户账户,需要管理员账户权限。在 Windows 7 系统中,可以在开始菜单中找到 命令提示符,右键,选择 以管理员身份运行,即可获得管理员账户权限;在 Windows 10 中,可以直接右键开始菜单按钮,选择 Windows Powershell (管理员),也可获得管理员账户权限

Windows 7 命令提示符 管理员

Windows 10 Powershell 管理员

禁用账户

在安全加固中,往往会遇到一些系统和服务自动创建的来宾账户(Guest 账户),这类账户往往没有身份验证机制,或者存在弱身份验证机制,会给系统带来未授权访问的风险。为了杜绝此类风险,可以将账户直接禁用,以下以 Guest 账户举例

首先,可以通过 net user guest 指令,查看当前 Guest 账户的状态,其效果应该如下

C:\Users\admin>net user Guest
用户名 Guest
全名
注释 供来宾访问计算机或访问域的内置帐户
用户的注释
国家 / 地区代码 000 (系统默认值)
帐户启用 No
帐户到期 从不

上次设置密码 2023/11/21 0:09:26
密码到期 从不
密码可更改 2023/11/21 0:09:26
需要密码 No
用户可以更改密码 No

允许的工作站 All
登录脚本
用户配置文件
主目录
上次登录 从不

可允许的登录小时数 All

本地组成员 *Guests
全局组成员 *None
命令成功完成。

可以看到,当前 Guest 账户的启用状态为:No。如果发现 Guest 账户为启用状态,则存在攻击者利用 Guest 账户进行未授权登陆的可能性。

为了禁用 Guest 账户,可执行以下指令:

net user Guest /ACTIVE:NO

即可禁用 Guest 账户

修改用户密码

直接使用 net user 指令即可

net user username password

删除账户

使用控制面板来删除用户

在控制面板中,直接进入账户的信息界面,即可直接点击 删除账户

控制面板 删除账户

后续还可以选择是否将这个用户的个人数据进行清除(即删除个人文件夹,包括桌面、下载目录等等)

控制面板 删除账户 确认界面

使用命令行来删除账户

通过以下指令来实现(以 test 账户为例):

net user test /DELETE

即可删除掉 test 账户

排查影子账户

需要注意的是,普通的影子账户,虽然在 net user 的结果中不可见,但是仍然可以在控制面板的用户账户管理页面看到。如下图中的 test$ 账户,虽然在 net user 的结果中不可见,但是仍然可以在控制面板中看到。

影子账户 隐藏效果

备注

需要注意的是,这种效果还只是最普通的影子账户,因为这种手法创建的影子账户,在控制面板中还是可见的,隐蔽性并不是很强

对于更高级的影子账户,相关原理可以参考:渗透测试 / 权限维持 / Windows

由于注册表是 Windows 储存配置数据的核心,所以可以直接通过注册表数据来对系统所有的账户进行排查

Win+R,执行 regedit,打开注册表编辑器,进入 HKEY_LOCAL_MACHINE\SAM\SAM 分支

注册表 SAM 未授权

由于 SAM 区的数据涉及敏感信息,所以 Windows 的默认权限设置下是没有办法直接查看的,但是可以手动更改权限设置,将 Administrators 加入到权限组中,并给予所有权限

注册表 SAM Administrators 授权

然后重新启动注册表编辑器,即可访问到 SAM 区域内的用户数据

注册表 SAM Account Data

所有账户的账户数据保存在:HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Account\Users\Names,可以在此处看到所有的用户账户

密码策略

修改密码的相关安全策略,可以通过 Windows 的组策略来实现。组策略编辑器启动方式:Win+r , gpedit.msc

密码策略,适用于对用户的密码安全性做出要求,如对用户密码的复杂度进行要求,或者限制密码的有效时间

组策略 密码策略

组策略 账户锁定策略

密码最长有效期

可以通过组策略的进行配置,路径为:计算机配置 - Windows 设置 - 安全设置 - 账户策略 - 密码策略 - 密码最长使用期限

组策略 密码最长使用期限

密码最短长度

通过限制密码的最短长度,可以极大提高密码爆破所需要的时间成本,从而大大提高系统安全性

组策略 密码策略 密码长度最小值

密码安全历史(密码复用要求)

通过限制新密码与旧密码之间的重复性,可以避免使用旧密码导致的不可预料的密码泄露威胁

组策略 密码策略 强制密码历史

密码复杂度要求

通过启用密码的复杂性要求,可以强制要求用户的密码满足复杂度规则,从而极大程度上规避了密码爆破攻击

Windows 默认的密码复杂性要求

不能包含用户的帐户名,不能包含用户姓名中超过两个连续字符的部分

至少有六个字符长

包含以下四类字符中的三类字符:

  • 英文大写字母 (A 到 Z)
  • 英文小写字母 (a 到 z)
  • 10 个基本数字 (0 到 9)
  • 非字母字符 (例如 !、$、#、%)

在更改或创建密码时执行复杂性要求。

可以参考 Windows 官方的文档

Password must meet complexity requirements - Microsoft Learn

如果想要自定义密码复杂性要求的规则,Windows 原生并不自带相关的配置项,但是可以通过自行编译密码过滤器(Password Filters)来实现这种效果

关于自定义密码过滤器,可以参考官方文档:Password Filters - Microsoft Learn

组策略 密码策略 密码必须符合复杂性要求

账户锁定策略

针对用户凭据被恶意爆破的场景下,对用户登陆失败多次后限制登录,可以有效地限制恶意爆破的时间成本

账户锁定时间

通过配置 账户锁定时间,可以设定账户单次被锁定的时间

前提条件

启用此选项,需要配置 账户锁定阈值 项目

组策略 账户锁定策略 账户锁定时间

账户锁定阈值

通过配置 账户锁定阈值,可以设定账户登录失败被锁定的失败次数阈值

组策略 账户锁定策略 账户锁定阈值

重置账户锁定计数器

通过配置 重置账户锁定计数器,可以设定账户被锁定之后,经历多久时间才重置账户登陆失败的计数器

前提条件

启用此选项,需要配置 账户锁定阈值 项目

组策略 账户锁定策略 重置账户锁定计数器

要求用户下次登陆更改密码

通过强制要求用户在下次登陆时修改密码,可以达到强制用户丢弃旧密码,从而规避一些密码泄露的场景

通过 net user 指令来进行配置

net user  /LOGONPASSWORDCHG:YES