利用机器学习进行DNS隐蔽通道检测——数据收集,利用iodine进行DNS隐蔽通道样本收集
我们在使用机器学习做DNS隐蔽通道检测的过程中,不得不面临样本收集的问题,没办法,机器学习没有样本真是“巧妇难为无米之炊”啊!
本文简单介绍了DNS隐蔽通道传输工具iodine,并介绍如何从iodine的网络流量中抓取DNS报文生成pcap包,并将其转化为机器学习检测算法所能够识别的文本文件。
1、环境准备和iodine安装
DNS隐蔽通道工具iodine分为服务器端程序iodined和客户端程序iodine。服务器端程序iodined提供特定域名的DNS解析服务。当客户端请求该域名的解析,就可以建立通道连接。iodine支持NULL,TXT,SRV,MX,CNAME,A等多种查询请求类型,并且支持EDNS,支持base32,base64,base128等多种编码规范,更多使用方法和功能特性请参考官方文档。
iodine支持直接转发和中继两种模式。客户端和服务端建立通信后,可以看到客户机上多出一块名为dns0的虚拟网卡。本文使用iodine直连模式建立DNS通道。
在安装DNS 通道工具iodine之前,你需要准备2台linux机器,其中一台作为DNS隐蔽通道的Client,另外一台作为目标DNS Server。接下来在两台linux机器上安装iodine。
DNS 通道工具iodine的主页在http://code.kryo.se/iodine/,视你使用的操作系统版本而定,安装过程详见官方文档。安装成功以后,输入iodined --help应该输出类似图3的结果。
图 1 iodined --help帮助文档
2、捕获iodine收发的DNS报文
在iodine的Server机器上,执行:sudo iodined -P passwd -f -DD 192.168.0.1 abc.com
其中,abc.com域名是自定义的传输DNS隐蔽通道数据的主域名,192.168.0.1是自定义输入的虚拟IP,passwd是自定义的密码。
在iodine的Client机器上,开启tcpdump DNS抓包,执行:sudo tcpdump -i <eth0> port 53 -w iodine direct.pcap即可,记得将<eth0>换成你的网卡名。然后执行:sudo iodine -P passwd -f -r -T TXT <your iodine server ip> abc.com
其中,<your iodine server ip> 需要替换成iodine server端机器的IP(两台机器在同一个内网里的话,填写内网IP即可)。
上述步骤操作成功后,在Client和Server机器控制台上可以看到如下输出:
图2 iodine Client端输出
图3 iodine Server端输出
从图3可以看出,iodine在建立DNS通道连接的过程中,使用了大量的特殊字符子域名。而在DNS报文中包含大量的不符域名规范的子域名是DNS隐蔽通道的检测特征之一。
查看Server和Client端的网卡配置,可以看到两台机器都多出了dns0的虚拟网卡。
图4 Client端在建立iodine DNS通道后多出了dns0虚拟网卡
图5 Server端在建立iodine DNS通道后多出了dns0虚拟网卡
实际上,访问server端设定的192.168.0.1 IP地址和直接访问iodine server机器IP是一样的,例如你可以通过ssh root@192.168.0.1来实现对server端机器的远程登录,使用scp来传输文件,甚至使用shadowsocks来反向代理来上网等。
接下来使用wireshark查看tcpdump刚刚抓到的包:
图6 wireshark查看tcpdump抓包
如图6所示,可以看到针对abc.om这个主域名,包含了大量的子域名请求,而这些子域名负责携带外发数据。
由于机器学习的检测算法并不认pcap这种特殊的文件格式,因此需将其转化为检测算法所能够识别的文本文件。我们暂且称这种文本文件为pcap metadata文件吧。
3、从pcap报文生成pcap metadata
pcap metadata文件是由“^”分割的描述网络传输报文的文本文件,其示意格式如下(包含了3条报文):
^^10.0.2.15^45.77.39.243^40812^53^17^^^^^1513249151.379262000^1513249151.573115000^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^0^dnscat.21.nmosubth.6d76676c.3.fegigfcaenejfecaemgjgdgfgohdgfcacienejfecjakakedgphahjhcgjghgi.hecacigdcjcadcdadbdgcaeogjgdglcaengdedgmhfhcgfakedgphahjhcgjgh.gihecacigdcjcadcdadbdgcafagbgdglhecafahfgcgmgjhdgigjgogh.cdcp.directdns^5^0x00000001^193853.139877^1^10.0.2.15;45.77.39.243^^^^^^^^^^^^^^^^^^^^^c56d0100000100000000000006646e73636174023231086e6d6f737562746808366437363637366301333e6665676967666361656e656a66656361656d676a67646766676f6864676663616369656e656a6665636a616b616b656467706861686a6863676a676867693e6865636163696764636a636164636461646264676361656f676a6764676c6361656e67646564676d686668636766616b656467706861686a6863676a67683867696865636163696764636a636164636461646264676361666167626764676c68656361666168666763676d676a68646769676a676f6768046364637009646972656374646e730000050001^^^^^^^^^46^^^^^^^^^^^ |
使用github上的generate_metadata_from_pcap.py 脚本文件将pcap文件转换为metadata文件。值得注意的是在使用该脚本前,需要安装wireshark以便使用tshark命令,否则脚本会抱怨找不到tshark路径。
图7 使用generate_metadata_from_pcap.py 脚本前需要先安装wireshark
接下来,使用:python generate_metadata_from_pcap.py <your pcap file path> <metadata save dir> 即可生成metadata文件了,成功操作后的效果如图8所示。
图8 由pcap文件成功生成metadata文件
最后,就可以将该metadata文件作为样本,用机器学习来进行DNS 隐蔽通道检测了。