开源网络取证工具Xplico架构浅析

2017-04-17 14,450

本文《开源网络取证工具Xplico架构浅析》 由宜人贷安全应急响应中心 入驻安全脉搏账号发布,作者宜信安全部syp,安全脉搏独家首发表本文,如需要转载,请先联系安全脉搏授权;未经授权请勿转载。

0x1 概述

关于

xplico的目标在于从抓取的网络流量处还原应用中的数据。
例如:xplico可以从pcap包中还原出每一封邮件(POP,IMAP,SMTP协议),所有的http内容等等。Xplico并不是协议分析工具,而是网络取证工具。

特性

  • 支持 HTTP,SIP,IMAP,POP,SMTP,TCP,UDP等协议的还原
  • 端口无关协议的解码探测
  • 多线程处理机制
  • 输出数据存储在SQLite或mysql数据库中,并有原始文件输出
  • 解码后的有xml描述流相关信息
  • 有实时捕获能力(与计算机硬件性能有关)
  • 有TCP中ACK校验能力
  • DNS解析能力
  • 对输入包大小没有要求
  • 支持IPV4与IPV6
  • 模块化,每一个单独的功能都是模块.输入,解码器,输出均为模块,可自由组合
  • 有自行定制解码器能力

构成

Xplico系统

Xplico系统由以下4小系统构成:

  • 一个解码管理器叫做DeMa
  • 一个IP解码器叫做Xplico
  • 一组主要应用解码器(HTTP解码器,SMTP解码器等)
  • 一个结果输出界面

使用的语言

  • C
  • python
  • php
  • JavaScript

0x2 架构

整体架构

Xplico系统

Xplico系统由一下4小系统构成:

  • 一个解码管理器叫做DeMa
  • 一个IP解码器叫做Xplico
  • 一组主要应用解码器(HTTP解码器,SMTP解码器等)
  • 一个结果输出界面

各自的关系如下图所示:
1

数据流示例

通过一个解码数据流的例子,可以更直观的展示整套系统是如何工作的。
通过main()方法,调用CapInit()方法来初始化可能用到的捕获模块,然后调用CapMain()来开始捕获过程。CapInit()方法会指定一个捕获模块,Capmain()方法会调用这个模块。在使用pcap文件的例子中,使用了 cap_pcap.so这个模块,故在CapMain()中,会调用 capt_dissectors/pcap/pcap.c:CaptDisMain()方法.

当过程进行到 PCAP捕获模块时, pcap_loop(pcap处理流程)就会被调用,然后每个包都会被PcapDissector()处理。 ProtDissec()函数有一整个过程,能将包发送到正确的解码器上进行解码.(原文https://www.secpulse.com/archives/57567.html)

 

0x3 解码管理器模块

解码管理器(Dema)有以下功能:

  • 规范化输入数据
  • 初始化解码设置选项,初始化历史文件,解码器,分配器
  • 启动解码器和分配器
  • 操作解码器和分配器

 

0x4 解码模块概述

Xplico的解码模块可以在整体架构中使用,也可以单独使用.解码器的最大特点是模块化,扩展性,和可配置
解码器的设计是为了独立于输入数据(原始数据)和输出数据的格式。
在Xplico中的数据流和信息流如下图所示:
2
原始的数据输入到 “capture dissector”(抓取分析) 模块,然后被送到protocol(协议分析)模块,最后被重组和拼接的数据被送到dispatcher(分配)模块
dispatcher(分配模块)会重新组织数据或者发给其他应用(比如分配器),如果需要的话

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

  • 抓取模块
  • 解析模块
  • 分配模块下图展示了模块化的 Xplico ,系统内核是模块内部链接的基础:

3

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

0x5 模块
介绍

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

 

本文《开源网络取证工具Xplico架构浅析》 由宜人贷安全应急响应中心 入驻安全脉搏账号发布,作者宜信安全部syp,安全脉搏独家首发表本文,如需要转载,请先联系安全脉搏授权;未经授权请勿转载。

 

Tags:

评论  (0)
快来写下你的想法吧!

宜人贷SRC

文章数:2 积分: 2

宜人贷安全应急响应中心(security.yirendai.com)

关注我们

合作伙伴