电脑疯子技术论坛|电脑极客社区

微信扫一扫 分享朋友圈

已有 1653 人浏览分享

内网渗透测试:域用户和机器用户

[复制链接]
1653 0
本帖最后由 zhaorong 于 2021-9-9 15:10 编辑

前言

这又是一个关于域内基础概念与原理的系列。

域用户

大家都知道域用户是什么 就是域环境中的用户。和本地用户的帐户不同 域用户帐户保存在活动目录中
由于所有的用户帐户都集中保存在活动目录中 所以使得集中管理变成可能。
我们知道 在工作组环境中 所有计算机是独立的 要让用户能够登录到计算机并使用计算机的资源 必须为每个用户建立
本地用户帐户。而在域环境中 一个域用户可以在域中的任何一台计算机上登录 域用户可以不再使用固定的计算机当计
算机出现故障时 域用户可以登录到另一台计算机上继续工作,这样也使帐号的管理变得简单。

域用户账户是在域内全局组 Domain Users 组中 本地用户账户在本地 User 组中。当计算机加入域时会把
Domain Users 组添加到本地的 User 组中。因此域用户可以在域中的任何一台计算机上登录。
### 域用户的部分属性
在下图创建用户时可以看到用户有很多属性 如姓 名 展示名等:

QQ截图20210909142926.png

这些属性都可以在 Active Directory 里面都可以查到:

姓对应的属性为sn:
  1. Adfind.exe -b "CN=JakeWilliam,CN=Users,DC=whoamianony,DC=org" sn
  2. # 将该用户设为 BaseDN 进行查询
复制代码

QQ截图20210909143027.png

名对应的属性为givenName:
  1. Adfind.exe -b "CN=JakeWilliam,CN=Users,DC=whoamianony,DC=org" givenName
复制代码

100.png

展示名(姓名)对应的属性为displayName:
  1. Adfind.exe -b "CN=JakeWilliam,CN=Users,DC=whoamianony,DC=org" displayName
复制代码

99.png

值得注意的是,这个displayName虽然跟域用户名往往一样,但是不能用于登陆。

用户创建时间对应的属性为whenCreated:
  1. Adfind.exe -b "CN=JakeWilliam,CN=Users,DC=whoamianony,DC=org" whenCreated
复制代码

98.png

用户设置密码的时间对应的属性为pwdLastSet
  1. Adfind.exe -b "CN=JakeWilliam,CN=Users,DC=whoamianony,DC=org" pwdLastSet
复制代码

97.png

用户上次登录时间对应的属性为Lastlogon:
  1. Adfind.exe -b "CN=JakeWilliam,CN=Users,DC=whoamianony,DC=org" Lastlogon
复制代码

96.png

域用户的 userAccountControl 属性

还记得这个 userAccountControl 属性吗?我们之前在内网渗透测试:活动目录 Active Directory 的查询
中讲 Active Directory 的按位查询时就是用的 userAccountControl 属性这个位字段做的实例。
userAccountControl 属性记录了域用户账号的很多属性信息 该字段就是一个的位字段
其是由一个个位构成的:

95.png

根据每一位的名称便可以猜出这些位的含义了。比如 我们想查询所有设置了密码永不过期的用户:
  1. Adfind.exe -b dc=whoamianony,dc=org -f "(userAccountControl:AND:=65536)" -bit -dn
  2. # DONT_EXPIRE_PASSWORD  0x10000  65536
复制代码

94.png

查询所有设置了约束委派的用户:
  1. Adfind.exe -b dc=whoamianony,dc=org -f "(userAccountControl:AND:=524288)" -bit -dn
  2. # TRUSTED_FOR_DELEGATION 0x80000 524288
复制代码

93.png

查询域用户

当我们拥有一个域用户的权限时 可以枚举域内的所有用户 此时主要有两个方法。

通过 SAMR 协议查询
  1. net user /domain
复制代码

92.png

通过 Active Directory 查询
  1. Adfind.exe -b dc=whoamianony,dc=org -f "(&(objectCategory=per
  2. son)(objectClass=user))" -dn
复制代码

91.png

机器用户

即机器账号、计算机账号 所有加入域的主机都会有一个机器用户 用户名为机器名加$,如:WIN7$、WINXP$在域
环境中 普通域用户最多可以创建 10 个计算机账户 但是本地账号不能创建计算机账户。
默认情况下 加入域的机器默认在CN=Computers这个容器里面:

