确定当前内网拥有域,且所控制的主机在域内,即可进行域内相关信息的收集

0x01 收集域内基础信息

本节的查询命令本质是通过LDAP协议到域控制器上进行查询的,因此查询需要权限认证。只有域用户有此权限,本地用户无法运行其命令(除system)在域中,除普通用户外,所有的机器都有一个机器用户,其用户名为机器名加上$system权限用户对应的是域内的机器用户,因此system权限用户可以运行

1、查询域

1
net view /domain

2、查询域内所有计算机

执行如下命令,通过查询得到主机名对主机角色进行初步判断

1
net view /domain:HACKE

3、查询域内所有用户组列表

如下命令,查询域内所有用户组列表

1
net group /domain

共13个组,系统自带的常见用户身份如下:

  • Domain Admins :域管理员
  • Domain Computers :域内机器
  • Domain Controllers :域控制器
  • Domain Guests :域访客,权限较低
  • Domain Users :域用户
  • Enterprise Admins :企业系统管理员用户

在默认情况下Domain AdminsEnterprise Admins对域内所有域控制器有完全控制权限

4、查询所有域成员计算机列表

命令如下,查询所有域成员计算机列表

1
net group "domain computers" /domain

5、获取域密码

如下命令,获取域密码策略、密码长度、错误锁定等信息

1
net accounts /domain

6、获取域信任信息

如下命令,获取域信任信息

1
nltest /domain_trusts

0x02 查找域控制器

1、查看域控制器机器名

如下命令,域控制器机器名为DC

1
nltest /DCLIST:hacke

2、查看域控制器的主机名

如下命令,可看到域控制器的主机名为

1
Nslookup -type=SRV _ldap._tcp

3、查看当前时间

在通常情况下,时间服务器为主域控制器,命令如下

1
net time /domain

4、查看域控制器组

如下命令,查看域控制器组,可看到有一台机器为DC的域控制器

1
net group "Domain Controllers" /Domain

实际网络中,一个域内一般存在两台或两台以上的域控制器,如下命令进行主域控制器查看

1
netdom query pdc

0x03 获取域内的用户和管理员信息

查询所有域用户列表

1、向域控制器进行查询

如下命令,向域控制器DC进行查询,域内有四个用户,其中,krbtgt用户不仅可以创建票据授权服务(TGS)的加密秘钥,还可以实现多种域内权限持久化方法

1
net user /domain

2、获取域内用户的详细信息

如下命令,获取域内用户的详细信息,常见参数包括用户名、描述信息、SID、域名、状态

1
wmic useraccount get /all

3、查看存在的用户

如下命令,可查看到域内有四个用户

1
dsquery user

常用的dsquery命令

  • squery computer : 查找目录中的计算机
  • dsquery contact : 查找目录中的联系人
  • dyquery subnet : 查找目录中的子网
  • dyquery group : 查找目录中的组
  • dyquery ou : 查找目录中的组织单位
  • dyquery site : 查找目录中的站点
  • dyquery server : 查找目录中的AD DC/LDS实例
  • dyquery user : 查找目录中用户
  • dyquery quota : 查找目录中的配额规定
  • dyquery partition 查找目录中的分区
  • dyquery * -用通用的LDAP查询来查找目录中的任何对象

4、查询本地管理组用户

如下命令,可看到本地管理组内有两个用户和一个组

1
net localgroup administrators

Domain Admins组中的用户默认为域内机器的本地管理员用户,在实际应用中,为了方便管理,会有与用户被设置为域机器的本地管理员用户

查询域管理员用户组

1、查询域管理员用户

如下命令,可看到存在一个管理员用户

1
net group "domain admins" /domain

2、查询管理员用户组

如下命令,可看到管理员用户为Administrator

1
net group "Enterprise Admins" /domain

0x04 定位域管理员

内网渗透测试需求是,获取内网中特定用户或机器的权限,进而获得特定的资源,对内网的安全性进行评估

域管理员定位概述

实际内网环境中会部署大量的安全设备进行防护。在域渗透中,获取域内的一个支点后,需要获取域管理员权限。

在一个域中,当计算机加入域后,会默认给域管理员组赋予本地系统管理员权限。也就是说,当计算机被添加到域中,成为域的成员主机时,系统会自动将域管理员组添加到本地系统管理员组中。因此,域管理员组的成员均可访问本地计算机,且具备完全控制权限。

