隧道的建立及前置基础

📅 发布时间:2026/10/15 3:53:12
隧道的建立及前置基础
一、内网穿透原理1、内网穿透利用各种隧道技术以网络防火墙允许的协议绕过网络防火墙的封锁实现访问被封锁的目标网络。1端口转发将发往外网的某个端口的数据完全转发给内网是外网到内网的单向通信。2端口映射将内网IP的某个端口映射到公网IP的某个端口实现通过公网IP端口直接正向访问内网端口映射实现双向通信3、隧道技术是一种通过使用互联网络的基础设施在网络之间传递数据的方式。红队在进攻时需要在复杂的内容中获取稳定的流量交互以达到目的。攻击者通常会采用各种内网穿透技术建立隧道从不同网络协议层对出口屏蔽或拦截进行绕过。进行内网渗透常用的隧道技术有dns 隧道、http隧道、ssh隧道、icmp隧道等容易被网络防火墙放行的协议。1网络层隧道ipv6隧道、icmp隧道、GRE隧道其中常用的隧道技术为icmp隧道技术。2传输层隧道只要有TCP、UDP协议因此隧道搭建也是基于这两种协议进行的。常用的隧道搭建工具有netcat、powercat等。3应用层隧道应用层位于TCP/IP协议的最顶层通常用于搭建各种应用服务而基于应用层搭建的隧道技术就是利用各种应用所占用的端口进行搭建比如ssh、http/https和dns服务这些服务是服务器经常用到不会被禁止的协议。内网机器先主动连公网服务器 → 建立反向隧道 → 服务器登记端口映射 → 外网访问服务器公网端口 → 服务器通过隧道把流量转发回内网 → 内网机器交给本地服务。完整顺序阶段发生什么作用1. 内网发起连接内网客户端主动向公网服务器发起连接绕过 NAT/防火墙因为内网可以主动访问外网2. 建立隧道客户端和服务器之间形成一条持久隧道作为后续数据往返的通道3. 注册端口映射服务器记录公网端口 ↔ 内网服务告诉服务器“访问这个公网端口时交给哪个内网服务”4. 外网访问入口外部用户访问公网IP:端口或域名这是外网进入的入口5. 反向转发服务器收到请求后通过隧道把请求发给内网客户端流量从公网回到内网6. 本地交付内网客户端把请求交给本地服务比如 Web、SSH、数据库、远程桌面7. 响应返回响应沿原路返回内网服务 → 客户端 → 隧道 → 服务器 → 外网用户完成一次双向通信用一句话概括内网机器先主动连公网服务器建立隧道服务器再把这个隧道绑定到一个公网端口外网访问这个公网端口时服务器通过隧道把请求反向转发给内网机器从而实现内网穿透。这里要纠正一个容易混淆的点“端口转发”不是最先发生的动作。真正最先发生的是内网主动建隧道端口映射/端口转发是在隧道建立后由服务器登记和暴露入口外网访问时才真正完成转发。windows端口实现端口转发1端口转发把从公网来的流量转发给其他内网的机器或者本机的其他端口方式实现一以管理员命令执行使用cmd命令实现端口转发netsh interface portproxy add v4tov4 listenport8989 listenaddress127.0.0.1 connectport8080 connectaddress127.0.0.1 netsh advfirewall firewall add rule namePortForward-8989 dirin actionallow protocolTCP localport8989这个是本地转发的将8989转发到8080netsh interface portproxy add v4tov4 listenport8989 listenaddress127.0.0.1 connectport8080 connectaddress127.0.0.1 netsh advfirewall firewall add rule namePortForward-8989 dirin actionallow protocolTCP localport8989删除规则netsh interface portproxy delete v4tov4 listenport8989 listenaddress127.0.0.1 netsh advfirewall firewall delete rule namePortForward-8989方式二NCAT - 21世纪的Netcat下载后使用echo off REM ncat 常用命令速查5.59BETA1 可用 REM 用法把想测试的行去掉前面的 REM保存为 .bat 运行或直接在 cmd 里复制单条执行 REM 【基础】查看版本与帮助 ncat.exe --version REM 查看当前 ncat 版本 ncat.exe -h REM 显示帮助信息列出所有可用参数 REM 【监听端口】 ncat.exe -l -p 8989 REM 监听本地 8989 端口等待一个连接 ncat.exe -l -k -p 8989 REM 监听 8989 端口客户端断开后继续接受下一个连接-k 保持监听 REM 【连接远程端口】 ncat.exe 127.0.0.1 8080 REM 连接本地 8080 端口 ncat.exe -v -n 127.0.0.1 8080 REM 连接 8080 端口-v 显示详细信息-n 不做 DNS 解析直接走 IP REM 【端口扫描 / 连通性测试】 ncat.exe -v -z 127.0.0.1 8080 REM 测试 8080 端口是否开放-z 只探测不发送数据 ncat.exe -v -z 192.168.1.100 80 REM 测试远程主机 80 端口是否开放 ncat.exe -v -z 192.168.1.100 20-100 REM 扫描 20 到 100 端口查看哪些端口开放 ncat.exe -v -z -w 3 192.168.1.100 80 REM 测试 80 端口最多等待 3 秒超时则认为不通 REM 【抓取服务 Banner查看服务版本信息】 ncat.exe -v 192.168.1.100 22 REM 连接 SSH 端口查看返回的版本信息如 OpenSSH_x.x ncat.exe -v 127.0.0.1 8080 REM 连接 Web 服务查看服务器返回的初始信息 REM 【两台机器之间传文件】 REM 接收端先执行 ncat.exe -l -p 9999 received.zip REM 监听 9999 端口把收到的数据保存为 received.zip REM 发送端再执行 ncat.exe 192.168.1.100 9999 localfile.zip REM 把本地 localfile.zip 发送给接收端 REM 【两台机器之间简易聊天】 REM A 机器执行 ncat.exe -l -k -p 5555 REM 监听 5555 端口等待聊天连接 REM B 机器执行 ncat.exe 192.168.1.100 5555 REM 连接 A 机器两边输入的内容会互相显示 REM 【端口转发8989 → 8080】 ncat.exe -l -k -p 8989 --sh-exec ncat.exe 127.0.0.1 8080 REM 监听本地 8989 端口把每个连接转发到 127.0.0.1:8080 REM 【带日志的端口转发】 ncat.exe -l -k -p 8989 --output ncat.log --sh-exec ncat.exe 127.0.0.1 8080 REM 转发 8989 到 8080同时把会话数据保存到 ncat.log REM 【十六进制抓包的端口转发】 ncat.exe -l -k -p 8989 --hex-dump dump.bin --sh-exec ncat.exe 127.0.0.1 8080 REM 转发流量并把所有数据以十六进制格式保存到 dump.bin REM 【限制允许连接的 IP】 ncat.exe -l -k -p 8989 --allow 192.168.1.0/24 --sh-exec ncat.exe 127.0.0.1 8080 REM 只允许 192.168.1.0/24 网段连接其他 IP 会被拒绝 REM 【限制最大并发连接数】 ncat.exe -l -k -p 8989 --max-conns 10 --sh-exec ncat.exe 127.0.0.1 8080 REM 最多同时允许 10 个连接防止端口被打爆 REM 【UDP 监听和测试】 ncat.exe -u -l -p 5555 REM 以 UDP 模式监听 5555 端口 ncat.exe -u -v -z 192.168.1.100 53 REM 测试远程主机 UDP 53 端口DNS是否开放 REM 【指定超时时间】 ncat.exe -v -z -w 3 192.168.1.100 80 REM 测试 80 端口最多等待 3 秒 REM 【从指定本地 IP 连接】 ncat.exe -s 192.168.1.50 127.0.0.1 8080 REM 从本地 192.168.1.50 这个 IP 发起连接到 8080 端口 REM 【转发并限制空闲超时】 ncat.exe -l -k -p 8989 -i 60 --sh-exec ncat.exe 127.0.0.1 8080 REM 转发 8989 到 8080如果连接空闲 60 秒就自动断开 REM 【只接收数据】 ncat.exe -l -p 9999 --recv-only recv.log REM 监听 9999 端口只接收数据不发送任何内容 REM 【只发送数据】 ncat.exe 192.168.1.100 9999 --send-only send.log REM 把 send.log 的内容发送出去不接收响应 REM 【追加写入日志不覆盖旧日志】 ncat.exe -l -k -p 8989 --append-output --output ncat.log --sh-exec ncat.exe 127.0.0.1 8080 REM 转发流量并把日志追加写入 ncat.log REM 提示 REM 1. 转发命令会一直运行窗口不要关掉按 CtrlC 停止 REM 2. 如果别人要从别的机器连你记得在 Windows 防火墙放行对应端口 REM 3. 5.59BETA1 不支持 --ssl、--proxy 等新特性 REM 4. 手动发 HTTP 请求时连接后输入 REM GET / HTTP/1.1 REM Host: 127.0.0.1 REM Connection: close REM 最后空一行回车上面是具体的使用说明直接用就行了方式三SSH 转发需要能 SSH 登录目标机但全程加密适合跨网、跳板、访问敏感服务需要管理员权限命令如下powershell -NoProfile -Command if (-NOT ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] Administrator)) { Write-Host 错误请以管理员身份运行 CMD; exit 1 } powershell -NoProfile -Command $sshd Get-Service sshd -ErrorAction SilentlyContinue; if ($sshd -and $sshd.Status -eq Running) { Write-Host sshd 已安装并正在运行; exit 0 }; Write-Host 正在安装 OpenSSH 服务器...; Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0; Write-Host 正在启动 sshd 服务...; Start-Service sshd; Set-Service -Name sshd -StartupType Automatic; if (-not (Get-NetFirewallRule -Name OpenSSH-Server-In-TCP -ErrorAction SilentlyContinue)) { Write-Host 正在放行防火墙 22 端口...; New-NetFirewallRule -Name OpenSSH-Server-In-TCP -DisplayName OpenSSH Server (sshd) -Enabled True -Direction Inbound -Protocol TCP -Action Allow -LocalPort 22 }; Write-Host 验证服务状态...; Get-Service sshd; netstat -ano | findstr :22; Write-Host 完成。现在可使用 ssh 用户名IP 连接本机。然后退出直接输入exit即可然后开启端口转发命令如下即可开启转发其中的用户名和ip换成你自己的用户名和ip方式四不需要管理员权限直接使用powershell脚本流量转发# port-forward.ps1 # 本机 8989 - 远程 192.168.1.100:8080 $LocalPort 8989 $RemoteHost 192.168.1.100 $RemotePort 8080 $listener [System.Net.Sockets.TcpListener]::new([System.Net.IPAddress]::Any, $LocalPort) $listener.Start() Write-Host [*] 监听 0.0.0.0:$LocalPort - $RemoteHost:$RemotePort -ForegroundColor Green while ($true) { $client $listener.AcceptTcpClient() Write-Host [] 新连接: $($client.Client.RemoteEndPoint) -ForegroundColor Cyan $job { param($client, $RemoteHost, $RemotePort) try { $remote [System.Net.Sockets.TcpClient]::new() $remote.Connect($RemoteHost, $RemotePort) $cs $client.GetStream() $rs $remote.GetStream() # 双向转发 $t1 $cs.CopyToAsync($rs) $t2 $rs.CopyToAsync($cs) # 等待任一侧结束 while (-not $t1.IsCompleted -and -not $t2.IsCompleted) { Start-Sleep -Milliseconds 200 } } catch { Write-Host [!] 转发异常: $_ -ForegroundColor Red } finally { try { $client.Close() } catch {} try { $remote.Close() } catch {} } } # 用后台 Job 处理避免单连接阻塞 Start-Job -ScriptBlock $job -ArgumentList $client, $RemoteHost, $RemotePort | Out-Null }方式五TCP 隧道下载后解压使用配置服务器端cd /usr/local/frp ./frps -c ./frps.toml配置客户端然后就成功了最难的是下载和配置安全组和对应的防火墙方式六SocatSOcket CAT是一个极其强大的命令行网络工具常被称为“netcat”或“网络工具箱中的瑞士军刀”。它可以在两个独立的端点如文件、管道、设备、套接字等之间建立一个双向的字节流通道从而实现数据传输。由于它支持超过 100 种不同的协议和地址类型包括 TCP、UDP、IPv6、SSL、Unix 套接字、串口等因此在复杂的网络调试、端口转发、协议转换以及安全传输场景中它的功能远超简单的 Netcat。以下是关于 Socat 的功能、下载和部署的详细说明一、 Socat 有什么核心作用Socat 的核心就是“数据流中继”。常见的实战应用包括端口转发最常用将本地端口的流量转发到另一台主机的特定端口。协议转换比如将 TCP 请求转为 UDP 发送或者作为 SSL 透明代理。调试与抓包双向传输数据的同时可以在终端实时查看传输内容类似抓包。文件传输在不同主机之间建立通道直接发送或接收文件。socat-windows:unofficial windows build of socat http://www.dest-unreach.org/socat/ - AtomGit下载后执行即可命令如下socat.exe TCP-LISTEN:9090,fork,reuseaddr TCP:127.0.0.1:8080方式七Chisel是一个快速、安全的开源网络隧道工具。它的核心功能是作为一个TCP/UDP 隧道通过HTTP/HTTPS协议来传输数据。简单来说它就像一个隐蔽的“数字管道”允许您在受限的网络环境中建立安全的通信通道。它的主要特点包括单文件跨平台由 Go 语言编写只有一个可执行文件没有复杂的环境依赖可以在 Windows、Linux、macOS 等系统上轻松运行。C/S 架构它分为服务端Server和客户端Client两个角色通过两者协同工作来建立隧道。高安全性通信通过 SSH 协议进行加密并支持身份验证确保数据传输的安全。功能强大支持端口转发正向/反向、SOCKS5 代理等多种模式在渗透测试和内网穿透中非常灵活。1. 什么是“流量伪装”大多数网络防火墙会检查流量的内容如果识别出是不被允许的应用协议如某些木马的后门通信就会进行拦截。Chisel 的做法它会把需要传输的原始 TCP/UDP 数据进行 SSH 加密然后将这些加密后的数据封装在 HTTP 或 WebSocket 协议中进行传输。伪装效果这样一来中间的网络设备如防火墙、入侵检测系统看到的流量就是标准的、正常的网页浏览或 Web 应用通信从而无法识别出真实的数据内容。2. 什么是“过防火墙神器”这指的是其隧道穿透的能力。防火墙的策略在许多网络环境中如公司、学校出于安全考虑防火墙会严格限制非必要的出站连接但通常会放行 80 (HTTP) 和 443 (HTTPS) 端口以保证用户能正常上网。Chisel 的穿透力因为 Chisel 的通信流量被完美伪装成了 HTTP/HTTPS 流量它能够利用这些被放行的端口和协议像“钻地道”一样轻松穿越防火墙的限制在内外网之间建立起一条稳定的通信隧道。总结来说Chisel 凭借其将流量封装在常见 Web 协议中的能力实现了高效的流量伪装进而能够穿透防火墙的限制因此被称为“过防火墙神器”。它被广泛用于合法的安全测试如渗透测试、红队演练和运维场景如远程访问内网服务。发行作品 ·JPILLORA/凿子端口转发这里只展示端口转发后续的没开正在理解中隧道的建立一.什么是 ICMP 隧道ICMPInternet Control Message Protocol互联网控制报文协议是 TCP/IP 协议族中的一个重要协议。我们平时使用的ping命令就是基于 ICMP 协议工作的用于测试网络的连通性。ICMP隧道的核心原理是利用ICMP数据包来封装和传输其他数据。工作原理通常ICMP数据包只携带少量用于网络诊断的信息。但ICMP隧道工具会将想要传输的数据比如远程控制指令、文件内容等隐藏或“封装”在ICMP数据包的载荷Payload部分。主要目的绕过防火墙很多防火墙为了保证网络的基本连通性会允许ICMP数据包如ping请求和响应通过。攻击者或渗透测试人员利用这一点通过ICMP隧道建立一条隐蔽的通信通道从而绕过防火墙对特定端口如SSH的22端口、远程桌面的3386端口的封锁。实现隐蔽通信因为ICMP流量非常普遍在网络中很难被区分出恶意流量因此具有较高的隐蔽性可以躲避入侵检测系统的审查。简单来说ICMP隧道就像是在正常的网络“ping”流量中夹带“私货”让两台主机在看似正常的网络探测行为下进行秘密的数据传输。GitHub - bdamele/icmpsh简单的反向ICMP壳 ·GitHub这个只能说质量一般知道原理就能自己写了python2还是太古典了emm2. 什么是DNS隧道DNS隧道DNS Tunneling是一种隐蔽的网络通信技术。它巧妙地将需要传输的数据如命令、文件内容等伪装成 DNS 查询和响应的数据从而在两个网络节点之间建立一个隐蔽的通信通道。为什么会存在这种技术DNS域名系统是互联网的基础服务其作用是将我们输入的网址如www.example.com解析为计算机能识别的IP地址。由于DNS服务对于网络的正常运行至关重要因此绝大多数网络环境包括公司的内网、防火墙等都会允许 DNS 流量通常是UDP 53端口自由通过。DNS隧道技术正是利用了这一点绕过限制当正常的通信方式如HTTP、SSH被防火墙阻断时DNS隧道可以绕过这些限制。隐蔽性强网络防火墙通常认为DNS流量是“正常”的不会对其进行深入检查这为隐蔽通信提供了可能。数据泄露攻击者可以利用它将窃取到的数据从内部网络悄无声息地传出来。下载命令如下下载之前记得在虚拟机下载关闭防火墙curl -L -o dnscat2-v0.07.tar.gz https://codeload.github.com/iagox86/dnscat2/tar.gz/refs/tags/v0.07然后解压命令tar -zxvf dnscat2-v0.07.tar.gz需要安装的有点杂暂时其他隧道够我用了目前frp和icmp隧道够我用了python和c实现的情况下有难度但是不是很高1. 什么是隧道隧道是一种绕过端口屏蔽的通信方式。具体来说就是把原本可能被拦截的数据包用防火墙允许的数据包类型或端口进行封装让它“伪装”成合法流量穿过防火墙与对方通信到达目的地后再解封装还原把还原后的数据包发送到相应的服务器上。通俗理解像把一封信装进另一个信封里寄出去中间的分拣系统只看外层信封是否合规收件方再拆开外层取出真正的信。按协议层次常见分类网络层IPv6 隧道、ICMP 隧道、GRE 隧道传输层TCP 隧道、UDP 隧道、常规端口转发应用层SSH 隧道、HTTP 隧道、HTTPS 隧道、DNS 隧道2. 为什么需要隧道网络访问受限实际网络中通常存在边界设备、软/硬件防火墙乃至入侵检测系统会检查对外连接一旦发现异常就阻断通信。端口被屏蔽很多环境只放行 80、443、53 等少数端口其他协议的流量无法直接通行。传输安全性不足在不受信任的网络中直接传输数据存在被窃听、篡改的风险需要借助隧道提供隔离与保护。3. 隧道有什么用实现受限环境下的通信绕过端口/协议限制让原本无法直连的双方能够通信。追踪与判断数据流向在访问受限的网络环境中帮助判断流量是否“出得去、进得来”是内网连通性判断的辅助手段。保障非信任网络中的数据传输安全通过封装与部分隧道的加密降低数据被直接观测的风险。典型实际场景远程访问内网资源、跨网络段打通服务、构建虚拟专用网络等。建立隧道之后数据可以沿两个方向流动方向数据流向说明下行/入向外网 → 服务器 → 隧道 → 内网客户端 → 本地服务外网请求通过隧道进入内网上行/出向本地服务 → 内网客户端 → 隧道 → 服务器 → 外网内网响应通过隧道返回外网所以整个闭环是外网请求进入公网端口 → 服务器通过隧道把请求发给内网客户端 → 内网客户端交给本地服务 → 本地服务产生响应 → 响应沿同一条隧道原路返回 → 服务器把响应发回外网。这里有个关键点隧道建立时内网客户端是主动向外连的这一步只是“出站”。但隧道建立完成后它就变成了一条双向通道服务器可以沿着这条通道把外网请求“推”回内网。这也是中继式内网穿透能工作的核心原因NAT/防火墙通常只允许内网主动向外发起连接但一旦这条连接建立起来服务器就可以通过它把数据回传给内网所以不需要在路由器上开端口也不需要公网 IP。可以把它想象成一根双向水管内网先把管子一头接到服务器上之后两头都能往里灌水水会沿着同一根管子来回流动。