#!/usr/bin/python from scapy.all import * from subprocess import Popen, PIPE import os,sys class Proxy: srcIP = "" dstIP = "" srcPort = "" dstPort = "" seq = None ack = None def __init__(self, data): self.index = data def main(self): #First add iptables rules self.iptables("-A") print "IPTABLES rules updated" #Listen for SYN to port 80 sniff(filter="tcp dst port 80 && tcp[13] & 2 != 0", prn=self.procSyn) self.flush() print "Removed IPTABLES Rules" def procSyn(self, syn): self.srcIP = syn[IP].src self.dstIP = syn[IP].dst self.srcPort = syn[TCP].sport self.dstPort = syn[TCP].dport iplayer = IP(src=self.dstIP, dst=self.srcIP) print "Received SYN from %s" % str(self.srcIP) #SYN Packet self.seq = 9001 p = iplayer/TCP(seq=self.seq, sport=self.dstPort, dport=self.srcPort, flags="S") print "Sending SYN..." #SYN ACK synack = sr1(p, timeout=1) if not synack: print "SYN-ACK not received" return 0 #self.flush() #sys.exit(1) print "Received SYN-ACK" #ACK self.seq = self.seq + 1 self.ack = synack.seq + 1 print "Sending ACK..." p = iplayer/TCP(seq=self.seq, ack = self.ack, sport=self.dstPort, dport=self.srcPort, flags="A") #HTTP GET get = sr1(p, timeout=1) if not get: print "GET not received" return 0 #self.flush() #sys.exit(1) print "Got data packet" data_len = len(get[Raw]) payload = "HTTP/1.1 200 OK\r\nDate: Mon, 08 Mar 2010 03:17:15 CMD\r\nServer: \r\nContent-Length: %s\r\nKeep-Alive: timeout=5, max=99\r\nConnection: Keep-Alive\r\nContent-Type: text/html; charset=utf-8\r\n\r\n%s" % (str(len(self.index)), self.index) self.seq = get.ack self.ack = get.seq + data_len p = iplayer/TCP(seq=self.seq, ack=self.ack, sport=self.dstPort, dport=self.srcPort, flags="A") send(p) #HTTP Reseponse p = iplayer/TCP(seq=self.seq, ack=self.ack, sport=self.dstPort, dport=self.srcPort, flags="A")/payload send(p) def iptables(self, action): cmd = "iptables %s OUTPUT -p tcp --tcp-flags RST RST -j DROP" % action cmd2 = "iptables %s OUTPUT -p ICMP --icmp-type port-unreachable -j DROP" % action p = Popen(cmd, stdout=PIPE, stderr=PIPE, shell=True) p.wait() p2 = Popen(cmd2, stdout=PIPE, stderr=PIPE, shell=True) p2.wait() def flush(self): cmd = "iptables -F OUTPUT" p = Popen(cmd, stdout=PIPE, stderr=PIPE, shell=True) p.wait() if __name__ == "__main__": index = sys.argv[1] f = open(index,'rb') data = f.read() f.close() p = Proxy(data) p.main()