定位域管理员的常规渠道,一是日志二是会话。日志是指本地机器的管理员日志,可以使用脚本或wevtutil工具导出并查看。会话是指域内每台机器的登陆会话,可以使用netsess.exepowerview等工具查询(可匿名查询,无需权限)

常用域管理员定位工具

假设已经在windows域中取得了普通用户权限,希望在域内横向移动,需要知道域内用户登陆的位置、他是否是任何系统的本地管理员、所属的组、他是否有权访问文件共享等。枚举主机、用户和组,有助于更好地了解域的布局

常用的域管理员定位工具有psloggedon.exePVEFindADUser.exenetsess.exe、以及hunterNetView等。在powershell中,常用的工具是PowerView

1、psloggedon.exe

在Windows平台上,可以指定命令net session来查看谁使用了本机资源,但是没有命令来查看谁在使用远程计算机资源、谁登陆本地或远程计算机。

使用psloggedon.exe可以查看本地登陆的用户和用过本地计算机或远程计算机的资源登陆的用户。如果指定的是用户名而不是计算机名,psloggedon.exe会搜索网上令居中的计算机,并限制该用户当前是否已经登陆。其原理是通过检查注册表HKEY_USERS项的key值来查询谁登陆过(需要调用NetSessionEnum API),某些功能需要管理员权限才能使用

psloggedon.exe下载地址:https://docs.microsoft.com/en-us/sysinternals/downloads/psloggedon

1
psloggedon [-] [-l] [-x] [\\计算机名| 用户名]

  • -:显示支持的选项和用于输出值的单位
  • -l:仅显示本地登陆,不显示本地和网络资源登陆
  • -X:不显示登陆时间
  • \\computername: 指定要列出登陆信息的计算机的名称
  • sername : 指定用户名,在网络中搜索该用户登陆的计算机

2、PVEFindADUser.exe

PVEFindADUser.exe可用于查找活动目录用户登陆的位置、枚举域用户,以及查找在特定计算机上登陆的用户,包括本地用户、通过RDP登陆的用户、用于运行服务和计划任务的用户。该工具需要.NET Framework 2.0且需要具有管理员权限

PVEFindADUser.exe下载地址:https://github.com/chrisdee/Tools/tree/master/AD/ADFindUsersLoggedOn

1
2
3
4
PVEFindADUser.exe <参数>
PVEFindADUser.exe -current
PVEFindADUser.exe -last
PVEFindADUser.exe -current "hacke\testuser"

  • -H:显示帮助信息
  • -u:检查程序是否有新版本
  • -current[“username”]:如果仅指定了-current参数,将获取目标计算机上当前登录的所有用户。如果指定了用户名(Domain\Username)则显示该用户登陆的计算机
  • -last[“username”]:如果仅指定了-last参数,将获取目标计算机的最后一个登陆用户。如果指定了用户名(Domain\Username)则显示此用户上次登陆的计算机。根据网络的安全策略,可能会隐藏最后一个登陆用户的用户名,此时使用该工具可能无法得到该用户名

  • -noping:阻止该工具在尝试获取用户登陆信息之前对目标计算机执行ping命令
  • -target:可选参数,用于指定要查询的主机,如果未指定此参数,将查询当前域中的所有主机。如果指定了该参数,则后跟一个由逗号分隔的主机名列表

直接运行PVEFindADUser.exe -current命令,即可显示域中所有计算机(计算机、服务器、域控制器等)上当前登录的所有用户。查询结果输出到report.csv文件中

3、netview.exe

netview.exe是一个枚举工具,使用WinAPI枚举系统,利用NetSessionEnum找寻登录会话,利用NetShareEnum找寻共享,利用NetWkstaUserEnum枚举登录的用户。netview.exe可以查询共享入口和有价值的用户,其绝大部分功能无需管理员权限就可使用。命令格式参数如下

netview.exe下载地址:https://malicious.link/projects/netview.exe

1
netview.exe <参数>

  • -h:显示帮助信息
  • -f filename.txt:指定要提取主机列表的文件
  • -e filename.txt:指定要排除的主机名的文件
  • -o filename.txt:将所有输出重定向到指定的文件
  • -d filename.txt:指定要提取主机列表的域。如果没有指定,则从当前域中提取主机列表
  • -g group:指定搜索的组名。如果没有指定,则在Domain Admins组中搜索
  • -c:对已找到的共享目录/文件的访问权限进行检查

