Skip to content

Instantly share code, notes, and snippets.

@literadix
Last active December 15, 2017 09:13
Show Gist options
  • Save literadix/05b70621f949ec3d3e9eceac63d4211e to your computer and use it in GitHub Desktop.
Save literadix/05b70621f949ec3d3e9eceac63d4211e to your computer and use it in GitHub Desktop.
Example how to send a raw socket message from python (BSD style)
import socket
import struct
def make_ip(proto, srcip, dstip, ident=54321):
saddr = socket.inet_aton(srcip)
daddr = socket.inet_aton(dstip)
ihl_ver = (4 << 4) | 5
return struct.pack('!BBHHHBBH4s4s' , ihl_ver, 0, 0, ident, 0, 255, proto, 0, saddr, daddr)
def make_tcp(srcport, dstport, payload, seq=123, ackseq=0, fin=False, syn=True, rst=False, psh=False, ack=False, urg=False, window=5840):
offset_res = (5 << 4) | 0
flags = (fin | (syn << 1) | (rst << 2) | (psh <<3) | (ack << 4) | (urg << 5))
return struct.pack('!HHLLBBHHH', srcport, dstport, seq, ackseq, offset_res, flags, window, 0, 0)
srcip = dstip = '127.0.0.1'
srcport, dstport = 11001, 11000
payload = '[TESTING]\n'
ip = make_ip(socket.IPPROTO_TCP, srcip, dstip)
tcp = make_tcp(srcport, dstport, payload)
packet = ip + tcp + payload
s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_RAW)
s.sendto(packet, (dstip, 0))
response, addr = s.recvfrom(65535)
response_id = struct.unpack('!H', response[4:6])
print response_id
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment