0x00 参考

《内网安全攻防》笔记。

0x01 定位域管理员

定位域管理员是内网渗透测试关键的一环。与外网渗透测试获取某台服务器权限的目标不同的是,内网渗透测试的目标一般是获取特定机器的权限或者特定用户,进而获得特定的资源,对内网的安全性进行评估。

基本概述

一般的,内网中会部署一些网络安全系统和设备,如IDS、IPS、日志审计、安全网关、反病毒软件等等。在域网络渗透测试中,获取域内一个支点之后,需要获取域管理员权限。

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

定位域内管理员的常规方法有两个:

  • 日志:指本地机器的管理员日志,可以使用脚本或Wevtutil工具导出并查看;
  • 会话:指域内每台机器的登录会话,可以使用netsess.exe或PowerView等工具来查询(可匿名查询,无需权限);

常用域管理员定位工具

这里假设已经在Windows域中取得了普通用户权限,要想在域内横向移动, 需要知道域内用户登录的位置、是否是任何系统的本地管理员、所属的组、是否有权访问文件共享等。

常用的域管理员定位工具包括psloggedon.exe、PVEFindADUser.exe、netsess.exe、hunter、NetView、PowerView等。

psloggedon.exe

在Windows中,可以使用net session命令来查看哪些用户使用了本机资源,但是没有命令可以用来查看哪个用户在使用远程计算机资源、哪个用户登录了本地或远程计算机。

如果没有用户登录使用的话,默认就是空的:

当有用户使用到本地资源是可以看到的,但是看不到哪个用户在使用远程计算机资源:

使用本小节的工具就可以查看本地登录的用户和通过本地计算机或远程计算机的资源登录的用户。如果指定的是用户名而不是计算机名,则会搜索网上邻居中的计算机并显示该用户当前是否已经登录。原理是通过检查注册表HKEY_USERS项的key值来查询哪些用户登录过(需要调用NetSessionEnum API),但某些功能需要管理员权限才能使用。

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

使用命令:

1
psloggedon [- ] [-l] [-x] [\\computername | username]
  • -:显示支持的选项和用于输出值的单位;
  • -l:仅显示本地登录,不显示本地和网络资源登录;
  • -x:不显示登录时间;
  • \\computename:指定要列出登录信息的计算机名称;
  • username:指定用户名,在网络中搜索该用户登录的计算机;

PVEFindADUser.exe

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

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

使用命令:

1
PVEFindADUser.exe <parameters>

参数说明参考GitHub即可。

示例中,-current参数会获取域中所有计算机上当前登录的所有用户,并将结果保存到report.csv文件中:

netview.exe

该工具是一个枚举工具,使用WinAPI枚举系统,利用NetSessionEnum来查询登录会话,利用NetShare来查询共享,利用NetWkstaUserEnum来枚举登录的用户,还能查询共享入口和有价值的用户。其中的绝大部分功能不需要管理员权限就可以使用。

下载地址:https://github.com/mubix/netview

使用命令:

1
netview.exe <参数>

参数说明参考GitHub即可。

NetSess.exe

默认情况下执行net session可能会没权限,此时直接运行这个工具就可以了:

Nmap的NSE脚本

如果存在域账户或者本地账号,就可以使用Nmap的smb-enum-sessions.nse引擎来获取远程计算机中的登录会话(无需管理员权限)。

下载地址:https://nmap.org/nsedoc/scripts/smb-enum-sessions.html

本地搭建的环境扫描不出,不知道哪的问题,待解决:

PowerView脚本

PowerView是PowerShell脚本,提供辅助定位关键用户的功能。

下载地址:https://github.com/PowerShellEmpire/PowerTools/tree/master/PowerView

  • Invoke-StealthUserHunter:只需要进行一次查询,就可以获取域里所有用户。使用方法为从user.HomeDirectories中提取所有用户,并对每台服务器进行Get-NetSessions获取。因为无需使用Invoke-UserHunter对每台机器进行操作,所以该方法的隐蔽性相对较高,但涉及的机器不一定全面。PowerView默认使用Invoke-StealthUserHunter,如果找不到就使用Invoke-UserHunter。
  • Invoke-UserHunter:找到域内特定的用户群,接受用户名、用户列表和域组查询,接收一个主机列表或查询可用的主机域名。它可以使用Get-NetSessions和Get-NetLoggedon(调用NetSessionEnum和NetWkstaUserEnum API)扫描每台服务器并对扫描结果进行比较,从而找出目标用户集,在使用时无需管理员权限。

