import socket, random def s5b_prepare(): s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) port = None while True: port = random.randint(10000,2**16-1) try: s.bind(('', port)) s.listen(1) break except socket.error: pass return (s,port) def s5b_write_file(s,fd,size): s.settimeout(20) conn, addr = s.accept() data = conn.recv(3) assert data[0]=='\x05' #SOCKS version not 5 assert data[1]=='\x01' #not a connect command assert data[2]=='\x00' #does not support other connection method #send VER=5 METHOD=NO_AUTH conn.sendall('\x05\x00') data = conn.recv(47) assert data[0]=='\x05' # SOCKS version not 5 assert data[1]=='\x01' # not a connect command # data[2] is reserved assert data[3]=='\x03' # addr type is name assert data[4]=='(' name = data[5:45] assert data[45]=='\x00' assert data[46]=='\x00' #ACK conn.sendall('\x05\x00\x00'+'\x03('+name+'\x00\x00') #send file data = fd.read(min(size,1024)) size -= len(data) while data!='': conn.sendall(data) data = fd.read(min(size,1024)) size -= len(data) conn.close() fd.close()