zoukankan      html  css  js  c++  java
  • Perl Nmap报告处理摸索(学习)

    先说下当时的需求,而且思路:
    1.需求:需要扫描多个IP,把扫描结果保存到XML下。将XML下数据进行过滤,取出需要的数据打印出来。
    2.目前难点:根据场景的不同,扫描出来的结果差异无比的大,例如每次结果都有差距。偶尔会冒出一些不懂的字段。为此很伤脑筋。
    3.自己写出来的Perl代码:自己写的代码有点烂,可能学得不太好。Perl能够读取XML的节点,但是一旦扫多个IP,节点就会有变化。

    当时使用的模块有很多问题,对此无比的尴尬。一开始摸索的模块是这个:XML::Simple 这是一个XML专门的处理模块。
    贴上刚开始写的代码:

        #!/usr/bin/perl
    
        use XML::Simple;
        use Data::Dumper;
    
        my $simple=XML::Simple->new();
        my $data=$simple->XMLin('wai.xml');
        #print Dumper($data)."\n";
        print "-----------------------------------------------------\n";
        print "创建时间:".$data->{startstr}."\n";
        print "Ip地址:".$data->{host}->{address}[0]->{addr}."\n";
        print "mac地址:".$data->{host}->{address}[1]->{addr}."\n";
        print "主机名称:null\n";
        print "主机状态:".$data->{host}->{status}->{state}."\n";
        print "操作系统名称:".$data->{host}->{os}->{osclass}->{osfamily}."\n";
        print "操作系统版本:".$data->{host}->{os}->{osclass}->{osgen}."\n";
        print "操作系统补丁:".$data->{host}->{os}->{osmatch}->{name}."\n";
        print "操作系统语言:null\n";
        print "表更新时间:".$data->{runstats}->{finished}->{timestr}."\n";
        print "服务总数量:".$data->{taskend}[3]->{extrainfo}."\n";

    这就刚开始写的代码,比较纠结的问题来了,当扫描单个IP的时候,输出完全正常,但是在扫描多个节点的IP的时候,
    根据场景的不同,输出结果就有很大的区别,对此甚是无奈,所以只能google搜索下解决的思路。
    在后续找到一个脚本跟我的需求基本差不多,但是他使用的是sqlite3的数据库,而我目前准备使用的是mysql的数据库,
    所以嘛,我得修改下。具体的代码请看上一篇文章,我做了个MARK。
    接着我分析了下这个脚本使用的模块说明,无比蛋疼。。。没办法,英语不太好,所以我就google一个个单词翻译.
    在此忽略了1晚上时间。。。具体说明文档在 http://search.cpan.org/~apersaud/Nmap-Parser-1.3/Parser.pm
    感兴趣的童鞋可以自己移步去研究下。当然,我在这只是大概说下自己的分析思路。
    接着放出最终解决问题的脚本(具体插库的那部分我删除了,你可以自己加),欢迎讨论和学习。。:)

        use Nmap::Parser;
        use DBI;
        use Config::IniFiles;
    
        main:
        {
                if ($#ARGV == -1){
                        usage();
                        exit(1);
                }
                my $xmlfile=$ARGV[0];
                nmap_info($xmlfile);
        }
        sub usage{
                print "--------------------\n";
                print "Usage: perl nmap.xml\n";
                print "--------------------\n";
                exit;
        }
        sub nmap_info{
                local($file_name)=shift;
                my $np=new Nmap::Parser;
                $np->parsefile("$file_name");
    
                my $session=$np->get_session();
                for my $host ($np->all_hosts()){
                        if($host->addr eq undef){
                                $host_addr='null';
                        }else{
                                $host_addr=$host->addr;
                        }
                        if($host->status eq undef){
                                $host_status='null';
                        }elsif($host->status eq 'down'){
                                $host_status=1;
                        }elsif($host->status eq 'up'){
                                $host_status=0;
                        }
                        if($host->hostname eq undef){
                                $host_hostname='null';
                        }else{
                                $host_hostname=$host->hostname;
                        }
                        if($host->mac_addr eq undef){
                                $host_mac_addr='null';
                        }else{
                                $host_mac_addr=$host->mac_addr();
                        }
                        if($host->tcp_port_count eq undef){
                                $tcp_port_count='null';
                        }else{
                                $tcp_port_count=$host->tcp_port_count;
                        }
                        if($host->os_sig->osfamily eq undef){
                                $osfamily='null';
                        }else{
                                $osfamily=$host->os_sig->osfamily;
                        }
                        if($host->os_sig->osgen eq undef){
                                $osgen='null';
                        }else{
                                $osgen=$host->os_sig->osgen;
                        }
                        if($host->os_sig->name eq undef){
                                $os_name='null';
                        }else{
                                $os_name=$host->os_sig->name;
                        }
                        print "IP:",$host_addr,"\n";
                        print "状态:",$host_status,"\n";
                        print "主机名:",$host_hostname,"\n";
                        print "开始时间:",$session->start_str(),"\n";
                        print "结束时间:",$session->time_str(),"\n";
                        print "Mac地址:",$host_mac_addr,"\n";
                        print "服务数量:",$tcp_port_count,"\n";
                        print "系统名称:",$osfamily,"\n";
                        print "系统版本:",$osgen,"\n";
                        print "系统补丁版本:",$os_name,"\n";
              }
        }
  • 相关阅读:
    以管理员权限运行程序?
    vb6 判断64位操作系统
    vb6动态创建webbrowser
    vb6中webbrowser控件树转换备忘
    vb6异步ADO操作
    sql compact 使用EF无法更新的问题?
    本地vbs调试快速显示输出
    c# 加密转载 备忘
    vb.net 动态调用api
    SharePoint List 查看器
  • 原文地址:https://www.cnblogs.com/xiaoCon/p/2964409.html
Copyright © 2011-2022 走看看