☰
Cobalt Strike实战:内网信息收集全流程与命令详解
2026/10/19 16:38:24 网站建设 项目流程

很多年以前我第一次参与内网渗透项目时,拿到边界Web服务器权限后兴奋得不行,结果在核心内网转了一圈什么都没发现。后来复盘才明白,问题出在信息收集上:我连域控是哪个、内网网段怎么划分都没摸清,就开始横向尝试。今天这篇笔记,就把我在实战中用Cobalt Strike做内网信息收集的整个思路和操作记录整理出来。Cobalt Strike是目前红队和渗透测试圈子里使用率很高的C2框架,借助Beacon会话可以快速执行命令、上传下载文件、加载各类插件,在内网侦察阶段能省掉大量体力活。这篇文章适合正在学内网渗透的测试人员、以及想系统化信息收集流程的白帽朋友阅读,我会尽量把命令、输出、排查细节都写清楚。开头必须强调一次:所有操作都要在已获得书面授权的范围内进行,未授权测试是违法的。

1. 内网信息收集的整体思路

1.1 信息收集为什么是内网渗透的胜负手

内网渗透跟外网打点有一个很大的区别:外网的目的是找到一个入口,而内网的目的是在庞大的网络里找到高价值目标并拿下它。很多边界突破后的人容易陷入一种误区,觉得“我已经进来了,赶紧找台机器提权横向”。但实际上,如果没有完整的信息收集,横向操作就像蒙着眼睛在迷宫里跑,可能浪费大量时间,还会频繁触发告警。

我把信息收集理解为一次“侦察测绘”——摸清网段、主机、域控、账号、服务、共享,这些东西决定了后续攻击路径的设计。比如你判断出当前机器是域内机器,并且域控IP暴露在可达网段,那下一步就可以往域方向走;如果你发现本机缓存了某些高权限账号的hash,就可以先尝试横向登录再考虑提权。这些判断全部依赖信息收集的结果,所以我才认为它是胜负手。

1.2 Cobalt Strike在信息收集阶段的定位

Cobalt Strike的核心组件是Beacon,它是一个通过睡眠时间与团队服务器通信的代理。渗透测试人员在拿到一台机器权限后,部署Beacon并回连到团队服务器,随后就能通过命令行对这台机器进行操作。在内网信息收集阶段,Cobalt Strike主要帮我们做三件事:第一,批量执行系统命令,快速获取主机配置、网络、账户信息;第二,提供丰富的内置功能,比如截屏、键盘记录、内存加载、hash抓取;第三,通过团队服务器的日志统一收集所有Beacon的返回结果,便于分析和溯源。

相比传统的单点工具,Cobalt Strike的会话管理和聚合能力非常强,适合在复杂内网里做地毯式侦察。需要说明的是,Cobalt Strike这类C2框架如果被滥用,危害也很大。所以实际操作中必须严格控制使用范围,只对授权目标使用,操作痕迹要记录清楚。

1.3 信息收集的完整维度和交付物

我在实际项目里会把信息收集拆成四个维度:主机维度、网络维度、身份维度、数据维度。主机维度包括操作系统、补丁级别、运行进程、杀软类型;网络维度包括IP、网段、路由、DNS、开放端口;身份维度包括本地用户、域用户、组成员、特权账号;数据维度包括共享文件夹、配置文件、脚本、数据库备份和明文密码。

每一轮信息收集都要有一个交付物,否则零散的命令输出很容易丢失。我习惯在团队服务器上建一个“项目名_信息收集”目录,把每个Beacon的输出按主机IP命名保存,最后汇总成一张表格,包含IP、版本、域信息、用户权限、开放端口、可疑文件路径等关键字段。后续所有横向尝试都基于这张表去推演。

2. 用Beacon快速摸清目标主机

2.1 会话建立与基础检查

拿到边界机器权限后,第一步是部署Beacon并确认会话稳定。Cobalt Strike的Beacon支持HTTP、HTTPS、DNS等多种通信方式,内网场景下通常先用HTTP或HTTPS外连,再根据实际情况切换到内网监听器。会话建立后,我会先看三样东西:当前用户是谁、机器是不是域成员、Beacon通信是否正常。

检查命令很简单:

shell whoami shell ipconfig /all shell net config workstation

whoami可以显示当前用户,如果显示是domain\user格式,说明当前机器已经在域内,接下来的重点就要偏向域信息收集。net config workstation也会输出计算机全名和DNS后缀,能帮我们快速判断域环境。这个基础检查不用太多命令,关键是先确认“我在哪一层”。

