nmapoutputviewer.py

来自「Ubuntu packages of security software。 相」· Python 代码 · 共 378 行

PY
378
字号
#!/usr/bin/env python# -*- coding: utf-8 -*-# Copyright (C) 2005 Insecure.Com LLC.## Author: Adriano Monteiro Marques <py.adriano@gmail.com>## This program is free software; you can redistribute it and/or modify# it under the terms of the GNU General Public License as published by# the Free Software Foundation; either version 2 of the License, or# (at your option) any later version.## This program is distributed in the hope that it will be useful,# but WITHOUT ANY WARRANTY; without even the implied warranty of# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the# GNU General Public License for more details.## You should have received a copy of the GNU General Public License# along with this program; if not, write to the Free Software# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USAimport sysimport gtkimport gtk.gdkimport pangoimport refrom threading import Threadfrom higwidgets.higbuttons import HIGButtonfrom zenmapCore.I18N import _, encfrom zenmapCore.UmitLogging import logfrom zenmapCore.UmitConf import NmapOutputHighlightfrom zenmapGUI.NmapOutputProperties import NmapOutputPropertiesclass NmapOutputViewer (gtk.VPaned):    def __init__ (self, refresh=1, stop=1):        self.nmap_highlight = NmapOutputHighlight()        gtk.VPaned.__init__ (self)                # Creating widgets        self.__create_widgets()                # Setting scrolled window        self.__set_scrolled_window()                # Setting text view        self.__set_text_view()                # Setting buttons        self.__set_buttons()                # Getting text buffer        self.text_buffer = self.text_view.get_buffer()                self.refreshing = True        self.thread = Thread()                # Adding widgets to the VPaned        self.pack1(self.scrolled, resize=True, shrink=True)        self.pack2(self.hbox_buttons, resize=True, shrink=False)                self.nmap_previous_output = ''        self.brazil = True                def __create_widgets (self):        # Creating widgets        self.scrolled = gtk.ScrolledWindow ()        self.text_view = gtk.TextView ()        self.btn_refresh = gtk.Button (stock=gtk.STOCK_REFRESH)        self.check_enable_color = gtk.CheckButton(_("Enable Nmap output highlight"))        self.btn_output_properties = HIGButton(stock=gtk.STOCK_PREFERENCES)        self.hbox_buttons = gtk.HBox (spacing=5)        self.txg_font = gtk.TextTag()        self.txg_date = gtk.TextTag()        def __set_scrolled_window (self):        # Seting scrolled window        self.scrolled.set_border_width (5)        self.scrolled.add(self.text_view)        self.scrolled.set_policy (gtk.POLICY_AUTOMATIC,gtk.POLICY_AUTOMATIC)        self.scrolled.set_size_request (450, 350)        def __set_text_view(self):        self.text_view.set_wrap_mode(gtk.WRAP_WORD)        self.text_view.set_editable(False)                self.txg_output = self.text_view.get_buffer().get_tag_table()        self.txg_output.add(self.txg_font)        self.txg_font.set_property("family", "Monospace")        self.text_view.get_buffer().connect ("changed", self.__text_changed_cb)    def __text_changed_cb (self, widget):        buff = self.text_view.get_buffer ()        buff.apply_tag(self.txg_font, buff.get_start_iter(), buff.get_end_iter())        self.update_output_colors()            def __set_buttons (self):        self.check_enable_color.set_active(self.nmap_highlight.enable)                # Connecting events        self.btn_refresh.connect('clicked', self.refresh_output)        self.btn_output_properties.connect("clicked", self.show_output_properties)        self.check_enable_color.connect("toggled", self.enable_color_highlight)                # Setting hbox        self.hbox_buttons.set_border_width(5)                # Packing buttons        self.hbox_buttons.pack_start(self.check_enable_color)        self.hbox_buttons.pack_start(self.btn_output_properties)        self.hbox_buttons.pack_start(self.btn_refresh)    def go_to_host(self, host):        """Go to host line on nmap output result"""        buff = self.text_view.get_buffer()        start_iter, end_iter = buff.get_bounds()        output = buff.get_text(start_iter, end_iter).split("\n")        re_host = re.compile("%s\s{0,1}:" % re.escape(host))        for i in xrange(len(output)):            if re_host.search(output[i]):                self.text_view.scroll_to_iter(buff.get_iter_at_line(i), 0, True, 0, 0)                break            def enable_color_highlight(self, widget):        if widget.get_active():            self.nmap_highlight.enable = 1        else:            self.nmap_highlight.enable = 0        self.update_output_colors()    def show_output_properties(self, widget):        nmap_out_prop = NmapOutputProperties(self.text_view)        #nmap_out_prop.connect("response", self.update_output_colors)                nmap_out_prop.run()                for prop in nmap_out_prop.property_names:            widget = nmap_out_prop.property_names[prop][8]            wid_props = []            if widget.bold:                wid_props.append(1)            else:                wid_props.append(0)            if widget.italic:                wid_props.append(1)            else:                wid_props.append(0)            if widget.underline:                wid_props.append(1)            else:                wid_props.append(0)             wid_props.append("(%s, %s, %s)" % (widget.text_color.red,                                               widget.text_color.green,                                               widget.text_color.blue))            wid_props.append("(%s, %s, %s)" % (widget.highlight_color.red,                                               widget.highlight_color.green,                                               widget.highlight_color.blue))            self.nmap_highlight.__setattr__(widget.property_name, wid_props)                    nmap_out_prop.destroy()        self.nmap_highlight.save_changes()        self.update_output_colors()    def update_output_colors(self, dialog=None, response_id=None):        buff = self.text_view.get_buffer()        tag_table = buff.get_tag_table()        start = buff.get_start_iter()        end = buff.get_end_iter()        buff.remove_all_tags(start, end)        buff.apply_tag(self.txg_font, start, end)        if not self.nmap_highlight.enable:            return                text = buff.get_text(start, end)        if text:            text = text.split("\n")            properties = ["details",                          "date",                          "hostname",                          "ip",                          "port_list",                          "open_port",                          "closed_port",                          "filtered_port"]                        for pos in xrange(len(text)):                if not text[pos]:                    continue                                for p in xrange(len(properties)):                    settings = self.nmap_highlight.__getattribute__(properties[p])                    match = re.finditer(settings[5], text[pos])                    # Create tags only if there's a matching for the expression                    if match:                        tag = gtk.TextTag()                                                if settings[0]:                            tag.set_property("weight", pango.WEIGHT_HEAVY)                        else:                            tag.set_property("weight", pango.WEIGHT_NORMAL)                                                    if settings[1]:                            tag.set_property("style", pango.STYLE_ITALIC)                        else:                            tag.set_property("style", pango.STYLE_NORMAL)                                                if settings[2]:                            tag.set_property("underline", pango.UNDERLINE_SINGLE)                        else:                            tag.set_property("underline", pango.UNDERLINE_NONE)                        text_color = settings[3]                        highlight_color = settings[4]                        tag.set_property("foreground",gtk.color_selection_palette_to_string([gtk.gdk.Color(*text_color),]))                        tag.set_property("background",gtk.color_selection_palette_to_string([gtk.gdk.Color(*highlight_color),]))                        tag_table.add(tag)                        tag.set_priority(p)                    for m in match:                        try:                            buff.apply_tag(tag, buff.get_iter_at_line_index(pos, m.start()),                                           buff.get_iter_at_line_index(pos, m.end()))                        except:                            pass                    # Brasil-sil-sil!!!                    match = re.finditer("Bra[sz]il", text[pos])                    for m in match:                        tag1 = gtk.TextTag()                        tag2 = gtk.TextTag()                        tag3 = gtk.TextTag()                        tag_table.add(tag1)                        tag_table.add(tag2)                        tag_table.add(tag3)                        tag1.set_property("foreground", "#EAFF00")                        tag1.set_property("background", "#21C800")                        tag1.set_property("weight", pango.WEIGHT_HEAVY)                                            tag2.set_property("foreground", "#0006FF")                        tag2.set_property("background", "#21C800")                        tag2.set_property("weight", pango.WEIGHT_HEAVY)                                                tag3.set_property("foreground", "#FFFFFF")                        tag3.set_property("background", "#21C800")                        tag3.set_property("weight", pango.WEIGHT_HEAVY)                        try:                            buff.apply_tag(tag1, buff.get_iter_at_line_index(pos, m.start()),                                           buff.get_iter_at_line_index(pos, m.end() - 5))                            buff.apply_tag(tag2, buff.get_iter_at_line_index(pos, m.start() + 1),                                           buff.get_iter_at_line_index(pos, m.end() -4))                            buff.apply_tag(tag3, buff.get_iter_at_line_index(pos, m.start() + 2),                                           buff.get_iter_at_line_index(pos, m.end() - 3))                                                        buff.apply_tag(tag1, buff.get_iter_at_line_index(pos, m.start() + 3),                                           buff.get_iter_at_line_index(pos, m.end() - 2))                            buff.apply_tag(tag2, buff.get_iter_at_line_index(pos, m.start() + 4),                                           buff.get_iter_at_line_index(pos, m.end() - 1))                            buff.apply_tag(tag3, buff.get_iter_at_line_index(pos, m.start() + 5),                                           buff.get_iter_at_line_index(pos, m.end()))                        except:                            pass                    else:                        self._brasil_log()                                        match = re.finditer("BRT", text[pos])                    for m in match:                        tag1 = gtk.TextTag()                        tag2 = gtk.TextTag()                        tag3 = gtk.TextTag()                        tag_table.add(tag1)                        tag_table.add(tag2)                        tag_table.add(tag3)                        tag1.set_property("foreground", "#EAFF00")                        tag1.set_property("background", "#21C800")                        tag1.set_property("weight", pango.WEIGHT_HEAVY)                                            tag2.set_property("foreground", "#0006FF")                        tag2.set_property("background", "#21C800")                        tag2.set_property("weight", pango.WEIGHT_HEAVY)                                                tag3.set_property("foreground", "#FFFFFF")                        tag3.set_property("background", "#21C800")                        tag3.set_property("weight", pango.WEIGHT_HEAVY)                        try:                            buff.apply_tag(tag1, buff.get_iter_at_line_index(pos, m.start()),                                           buff.get_iter_at_line_index(pos, m.end() - 2))                            buff.apply_tag(tag2, buff.get_iter_at_line_index(pos, m.start() + 1),                                           buff.get_iter_at_line_index(pos, m.end() -1))                            buff.apply_tag(tag3, buff.get_iter_at_line_index(pos, m.start() + 2),                                           buff.get_iter_at_line_index(pos, m.end()))                        except:                            pass                    else:                        self._brasil_log()    def _brasil_log(self):        if self.brazil:            log.info("Isto aqui, o o")            log.info("E um pouquinho de Brasil, io io")            log.info("Deste Brasil que canta e e feliz")            log.info("Feliz, feliz")            log.info("")            log.info("E tambem um pouco de uma raca")            log.info("Que nao tem medo de fumaca ai, ai")            log.info("E nao se entrega, nao ")            log.info("")            log.info('Olha o jeito das "cadera"  que ela sabe dar')            log.info("Olha o tombo nos quadris que ela sabe dar")            log.info("Olha o passe de batuque que ela sabe dar")            log.info("Olha so o remelexo que ela sabe dar")            log.info("")            log.info("Morena boa me faz chorar")            log.info("Poe a sandalia de prata")            log.info("e vem pro samba sambar")                        self.brazil = False        def show_nmap_output (self, file):        self.nmap_output_file = file        self.refresh_output()        def refresh_output(self, widget=None):        log.debug("Refresh nmap output")        nmap_of = open(self.nmap_output_file, "r")        new_output = nmap_of.read()        if self.nmap_previous_output != new_output:            self.text_buffer.set_text(enc(new_output))            self.nmap_previous_output = new_output        nmap_of.close()    if __name__ == '__main__':    w = gtk.Window()    n = NmapOutputViewer()    w.add(n)    w.show_all()    w.connect('delete-event', lambda x,y,z=None:gtk.main_quit())    buff = n.text_view.get_buffer()    buff.set_text(read_file("file_with_encoding_issues.txt"))        gtk.main()

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?