域渗透基础知识(三)之域用户与机器用户
目录
域用户
大家都知道域用户是什么,就是域环境中的用户。和本地用户的帐户不同,域用户帐户保存在活动目录中。由于所有的用户帐户都集中保存在活动目录中,所以使得集中管理变成可能。
我们知道,在工作组环境中,所有计算机是独立的,要让用户能够登录到计算机并使用计算机的资源,必须为每个用户建立本地用户帐户。而在域环境中,一个域用户可以在域中的任何一台计算机上登录,域用户可以不再使用固定的计算机。当计算机出现故障时,域用户可以登录到另一台计算机上继续工作,这样也使帐号的管理变得简单。
域用户账户是在域内全局组 Domain Users 组中,本地用户账户在本地 User 组中。当计算机加入域时,会把 Domain Users 组添加到本地的 User 组中。因此域用户可以在域中的任何一台计算机上登录。
域用户的 userAccountControl 属性
Active Directory 的按位查询时就是用的 userAccountControl 属性这个位字段做的实例。
userAccountControl 属性记录了域用户账号的很多属性信息,该字段就是一个的位字段,其是由一个个位构成的:
Property flag | Value in hexadecimal | Value in decimal |
---|---|---|
SCRIPT | 0x0001 | 1 |
ACCOUNTDISABLE | 0x0002 | 2 |
HOMEDIR_REQUIRED | 0x0008 | 8 |
LOCKOUT | 0x0010 | 16 |
PASSWD_NOTREQD | 0x0020 | 32 |
PASSWD_CANT_CHANGE | 0x0040 | 64 |
ENCRYPTED_TEXT_PWD_ALLOWED | 0x0080 | 128 |
TEMP_DUPLICATE_ACCOUNT | 0x0100 | 256 |
NORMAL_ACCOUNT | 0x0200 | 512 |
INTERDOMAIN_TRUST_ACCOUNT | 0x0800 | 2048 |
WORKSTATION_TRUST_ACCOUNT | 0x1000 | 4096 |
SERVER_TRUST_ACCOUNT | 0x2000 | 8192 |
DONT_EXPIRE_PASSWORD | 0x10000 | 65536 |
MNS_LOGON_ACCOUNT | 0x20000 | 131072 |
SMARTCARD_REQUIRED | 0x40000 | 262144 |
TRUSTED_FOR_DELEGATION | 0x80000 | 524288 |
NOT_DELEGATED | 0x100000 | 1048576 |
USE_DES_KEY_ONLY | 0x200000 | 2097152 |
DONT_REQ_PREAUTH | 0x400000 | 4194304 |
PASSWORD_EXPIRED | 0x800000 | 8388608 |
TRUSTED_TO_AUTH_FOR_DELEGATION | 0x1000000 | 16777216 |
根据每一位的名称便可以猜出这些位的含义了。比如,我们想查询所有设置了密码永不过期的用户:
Adfind.exe -b dc=hack,dc=org -f "(userAccountControl:AND:=65536)" -bit -dn
# DONT_EXPIRE_PASSWORD 0x10000 65536
查询所有设置了约束委派的用户:
Adfind.exe -b dc=hack,dc=org -f "(userAccountControl:AND:=524288)" -bit -dn
# TRUSTED_FOR_DELEGATION 0x80000 524288
查询域用户
当我们拥有一个域用户的权限时,可以枚举域内的所有用户,此时主要有两个方法。
通过 SAMR 协议查询
net user /domain
通过 Active Directory 查询
Adfind.exe -b dc=hack,dc=org -f "(&(objectCategory=person)(objectClass=user))" -dn #在hack.org域中查找域用户。
机器用户
即机器账号、计算机账号,所有加入域的主机都会有一个机器用户,用户名为机器名加$
,如:WIN7$
、WINXP$
。在域环境中,普通域用户最多可以创建 10 个计算机账户,但是本地账号不能创建计算机账户。
默认情况下,加入域的机器默认在CN=Computers这个容器里面
而域内的域控则都在 Domain Controllers 这个容器下。
机器用户跟 SYSTEM 用户的关系
当你在 Active Directory 中随便打开 Domain Computer 中的一台主机,查看其objectClass
便可以发现他是computer
类的实例,并且computer
类的user
类的子类。我们知道,域用户是user
类的实例,而computer
类的user
类的子类则说明域用户有的属性,计算用户都有。甚至我们可以说,机器用户就是一种域用户。那我们能不能利用这个机器用户呢?
其实本地用户 SYSTEM 就对应于域内的机器用户,在域内的用户名就是机器名加$
,比如 WIN7,他的机器名是 WIN7,那么他在域内登录的用户名就是WIN7$
。
当我们拿下一台内网主机后,发现没有域内用户,这个时候我们将当前用户提升到 SYSTEM,就可以在域内充当机器用户了。但是提升到 SYSTEM 还需要利用一些提权方法。
查找域内所有的机器
我们可以通过objectclass=Computer
或者objectcategory=Computer
过滤语法在 Active Directory 中查找域内的所有机器
Adfind.exe -b dc=hack,dc=org -f "(objectclass=Computer)" -dn #在hack.org域中查找域机器
Adfind.exe -b dc=hack,dc=org -f "(objectcategory=Computer)" -dn #在hack.org域中查找域机器
Adfind 工具对查询域内机器提供了一些快捷方式:
-sc computers_disabled # 查询已禁用的计算机 -sc computers_pwdnotreqd # 查询不需要设置密码的计算机 -sc computers_active # 查询已启用且最后输入密码的计算机 -sc computers_inactive # 查询已被禁用或密码最后设置的计算机
域内的域控都在 Domain Controllers 这个容器下,可以通过指定 BaseDn 为 Domain Controllers 这个容器,查看这个容器里面的机器来找到域内的所有域控:
Adfind.exe -b "OU=Domain Controllers,DC=hack,DC=org" -f "(objectclass=Computer)" -dn #在hack.org域下查找域控
Adfind.exe -b "OU=Domain Controllers,DC=hack,DC=org" -f "(objectcategory=Computer)" -dn #在hack.org域下查找域控
查询域用户与域成员机器的对应关系
在域环境中,域用户默认是可以登录域内任何一台机器的,这是因为域管理员在新增域用户时该域用户默认就会存在域用户组 Domain Users 中,加入域的域成员机器会默认将全局组 Domain Users 加到其本地的 User 组中,而域成员机器本地组策略中的 “允许在本地登陆” 属性中包含了本地的 Users 组。
如下图可以可以看到域成员机器本地组策略中的 “允许在本地登陆” 属性中包含了本地的 Users 组:
如下图可以看到域成员机器本地的 Users 组中包含了域全局组 Domain Users :
因此域用户默认是可以在域中的任何一台计算机上登录的。
但是这样可能会存在一些安全隐患,所以域管理员为了安全起见,通常会限制域用户只能登陆指定的计算机,或限制某台计算机只允许指定的用户登录。
对域用户做限制,设置域用户只能登陆指定的计算机:
如上图,设置该域用户只允许登录到 Client-PC 这台机器。
对机器做限制,限制某台计算机只允许指定的用户登录
这个可以通过下发组策略实现:
查询指定域用户能够登录的主机
域用户默认能本地登录域内的任何一台主机,但域管理员为了安全起见,通常会限制域用户只能登陆指定的计算机。在内网信息收集中,我们需要找到指定域用户能够登录的主机。
在限制了域用户只能登录到某台主机之后,在 Active Directory 里面,会为该域用户设置一个userWorkStations
属性。这个属性保存了这个域用户能够登录到的主机。而这个字段对于域内任何用户都是可读的,我们可以通过读域用户的userWorkStations
属性来查看域用户能够登录的主机:
Adfind.exe -b dc=hack,dc=org -sc u:hack userWorkstations #查询hack用户在hack.org域中能够访问的机器
还可以通过 PowerView 脚本查看:
Import-Module .\powerview.ps1 #导入模块
Get-NetUser -Domain hack.hack.org #查询hack用户在hack.org域中能够登录的主机
查询指定主机上正在登陆的域用户
psloggedon.exe
下载地址:PsLoggedOn - Sysinternals | Microsoft Learn
psloggedon.exe可以查看本地登陆的用户和通过本地计算机或远程计算机资源登陆的用户。如果指定的是用户名而不是机器名,psloggedon.exe 会搜索网上邻居中的所有计算机,并显示该用户是否已经登录。该工具的某些功能可能需要管理员权限。
如下所示,查询域控制器 DC 上正在登陆的用户:
psloggedon.exe \\DC
PVEFindADUser.exe
下载地址:Tools/AD/ADFindUsersLoggedOn at master · chrisdee/Tools · GitHub
PVEFindADUser.exe可用于查找活动目录用户登陆的位置、枚举域用户,以及查找在特定计算机上登陆的用户,包括查找本地用户、通过 RDP 远程桌面登陆的用户、通过运行服务和计划任务的用户。运行该工具需要计算机配置 .NET Framework 2.0 环境。
我们一般直接运行以下命令,即可显示域中所有计算机上当前登陆的所有用户:
PVEFindADUser.exe -current
查询域用户正在登录的主机
查询域用户正在登录的主机可以定位域用户,比如我们在内网渗透中,常常会使用各种工具来获取当前域管理员在线登录的机器,入侵此机器,然后迁移到域管理登陆所在的进程,便拥有了域管理的权限。定位域用户正在登录的主机有两种常规方法,一是日志,二是会话。
psloggedon.exe
下载地址:PsLoggedOn - Sysinternals | Microsoft Learn
在网络中查找域管理员用户 Administrator 当前在线登录的用户:
psloggedon.exe hack\administrator #在hack域中查找域管理员用户 Administrator 当前在线登录的用户
PVEFindADUser.exe
PVEFindADUser.exe的用法和之前提到的一样
PVEFindADUser.exe -current
PowerView.ps1
下载地址:PowerTools/PowerView at master · PowerShellEmpire/PowerTools · GitHub
PowerView.ps1脚本可以用来获取当前域管理员在线登录的主机,其依赖 PowerShell 和 WMI,是一个收集域信息很好用的脚本。
Invoke-UserHunter:搜索域管理员当前在线登录的主机,并验证当前用户是否具有对这些主机的本地管理员访问权限。它可以使用 Get-NetSessions 和Get-NetLoggedon 扫描每台服务器并对扫描结果进行比较,从而找出目标用户集,并且无需管理员权限。
如下,可以看到本地域有两个域管理员:
下面,我们通过 Invoke-UserHunter 来定位他们:
Import-Module .\powerview.ps1 #导入模块
Invoke-UserHunter
也可以查找指定用户当前在线登录的主机:
Import-Module .\powerview.ps1 #导入模块
Invoke-UserHunter -UserName hack #查找hack用户当前登录的主机
相关文章[内网渗透测试:域用户和机器用户](内网渗透测试:域用户和机器用户 - FreeBuf网络安全行业门户)