def compose_options(options): tcpsoption = "" avail_opt_len = 40 for opt in options: if opt[0] == 'NOP': if avail_opt_len < 1: break nop = tcplib.create_nop() tcpsoption += nop avail_opt_len -= 1 continue if opt[0] == 'MSS': if avail_opt_len < 4: break mssoption = tcplib.create_mss(opt[1]) tcpsoption += mssoption avail_opt_len -= 4 continue if opt[0] == 'WSCALE': if avail_opt_len < 3: break wsoption = tcplib.create_winscale(opt[1]) tcpsoption += wsoption avail_opt_len -= 3 continue if opt[0] == 'SACKOK': if avail_opt_len < 2: break sackok_option = tcplib.create_sackok() tcpsoption += sackok_option avail_opt_len -= 2 continue if opt[0] == 'TIMESTAMP': if avail_opt_len < 10: break tsoption = tcplib.create_timestamp(opt[1], opt[2]) tcpsoption += tsoption avail_opt_len -= 10 continue if opt[0] == 'MP_CAPABLE': if avail_opt_len < 12: break mpcap_option = tcplib.create_mpcapable(opt[1], opt[2]) tcpsoption += mpcap_option avail_opt_len -= 12 continue if opt[0] == 'MP_DATA': if avail_opt_len < 16: break # (Dsn (8 Byte), Dlen (2 Byte), Ssn(4 Byte)) dsn_option = tcplib.create_mpdata(opt[1], opt[2], opt[3]) tcpsoption += dsn_option avail_opt_len -= 16 continue if opt[0] == 'MP_ACK': if avail_opt_len < 10: break dataack_option = tcplib.create_mpack(opt[1]) tcpsoption += dataack_option avail_opt_len -= 10 continue tcpsoption += tcplib.check_padding(tcpsoption) return tcpsoption
def compose_options(options): tcpsoption = "" avail_opt_len = 40 for opt in options: if opt[0] == 'NOP': if avail_opt_len < 1: break nop = tcplib.create_nop() tcpsoption += nop avail_opt_len -= 1 continue if opt[0] == 'MSS': if avail_opt_len < 4: break mssoption = tcplib.create_mss(opt[1]) tcpsoption += mssoption avail_opt_len -= 4 continue if opt[0] == 'WSCALE': if avail_opt_len < 3: break wsoption = tcplib.create_winscale(opt[1]) tcpsoption += wsoption avail_opt_len -= 3 continue if opt[0] == 'SACKOK': if avail_opt_len < 2: break sackok_option = tcplib.create_sackok() tcpsoption += sackok_option avail_opt_len -= 2 continue if opt[0] == 'TIMESTAMP': if avail_opt_len < 10: break tsoption = tcplib.create_timestamp(opt[1], opt[2]) tcpsoption += tsoption avail_opt_len -= 10 continue if opt[0] == 'MP_CAPABLE': length = 20 if opt[3] is not None else 12 if avail_opt_len < length: break mpcap_option = tcplib.create_mpcapable(opt[1], opt[2], opt[3]) tcpsoption += mpcap_option avail_opt_len -= length continue if opt[0] == 'MP_DSS': length = (14 if opt[6] is not None else 0) + (4 if opt[4] is not None else 0) + \ (4 if opt[4] is not None and opt[3] else 0) + (4 if opt[5] else 0) if avail_opt_len < length: break dss_option = tcplib.create_mpdss(opt[1], opt[2], opt[3], opt[4], \ opt[5], opt[6], opt[7]) tcpsoption += dss_option avail_opt_len -= length continue if opt[0] == 'MP_ACK': if avail_opt_len < 10: break dataack_option = tcplib.create_mpack(opt[1]) tcpsoption += dataack_option avail_opt_len -= 10 continue tcpsoption += tcplib.check_padding(tcpsoption) return tcpsoption
src = struct.unpack('!L',socket.inet_aton(ss.getsockname()[0]))[0] dest = struct.unpack('!L',socket.inet_aton(deststr))[0] return (src, dest) # # tcp options # MSSval = 512 WSval = 6 TSval = 12345678 SynTsEcr = 0xffff0000 # Initiator's value mssoption = tcplib.create_mss(MSSval) wsoption = tcplib.create_winscale(WSval) tsoption = tcplib.create_timestamp(TSval,0) sackokoption = tcplib.create_sackok() # # mpcapable option # mptcp_token = 0x0D0C0B0A mptcp_isn = 0x0102030405060000 mpcap_option = tcplib.create_mpcapable(mptcp_token, mptcp_isn) # # constants for ip and tcp header # ipid = 0x4321 ipttl = 255 otcpseqno = 0xabcdef
def send_packet(): global tcpsoption ackno = tcpackno # add padding to tcp option tcpsoption += tcplib.check_padding(tcpsoption) # special hack parse sdata = "" if datalen > 3 or (len(data) > 1 and tcpflag & tcplib.TH_SYN): trimmed, http = httpenc.trim_httphdr(data) if not http and \ struct.unpack('!B', trimmed[0:1])[0] == request_hdrdata_http: http = 1 if http and httpenc.is_http_get(data, 'hoge.cgi'): sdata = httpenc.httphdr_ok_dummy() elif len(trimmed) == 0: pass elif struct.unpack('!B', trimmed[0:1])[0] == request_dupack: ackno = tcph.seqno elif struct.unpack('!B', trimmed[0:1])[0] == request_differ_tsecr or \ struct.unpack('!B', trimmed[0:1])[0] == request_hdrdata or \ struct.unpack('!B', trimmed[0:1])[0] == request_hdrdata_http or \ struct.unpack('!B', trimmed[0:1])[0] == Hdrdata_and_advsyndata_ack: if struct.unpack('!B', trimmed[0:1])[0] == request_differ_tsecr: tcpsoption = tcplib.create_timestamp(TSval, tsecr-1) tcpsoption += tcplib.check_padding(tcpsoption) target_len = 512 - len(tcpsoption) if tcpflag & tcplib.TH_SYN: target_len = len(data) # Prepare HTTP OK header if http: sdata = httpenc.httphdr_ok(target_len) # Prepare receiving headers sdata += rcvhdrdata # Prepare sending headers (IP and TCP checksums are zero) tmpiph = tcplib.iphdr(ipsrc, ipdest, tcplib.BASEHDRLEN + 512, \ ipid, ipttl) tmptcph = tcplib.tcphdr(tcpsport, tcpdport, tcpseqno, ackno, \ tcpflag, tcpwindow, tcpsoption) sdata += tmpiph.bin() + tmptcph.bin() cur_len = len(sdata) if len(trimmed) >= target_len - cur_len: sdata += trimmed[0: target_len - cur_len] else: sdata += trimmed cur_len += len(trimmed) for i in range(0, target_len - cur_len): sdata += struct.pack('!B', 0xAB) # prepare ip header iplen = tcplib.BASEHDRLEN + len(tcpsoption) + len(sdata) iphs = tcplib.iphdr(ipsrc, ipdest, iplen, ipid, ipttl) # prepare tcp header tcphs = tcplib.tcphdr(tcpsport, tcpdport, tcpseqno, ackno, \ tcpflag, tcpwindow, tcpsoption) if len(sdata) == 0: tcphs.calccksum(iphs) else: tcphs.calccksum(iphs, sdata) payload = iphs.bin() payload += tcphs.bin() if len(sdata) > 0: payload += sdata dstr = socket.inet_ntoa(struct.pack('!L',ipdest)) s.sendto(payload, (dstr, 0))
deststr = socket.gethostbyname(targetstr) dest = socket.inet_aton(deststr) ss = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP) ss.connect((deststr, MPTCP_PORT)) src = struct.unpack('!L',socket.inet_aton(ss.getsockname()[0]))[0] dest = struct.unpack('!L',socket.inet_aton(deststr))[0] return (src, dest) # # tcp options # mssoption = tcplib.create_mss(512) wsoption = tcplib.create_winscale(6) tsoption = tcplib.create_timestamp(12345678,0) sackokoption = tcplib.create_sackok() # # mpcapable option # mptcp_token = 0x0D0C0B0A mptcp_isn = 0x0102030405060000 mpcap_option = tcplib.create_mpcapable(mptcp_token, mptcp_isn) # # constants for ip and tcp header # ipid = 0x4321 ipttl = 255 otcpseqno = 0xabcdef