安全路透社
当前位置:安全路透社 > 网络转载 > 正文

网络流量抓取与还原系统Xplico架构

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解码器等)

一个结果输出界面

各自的关系如下图所示:

1.png

数据流示例

通过一个解码数据流的例子,可以更直观的展示整套系统是如何工作的

通过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中的数据流和信息流如下图所示:

2.png

原始的数据输入到 “capture dissector”(抓取分析) 模块,然后被送到protocol(协议分析)模块,最后被重组和拼接的数据被送到dispatcher(分配)模块

dispatcher(分配模块)会重新组织数据或者发给其他应用(比如分配器),如果需要的话

故 Xplico 是由一下3个类型的模块组成的:

抓取模块

解析模块

分配模块

下图展示了模块化的 Xplico ,系统内核是模块内部链接的基础

3.png

上述模块的配置工作是通过配置文件来进行的.所以,选择或者创建合适的抓取和分配模块,Xplico可以在很多的场景下使用。

4.png

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文件进行更改,并且重新发送给分配器。

* 本文作者:宜信安全部syp(宜人贷安全应急响应中心)

未经允许不得转载:安全路透社 » 网络流量抓取与还原系统Xplico架构

赞 (0)
分享到:更多 ()

评论 0

评论前必须登录!

登陆 注册