在渗透测试的流程中,当我们通过 Web 漏洞、钓鱼等方式拿下目标边界服务器的权限后,真正的内网渗透才刚刚开始。而信息收集作为渗透的核心,在内网阶段更是重中之重 ------ 有效的信息收集能帮我们快速摸清内网拓扑、定位高价值目标,大幅缩短渗透周期。今天我们就来完整梳理内网信息收集的全流程,从基础概念到工具使用,带你吃透这内网渗透的第一步。
一、内网渗透的前置认知
在开始学习内网信息收集之前,我们需要先搞清楚内网环境的基础概念,这是我们后续所有操作的前提。
1.1 什么是内网与内网渗透?
很多刚接触渗透的朋友会疑惑,外网和内网到底有什么区别?简单来说:
-
外网:也就是我们常说的互联网,是全球计算机都能互相访问的公共网络。
-
内网:也叫局域网,是企业、家庭内部搭建的私有网络,这些网络里的设备通常不会直接暴露在公网,只能内部互相访问。
而内网渗透,就是我们在拿下边界服务器的权限后,以这台服务器为跳板,对内网进行进一步的探测、渗透,最终拿下内网中其他高价值主机(比如域控制器、运维服务器)的过程。

图:内网渗透的典型流程,从边界突破到逐步渗透整个内网
整个内网渗透的流程,通常会遵循「信息收集→代理搭建→权限提升→横向移动→拿下域控」的路径,而我们今天要讲的信息收集,就是这整个流程的起点。
1.2 内网的管理模式:从工作组到域
内网里的计算机管理,通常有两种模式,这也是我们必须要搞懂的基础概念:
工作组(Work Group)
工作组是最基础的资源管理模式,它把不同的电脑按功能分组,方便资源共享。这种模式非常简单,适合小型网络,比如小网吧、十几个人的小公司,每台电脑的账号密码都是独立的,自己管自己。
域(Domain)
当企业的网络规模越来越大,几百上千台主机的时候,工作组的管理模式就会变得非常混乱,这时候就会用到域环境。
域是一种集中式的管理模式,企业可以把所有的电脑、用户都加入到域中,由一台统一的 \\ 域控制器(Domain Controller,简称 DC)\\ 来统一管理所有的账号、权限、策略。