90.png

而域内的域控则都在 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 中查找域内的所有机器
  1. Adfind.exe -b dc=whoamianony,dc=org -f "(objectclass=Computer)" -dn
  2. Adfind.exe -b dc=whoamianony,dc=org -f "(objectcategory=Computer)" -dn
复制代码

89.png

Adfind 工具对查询域内机器提供了一些快捷方式:
  1. -sc computers_disabled    # 查询已禁用的计算机
  2. -sc computers_pwdnotreqd    # 查询不需要设置密码的计算机
  3. -sc computers_active    # 查询已启用且最后输入密码的计算机
  4. -sc computers_inactive    # 查询已被禁用或密码最后设置的计算机

  5. Adfind.exe -b dc=whoamianony,dc=org -sc computers_pwdnotreqd -dn
复制代码

88.png

87.png

域内的域控都在 Domain Controllers 这个容器下 可以通过指定 BaseDn 为 Domain Controllers 这个
容器查看这个容器里面的机器来找到域内的所有域控:
  1. Adfind.exe -b "OU=Domain Controllers,DC=whoamianony,DC=org" -f "(objectclass=Computer)" -dn
  2. Adfind.exe -b "OU=Domain Controllers,DC=whoamianony,DC=org" -f "(objectcategory=Computer)" -dn
复制代码

86.png

查询域用户与域成员机器的对应关系

在域环境中 域用户默认是可以登录域内任何一台机器的,这是因为域管理员在新增域用户时该域用户默认就会存在
域用户组 Domain Users 中,加入域的域成员机器会默认将全局组 Domain Users 加到其本地的 User 组中而域成
员机器本地组策略中的 “允许在本地登陆” 属性中包含了本地的 Users 组。

如下图可以可以看到域成员机器本地组策略中的 允许在本地登陆 属性中包含了本地的 Users 组:

83.png

如下图可以看到域成员机器本地的 Users 组中包含了域全局组 Domain Users :

82.png

因此域用户默认是可以在域中的任何一台计算机上登录的。
但是这样可能会存在一些安全隐患 所以域管理员为了安全起见 通常会限制域用户只能登陆指定的计算机
或限制某台计算机只允许指定的用户登录。具体操作有以下两种。

对域用户做限制 设置域用户只能登陆指定的计算机

81.png

如上图,设置该域用户只允许登录到 Client-PC 这台机器。

对机器做限制 限制某台计算机只允许指定的用户登录

这个可以通过下发组策略实现:

80.png

可以看到 这台计算机运行 Administrators 组和 Users 组的用户登录 如果此时需要设置不再允许
Users 组的用户登录的话 直接将 Users 组从里面删掉即可:

79.png

也可以直接在  允许本地登陆 中添加想要登陆的组和域成员名。

查询指定域用户能够登录的主机

域用户默认能本地登录域内的任何一台主机 但域管理员为了安全起见 通常会限制域用户只能登陆指定的
计算机在内网信息收集中,我们需要找到指定域用户能够登录的主机。
在限制了域用户只能登录到某台主机之 在 Active Directory 里面 会为该域用户设置一个userWorkStations属性
这个属性保存了这个域用户能够登录到的主机。而这个字段对于域内任何用户都是可读的 我们可以通过读域用户
的userWorkStations属性来查看域用户能够登录的主机:
  1. Adfind.exe -b dc=whoamianony,dc=org -sc u:whoami userWorkstations
复制代码

还可以通过 PowerView 脚本查看:
  1. Import-Module .\powerview.ps1
  2. Get-NetUser -Domain whoami.whoamianony.org
复制代码

查询指定主机上正在登陆的域用户

在收集内网信息时 我们经常会查询指定主机上正在登陆的域用户。这一查询我们可以直接
通过现有的工具实现 但首先我们要先看两个 Win32 API。
  1. NetSessionEnum是一个 Win32 API 用来提供有关在服务器上建立的会话的信息。
  2. NET_API_STATUS NET_API_FUNCTION NetSessionEnum(
  3. LMSTR   servername,
  4. LMSTR   UncClientName,
  5. LMSTR   username,
  6. DWORD   level,
  7. LPBYTE  *bufptr,
  8. DWORD   prefmaxlen,
  9. LPDWORD entriesread,
  10. LPDWORD totalentries,
  11. LPDWORD resume_handle
  12. );
复制代码

