|
内网渗透测试:域用户和机器用户 (qq.com)
内网渗透测试:域用户和机器用户WHOAMI FreeBuf FreeBuf
微信号 freebuf
功能介绍 国内网络安全行业门户
昨天
收录于话题
域用户大家都知道域用户是什么,就是域环境中的用户。和本地用户的帐户不同,域用户帐户保存在活动目录中。由于所有的用户帐户都集中保存在活动目录中,所以使得集中管理变成可能。
我们知道,在工作组环境中,所有计算机是独立的,要让用户能够登录到计算机并使用计算机的资源,必须为每个用户建立本地用户帐户。而在域环境中,一个域用户可以在域中的任何一台计算机上登录,域用户可以不再使用固定的计算机。当计算机出现故障时,域用户可以登录到另一台计算机上继续工作,这样也使帐号的管理变得简单。
域用户账户是在域内全局组 Domain Users 组中,本地用户账户在本地 User 组中。当计算机加入域时,会把 Domain Users 组添加到本地的 User 组中。因此域用户可以在域中的任何一台计算机上登录。
域用户的部分属性
在下图创建用户时可以看到用户有很多属性,如姓、名、展示名等:
这些属性都可以在 Active Directory 里面都可以查到:
姓对应的属性为sn:
- <pre><code>Adfind.exe -b "CN=JakeWilliam,CN=Users,DC=whoamianony,DC=org" sn</code></pre><pre><code># 将该用户设为 BaseDN 进行查询</code></pre>
复制代码
名对应的属性为givenName:
- Adfind.exe -b "CN=JakeWilliam,CN=Users,DC=whoamianony,DC=org" givenName
复制代码
展示名(姓名)对应的属性为displayName:
- Adfind.exe -b "CN=JakeWilliam,CN=Users,DC=whoamianony,DC=org" displayName
复制代码
值得注意的是,这个displayName虽然跟域用户名往往一样,但是不能用于登陆。
用户创建时间对应的属性为whenCreated:
- Adfind.exe -b "CN=JakeWilliam,CN=Users,DC=whoamianony,DC=org" whenCreated
复制代码
用户设置密码的时间对应的属性为pwdLastSet
- Adfind.exe -b "CN=JakeWilliam,CN=Users,DC=whoamianony,DC=org" pwdLastSet
复制代码
用户上次登录时间对应的属性为Lastlogon:
- Adfind.exe -b "CN=JakeWilliam,CN=Users,DC=whoamianony,DC=org" Lastlogon
复制代码
域用户的 userAccountControl 属性还记得这个 userAccountControl 属性吗?我们之前在《内网渗透测试:活动目录 Active Directory 的查询》中讲 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 根据每一位的名称便可以猜出这些位的含义了。比如,我们想查询所有设置了密码永不过期的用户:
- <code>Adfind.exe -b dc=whoamianony,dc=org -f "(userAccountControl:AND:=65536)" -bit -dn</code>
复制代码
查询所有设置了约束委派的用户:
- <pre><code>Adfind.exe -b dc=whoamianony,dc=org -f "(userAccountControl:AND:=524288)" -bit -dn</code></pre><pre><code># TRUSTED_FOR_DELEGATION 0x80000 524288</code></pre>
复制代码
查询域用户当我们拥有一个域用户的权限时,可以枚举域内的所有用户,此时主要有两个方法。
通过 SAMR 协议查询
通过 Active Directory 查询
- Adfind.exe -b dc=whoamianony,dc=org -f "(&(objectCategory=person)(objectClass=user))" -dn
复制代码
机器用户即机器账号、计算机账号,所有加入域的主机都会有一个机器用户,用户名为机器名加$,如: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 中查找域内的所有机器
- <code>Adfind.exe -b dc=whoamianony,dc=org -f "(objectclass=Computer)" -dn</code>
复制代码
Adfind 工具对查询域内机器提供了一些快捷方式:
- <pre><code>-sc computers_disabled # 查询已禁用的计算机</code></pre><pre><code>-sc computers_pwdnotreqd # 查询不需要设置密码的计算机</code></pre><pre><code>-sc computers_active # 查询已启用且最后输入密码的计算机</code></pre><pre><code>-sc computers_inactive # 查询已被禁用或密码最后设置的计算机</code></pre><pre><code>Adfind.exe -b dc=whoamianony,dc=org -sc computers_pwdnotreqd -dn</code></pre>
- <div aria-label="图片 图像 小部件" class="cke_widget_wrapper cke_widget_block cke_widget_image cke_image_nocaption cke_widget_selected" contenteditable="false" data-cke-display-name="图像" data-cke-filter="off" data-cke-widget-id="248" data-cke-widget-wrapper="1" role="region" tabindex="-1"></div>
复制代码
域内的域控都在 Domain Controllers 这个容器下,可以通过指定 BaseDn 为 Domain Controllers 这个容器,查看这个容器里面的机器来找到域内的所有域控:
- <pre><code>Adfind.exe -b "OU=Domain Controllers,DC=whoamianony,DC=org" -f "(objectclass=Computer)" -dn</code></pre>
- <div aria-label="图片 图像 小部件" class="cke_widget_wrapper cke_widget_block cke_widget_image cke_image_nocaption cke_widget_selected" contenteditable="false" data-cke-display-name="图像" data-cke-filter="off" data-cke-widget-id="240" data-cke-widget-wrapper="1" role="region" tabindex="-1"></div>
复制代码- Adfind.exe -b dc=whoamianony,dc=org -sc u:whoami userWorkstations
复制代码
还可以通过 PowerView 脚本查看:
- <code>Import-Module .\powerview.ps1</code>
复制代码
查询指定主机上正在登陆的域用户在收集内网信息时,我们经常会查询指定主机上正在登陆的域用户。这一查询我们可以直接通过现有的工具实现,但首先我们要先看两个 Win32 API。
NetSessionEnum是一个 Win32 API,用来提供有关在服务器上建立的会话的信息。
- <code>NET_API_STATUS </code>
复制代码
可以看到这个 API 的第一个参数是servername,我们可以通过servername指定一个远程的主机,然后这个 API 会去调用远程主机的 RPC,然后返回其他用户在访问这台远程主机的网络资源(例如文件共享)时所创建的网络会话,从而可以看到这个用户来自何处。
但是该 API 并不能查询到是谁登陆了这台远程主机,但是可以看到访问这台远程主机的网络资源时所创建的网络会话。从这个网络会话中可以看到哪个域用户来自哪个 IP。并且该 API 不需要在远程主机上有管理员权限。
我们利用NetWkstaUserEnum这个 API 来列出当前登录到这台远程主机机器的所有用户的信息
- <code>NET_API_STATUS </code>
复制代码
这个 API 的第一个参数也是servername可以指定一个远程主机,然后会去调用这台远程主机的 RPC,然后返回当前登录到这台远程主机的所有用户的信息。值得注意的是,调用该函数的用户需要具备机器A的本地管理员权限。但是该 API 需要在远程主机上有管理员权限。
目前有很多工具可以用来枚举域内某台主机上正在登陆的域用户,下面就简单介绍几个十分经典的工具,其本质还是调用了这两个 API 。
psloggedon.exe
psloggedon.exe可以查看本地登陆的用户和通过本地计算机或远程计算机资源登陆的用户。如果指定的是用户名而不是机器名,psloggedon.exe 会搜索网上邻居中的所有计算机,并显示该用户是否已经登录。该工具的某些功能可能需要管理员权限。
- psloggedon.exe [-] [-l] [-x] [\\computername或username]
复制代码
如下所示,查询域控制器 DC 上正在登陆的用户:
PVEFindADUser.exe
PVEFindADUser.exe可用于查找活动目录用户登陆的位置、枚举域用户,以及查找在特定计算机上登陆的用户,包括查找本地用户、通过 RDP 远程桌面登陆的用户、通过运行服务和计划任务的用户。运行该工具需要计算机配置 .NET Framework 2.0 环境。
我们一般直接运行以下命令,即可显示域中所有计算机上当前登陆的所有用户:
- PVEFindADUser.exe -current
复制代码
也可以通过-target指定查询的主机:
- PVEFindADUser.exe -current -target DC.whoamianony.org
复制代码
查询域用户正在登录的主机查询域用户正在登录的主机可以定位域用户,比如我们在内网渗透中,常常会使用各种工具来获取当前域管理员在线登录的机器,入侵此机器,然后迁移到域管理登陆所在的进程,便拥有了域管理的权限。定位域用户正在登录的主机有两种常规方法,一是日志,二是会话。
我们主要来讲第二种会话的方式,可以通过以下工具实现。
psloggedon.exe
在网络中查找域管理员用户 Administrator 当前在线登录的用户:
- psloggedon.exe whoamianony\administrator
复制代码
PVEFindADUser.exe
直接一把梭:
- PVEFindADUser.exe -current
复制代码
PowerView.ps1
PowerView.ps1脚本可以用来获取当前域管理员在线登录的主机,其依赖 PowerShell 和 WMI,是一个收集域信息很好用的脚本。
Invoke-UserHunter:搜索域管理员当前在线登录的主机,并验证当前用户是否具有对这些主机的本地管理员访问权限。它可以使用 Get-NetSessions 和Get-NetLoggedon 扫描每台服务器并对扫描结果进行比较,从而找出目标用户集,并且无需管理员权限。
如下,可以看到本地域有两个域管理员:
下面,我们通过 Invoke-UserHunter 来定位他们:
- <code>Import-Module .\powerview.ps1</code>
复制代码
也可以查找指定用户当前在线登录的主机:
- Invoke-UserHunter -UserName whoami
复制代码
参考https://daiker.gitbook.io/windows-protocol/ldap-pian/10#4-cha-kan-yu-yong-hu-deng-lu-guo-de-zhu-ji
https://www.anquanke.com/post/id/196510#h2-4
https://blog.csdn.net/qq_36119192/article/details/105130076
https://www.freebuf.com/articles/network/243640.html
|
|