美文网首页python交流学习
想知道如何写一个网络包探嗅器吗?Python教你

想知道如何写一个网络包探嗅器吗?Python教你

作者: 78c40b03ee4e | 来源:发表于2019-02-20 18:55 被阅读6次

    基本嗅探器

    嗅探器是一种程序,它可以逐包捕获/嗅探/检测网络流量包,并对其进行各种原因的分析。常用于网络安全领域。Wireshark是一种非常常见的包嗅探器/协议分析器。包嗅探器也可以用Python编写。在本文中,我们将用Python为Linux平台编写一些非常简单的嗅探器。Linux是因为,尽管python是可移植的,但是这些程序在Windows上不会运行或给出类似的结果。这是由于SocketAPI的实现有所不同。

    这里显示的嗅探器不使用任何额外的库,如libpcap。它们只使用原始套接字。所以让我们开始编码它们

    嗅探器最基本的形式是

    #Packet sniffer in python
    #For Linux
    
    import socket
    
    #create an INET, raw socket
    s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_TCP)
    
    # receive a packet
    while True:
      print s.recvfrom(65565)
    

    在Ubuntu上使用根权限或sudo运行此命令:

    $ sudo python sniffer.py
    

    上述嗅探器的工作原理是:原始套接字能够在Linux中接收所有(其类型,如af-inet)传入的流量。

    输出可能如下所示:

    $ sudo python raw_socket.py 
    ("E\x00x\xcc\xfc\x00\x000\x06j%J}G\x13\xc0\xa8\x01\x06\x01\xbb\xa3\xdc\x0b\xbeI\xbf\x1aF[\x83P\x18\xff\xff\x88\xf6\x00\x00\x17\x03\x01\x00\x1c\xbbT\xb3\x07}\xb0\xedqE\x1e\xe7;-\x03\x9bU\xb7\xb1r\xd2\x9e]\xa1\xb8\xac\xa4V\x9a\x17\x03\x01\x00*\xed\x1f\xda\xa4##Qe\x9a\xe9\xd6\xadN\xf4\x9b\xc4\xf0C'\x01\xc4\x82\xdb\xb2\x8d(\xa5\xd0\x06\x95\x13WO\x0f\x8e\x1c\xa6f\x1d\xdf\xe1x", ('74.125.71.19', 0))
    ('E\x00I\xcc\xfd\x00\x000\x06jSJ}G\x13\xc0\xa8\x01\x06\x01\xbb\xa3\xdc\x0b\xbeJ\x0f\x1aF[\x83P\x18\xff\xff:\x11\x00\x00\x17\x03\x01\x00\x1c\xaa];\t\x81yi\xbbC\xb5\x11\x14(Ct\x13\x10wt\xe0\xbam\xa9\x88/\xf8O{', ('74.125.71.19', 0))
    

    上面是以十六进制表示的网络包的转储。它们可以使用unpack函数进行解析。

    小编推荐一个学python的学习qun 740322234

    无论你是大牛还是小白,是想转行还是想入行都可以来了解一起进步一起学习!裙内有开发工具,很多干货和技术资料分享!

    分析嗅探的数据包

    这是代码嗅探和解析TCP包

    #Packet sniffer in python for Linux
    #Sniffs only incoming TCP packet
    
    import socket, sys
    from struct import *
    
    #create an INET, STREAMing socket
    try:
        s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_TCP)
    except socket.error , msg:
        print 'Socket could not be created. Error Code : ' + str(msg[0]) + ' Message ' + msg[1]
        sys.exit()
    
    # receive a packet
    while True:
        packet = s.recvfrom(65565)
        
        #packet string from tuple
        packet = packet[0]
        
        #take first 20 characters for the ip header
        ip_header = packet[0:20]
        
        #now unpack them :)
        iph = unpack('!BBHHHBBH4s4s' , ip_header)
        
        version_ihl = iph[0]
        version = version_ihl >> 4
        ihl = version_ihl & 0xF
        
        iph_length = ihl * 4
        
        ttl = iph[5]
        protocol = iph[6]
        s_addr = socket.inet_ntoa(iph[8]);
        d_addr = socket.inet_ntoa(iph[9]);
        
        print 'Version : ' + str(version) + ' IP Header Length : ' + str(ihl) + ' TTL : ' + str(ttl) + ' Protocol : ' + str(protocol) + ' Source Address : ' + str(s_addr) + ' Destination Address : ' + str(d_addr)
        
        tcp_header = packet[iph_length:iph_length+20]
        
        #now unpack them :)
        tcph=unpack('!HHLLBBHHH', tcp_header)
    
    
            source_port=tcph[0]
    
            dest_port=tcph[1]
    
            sequence=tcph[2]
    
            acknowledgement=tcph[3]
    
     
            doff_reserved=tcph[4]
    
    
            tcph_length=doff_reserved >>4
    
            print'Source Port : '+str(source_port)+' Dest Port : '+str(dest_port)+' Sequence Number : '+str(sequence)+' Acknowledgement : '+str(acknowledgement)+' TCP header length : '+str(tcph_length)
    
            h_size=iph_length+tcph_length*4
    
    
            data_size=len(packet)-h_size
    
    
            #get data from the packet
    
      
     
            data=packet[h_size:]
    
     
            print'Data : '+data
    
             print           
    
    

    相关文章

      网友评论

        本文标题:想知道如何写一个网络包探嗅器吗?Python教你

        本文链接:https://www.haomeiwen.com/subject/iqckyqtx.html