如何解决使用Python嗅探协议
我无法使用Python和套接字嗅探更多协议...
我正在嗅探UDP,IPv4,ICMP,TCP。
示例:
import socket
import struct
import textwrap
TAB_1 = '\t - '
TAB_2 = '\t\t - '
TAB_3 = '\t\t\t - '
TAB_4 = '\t\t\t\t - '
DATA_TAB_1 = '\t '
DATA_TAB_2 = '\t\t '
DATA_TAB_3 = '\t\t\t '
DATA_TAB_4 = '\t\t\t\t '
# Main
def main():
conn = socket.socket(socket.AF_PACKET,socket.soCK_RAW,socket.ntohs(3))
while True:
raw_data,addr = conn.recvfrom(65536)
dest_mac,src_mac,eth_proto,data = ethernet_frame(raw_data)
print('\nEthernet Frame:')
print(TAB_1 + 'Destination: {},Source{},Protocol: {}'.format(dest_mac,eth_proto))
# 8 for IPv4
if eth_proto == 8:
(version,header_length,ttl,proto,src,target,data) = ipv4_packet(data)
print(TAB_1 + '\033[0;37;41m IPv4 Packet: \033[0m ')
print(TAB_2 + 'Version: {},Header Length: {},TTL: {} '.format(version,ttl))
print(TAB_2 + 'Protocol: {},Source: {},Target: {}'.format(proto,target))
#ICMP
if proto == 1:
icmp_type,code,checksum,data = icmp_packet(data)
print(TAB_1 + '\033[0;37;42m ICMP Packet: \033[0m ')
print(TAB_2 + 'Type: {},Code: {},Checksum: {},'.format(icmp_type,checksum))
print(TAB_2 + 'Data: ')
print(format_multi_line(DATA_TAB_3,data))
#TCP
elif proto == 6:
(src_port,dest_port,sequence,ackNowledgegement,flag_urg,flag_ack,flag_psh,flag_rst,flag_syn,flag_fin,data) = tcp_segment(data)
print(TAB_1 + '\033[0;37;43m TCP segment: \033[0m ')
print(TAB_2 + 'Source Port: {},Destination Port: {}'.format(src_port,dest_port))
print(TAB_2 + 'Sequence: {},AckNowledgment: {}'.format(sequence,ackNowledgegement))
print(TAB_2 + 'Flags: ')
print(TAB_3 + 'URG: {},ACK: {},PSH: {},RST: {},SYN: {},FIN: {}'.format(flag_urg,flag_fin))
print(TAB_2 + 'Data:')
print(format_multi_line(DATA_TAB_3,data))
#UDP
elif proto == 17:
src_port,length,data = udp_segment(data)
print(TAB_1 + '\033[0;37;45m UDP Segment: \033[0m')
print(TAB_2 + 'Source Port: {},Destination Port: {},Length: {}'.format(src_port,length))
# Other
else:
print(TAB_1 + '\033[0;37;46m Other: \033[0m')
print(TAB_2 + 'Data: ')
print(format_multi_line(DATA_TAB_3,data))
# Unpack ethernet frame
def ethernet_frame(data):
dest_mac,proto = struct.unpack('! 6s 6s H',data[:14])
return get_mac_addr(dest_mac),get_mac_addr(src_mac),socket.htons(proto),data[14:]
# Return properly formatted MAC address (ie AA:BB:CC:DD:EE:FF)
def get_mac_addr(bytes_addr):
bytes_str = map('{:-2x}'.format,bytes_addr)
return ':'.join(bytes_str).upper()
# Unpacks IPv4 packet
def ipv4_packet(data):
version_header_length = data[0]
version = version_header_length >> 4
header_length = (version_header_length & 15) * 4
ttl,target = struct.unpack('! 8x B B 2x 4s 4s',data[:20])
return version,ipv4(src),ipv4(target),data[header_length:]
#Returns properly fomatted IPv4 address
def ipv4(addr):
return '.'.join(map(str,addr))
# Unpacks ICMP packet
def icmp_packet(data):
icmp_type,checksum = struct.unpack('! B B H',data[:4])
return icmp_type,data[4:]
# Unpacks TCP segment
def tcp_segment(data):
(src_port,offset_reserved_flags) = struct.unpack('! H H L L H',data[:14])
offset = (offset_reserved_flags >> 12) * 4
flag_urg = (offset_reserved_flags & 32) >> 5
flag_ack = (offset_reserved_flags & 16) >> 4
flag_psh = (offset_reserved_flags & 8) >> 3
flag_rst = (offset_reserved_flags & 4) >> 2
flag_syn = (offset_reserved_flags & 2) >> 1
flag_fin = offset_reserved_flags & 1
return src_port,data[offset:]
# Unpacks UDP segment
def udp_segment(data):
src_port,size = struct.unpack('! H H 2x H',data[:8])
return src_port,size,data[8:]
# Formats multi-line data
def format_multi_line(prefix,string,size=80):
size -= len(prefix)
if isinstance(string,bytes):
string = ''.join(r'\x{:02x}'.format(byte) for byte in string)
if size % 2:
size -= 1
return '\n'.join([prefix + line for line in textwrap.wrap(string,size)])
#main()
main()
如何获取其他协议,例如HTTP,HTTPS,ARP等?
我正在研究数据包分析器,因为我需要统计信息量,因为我需要绘制服务器工作的数据包以检测可能的威胁,从而更多地关注DDoS或DoS攻击
解决方法
如何获取其他协议,例如HTTP,HTTPS,ARP等?
与要实现的复杂任务相比,您是从一个很小的代码库(可能是知识)开始的。因此,我只能给您一些提示,说明您的代码可能需要朝哪个方向发展-其他所有内容都太宽泛了。
HTTP和HTTPS是TCP之上的应用程序协议。因此,如果您嗅探TCP,您也会隐式地嗅探这些协议-但您需要能够根据协议规范来解析所嗅探的有效负载-即阅读标准。同样,您甚至需要开始重新组装TCP流之前,甚至可以开始分析基于TCP的应用程序协议。
关于ARP:您只关心ETH_P_IP(0x0800),但是ARP是ETH_P_ARP(0x0806)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。