对 Cobalt Strike DNS隧道的理解与实战

0x01 开始之前,有必要先稍微理解下基于dns beacon的大致通信过程,其实,非常非常简单,前提是你对dns的解析过程早已经烂透于心,不熟悉的朋友可以先去参考前段时间写的 [DNS 深度理解 一] ,把基础打扎实了,再回过头来理解这些东西自然就易如反掌了

1
2
3
-> beacon shell会向指定的域名发起正常的dns查询
-> 中间依然是经过一些列的常规dns迭代及递归查询,大致过程就是,一直从根开始找,直到找到我们自己的ns服务器,最后再定位到团队服务器ip,仅此而已
-> 也就是说,第一次通信可能会慢点,后续就会稍微快些,不过说实话,dns再快也快不到哪里去,毕竟,我们要的是足够的隐蔽,而不一味追求速度,不然容易露点

 

0x02 废话说完,我们就开始来尝试在实战中应用,首先,你要先买台vps,亚马逊或者vultr都挺不错的,自己也一直在用,之后装好系统,推荐用ubuntu,此处演示用的是ubuntu 16.04.2,具体的系统安装方法直接一路点点点就好了,全程傻瓜化,大概等个六七分钟,待系统初始化完成就可以用ssh连上去了
  

0x03 成功连到vps上以后,接着就开始配置jdk,关于对jdk版本的选择需要稍微注意下,jdk版本和cobalt strike版本务必要保持兼容,因为演示的用的是cobalt strike 3.8,所以此处就用的jdk1.8,如下,则是jdk在Ubuntu中的具体配置过程

1
2
3
4
5
6
7
8
9
10
wget http://enos.itcollege.ee/~jpoial/allalaadimised/jdk8/jdk-8u152-linux-x64.tar.gz
tar xf jdk-8u152-linux-x64.tar.gz
mv jdk1.8.0_152/ /usr/local/
ln -s /usr/local/jdk1.8.0_152/ /usr/local/jdk
# vi /etc/profile
export JAVA_HOME=/usr/local/jdk/
export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH
export CLASSPATH=.$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib:$JAVA_HOME/lib/tools.jar
# source /etc/profile
# java -version

 

0x04 搞定vps,再紧接着就要去准备域名了,推荐直奔 godaddy,别问我为什么,以后你就会明白的,注册域名时切记千万不要用真实的个人信息,别用太扎眼的字符,如,hack,sec,fuck,rootkit,backdoor 之类,不然,别人一眼就看出来了,可以选择注册一些非常常规的,如 shop,book,之类……相对还容易蒙混过关,域名搞定以后,就可以来配置解析了,如下,首先,你要创建一条A记录,A记录务必要指向我们自己团队服务器的ip,而后再创建几条ns记录,此处创建了三个ns记录,实际中还可以更多些,然后再把所有ns记录的A记录指向刚刚创建的A记录,也就是说,让解析可以准确的找到我们的团队服务器位置,此处是整个过程最核心的一步,务必要好好理解

0x05 域名解析配置完成后,我们可以拿 dig +trace 域名先来简单跟踪下域名解析过程,看看我们的ns最后是不是被解析到了之前指定的A记录上,如果解析不到,也就意味着你的payload回连时很可能就定位不到团队服务器,后果就是无法正常上线,此处务必成功,再往后继续,否则都是徒劳

0x06 一切准备就绪,在本地用cobalt strike客户端连到我们的团队服务器上,创建监听器和payload,注意,这里的payload要选择beacon_dns,host要用A记录的域名,端口随意,最好用一些穿透性比较强的端口

此处是用于解析上述A记录的ns服务器域名,把我们之前创建的那三个ns域名全部加进去,用逗号隔开即可

最后,再基于此listener创建payload,丢到目标机器上执行,稍微等一下,即可看到目标成功上线后的效果,如下

此时,再回到目标机器上看看都发生了什么,首先,是目标机器不停发送针对我们域名的dns请求,因为它最终要定位到团队服务器把封装在里面的数据传给它

再来看看目标机器的进程端口,我们发现只有进程,似乎没端口,其实并不是没端口,而是在睡眠,我们暂时看不见而已



后话:
    俗称 域名上线,只不过底层用的是dns协议,而非http,https,或者udp…使用dns的好处,想必就不用再多说了,大家应该早都熟透了,域名相对于ip有更强的隐蔽性,而且它相对比较固定,只要没被发现,解析到的ip是可以随便换的,也就是说,不用担心你的权限再因为这样的原因掉了,这样也给了我们更多的灵活性,另外,cobalt strike也非常轻量,在目标机器上几乎是感觉不到的,在你自己团队没有很强的RAT能力时,Cobalt Strike将会是个非常不错的替代品,因为一些原因,没法说的很详细,大家如果有问题,可以随时在公众号中私信交流 ^_^

from 

https://klionsec.github.io/2017/12/28/cobalt-strike-dns/