一, 前言
在 基于 DNS 的数据窃取开源测试工具篇(一) 中, 简要分析了 DET 基于 DNS 进行数据窃取部分的源码. 本文将继续探讨图 1 中所示的 PyExfil 中利用 DNS 完成数据窃取的部分.
图 1 DET,PyExfil,DNSExfiltrator 的首页展示
二, PyExfil 工具简介
PyExfil 项目 [1] 本身是一个测试库, 作为 python 库的形式提供给用户使用, 该工具实现了多种数据泄露技术, 包括攻击者在真正的攻击活动中已经或正在使用的部分技术. 开源该工具的初衷是帮助用户在自己的系统中快速部署, 从而帮助用户快速部署, 用于检测其系统抵抗数据泄露的能力.
PyExfil 工具实现了大量的相关技术, 分别在网络, 通信, 物理, 隐写等模块中实现, 模块分类及对应技术详情见表 1:
模块分类 | 技术详情 |
---|---|
网络模块 | DNS 查询 、HTTP Cookie、ICMP Echo8、NTP Request、BGP Open、HTTPS Replace Certificate、QUIC、Slack、POP3 身份验证、FTP MKDIR、Source IP Based Exfiltration、HTTP Response |
通信模块 | NTP Request、DropBox LSP、DNS Over TLS、ARP Broadcast、JetDirect、GQUIC、MDNS Query、AllJoyn |
物理模块 | Audio、QR Code、WIFI Frame Payload |
隐写模块 | 图像二进制偏移、Video Dictionary、Braille Text Document |
表 1 PyExfil 的模块分类及其包含的技术统计
PyExfil 整体项目结构梳理如图 2. 本文关注的 DNS 窃密部分位于网络模块中, dns_exfil.py 文件是该工具利用 DNS 完成窃密的具体实现.
图 2 PyExfil 项目结构概况
三, 基于 DNS 的数据窃取的源码简要分析
(一)服务端源码简要分析
图 3 PyExfil 的服务端源码概况
服务端源码梳理及工作流程如图 3, 通过源码分析, 整理其窃密数据接收, 恢复的主要过程如下:
(1) socket 绑定设定端口并监听所有数据, 分别提出数据(DNS 请求包的所有数据部分), 地址.
(2) 在数据中查找包类型标识符, 并根据包类型采取对应的处理方法. 其中包类型及其判别依据见表 2.
包类型 | 判别依据 |
---|---|
初始化包 | “ INIT_445 “+ 文件名 +”::”+CRC32 |
窃密数据包 | “\x00\x00\x01\x00\x01″+ 数据 +”\xcc\xcc\xcc\xcc\xff\xff\xff\xff” |
结束包 | “\xcc\xcc\xcc\xcc\xff\xff\xff\xff”+”::”+”\xcc\xcc\xcc\xcc\xff\xff\xff\xff” |
表 2 PyExfil 的包类型及其判别依据对应关系
(3) 服务端将根据不同的包类型采取不同的处理方法:
) 初始化包: 从包中提取即将传送文件的重要信息: 文件名, CRC32 校验值.
) 窃密数据包: 从包中提取窃取的文件数据, 增量保存到变量 actual_file 中.
) 结束包: 标志着文件传输结束, 则通过 CRC32 校验后恢复文件到本地, 并回复客户端 "OK".
(二)客户端源码简要分析
图 4 PyExfil 客户端源码概况
客户端源码及主要工作流程梳理如图 4, 通过源码分析, 整理其构造, 编码, 发送窃密数据的主要过程如下:
(1) 参照 DNS 协议各字段, 以服务端域名为基础构造一个普通的 DNS 请求, 存储到 dns_request.
(2) 按制定的窃密文件路径, 将文件数据读入内存, 并计算其 CRC32 值.
(3) 通过 socket 发送初始化包. 其中, 初始化包的组成结构大致如图 5(dns_request 由步骤 (1) 生成).
图 5 PyExfil 初始化包的组成结构
(4) 通过 socket 逐个发送文件数据块. 其中, 窃密数据包组成结构如图 6.
图 6 PyExfil 窃密数据包的组成结构
(5) 当所有文件数据块发送完毕后, 通过 socket 发送结束包. 其中, 客户端构造的结束包组成结构如图 7.
图 7 PyExfil 结束包的组成结构
总结与思考:
PyExfil 部署实验环境后, 模拟执行数据窃取后的不同类型流量包情况分别如图 8, 图 9, 图 10.
图 8 初始化包流量包情况
图 9 窃密数据包流量情况
图 10 结束包流量情况
通过以上分析, PyExfil 具有明显的特征: PyExfil 利用 DNS 的方式特点明显 -- 在 DNS 请求的同一个 UDP 包中, 先构造 DNS 普通 DNS 请求包, 窃密数据附加到 DNS 协议内容以外的区域, 即窃密数据位置在 DNS 协议规定的内容之外.
但综合来看, PyExfil 在实验调试中也发现了一些问题:
(1) 文件数据明文传输, 打开 Pcap 包可以直接看到二进制数据对应窃密字符串.
(2) 窃密数据包没有编号, 且没有任何重传机制, 在网络状况较差时, 文件恢复失败率较高.
(3) 源码中 DNS 请求部分为手动编码输入, 结果是传输同一个窃密文件时, 有很多内容相同的 DNS 请求 -- 这本身就是一种异常.
(4) 源码中只在成功恢复文件后响应客户端请求 "Got it,OK"; 为了减小异常, 可以考虑对每个请求构造响应, 且为自己定义的 A 记录值.
参考链接:
[1] PyExfil 项目地址 https://github.com/ytisf/PyExfil
来源: http://www.tuicool.com/articles/YzeIrqU