import socket

# Sending a SYN+ACK packet 

def init_socket():
    s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_TCP)
    s.setsockopt(socket.IPPROTO_IP, socket.IP_HDRINCL, 1)
    return s    

def send_raw_packet():
    ip_header  = b'\x45\x00\x00\x28'  # Version, IHL, Type of Service | Total Length
    ip_header += b'\x00\x01\x00\x00'  # Identification | Flags, Fragment Offset
    ip_header += b'\x28\x06\x95\x45'  # TTL = 40s, Protocol = 6 for TCP | Header Checksum
    ip_header += b'\xc8\xcc\x0a\x0e'  # Source Address: 200.204.10.14 
    ip_header += b'\xc8\xcc\x0a\x0c'  # Destination Address: 200.204.10.12

    tcp_header  = b'\x11\x5c\x04\xD2' # Source Port | Destination Port
    tcp_header += b'\x00\x00\x00\x00' # Sequence Number
    tcp_header += b'\x00\x00\x00\x00' # Acknowledgement Number
    tcp_header += b'\x50\x11\x00\x00' # Data Offset, Reserved, Flags | Window Size
    tcp_header += b'\xa5\x41\x00\x00' # Checksum | Urgent Pointer

    packet = ip_header + tcp_header
    return packet

if __name__=="__main__":
    dst_IP = '200.204.10.12'

    s = init_socket()

    packet = send_raw_packet()
    s.sendto(packet, (dst_IP, 0))