图:AD 域环境的基础架构,所有用户和主机都由域控制器统一管理
域环境里有几个核心的概念:
-
单域:整个内网只有一个域,是最常见的小型企业域环境。
-
父域与子域 :大型企业会在主域下划分出子域,比如总公司的域是
company\.com,分公司的子域可以是branch\.company\.com。 -
域树:多个有信任关系的域组成的集合,共享同一个连续的命名空间。
-
域林:多个独立的域树组成的集合,它们之间建立了信任关系,可以跨域访问资源。
-
域控制器(DC):域的核心服务器,存储了整个域的账号、密码、权限信息,负责验证所有域用户的登录,相当于整个域的 "门卫"。
一个典型的域渗透场景: 某个域用户需要安装 Visio 软件,联系了域管理员。管理员用自己的域管理员账号登录了这台普通员工的主机,帮他安装了软件。这时候,这台主机的本地管理员就可以用
mimikatz工具,从系统内存里抓取到域管理员的登录密码,直接用这个密码就能控制整个域的所有主机!
这就是域渗透的核心逻辑:域管理员的账号可以登录域内的任意主机,只要我们能在任意一台域成员主机上拿到域管理员的凭证,就能直接拿下整个域的控制权。
二、基础内网信息收集:摸清当前主机的情况
当我们刚拿下一台主机的权限时,我们对这台主机一无所知:它是什么系统?当前用户有什么权限?它在哪个网段?开了哪些端口?这时候我们就需要用基础的信息收集命令,先把这台主机的情况摸清楚。
这些命令是通用的,不管是不是域环境,都可以用来收集基础信息:
2.1 查看当前用户与权限
whoami /all
这个命令会帮我们查看当前登录的用户,以及这个用户所属的用户组、拥有的特权信息。通过这个命令,我们可以快速判断当前用户的权限,判断是否需要进行提权操作。
2.2 查看网络配置信息
ipconfig /all
这个命令会输出主机的 IP 地址、子网掩码、网关、DNS 服务器、主机名等信息。通过这个命令,我们可以知道当前主机所在的内网网段,为后续的网段扫描划定范围。
2.3 查看路由信息
route print
路由表会告诉我们这台主机可以直接访问哪些网络段,很多时候内网里会有多个不同的网段,通过路由表我们就能知道哪些网段是我们可以去探测的,不会做无用功。
2.4 查看操作系统信息
systeminfo
这个命令会输出非常详细的系统信息:主机名、操作系统版本、系统目录、当前主机是属于工作组还是域、安装的系统补丁、网卡信息等等。这些信息可以帮我们判断系统有没有可以利用的漏洞,比如有没有没打补丁的提权漏洞。
2.5 查看端口与连接信息
netstat -ano
这个命令会列出主机所有的端口监听情况,以及当前主机和其他主机的网络连接。通过这个命令,我们可以发现主机开了哪些服务,有没有和其他内网主机的连接,甚至能发现一些没被防火墙挡住的端口。
2.6 查看会话与进程
# 查看当前主机的客户端会话
net session
# 查看当前运行的进程
tasklist
通过会话列表,我们可以知道有没有其他用户登录过这台主机;通过进程列表,我们可以判断主机上运行了什么软件,有没有杀毒软件、有没有数据库之类的应用。
2.7 查看计划任务与自启动
# 查看所有计划任务
schtasks /query /v /fo list
# 查看自启动程序
wmic startup get caption,command,location,user
这两个命令可以帮我们发现主机上的持久化机制,也能帮我们找到一些管理员的自动脚本,有时候这些脚本里会硬编码密码。
2.8 查看杀毒软件信息
很多时候我们需要知道目标主机上装了什么杀毒软件,才能避开它的检测,我们可以用 WMIC 命令来查询:
# 获取杀软名称
WMIC /Node:localhost /Namespace:\\root\SecurityCenter2 Path AntiVirusProduct Get displayName /Format:List
# 获取杀软名称和安装路径
WMIC /namespace:\\root\SecurityCenter2 path antivirusproduct GET displayName,productState,pathToSignedProductExe
三、域内专属信息收集:摸清域环境的全貌
如果我们发现当前主机是加入了域的,那我们就可以进行域内的专属信息收集,来摸清整个域的情况:有哪些用户?有哪些管理员?域控制器在哪?
3.1 先判断:当前是不是域环境?
首先我们要先确认,当前主机是不是在域环境里,有几个简单的命令可以判断:
# 查看当前主机的域信息
net config workstation
# 查询域的时间,如果能返回,说明存在域环境
net time /domain
如果这些命令能正常返回域的信息,那就说明我们当前处于域环境中,可以进行后续的域内信息收集了。
3.2 收集域用户信息
# 列出整个域的所有用户
net user /domain
# 查看某个指定域用户的详细信息
net user <用户名> /domain
通过这个命令,我们就能拿到域里所有的用户账号,这些账号可以用来做后续的密码爆破、横向移动。
注意:只有域用户才有执行这些域查询的权限,本地用户默认是查不到域的信息的。
3.3 收集域用户组信息
域里的用户组能帮我们快速定位高价值的用户,比如管理员账号:
# 列出域内所有的用户组
net group /domain
# 查看Domain Users组,也就是所有的域用户
net group "domain users" /domain
# 查看Domain Admins组,也就是所有的域管理员!
net group "domain admins" /domain
# 查看Enterprise Admins组,企业管理员,权限比域管理员更高
net group "Enterprise Admins" /domain
默认情况下,Domain Admins 组的用户,对域内所有的主机都有完全控制的权限,只要我们拿到这些用户的凭证,就能控制整个域。
3.4 查看域密码策略
net accounts /domain
这个命令会返回域的密码策略,比如密码最小长度、密码最长使用期限、锁定策略等等。我们可以根据这个策略来构造密码字典,提高密码爆破的成功率。
3.5 定位域控制器
域控制器是我们的核心目标,我们需要找到它的位置:
# 列出所有的域控制器主机名
net group "domain controllers" /domain
# 通过时间服务器找到主域控制器
net time /domain
拿到域控制器的主机名之后,我们可以用 ping 命令来解析它的 IP 地址:
ping 主域控制器的主机名
# 如果返回的是IPv6地址,加-4参数指定IPv4
ping 主域控制器的主机名 -4
另外还有个小技巧:域控制器通常同时会充当域内的 DNS 服务器,所以我们之前用ipconfig /all查到的 DNS 服务器地址,大概率就是域控制器的 IP!
3.6 查看域信任关系
如果是多域的环境,我们还需要查看域之间的信任关系,这样才能知道我们能不能跨域渗透:
nltest /domain_trusts
这个命令会列出当前域和其他域的信任关系,帮我们理清整个域林的结构。
四、凭据收集:用 CS 快速抓取用户密码
内网横向移动的核心,就是用户的登录凭证 ------ 密码或者哈希值。只要我们拿到了用户的凭证,就能用这些凭证登录其他的主机。
4.1 什么是 Hash 值?
Windows 系统里,用户的密码不会明文存储,而是会存储密码的 Hash 值。当我们登录的时候,系统会把你输入的密码算成 Hash,和存储的 Hash 对比。
而我们常用的mimikatz工具,就是从系统的lsass\.exe进程的内存里,把用户登录过的密码明文或者 Hash 值给抓取出来。这些 Hash 值可以直接用来做 Pass-the-Hash(哈希传递)攻击,不用破解成明文就能直接登录其他主机。
4.2 用 Cobalt Strike 快速收集凭据
在实际的渗透中,我们通常会用 Cobalt Strike(简称 CS)这个工具来简化整个操作,它集成了很多信息收集、凭据收集的功能,不用我们手动敲很多命令。

