Kali Linux渗透测试——隧道&封装

笔记内容参考安全牛课堂苑房弘老师的Kali Linux渗透测试教程,文章仅作为学习使用,切勿用于非法行为

隧道技术 即使用多种加密技术在网络节点之间建立安全管道,在不受信任的网络环境中实现安全通信,它和代理功能容易混淆,简要区分如下:

  • 代理:服务端处理socks、http(s)等协议请求时,将请求数据包和响应数据包进行转发,担任中间人的角色。使用代理可以利用缓存技术减少网络带宽,也可以搭建链路访问内部网络或原本无法访问的站点。
  • 隧道:用ssh、http(s)、icmp、dns等协议将原始数据包进行封装,客户端和服务端在收到数据后首先要对其进行拆包,提取内部数据,相应地在发送数据前要对其进行封包。使用隧道可以在不兼容的网络上传输数据,也可以在不安全的网络上提供一个安全路径,确保客户端能与服务器能够安全通信。可以使用隧道对内部网络进行访问,本质上是流量经由隧道后再经过端口转发,搭建隧道和端口转发相当于两个过程。

本文主要介绍隧道技术,代理搭建的方法在另一篇文章讲述: 内网入口——代理搭建&端口转发

隧道大致可分为两类:

  • 点到点(IP2IP):建立在网络层及以下,用于局域网之间的隧道通信,数据经过网络边界后变为明文传输
  • 端到端(Port2Port):建立在传输层及以上,用于主机之间的隧道通信

可应用为PPTP、L2TP、IPSec、SOCK4/5、SSL等VPN隧道,其中PPTP和L2TP工作在链路层,IPSec工作在网络层,SOCK4/5工作在传输层,SSL工作在应用层,应根据不同的场景和需要选择相应的VPN隧道,VPN隧道技术这里不作介绍。

封装技术 即使用一种协议封装另一种协议(如:VoIP),利用网关设备拆包解析,实现不同类型网络的互连互通。

隧道和封装技术通常一起使用,下面介绍几种常见隧道&封装技术及实现方法:

(一)SSH隧道

SSH隧道提供端到端的加密,支持双向通信,主要用于:

  • 将其他TCP端口的通信通过SSH连接进行转发
  • 用SSH作为传输层协议,对流量自动加密
  • 突破防火墙访问规则限制

注意:建立隧道(侦听端口)和访问端口(数据传输)是两个独立的过程。

1.本地端口转发

LAN主机运行SSH客户端并侦听本机端口,通过建立SSH隧道,将经过隧道的流量转发到远程主机Server指定端口,基本原理如下图所示:

本地端口转发原理

图2 本地端口转发原理

实现方法:

首先修改Transfer主机SSH服务配置,在/etc/ssh/sshd_config中配置:

PermitRootLogin  yes   # 默认情况下不允许以root权限登录
Port  53
PasswordAuthentication  yes

systemctl restart ssh.service重启SSH服务,然后在LAN主机 (10.10.11.131) 配置SSH隧道:

ssh -fCNg -L <listen port>:<server ip>:<server port> user@<transfer ip> -p <transfer port>
# -f:后台运行进程
# -C:压缩通信流量,提高访问速度
# -N:不执行登录shell
# -g:复用访问时作为网关,支持其他主机访问本地侦听端口
# -L:监听本机端口,SSH Client与监听端口位于同一侧

ssh -fCNg -L 7001:10.10.11.128:80 root@10.10.11.129 -p 53
# 随后LAN主机访问10.10.11.131主机的7001端口实现SSH隧道访问

2.远程端口转发

由于ACL、防火墙规则等原因,SSH与应用建立连接方向相反,此时需要SSH远程端口转发。此时,Transfer运行SSH客户端并侦听端口,通过建立SSH隧道,将LAN主机的访问流量转发到远程主机Server指定端口 (之所以称为远程端口转发,是因为SSH Client和侦听端口不在隧道同一端),基本原理如下图所示:

远程端口转发原理

图3 远程端口转发原理

实现方法:

LAN主机上配置SSH服务,监听53端口,方法同前,然后在Transfer (10.10.11.129) 配置SSH隧道:

ssh -fCN -R <lister port>:<server ip>:<server port> user@<lan ip> -p <lan port>
# -f:后台运行进程
# -C:压缩通信流量,提高访问速度
# -N:不执行登录shell
# -g:复用访问时作为网关,支持其他主机访问本地侦听端口
# -R:监听远程端口,SSH Client与监听端口位于不同侧