4、Nmap的NSE脚本

如果存在域账户或者本地账户,可以使用nmap的smb-enum-sessions.nse引擎获取远程主机的登陆会话(不需要管理员权限)smb-enum-sessions.nse下载地址:https://nmap.org/nsedoc/scripts/smb-enum-sessions.html

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域名、工作组、系统时间等信息

5、PowerView脚本

PowerView是一筐powershell脚本,提供了辅助定位关键用户的功能,下载地址

  • Invoke-StealthUserHunter:只需要进行一次查询,就可以获取域里面的所有用户,使用方法为,从user.HomeDirectories中提取所有用户,并对没太服务器进行Get-NetSession获取。因不需要使用Invoke-UserHunter对没太机器进行操作,所以这个方法的隐蔽性相对较高(但涉及的机器不一定全面)。PowerView默认使用Invoke-StealthUserHunter如果找不到需要的信息,就使用Invoke-UserHunter

  • Invoke-UserHunter:找到域内特定的用户群,接受用户名、用户了表和域组查询,接收一个主机列表或查询可用的主机域名。可以使用Get-NetSessionGet-NetLoggedon(调用NetSessionEnum和NetWkstaUserEnumAPI)扫描每台服务器并对扫描结果进行比较,从而找出目标用户集,在使用时不需要管理员权限,在本地执行该脚本

6、Empire的user_hunter模块

Empire中的user_hunter模块用于查找域管理员登陆的机器,使用usemodule situational_awareness/network/powerview/user_hunter模块,可以清楚查看哪个用户登陆哪台主机

1
2
3
(Empire: agents) > interact T1CVBL3G
(Empire: T1CVBL3G) > usemodule situational_awareness/network/powerview/user_hunter
(Empire: powershell/situational_awareness/network/powerview/user_hunter) > execute

0X05 查找域管理员进程

在渗透测试过程中,一个典型的域权限提升过程,通常围绕着收集明文凭据或通过mimikatz提权等方法,在获取了管理员权限的系统中寻找域管理员登陆进程,进而收集域管理员的凭据。如果内网环境非常复杂,渗透人员无法立即在拥有权限的系统中获得域管理员进程,那么通常可以采用的方法是:在跳板机之间跳转,直至获取管理员权限,同时进行一些分析工作,进而找到渗透测试的路径。

假设:在某个内网环境中获得了一个域普通用户的权限,首先通过各种方法获得当前服务器的本地管理员权限,然后分析当前服务器的用户登陆列表及会话信息,知道哪些用户登陆了这台服务器。如果渗透人员分析发现,可以获取权限的登陆用户都不是域管理员账户,同时没有域管理员组中的用户登陆这台服务器,就可以使用另一个账户并寻找该账户在内网的哪台机器上具有管理员权限,再枚举这台机器上的登陆用户,从而继续渗透,直至找到一个可以获取域管理员权限的有效路径为止。

本机检查

1、获取域管理员列表

如下命令,可看到当前有一个域管理员

1
net group "Domain Admins" /domain

2、列出本机的所有进程及进程用户

如下命令,列出本机的所有进程和进程用户

1
tasklist /v

3、寻找进程所有者为域管理员

通过一跟二的步骤操作,进行域管理员进程的查找

查询域控制器的域用户会话

查询域控制器的域用户会话,其原理是:在域控制器中查询域用户会话列表,并将其与域管理员列表进行交叉引用,从而得到域管理会话的系统列表

1、查询域控制器列表

可使用LDAP查询从Domain Controllers单元中收集的域控制器列表,也可用net命令查询域控制器列表

1
net group "Domain Controllers" /domain

2、收集域管理员列表

可使用LDAP查询,也可用net命令,从域管理员组中收集域管理员列表

1
net group "Domain Admins" /domain

3、收集所有活动域的会话列表

使用Netsess.exe查询所有域控制器,获取所有的活跃域。这是一款牛逼的工具,使用如下命令

下载地址:http://www.joeware.net/freetools/tools/netsess/index.htm

1
Netsess.exe –h

4、交叉引用域管理员列表与活动会话列表

