Skip to content

Instantly share code, notes, and snippets.

@MayankFawkes
Created September 4, 2020 04:41
Show Gist options
  • Select an option

  • Save MayankFawkes/c6ad9e4bb83611b4d061c1d2f41475f5 to your computer and use it in GitHub Desktop.

Select an option

Save MayankFawkes/c6ad9e4bb83611b4d061c1d2f41475f5 to your computer and use it in GitHub Desktop.
Generate TCP packet in python | Python raw socket | raw packet from IPv4 layer
import socket, sys
from struct import *
from random import randint
import time
import binascii
class IPv4:
def __init__(self):
pass
def pack(self,srcip:str,destip:str):
ihl = 5
version = 4
tos = 0
tot_len = 20 + 20 # python seems to correctly fill the total length, dont know how ??
id = 54321 #Id of this packet
frag_off = 0
ttl = 255
protocol = 6
check = 10 # python seems to correctly fill the checksum
saddr = socket.inet_aton ( srcip ) #Spoof the source ip address if you want to
daddr = socket.inet_aton ( destip )
ihl_version = (version << 4) + ihl
ip_header = pack('!BBHHHBBH4s4s' , ihl_version, tos, tot_len, id, frag_off, ttl, protocol, check, saddr, daddr)
return ip_header
def unpack(self,data:bytes):
version_header_len = data[0]
version = version_header_len >> 4
header_len = (version_header_len & 15) * 4
ttl, proto, src, target = struct.unpack('! 8x B B 2x 4s 4s', data[:20])
return version, header_len, ttl, proto, ipv4(src), ipv4(target), data[header_len:]
class TCP:
def __init__(self,ipv4=None):
self.ipv4=ipv4
def pack(self,srcport:int,destport:int,seq:int,ack_seq:int,fin:int=0,syn:int=0,rst:int=0,psh:int=0,ack:int=0,urg:int=0):
# tcp header fields
source = srcport # source port
dest = destport # destination port
doff = 5 #4 bit field, size of tcp header, 5 * 4 = 20 bytes
window = socket.htons (5840) # maximum allowed window size
check = 0
urg_ptr = 0
offset_res = (doff << 4) + 0
tcp_flags = fin + (syn << 1) + (rst << 2) + (psh <<3) + (ack << 4) + (urg << 5)
# the ! in the pack format string means network order
tcp_header = pack('!HHLLBBHHH' , source, dest, seq, ack_seq, offset_res, tcp_flags, window, check, urg_ptr)
# pseudo header fields
source_address = socket.inet_aton( source_ip )
dest_address = socket.inet_aton(dest_ip)
placeholder = 0
protocol = 6
tcp_length = len(tcp_header)
print(tcp_length)
psh = pack('!4s4sBBH' , source_address , dest_address , placeholder , protocol , tcp_length);
psh = psh + tcp_header;
tcp_checksum = self.checksums(psh)
# make the tcp header again and fill the correct checksum
tcp_header = pack('!HHLLBBHHH' , source, dest, seq, ack_seq, offset_res, tcp_flags, window, tcp_checksum , urg_ptr)
if self.ipv4:
return self.ipv4+tcp_header
return tcp_header
@staticmethod
def checksums(msg):
s = 0
for i in range(0, len(msg), 2):
w = (msg[i] << 8) + (msg[i+1])
s = s + w
s = (s>>16) + (s & 0xffff);
s = ~s & 0xffff
return s
'''
send tcp syn packet
'''
s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_RAW)
# s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_TCP)
s.setsockopt(socket.IPPROTO_IP, socket.IP_HDRINCL, 1)
source_ip = '192.168.0.243'
dest_ip = '35.170.21.246'
srcport= randint(2000,65535)
IPv4packet=IPv4().pack(srcip=source_ip,destip=dest_ip)
tcp=TCP(IPv4packet)
data={"srcport":srcport,"destport":80,"seq":0,"ack_seq":0,"syn":1,"rst":0,"psh":0,"ack":0}
packet=tcp.pack(**data)
s.sendto(packet, (dest_ip , 0 ))
'''
send tcp ack packet
'''
s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_RAW)
# s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_TCP)
s.setsockopt(socket.IPPROTO_IP, socket.IP_HDRINCL, 1)
source_ip = '192.168.0.243'
dest_ip = '35.170.21.246'
srcport= randint(2000,65535)
IPv4packet=IPv4().pack(srcip=source_ip,destip=dest_ip)
tcp=TCP(IPv4packet)
data={"srcport":srcport,"destport":80,"seq":1,"ack_seq":1,"syn":0,"rst":0,"psh":0,"ack":1}
packet=tcp.pack(**data)
s.sendto(packet, (dest_ip , 0 ))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment