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";
          }
    }

 

posted @ 2013-03-17 13:41  墨迹哥's  阅读(316)  评论(0编辑  收藏  举报