渗透测试人员进人内网后,面对的是一片“黑暗森林”。所以,渗透测试人员首先需要对当前所处的网络环境进行判断。判断涉及如下三个方面。
- 我是谁?一对 当前机器角色的判断。
- 这是哪?一对 当前机器所处网络环境的拓扑结构进行分析和判断。
- 我在哪?一对 当前机器所处区域的判断。
对当前机器角色的判断,是指判断当前机器是普通Web服务器、开发测试服务器、公共服务器、文件服务器、代理服务器、DNS服务器还是存储服务器等。具体的判断过程,是根据机器的主机名、文件、网络连接等情况综合完成的。
对当前机器所处网络环境的拓扑结构进行分析和判断,是指对所处内网进行全面的数据收集和分析整理,绘制出大致的内网整体拓扑结构图。
对当前机器所处区域的判断,是指判断机器处于网络拓扑中的哪个区域,是在DMZ、办公区还是核心区。当然,这里的区域不是绝对的,只是一个大概的环境。处于不同位置的网络,环境不一样,区域界限也不一定明显。
本机信息包括操作系统、权限、内网IP地址段、杀毒软件、端口、服务、补丁更新频率、网络连接、共享、会话等。如果是域内主机,操作系统、应用软件、补丁、服务、杀毒软件一般都是批量安装的。
通过本机的相关信息,可以进一步了解整个域的操作系统版本、软件及补丁安装情况、用户命名方式等。
1.1、查询网络配置信息
1.2、查询操作系统和版本信息
查询操作系统和版本信息
执行以上命令,可以看到当前系统为Microsoft Windows 7,如果是中文系统,则输入如下命令。
查看系统体系结构
查看安装的软件及版本、路径等
使用wmic命令,将结果输出到文本文件中。
利用PowerShell命令,收集软件的版本信息。
1.3、查询本机服务信息
1.4、查询进程列表
执行如下命令,可以查看当前进程列表和进程用户,分析软件、邮件客户端、VPN和杀毒软件等进程。
执行如下命令,查看进程信息
常见的杀毒软件的进程
1.5、查看启动程序信息
1.6、查看计划任务
1.7、查看主机开机时间
1.8、查询用户列表
通过分析本机用户列表,可以找出内网机器的命名规则。特别是个人机器的名称,可以用来推测整个域的用户命名方式。
执行如下命令,获取本地管理员(通常包含域用户)信息。
可以看到,本地管理员有两个用户和一个组。默认Domain Admins组中为域内机器的本地管理员用户。在真实的环境中,为了方便管理,会有域用户被添加为域机器的本地管理员用户。
执行如下命令,查看当前在线用户
1.9、列出或断开本地计算机与所连接的客户端之间的会话
1.10、查询端口列表
此时可以看到当前机器和哪些主机建立了连接,以及TCP、UDP等端口的使用和监听情况。可以先通过网络连接进行初步判断(例如,在代理服务器中可能会有很多机器开放了代理端口,更新服务器可能开放了更新端口8530, DNS服务器可能开放了53端口等),再根据其他信息进行综合判断。
1.11、查看补丁列表
需要注意系统的版本、位数、域、补丁信息及更新频率等。域内主机的补丁通常是批量安装的,通过查看本机补丁列表,就可以找到未打补丁的漏洞。可以看到,当前系统更新了3 个补丁。
使用wmic命令查看安装在系统中的补丁
1.12、查询本机共享列表
利用wmic命令查找共享列表
1.13、查询路由表及所有可用接口的APP缓存表
1.14、查询防火墙相关配置
( 1 ) 关闭防火墙
Windows Server 2003及之前的版本,命令如下
Windows Server 2003之后的版本,命令如下
( 2 ) 查看防火墙配置
( 3 ) 修改防火墙配置
Windows Server 2003及之前的版本,允许指定程序全部连接,命令如下
Windows Server 2003之后的版本,情况如下
允许指定程序进入,命令如下
允许指定程序退出,命令如下
允许3389端口放行,命令如下。
( 4 ) 自定义防火墙日志的储存位置
1.15、查看代理配置情况
1.16、查询并开启远程连接服务
( 1 ) 查看远程连接端口
在命令行环境中执行注册表查询语句,命令如下。连接的端口为0xd3d,转换后为3389。
( 2 ) 在Windows Server 2003中开启3389端口
( 3 ) 在Windows Server 2008和Windows Server 2012中开启3389端口
为了简化操作,可以创建一个脚本,在目标机器上完成流程、服务、用户账号、用户组、网络接口、硬盘信息、网络共享信息、操作系统、安装的补丁、安装的软件、启动时运行的程序、时区等信息的查询工作。网上有很多类似的脚本,当然,我们也可以自己定制一个。在这里,利用WMIC收集目标机器信息的脚本。
WMIC ( Windows Management Instrumentation Command-Line, Windows 管理工具命令行)是最有用的Windows命令行工具。在默认情况下,任何版本的Windows XP的低权限用户不能访问WMIC,Windows 7以上版本的低权限用户允许访问WMIC并执行相关查询操作。
下载地址:http://www.fuzzysecurity.com/scripts/files/wmic_info.rar
执行该脚本后,会将所有结果写入一个HTML文件。
Empire提供了用于收集主机信息的模块。输人命令“usemodule situational_awareness/host/winenum",即可查看本机用户、域组成员、密码设置时间、剪贴板内容、系统基本信息、网络适配器信息、共享信息等。
另外, situational_awareness/host/computerdetails 模块几乎包含了系统中所有有用的信息,例如目标主机事件日志、应用程序控制策略日志,包括RDP登录信息、PowerShell脚本运行和保存的信息等。运行这个模块需要管理员权限。
域内用户:当前为ad域内的test7用户。
如果当前内网中存在域,那么本地普通用户只能查询本机相关信息,不能查询域内信息,而本地管理员用户和域内用户可以查询域内信息。其原理是:域内的所有查询都是通过域控制器实现的(基于LDAP协议),而这个查询需要经过权限认证,所以,只有域用户才拥有这个权限;当域用户执行查询命令时,会自动使用Kerberos协议进行认证,无须额外输人账号和密码。
本地管理员Administrator 权限可以直接提升为Ntauthority 或System权限,因此,在域中,除普通用户外,所有的机器都有一个机器用户(用户名是机器名加上“$")。在本质上,机器的system用户对应的就是域里面的机器用户。所以,使用System权限可以运行域内的查询命令。
获得了本机的相关信息后,就要判断当前内网中是否存在域。如果当前内网中存在域,就需要判断所控主机是否在域内。
执行如下命令,可以查看网关IP地址、DNS的IP地址、域名、本机是否和DNS服务器处于同一网段等信息。
然后,通过反向解析查询命令nslookup 来解析域名的IP地址。用解析得到的IP地址进行对比,判断域控制器和DNS服务器是否在同一台服务器上。
执行如下命令,“域”即域名,“登录服务器”为域控制器。如果“域”为“WORKGROUP”,表示当前服务器不在域内。
执行如下命令,“工作站域DNS名称”为域名(如果为“WORKGROUP",表示当前为非域环境),“登录域”用于表示当前登录的用户是域用户还是本地用户,此处表示当前登录的用户是域用户。
执行如下命令,判断主域(域服务器通常会同时作为时间服务器使用)。
执行以上命令后,通常有如下三种情况。
-
存在域,但当前用户不是域用户。
-
存在域,但当前用户是域用户。
-
当前网络环境为工作组,不存在域。
内网存活主机探测是内网渗透测试中不可或缺的一个环节。可在白天和晚上分别进行探测,以对比分析存活主机和对应的IP地址。
NetBIOS是局域网程序使用的一种应用程序编程接口( API),为程序提供了请求低级别服务的统一的命令集,为局域网提供了网络及其他特殊功能。几乎所有的局域网都是在NetBIOS协议的基础上工作的。NetBIOS 也是计算机的标识名,主要用于局域网中计算机的互访。NetBIOS 的工作流程就是正常的机器名解析查询应答过程,因此推荐优先使用。
nbtscan是一个命令行工具,用于扫描本地或远程TCP/IP网络上的开放NetBIOS名称服务器。nbtscan 有Windows和Linux两个版本,体积很小,不需要安装特殊的库或DLL就能使用。NetBIOS的使用方法比较简单。将其上传到目标主机中,然后直接输人IP地址范围并运行。
除了利用NetBIOS探测内网,还可以利用ICMP协议探测内网。
依次对内网中的每个IP地址执行ping 命令,可以快速找出内网中所有存活的主机。在渗透测试中,可以使用如下命令循环探测整个C段,如图2-39所示。
3.1、arp-scan工具
可以直接把arp.exe上传到目标机器中运行,可以自定义掩码、指定扫描范围等等
使用kali内置的arp-scan工具扫描
3.2、Empire中的arpscan模块
Empire内置了arpscan模块。该模块用于在局域网内发送ARP数据包、收集活跃主机的IP地址和MAC地址信息。
在Empire中输人命令“usemodule situational_ awareness/network/arpscan", 即可使用其内置的arpscan模块。
3.3、Nishang 中的Invoke- ARPScan.ps1 脚本
使用Nishang中的Invoke-ARPScan.psl脚本,可以将脚本上传到目标主机中运行,也可以直
接远程加载脚本、自定义掩码和扫描范围,命令如下。
ScanLine是一款经典的端口扫描工具,可以在所有版本的Windows操作系统中使用,体积小,仅使用单个文件,同时支持TCP/UDP端口扫描,命令如下。
通过查询目标主机的端口开放信息,不仅可以了解目标主机所开放的服务,还可以找出其开放服务的漏洞、分析目标网络的拓扑结构等,具体需要关注以下三点。
- 端口的Banner信息。
- 端口上运行的服务。
- 常见应用的默认端口。
在进行内网渗测试时,通常会使用metasploit 内置的端口进行扫描。也可以上传端口扫描工具,使用工具进行扫描。还可以根据服务器的环境,使用自定义的端口扫描脚本进行扫描。在获得授权的情况下,可以直接使用Nmap、masscan 等端口扫描工具获取开放的端口信息。
Telnet协议是TCP/IP协议族的一- 员,是Internet 远程登录服务的标准协议和主要方式。它为用户提供了在本地计算机上完成远程主机工作的能力。在目标计算机上使用Telnet 协议,可以与目标服务器建立连接。如果只是想快速探测某台主机的某个常规高危端口是否开放,使用telnet命令是最方便的。telnet 命令的一个简单的使用示例。
metasploit不仅提供了多种端口扫描技术,还提供了与其他扫描工具的接口。在msfconsole下运行“search portscan” 命令,即可进行搜索。
PowerSploit的Invoke-Portscan.psl 脚本,推荐使用无文件的形式进行扫描,命令如下。
Invoke-PortScan是Nishang的端口扫描模块,用于发现主机、解析主机名、扫描端口,是-一个很实用的模块。输人“Get-Help Invoke-PortScan -ull"命令,即可查看帮助信息。
使用以下命令对本地局域网进行扫描,搜索存活主机并解析主机名。
如果通过扫描发现了端口,可以使用客户端连接工具或者nc,获取服务端的Banner信息。获取Banner信息后,可以在漏洞库中查找对应CVE编号的POC、EXP,在ExploitDB、Seebug 等平台上查看相关的漏洞利用工具,然后到目标系统中验证漏洞是否存在,从而有针对性地进行安全加固。
确定了当前内网拥有的域,且所控制的主机在域内,就可以进行域内相关信息的收集了。查询命令在本质上都是通过LDAP协议到域控制器上进行查询的,所以在查询时需要进行权限认证。只有域用户才拥有此权限,本地用户无法运行一些查询命令( System权限用户除外。在域中,除普通用户外,所有的机器都有一个机器用户,其用户名为机器名加上“$”。System权限用户对应的就是域里面的机器用户。
执行如下命令,就可以通过查询得到的主机名对主机角色进行初步判断。例如,“dev” 可能是开发服务器,“web"“app" 可能是Web服务器,“NAS"可能是存储服务器,“fileserver” 可能是文件服务器等。
可以看到,该域内有13个组。系统自带的常见用户身份如下:
- Domain Admins:域管理员
- Domain Computers:域内机器
- Domain Controllers:域控制器
- Domain Guest:域访客,权限较低
- Domain Users:域用户
- Enterprise Admins:企业系统管理员用户
在默认情况下,Domain Admins和Enterprise Admins对域内所有域控制器有完全控制权限。
执行如下命令,获取域密码策略、密码长度、错误锁定等信息。
执行如下命令,可以看到,域控制器的机器名为“DC”
执行如下命令,可以看到,域控制器的主机名为“dc" 。
通常情况下,时间服务器为主域控服务器。
在实际网络中,一个域内一般存在两台或两台以上的域控制器,其目的是: 一旦主域控制器发生故障,备用的域控制器可以保证域内的服务和验证工作正常进行。
执行如下命令,可以看到,域控制器的机器名为“DC",。
1.1、向域控制器进行查询
执行如下命令,向域控制器DC进行查询。域内有四个用户。其中,krbtgt用户不仅可以创建票据授权服务( TGS)的加密密钥,还可以实现多种域内权限持久化方法。
1.2、获取域内用户的详细信息
常见的参数包括用户名、描述信息、SID、域名、状态等
1.3、查看存在的用户
常用的dsquery命令
1.4、查询本地管理员组用户
Domain Admins组中的用户默认为域内机器的本地管理员用户。在实际应用中,为了方便管理,会有域用户被设置为域机器的本地管理员用户。
2.1、查询域管理员用户
2.2、查询管理员用户组
在内网中,通常会部署大量的网络安全系统和设备,例如IDS、IPS、日志审计、安全网关、反病毒软件等。在域网络攻击测试中,获取域内的一一个支点后,需要获取域管理员权限。
在一个域中,当计算机加人域后,会默认给域管理员组赋予本地系统管理员权限。也就是说,当计算机被添加到域中,成为域的成员主机后,系统会自动将域管理员组添加到本地系统管理员组中。因此,域管理员组的成员均可访问本地计算机,且具备完全控制权限。
定位域内管理员的常规渠道,一是日志,二是会话。日志是指本地机器的管理员日志,可以使用脚本或Wevtutil 工具导出并查看。会话是指域内每台机器的登录会话,可以使用netsess.exe或PowerView等工具查询(可以匿名查询,不需要权限)。
假设已经在Windows域中取得了普通用户权限,希望在域内横向移动,需要知道域内用户登录的位置、他是否是任何系统的本地管理员、他所属的组、他是否有权访问文件共享等。枚举主机、用户和组,有助于更好地了解域的布局。
常用的域管理员定位工具有psloggedon.exe、PVEFindADUser.exe、netsess.exe,以及hunter、
NetView等。在PowerShell中,常用的工具是PowerView。
在渗透测试中,一个典型的域权限提升过程,通常围绕着收集明文凭据或者通过mimikatz提权等方法,在获取了管理员权限的系统中寻找域管理员登录进程,进而收集域管理员的凭据。如果内网环境非常复杂,渗透测试人员无法立即在拥有权限的系统中获得域管理员进程,那么通常可以采用的方法是:在跳板机之间跳转,直至获得域管理员权限,同时进行一-些分析工作,进而找到渗透测试的路径。
获取域管理员列表
列出本机的所有进程及进程用户
寻找进程所有者为域管理员的进程:通过以上操作可以看出,当前存在域管理员进程。使用以上方法,如果能顺便找到域管理员进程是最好的,但实际情况往往并非如此。
查询域控制器的域用户会话,其原理是:在域控制器中查询域用户会话列表,并将其与域管理员列表进行交叉引用,从而得到域管理会话的系统列表。
查询域控制器列表
可以使用LDAP查询从Domain Controllers单元中收集的域控制器列表。也可以使用net命令查询域控制器列表。
收集域管理员列表
可以使用LDAP进行查询。也可以使用net命令,从域管理员组中收集域管理员列表。
收集所有活动域的会话列表
使用netsess.exe查询每个域控制器,收集所有活动域会话列表。它包含本地Windows函数netsessionenum。netsessionenum 函数用于返回活动会话的IP地址、域账户、会话开始时间和空闲时间。
交叉引用域管理员列表与活动会话列表
对域管理员列表和活动会话列表进行交叉引用,可以确定哪些IP地址有活动域令牌。也可以通过下列脚本快速使用netsess.exe的Windows命令行。
将域控制器列表添加到dcs.txt中,将域管理员列表添加到admins.txt 中,并与netsessexe 放在同一目录下。
运行以下脚本,会在当前目录下生成-一个文本文件sessions.txt。
网上也有类似的脚本。例如,Get Domain Admins ( GDA )批处理脚本,可以自动完成整个过程。
如果目标机器在域系统中是通过共享的本地管理员账户运行的,就可以使用下列脚本来查询系统中的域管理任务。
首先,从Domain Admins组中收集域管理员列表。
然后,运行如下脚本,将目标域系统列表添加到ips.txt文件中,将收集的域管理员列表添加到names.txt文件中。
某些版本的Windows操作系统允许用户通过NetBIOS查询已登录用户。下面这个Windows命令行脚本就用于扫描远程系统活跃域中的管理会话。
收集域管理员列表,运行如下脚本,将目标域系统列表添加到ips.txt文件中,将收集的域管理员列表添加到admins.txt文件中,并置于同一目录下。
在本实验中也可以使用nbtscan工具。收集域管理员列表,运行如下脚本,将目标域系统列表添加到ips.txt文件中,将收集的域管理员列表添加到admins.txt文件中,和nbtscan工具置于同一目录下。
PowerShell是微软推出的一款用于满足管理员对操作系统及应用程序易用性和扩展性需求的脚本环境,可以说是cmd.exe的加强版。PowerShell 作为微软官方推出的脚本语言,在Windows操作系统中的强大功能众所周知:系统管理员可以利用它提高Windows管理工作的自动化程度;渗透测试人员可以利用它更好地进行系统安全测试。
如果要在Windows操作系统中执行一个PowerShell脚本,需要通过“开始”菜单打开“Run’对话框,然后输入“powershell" 开启。或直接在命令行窗口输入powershell,开启powershell环境。
如果想执行一个PowerShell脚本,就要修改PowerShell的执行权限。PowerShell 的常用执行权限共有四种,具体如下。
- Restricted:默认设置,不允许执行任何脚本
- Allsigned:只能运行经过证书验证的脚本
- Unrestricted:权限最高,可以执行任意脚本
- RemoteSigned:对本地脚本不进行限制;对来自网络的脚本必须验证其签名
输人,查看执行权限,此时执行权限为默认的Restricted权限
输入将执行权限改为Unrestricted, 然后输入“Y",
PowerView是一款依赖PowerShell和WMI对内网进行查询的常用渗透测试脚本,它集成PowerSploit工具包中。
打开一个PowerShell窗口,进入PowerSploit目录,然后打开Recon目录,输入命令“import-Module .PowerView.ps1”,导人脚本。
PowerView的常用命令如下:
- Get-NetDomain: 获取当前用户所在域的名称。
- Get-NetUser: 获取所有用户的详细信息。
- Get-NetDomainController: 获取所有域控制器的信息。
- Get-NetComputer:获取域内所有机器的详细信息。
- Get-NetOU: 获取域中的0U信息。
- 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:根据用户日志查询某域用户登录过哪些域机器。