2.2 系统信息、补丁与用户权限

确认基础信息后,我会立刻抓系统信息:

shell systeminfo

很多人忽略systeminfo里最底部的补丁列表,其实补丁信息直接关联到提权漏洞选择。如果系统是老的Windows Server 2008且打了很少的补丁,那提权路径就相对多;如果补丁很新,就要考虑从已有凭据或服务配置上找机会。我习惯把补丁日期和系统版本记进备注,后面分析提权策略时能少走弯路。

用户权限方面,我会执行:

shell whoami /all shell net user shell net localgroup Administrators

whoami /all能看到当前进程的令牌、SID和权限值,如果是高权限令牌,很多受限操作可以直接做;如果只是普通用户,后面需要先想办法提权。net user列出的本地用户要留意那些很少见但启用的账号,可能在充当后门;net localgroup Administrators则可以确认管理员组成员,判断我们离最高权限还有多远。

2.3 网络接口、路由与连接状态

内网环境里,一台主机的网络信息往往能暴露很多隐藏网段。除了ipconfig /all看本机IP和DNS外,更关键的是路由表和ARP缓存:

shell route print shell arp -a shell netstat -ano

route print可以看到完整的IPv4路由表,如果出现多个非默认网段,说明这台机器可能同时连接多个内网网段,它就是一个跳板节点。arp -a则能列出当前ARP缓存中曾经通信过的IP地址,这些地址通常覆盖了同网段的活跃主机,是内网存活主机探测的重要线索。netstat -ano则用来查看当前TCP连接,重点看外部地址是不是域控、数据库或备份服务器,这样能快速定位关键资产的通讯关系。

2.4 敏感进程与安全软件识别

接着我会用:

shell tasklist /v shell wmic process list brief

看运行进程里有没有域管用户启动的进程,如果当前机器上正好有域管的explorer.exe或其他高权限进程,后续就可以考虑进程注入或者令牌窃取,这是横向移动的黄金条件。同时也要关注杀软和EDR进程,比如常见的“xxx-edr-client.exe”之类的进程名,识别出防御软件后能决定后续哪些命令容易触发告警。

Cobalt Strike的ps命令也能列出进程,但输出格式比tasklist略简洁,我一般两种都看。识别安全软件时,不要只找杀软主程序,还要找驱动服务、监控进程、日志收集进程,否则容易被“斩首”。

3. 域环境与网络拓扑的“地图绘制”

3.1 域信息、域控与信任关系

当确认当前机器在域内,我会马上收集域信息:

shell net time /domain shell net group /domain shell nltest /dclist:某域 shell nltest /domain_trusts

net time /domain如果返回一个时间服务器名,那基本就是域控的机器名。nltest /dclist:某域能列出该域的域控列表,比单纯猜一个域名要准确得多。net group /domain可以查看域内全局组,尤其要留意“Domain Admins”和“Enterprise Admins”这类高权限组,里面有哪些成员、是否存在过期账号,会直接影响后面的攻击路径设计。如果环境是多域架构,nltest /domain_trusts还能列出信任关系,跨域获取权限时会用到。

这里要注意,命令里的“某域”要替换成实际的域名,别照抄。另外有些命令在普通用户权限下可能被拒绝,返回“Access is denied”,这时候不要硬刚,先把需要更高权限才能拿到的信息记进清单,等权限提升后再补。

3.2 内网存活主机与服务端口扫描

掌握域控清单后,必须对内网网段做一层存活主机探测。Cobalt Strike内置了portscan,可以快速扫描指定网段和端口,例如:

portscan 10.10.10.0/24 445,139,3389,22

输出会直接显示哪些主机开放了哪些端口,基本能判断出主机角色:开了445、139很可能走SMB横向;开了3389是远程桌面;开了22是SSH。我通常还会扫描80、443、3306、1433这类Web和数据库端口,用来发现Web面板和数据库服务。

扫描阶段最大的忌讳是“撒网太广”,一次扫整个大网段容易导致网络拥堵和告警。建议先用ARP、DNS、NetBIOS等方式做快速发现,再对关注网段做精细端口扫描。portscan虽然是内置功能,但它生成的时间间隔也需要注意,内网带宽有限时最好分段扫描。

3.3 共享资源与敏感文件定位

