samedi 15 août 2015

News Packet sniffer en Python


Bonjour ,

Je viens partager avec vous un nouvel exercice auquel j'ai du répondre.


Voici l’énoncé:

Citation:

# Create a packet sniffer using raw sockets which can parse TCP packets
# - parse individual fields


Voici le script du packet sniffer

Code:

#!/usr/bin/python

# Create a packet sniffer using raw sockets which can parse TCP packets
#              - parse individual fields

import socket
import struct
import binascii


def ethernetPacket(ethernetHeader):

        # Ethernet header = 14 first bytes
        # !6s6s2
        # Ethernet destination address
        # Ethernet source address
        # Ethernet type
       
        eth_hdr = struct.unpack("!6s6s2s", ethernetHeader)
        print "\nEthernet Packet Header Information:"
        print "Destination MAC: {}".format(binascii.hexlify(eth_hdr[0]))
        print "Source MAC: {}".format(binascii.hexlify(eth_hdr[1]))
        print "Protocol: {}".format(binascii.hexlify(eth_hdr[2]))

def ipPacket(ipHeader):

        # IP header = 20 next bytes 
        # !1s1s1H1H2s1B1B2s4s4s
        # Version
        # Service length
        # Total length
        # Identification
        # Fragmentation /Flag
        # TTL
        # Protocol
        # Checksum
        # Source address
        # Destination address
       
        print "\nIP Header Information:"
        ip_header = struct.unpack("!1s1s1H1H2s1B1B2s4s4s", ipHeader)

        verHeadLength = binascii.hexlify(ip_header[0])
        serviceField = binascii.hexlify(ip_header[1])
        totalLength = str(ip_header[2])
        ident = str(ip_header[3])
        flagFrag = binascii.hexlify(ip_header[4])
        ttl = str(ip_header[5])
        protocol = str(ip_header[6])
        checkSum = binascii.hexlify(ip_header[7])
        srcIp = socket.inet_ntoa(ip_header[8])
        dstIp = socket.inet_ntoa(ip_header[9])

        print "Version:{}".format(verHeadLength)
        print "Service Length:{}".format(serviceField)
        print "Total Length:{}".format(totalLength)
        print "Identification:{}".format(ident)
        print "Fragmentation/Flag offset:{}".format(flagFrag)
        print "TTL:{}".format(ttl)
        print "Protocol:{}".format(protocol)
        print "Checksum:{}".format(checkSum)
        print "Source IP:{}".format(srcIp)
        print "Destination IP:{}".format(dstIp)

def tcpPacket(tcpHeader):

        # TCP header = 20 next bytes   
        # !HHII2sH2sH
        # Source port
        # Destination port
        # Sequence Number
        # Acknowledgement
        # TCP header length
        # Window Size
        # Checksum
        # Urgent Pointer
       
        print "\nTCP Header Information"
        tcp_header = struct.unpack("!HHII2sH2sH", tcpHeader)
        destPort = str(tcp_header[0])
        srcPort = str(tcp_header[1])
        seqNo = str(tcp_header[2])
        ackNo = str(tcp_header[3])
        headerLength = binascii.hexlify(tcp_header[4])
        windowSize = str(tcp_header[5])
        checkSum = binascii.hexlify(tcp_header[6])
        urgentPointer = str(tcp_header[7])
       
        print "Source Port:{}".format(srcPort)
        print "Dest Port:{}".format(destPort)
        print "Sequence Number:{}".format(seqNo)
        print "Acknowledgement:{}".format(ackNo)
        print "TCP header length:{}".format(headerLength)
        print "Window Size:{}".format(windowSize)
        print "Checksum:{}".format(checkSum)
        print "Urgent Pointer:{}".format(urgentPointer)


# Starting the stuff
# sudo ifconfig eth0 promisc up
# sudo python2 script_name.py

# 0x0800 is internet protocol packet , see IF_ETHER.H in /usr/include/linux

rawSocket=socket.socket(socket.PF_PACKET, socket.SOCK_RAW, socket.htons(0x0800))
maxBuffer = 65535

while True:
        pkt = rawSocket.recvfrom(maxBuffer)
        print "\nRAW PACKET:\n{}".format(pkt)       
        ethernetPacket(ethernetHeader = pkt[0][0:14])
        ipPacket(ipHeader=pkt[0][14:34])
        tcpPacket(tcpHeader=pkt[0][34:54])

Le résultat dans le terminal



Citation:

RAW PACKET:
('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00E\x00\x01\xd4\xf7\x0b@\x00@\x11D\x0b\x7f\x 00\x00\x01\x7f\x00\x00\x01\x82\xb6\x82\xb6\x01\xc0\xff\xd3\x02\x00\x00\x00\xb8\x01\x00\x00\x00\x00\x 00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x 00\x00\x00\x00\x00\xee\x04\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x 00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x 00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x 00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x00\x00\x00\x00\x00\x00\x00\x05\x00\x00\x 00\x00\x00\x00\x00p\n\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x03\x0 0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0 0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0 0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x0 0\x00\x00\x00o\n\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00 \x00\x00\x95\x0b\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00 \x00\x00', ('lo', 2048, 0, 772, '\x00\x00\x00\x00\x00\x00'))

Ethernet Packet Header Information:
Destination MAC: 000000000000
Source MAC: 000000000000
Protocol: 0800

IP Header Information:
Version :45
Service Length: 00
Total Length: 468
Identification: 63243
Fragmentation/Flag offset: 4000
TTL: 64
Protocol: 17
Checksum: 440b
Source IP: 127.0.0.1
Destination IP: 127.0.0.1

TCP Header Information
Source Port : 33462
Dest Port : 33462
Sequence Number : 29425619
Acknowledgement : 33554432
TCP header length : b801
Window Size: 0
Checksum: 0000
Urgent Pointer: 0
Ceci est un premier test, je n'ai d’ailleurs mis les mains dans les packets que depuis hier matin, ce qui explique sûrement qu'il y ait quelques erreurs. Je n'ai pas encore modifié les constantes pour les mettre en majuscules et les adresses MAC ne sont pas affichées dans ce packet, mais testez le chez vous, ce script fonctionne.
Je vous demanderais donc comme d'habitude d’être indulgent, de tester le script par vous même , et de me faire un retour pour savoir que ça ne va pas, voire pas du tout, ou le contraire.

ATTENTION:
pour rester dans la légalité , je vous invite a lire le document "Les aspects juridiques du scan et des tests intrusifs - OSSIR" a la partie "Légalité du sniffing" : http://ift.tt/1DW6AhZ


from Hackademics : Forum de hacking – hackers white hat – cours de securite informatique, apprendre langage python, tutoriels de reverse engineering http://ift.tt/1DW6BT6
via IFTTT

Aucun commentaire:

Enregistrer un commentaire