天天看點

想知道如何寫一個網絡包探嗅器嗎?Python教你

基本嗅探器

嗅探器是一種程式,它可以逐包捕獲/嗅探/檢測網絡流量包,并對其進行各種原因的分析。常用于網絡安全領域。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教你

小編推薦一個學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