Perl Nmap报告处理+入库

熬夜写了下。。把它完善好了。。放出来吧。。没有加注释,以后会写成模块的方式。

#!/usr/bin/perl
use Nmap::Parser;
use DBI;
use Config::IniFiles;

main:
{
    if ($#ARGV == -1){
        usage();
        exit(1);
    }elsif($ARGV[1] eq undef || $ARGV[1] == m/^\w$/){
        usage();
        exit(1);
    }
    my $xmlfile=$ARGV[0];
    my $taskid=$ARGV[1];
    nmap_info($xmlfile,$taskid);
    print "搞定!\n";
}
sub usage{
    print "--------------------\n";
    print "Usage: perl nmap.xml taskid\n";
    print "--------------------\n";
    exit;
}
sub nmap_info{
    local($file_name)=shift;
    local($taskid)=shift;
    my $cfg=new Config::IniFiles(-file=>"config.ini");
    $drive=$cfg->val('DBI','db_drive');
    $db_name=$cfg->val('DBI','db_database');
    $db_host=$cfg->val('DBI','db_host');
    $db_username=$cfg->val('DBI','db_username');
    $db_password=$cfg->val('DBI','db_password');
    my $np=new Nmap::Parser;
    $np->parsefile("$file_name");
    my $in=DBI->connect("DBI:$drive:database=$db_name:host=$db_host","$db_username","$db_password") or die "Error:$!\n";
    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;
        }
        $start_time=$session->start_str();
        $end_time=$session->time_str();
        for my $tcp ($host->tcp_ports()){
            my $service=$host->tcp_service($tcp);
            if($host->tcp_port_state($tcp) eq 'open'){
                $tcp_port=1;
            }elsif($host->tcp_port_state($tcp) eq 'filtered'){
                $tcp_port=2;
            }elsif($host->tcp_port_state($tcp) eq 'unfiltered'){
                $tcp_port=3;
            }
            $service_name=$service->name();
            $service_port=$service->port();
            $service_confidence=$service->confidence();
    my $insert=$in->do("insert into services(hostid,create_at,port,proto,state,name,update_at,info)values('$taskid','$start_time','$service_port','tcp','$tcp_port','$service_name','$end_time','$service_confidence')");
        }
        for my $udp ($host->udp_ports()){
            my $service=$host->udp_service($udp);
            if($host->udp_port_state($udp) eq 'open'){
                $udp_port=1;
            }elsif($host->udp_port_state($udp) eq 'filtered'){
                $udp_port=2;
            }elsif($host->udp_port_state($udp) eq 'unfiltered'){
                $udp_port=3;
            }
            $service_name=$service->name();
            $service_port=$service->port();
            $service_confidence=$service->confidence();
            my $insert=$in->do("insert into services(host_id,create_at,port,proto,state,name,update_at,info)values('$taskid','$start_time','$service_port','udp','$udp_port','$service_name','$end_time','$service_confidence')");
        }
        my $insert=$in->do("insert into hosts(taskid,create_at,address,mac,name,state,os_name,os_flavor,os_sp,os_lang,update_at,vuln_count,service_count,exploit_attemp_count)values('$taskid','$start_time','$host_addr','$host_mac_addr','$host_hostname','$host_status','$osfamily','$osgen','$os_name','null','$end_time','null','$tcp_port_count','null')");

    }
    $in->disconnect();
}
原文地址:https://www.cnblogs.com/xiaoCon/p/2965275.html