[Perl] Shodan Tool 0.6

Iniciado por BigBear, 10 Abril 2015, 16:01 PM

0 Miembros y 1 Visitante están viendo este tema.

BigBear

Un simple script para hacer busquedas en Shodan con las siguientes opciones :

  • Buscar resultados por IP
  • Buscar resultados por cantidad
  • Busqueda normal
  • Listar los query guardados
  • Busca los query guardados que ya fueron buscados
  • Lista los tags mas populares
  • Lista todos los servicios que shodan encuentra
  • DNS Lookup
  • Reverse DNS Lookup
  • Te devuelve tu IP
  • Te da informacion sobre tu API

    Es necesario que tengan una API Key suya para poder usar la API de Shodan.

    Un video con ejemplos de uso :

    [youtube=640,360]https://www.youtube.com/watch?v=pvtNveG1N-w[/youtube]

    El codigo :

    Código (perl) [Seleccionar]

    #!usr/bin/perl
    #Shodan Tool 0.6
    #(C) Doddy Hackman 2015
    #Based on : https://developer.shodan.io/api
    #ppm install http://www.eekboek.nl/dl/ppms/Crypt-SSLeay.ppd
    #ppm install http://www.bribes.org/perl/ppm/JSON.ppd

    use LWP::UserAgent;
    use JSON;
    use Getopt::Long;
    use Color::Output;
    Color::Output::Init;
    use IO::Socket;

    my $nave = LWP::UserAgent->new( ssl_opts => { verify_hostname => 1 } );
    $nave->agent(
    "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:25.0) Gecko/20100101 Firefox/25.0"
    );
    $nave->timeout(5);

    my $api_key = "LY10TuYViggY3GXRzLOUxdp6Kk3Lu9sa";

    GetOptions(
       "ip=s"           => \$ip,
       "count=s"        => \$count,
       "search=s"       => \$search,
       "query"          => \$query,
       "query_search=s" => \$query_search,
       "query_tags"     => \$query_tags,
       "services"       => \$services,
       "resolve=s"      => \$resolve,
       "reverse=s"      => \$reverse,
       "myip"           => \$myip,
       "api_info"       => \$api_info
    );

    head();

    if ( $ip ne "" ) {
       if ( $ip =~ /^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/ ) {
           print by_ip($ip);
       }
       else {
           my $get = gethostbyname($ip);
           my $ip  = inet_ntoa($get);
           by_ip($ip);
       }
    }
    elsif ( $count ne "" ) {
       by_count($count);
    }
    elsif ( $search ne "" ) {
       by_search($search);
    }
    elsif ( $query ne "" ) {
       by_query();
    }
    elsif ($query_search) {
       by_query_search($query_search);
    }
    elsif ($query_tags) {

       by_query_tags($query_tags);

    }
    elsif ( $services ne "" ) {
       list_services();
    }
    elsif ( $resolve ne "" ) {
       resolve($resolve);
    }
    elsif ( $reverse ne "" ) {
       reverse_now($reverse);
    }
    elsif ( $myip ne "" ) {
       my_ip();
    }
    elsif ( $api_info ne "" ) {
       api_info();
    }
    else {
       sintax();
    }

    copyright();

    # Functions

    sub by_query_tags {

       printear_titulo("\n[+] Listening the most popular tags  ...\n\n");

       my $code =
         toma( "https://api.shodan.io/shodan/query/tags?key=" . $api_key );

       $resultado = JSON->new->decode($code);

       my $total = $resultado->{'total'};

       if ( $total ne "" ) {
           printear("[+] Total : ");
           print $total. "\n\n";
       }
       else {
           printear("[-] WTF !");
       }

       my $i = 0;

       my @encontrados = @{ $resultado->{'matches'} };
       foreach my $encontrado (@encontrados) {
           my $value = $encontrado->{"value"};
           my $count = $encontrado->{"count"};

           $i++;
           print "-------------------------------------\n\n";
           if ( $value ne "" ) {
               printear("[+] Value : ");
               print $value. "\n";
           }

           if ( $count ne "" ) {
               printear("[+] Count : ");
               print $count. "\n";
           }

           print "\n-------------------------------------\n";

           if ( $i % 5 == 0 ) {
               printear("\n[+] Press enter to show more\n");
               <STDIN>;
           }

       }

    }

    sub by_query_search {

       my $query = $_[0];

       printear_titulo(
           "\n[+] Searching in the directory of saved search queries ...\n\n");

       my $code =
         toma( "https://api.shodan.io/shodan/query/search?key="
             . $api_key
             . "&query="
             . $query );

       $resultado = JSON->new->decode($code);

       my $total = $resultado->{'total'};

       if ( $total ne "" ) {
           printear("[+] Total : ");
           print $total. "\n\n";
       }
       else {
           printear("[-] WTF !");
       }

       my $i = 0;

       my @encontrados = @{ $resultado->{'matches'} };
       foreach my $encontrado (@encontrados) {
           $i++;
           print "-------------------------------------\n\n";
           my $votes       = $encontrado->{"votes"};
           my $description = $encontrado->{"description"};
           my $title       = $encontrados->{"title"};
           my $timestamp   = $encontrados->{"timestamp"};
           my $query       = $encontrados->{"query"};

           if ( $votes ne "" ) {
               printear("[+] Votes : ");
               print $votes. "\n";
           }

           if ( $description ne "" ) {
               printear("[+] Description : ");
               print $description. "\n\n";
           }

           if ( $title ne "" ) {
               printear("[+] Title : ");
               print $title. "\n";
           }

           if ( $timestamp ne "" ) {
               printear("[+] Timestamp : ");
               print $timestamp. "\n";
           }

           if ( $query ne "" ) {
               printear("[+] Query : ");
               print $query. "\n";
           }

           printear("[+] Tags : ");
           my @tags = @{ $encontrado->{'tags'} };
           foreach my $tag (@tags) {
               print $tag. "\t";
           }
           print "\n";

           print "\n-------------------------------------\n";

           if ( $i % 5 == 0 ) {
               printear("\n[+] Press enter to show more\n");
               <STDIN>;
           }

       }

    }

    sub by_query {

       printear_titulo("\n[+] Listening the saved search queries ...\n\n");

       my $code = toma( "https://api.shodan.io/shodan/query?key=" . $api_key );
       $resultado = JSON->new->decode($code);

       my $total = $resultado->{'total'};

       if ( $total ne "" ) {
           printear("[+] Total : ");
           print $total. "\n\n";
       }
       else {
           printear("[-] WTF !");
       }

       my $i = 0;

       my @encontrados = @{ $resultado->{'matches'} };
       foreach my $encontrado (@encontrados) {
           $i++;
           print "-------------------------------------\n\n";
           my $votes       = $encontrado->{"votes"};
           my $description = $encontrado->{"description"};
           my $title       = $encontrados->{"title"};
           my $timestamp   = $encontrados->{"timestamp"};
           my $query       = $encontrados->{"query"};

           if ( $votes ne "" ) {
               printear("[+] Votes : ");
               print $votes. "\n";
           }

           if ( $description ne "" ) {
               printear("[+] Description : ");
               print $description. "\n\n";
           }

           if ( $title ne "" ) {
               printear("[+] Title : ");
               print $title. "\n";
           }

           if ( $timestamp ne "" ) {
               printear("[+] Timestamp : ");
               print $timestamp. "\n";
           }

           if ( $query ne "" ) {
               printear("[+] Query : ");
               print $query. "\n";
           }

           printear("[+] Tags : ");
           my @tags = @{ $encontrado->{'tags'} };
           foreach my $tag (@tags) {
               print $tag. "\t";
           }
           print "\n";

           print "\n-------------------------------------\n";

           if ( $i % 5 == 0 ) {
               printear("\n[+] Press enter to show more\n");
               <STDIN>;
           }

       }

    }

    sub list_services {

       printear_titulo("\n[+] Listening all services that Shodan crawls ...\n\n");

       my $code = toma( "https://api.shodan.io/shodan/services?key=" . $api_key );
       if ( $code ne "" ) {
           my $i = 0;
           while ( $code =~ /"(.*?)": "(.*?)"/migs ) {
               $i++;
               my $port = $1;
               my $name = $2;
               printear("[+] Port : ");
               print $port. "\n";
               printear("[+] Name : ");
               print $name. "\n\n";

               if ( $i % 20 == 0 ) {
                   printear("\n[+] Press enter to show more\n");
                   <STDIN>;
               }

           }
       }
       else {
           print "[-] WTF !" . "\n";
       }

    }

    sub resolve {

       my $hostnames = $_[0];

       printear_titulo("\n[+] Working in DNS Lookup ...\n\n");

       my $code =
         toma( "https://api.shodan.io/dns/resolve?hostnames="
             . $hostnames . "&key="
             . $api_key );
       if ( $code ne "" ) {
           while ( $code =~ /"(.*?)": "(.*?)"/migs ) {
               my $host = $1;
               my $ip   = $2;
               printear("[+] Hostname : ");
               print $host. "\n";
               printear("[+] IP : ");
               print $ip. "\n";
           }
       }
       else {
           printear( "[-] WTF !" . "\n" );
       }

    }

    sub reverse_now {

       $ips = $_[0];

       printear_titulo("\n[+] Working in Reverse DNS Lookup ...\n\n");

       my $code = toma(
           "https://api.shodan.io/dns/reverse?ips=" . $ips . "&key=" . $api_key );
       if ( $code ne "" ) {
           while ( $code =~ /"(.*?)": \["(.*?)"\]/migs ) {
               my $ip   = $1;
               my $host = $2;
               printear("[+] IP : ");
               print $ip. "\n";
               printear("[+] Hostname : ");
               print $host. "\n";
           }
       }
       else {
           printear( "[-] WTF !" . "\n" );
       }
    }

    sub my_ip {
       printear_titulo("\n[+] Getting your IP ...\n\n");
       my $code = toma( "https://api.shodan.io/tools/myip?key=" . $api_key );
       if ( $code =~ /"(.*)"/ ) {
           my $ip = $1;
           printear("[+] IP : ");
           print $ip. "\n";
       }
       else {
           printear( "[-] WTF !" . "\n" );
       }
    }

    sub api_info {

       printear_titulo("\n[+] Getting your API Info ...\n\n");

       my $code = toma( "https://api.shodan.io/api-info?key=" . $api_key );

       $resultado = JSON->new->decode($code);
       my $unlock_left = $resultado->{"unlocked_left"};
       my $telnet      = $resultado->{"telnet"};
       my $plan        = $resultado->{"plan"};
       my $http        = $resultado->{"https"};
       my $unlocked    = $resultado->{"unlocked"};

       if ( $unlock_left ne "" ) {
           printear("[+] Unlocked left : ");
           print $unlock_left. "\n";
       }
       if ( $telnet ne "" ) {
           printear("[+] Telnet : ");
           print $telnet. "\n";
       }
       if ( $plan ne "" ) {
           printear("[+] Plan : ");
           print $plan. "\n";
       }
       if ( $http ne "" ) {
           printear("[+] HTTPS : ");
           print $http. "\n";
       }
       if ( $unlocked ne "" ) {
           printear("[+] Unlocked : ");
           print $unlocked. "\n";
       }

    }

    sub by_count {

       my $query  = $_[0];
       my $fecets = "";

       printear_titulo("\n[+] Searching in Shodan without Results ...\n\n");

       my $code =
         toma( "https://api.shodan.io/shodan/host/count?key="
             . $api_key
             . "&query="
             . $query
             . "&facets="
             . $facets );

       $resultado = JSON->new->decode($code);
       my $total = $resultado->{"total"};
       if ( $total ne "" ) {
           printear("[+] Total : ");
           print $total. "\n";
       }
       else {
           printear( "[-] WTF !" . "\n" );
       }

    }

    sub by_ip {

       my $target = $_[0];

       printear("\n[+] Target : ");
       print $target. "\n";

       printear_titulo("\n[+] Getting Host Information ...\n\n");

       my $code = toma(
           "https://api.shodan.io/shodan/host/" . $target . "?key=" . $api_key );
       $resultado = JSON->new->decode($code);

       my $ip           = $resultado->{'ip'};
       my $country_name = $resultado->{'country_name'};
       my $country_code = $resultado->{'country_code'};
       my $region_name  = $resultado->{'region_name'};
       my $postal_code  = $resultado->{'postal_code'};

       if ( $ip ne "" ) {
           printear("[+] IP : ");
           print $ip. "\n";
       }
       if ( $country_name ne "" ) {
           printear("[+] Country Name : ");
           print $country_name. "\n";
       }
       if ( $country_code ne "" ) {
           printear("[+] Country Code : ");
           print $country_code. "\n";
       }
       if ( $region_name ne "" ) {
           printear("[+] Area Code : ");
           print $region_name. "\n";
       }
       if ( $postal_code ne "" ) {
           printear("[+] Postal Code : ");
           print $postal_code. "\n";
       }
       printear("[+] Hostnames : ");
       my @hostnames = @{ $resultado->{'hostnames'} };
       foreach my $host (@hostnames) {
           print $host. "\t";
       }
       print "\n";
       printear_titulo("\n[+] Getting Data ...\n\n");
       my $i           = 0;
       my @encontrados = @{ $resultado->{'data'} };
       foreach my $encontrado (@encontrados) {
           $i++;
           print "-------------------------------------\n\n";
           my $ip           = $encontrado->{"ip_str"};
           my $country      = $encontrado->{"location"}{"country_name"};
           my $product      = $encontrado->{"product"};
           my $version      = $encontrado->{"version"};
           my $data         = $encontrado->{"data"};
           my $cpe          = $encontrado->{"cpe"};
           my $time         = $encontrado->{"timestamp"};
           my $last_updated = $encontrado->{"last_update"};
           my $port         = $encontrado->{"port"};
           my $os           = $encontrado->{"os"};
           my $isp          = $encontrado->{"isp"};
           my $ans          = $encontrado->{"ans"};
           my $banner       = $encontrado->{"banner"};

           if ( $ip ne "" ) {
               printear("[+] IP : ");
               print $ip. "\n";
           }
           if ( $port ne "" ) {
               printear("[+] Port : ");
               print $port. "\n";
           }
           printear("[+] Hostnames : ");
           my @hostnames2 = @{ $encontrado->{'hostnames'} };
           foreach my $host2 (@hostnames2) {
               print $host2. "\t";
           }
           print "\n";
           if ( $country ne "" ) {
               printear("[+] Country : ");
               print $country. "\n";
           }
           if ( $product ne "" ) {
               printear("[+] Product : ");
               print $product. "\n";
           }
           if ( $version ne "" ) {
               printear("[+] Version : ");
               print $version. "\n";
           }
           if ( $data ne "" ) {
               printear("[+] Data : ");
               print "\n\n" . $data . "\n";
           }
           if ( $time ne "" ) {
               printear("[+] Time : ");
               print $time. "\n";
           }
           if ( $last_updated ne "" ) {
               printear("[+] Last Updated : ");
               print $last_updated. "\n";
           }
           if ( $cpe ne "" ) {
               printear("[+] CPE : ");
               print $cpe. "\n";
           }
           if ( $os ne "" ) {
               printear("[+] OS : ");
               print $os. "\n";
           }
           if ( $isp ne "" ) {
               printear("[+] ISP : ");
               print $isp. "\n";
           }
           if ( $asn ne "" ) {
               printear("[+] ASN : ");
               print $ans. "\n";
           }
           if ( $banner ne "" ) {
               printear("[+] Banner : ");
               print $banner. "\n";
           }
           print "\n-------------------------------------\n";

           if ( $i % 5 == 0 ) {
               printear("\n[+] Press enter to show more\n");
               <STDIN>;
           }

       }

    }

    sub by_search {

       my $target = $_[0];

       printear("[+] Target : ");
       print $target. "\n";

       printear_titulo("\n[+] Searching in Shodan ...\n\n");

       my $code =
         toma( "https://api.shodan.io/shodan/host/search?key="
             . $api_key
             . "&query="
             . $target
             . "&facets=" );

       $resultado = JSON->new->decode($code);

       my $total = $resultado->{'total'};

       if ( $total ne "" ) {
           printear("[+] Total : ");
           print $total. "\n";
       }
       else {
           printear("[-] WTF !");
       }

       my $ip           = $resultado->{'ip'};
       my $country_name = $resultado->{'country_name'};
       my $country_code = $resultado->{'country_code'};
       my $region_name  = $resultado->{'region_name'};
       my $postal_code  = $resultado->{'postal_code'};

       if ( $ip ne "" ) {
           printear("[+] IP : ");
           print $ip. "\n";
       }
       if ( $country_name ne "" ) {
           printear("[+] Country Name : ");
           print $country_name. "\n";
       }
       if ( $country_code ne "" ) {
           printear("[+] Country Code : ");
           print $country_code. "\n";
       }
       if ( $region_name ne "" ) {
           printear("[+] Area Code : ");
           print $region_name. "\n";
       }
       if ( $postal_code ne "" ) {
           printear("[+] Postal Code : ");
           print $postal_code. "\n";
       }

       if ( $resultado->{'hostnames'}[0] ne "" ) {
           printear("[+] Hostnames : ");
           my @hostnames = @{ $resultado->{'hostnames'} };
           foreach my $host (@hostnames) {
               print $host. "\t";
           }
           print "\n";
       }

       printear_titulo("\n[+] Getting Data ...\n\n");

       my $i = 0;

       my @encontrados = @{ $resultado->{'matches'} };
       foreach my $encontrado (@encontrados) {
           $i++;
           print "-------------------------------------\n\n";
           my $ip           = $encontrado->{"ip_str"};
           my $country      = $encontrado->{"location"}{"country_name"};
           my $product      = $encontrado->{"product"};
           my $version      = $encontrado->{"version"};
           my $data         = $encontrado->{"data"};
           my $cpe          = $encontrado->{"cpe"};
           my $time         = $encontrado->{"timestamp"};
           my $last_updated = $encontrado->{"last_update"};
           my $port         = $encontrado->{"port"};
           my $os           = $encontrado->{"os"};
           my $isp          = $encontrado->{"isp"};
           my $ans          = $encontrado->{"ans"};
           my $banner       = $encontrado->{"banner"};

           if ( $ip ne "" ) {
               printear("[+] IP : ");
               print $ip. "\n";
           }
           if ( $port ne "" ) {
               printear("[+] Port : ");
               print $port. "\n";
           }
           printear("[+] Hostnames : ");
           my @hostnames2 = @{ $encontrado->{'hostnames'} };
           foreach my $host2 (@hostnames2) {
               print $host2. "\t";
           }
           print "\n";
           if ( $country ne "" ) {
               printear("[+] Country : ");
               print $country. "\n";
           }
           if ( $product ne "" ) {
               printear("[+] Product : ");
               print $product. "\n";
           }
           if ( $version ne "" ) {
               printear("[+] Version : ");
               print $version. "\n";
           }
           if ( $data ne "" ) {
               printear("[+] Data : ");
               print "\n\n" . $data . "\n";
           }
           if ( $time ne "" ) {
               printear("[+] Time : ");
               print $time. "\n";
           }
           if ( $last_updated ne "" ) {
               printear("[+] Last Updated : ");
               print $last_updated. "\n";
           }
           if ( $cpe ne "" ) {
               printear("[+] CPE : ");
               print $cpe. "\n";
           }
           if ( $os ne "" ) {
               printear("[+] OS : ");
               print $os. "\n";
           }
           if ( $isp ne "" ) {
               printear("[+] ISP : ");
               print $isp. "\n";
           }
           if ( $asn ne "" ) {
               printear("[+] ASN : ");
               print $ans. "\n";
           }
           if ( $banner ne "" ) {
               printear("[+] Banner : ");
               print $banner. "\n";
           }
           print "\n-------------------------------------\n";

           if ( $i % 5 == 0 ) {
               printear("\n[+] Press enter to show more\n");
               <STDIN>;
           }

       }

    }

    sub printear {
       cprint( "\x036" . $_[0] . "\x030" );
    }

    sub printear_logo {
       cprint( "\x037" . $_[0] . "\x030" );
    }

    sub printear_titulo {
       cprint( "\x0310" . $_[0] . "\x030" );
    }

    sub toma {
       return $nave->get( $_[0] )->content;
    }

    sub sintax {
       printear("\n[+] Sintax : ");
       print "perl $0 <option> <value>\n";
       printear("\n[+] Options : \n\n");
       print "-ip <ip> : Host Information\n";
       print "-count <query> : Search Shodan without Results\n";
       print "-search <query> : Search Shodan\n";
       print "-query : List the saved search queries\n";
       print
         "-query_search <query> : Search the directory of saved search queries\n";
       print "-query_tags : List the most popular tags\n";
       print "-services : List all services that Shodan crawls\n";
       print "-resolve <host> : DNS Lookup\n";
       print "-reverse <ip> : Reverse DNS Lookup\n";
       print "-myip : My IP Address\n";
       print "-api_info : API Plan Information\n";
       printear("\n[+] Example : ");
       print "perl shodan.pl -search petardas\n";
       copyright();
    }

    sub head {
       printear_logo("\n-- == Shodan Tool 0.6 == --\n\n");
    }

    sub copyright {
       printear_logo("\n\n-- == (C) Doddy Hackman 2015 == --\n\n");
       exit(1);
    }

    # The End ?


    Si quieren bajar el programa lo pueden hacer de aca :

    SourceForge.

Pablo Videla

Tus scripts siempre son interesantes, deberías tenerlo en github pero no comprimidos , de esta forma podemos clonarlos o comentar sobre ellos, o corregir problemas ,etc.

Saludos y gracias por compartir!.