P2P协议识别.docx
《P2P协议识别.docx》由会员分享,可在线阅读,更多相关《P2P协议识别.docx(17页珍藏版)》请在冰豆网上搜索。
P2P协议识别
P2P协议识别
技术方案
报告人:
时间:
1
Gnutella0.4协议
1.1端口特征识别
缺省端口:
6346/6347/6348
1.2流量特征识别
IPP2P识别方案:
gnutellatcp
检查gnutella的get命令
如果tcppayload的最初9个字节的内容为"GET/get/",或最初的13个字节为"GET/uri-res/"即为gnutella
检查gnutella的get命令和其他特定字段
如果tcppayload的最初17个字节的内容为"GNUTELLACONNECT/",或者最初的9个字节的内容为"GNUTELLA/"。
即为gnutella
如果tcppayload的最初9个字节的内容为"GET/get/",或最初的13个字节为"GET/uri-res/"
若ippayload长度大于tcp头部长度+30,此时如果指针自tcppayload右移8个字节,指针所指的内容中第一个字节为0x0d,第二个字节为0x0a,匹配"X-Gnutella-",或"X-Queue:
",匹配成功则为gnutella,(详情参看代码)
Gnutellaudp
如果udppayload的最初3个字节的内容为"GND",或者最初的9个字节的内容为"GNUTELLA/"。
即为gnutella
L7Filter识别方案:
^(gnd[\x01\x02]?
.?
.?
\x01|gnutellaconnect/[012]\.[0-9]\x0d\x0a|get/uri-res/n2r\?
urn:
sha1:
|get/.*user-agent:
(gtk-gnutella|bearshare|mactella|gnucleus|gnotella|limewire|imesh)|get/.*content-type:
application/x-gnutella-packets|giv[0-9]*:
[0-9a-f]*/|queue[0-9a-f]*[1-9][0-9]?
[0-9]?
\.[1-9][0-9]?
[0-9]?
\.[1-9][0-9]?
[0-9]?
\.[1-9][0-9]?
[0-9]?
:
[1-9][0-9]?
[0-9]?
[0-9]?
|gnutella.*content-type:
application/x-gnutella|..................lime)
我们的识别方案:
连接查询过程:
Payload的第17个字节是命令ID,其值为:
0x00,0x01,0x80,0x81,0x40,(扩展:
0x02,0x10,0x30,0x31,0x32),从第20到23这4个字节,是其后的Payload长度,即(Payload长度-23)。
与IP中的报文长度(3-4字节)相比,中间应该相差IP头(20B)、TCP/UDP头(8B/20B)、Gnutella头23B
下载过程:
下载遵守HTTP协议。
下载请求的以GET/get///HTTP开头,后面匹配User-Agent:
的内容以Gnutella/开头。
返回文件数据时,以HTTP/x.x200OK\r\n开头,后面匹配Server:
的内容是Gnutella/y.y\r\n.
1.3协议特征提取
●连接阶段
如果ClientA向SuperNodeB发起Gnutella连接,将进行以下通讯:
1.首先进行TCP三次握手。
2.连接成功后,A通过TCP发送:
GNUTELLACONNECT/x30/x2e/x36/0x0d/0x0a……
……可以匹配的有用的字段:
Listen-IP:
162.105.130.97:
6346(这个具体是什么还不清楚)
以下分为两种响应情况:
成功Gnutella连接:
3.成功响应为,B发送响应消息:
GNUTELLA/0.6200OK/0x0d/0x0a……
4.A接到响应消息后,发送响应:
GNUTELLA/0.6200OK/0x0d/0x0a……
……没有什么对检测有意义的字段:
不成功Gnutella连接:
5.如果连接失败,B会发送消息:
GNUTELLA/0.6?
?
?
/0x0d/0x0a……
6.终止TCP连接,B会发起Fin包
*上面的过程是普通节点和超级节点之间建立连接的过程;它可以推广到普通节点和普通节点之间,超级节点和超级节点之间的连接建立。
●Ping/Pong过程
检测到Ping消息:
从IP头中得到源IP
从TCP头中得到源Port
从Payload中得到描述ID
写一条网络节点发现日志,sip=源IP,sport=TCP端口,snodeid=描述ID,snodetype=1(normal)
检测到Pong消息:
从IP头中得到源IP
从TCP头中得到源Port
从Payload中得到侦听端口
从Payload中得到侦听IP
从Payload中得到共享文件个数
从Payload中得到共享文件千字节数
写一条网络节点发现日志,sip=侦听IP,sport=侦听端口,snodetype=1(normal),filecount=共享文件个数,filesize=共享文件千字节数
●Query/QueryHit过程
检测到Query消息:
从IP头中得到源IP
从TCP头中得到源Port
从Payload中得到查找字符串
写一条用户查询日志,sip=源IP,sport=TCP端口,keyword=查找字符串,action=query
检测到QueryHit消息:
从IP头中得到源IP
从TCP头中得到源Port
从Payload中得到查找到的文件个数n(用于分析后面的结果集)
从Payload中得到响应端口
从Payload中得到响应IP
从Payload中得到返回结果集(n个结果详细结构:
包括文件Index,文件大小,文件名…)
写若干条网络资源日志,sip=响应IP,sport=响应端口,fileid=文件Index,filesize=文件大小,filename=文件名
●HTTP下载过程
检测到HTTP文件请求消息:
从IP头中得到源IP
从TCP头中得到源Port
从Payload中得到文件Index
从Payload中得到文件名
检测到HTTP应答消息:
从IP头中得到源IP
从TCP头中得到源Port
从Payload中得到文件类型
从Payload中得到文件长度
写一条用户下载日志,sip=源IP,sport=源Port,dip=目的IP,dport=目的Port,fileid=文件Index,filetype=文件类型,filename=文件名,filesize=文件长度,action=download
2eDonkey2000/eMule协议
2.1端口特征识别
TCP缺省4662侦听口;UDP缺省4672侦听口。
2.2流量特征识别
IPP2P识别方案:
EDKTCP
Edonkey传输命令的识别(快速识别)
指针自Tcppayload的初始位置,右移5个字节的内容为0x47,即为EDK
较慢的识别方式:
如果Tcppayload的初始位置的内容为0xe3,且如果自初始位置右移1个字节,取两个字节的内容content=ip包长–tcp头部长度-5,则若自Tcppayload的初始位置右移5个字节,取一个字节,
其内容=0x1则为Client:
helloorServer:
hello;
其内容=0x4c则为Client:
Hello-Answer;
否则若content>ip包长–tcp头部长度-5,则若自Tcppayload的初始位置右移3个字节,和右移四个字,各取一个字节的内容均为0,此时若则若自Tcppayload的初始位置右移5个字节,取一个字节,其内容=0x1,则为EDK
EDKUDP
自udppayload初始位置始的第一个字节,为0xe3(edonkey)时,
在第二个字节为0x9a,若(ip包长-10)模16为零时,即为EDK;
在第二个字节为0x96时,若ip包长为14,即为EDK;
在第二个字节为0x94时,若(ip包长-10)模20为零时,即为EDK。
自udppayload初始位置始的第一个字节,为0xc5(emule)时,
若第二个字节为0x91,且若第三个字节不等于0,并且ip包长为12,即为EDK;
若第二个字节为0x90,且若第三个字节不等于0,并且ip包长为26,即为EDK;
若第二个字节为0x92,并且ip包长为10,即为EDK;
若第二个字节为0x93,并且ip包长为10,即为EDK。
自udppayload初始位置始的第一个字节,为0xe4(kad)时,
若第二个字节为0x50,并且ip包长为12,即为EDK;
若第二个字节为0x58,且若第三个字节不等于0,并且ip包长为14,即为EDK;
若第二个字节为0x59,并且ip包长为10,即为EDK;
若第二个字节为0x30,且若第19个字节等于1,并且ip包长大于26,即为EDK;
若第二个字节为0x28,且若第69个字节等于0,并且ip包长大于76,即为EDK;
若第二个字节为0x20,且若第3个字节不等于0,并且ip包长等于43,且第35个字节不等于0,即为EDK;
若第二个字节为0x00,且若第27个字节等于0,并且ip包长等于35,即为EDK;
若第二个字节为0x10,且若第27个字节等于0,并且ip包长等于35,即为EDK;
若第二个字节为0x18,且若第27个字节等于0,并且ip包长等于35,即为EDK;
若第二个字节为0x40,且若第20个字节等于0,且第19个字节等于1,并且ip包长大于40,即为EDK;
若第二个字节为0x52,并且ip包长等于44,即为EDK;
L7Filter识别方案:
^[\xe3\xc5\xe5\xd4].?
.?
.?
.?
([\x01\x02\x05\x14\x15\x16\x18\x19\x1a\x1b\x1c\x20\x21\x32\x33\x34\x35\x36\x38\x40\x41\x42\x43\x46\x47\x48\x49\x4a\x4b\x4c\x4d\x4e\x4f\x50\x51\x52\x53\x54\x55\x56\x57\x58\x5b\x5c\x60\x81\x82\x90\x91\x93\x96\x97\x98\x99\x9a\x9b\x9c\x9e\xa0\xa1\xa2\xa3\xa4]|\x59................?
[-~]|\x96....$)
TCP流:
前面三个握手协议没法甄别。
后面的消息具有以下特征:
1、Payload的第一个字节为e3(eDonkey)或c5(eMule)。
2、IP包中取得2字节IP报文长度x(bigendian),Payload的第2-5字节(littleendian)y之间的差应该为45(IP头长度+TCP头长度+eDonkey头)。
3、Payload的第6个字节是消息类型,对于关键信息的提取非常重要。
UDP流:
1、Payload的第一个字节为e3(eDonkey)或c5(eMule)。
2、Payload的第2个字节是消息类型,对于关键信息的提取非常重要。
每个不同消息里要提取什么信息,根据日志格式的要求来提取。
2.3协议特征提取
登录过程:
0x01消息:
(下面的字节数是相应部分的相对位置,如:
Payload中e3开始的相对位置)
从IP头中获得源IP(13B-16B);
从TCP头中获得源Port(0B-1B);
从Payload中获得用户Hash(7B-22B);
从Payload中获得TCP侦听端口(27B-28B);
从Payload中获得名字标签(33B开始:
02010001<2字节名字长,名字>)
0x40消息:
(下面的字节数是相应部分的相对位置,如:
Payload中e3开始的相对位置)
从Payload中获得客户端ID(7B-10B);
写一条网络节点发现日志,sip=源IP,sport=TCP侦听端口,suserid=用户Hash,suername=<2字节名字长,名字>,snodeid=客户端ID,snodetype=1(normal);
写一条网络节点登录日志,sip=源IP,sport=源Port,suserid=用户Hash,suername=<2字节名字长,名字>,snodeid=客户端ID,snodetype=1(normal);action=login;
0x34消息:
(下面的字节数是相应部分的相对位置,如:
Payload中e3开始的相对位置)
从Payload中获得服务器用户数(7B-10B);
从Payload中获得服务器文件数(11B-14B);
0x41消息:
(下面的字节数是相应部分的相对位置,如:
Payload中e3开始的相对位置)
从IP头中获得源IP(13B-16B);
从Payload中获得服务器Hash(7B-22B);
从Payload中获得TCP侦听端口(27B-28B);
从Payload中获得名字标签(33B开始:
02010001<2字节名字长,名字>)
写一条网络节点发现日志,sip=源IP,sport=TCP侦听端口,suserid=服务器Hash,suername=<2字节名字长,名字>,snodetype=2(server);nodecount=服务器用户数,filecount=服务器文件数;
文件发布过程:
0x15消息:
(下面的字节数是相应部分的相对位置,如:
Payload中e3开始的相对位置)
从IP头中获得源IP(13B-16B);
从Payload中获得文件个数(7B-10B)用于解析后面的信息
从Payload中获得文件Hash(参考下面格式);
从Payload中获得客户端ID(高)(参考下面格式);
从Payload中获得客户端Port(高)(参考下面格式)
从Payload中获得文件名/文件大小/文件类型(参考下面格式);
描述
字节数
范围
说明
文件Hash
16B
文件唯一标识
客户端ID
4B
高ID,低ID此项为0
客户端Port
2B
0x15
高ID时TCP端口,低ID此项为0
标签个数
4B
文件名标签
可变
String标签,名为0x01
文件大小标签
8B
Integer标签,名为0x02
文件类型标签
可变
String标签,名为0x03
文件格式标签
可变
String标签,名为0x04
媒体长度标签
4B
String标签,名为length
媒体bit率标签
TBD
Integer标签,名为bitrate
媒体编解码标签
可变
String标签,名为codec
写一条文件资源日志,sip=源IP,sport=客户端Port(高),snodeid=客户端ID(高),fileid=文件Hash,filename=文件名标签,filesize=文件大小标签,filetype=文件类型标签
查询过程:
0x16消息:
(下面的字节数是相应部分的相对位置,如:
Payload中e3开始的相对位置)
从IP头中获得源IP(13B-16B);
从TCP头中获得源Port(0B-1B);
从Payload中获得解析查找串\文件类型约束\最小大小约束\最大大小约束(参考下面格式);
描述
字节数
范围
说明
加密
备注
消息类型
1B
0x16
类型标记
否
解析查找串
可变
*解析查找树
文件类型约束
可变
**可选
010003
最小大小约束
可变
**可选
01010002
最大大小约束
可变
**可选
02010002
可用性约束
可变
**可选
01010015
文件名扩展约束
可变
**可选
010003
0x33消息:
(下面的字节数是相应部分的相对位置,如:
Payload中e3开始的相对位置)
从Payload中获得结果个数(7B-10B)用于解析后面的信息
从Payload中获得文件Hash(参考下面格式);
从Payload中获得客户端ID(参考下面格式);
从Payload中获得客户端Port(参考下面格式)
从Payload中获得文件名/文件大小/文件类型(参考下面格式);
描述
字节数
范围
说明
备注
文件Hash
16B
文件唯一标识
客户端ID
4B
保存文件客户端ID
客户端Port
2B
保存文件客户端port
标签个数
4B
文件属性个数
标签列表
可变
**文件属性列表
属性名
标签值
标签类型
备注
文件名
Integer,0x01
String
文件大小
Integer,0x02
Integer
文件类型
Integer,0x03
String
文件格式
Integer,0x04
String
……
……
……
写一条用户查询日志,sip=源IP,sport=源Port,snodeid=客户端ID,keyword=解析查找串,sizelimit=最小大小约束,filetype=文件类型约束,filecount=结果个数,action=query
写若干文件资源日志,sport=客户端Port,snodeid=客户端ID,fileid=文件Hash,filename=文件名标签,filesize=文件大小标签,filetype=文件类型标签
0x19消息:
(下面的字节数是相应部分的相对位置,如:
Payload中e3开始的相对位置)
从IP头中获得源IP(13B-16B);
从TCP头中获得源Port(0B-1B);
从Payload中获得文件Hash(7B-22B);
0x42消息:
(下面的字节数是相应部分的相对位置,如:
Payload中e3开始的相对位置)
从Payload中获得文件Hash(7B-22B);
从Payload中获得下载源数目(23B);
从Payload中获得下载源列表(下载源数目*6B)
写一条用户查询日志,sip=源IP,sport=源Port,fileid=文件Hash,filecount=下载源数目,action=query
写一条文件资源日志,filelocation=下载源列表,fileid=文件Hash
客户端互联过程:
0x01消息:
(下面的字节数是相应部分的相对位置,如:
Payload中e3开始的相对位置)
从IP头中获得源IP(13B-16B);
从TCP头中获得源Port(1B-2B);
从Payload中获得用户Hash(8B-23B);
从Payload中获得客户端ID(24B-27B);
从Payload中获得TCP侦听端口(28B-29B);
从Payload中获得用户名(可选);
写一条网络节点发现日志,sip=源IP,sport=TCP侦听端口,suserid=用户Hash,suername=<2字节名字长,名字>,snodeid=客户端ID,snodetype=1(normal);
共享文件查询:
0x4B消息:
(下面的字节数是相应部分的相对位置,如:
Payload中e3开始的相对位置)
从IP头中获得源IP(13B-16B);
从Payload中获得结果个数(7B-10B)用于解析后面的信息
从Payload中获得文件Hash(参考下面格式);
从Payload中获得客户端ID(参考下面格式);
从Payload中获得客户端Port(参考下面格式)
从Payload中获得文件名/文件大小/文件类型(参考下面格式);
描述
字节数
范围
说明
备注
文件Hash
16B
文件唯一标识
客户端ID
4B
保存文件客户端ID
客户端Port
2B
保存文件客户端port
标签个数
4B
文件属性个数
标签列表
可变
**文件属性列表
属性名
标签值
标签类型
备注
文件名
Integer,0x01
String
文件大小
Integer,0x02
Integer
文件类型
Integer,0x03
String
文件格式
Integer,0x04
String
……
……
……
写若干文件资源日志,sip=源IP,sport=客户端Port,snodeid=客户端ID,filelocation=<源IP,客户端Port(高)>,fileid=文件Hash,filename=文件名标签,filesize=文件大小标签,filetype=文件类型标签
文件下载过程:
0x59消息:
(下面的字节数是相应部分的相对位置,如:
Payload中e3开始的相对位置)
从IP头中获得源IP(13B-16B);
从TCP头中获得源Port(1B-2B);
从IP头中获得目的IP(17B-20B);
从TCP头中获得目的Port(3B-4B);
从Payload中获得文件ID(7B-22B);
从Payload中获得文件名长度n(23B-24B);用于解析后面的文件名信息
从Payload中获得文件名(25B-(24+n)B);
0x55消息:
(下面的字节数是相应部分的相对位置,如:
Payload中e3开始的相对位置)
写一条文件下载日志,sip=源IP,sport=客户端Port,dip=目的IP,dport=目的Port,fileid=文件ID,filename=<文件名长度,文件名>,action=downloadstart,
0x46消息:
(下面的字节数是相应部分的相对位置,如:
Payload中e3开始的相对位置)
从IP头中获得源IP(13B-16B);
从TCP头中获得源Port(1B-2B);
从IP头中获得目的IP(17B-20B);
从TCP头中获得目的Port(3B-4B);
从Payload中获得文件ID(7B-22B);
从Payload中获得开始位置(23B-26B);
从Payload中获得结束位置(27B-30B);
写一条文件下载日志,sip=源IP,sport=客户端Port,dip=目的IP,dport=目的Por