笔记内容参考安全牛课堂苑房弘老师的Kali Linux渗透测试教程
重定向流量的IP和端口,不提供加密处理,明文传输,实现简单,机密性差。原理如下图所示,只要边界防火墙开放至少一个端口,就有流量重定向的可能。
图1 重定向原理
应用场景:
Rinetd可以用来重定向TCP流量,在Transfer主机安装,然后在/etc/rinetd.conf
中进行配置:
# bindaddredd bindport connectaddress connectport
10.10.11.121 53 10.10.11.122 80
rineted
命令启动,这样LAN中主机与Transfer的53端口交互的流量,都会被转发到Server的80端口,在边界防火墙看来,出入站的流量仅流经TCP 53端口,符合既定规则。
隧道技术 即使用多种加密技术在网络节点之间建立安全管道,在不受信任的网络环境中实现安全通信,本质是一种端口转发技术。
分为两类隧道:
可应用为PPTP、L2TP、IPSec、SOCK4/5、SSL等VPN隧道,其中PPTP和L2TP工作在链路层,IPSec工作在网络层,SOCK4/5工作在传输层,SSL工作在应用层,应根据不同的场景和需要选择相应的VPN隧道,VPN隧道技术这里不作介绍。
封装技术 即使用一种协议封装另一种协议(如:VoIP),利用网关设备拆包解析,实现不同类型网络的互连互通。
隧道和封装技术通常一起使用,下面介绍几种常见隧道&封装技术及实现方法:
SSH隧道提供端到端的加密,支持双向通信,主要用于:
注意:建立隧道(侦听端口)和访问端口(数据传输)是两个独立的过程。
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 [email protected] -p 53
# 随后LAN主机访问10.10.11.131主机的7001端口实现SSH隧道访问
由于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 [email protected] -p 53
# 随后在10.10.11.131主机访问本机7002端口实现SSH隧道访问
注意:
① 端口转发基于SSH隧道实现,在建立隧道时创建,不能为已有隧道增加端口转发
② 远程端口转发ssh命令-g参数失效,必须从侦听端口的主机访问
③ 通信过程中只有SSH隧道的流量是加密的,LAN主机访问侦听端口以及Transfer访问Server过程是明文传输,若想进一步保证机密性,要使LAN中访问Server与开放SSH侦听端口为同一台主机,Transfer和Server为同一台主机
本地和远程SSH端口转发都是固定转发IP和端口,每访问一个新的IP:端口
地址,就要新建一个SSH隧道,效率低,而且实际应用过程常常遇到以下情况:
这时需要使用SSH动态端口转发解决,相当于在端口侦听的主机上开了sock4/5代理,可以访问Transfer能够访问到的网络范围,如下图所示:
图4 动态端口转发原理
在Transfer主机配置SSH服务,方法同前,然后在LAN主机 (10.10.11.131) 配置SSH隧道:
ssh -CfNg -D 7010 [email protected] -p 53
# 相当于在开启SSH隧道的同时,在LAN主机本地侦听sock4/5代理端口
在LAN主机设置sock代理为10.10.11.131:7010,随后LAN主机访问10.10.11.131主机的7010端口实现SSH隧道访问。
DNS协议工作在TCP/UDP 53端口,UDP端口用于DNS解析请求,TCP端口用于同一个域下DNS服务器数据同步,一般小型局域网都会使用公网DNS服务器作为本地DNS服务器,所以如果防火墙限制严格,完全可以禁止TCP流量出站,此时基于TCP端口的隧道失效(如SSH隧道),需要搭建基于UDP的隧道。一般防火墙至少会开放UDP 53端口,可以利用DNS协议的工作原理实现UDP隧道,
DNS工作及隧道实现原理如下图所示,本地主机(域名转发服务器)到本地域名服务器之间为递归查询,本地域名服务器到权威域名服务器之间为迭代查询,图中黄色箭头代表指派关系,即本级域名服务器由上一级域名服务器指派。
图5 DNS隧道原理
DNS隧道实现的前提是指派受自己控制的三级域名服务器 (利用域名服务商提供的域名服务器管理界面,管理所申请域名的主机记录,同时也可以指派下一级子域的域名服务器)。
使用Dns2tcp实现DNS隧道连接:
图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 [email protected] -p 2222
连接2222端口,实现服务(资源)访问,这些服务的协议在隧道传输时封装在DNS协议中,到达dns2tcpd服务端后解包。
dns2tcpc只能侦听本地的2222端口,LAN中其他主机对其无法实现访问,要想实现网关功能,需要隧道嵌套:DNS隧道一端已经侦听在LAN本机2222端口,然后利用ssh命令在接入本机2222端口的基础上,新建动态端口转发隧道:
ssh -CfNg -D 7070 [email protected] -p 2222
Iodine与同类DNS隧道工具相比的优点:
与Dns2tcp不同的是,Iodine建立的隧道具有如下特点:
首先在受控的三级域名服务器运行服务端:
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 [email protected]
被称为众多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,如下图所示。
图6 Ncat broker模式应用场景
使用方法:
ncat -l 3131 --broker
# 服务端开启侦听本地3131端口
ncat 10.10.11.128 3131
ncat 10.10.11.128 --sh-exec "echo `pwd`"
# 所有连接到ncat服务端的主机会共享发送的消息
使用Ptunnle实现ICMP隧道连接:
服务端运行:
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 [email protected] -p 2222
即可登录目标主机。
同时可嵌套SSH隧道实现网关转发功能:在Ptunnle实现ICMP隧道、服务端配置SSH服务的基础上,在客户端用ssh命令构建动态端口转发隧道,实现隧道嵌套。
ssh -CNfg -D 7009 [email protected] -p 2222
使用Proxytunnle实现HTTP/HTTPS隧道连接:
适用场景如下图所示,LAN中只有代理服务器能够上网,且防火墙仅允许HTTP/HTTPS流量出站,此时可以搭建HTTP/HTTPS代理隧道,隧道一端是内网代理,另一端是外网代理,外网代理将经由隧道的数据包进一步转发给目标服务器。
图7 HTTP/HTTPS代理隧道原理
环境准备:配置内网和外网代理,安装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 [email protected] -p 8800
# 通过ssh连接隧道一端的侦听端口,从而连接到远程服务器(metasploitable:10.10.11.128)的sshd服务
使用Stunnel4实现SSL/TLS隧道连接:
适用场景如下图所示,防火墙仅允许SSL/TLS 443端口流量出站,此时可以搭建SSL/TLS隧道,隧道一端是Stunnel Client,另一端是Stunnel Server,通过访问Client侦听端口,进而访问到隧道另一端设定的资源。
图8 SSL/TLS隧道原理
首先在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服务。