• Nmap结果文件XML文件解析


    对nmap扫描结果xml格式的文件进行解析,无需直接xml解析或读取,可直接使用模块:

    1.nmapparser

    安装:pip install nmapparser

    Demo:

    #!/usr/bin/env python
    # Copyright (C) 2007 Guilherme Polo <ggpolo@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
    # USA
    """
    A demo script showing how to use nmapparser.
    """
    
    import sys
    import re
    from nmapparser import NmapParser
    
    def usage():
        """Show demo usage."""
        print "Usage: %s xmlfile1.xml xmlfile2.xml ..." % __file__
    
    def getaddress(str):
        reg=u"addr': '(.*?)'}"
        lister=re.compile(reg)
        mylist=re.findall(lister,str)
        #print mylist
        return mylist[0]
    
    
    def main(args):
        parser = NmapParser()
        for xmlf in sys.argv[1:]:
            print "%s
    Parsing %s" % ('*' * 75, xmlf)
            parser.parse(xmlf)
    
            if not parser.parsed:
                continue
    
            print "Options:", parser.options
            print "Finish time:", parser.runstats.finished.time
    
            h_stats = parser.runstats.hosts
            print "Hosts -> total %s, up: %s, down: %s" % (
                h_stats.total, h_stats.up, h_stats.down)
    
            for host in parser.host:
                print "Host options:", host.options
    
                if 'extraports' in  host.options:
                    print "Host extraports:", host.ports.extraports
    
                print "Hostname:", host.hostnames
                print "HostIp:", getaddress(str(host.address))
    
                if 'ports' not in host.options or 
                    'ports' not in host.ports.options:
                    continue
    
                if 'script' in host.ports.ports[0].options:
                    print
                    print host.ports.ports[0].script[0].output
                    print
    
                print "Host ports info:"
                for p in host.ports.ports:
                    print "%20s%7s%9s%6s" % (getaddress(str(host.address)),p.portid, p.state, p.protocol)
    
    
    if __name__ == "__main__":
        if len(sys.argv) < 2:
            sys.exit(usage())
        main(sys.argv)

    解析:

    demo.py *.xml

    结果输出:

    2.python-libnmap

    安装:

    pip install python-libnmap //copyright AnYun.ORG

    Demo:

    #!/usr/bin/env python
    
    import argparse
    from libnmap.process import NmapProcess
    from libnmap.parser import NmapParser, NmapParserException
    
    def parse_args():
        ''' Create the arguments '''
        parser = argparse.ArgumentParser()
        parser.add_argument("-x", "--nmapxml", help="Nmap XML file to parse")
        parser.add_argument("-l", "--hostlist", help="Host list file")
        return parser.parse_args()
    
    def report_parser(report):
        ''' Parse the Nmap XML report '''
        for host in report.hosts:
            ip = host.address
    
            if host.is_up():
                hostname = 'N/A'
                # Get the first hostname (sometimes there can be multi)
                if len(host.hostnames) != 0:
                    hostname = host.hostnames[0]
    
                print '[*] {0} - {1}'.format(ip, hostname)
    
                # Get the port and service
                # objects in host.services are NmapService objects
                for s in host.services:
    
                    # Check if port is open
                    if s.open():
                        serv = s.service
                        port = s.port
                        ban = s.banner
    
                        # Perform some action on the data
                        print_data(ip, port, serv, ban)
    
    def print_data(ip, port, serv, ban):
        ''' Do something with the nmap data '''
        if ban != '':
            ban = ' -- {0}'.format(ban)
        print ip,port,serv,ban
    
        #print '    {0}: {1}{2}'.format(port, serv, ban)
        #print '    {0}: {1}{2}'.format(port, serv, ban)
    
    def main():
        args = parse_args()
        report = NmapParser.parse_fromfile(args.nmapxml)
        report_parser(report)
    
    main()

    解析:

    nmap-parser-dome.py -x  *.xml

    结果输出:

    以上能基本解析了XML文件内容,若有其他需求,可参照修改偷懒

  • 相关阅读:
    在Windows环境中使用版本管理工具Git [转]
    poj3630 Phone List **
    UVa10382 Watering Grass **
    软件项目计划书格式 [转]
    POI2001 Ants and the ladybug ***
    RMQ+1/1算法 [转]
    poj3264 Balanced Lineup *
    Windows Server 2003 出现的Service Unavailable怎么办?
    单车环佛山一环
    天凉了,大家多穿衣服
  • 原文地址:https://www.cnblogs.com/crac/p/8245734.html
Copyright © 2020-2023  润新知