Essayez d'envoyer un paquet SYN en Python

Script Python qui envoie des paquets SYN

Ceci est un mémo car j'ai écrit un script Python qui envoie le paquet SYN envoyé lors de l'établissement d'une connexion avec TCP.

syn.py


import socket, struct
from ctypes import *


SRC_IP = "127.0.0.1"
DST_IP = "127.0.0.1"

SRC_PORT = 1234
DST_PORT = 5678

WINDOWSIZE = 512


class tcphdr(Structure):
    _fields_ = [
            ("src_port", c_uint16),
            ("dst_port", c_uint16),
            ("seq", c_uint32),
            ("ack_seq", c_uint32),
            ("res1", c_uint16, 4),#little endian. from here 
            ("doff", c_uint16, 4),
            ("fin", c_uint16, 1),
            ("syn", c_uint16, 1),
            ("rst", c_uint16, 1),
            ("psh", c_uint16, 1),
            ("ack", c_uint16, 1),
            ("urg", c_uint16, 1),
            ("ece", c_uint16, 1),
            ("cwr", c_uint16, 1),#to here

            #("doff", c_uint16, 4),#big endian. from here
            #("res1", c_uint16, 4),
            #("cwr", c_uint16, 1),
            #("ece", c_uint16, 1),
            #("urg", c_uint16, 1),
            #("ack", c_uint16, 1),
            #("psh", c_uint16, 1),
            #("rst", c_uint16, 1),
            #("syn", c_uint16, 1),
            #("fin", c_uint16, 1),#to here

            ("window", c_uint16),
            ("check", c_uint16),
            ("urg_ptr", c_uint16),
            ]

    def pack(self):
        return buffer(self)[:]


class dummy_iphdr(Structure):
    _fields_ = [
            ("src_ip", c_uint32),
            ("dst_ip", c_uint32),
            ("pad", c_uint8),
            ("protocol", c_uint8),
            ("len", c_uint16),
            ]

    def pack(self):
        return buffer(self)[:]


def ip2int(ip_addr):
    #return struct.unpack("!I", socket.inet_aton(ip_addr))[0]
    #inet_aton returns ip_addr in network byte order. so the '!' above is not required.
    return struct.unpack("I", socket.inet_aton(ip_addr))[0]


def calc_checksum(TCPheader):
    IPheader = dummy_iphdr()
    IPheader.src_ip = ip2int(SRC_IP)
    IPheader.dst_ip = ip2int(DST_IP)
    IPheader.pad = 0
    IPheader.protocol = 6
    IPheader.len = socket.htons(20)
    IPheader_packed = IPheader.pack()

    checksum = 0

    for i in xrange(len(IPheader_packed) / 2):
        temp = struct.unpack("H", IPheader_packed[:2])[0]
        checksum += temp
        IPheader_packed = IPheader_packed[2:]

    TCPheader_packed = TCPheader.pack()

    for i in xrange(len(TCPheader_packed) / 2):
        temp = struct.unpack("H", TCPheader_packed[:2])[0]
        checksum += temp
        TCPheader_packed = TCPheader_packed[2:]

    carry = (checksum >> 16) & 0xffff

    checksum = ~((checksum & 0xffff) + carry)

    return checksum


def build_tcp_syn_packet():
    TCPheader = tcphdr()

    TCPheader.src_port = socket.htons(SRC_PORT)
    TCPheader.dst_port = socket.htons(DST_PORT)

    TCPheader.seq = 1#a random number mihgt be better
    TCPheader.doff = len(TCPheader.pack()) / 4

    TCPheader.fin = 0
    TCPheader.syn = 1
    TCPheader.rst = 0
    TCPheader.psh = 0
    TCPheader.ack = 0
    TCPheader.urg = 0
    TCPheader.ece = 0
    TCPheader.cwr = 0

    TCPheader.check = 0
    TCPheader.window = socket.htons(WINDOWSIZE)
    TCPheader.urg_ptr = 0

    TCPheader.check = calc_checksum(TCPheader)

    return TCPheader


