class Network: def new(self): pass def update(self): self.treeSymbolGenerator.update() self.treeTypeStructureGenerator.update() def clear(self): pass def kill(self): # os.popen("sudo iptables -D OUTPUT -p tcp --dport 80 -j NFQUEUE 2>&1 > /dev/null") # os.popen("sudo iptables -D OUTPUT -p tcp --sport 80 -j NFQUEUE 2>&1 > /dev/null") if self.aFuzzThread != None and self.aFuzzThread.isAlive(): self.aFuzzThread._Thread__stop() def save(self): pass #+---------------------------------------------- #| Constructor: #| @param netzob: the netzob main object #+---------------------------------------------- def __init__(self, netzob): # create logger with the given configuration self.log = logging.getLogger('netzob.Fuzzing.Network.py') self.netzob = netzob self.selectedSymbol = None self.aFuzzThread = None self.packets = [] self.panel = gtk.VPaned() self.panel.show() #+---------------------------------------------- #| LEFT PART OF THE GUI : TREEVIEW #+---------------------------------------------- topPanel = gtk.HPaned() topPanel.show() self.panel.add(topPanel) vb_left_panel = gtk.VBox(False, spacing=0) topPanel.add(vb_left_panel) vb_left_panel.set_size_request(-1, -1) vb_left_panel.show() # Initialize the treeview generator for the symbols self.treeSymbolGenerator = TreeSymbolGenerator(self.netzob) self.treeSymbolGenerator.initialization() vb_left_panel.pack_start(self.treeSymbolGenerator.getScrollLib(), True, True, 0) self.treeSymbolGenerator.getTreeview().connect("cursor-changed", self.symbolSelected) #+---------------------------------------------- #| RIGHT PART OF THE GUI : TYPE STRUCTURE OUTPUT #+---------------------------------------------- vb_right_panel = gtk.VBox(False, spacing=0) vb_right_panel.show() # Initialize the treeview for the type structure self.treeTypeStructureGenerator = TreeTypeStructureGenerator(self.netzob) self.treeTypeStructureGenerator.initialization() self.treeTypeStructureGenerator.getTreeview().connect('button-press-event', self.button_press_on_field) vb_right_panel.add(self.treeTypeStructureGenerator.getScrollLib()) topPanel.add(vb_right_panel) #+---------------------------------------------- #| BOTTOM PART OF THE GUI : PACKET CAPTURING #+---------------------------------------------- # Network Capturing Panel sniffPanel = gtk.Table(rows=6, columns=4, homogeneous=False) self.panel.add(sniffPanel) sniffPanel.show() # Filter label = gtk.Label(_("Filter")) label.show() entry_filter = gtk.Entry() entry_filter.set_width_chars(50) entry_filter.show() entry_filter.set_text("tcp port 80") sniffPanel.attach(label, 0, 1, 0, 1, xoptions=gtk.FILL, yoptions=0, xpadding=5, ypadding=5) sniffPanel.attach(entry_filter, 1, 2, 0, 1, xoptions=gtk.FILL, yoptions=0, xpadding=5, ypadding=5) # Sniff launching button but = gtk.Button(label=_("Fuzz traffic")) but.show() but.connect("clicked", self.launchFuzz_cb, entry_filter) sniffPanel.attach(but, 1, 2, 3, 4, xoptions=0, yoptions=0, xpadding=5, ypadding=5) # Packet list scroll = gtk.ScrolledWindow() self.treestore = gtk.TreeStore(int, str, str, str, str, str, int) # pktID, proto (udp/tcp), IP.src, IP.dst, sport, dport, timestamp treeview = gtk.TreeView(self.treestore) treeview.get_selection().set_mode(gtk.SELECTION_MULTIPLE) treeview.connect("cursor-changed", self.packet_details) cell = gtk.CellRendererText() # Col proto column = gtk.TreeViewColumn(_("Proto")) column.pack_start(cell, True) column.set_attributes(cell, text=1) treeview.append_column(column) # Col IP.src column = gtk.TreeViewColumn(_("IP source")) column.pack_start(cell, True) column.set_attributes(cell, text=2) treeview.append_column(column) # Col IP.dst column = gtk.TreeViewColumn(_("IP dest")) column.pack_start(cell, True) column.set_attributes(cell, text=3) treeview.append_column(column) # Col {TCP,UDP}.sport column = gtk.TreeViewColumn(_("sport")) column.pack_start(cell, True) column.set_attributes(cell, text=4) treeview.append_column(column) # Col {TCP,UDP}.dport column = gtk.TreeViewColumn(_("dport")) column.pack_start(cell, True) column.set_attributes(cell, text=5) treeview.append_column(column) treeview.show() scroll.add(treeview) scroll.show() scroll.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC) sniffPanel.attach(scroll, 0, 2, 4, 5, xoptions=gtk.FILL, yoptions=gtk.FILL | gtk.EXPAND, xpadding=5, ypadding=5) # Packet detail scroll = gtk.ScrolledWindow() self.textview = gtk.TextView() self.textview.show() scroll.add(self.textview) scroll.show() scroll.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC) sniffPanel.attach(scroll, 2, 4, 0, 6, xoptions=gtk.FILL | gtk.EXPAND, yoptions=gtk.FILL | gtk.EXPAND, xpadding=5, ypadding=5) #+---------------------------------------------- #| update: #| Update the Treestore #+---------------------------------------------- def symbolSelected(self, treeview): (model, iter) = treeview.get_selection().get_selected() if(iter): if(model.iter_is_valid(iter)): # Retrieve the selected symbol idSymbol = model.get_value(iter, 0) self.selectedSymbol = idSymbol symbol = None for tmp_symbol in self.netzob.getCurrentProject().getVocabulary().getSymbols(): if str(tmp_symbol.getID()) == idSymbol: symbol = tmp_symbol # Retrieve a random message in order to show a type structure message = symbol.getMessages()[-1] self.treeTypeStructureGenerator.setSymbol(symbol) self.treeTypeStructureGenerator.setMessage(message) self.treeTypeStructureGenerator.update() #+---------------------------------------------- #| button_press_on_field: #| Create a menu to display available operations #| on the treeview symbols #+---------------------------------------------- def button_press_on_field(self, button, event): if event.type == gtk.gdk.BUTTON_PRESS and event.button == 3: # Retrieves the symbol on which the user has clicked on x = int(event.x) y = int(event.y) (path, treeviewColumn, x, y) = self.treeTypeStructureGenerator.getTreeview().get_path_at_pos(x, y) aIter = self.treeTypeStructureGenerator.getTreeview().get_model().get_iter(path) field = self.treeTypeStructureGenerator.getTreeview().get_model().get_value(aIter, 0) menu = gtk.Menu() item = gtk.MenuItem(_("Fuzz field")) item.connect("activate", self.fuzz_field_cb, field) item.show() menu.append(item) menu.popup(None, None, None, event.button, event.time) def fuzz_field_cb(self, widget, field): self.log.debug(_("Fuzz field: {0}".format(str(field)))) #+---------------------------------------------- #| Called when user select a packet for details #+---------------------------------------------- def packet_details(self, treeview): (model, paths) = treeview.get_selection().get_selected_rows() for path in paths[:1]: iter = model.get_iter(path) if(model.iter_is_valid(iter)): packetID = model.get_value(iter, 0) self.textview.get_buffer().set_text(self.packets[packetID].show()) #+---------------------------------------------- #| Called when launching sniffing process #+---------------------------------------------- def launchFuzz_cb(self, button, aFilter): button.set_sensitive(False) self.packets = [] self.treestore.clear() self.textview.get_buffer().set_text("") self.aFuzzThread = threading.Thread(None, self.fuzzThread, None, (button, aFilter), {}) self.aFuzzThread.start() #+---------------------------------------------- #| Thread for fuzzing #+---------------------------------------------- def fuzzThread(self, button, aFilter): self.log.info(_("Launching fuzzing process with : filter=\"{0}\"").format(aFilter.get_text())) ## Set Netfilter NFQUEUE # os.popen("sudo iptables -I OUTPUT -p tcp --dport 80 -j NFQUEUE 2>&1 > /dev/null") # os.popen("sudo iptables -I OUTPUT -p tcp --sport 80 -j NFQUEUE 2>&1 > /dev/null") q = nfqueue.queue() q.open() try: q.unbind(socket.AF_INET) except: pass q.bind(socket.AF_INET) q.set_callback(self.nfqueue_cb) q.create_queue(0) q.set_queue_maxlen(5000) try: ## TODO : do it in a dedicated process q.try_run() except: pass q.unbind(socket.AF_INET) q.close() # os.popen("sudo iptables -D OUTPUT -p tcp --dport 80 -j NFQUEUE 2>&1 > /dev/null") # os.popen("sudo iptables -D OUTPUT -p tcp --sport 80 -j NFQUEUE 2>&1 > /dev/null") gobject.idle_add(button.set_sensitive, True) #+---------------------------------------------- #| Called when we reiceve a corresponding packet to fuzz #+---------------------------------------------- def nfqueue_cb(self, dummy, payload): return payload.set_verdict(nfqueue.NF_ACCEPT) """ data = payload.get_data() ip_pkt = ip.IP(data) if ip_pkt.p == ip.IP_PROTO_TCP: proto_pkt = tcp.TCP(str(ip_pkt.data)) gobject.idle_add(self.treestore.append, None, [len(self.packets), "TCP", str(ip_pkt.src), str(ip_pkt.dst), str(proto_pkt.sport), str(proto_pkt.dport), int(time.time())] ) elif ip_pkt.p == ip.IP_PROTO_UDP: proto_pkt = udp.UDP(str(ip_pkt.data)) gobject.idle_add(self.treestore.append, None, [len(self.packets), "UDP", str(ip_pkt.src), str(ip_pkt.dst), str(proto_pkt.sport), str(proto_pkt.dport), int(time.time())] ) self.packets.append(repr(ip_pkt)) new_ip_pkt = ip_pkt new_ip_pkt.data = self.fuzzPacket(ip_pkt.data) return payload.set_verdict_modified(nfqueue.NF_ACCEPT, str(new_ip_pkt), len(new_ip_pkt)) """ #+---------------------------------------------- #| Main function to fuzz packets #+---------------------------------------------- def fuzzPacket(self, packet): print repr(packet) return packet """ res = "" for i in range(len(strIN)): if i == offset: res += value else: res += strIN[i] return res """ #+---------------------------------------------- #| GETTERS #+---------------------------------------------- def getPanel(self): return self.panel
class File: def new(self): pass def update(self): self.treeSymbolGenerator.update() self.treeTypeStructureGenerator.update() def clear(self): pass def kill(self): pass def save(self): pass #+---------------------------------------------- #| Constructor: #| @param netzob: the netzob main object #+---------------------------------------------- def __init__(self, netzob): # create logger with the given configuration self.log = logging.getLogger('netzob.Fuzzing.File.py') self.netzob = netzob self.symbols = [] self.selectedSymbol = None self.panel = gtk.HPaned() self.panel.show() #+---------------------------------------------- #| LEFT PART OF THE GUI : TREEVIEW #+---------------------------------------------- vb_left_panel = gtk.VBox(False, spacing=0) self.panel.add(vb_left_panel) vb_left_panel.set_size_request(-1, -1) vb_left_panel.show() # Initialize the treeview generator for the symbols # Create the treeview self.treeSymbolGenerator = TreeSymbolGenerator(self.netzob) self.treeSymbolGenerator.initialization() vb_left_panel.pack_start(self.treeSymbolGenerator.getScrollLib(), True, True, 0) self.treeSymbolGenerator.getTreeview().connect("cursor-changed", self.symbolSelected) # self.treeSymbolGenerator.getTreeview().connect('button-press-event', self.button_press_on_treeview_symbols) #+---------------------------------------------- #| RIGHT PART OF THE GUI : TYPE STRUCTURE OUTPUT #+---------------------------------------------- vb_right_panel = gtk.VBox(False, spacing=0) vb_right_panel.show() # Initialize the treeview for the type structure self.treeTypeStructureGenerator = TreeTypeStructureGenerator(self.netzob) self.treeTypeStructureGenerator.initialization() self.treeTypeStructureGenerator.getTreeview().connect('button-press-event', self.button_press_on_field) vb_right_panel.add(self.treeTypeStructureGenerator.getScrollLib()) self.panel.add(vb_right_panel) def symbolSelected(self, treeview): (model, iter) = treeview.get_selection().get_selected() if(iter): if(model.iter_is_valid(iter)): # Retrieve the selected symbol idSymbol = model.get_value(iter, 0) self.selectedSymbol = idSymbol symbol = None for tmp_symbol in self.netzob.getCurrentProject().getVocabulary().getSymbols(): if str(tmp_symbol.getID()) == idSymbol: symbol = tmp_symbol # Retrieve a random message in order to show a type structure message = symbol.getMessages()[-1] self.treeTypeStructureGenerator.setSymbol(symbol) self.treeTypeStructureGenerator.setMessage(message) self.treeTypeStructureGenerator.update() #+---------------------------------------------- #| button_press_on_field: #| Create a menu to display available operations #| on the treeview symbols #+---------------------------------------------- def button_press_on_field(self, button, event): if event.type == gtk.gdk.BUTTON_PRESS and event.button == 3: # Retrieves the symbol on which the user has clicked on x = int(event.x) y = int(event.y) (path, treeviewColumn, x, y) = self.treeTypeStructureGenerator.getTreeview().get_path_at_pos(x, y) aIter = self.treeTypeStructureGenerator.getTreeview().get_model().get_iter(path) field = self.treeTypeStructureGenerator.getTreeview().get_model().get_value(aIter, 0) menu = gtk.Menu() item = gtk.MenuItem(_("Fuzz field")) item.connect("activate", self.fuzz_field_cb, field) item.show() menu.append(item) menu.popup(None, None, None, event.button, event.time) def fuzz_field_cb(self, widget, field): self.log.debug(_("Fuzz field : {0}".format(str(field)))) #+---------------------------------------------- #| GETTERS #+---------------------------------------------- def getPanel(self): return self.panel