可以看到这个 API 的第一个参数是servername 我们可以通过servername指定一个远程的主机 然后这个
API会去调用远程主机的 RPC,然后返回其他用户在访问这台远程主机的网络资源例如文件共享时所创建
的网络会话 从而可以看到这个用户来自何处。

但是该 API 并不能查询到是谁登陆了这台远程主机 但是可以看到访问这台远程主机的网络资源时所创建的网络会话
从这个网络会话中可以看到哪个域用户来自哪个 IP。并且该 API 不需要在远程主机上有管理员权限。
我们利用NetWkstaUserEnum这个 API 来列出当前登录到这台远程主机机器的所有用户的信息
  1. NET_API_STATUS NET_API_FUNCTION NetWkstaUserEnum(
  2. LMSTR   servername,
  3. DWORD   level,
  4. LPBYTE  *bufptr,
  5. DWORD   prefmaxlen,
  6. LPDWORD entriesread,
  7. LPDWORD totalentries,
  8. LPDWORD resumehandle
  9. );
复制代码

这个 API 的第一个参数也是servername可以指定一个远程主机 然后会去调用这台远程主机的 RPC然后返回
当前登录到这台远程主机的所有用户的信息。值得注意的是 调用该函数的用户需要具备机器A的本地管理员
权限但是该 API 需要在远程主机上有管理员权限。
目前有很多工具可以用来枚举域内某台主机上正在登陆的域用户 下面就简单介绍几个十分经
典的工具,其本质还是调用了这两个 API 。

psloggedon.exe

psloggedon.exe可以查看本地登陆的用户和通过本地计算机或远程计算机资源登陆的用户如果指定
的是用户名而不是机器名 psloggedon.exe 会搜索网上邻居中的所有计算机,并显示该用户是否已
经登录。该工具的某些功能可能需要管理员权限。
  1. psloggedon.exe [-] [-l] [-x] [\\computername或username]
复制代码

如下所示,查询域控制器 DC 上正在登陆的用户:
  1. psloggedon.exe \\DC
复制代码

77.png

PVEFindADUser.exe

PVEFindADUser.exe可用于查找活动目录用户登陆的位置 枚举域用户 以及查找在特定计算机上登陆的用户
包括查找本地用户 通过 RDP 远程桌面登陆的用户、通过运行服务和计划任务的用户。运行该工具需要计算
机配置 .NET Framework 2.0 环境。
  1. PVEFindADUser.exe <参数>
复制代码

我们一般直接运行以下命令,即可显示域中所有计算机上当前登陆的所有用户:
  1. PVEFindADUser.exe -current
复制代码

76.png

也可以通过-target指定查询的主机:
  1. PVEFindADUser.exe -current -target DC.whoamianony.org
复制代码

59.png

查询域用户正在登录的主机

查询域用户正在登录的主机可以定位域用户 比如我们在内网渗透中 常常会使用各种工具来获取当前域管理员
在线登录的机器,入侵此机器,然后迁移到域管理登陆所在的进程  便拥有了域管理的权限。定位域用户正在
登录的主机有两种常规方法,一是日志 二是会话。

我们主要来讲第二种会话的方式,可以通过以下工具实现。

psloggedon.exe

在网络中查找域管理员用户 Administrator 当前在线登录的用户:
  1. psloggedon.exe whoamianony\administrator
复制代码

58.png

PVEFindADUser.exe

直接一把梭:
  1. PVEFindADUser.exe -current
复制代码

57 .png


PowerView.ps1

PowerView.ps1脚本可以用来获取当前域管理员在线登录的主机 其依赖 PowerShell 和
WMI,是一个收集域信息很好用的脚本。
Invoke-UserHunter:搜索域管理员当前在线登录的主机,并验证当前用户是否具有对这些主机的本地管
理员访问权限它可以使用 Get-NetSessions 和Get-NetLoggedon 扫描每台服务器并对扫描结果进行比较
从而找出目标用户集 并且无需管理员权限。

如下 可以看到本地域有两个域管理员:

56.png

下面 我们通过 Invoke-UserHunter 来定位他们:
  1. Import-Module .\powerview.ps1
  2. Invoke-UserHunter
复制代码

55.png

也可以查找指定用户当前在线登录的主机:
  1. Invoke-UserHunter -UserName whoami
复制代码

您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

关注

0

粉丝

9021

主题
精彩推荐
热门资讯
网友晒图
图文推荐

Powered by Pcgho! X3.4

© 2008-2022 Pcgho Inc.