在内网渗透测试中,信息收集的深度与广度,直接关系到整个内网渗透测试的成败,本篇文章主要对内网信息收集做简单介绍~
当渗透测试人员进入内网后,面对的是一片“黑暗森林”,所以渗透测试人员首先会对当前所处的网络环境进行判断,通常的判断分为三种:
对机器角色的判断,是指判断已经控制的机器是普通Web服务器、开发测试服务器、公共服务器、文件服务器、代理服务器、DNS服务器还是存储服务器等。具体的判断是通过对机器内的主机名、文件、网络连接等多种情况综合进行的。
对目前机器所处网络环境的拓扑结构进行分析和判断,是指需要对所处内网进行全面的数据收集及分析整理,绘制出大概的内网整体拓扑结构图,以便后期进行进一步的内网渗透和准确定位内网具体目标,从而完成渗透测试
对目前机器所处位置区域的判断,是指判断机器处于网络拓扑中的哪个区域,是在DMZ区、办公网,还是核心区核心DB等位置。当然,这里的区域并不是绝对的,只是一个大概的环境,不同位置的网络环境不一样,区域的界限也不一定明显。
不管是在外网中还是内网中,信息收集都是重要的第一步。当渗透测试人员成功控制一台机器后,其内网结构如何、这台机器是什么角色的、使用机器的人是什么角色的、机器上安装的是什么杀毒软件、机器是通过什么方式上网的、机器是笔记本还是台式机等,都需要通过信息收集来获取。
本机信息包括主机的系统、权限、内网分配P地址段、安装的软件杀毒、端口、服务、补丁更新频率、网络连接信息、共享、会话等。如果是域内主机,系统、软件、补丁、服务、杀毒一般都是批量安装的。通过收集本机的相关信息,可以进一步了解整个域的操作系统版本、软件、补丁、用户命名方式等。
执行如下命令,可以获取当前机器是否处在内网中、有几个内网、内网段分别是多少、是否是域内网、网关IP地址、DNS指向的IP地址等信息,如图所示:
获取操作系统和版本信息
systeminfo | findstr /B /C:"OS 名称" /C:"OS 版本"
执行以上命令,可以看到当前系统为Windows Server 2008 R2 Enterprise。如果是英文操作系统,则输入如下命令:
systeminfo | findstr /B /C:"OS Name" /C:"OS Version"
执行如下命令,查看系统体系结构,如下图所示:
echo %PROCESSOR_ARCHITECTURE%
使用wmic命令,可以将结果输出到文本中,具体如下,如下图所示:
wmic product get name,version
也可以利用PowerShell命令,收集软件版本信息条具体如下,如下图所示:
powershell "Get-WmiObject -class Win32_Product |Select-Object -Property name,version"
执行如下命令,查询本机服务信息,如下图所示:
执行如下命令,可以查看当前进程列表和进程用户,分析软件、邮件客户端、VPN和杀毒软件等进程,如下图所示:
执行如下命令也可以查看进程信息:
一般来说,域内的较件和杀毒软件应该是一致的,常见的杀毒软件进程,如下表所示:
执行如下命令查看启动程序信息,如下图所示:
wmic startup get command,caption
执行如下命令,查看计划任务,如下图所示:
schtasks /query /fo LIST /v
PS:如果遇到资源无法加载问题,则是由于当前活动页码所致:
之后,我们可以将活动页码修改为437即可:
之后再次执行即可查看到相关计划任务信息:
执行如下命令,查看主机开机时间,如下图所示:
net statistics workstation
执行如下命令,查看本机用户列表,通过分析本机用户列表,可以找出内部网络机器名的命名规则,特别是个人机器,可以推测出整个域的用户命名方式:
执行如下命令,获取本地管理员(通常含有域用户)信息:
net localgroup administrators
执行如下命令,查看当前在线用户信息
执行如下命令(需要管理员权限才行),列出或断开本地计算机和连接的客户端的会话,如下图所示:
执行如下命令,查看端口列表、本机开放的端口所对应的服务和应用程序:
从上图可以看到当前机器和哪些主机进行了连接以及TCP-UDP等端口使用、监听情况。还可以通过网络连接来进行初步的判断,如代理服务器可能会有很多机器来连代理端口、更新服务器(例如WSUS)可能开放更新端口8530、DNS服务器会开放53端口等,再根据其他信息进行综合判断。
执行如下命令,查看系统的详细信息,需要注意系统的版本、位数、域、补丁信息及跟新频率等。一般域内主机的补丁都是批量安装的,通过查看本地计算机补丁列表,可以找到未打补丁的漏洞,当前更新了2个补,如下图所示
同时,也可以使用wmic来识别安装在系统中的补丁情况,命令如下图所示:
wmic qfe get Caption,Description,HotFixID,InstalledOn
从上面的执行结果,我们可以看到补丁的名称、描述、补丁ID、安装时间等信息。
执行如下命令,可查看本机共享列表和可访问的域共享列表(域内共享有很多时候是相同的),如下图所示:
利用wmic查找共享,命令如下:
wmic share get name,path,status
执行如下命令,查询路由表及所有可用接口的ARP(地址解析协议)缓存表:
Windows Server 2003系统及以前版本,命令如下:
netsh firewall set opmode disable
Windows server 2003之后系统版本,命令如下:
netsh advfirewall set allprofiles state off
netsh firewall show config
Windows Server 2003系统及之前版本,允许指定程序全部链接,命令如下:
netsh firewall add allowedprogram c:\nc.exe "allow nc" enable
Windows server 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"
netsh advfirewall firewall add rule name="Remote Desktop" protocol=TCP dir=in localport=3389 action=allow
netsh advfirewall set currentprofile logging filename "C:\windows\temp\fw.log"
REG QUERY "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp" /V PortNumber
在Windows Server 2003中开启3389端口:
之后成功开启3389端口:
为了简化操作,我们可以创建一个脚本来实现在目标机器上查询流程、服务、用户账号、用户组、网络接口、硬盘信息、网络共享信息、安装Windows补丁、程序在启动运行、安装的软件列表、操作系统、时区信息等信息。网络上有很多类似的脚本,当然,我们也可以自己定制一个。在这里推荐一个利用WMIC收集目标机信息的脚本。
WMIC(Windows Management Instrumentation Command-Line,Windows管理工具命令行)是Windows下最有用的命令行工具。WMIC对于信息收集和渗透都是非常实用的。默认任何版本的WindowsXP的低权限用户不能访问WMIC,Windows7以上版本允许低权限的用户访问WMIC并执行相关查询操作。
WMIC脚本的不载地址为http://www.fuzzysecurity.com/scripts/files/wmic_info.rar,执行脚本后,会将所有结果写入一个HTML文件,如下图所示:
在 Empire 下也存在类似模块,输入“usemodule situational_awareness/host/winenum”命令即可查看本机用户、域组成员、最后的密码设置时间、剪贴板内容、系统基本信息、网络适配器信息、 共享信息等,如下图所示:
另外,situational_awareness/host/computerdetails 模块几乎列举了系统中的所有有用信息,如目标主机事件日志、应用程序控制策略日志,包括 RDP 登录信息、PowerShell 脚本运行和保存的信息等。在运行这个模块时需要管理员权限
查看当前权限,命令如下
获取了一台主机的权限后,会有以下三种情况:
for /L %I in (1,1,254) DO @ping -w 1 -n 1 192.168.174.%I | findstr "TTL="
也可以使用VBS脚本,代码如下:
strSubNet = "192.168.174."
Set objFSO= CreateObject("Scripting.FileSystemObject")
Set objTS = objfso.CreateTextFile("C:\Windows\Temp\Result.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:\\.\root\cimv2")
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
在使用时,需要修改IP地址段,之后输入如下命令,添加参数/b 表示置于后台运行
cscript c:\windows\temp\1.vbs
该命令默认会把扫描结果写到C:\Windows\Temp\Result.txt 文件中,相对而言速度很慢,不是很推荐,如下图所示:
通过查询目标主机的端口开放信息,不仅可以了解目标主机所开放的服务,还可以找出其开放服务的漏洞、分析目标的网络拓扑结构等,具体需要关注以下三点:
确定了当前内网拥有的域,并且所控制的主机在域里面,就可以进行域内相关信息的收集了。因为这些查询命令本质上都是通过LDAP协议去域控制器上查询的,查询时候需要经过权限认证, 只有域用户才有这个权限,所以本地用户是无法运行以下命令的(system 权限用户除外。在域里面,除了普通用户,所有机器都有一个机器用户,用户名为机器名加“$”。 system 用户对应的就是域里面的机器用户,所以 system权限用户可以运行以下查询命令)。
查询域的命令如下:
net view /domain
执行如下命令,可以通过查询得到的主机名来对主机角色进行初步判断,如下图所示。例如,"dev"可能是开发服务器,"web"或者app可能是Web服务, "NAS"可能是存储服务器,"fileserver"可能是文件服务器等。
net view /domain:XXX
执行如下命令,查询域内所有用户组列表:
net group /domain
可以看到,该域含有 13 个组。系统自带的常见组如下:
执行如下命令,查询所有域成员计算机列表:
net group "domain computers" /domain
执行如下命令,获取域信任列表信息:
nltest /domain_trusts
执行如下命令,可以看到域控制器机器名为DC
nltest /DCLIST:xxx
执行如下命令,可以看到域控制器主机名为 dc:
Nslookup -type=SRV _ldap._tcp
一般时间服务器为主域控制器,执行如下命令:
net time /domain
执行如下命令,查看域控制器组。有一台域控制器的机器名为DC:
net group "Domain Controllers" /domain
内网渗透测试与常规的渗透测试是截然不同的。内网渗透测试的需求是拿到内网中特定用户或特定机器的权限,进而获得特定资源,完成内网渗透测试任务。在通常的网络环境里,内网中部署了大量的网络安全设备,如IDS、IPS、日志审计、安全网关、反病毒软件等。所以,在域网络攻击测试场景中,如果渗透测试人员获取了域内的一个支点,为了实现对域网络的整体控制, 渗透测试人员就需要获取域管理员权限。
假设已经在Windows域中取得了普通用户权限,希望在域内横向移动,想知道域内用户登录 的位置、他是否是任何系统中的本地管理员、他所归属的组、他是否有权访问文件共享等。枚举主机、用户和组,有助于我们更好地了解域内布局。
常用的工具有psloggedon.exe、pveFindADUser.exe、netsess.exe、hunter、NetView 等。在PowerShell中,常用的脚本是PowerView。
在Windows中,可以使用命令“net session”查看谁在本地计算机上使用了资源,但是没有命令用来查看谁在使用远程计算机的资源、谁登录了本地或远程计算机。psloggedon.exe可以显示本地登录的用户和通过本地计算机或远程计算机的资源登录的用户。如果指定了用户名而不是计算机,psloggedon.exe会搜索网络邻居中的计算机,并显示该用户当前是否已登录,其原理是通过检 验注册表里HKEY_USERS项的key值来查询谁登录过机器(同样调用了NetSessionEnum API), 某些功能需要拥有管理员权限才能使用。psloggedon.exe的下载地址为https://docs.microsoft.com/en-us/sysinternals/downloads/psloggedon,使用如下命令及参数,如下图所示:
psloggedon [-] [-l] [-x] [\\computername|username]
pveFindADUser.exe 可用于查找 Active Directory 用户登录的位置,枚举域用户,以及查找在 特定计算机上登录的用户,包括本地用户、通过RDP 登录的用户、用于运行服务和计划任务的用户账 户。运行该工具的计算机需要具有.NET Framework 2.0,并且需要具有管理员权限。pveFindADUser.exe 的下载地址为 https://github.com/chrisdee/Tools/tree/master/AD/ADFindUsersLoggedOn,使用如下命令及参数,如下图所示:
pveFindADUser.exe <参数>
netview.exe 是一个枚举工具,使用 WinAPI 枚举系统,利用 NetSessionEnum 找寻登录会话, 利用 NetShareEnum找寻共享,利用 NetWkstaUserEnum枚举登录的用户。同时,netview.exe 能够 查询共享入口和有价值用户。netview.exe 的绝大部分功能不需要管理员权限即可执行,下载地址为https://github.com/mubix/netview,使用如下命令及参数,如下图所示:
PowerShell是微软推出的一款用于提高管理员对操作系统及应用程序易用性和扩展性的脚本环境,可以说是cmd.exe的加强版。微软已经将PowerShell 2.0 内置在Windows Server 2008 和 Windows 7中,将PowerShell 3.0内置在Windows Server 2012和 Windows 8中,将 PowerShell 4.0内置在 Windows Server 2012 R2 和 Windows 8.1 中,将PowerShell 5.0 内置在 Windows Server 2016 和 Windows 10 中。PowerShell 作为微软官方推出的脚本语言,在Windows系统中的强大众所周知:在系统管理员手中,可以提高Windows系统管理工作的自动化程度;在渗透测试人员手中, 便于渗透测试人员更好地绕过系统防护和相关反病毒软件。
如果想在 Windows 系统中执行一个 PowerShell 脚本,首先需要在Windows 系统的“开始菜 单”中打开“Run”对话框,输入“powershell”,如下图所示:
接下来,将弹出一个窗口,窗口上方有“Administrator”字样,代表当前 PowerShell 权限为管理员权限,如下图所示:
如果想执行一个PowerShell脚本,需要修改PowerShell的默认权限为执行权限。PowerShell常用的执行权限共有四种,具体如下:
PS:PowerShell在内网渗透中还是很有用的,由于相关的内容过多就不再展开了~
由于文章篇幅原因,这里不再多赘述其他内容了,至于内网渗透中信息收集的方法自然不仅仅局限于上面这些,有兴趣的可以做深入的了解与分析,同时GitHub上也有很多关于内网信息收集的方法与辅助脚本~
《内网安全攻防》
《Metasploite渗透测试指南》
《PowerShell实战指南第三版》