ssh -fCN -R 7002:10.10.11.128:80 root@10.10.11.131 -p 53
# 随后在10.10.11.131主机访问本机7002端口实现SSH隧道访问

注意:
① 端口转发基于SSH隧道实现,在建立隧道时创建,不能为已有隧道增加端口转发
② 远程端口转发ssh命令-g参数失效,必须从侦听端口的主机访问
③ 通信过程中只有SSH隧道的流量是加密的,LAN主机访问侦听端口以及Transfer访问Server过程是明文传输,若想进一步保证机密性,要使LAN中访问Server与开放SSH侦听端口为同一台主机,Transfer和Server为同一台主机

3.动态端口转发

本地和远程SSH端口转发都是固定转发IP和端口,每访问一个新的IP:端口地址,就要新建一个SSH隧道,效率低,而且实际应用过程常常遇到以下情况:

  • 客户端访问应用繁多,可能对应不同服务器
  • 一些应用端口不固定
  • 部分网站不支持IP直接访问

这时需要使用SSH动态端口转发解决,相当于在端口侦听的主机上开了sock4/5代理,可以访问Transfer能够访问到的网络范围,如下图所示:

动态端口转发原理

图4 动态端口转发原理

实现方法:

Transfer主机配置SSH服务,方法同前,然后在LAN主机 (10.10.11.131) 配置SSH隧道:

ssh -CfNg -D 7010 root@10.10.11.129 -p 53  
# 相当于在开启SSH隧道的同时,在LAN主机本地侦听sock4/5代理端口

在LAN主机设置sock代理为10.10.11.131:7010,随后LAN主机访问10.10.11.131主机的7010端口实现SSH隧道访问。

(二)DNS隧道

DNS协议工作在TCP/UDP 53端口,UDP端口用于DNS解析请求,TCP端口用于同一个域下DNS服务器数据同步,一般小型局域网都会使用公网DNS服务器作为本地DNS服务器,所以如果防火墙限制严格,完全可以禁止TCP流量出站,此时基于TCP端口的隧道失效(如SSH隧道),需要搭建基于UDP的隧道。一般防火墙至少会开放UDP 53端口,可以利用DNS协议的工作原理实现UDP隧道,

DNS工作及隧道实现原理如下图所示,本地主机(域名转发服务器)到本地域名服务器之间为递归查询,本地域名服务器到权威域名服务器之间为迭代查询,图中黄色箭头代表指派关系,即本级域名服务器由上一级域名服务器指派

DNS隧道原理

图5 DNS隧道原理

DNS隧道实现的前提是指派受自己控制的三级域名服务器 (利用域名服务商提供的域名服务器管理界面,管理所申请域名的主机记录,同时也可以指派下一级子域的域名服务器)

1.Dns2tcp

(1)基本介绍

使用Dns2tcp实现DNS隧道连接:

  • C/S架构,客户端运行dns2tcpc,服务器端运行dns2tcpd
  • 建立隧道的命令置于FQDN记录的主机名部分,为使命令大小限制尽可能大,通过查询TXT记录加密数据传输
  • 隧道建立后根据TTL时间重发隧道保持数据包
  • 基于此隧道可嵌套其他隧道技术
(2)使用方法

图5中三级域名服务器作为dns2tcp服务端,配置文件/etc/dns2tcpd.conf,然后运行服务:

# 配置/etc/dns2tcpd.conf
listen = 0.0.0.0      # 接受所有主机的访问请求
port = 53             # 侦听端口
user = nobody         # 使用nobody用户运行服务
chroot = /tmp
key = password        # 隧道建立时需要验证身份        
domain = a.lab.com    # 所要解析子域的域名,自身作为该域的域名服务器
resource = ssh:127.0.0.1:22, socks:127.0.0.1:2048 # 隧道建立后提供的服务(资源)

dns2tcpd -F -d 1 -f /etc/dns2tcpd.conf
# 启动服务端程序
# -F:前端运行
# -d:debug level 1-3,级别越高越详细
# -f:指定配置文件

LAN主机作为客户端进行访问:

dns2tcpc -c -k password -d 1 -l 2222 -r ssh -z a.lab.com
# -c:通信过程启用压缩算法
# -k:身份验证密钥信息
# -d:debug level
# -l:侦听端口
# -r:指定访问服务(资源)
# -z:要解析的域名(运行dnstcpd的域名服务器)