内网里最容易被忽视的信息源就是共享目录。很多运维为了方便,会把备份、安装包、日志放在共享文件夹里,甚至包含明文密码文件。我在拿到内网主机列表后,会批量检查常见共享:

shell net view \\10.10.10.15 shell net use \\10.10.10.15\IPC$ shell dir \\10.10.10.15\C$

如果当前用户权限足够,net view能列出对端开放的共享;net use建立IPC连接后,就可以尝试访问默认管理共享。访问到共享后,重点找这几类文件:web配置(web.config、application.properties)、数据库备份(.bak、.sql)、脚本(.bat、.ps1、.sh)、运维文档(.txt、.xlsx、.docx)。文件里可能躺着密码、连接字符串、服务器清单,都是后续横向移动的筹码。

Cobalt Strike的file browser功能也能浏览远程文件,但依赖当前会话能访问的IPC通道。我一般还是习惯先映射共享再处理,这样更灵活。

3.4 凭据信息的收集与归档

凭据信息收集是内网信息收集的重头戏。在获得高权限会话后,我会尝试抓取本机hash和内存凭据。Cobalt Strike提供了比较方便的口令抓取入口:

hashdump mimikatz sekurlsa::logonpasswords

hashdump需要SYSTEM权限,能导出本地SAM数据库中用户的NTLM hash。拿到hash后,可以先在本地离线尝试破解,也可以做hash传递进行横向登录。mimikatz则能从内存中抓取当前用户会话的明文密码和hash,尤其在服务器上有管理员正在交互式登录的场景下,效果很理想。

抓到的凭据必须立刻归档,否则后面横向测试时“钥匙”就丢了。我会把收集到的账号密码按“IP、域、用户、明文/hash、来源命令、时间”整理成表,并单独加密保存。这里多说一句:明文密码和hash都属于高敏信息,报告和团队服务器都要做好访问控制,绝不能泄露到外部。

4. 让信息收集半自动化的实用操作

4.1 内置命令的正确打开方式

Cobalt Strike的Beacon命令很多,但要真正提高效率,必须理解命令间的配合。比如ps和inject是一对:先用ps找到高权限进程,再用inject把会话注入进去,从而继承高权限令牌。再比如hashdump和portscan数据可以合并分析:先扫出开了445的主机,再对能访问的主机尝试hash传递。

我在实际操作中有一个习惯:每次信息收集都按照“系统环境—网络环境—域信息—账户信息—资产与服务—文件与凭据”的顺序执行,命令输出全部记录到CS的日志里。这样看起来慢,但在多台主机上重复时会发现,很多信息是可以复用的,后面的命令往往基于前面的输出调整目标。

4.2 使用Aggressor Script一键收集

Cobalt Strike支持通过Aggressor Script编写脚本来扩展功能。针对信息收集,我会写一个简单的脚本,把常用命令串起来,在Beacon上线后自动执行,减少手工敲命令的时间。下面是一个简单的示例逻辑:

on beacon_initial { bshell($1, "whoami /all"); bshell($1, "systeminfo"); bshell($1, "ipconfig /all"); bshell($1, "net group \"Domain Admins\" /domain"); bshell($1, "tasklist /v"); }

实际编写时,要注意命令里包含双引号可能跟脚本语法冲突,通常转义或使用单引号。脚本执行后,每个bshell的结果都会出现在Beacon会话里,所以还需要配合日志分析。如果目标主机很多,可以让脚本自动把输出重定向到某个临时目录,或者借助powershell命令把结果回传到共享位置。这种半自动化方式最大的好处是减少人为遗漏,也让收集过程可重复。

4.3 结果整理与脱机分析

收集回来的数据如果不整理,价值会大打折扣。我倾向于把每个Beacon的返回结果导入本地表格,或者用简单的文本处理工具清洗,提取IP、账号、版本、开放端口等关键字段。在大型网络里,甚至可以用数据透视的方式找出“最高的域管账号在哪些机器上登录过”、“哪些机器开放了相同的高危服务”这类交叉信息。

整理结果时还有个容易被忽略的点:时间戳。每轮信息收集都有时效性,比如凭据可能被新登录冲掉,端口可能被服务重启改掉。所以记录时要把命令执行时间写清楚,后续复盘时才能判断哪条信息已经过期,避免在无效信息上耗费精力。

5. 常见问题与排查技巧实录

5.1 命令回显异常和乱码

