2021SC@SDUSC
PacketUtils.py
OSSIM-agent源代码分析(十二)
简述
OSSIM Agent的主要职责是收集网络上存在的各种设备发送的所有数据,然后按照一种标准方式(standardized way)有序的发送给OSSIM Server,Agent收集到数据后在发送给Server之前要对这些数据进行标准化处理,这样Server就可以依一种统一的方式来处理这些信息,并且也简化了Server的处理过程。
PacketUtils是包处理函数,在对大量数据收集后,处理数据和检索包能力非常重要的一项工作。
OSSIM作为检测工具,基本的处理和检索功能的完备就是非常重要的一环
相关代码
初始导报:
from binascii import hexlify
import socket, struct, sys
import time
from Logger import Logger
from Utils import dumphexdata
logger = Logger.logger
UDPPacket类
初始化方法,初始化数据,将payload和其他关键数据存入对象中
def __init__(self, data):
self._data = data
(self.sport, self.dport, self.length, self.checksum) = struct.unpack(">HHHH", data[0:8])
self._payload = data[8:]
payload get函数
def getpayload(self):
return self._payload
转存函数,打印相关信息,调用dumpexdata函数
def dump(self):
print "UDP Header"
print "SPORT:%u DPORT:%u LENGTH:%04x CHECKSUM:%04x" % (self.sport, self.dport, self.length, self.checksum)
print "Payload"
dumphexdata(self._payload)
str函数,通过正则表达式,匹配对应的字符串
def __str__(self):
st = """ udp_sport="%u" udp_dport="%u" udp_len="%u" udp_csum="%u" udp_payload="%s" """
st = st % (self.sport, self.dport, self.length, self.checksum, hexlify(self._payload))
return st
TCP包类
TCP格式
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Source Port | Destination Port |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Sequence Number |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Acknowledgment Number |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Data | |U|A|P|R|S|F| |
| Offset| Reserved |R|C|S|S|Y|I| Window |
| | |G|K|H|T|N|N| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Checksum | Urgent Pointer |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Options | Padding |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| data |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
初始化函数: 数据中的TCP头可能是假的,必通过正则及匹配判断所有字段都是正确的或没有解码选项
def __init__(self,data):
self._data = data
(self.sport,self.dport, \
self.seq,self.ack,self.b1,self.b2, \
self.window,self.checksum,
self.urgent)=struct.unpack(">HHIIBBHHH",data[0:20])
self.offset = (self.b1 & 0xf0)>>4
self.res = (self.b1&0xf)|(self.b2&0xc0)<<4
self.__flags = {
1:"C", 2:"E", 4:"U", 8:"A", 16:"P", 32:"R", 64:"S", 128:"F"}
self.__flags_keys = self.__flags.keys().sort()
self.flags = (self.b2 & 0x3f)
self.opt =[]
strlog ="""
tcp packet
sport = %s
dport = %s
seq = %s
ack = %s
b1 = 0x%02x
b2 = 0x%02x
offset = %d
""" % (self.sport,self.dport,self.seq,self.ack,self.b1,self.b2,self.offset)
if self.offset <= 5:
self.payload = data[20:]
else:
optionsize = self.offset*4-20
self.options = data[