命令运行后,LAN主机开始侦听本机2222端口,建立隧道的准备工作已完成,接下来在本机使用ssh root@127.0.0.1 -p 2222连接2222端口,实现服务(资源)访问,这些服务的协议在隧道传输时封装在DNS协议中,到达dns2tcpd服务端后解包。

dns2tcpc只能侦听本地的2222端口,LAN中其他主机对其无法实现访问,要想实现网关功能,需要隧道嵌套DNS隧道一端已经侦听在LAN本机2222端口,然后利用ssh命令在接入本机2222端口的基础上,新建动态端口转发隧道

ssh -CfNg -D 7070 root@127.0.0.1 -p 2222 

2.Iodine

(1)基本介绍

Iodine与同类DNS隧道工具相比的优点:

  • 对下行数据不进行编码,效率更高
  • 支持多平台:Linux、BSD、Mac OS、Windows
  • 强制密码支持,安全性更好
  • 最大16个并发连接(隧道)
  • 协商确定适合当前环境的DNS查询类型
  • 自动运行隧道质量检测工具,通信环境差时自动断开连接

与Dns2tcp不同的是,Iodine建立的隧道具有如下特点:

  • C/S架构,客户端运行iodine,服务器端运行iodined
  • 不基于资源的通用隧道,如同本网段内两台相邻的主机通信
  • 客户端和服务器端会生成隧道网络接口dns0和接口IP地址
  • dns0接口IP地址应不同于客户端和服务端的IP网段
(2)使用方法

首先在受控的三级域名服务器运行服务端:

iodined -f 192.168.1.1 a.lab.com
# -f:前端显示
# 192.168.1.1为服务器端隧道dns0接口IP地址

然后在LAN主机客户端运行命令:

iodine -f a.lab.com 

隧道建立后需要借助其他工具,进一步实现SOCK代理、HTTP代理等功能,如嵌套SSH隧道实现SOCK代理功能:在用Iodine建立DNS隧道、服务端配置SSH服务的基础上,在LAN主机客户端用ssh命令构建动态端口转发隧道,实现隧道嵌套。

ssh -D 4321 -CfNg root@127.0.0.1

3.Ncat

被称为众多NC衍生版软件中最优的选择,包含在Nmap工具包中,除了具备NC所有的功能外,还具有代理、隧道等功能。

代理功能:

ncat -l 8080 --proxy-type http --proxy-auth user:password
# 侦听本地8080端口实现http代理功能
# 可以指定运行代理服务的用户和密码

Broker中介功能:
连接到Ncat broker模式的客户端相当于连接到了一个HUB,其中任意一个客户端发送的信息都会被其他客户端接收。

可以应用在如下所示环境:A<->B不能访问,但是A->C和B->C可以访问,在C上运行ncat broker模式,A、B同时用ncat与之连接,这样A向C发送的消息或命令就可绕过防火墙规则限制,转发给B,如下图所示。
Ncat broker模式应用场景

图6 Ncat broker模式应用场景

使用方法:

ncat -l 3131 --broker
# 服务端开启侦听本地3131端口

ncat 10.10.11.128 3131
ncat 10.10.11.128 --sh-exec "echo `pwd`"
# 所有连接到ncat服务端的主机会共享发送的消息

(三)ICMP隧道

Ptunnle

(1)基本介绍

使用Ptunnle实现ICMP隧道连接:

  • 通过ICMP echo(ping requests)和reply(ping reply)实现隧道
  • 适用于只允许ping出站流量的环境
  • 支持并发连接(隧道)
  • 支持身份验证
  • 需要root权限
  • 基于此隧道可嵌套其他隧道技术
(2)使用方法

服务端运行:

ptunnle -x password
# -x:设置隧道连接密码

客户端运行:

ptunnle -x password -p 10.10.11.128 -lp 2222 -da 10.10.11.129 -dp 22
# -p:ptunnle连接到的服务端IP
# -lp:在客户端本机侦听的端口
# -da:将流量转发到的目标主机IP
# -dp:将流量转发到的目标主机端口

Ptunnle客户端与服务端(10.10.11.128)建立ICMP隧道,并在客户端本机侦听2222端口,这样本机访问2222端口的流量将被转发到目标主机(10.10.11.129)的22端口,如在客户端使用ssh root@127.0.0.1 -p 2222即可登录目标主机。

