Created
September 4, 2020 04:41
-
-
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
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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 |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| ''' | |
| 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