图:Cobalt Strike 工具的操作界面
整个流程非常简单:
-
主机上线:我们先把 CS 生成的木马传到目标主机,运行之后,这台主机就会上线到我们的 CS 控制台。
-
内网探测:我们可以用 CS 自带的网络探针,扫描内网里的存活主机,还有端口扫描,快速摸清内网的存活资产。
-
抓取用户凭据:我们可以直接用 CS 集成的 mimikatz,一键抓取内存里的用户密码和 Hash。
注意:如果运行的时候报错,大概率是权限不够,我们需要先做提权,拿到 System 权限之后,再运行 mimikatz,就能成功抓取到所有的凭据了。
-
横向移动 :拿到用户的凭据之后,我们就可以用 CS 的横向移动功能,比如
psexec,用拿到的账号密码,直接登录其他的内网主机,把我们的木马传上去,扩大我们的战果。
除了自带的功能,CS 还有很多强大的插件,比如 LSTAR、ladon 这些,都能帮我们更快速的收集内网的信息和凭据。
五、梳理内网拓扑:用 BloodHound 理清域内关系
当我们面对一个复杂的域环境的时候,手动的信息收集很难理清所有的用户、主机、组之间的关系,这时候我们就需要用到 \\BloodHound(猎犬)\\ 这个工具。
BloodHound 是一个域内信息梳理工具,它能自动收集域内的所有用户、组、计算机、会话信息,然后用图的方式给我们展示出来,帮我们快速找到渗透的路径,比如哪台主机上有域管理员的登录会话,哪个用户能访问哪台主机等等。

图:BloodHound 的操作界面,用图的方式展示域内所有的关系
它的使用步骤也很简单:
-
上传收集器 :把 BloodHound 的收集器
SharpHound\.exe传到目标主机。 -
收集信息:在目标主机上运行命令,收集所有的域内信息:
SharpHound.exe -c all运行完之后,会生成一个压缩包,里面就是收集到的所有信息。
-
启动本地服务:在我们自己的电脑上,启动 Neo4j 数据库服务,然后启动 BloodHound 客户端。
-
导入数据:把刚才收集到的压缩包导入到 BloodHound 里,它就会自动生成域内的关系图。
通过 BloodHound 的分析功能,我们可以一键找到:
-
哪台主机上有域管理员的登录会话
-
哪些用户可以被约束委派攻击
-
最短的提权 / 渗透路径 ...
这些信息能帮我们在复杂的域环境里,快速找到最有效的渗透路线,不用再像无头苍蝇一样乱撞。
六、总结
内网信息收集是内网渗透的基础,只有把信息收集做足了,我们才能后续的渗透中少走弯路。今天我们梳理的核心知识点:
-
域的核心概念:域是集中式的内网管理模式,域控制器是域的核心,域管理员的凭证可以控制整个域。
-
信息收集的常用命令:从基础的主机信息,到域内的用户、组、域控信息,这些命令是我们手动收集信息的核心。
-
自动化工具的使用:CS 帮我们快速收集凭据、横向移动,BloodHound 帮我们梳理复杂的域内关系,这些工具能大幅提高我们的渗透效率。
内网渗透是一个循序渐进的过程,而信息收集就是这个过程的第一步,把这一步做好,后续的渗透就会事半功倍。