碳基体

奋斗在产品安全第一线的安全妹子

十一、TCP/IP数据包分析应用-TCP会话重组

一、基本概念

IP分片重组 IP Defragmentation

IP包最大为65535字节,而以太网的最大传输单元MTU为1500字节,则每一个大于

1500字节的IP数据包都将会被分片,然后到对端再重组。




TCP 流重组 TCP stream reassembly

将多个TCP报文重组为一个报文, 以ftp匿名账号登陆为例

 以下为TCP报文发送时序图,注意红色字体部分,为数据传输部分

  

通过tcp会话重组后,我们可以看到从tcp连接开始到tcp连接断开的一次完整tcp会话中客户端到服务端Data_client_to_server, 

服务端到客户端Data_server_to_client的数据传输,还原一次完整的ftp认证过程(ftp认证协议

 。

  

二、实现

1.源码

https://github.com/tanjiti/packet_analysis

2.功能

通过读取pcap包或从指定的网络接口进行包的嗅探,然后根据配置项,打印相应的tcp会话数据,其中可以调用应用协议解析工具将会话数据解析为人可读的信息。

3.配置文件

https://github.com/tanjiti/packet_analysis/blob/master/etc/server.yaml 

  (1) 数据包捕获配置

is_handle_tcp: 1 #是否处理tcp数据包
is_handle_udp: 0 #是否处理udp数据包
is_handle_ip: 0 #是否处理ip数据包


(2)网络接口配置项: 

 device_enable: 0 是否开启从网卡读取数据包

 device: en0 指定哪个网络接口


(3)pcap包配置项:

pcap_file_enable: 1 是否开启从pcap包读取数据

pcap_file: data/pcap_pub/wireshark/RDP-002.pcap 指定pcap包的路径


(4)包过滤条件配置项:

bpf_filter:tcp or udp BPF过滤规则

dst_tcp_port_filter: [21, 3389, 27017, 6379, 5432, 22, 3306, 25,80,8080,8118,91] #按目标端口进行过滤,tcp包有会话重组
dst_tcp_ip_filter: [] #按TCP目标IP进行过滤
src_tcp_port_filter: [] #按TCP源端口进行过滤
src_tcp_ip_filter: [] #按TCP源IP进行过滤

udp_port_filter: [53] #53 按UDP端口进行过滤
udp_ip_filter: [] #按UDP IP进行过滤


(5)输出配置项:

data_level: 2 输出数据信息的相信程度,当大于1时,支持hex与ASCII显示

data_stream_direct:2 当设置为2时,数据积累到tcp会话结束时(tcp flag为rst,fin,或tcp流超时)打印双向流量(客户端到服务端和服务端到客户端);当设置为1时,数据有data部分传输时(tcp flag为push)打印单向数据流(客户端到服务端或服务端到客户端),仅tcp数据包有效


std_output_enable: 1 是否在标准输出中显示结果


file_output_enable: 0 是否将结果存储到文件中

file_tcpsession_path: data/tcpudpdata/dns.pcap 指定结果输出文件路径

sqlite3_output_enable: 1 #是否将ip数据包统计信息存储到sqlite3
sqlite3_output_path: data/ip_packet/ip_statistic.db #sqlite3数据库路径
sqlite3_output_schema: data/ip_packet/ip_statistic.sql #sqlite3数据库模式
sqlite3_renew: 0 #是否清空数据库,重新写入


(6) 协议解析插件配置

protocol_parse_conf 根据端口号开启对应的协议解析

http: [80]


4.实例

 解析mysql数据包,提取认证信息

配置项如下

tcp_stream_handler:
device_enable: 0 #是否从网卡读取数据包
device: en0

pcap_file_enable: 1 #是否从pcap读取数据包
pcap_file: data/pcap_pub/wireshark/mysql_complete.pcap

bpf_filter: tcp #包过滤条件,目前只支持tcp bpf
dst_port_filter: [21,22,25,5432,3306,6379,27017,3389]#[25] #按目标端口进行过滤
dst_ip_filter: [] #按目标IP进行过滤

data_level: 2  #输出数据信息的详细程度,当大于1时,输出对应十六进制数据
data_stream_direct: 2 #输出单向数据流,或双向数据流

std_output_enable: 1 #捕获数据包是否标准输出

file_output_enable: 1 #捕获数据包是否文件输出
file_tcpsession_path: data/tcpsessiondata/mysql_complete.txt

运行

python print_tcp_session.py

读取解析结果

{'crack_detail': '\x00tfoerste\x00eefd6d5562851bc5966a0b41236ae3f2315efcc4\x00', 'src_port': 56162, 'ts_duration': 99.282870054245, 'service': 'mysql', 'ts_end': 1216281124.419116, 'crack_result': 1, 'src_ip': '192.168.0.254', 'dst_port': 3306, 'dst_ip': '192.168.0.254', 'ts_start': 1216281025.136246}


192.168.0.254:56162发起对mysql服务器192.168.0.254:3306的认证请求,用户名为tfoerste,密码hash为eefd6d5562851bc5966a0b41236ae3f2315efcc4 ,认证通过








参考:

http://www.cnblogs.com/chenyadong/archive/2011/12/17/2291157.html

http://www.linuxnote.org/libnids-api-chinese-version.html

来源:碳基体

评论