示例,PowerShell下绕过脚本加载直接运行命令:

1
powershell.exe -exec bypass -Command "& {Import-Module .\PowerView.ps1;Invoke-UserHunter}"

Empire的user_hunter模块

Empire的user_hunter模块用于查找域管理员登录的机器。

使用usemodule powershell/situational_awareness/network/powerview/user_hunter模块可以查询是哪个用户登录了哪台主机。

本地环境测试没查询到相关内容:

0x02 查找域管理进程

在内网渗透中,一般进行域权限提升都是通过收集明文凭据或通过mimikatz提权来实现,在获取了管理员权限的系统中寻找域管理员登录进程,进而收集域管理员的凭据。

但是如果内网环境比较复杂,无法快速地在拥有权限的系统中获得域管理员进程,那么通常可以采用这种方法:在跳板机之间跳转,直至获得域管理员权限,同时进行一些分析工作,进而找到渗透测试的路径。

假设存在如下场景:攻击者在某个内网环境中获得了一个域普通用户的权限,首先通过各种方法来获得当前服务器的本地管理员权限,然后分析当前服务器的用户登录列表和会话信息、知道哪些用户登录了这台服务器。如果攻击者通过分析发现,可以获取权限的登录用户都不是域管理员用户,同时没有域管理员组中的用户登录这台服务器,就可以使用另一个账户并寻找该账户在内网的哪台机器上具有管理权限,在枚举这台机器上的登录用户,然后继续进行内网渗透,直至找到一个可以获取域管理员权限的有效路径为止。在一个包含成千上万台计算机和众多用户的内网环境中,完成这个过程需要花费相当长的时间。

本机查询

查询域管理员列表

1
net group "Domain Admins" /domain

查询本机的所有进程和进程用户

1
tasklist /v

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

由前面的操作看到,并没有找到域管理员Administrator的进程,而是看到了testuser的进程。有时候运气好这种方法确实可以找得到,但是很多时候实际情况并非如此。

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

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

查询域控制器列表

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

1
net group "Domain Controllers" /domain

收集域管理员列表

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

1
net group "Domain Admins" /domain

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

使用NetSess.exe工具查询每个域控制器,收集所有活动域会话列表。NetSess.exe包含本地Windows函数netsessionenum,该函数用于返回活动会话的IP地址、域账户、会话开始时间和空闲时间。

交叉引用域管理员列表和活动会话列表

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

将域控制器列表添加到controllers.txt中,将域管理员列表添加到admins.txt中,并与NetSess.exe放在同一目录下。

运行脚本,会在当前目录下生成一个文本文件sessions.txt:

1
FOR /F %i in (controllers.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)批处理脚本,可以自动完成整个过程

GDA下载地址:https://github.com/nullbind/Other-Projects/tree/master/GDA

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

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

首先,从Domain Admins组中收集域管理员列表,跟前面的一样:

1
net group "Domain Admins" /domain

