这里使用的是kali来搭建本次的实验环境,因为kali里面默认安装了iodine、tcpdump、wireshark等本次实验需要用到的工具,所以省去了不少的工作量。
我安装的kali2020.1版本,镜像可以到官网去下载:https://www.kali.org/downloads/
安装过程可以参考以下博文:
https://blog.csdn.net/weixin_41247970/article/details/104118700
https://blog.csdn.net/weixin_43760909/article/details/104277332
安装中可能会出现网络连接速度不佳导致的明明选择了图形化界面但是最终安装完成后却是命令行界面的情况(我就是这样)想要解决的话可以参考以下博文:https://blog.csdn.net/qq_42514956/article/details/104561883?fps=1&locationNum=2
下面kali安装成功后就可以开始我们收集DNS隐蔽通道的样本了,我们需要准备两台kali机器,一台作为服务端server,一台作为客户端client。
DNS隐蔽通道工具iodine分为服务器端程序iodined和客户端程序iodine。服务器端程序iodined提供特定域名的DNS解析服务。当客户端请求该域名的解析,就可以建立通道连接。iodine支持NULL,TXT,SRV,MX,CNAME,A等多种查询请求类型,并且支持EDNS,支持base32,base64,base128等多种编码规范,更多使用方法和功能特性请参考官方文档:http://code.kryo.se/iodine/
iodine支持直接转发和中继两种模式。客户端和服务端建立通信后,可以看到机器上多出一块名为dns0的虚拟网卡。本文使用iodine直连模式建立DNS通道。
kali默认安装了iodine工具,如果不放心的话可以输入iodined -help,如果有以下结果说明iodine安装正常:
在iodine的Server机器上,执行:sudo iodined -P passwd -f -DD 192.168.0.1 baidu.com
其中,baidu.com域名是自定义的传输DNS隐蔽通道数据的主域名,192.168.0.1是自定义输入的虚拟IP,passwd是自定义的密码。
命令执行后,在Server机器控制台上可以看到如下输出:
然后在iodine的Client机器上,开启tcpdump DNS抓包,执行:sudo tcpdump -i
其中,
执行后,在Client机器控制台上可以看到如下输出:
查看Server和Client端的网卡配置,可以看到两台机器都多出了dns0的虚拟网卡:
使用wireshark查看刚刚抓到的包,可以看到针对baidu.om这个主域名,包含了大量的子域名请求,这些子域名则负责携带外发数据:
本次实验还要实现用深度学习检测DNS隐蔽通道,但是由于机器学习的检测算法并不认pcap这种特殊的文件格式,因此需将其转化为检测算法所能够识别的文本文件。
使用github上的generate_metadata_from_pcap.py脚本文件将pcap文件转换为metadata文件。值得注意的是在使用该脚本前,需要安装wireshark以便使用tshark命令,否则脚本会抱怨找不到tshark路径。
接下来,使用:python generate_metadata_from_pcap.py