def send_syn_packet():
    syn_packet = build_tcp_syn_packet().pack()

    sock = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_TCP)

    sock.sendto(syn_packet, (DST_IP, DST_PORT))

    sock.close()


def main():
    send_syn_packet()


if __name__ == "__main__":
    main()

Où j'étais accro

socket définit automatiquement le numéro de protocole du paquet IP sur TCP même si vous spécifiez 0 pour le numéro de protocole lorsque SOCK_STREAM est spécifié pour le type de socket, mais explicitement lorsque SOCK_RAW est spécifié. Il semble que vous deviez spécifier IPPROTO_TCP.

J'étais accro à la partie qui calcule la somme de contrôle. Cela n'a pas fonctionné car inet_aton a renvoyé l'ordre des octets du réseau, mais l'a décompressé à nouveau dans l'ordre des octets du réseau (était-ce l'ordre des octets natif après tout?).

finalement

Après avoir écrit, j'ai trouvé un script Python plus cool (http://www.binarytides.com/python-syn-flood-program-raw-sockets-linux/).

référence

http://telracsmoratori.blog.fc2.com/blog-entry-116.html https://ja.wikipedia.org/wiki/Transmission_Control_Protocol

Recommended Posts

Essayez d'envoyer un paquet SYN en Python
Essayez de dessiner une animation simple en Python
Essayez un tube de programmation fonctionnel en Python
Essayez gRPC en Python
Essayez 9 tranches en Python
Calculons en fait le problème statistique avec Python
Prendre une capture d'écran en Python
Essayez de créer un module Python en langage C
Créer un dictionnaire en Python
Essayez de rechercher un profil d'un million de caractères en Python
Essayez d'incorporer Python dans un programme C ++ avec pybind11
Essayez LINE Notify avec Python
Créer un bookmarklet en Python
Implémentons Yuma dans Python 3
Dessinez un cœur en Python
Essayez d'exécuter python dans l'environnement Django créé avec pipenv
Essayez de créer le format de fichier DeepZoom .DZI en Python
Essayez de créer un réseau de neurones en Python sans utiliser de bibliothèque
Essayez d'exécuter une fonction écrite en Python à l'aide de Fn Project
Essayez simplement de recevoir un webhook avec ngrok et Python
Ecrire une dichotomie en Python
Appuyez sur une commande en Python (Windows)
Créer un conteneur DI avec Python
Dessinez une matrice de diagramme de dispersion avec python
ABC166 en Python A ~ C problème
Ecrire des algorithmes A * (A-star) en Python
Essayez d'utiliser LevelDB avec Python (plyvel)
Essayons Fizz Buzz avec Python
Créer un fichier binaire en Python
Essayez de calculer Trace en Python
Essayez l'accès au registre PLC en Python
Résoudre ABC036 A ~ C avec Python
Ecrire un graphique à secteurs en Python
Ecrire le plugin vim en Python
Écrire une recherche de priorité en profondeur en Python
Implémentation d'un algorithme simple en Python 2
Résoudre ABC037 A ~ C avec Python
Exécutez un algorithme simple en Python
Dessinez un diagramme CNN en Python
Créer une chaîne aléatoire en Python
Essayez d'utiliser LeapMotion avec Python
Lors de l'écriture d'un programme en Python
Essayez d'obtenir la liste des fils du bulletin d'information (je n'aime pas) avec Python.
Essayez Python
Générer une collection de première classe en Python
Livre en spirale en Python! Python avec un livre en spirale! (Chapitre 14 ~)
Résoudre ABC175 A, B, C avec Python
Essayez de vous connecter à qiita avec Python
Essayez d'utiliser l'API Wunderlist en Python
Un client HTTP simple implémenté en Python
Faites une visite Euler non récursive en Python
Essayez d'utiliser l'API Kraken avec Python
J'ai fait un programme de gestion de la paie en Python!
Précautions lors du décapage d'une fonction en python
Ecrire le test dans la docstring python
Essayez de travailler avec des données binaires en Python
Afficher une liste d'alphabets en Python 3