导语:在APT攻击日益严重的今天,只有不断了解并掌握更加高级且不寻常的攻击手法,才能在内网沦陷之前做好严密的防护。

摘要

在APT攻击日益严重的今天,只有不断了解并掌握更加高级且不寻常的攻击手法,才能在内网沦陷之前做好严密的防护。利用DNS建立VPN连接进行网络传输用的正是一种非常隐蔽且不寻常的手法。

概述

当我们被IDS或者防火墙阻断的时候,我们通常开始使用 [DNSCat] 作为一种在约定期间秘密传输数据的手段。同时,DNS 协议经常被系统管理员所忽视,因此,这个工具就一直非常有用。  

虽然也有其他的 DNS 隧道连接VPN的解决方案,但是 DNSCat却是我们惯用的方法,因为它有以下几个优点:

- 1) 集中式的服务器使得管理起来很简单
- 2) 命令行工具使用起来也很方便
- 3) 支持加密传输 
- 4) 可以自由免费的使用

但是这个工具有个缺点:不具有建立从客户端到服务器的传输隧道的能力。也就是说DNScat建立的隧道是单向的,只能从服务器到客户端。

目标

能否在DNS中实现一个双向连接的VPN并且支持所有的网络协议,而不仅仅是TCP?这个idea可以当你在机场,酒店或者那些可以进行DNS解析却被限制网络连接的情况下将会非常有用。同样,对于进行内网渗透想要建立秘密传输隧道的攻击者来说也非常有用。DNSCat 支持建立TCP传输隧道,并且是单向的,例如:从服务端到客户端,这个类似于 SSH -L 的功能。  

解决问题

DNScat的作者 Ron 提到过他会打算构建双向传输隧道的功能,但是从目前的情况来看,我们能够解决这个问题得到我们想要的结果。  

要解决这个问题,我们需要以下几个步骤:  

域名

首先需要注册一个域名。作为演示,我们在 freedns.afraid.org 注册了一个域名——**mooo.com**。要注意的是,我们只需要关注NS记录是否指向了我们的服务器也就是运行着 DNScat的服务器。  

 1.jpg

服务器

在服务器上面我们需要做几件事,首先需要设置 ssh 密钥:  

ssh-keygen

接下来,设置服务器允许IP路由:  

echo 1 > /proc/sys/net/ipv4/ip_forward

之后运行 DNScat,下面是一些我们用到的命令行参数:  

- -c 指定客户端与服务器之间的预共享密钥。这个参数是可选的,在本文的演示中,我们会使用该参数对传输添加一个加密层。
- -u 指定服务器自动附加到入站的DNSCat 客户端会话中。
- -a 指定服务器在每个新的客户端会话中执行指定的命令。按照文档的说明“listen”命令将会在服务器的2222端口与客户端建立传输隧道,并且所有来自客户端的连接都会被中转到服务器的22端口中。例如,要把浏览器的传输流量进行中转只需要执行这个命令即可 'listen 127.0.0.1:8080 www.google.com:80' 。

1486105858940587.jpg

在服务器启动之后,我们接下来看看客户端需要做什么。

客户端

这里不会赘述如何编译客户端,有关的说明可以在Github的readme页面中找到。编译好客户端需要以root权限运行它。在运行客户端之前,需要修改标准的sshd配置文件,有以下三个参数需要改变:  

- 注释掉 'PermitRootLogin without-password'
- 添加 'PermitRootLogin yes'
- 添加 'PermitTunnel yes'

之后,重启sshd服务,并且允许客户端主机的IP路由:  

# /etc/init.d/ssh restart
# echo 1 > /proc/sys/net/ipv4/ip_forward

当允许中转后,我们就可以连接到服务器了。从下图中可以看到的确建立了传输连接。 

1486105919461752.jpg

接下来的一步是将我们的密钥从服务器推送到客户端。为此,需要在服务器上运行以下命令︰  

scp /root/.ssh/id_rsa.pub [email protected]:/root/.ssh/authorized_keys -P 2222

请注意,当被提示输入凭据时,需要输入的是客户端机器上的 root 密码。  

一旦服务器 ssh 密钥已被推到客户端后,就建立了一条从服务器到客户端且基于 SSH 的 vpn 隧道 (-w) 。  

ssh -i /root/.ssh/id_rsa [email protected] -p 2222 -w 1:1 -o TCPKeepAlive=yes -o ServerAliveInterval=50 &

如果执行成功的话,你现在应该会在客户端和服务器上看到新的网络接口 tun1 。在这两台机器上,你需要提供用于NAT网络地址转换的 IP、路由地址以及IP地址表。  

**服务器**  

ifconfig tun1 address 172.16.254.2 netmask 255.255.255.252
ifconfig tun1 up
route add [client network]/[netmask] via 172.16.254.1 dev tun1
iptables -t nat -A POSTROUTING -o tun1 -j MASQUERADE

**客户端(通过ssh执行)**

ssh -i /root/.ssh/id_rsa [email protected] -p 2222 'ifconfig tun1 address 172.16.254.1 netmask 255.255.255.252'
ssh -i /root/.ssh/id_rsa [email protected] -p 2222 'ifconfig tun1 up'
ssh -i /root/.ssh/id_rsa [email protected] -p 2222 'route add [server network]/[netmask] via 172.16.254.2 dev tun1'
ssh -i /root/.ssh/id_rsa [email protected] -p 2222 'iptables -t nat -A POSTROUTING -o tun1 -j MASQUERADE'

现在,服务器与客户端的VPN连接就能达到双向连接了。如果想要转发所有通信流量,只需要设置默认的路由就行了。

最后的一点思考

此解决方案,虽然有效但是传输速度比较慢。而且这只能工作在 *nix 系统中。不过好的一面是,这个方法能够在建立的隧道中把所有的 TCP、UDP 和 ICMP 通信流量路由到正确的IP地址。这样的话,在内网渗透时就可以进行全端口扫描和流量代理。

源链接

Hacking more

...