同时可嵌套SSH隧道实现网关转发功能:在Ptunnle实现ICMP隧道、服务端配置SSH服务的基础上,在客户端用ssh命令构建动态端口转发隧道,实现隧道嵌套。

ssh -CNfg -D 7009 root@127.0.0.1 -p 2222

(四)HTTP/HTTPS代理隧道

Proxytunnle

(1)基本介绍

使用Proxytunnle实现HTTP/HTTPS隧道连接:

  • 通过标准的HTTP/HTTPS代理创建隧道
  • 通过HTTP CONNECT方法封装信息
  • 适用于内网使用代理并且防火墙只允许代理服务器上网的场景,可以规避基于应用层过滤的规则

适用场景如下图所示,LAN中只有代理服务器能够上网,且防火墙仅允许HTTP/HTTPS流量出站,此时可以搭建HTTP/HTTPS代理隧道,隧道一端是内网代理,另一端是外网代理,外网代理将经由隧道的数据包进一步转发给目标服务器。

HTTP/HTTPS代理隧道原理

图7 HTTP/HTTPS代理隧道原理

(2)使用方法

环境准备:配置内网和外网代理,安装squid并侦听80端口,在/etc/squid/squid.conf中修改配置

apt install squid

# 在/etc/squid/squid.conf中修改配置
http_port 10.10.11.128:3128
http_access allow !Safe_ports
http_access allow all

squid    # 开启代理服务,侦听本地3128端口

在LAN中一台主机运行Proxytunnle,搭建到本机代理的隧道并开启侦听端口:

proxytunnle -a 8800 -p 127.0.0.1:3128 -r 10.10.11.129:80 -d 10.10.11.128:22
# -a:本机侦听端口
# -p:指定内网HTTP/HTTPS代理
# -r:指定远程HTTP/HTTPS代理
# -d:指定远程目标服务器

ssh msfadmin@127.0.0.1 -p 8800
# 通过ssh连接隧道一端的侦听端口,从而连接到远程服务器(metasploitable:10.10.11.128)的sshd服务

(五)SSL/TLS隧道

Stunnel4

(1)基本介绍

使用Stunnel4实现SSL/TLS隧道连接:

  • 在无需修改原代码的情况下将TCP流量封装于SSL/TLS通道内
  • 适用于本身不支持加密传输的应用
  • 支持OpenSSL安全特性
  • 跨平台,性能优

适用场景如下图所示,防火墙仅允许SSL/TLS 443端口流量出站,此时可以搭建SSL/TLS隧道,隧道一端是Stunnel Client,另一端是Stunnel Server,通过访问Client侦听端口,进而访问到隧道另一端设定的资源。

SSL/TLS隧道原理

图8 SSL/TLS隧道原理

(2)使用方法

首先在Stunnel Server上准备SSL/TSL通信环境:

openssl req -new -days 365 -nodes -x509 -out /etc/stunnel/stunnel.pem -keyout /etc/stunnel/stunnel.pem
# 生成自签证书
# -x509:签名标准
# -nodes:不要加密生成的密钥
# -keyout:将私钥和证书一起存储

然后配置Stunnel Server,新建/etc/stunnel/stunnel.conf,配置MySQL资源,在目标服务器配置相应服务:

# /etc/stunnel/stunnel.conf
cert = /etc/stunnel/stunnel.pem
setuid = 113                  # 设置运行服务账号为stunnel,113为stunnle的uid
setgid = 120                  # 设置运行服务账号为stunnel,120为stunnle的gid
pid = /var/run/stunnel4/stunnel4.pid

[mysql]                       # 定义访问资源
accept = 0.0.0.0:443          # 侦听443端口  
connect = 10.10.11.128:3306   # 连接目标服务器(10.10.11.128)的3306端口

stunnel4命令启动服务,接下来配置Stunnel Client,同样新建/etc/stunnel/stunnel.conf

client = yes

[mysql]                       # 定义与Server相同的访问资源
accept = 3030                 # 本机侦听端口
connect = 10.10.11.129:443    # 隧道另一端访问的Server,要符合防火墙规则 

stunnel4命令启动Stunnel Client,建立隧道,然后在本机用mysql -u root -h 127.0.0.1 -P 3030命令访问本地侦听端口,通过隧道访问远程目标服务器 (10.10.11.129) 的MySQL服务。

  • 2
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值