对域管理员列表和活动会话列表进行交叉引用,可以确定哪些IP地址有活动域令牌,可通过下列脚本快速使用netsess.exe的Windows命令行

将域控制器列表添加到dcs.txt中,将域管理员列表添加到amdins.txt中,并需要跟netsess.exe在同一目录,然后运行会在当前目录下生成一个文本文件sessions.txt

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

也可以使用自动Get Domain Admins(GDA)批处理脚本

查询远程系统中运行的任务

如果目标机器在域系统中是通过共享的本地管理员账户运行,就可使用如下进行查询系统中的域管理任务

首先,从Domain Admins组中收集域管理员列表

1
net group "Domain Admins" /domain

再运行如下脚本,将目标系统列表添加到ips.txt文件中,将收集的域管理员列表添加到names.txt文件中

1
FOR /F %i in (ips.txt) DO @echo [+] %i && @tasklist /V /S %i /U user /P password 2>NUL > output.txt && FOR /F %n in (names.txt) DO @type output.txt | findstr %n > NUL && echo [!] %n was found running a process on %i && pause
扫描远程系统的NetBIOS信息

某些版本Windows操作系统允许用户通过NetBIOS查询已登录用户,如下命令用于扫描远程系统活跃域中的管理会话

1
for /F %i in (ips.txt) do @echo [+] Checking %i && nbtstat -A %i 2>NUL >nbsessions.txt && FOR /F %n in (admins.txt) DO @type nbsessions.txt | findstr /I %n > NUL && echo [!] %n was found logged into %i

也可以用nbtscan工具收集域管理员列表

1
for /F %i in (ips.txt) do @echo [+] Checking %i && nbtscan -f %i 2>NUL >nbsessions.txt && FOR /F %n in (admins.txt) DO @type nbsessions.txt | findstr /I %n > NUL && echo [!] %n was found logged into %i

0x06 域管理员模拟方法简介

在渗透测试中,如果已经拥有一个meterpreter会话,就可以使用Incognito来模拟域管理员或者添加一个域管理员,通过尝试遍历系统中所有可用的授权令牌来添加新的管理员。

0x07 利用PowerShell收集域信息

如果想执行一个PowerShell脚本,需要修改PowerShell执行权限,常用执行权限有如下四种:

  • Restricted:默认设置,不允许执行任何脚本
  • Allsigned:只运行经过证书验证的脚本
  • Unrestricted:权限最高,可以执行任意脚本
  • RemoteSigned:对本地脚本不进行限制,对来自网络的脚本必须验证其签名

输入如下命令,此时的执行权限为默认的Restricted权限

1
Get-ExecutionPolicy

将还行权限修改为Unrestricted

1
Set-ExecutionPolicy Unrestricted

PowerView是一款依赖PowerShell和WMI对内网进行查询的常用渗透测试脚本,它集成在PowerSploit工具包中

首先下载PowerSploit后进入Recon目录,输入如下命令导入脚本

1
Import-Module .\PowerView.ps1 //导入脚本

PowerView常用命令如下

  • Get-NetDomain:获取当前用户所在域名称

  • Get-NetUser:获取所有用户的详细信息

  • Get-NetDomainController:获取所有域控制器的信息

  • Get-NetComputer:获取域内所有机器的详细信息

  • Get-NetOU:获取域中的OU信息

  • Get-NetGroup:获取所有域内组和组成员信息

  • Get-NetFileServer:根据SPN获取当前域使用的文件服务器信息
  • Get-NetShare:获取当前域内所有的网络共享信息

  • Get-NetSession:获取指定服务器的会话

  • Get-NetRDPSession:获取指定服务器的远程连接

  • Get-NetProcess:获取远程主机的进程

  • Get-UserEvent:获取指定用户的日志
  • Get-ADObject:获取活动目录的对象

  • Get-NetGPO:获取域内所有组的策略对象

  • Get-DomainPolicy:获取域默认策略或域控制器策略

  • Invoke-UserHunter:获取域用户登陆的计算机信息及该用户是否有本地管理员权限

  • Invoke-ProcessHunter:通过查询域内所有的机器进程找到特定用户

  • Invoke-UserEventHunter:根据用户日志查询某域用户登陆过哪些域机器

参考资料

内网安全攻防渗透测试实战指南