前言:

在域渗透中,需要对有目的性的渗透,快速控制一个域最快的办法(不包括直接利用提升为域管的漏洞)就是拿到域管理员的hash,然后对域控进行dcsync,拿到域内所有成员的hash,那么我们如何定位域管理员在哪台机器上登录过?

当然窃取凭据域管理员进程也是一个不错的选择!

1.通过net group "domain admins" /domain 列出域管理员组成员

2.通过tasklist /v 列出本地进程的所有者

3.进行交叉处理,找到域管理进程

通过域搭建的原理来看,在机器加入域之后,域管理员组成员会自动加入到本地的管理员组。

定位域管理员的常规渠道:

1.日志(本地管理员日志)

2.会话(域内每台机器的登陆回话)

常用工具

psloggedon.exe

这是微软的自带的pstool工具包的一个非常实用的工具,其原理为检查注册表HKey_USER项的key来查询,会调用NetSession api,所以有些功能需要管理员权限。

命令:

psloggedon 要列出登陆信息的机器名或者用户名#如果没有填 则默认为本地
如果指定用户名,则会搜索次用户登陆过哪些机器
描述
-显示支持的选项和用于输出值的度量单位
-l仅显示本地登录,而不显示本地和网络资源登录
-x不显示登录时间
\computername指定要为其列出登录信息的计算机的名称
username指定用户名,在网络中搜索该用户登陆的计算机

配合net localgroup administrators 找到域管登陆过的机器

PVEFindaduser.exe

用于查找AD用户的登录位置、枚举域用户,以及查找在特定计算机上登陆的用户,包括本地用户、通过RDP登陆的用户、用于运行服务和计划任务的用户。

命令;

PVEFindADUser.exe -current#将获取域内所有计算机上当前登陆的所有用户
结果保存到report.csv文件
参数描述
-last将获取目标计算机的最后一个登陆用户
-target指定要查询的计算机。
-current ["username"]-current参数显示每台PC上当前登录的用户在域中。如果指定用户名(在引号之间),则仅将显示该特定用户登录的PC
-noping阻止尝试枚举用户登录名之前对目标计算机执行ping命令

netview.exe

netview.exe是一个枚举工具,使用WinAPI枚举系统,利用NetSessionEnum找寻登录会话,利用NetShareEnum找寻共享,利用NetWkstaUserEnum枚举登录的用户,netview.exe还可以查询共享入口和有价值的用户。

netview.exe <参数>
-h显示帮助信息
-ffilename.txt:指定要提取主机列表的文件
-efilename.txt:指定要排除的主机名的文件
-ofilename.txt:将所有输出重定向到指定的文件
-dfilename.txt:指定要提取主机列表的域。如果没有指定,则从当前域中提取主机列表
-ggroup:指定搜索的组名。如果没有指定,则在Domain Admins组中搜索
-c对已找到的共享目录/文件的访问权限进行检查

nmap 脚本

可以使用nmap的smb-enum-sessions.nse引擎获取远程主机的登陆会话(不需要管理员权限)

其他域渗透脚本:

smb-enum-domains.nse:对域控制器进行信息收集,可以获取主机信息、用户、可使用密码策略的用户等

smb-enum-users.nse:在进行域渗透时,如获取了域内某台主机权限,但权限有限,无法获取更多的域用户信息,可借助此脚本对域控制器进行扫描

smb-enum-shares.nse:遍历远程主机的共享目录

smb-enum-processes.nse:对主机的系统进程进行遍历,通过此信息,可知道目标主机运行着哪些软件

smb-enum-sessions.nse:获取域内主机的用户登陆会话,查看当前是否有用户登陆

smb-enum-discovery.nse:收集目标主机的操作系统、计算机名、域名、域林名称、NetBIOS机器名、NetBIOS域名、工作组、系统时间等信息

Powerview脚本

主要涉及到定位关键用户的功能如下两个模块

  • Invoke-StealthUserHunter:只需要进行一次查询,就可以获取域里面的所有用户,使用方法为,从user.HomeDirectories中提取所有用户,并对没太服务器进行Get-NetSession获取。因不需要使用Invoke-UserHunter对没太机器进行操作,所以这个方法的隐蔽性相对较高(但涉及的机器不一定全面)。PowerView默认使用Invoke-StealthUserHunter如果找不到需要的信息,就使用Invoke-UserHunter
  • Invoke-UserHunter:找到域内特定的用户群,接受用户名、用户了表和域组查询,接收一个主机列表或查询可用的主机域名。可以使用Get-NetSessionGet-NetLoggedon(调用NetSessionEnum和NetWkstaUserEnumAPI)扫描每台服务器并对扫描结果进行比较,从而找出目标用户集,在使用时不需要管理员权限,在本地执行该脚本

Empire 模块

Empire 模块中也有功能和invoke-userhunter一样的模块,user_hunter,Empire我平时也不咋用,还得反弹shell到Empire属实有点麻烦,了解了解就行。

实际的域里面,大规模的枚举是会惊动ids等防护设备的

介绍完工具再来说说手动:

手工配合Netsess筛选数据

首先收集域控列表:

net group “Domain Controllers” /domain
Nslookup –type=SRV _ldap._tcp
。。。。。。。。

收集域管列表

net group “Domain Admins” /domain

通过Netsess.exe查询每个域控制器,收集所有活动域会话的列表

Netsess.exe -help #获取帮助

-full Full session info (requires admin)
-h servername Alternate method to specify server
-u username Username to filter for
-c client name Alternate method to specify client name

cmd联合命令:

FOR /F %i in (dc.txt) do @echo [+] Querying DC %i && @netsess -h %i 2>nul > sessions.txt && FOR /F %a in (domain_admins.txt) DO @type sessions.txt | @findstr /I %a

Dc.txt为收集的域控制器列表,domain_admins.txt为收集的域管列表

Get-NetLocalGroupMember 枚举远程计算机本地组

安装Recon模块

Set-ExecutionPolicy -ExecutionPolicy Bypass
import-module .\Recon.psd1

指定远程计算机,指定枚举管理员组

Get-NetLocalGroupMember -ComputerName 主机名 -GroupName administrators