0×1 概述
关于
xplico的目标在于从抓取的网络流量处还原应用中的数据。
例如:xplico可以从pcap包中还原出每一封邮件(POP,IMAP,SMTP协议),所有的http内容等等.Xplico并不是协议分析工具,而是网络取证工具。
特性
支持 HTTP,SIP,IMAP,POP,SMTP,TCP,UDP等协议的还原;
端口无关协议的解码探测;
多线程处理机制;
输出数据存储在SQLite或mysql数据库中,并有原始文件输出;
解码后的有xml描述流相关信息;
有实时捕获能力(与计算机硬件性能有关);
有TCP中ACK校验能力;
DNS解析能力;
对输入包大小没有要求;
支持IPV4与IPV6;
模块化,每一个单独的功能都是模块.输入,解码器,输出均为模块,可自由组合;
有自行定制解码器能力。
构成
Xplico系统由以下4小系统构成:
一个解码管理器叫做DeMa;
一个IP解码器叫做Xplico;
一组主要应用解码器(HTTP解码器,SMTP解码器等);
一个结果输出界面。
使用的语言:
C;
python;
php;
JavaScript。
0×2 架构
整体架构
Xplico系统:
Xplico系统由以下4小系统构成:
一个解码管理器叫做DeMa
一个IP解码器叫做Xplico
一组主要应用解码器(HTTP解码器,SMTP解码器等)
一个结果输出界面
各自的关系如下图所示:
数据流示例
通过一个解码数据流的例子,可以更直观的展示整套系统是如何工作的
通过main()方法,调用CapInit()方法来初始化可能用到的捕获模块,然后调用CapMain()来开始捕获过程.CapInit()方法会指定一个捕获模块,Capmain()方法会调用这个模块.在使用pcap文件的例子中,使用了 cap_pcap.so这个模块,故在CapMain()中,会调用 capt_dissectors/pcap/pcap.c:CaptDisMain()方法.
当过程进行到 PCAP捕获模块时, pcap_loop(pcap处理流程)就会被调用.然后每个包都会被PcapDissector()处理. ProtDissec()函数有一整个过程,能将包发送到正确的解码器上进行解码.
0×3 解码管理器模块
解码管理器(Dema)有以下功能:
规范化输入数据
初始化解码设置选项,初始化历史文件,解码器,分配器
启动解码器和分配器
操作解码器和分配器
0×4 解码模块概述
Xplico的解码模块可以在整体架构中使用,也可以单独使用.解码器的最大特点是模块化,扩展性,和可配置
解码器的设计是为了独立于输入数据(原始数据)和输出数据的格式
在Xplico中的数据流和信息流如下图所示:
原始的数据输入到 “capture dissector”(抓取分析) 模块,然后被送到protocol(协议分析)模块,最后被重组和拼接的数据被送到dispatcher(分配)模块
dispatcher(分配模块)会重新组织数据或者发给其他应用(比如分配器),如果需要的话
故 Xplico 是由一下3个类型的模块组成的:
抓取模块
解析模块
分配模块
下图展示了模块化的 Xplico ,系统内核是模块内部链接的基础
上述模块的配置工作是通过配置文件来进行的.所以,选择或者创建合适的抓取和分配模块,Xplico可以在很多的场景下使用。
0×5 模块
介绍
Xplico读取网络流量(抓取模块),从该数据中解析出协议信息(解析模块),然后把信息发送到需要的目的模块去(分配模块)
解码器的每一个部分都是一个插件,也就是所谓的模块.在Xplico(解码器)中,我们把模块分为以下三个种类:
抓取模块: 理论上能够接入任何数据获取系统
解析模块: 这些模块负责协议解码,针对不同的协议有不同的解码器
分配模块: 这些模块理论上能够把数据发送到任何数据存储系统(目录/文件,SQLite.Oracle,MySQL,网络socket发送,能想得到的),这些都可以实现,并且不影响到协议分析模块.
抓取模块
抓取模块在源代码的 capt_dissectors 的第一层目录中. pcap 抓取模块用来抓取pcap包的流量, rltm(有可能是 ‘real time’的缩写)模块抓取网卡的流量.
解析模块
这些模块从流量中提取特定于协议的信息,可以在解析器顶层目录中找到。 它们被分为每个支持的协议(eth,ip,tcp,…)的子目录。
FTP解析模块
目前,FTP PEI.cmd组件指向存储FTP会话的明文的文件。 如果想提取FTP命令和会话响应(从调度程序内部),建议 使用两个选项。 第一个(也是最简单的)将是解析给定的文件名并获取信息。 第二个选项是修改解析器以将此信息包含为PEI组件。
TCP解析模块
为了避免流之间的同步问题(例如,FTP的命令和数据通道),建议您使用名为tcp_soft的TCP解析器。 我们已经开发了两个独立的TCP解析器,用于两种不同的需求。 两者都提供相同的数据到上层的解析器(FTP,POP,SMTP),但具有不同的时间限制(不同的流之间)。 我们的“应用”解析器(TCP上的解析器)被设计为与两个TCP解析器正常工作。
分配模块
分配模块将数据导出到目标,无论是数据库(SQLite,Postgres,…),一组目录和文件,网络套接字,或任何您想要的地方。这些可以在调度顶级目录中找到。
要创建自己的分配程序,您需要实现位于xplico-src / dispatch / dispatch.h的接口。具体来说,您将需要实现3个函数:DispInit(),DispEnd(),DispInsPei()。 DispInit()通常用于设置特定于您的分配程序要使用的协议的ID号,并且还可以设置分配程序可能需要的其他任何内容(套接字,数据库连接等) – 我相信这个函数只能在分配器调用一次。 DispInsPei()被多次调用,每次都将一个指针传递给协议元素信息(PEI)对象(见下文)。调用DispEnd()来清理清理所需的任何东西(关闭文件/套接字句柄,数据库连接等)
如果您正在创建自己的分配程序,并发现无法从协议的PEI组件导出所需的协议信息,则需要修改相应的解析器,以便包含/构造所需的信息。
提示:为了通过捕获/解码时间输出数据,请查看pei.time和pei.time_cap。
PEI 协议元素信息
PEI数据结构的定义可以在xplico-src / dispatch / include / pei.h中找到。 PEI包含元数据和PEI组件列表。Xplico支持的每个协议都有一个解析器,可以从流量数据解码协议信息,然后将该信息编码为特定于协议的PEI格式。给定协议的PEI格式由相应解析器模块中的DissecRegist()函数定义,并且可以使用-i选项从命令行查看。例如,FTP PEI在xplico-src / dissectors / ftp / ftp.c:DissecRegist()中定义。目前,PEI组件的值可以是一个字符串(由解析器中的PeiCompAddStingBuff()产生)或一个文件(由解析器中的PeiCompAddFile()产生)。解析模块负责从原始数据包构建PEI,然后将这些PEI分配给分配模块(通过调用它们的DispInsPei()函数)进行输出。
并非所有的解析模块都会生成PEI;比如TCP解析器,IP解析器,UDP解析器,和Ethernet解析器
操纵器
操纵器PEI之前允许执行一些操作。 它们在捕获分离器→协议解析器→调度程序链中的作用可以在这里描述:
过程略
操纵器可以对PEI文件进行更改,并且重新发送给分配器。
文章评论