打进内网后一脸懵?内网渗透第一步——信息收集决定了你能走多远
打进内网后一脸懵?内网渗透第一步——信息收集决定了你能走多远
一个真实的红队故事,带你走完内网信息收集的每一步
上个月的真实场景
凌晨两点,我拿到了一台边界Web服务器的shell。
目标是一家中型企业的外网门户,一个存在了七八年的老PHP系统。通过一次SQL注入拿到了RDP用户密码,顺利登陆了这台WIndows Server 2012。
习惯性 ipconfig 看了一眼IP——172.16.1.105,妥妥的内网段。
我心想:"好,挖进去了。但然后呢?"
绝大多数安全从业者都卡在这一步——你突破边界进了内网,但面前是一片纯黑的网络海洋。你不知道旁边有哪些机器,不知道域控在哪,不知道哪些端口开着,更不知道哪些机器等你横向移动。
这一步,叫内网信息收集。90%的内网渗透成败,取决于信息收集做得够不够细。
第一章:为什么要做信息收集?
很多人觉得"我都进去了,直接扫呗"。
但真实场景下:
扫描行为会产生流量 → 可能触发IDS/EDR告警 → 蓝队把你扼杀在内网门口
信息收集的目的不是扫一圈IP列表,而是回答以下几个问题:
- 我是谁——当前漏洞机的角色、域环境、网络配置
- 旁边是谁——同一个网段有哪些邻居、网关在哪
- 目标是谁——域控在哪、文件服务器在哪、数据库在哪
- 我能去哪——还有哪些网段可以路由到达
- 怎么不被发现——哪些流量会被监控
这五个问题,前四个回答的是"怎么打",第五个回答的是"怎么活"。
第二章:侦察第一轮——本地信息收集
拿到shell后,我做了这么几件事。
2.1 网络配置摸底
不管Windows还是Linux,第一件事永远是确认网络拓扑:
# Windows必查
ipconfig /all
route print
netstat -ano
arp -a
# Linux必查
ifconfig
ip route
netstat -tunlp
arp -n
为什么要查ARP表?
机器之间的通信只要在同一个二层网络,通信过的IP会短暂留在ARP表里。一个活跃的ARP表,基本就等于"隔壁有人的机器列表"。
我在这台Win Server上看到:
接口: 172.16.1.105 --- 0x0b
Internet 地址 物理地址 类型
172.16.1.1 00-50-56-b3-12-aa 动态 ← 网关
172.16.1.10 00-50-56-b3-33-bb 动态 ← 有机器!
172.16.1.20 00-50-56-b3-44-cc 动态 ← 有机器!
172.16.1.50 00-50-56-b3-55-dd 动态 ← 有机器!
172.16.1.100 00-50-56-b3-66-ee 动态 ← 有机器!
172.16.2.15 00-50-56-b3-77-ff 动态 ← 跨网段?!
关键发现:172.16.1/24网段至少有4台活跃机器,而且还有一台172.16.2.15出现在ARP表里——这意味着这台机器的路由表里有通往别的网段的路径,或者这台机器本身是多网卡。
# 验证是否多网卡
ipconfig /all | findstr "IPv4"
果然,这台机器有两块网卡:
IPv4 Address: 172.16.1.105
IPv4 Address: 172.16.2.105
结论:这台机器是通往172.16.2/24的跳板机。大部分内网渗透都从这里开始——找"连接多网段的机器"。
2.2 域环境探测
确认域环境是信息收集中最关键的一步:
# 判断是否加域
systeminfo | findstr "Domain"
# 看到的结果
Domain: CORP.LOCAL
看到 CORP.LOCAL,心情瞬间上来了——加域的。这意味着存在域控(DC,Domain Controller),整个内网有一套统一的认证体系。
再查域控位置:
# 查当前登陆的域用户
whoami
# 结果
corp\zhangwei
# 查域控
nltest /dclget:corp.local
返回:
DC: \\DC01.corp.local
IP: 172.16.1.10
域控就在隔壁172.16.1.10——和ARP表上看到的那台机器是同一个IP。
一个重要的经验:拿到域控IP后,不要急着打。先做完整的信息收集,搞清楚域控上跑了什么服务,再做下一步决策。
2.3 本地敏感信息搜索
信息收集不只是看网络拓扑,还包括这台机器本身存储了什么东西:
# Windows - 搜各类密码相关文件
findstr /si password *.xml *.config *.txt *.ini *.bat *.ps1
# 搜Web配置文件
dir /s *.config *.env
# 搜RDP连接记录
dir /a cmdkey /list
我在这台机器上找到了一个 db_config.bak 文件:
[DB_Connection]
server=172.16.1.50
database=ERP_MAIN
user=sa
password=Corp@Admin!2024
又一个目标浮出水面——172.16.1.50,一台SQL Server数据库。
同时,cmdkey /list 显示:
当前保存的凭据目标:
LegacyGeneric:target=TERMSRV/172.16.1.20
LegacyGeneric:target=TERMSRV/172.16.1.10
这台机器上存了到172.16.1.20和172.16.1.10的RDP凭据!这些凭据在当前用户的Windows凭据管理器里,可以直接用 runas /savedcred 调用。
第三章:侦察第二轮——横向存活探测
做完本地信息收集,手里已经有几个目标IP了。接下来要做一件事——确认哪些机器真正在线上、哪些端口开放。
3.1 低噪存活探测
第一轮探测不用NMAP,因为NMAP的SYN扫描在很多EDR眼里是既定告警。我推荐两种方式:
# 方式1:利用ARP ping(二层,不产生IP层流量)
for /L %i in (1,1,254) do ping -n 1 -w 100 172.16.1.%i | find "TTL="
# 方式2:用powershell Test-NetConnection(速度更快)
1..254 | % { if (Test-Connection -Count 1 -ComputerName "172.16.1.$_" -Quiet) { "172.16.1.$_ is alive"} }
这种方式产生的流量特征和普通Windows机器的网络操作几乎没区别,EDR很难判定是恶意行为。
3.2 端口探测(用代理转发)
探测到存活主机后,不能拿着攻击机直接扫描——攻击机的IP不在内网段,扫不到。
正确做法是建立SOCKS代理转发:
# 在攻击机上执行(通过反弹shell的机器做跳板)
# 用frp或chisel建立socks隧道
chisel client <跳板机>:<端口> R:socks
然后在本地配置proxychains:
# /etc/proxychains.conf
socks5 127.0.0.1 1080
通过代理进行端口扫描:
proxychains -q nmap -sT -Pn -p 22,80,443,445,3389,3306,1433,8080,8443 \
172.16.1.10 172.16.1.20 172.16.1.50
扫描结果:
172.16.1.10 → DC01.corp.local
PORT STATE SERVICE
53/tcp open domain ← DNS
88/tcp open kerberos ← Kerberos
135/tcp open rpc
139/tcp open netbios
389/tcp open ldap ← LDAP
445/tcp open smb ← SMB
3389/tcp open ms-wbt-server ← RDP
5985/tcp open winrm ← WinRM
172.16.1.20 → CORP-FILE01
PORT STATE SERVICE
135/tcp open rpc
139/tcp open netbios
445/tcp open smb
3389/tcp open ms-wbt-server
172.16.1.50 → CORP-DB01
PORT STATE SERVICE
135/tcp open rpc
1433/tcp open ms-sql-s ← SQL Server
3389/tcp open ms-wbt-server
血的教训:不要在跳板机上直接运行masscan/NMAP的全端口扫描。我曾见过一个红队兄弟,在跳板机上扫全端口被EDR告警,15分钟后蓝队就把他踢下线了。扫常用端口就够了,全端口扫描是给蓝队送业绩。
3.3 SMB共享探测
445端口开着的机器是内网渗透的金矿——SMB共享里往往躺着大量敏感文件:
# 列出目标机器上的所有共享
net view \\172.16.1.20
# 结果
共享名 类型 用途 注释
-------------------------------------------------------------------------------
Backup Disk 备份共享
Data Disk 部门数据
Finance$ Disk 财务数据(隐藏共享)
IPC$ IPC 远程 IPC
共享一多,第一个要挂上去的是隐藏共享 Finance$:
# 尝试访问
dir \\172.16.1.20\Finance$
如果能访问,恭喜你找到金矿了。财务共享里通常有薪资表、对账单,这些在钓鱼邮件和社会工程学里是极好的素材。
如果提示无权限——正常。这时候不要硬来,记下这条共享路径,后续拿到域管权限后再来访问。
第四章:侦察第三轮——域内信息收集
这一步是拉开和其他红队差距的地方。大多数人在第二步就急着拿工具开扫了。但真正老练的红队会在这一步做细致的域信息收集。
4.1 域用户枚举(不触发告警的方式)
用ADSI(AD Service Interface)查询,不走LDAP的审计log:
# PowerShell ADSI查询 - 域用户列表
$searcher = [ADSISearcher]'(&(objectClass=user)(objectCategory=person))'
$searcher.PageSize = 1000
$searcher.FindAll() | ForEach-Object {
$user = $_.Properties
[PSCustomObject]@{
UserName = $user.samaccountname
DisplayName = $user.displayname
Enabled = $user.useraccountcontrol -band 2 -eq 0
LastLogon = [datetime]::FromFileTime($($user.lastlogontimestamp[0]))
}
} | Format-Table -AutoSize
这个查询方式的特点是——它用的是当前域用户的权限,走的是WMI/ADSI路径,不会产生明显的LDAP查询日志。蓝队如果没专门配ADSI审计,根本看不到你。
4.2 域管理组成员查询
找到域管理员是谁,等于找到了目标:
# 查询Domain Admins组
$searcher = [ADSISearcher]'(&(objectClass=group)(cn=Domain Admins))'
$result = $searcher.FindOne()
$result.Properties.member | ForEach-Object {
$member = [ADSI]"LDAP://$_"
$member.Properties.samaccountname
}
输出:
administrator
wang_li
zhang_wei
liu_hai
四名域管理员。查他们的登陆习惯:
# 查看域控的登陆会话
net session \\DC01
冷知识:net session 走的是SMB协议,如果域控上SMB服务没有单独审计这行命令,它是不会产生告警的。
4.3 组策略与OU结构分析
OU(组织单元)结构直接暴露了企业的组织架构,这是做横向移动路线规划的重要信息:
$searcher = [ADSISearcher]'(&(objectClass=organizationalUnit))'
$searcher.FindAll() | ForEach-Object {
$_.Properties.distinguishedname
}
输出:
OU=Domain Controllers,DC=corp,DC=local
OU=Servers,DC=corp,DC=local
OU=Workstations,DC=corp,DC=local
OU=Finance,OU=Servers,DC=corp,DC=local
OU=IT,OU=Servers,DC=corp,DC=local
OU=Executives,DC=corp,DC=local
看到这层结构,我立刻标记了两个重点:
- OU=Finance → 刚才的SQL Server可能归属这里,里面有财务数据
- OU=Executives → 高管的机器,可能存着机密文档
第五章:实操——把信息收集结果画成一张攻击地图
信息收集做完了,不要只停留在脑子里。画一张攻击地图,你才能看清全局。
我的习惯是在笔记里画一个简单的拓朴图:
┌─────────────────────┐
│ 攻击机 (Kali) │
│ 10.0.0.2 │
└─────────┬───────────┘
│ SSH隧道 (frp)
▼
┌───────────────────────────────┐
│ 跳板机 (WEB01) │
│ 172.16.1.105 │
│ 172.16.2.105 │←双网卡跳板
│ CORP\zhangwei │
│ 已获取: RDP凭据*2 │
└───────┬───────────────┬───────┘
│ │
┌────────────┴─────┐ ┌────┴────────────┐
│ 172.16.1.10 │ │ 172.16.1.20 │
│ DC01 │ │ CORP-FILE01 │
│ 域控 │ │ 文件服务器 │
│ RDP凭据可用 │ │ 共享: Backup │
│ 目标: Kerberoast │ │ Data, Finance$│
└──────────────────┘ └─────────────────┘
│
┌──────────┴──────────┐
│ 172.16.1.50 │
│ CORP-DB01 │
│ SQL Server 2019 │
│ sa密码已获取 │
│ DB: ERP_MAIN │
└─────────────────────┘
有了这张图,横向移动的路线就很清楚了:
路线1:用已缓存的RDP凭据直接登陆DC01,尝试提权
路线2:用sa密码连接DB01,捞ERP数据
路线3:通过FILE01的共享,找敏感文件提炼更多凭据
路线4:通过双网卡跳板往172.16.2/24渗透
第六章:信息收集的黄金法则——5条经验总结
做了这么多年的内网渗透,我总结了几条铁律:
法则1:多花时间在"看"上,少花时间在"扫"上
具体比例:70%时间看,20%时间分析,10%时间扫。
看是最安静的——看ARP表、看DNS缓存、看凭据管理器、看Local Admin组、看Scheduled Tasks。这些都是Windows系统自己的行为,EDR不会管。
扫是最噪的——一旦开始端口扫描,你就在EDR雷达上了。所以只在你知道要看什么的时候才扫。
法则2:信息收集不是"一次性"的
信息收集不是第一轮做完就结束了。 每横向移动一步,你都在一个新的机器上重新做一次信息收集。这台机器能看到什么网段?这台机器存了什么凭据?这台机器上有什么系统服务?
每一跳都是一次重新侦察。
法则3:优先打"多网卡"的机器
双网卡/多网卡机器是内网渗透的黄金跳板。发现一台多网卡机器,等于多了一条通往新网段的通道。用 ipconfig /all 确认多网卡的机器后,优先把它作为下一轮攻击的据点。
法则4:别忽视"过期"信息
ARP表里的条目、DNS缓存记录、凭据管理器里的过期凭据——这些都可能过期,但也可能是线索。过期的凭据说明某个服务曾经用这个账号连接过,这种"历史连接关系"本身就暴露了目标机器的角色。
法则5:最危险的不是读,是写
读数据不会触发告警,写数据才会。
信息收集阶段,你只是在读取已有的数据——查DNS、查路由表、查共享、查域成员。这些行为在EDR里的风险等级通常是Low。但一旦你开始创建服务、写入注册表、植入后门、添加用户——这些行为会触发Medium到Critical的告警。
所以:信息收集阶段能多安静就多安静,攻击操作留到做足了侦察再说。
写在最后
信息收集是内网渗透的基石。这一步做得够好,后面的横向移动才能做到"指哪打哪"。
这篇文章是内网渗透实战系列的第一篇。下一篇我们会讲——凭据窃取与横向移动技术,包括:
- 如何从lsass.dmp中提取明文凭据
- Pass-the-Hash和Overpass-the-Hash的技术细节
- 用SMB exec和WMI exec做横向移动
- 如何绕过常见EDR的横向移动检测
如果你有内网渗透方面的问题或想看的主题,欢迎留言。下期见。
打得了一台机器不叫渗透,拿到了整个域才叫渗透。
信息收集的工作量决定了你能走得有多远。
关注「安全值班室」公众号
每天实战攻防案例 + 安全干货

浙公网安备 33010602011771号