用shell systeminfo时,最常见的问题是在中文系统下输出乱码,这是因为Beacon命令通道的代码页跟目标系统不一致。遇到这种情况,我通常在命令前加chcp 65001或者cmd /c chcp 65001 & systeminfo,把代码页切换成UTF-8再执行。当然乱码不影响信息本身的价值,比如补丁列表里的KB编号还是能看出来的,但为了后续自动化处理,还是建议统一代码页。

另一个回显异常是命令执行后很久都没有输出,先确认Beacon的sleep时间设置是否太长,比如设了60秒,命令结果要等一个轮询周期才能回来。可以临时执行sleep 1让会话加快回显,收集完成后再调回正常值。

5.2 权限不足导致的功能受限

很多信息收集命令需要管理员或SYSTEM权限。比如hashdump在非SYSTEM会话下会报错,mimikatz的某些模块在低权限下也拿不到凭据。遇到这类问题,先检查当前会话权限,如果确实不够,就先把这台机器标记为“待提权”,在后续过程中通过提权来解锁更多收集能力。

还有一种情况是域命令被拒,比如net group /domain在某些环境里普通域用户可以执行,但在另一些环境里被策略限制了。不要反复硬试,避免触发锁定策略,应该改用其他渠道收集同等信息,比如从域控的共享、GPO文件或DNS记录里间接获取。

5.3 网络延迟和会话稳定性

内网质量差时,Beacon会话很容易掉线,尤其是通过HTTP方式通信,长时间无数据会超时。我在操作时会先调整Beacon的jitter值,把通信抖动时间设置在10%到20%之间,既保证隐蔽性又降低断线概率。对于大文件传输,比如下载数据库备份,我会选择分成多个块用upload/download逐步传,避免一个超长会话卡死在中间。

如果多个Beacon同时回传大量数据,团队服务器的带宽也会成为瓶颈。应对办法是错峰收集,比如把不同网段主机的扫描任务分散到不同时段,减少瞬时流量。否则容易造成核心内网交换机告警,给自己增加不必要的风险。

5.4 干扰业务与告警激增怎么办

信息收集本身就会产生网络流量和进程行为,如果不加控制,很容易被EDR或SOC盯上。我踩过几次坑之后,总结出几点经验:第一,扫描和命令执行尽量在业务低峰期做,比如凌晨;第二,尽量避免在域控和核心数据库机器上跑长时间扫描,可以先通过低价值主机间接收集;第三,如果已经触发了告警,不要硬着头皮继续,先放慢节奏,等告警窗口过后再调整手法。这些原则在授权测试里同样适用,因为客户需要平衡业务连续性和测试深度。

6. 安全红线与合规提醒

6.1 授权边界和测试范围

内网渗透里最有价值也最危险的就是对真实内网的“自由操作”。每次行动前,我都要跟客户确认授权书上的IP范围、测试时间、限制条件,并把所有操作记录留存。哪怕是信息收集这种看起来“无害”的步骤,只要超出了授权范围,同样可能被视为违规访问。Cobalt Strike本身只是一把工具,怎么用完全取决于操作者,务必把它控制在合法测试的框架里。

6.2 数据保密与最小化收集

内网环境里有大量真实业务数据、员工个人信息和财务资料。信息收集时,只采集与测试目标相关的信息,比如账号是否存在、服务是否开放、配置是否漏洞,不要下载无关的敏感数据。抓到的明文密码和hash要妥善保管,在报告里做脱敏处理,避免把真实的公司账号密码明文写入交付材料。如果测试过程中需要临时保存样本文件,应在测试结束后统一删除。

6.3 我个人的几点操作习惯

最后分享几个在这类项目中沉淀下来的习惯。每次建项目时,我会先建一个目录结构,把“访谈记录、授权书、扫描结果、凭据归档、报告”分成不同文件夹,权限严格控制。每个Beacon上线后,第一时间记录机器名、IP、上线时间,避免多个会话搞混。每晚结束测试前,我会把当天的新发现和未完成项写进笔记,第二天继续时不会断片。这些习惯和具体命令无关,但对整个内网渗透项目的推进帮助极大。

我在实际项目中体会最深的一点是:信息收集做得越细,后面横向与提权就越“顺畅”,很多卡住半天的问题,往往是在之前某个被忽略的输出里早有答案。所以如果你刚开始接触内网渗透,可以先从整理自己的信息收集清单开始,把Cobalt Strike当侦察工具用好,远比急着学各种攻击手法更重要。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询