然后,运行如下脚本,将目标域系统列表添加到ips.txt中,将收集的域管理员列表添加到admins.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 (admins.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工具,下载地址:https://github.com/lifenjoiner/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

0x03 域管理员模拟方法

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

具体的后面的文章再细说。

0x04 利用PowerShell收集域信息

PowerShell在之前的文章已经介绍过,这里主要介绍PowerView。

PowerView是一款依赖于PowerShell和WMI对内网进行查询的渗透测试脚本,集成在PowerSploit工具包中,在前面第一节中已经介绍过。

下载地址:https://raw.githubusercontent.com/PowerShellMafia/PowerSploit/master/Recon/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-UserProcess:获取指定用户的日志;
  • Get-ADObject:获取活动目录的对象;
  • Get-NetGPO:获取域内所有的组策略对象;
  • Get-DomainPolicy:获取域默认策略或域控制器策略;
  • Invoke-UserHunter:获取域用户登录的计算机信息和该用户是否有本地管理员权限;
  • Invoke-ProcessHunter:通过查询域内所有的机器进程找到特定用户;
  • Invoke-UserEventHunter:根据用户日志查询某域用户登录过哪些域机器;

使用的时候只需要先进入PowerSploit的Recon目录中,然后输入命令Import-Module .\PowerView.ps1导入脚本即可。

示例:

0x05 域分析工具BloodHound

BloodHound是一款免费的域分析工具,其使用可视化图来显示Active Directory环境中隐藏的和相关联的主机内容。攻击者可以使用BloodHound轻松识别高度复杂的攻击路径,否则很难快速识别。防御者可以使用BloodHound来识别和防御那些相同的攻击路径。蓝队和红队都可以使用BloodHound轻松深入了解Active Directory环境中的权限关系。

工具地址:https://github.com/BloodHoundAD/BloodHound

相关环境安装

BloodHound依赖于JDK和Neo4j环境。

JDK不多说。

Neo4j是一个世界领先的开源图形数据库。 它是由Neo技术使用Java语言完全开发的。

官方下载地址:https://neo4j.com/download-center/#community

下载zip并解压后,进入bin目录中,输入neo4j.bat console命令来启动Neo4j服务,然后浏览器访问http://127.0.0.1:7474/browser,其中账号密码均为neo4j,然后就提示修改密码,这里本地修改为123456

依赖环境搭建好之后,就开始下载BloodHound了,GitHub上Release地址直接下载即可:https://github.com/BloodHoundAD/BloodHound/releases

下载完解压之后,运行BloodHound.exe即可运行进入登录界面,这里输入Neo4j服务的账号密码即可:

界面简介

登录进入BloodHound界面后,如下图:

界面左上角是菜单按钮和搜索栏,菜单中的三个选项卡分别为:

  • 数据块信息(Database Info):显示了所分析域的用户数量、计算机数量、组数量、会话数量、ACL数量、关系等信息,用户可以在此执行基本的数据库管理操作,包括注销和切换数据库,以及清除当前加载的数据库;
  • 节点信息(Node Info):显示了用户在图表中单击的某个节点的信息;
  • 查询(Queries):显示了BloodHound预置的查询请求和用户自己构建的查询请求;

界面右上角是设置区,分别为:

  • 刷新功能:重新计算并绘制当前显示的图形;
  • 导出图形功能:可将当前绘制的图形导出为JSON或PNG文件;
  • 导入图形功能:可导入JSON文件;
  • 上传数据功能:对上传的文件进行自动检测,然后获取CSV格式的数据;
  • 更改布局类型功能:用于在分层和强制定向图布局之间切换;
  • 设置功能:可以更改节点的折叠行为,以及在不同的细节模式之间切换;
  • 关于:显示BloodHound相关的信息;

采集数据

在使用BloodHound分析时,需要调用来自AD的三条信息:

  • 哪些用户登录了哪些机器;
  • 哪些用户拥有管理员权限;
  • 哪些用户和组属于哪些组;

在大多数情况下,收集这三条信息不需要系统管理员权限。BloodHound是依赖于PowerView.ps1脚本的BloodHound来收集的。

BloodHound分为两部分:

  • PowerShell采集器脚本(有两个版本,旧版本叫BloodHound_Old.ps1,新版本叫SharpHound.ps1);
  • 可执行文件SharpHound.exe;

目前最新版相关BloodHound采集器SharpHound地址:https://github.com/BloodHoundAD/BloodHound/tree/master/Collectors

下载后,将SharpHound.exe复制到目标系统中,运行如下命令来提取域内信息:

1
SharpHound.exe -c all

导入数据

前面的命令执行完之后,会在当前目录下生成一个zip文件,如上图。

BloodHound支持通过界面上传单个文件和ZIP文件。

将刚刚生成的文件上传后,即可查看内网的相关信息:

可以看到,数据库中有4个用户、3台计算机、51个组、408条ACL、453个关系。

查询信息

进入查询模块,可看到预定义了12个常用的查询条件:

  • Find all Domain Admins:查找所有域管理员;
  • Find Shortest Paths to Domain Admins:查找到达域管理员的最短路径;
  • Find Principals with DCSync Rights:查找具有DCSync权限的主体;
  • Users with Foreign Domain Group Membership:具有外部域组成员身份的用户;
  • Groups with Foreign Domain Group Membership:具有外部域组成员身份的组;
  • Map Domain Trusts:映射域信任;
  • Shortest Paths to Unconstrained Delegation Systems:无约束委托系统的最短路径;
  • Shortest Paths from Kerberoastable Users:Kerberoastable用户的最短路径;
  • Shortest Paths to Domain Admins from Kerberoastable Users:从Kerberoastable用户到域管理员的最短路径;
  • Shortest Path from Owned Principals:拥有主体的最短路径;
  • Shortest Paths to Domain Admins from Owned Principals:从所属主体到域管理员的最短路径;
  • Shortest Paths to High Value Targets:高价值目标的最短路径;

查找所有域管理员

BloodHound可以帮助使用者找出当前域中存在多少个域管理员。

点击”Find all Domain Admins”,如下:

可以看到,当前域中有1个具有域管理员权限的用户即Administrator。按”Ctrl”键将循环显示”默认阈值”、”始终显示”、”从不现实”三个选项,以显示不同的节点标签。也可以选中某个节点,在其图标上按住鼠标左键,将节点移动到其他位置。

本地域环境比较简单,看下书上的,显示的是有15个具有域管理员权限的用户:

查找到达域管理员的最短路径

点击”Find Shortest Paths to Domain Admins”,如下:

可以看到,由于本地域环境比较简单,所以只有一条最短路径。

为了更好掌握如何使用这个工具,下面看下书上的例子:

这里BloodHound列出来3条可以到达域管理员的路径。具体说明如下:

  • 最上边的节点即图标右下方有个类似于“瞄准目标”的图案为目标域管理员组。该组是本次内网渗透的核心目标,既是图中的一个节点也是所有路径的尽头。
  • 左边这条路径上的三个用户属于第一个节点组,而第一个节点组在第二个节点组内。第二个节点组对其上面的第三个节点的用户具有权限,且该用户是上一台计算机(第四个节点)的本地管理员,可以在这台计算机上拿到上一个(第五个节点)用户的会话。第五个节点的用户属于Domain Admins组,可以通过哈希传递的方法获取域管理员和域控制器权限。第三个节点分支中的用户,可以对处于第三个节点的用户强制推送策略,直接修改第三个节点中的用户的密码,然后通过哈希传递的方法获取第四个节点的权限,依次类推。
  • 中间这条路径,第一个节点中的三个用户为域管理员委派服务账号,可以对该域的域控制器进行DCSync同步,将第二个节点的用户(属于Domain Admins组)的散列值同步过来。
  • 右边这条路径,第一个节点的用户是第二个节点计算机的本地管理员(在该计算机中可以获取第三个节点的用户散列值),第三个节点用户属于第四个节点组,第四个节点组是第五个节点计算机的本地管理员组(在该计算机上可以获取第五个节点用户的散列值,该用户属于Domain Admins组)。

查看指定用户与域关联的详细信息

单击某个节点,BloodHound将使用该节点的相关信息来填充Node Info选项卡。

比如本地环境中点击用户节点testuser,即可在Node Info中查看到该用户与域相关的详细信息,以便于后续在域中进行横向渗透:

查看指定计算机与域的关系

点击任意计算机,可以看到该计算机在域内的名称、系统版本、是否启用、是否允许无约束委托等信息。

比如查看本地环境的Win7计算机与域相关的详细信息:

寻找路径

寻找路径的操作和导航软件的操作类似,单击路径图标,会弹出目标节点文本框,输入起始节点和目标节点,然后点击运行,如果存在此类路径,BloodHound会找到所有从开始节点到目标节点的路径,并在图形绘制区域将这些路径显示出来:

0x06 内网敏感数据的防护

内网中的核心敏感数据一般包括数据库、邮件、个人数据及组织的业务数据、技术数据等。

要有效地进行内网数据的安全防护,需要掌握攻击者的操作流程。

内网敏感数据的定位流程

内网敏感数据防护的第一步,就是要熟悉攻击者获取数据的流程。

在实际的内网环境中,攻击者主要通过各种恶意方法来定位公司内部人员的机器,从而获取内网敏感数据。其定位的大致流程如下:

  • 定位内部人事组织结构;
  • 在内部人事组织结构中寻找需要监视的人员;
  • 定位相关人员的机器;
  • 监视相关人员存放文档的位置;
  • 列出存放文档的服务器的目录;

重点核心业务机器及敏感信息防护

对于重点核心业务机器应当采取相应的安全防护措施来保障敏感数据的安全。

核心业务机器

  • 高级管理人员、系统管理员、财务/人事/业务人员的个人计算机;
  • 产品管理系统服务器;
  • 办公系统服务器;
  • 财务应用系统服务器;
  • 核心产品源码服务器(自建的SVN或GIT服务器);
  • 数据库服务器;
  • 文件服务器、共享服务器;
  • 电子邮件服务器;
  • 网络监控系统服务器;
  • 其他服务器(分公司等);

敏感信息和敏感文件

  • 站点源码备份文件、数据库备份文件等;
  • 各类数据库的Web管理入口,比如phpmyadmin、Adminer等;
  • 浏览器密码和浏览器Cookie;
  • 其他用户会话、3389和ipc$连接记录、回收站中的信息等;
  • Windows无线密码;
  • 网络内部的各种账号密码,包括电子邮箱、VPN、FTP、TeamView等;

应用和文件形式信息的防护

在内网中,攻击者一般会进行基于应用和文件的信息收集,包括一些应用的配置文件、敏感文件、密码、远程连接、员工账号、电子邮箱等。从总体来看,攻击者一是要了解已攻陷的机器所属人员的职位,二是要在机器中使用一些搜索命令来寻找自己需要的资料。

针对攻击者的此类行为,建议用户在内网中工作时,不要将特别重要的资料存储在公开的计算机中,在必要时需要对Office文件进行加密且密码不能为弱密码。

0x07 分析域内网段划分情况及拓扑结构

在掌握了内网的相关信息之后,攻击者可以分析目标网络的结构和安全防御策略,获取网段信息、各部门的IP地址段,并尝试绘制内网的拓扑结构图。

基本架构

攻击者需要对目标网站的基本情况进行简单的判断,分析目标服务器所使用的的Web服务器、后端语言、数据库、系统平台等。

下面是一些常见的Web架构:

  • ASP + Access + IIS 5.0/6.0 + Windows Server 2003
  • ASPX + MySQL + IIS 7.0/7.5 + Windows Server 2008
  • PHP + MySQL + IIS
  • PHP + MySQL + Apache
  • PHP + MySQL + Nginx
  • JSP + MySQL + Nginx
  • JSP + MSSQL + Tomcat
  • JSP + Oracle + Tomcat

域内的网段划分

掌握整个内网的网络分布和构成情况有助于攻击者了解内网的核心业务。

在判断内网环境时,先要分析内网IP地址的分布情况。一般可以通过内网中的路由器、交换机等设备以及SNMP、弱口令等,来获取内网网络拓扑或者DNS域传送的信息。而大型公司一般都有内部网站,也可以通过内部网站的公开链接来分析IP地址分布情况。

内网的网段一般是划分为DMZ、办公区和和核心区(生产区)。

DMZ

一般的外网渗透测试中,攻击者拿到的Web权限都是在DMZ中的。DMZ区域严格来说并不属于内网。如果访问控制处理配置合理,DMZ就会处在从内网能够访问DMZ但从DMZ无法访问内网的状态。

办公区

即企业员工的工作区。办公区的安全防护水平通常不搞,基本的防护机制大多为杀软或主机入侵检测产品。

在实际的网络环境中,攻击者在获取办公区的权限后,会利用内网信任关系来扩大供给面。不过在一般情况下,攻击者很少能直接到达办公区,通常可能会使用鱼叉攻击、水坑攻击或社工等手段来进入办公区。

办公区按照系统可分为OA系统、邮件系统、财务系统、文件共享系统、企业版杀毒系统、内部应用监控系统、运维管理系统等,按照网段可分为域管理网段、内部服务器系统网段、各部门分区网段等。

核心区

核心区内一般存放着企业最重要的数据、文档等信息资产,比如域控制器、核心生产机器等,安全设置也最为严格。根据业务的不同,相关服务器可能存在于不同的网段中。

在实际的网络环境中,攻击者通过分析服务器上运行的服务和进程就可以推断出目标主机使用的运维监控管理系统和安全防护系统。

核心区按照系统可分为业务系统、运维监控系统、安全系统等,按照网段可分为业务网段、运维监控网段、安全管理网段等。

多层域结构

在大型企业中,其内网大都采用多层域结构甚至多级域结构,因此在进行内网渗透测需要先判断当前内网中是否存在多层域、当前计算机所在的域是几级子域、该子域的域控制器及根域的域控制器是哪些、其他域的域控制器是哪些、不同的域之间是否存在域信任关系等。

绘制内网拓扑图

通过目标主机机器所在域的各类信息可以绘制内网拓扑图了,以便于后续的内网渗透、利于快速定位内网目标。

比如网上找的一个内网拓扑图: