speer0

SSL Cert Scan - TLS Deprication

May 11th, 2015
289
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Perl 4.91 KB | None | 0 0
  1. #!/usr/bin/env perl
  2. # requires system path to contain links to dig, sslscan and nmap.
  3. # autoflush the output by turning buffering off
  4. $|++;
  5.  
  6. use strict;
  7. use warnings;
  8. use Switch;
  9. use Data::Dumper;
  10.  
  11. my $debug = 0; # 1 outputs all to screen, 0 outputs to file
  12. my $output = 2; # (1 - all, 2 - error certs only, 3 - valid certs only) valid = certs meeting algo and keysize requirements
  13. my $date = `date +%Y-%m-%d_%H%M%S`;
  14. chomp($date);
  15. my $outfile = "/tmp/sslscan-$date.csv";
  16. if (! $debug) { print "Result file: $outfile\n"; }
  17. my $timeout = 5; # command execution timeout
  18.  
  19. my @networks = ( # subnets to scan
  20.                  '10.10.1.0/24',
  21.                );
  22.  
  23. my @ports = ( # ports to scan for SSL certs
  24.               '443',
  25.               '8443',
  26.             );
  27.  
  28. my @goodalgos = (
  29.                   'sha256WithRSAEncryption',
  30.                 );
  31. my %goodalgo = map { $_ => 0 } @goodalgos;
  32.  
  33. my $minkeysize = 2048; # minimum valid key length
  34.  
  35. my @ignoredips = ( # ips to ignore
  36.                   );
  37. my %ignored = map { $_ => 0 } @ignoredips;
  38.  
  39. my @sslhosts;
  40.  
  41. foreach my $network (@networks){
  42.   if ($debug) { print "Scanning subnet $network\n"; }
  43.   foreach my $port (@ports){
  44.     my @nmapout = `nmap -p$port -Pn -oG - $network`;
  45.     foreach my $line (@nmapout){
  46.       chomp ($line);
  47.       if ($line =~ /open/){
  48.         my (undef, $ip, undef) = split (/ /, $line, 3);
  49.         if (! exists($ignored{$ip})){
  50.           push @sslhosts, "$ip:$port";
  51.         }
  52.       }
  53.     }
  54.   }
  55. }
  56. #print @sslhosts;
  57. my %certs = ();
  58. foreach my $host (@sslhosts){
  59.   if ($debug) { print "Scaning Host: $host\n"; }
  60.   my @sslscan = `timeout $timeout sslscan --no-failed $host`;
  61.   my ($cn, $algo, $keysize, $start, $end, $issuer) = "";
  62.   my ($ip, $port) = split (/:/, $host, 2);
  63. #  if ($debug) { print "IP: $ip port: $port\n"; }
  64.   $certs{$ip}{$port} = ();
  65.   foreach my $line (@sslscan){
  66.     chomp ($line);
  67.     switch ($line){
  68.       case /Public-Key:/ {
  69.         $line =~ /(\d+)/;
  70.         $keysize = $1;
  71.         if ($debug) { print "Key: $keysize\n"; }
  72.         $certs{$ip}{$port}{'keysize'} = $keysize;
  73.       }
  74.       case /Subject:/ {
  75.         $line =~ /CN=(.*)/;
  76.         $cn = $1;
  77.         if (length $cn){
  78.         }else{
  79.           $cn = `timeout $timeout dig +short -x $ip`;
  80.           chomp($cn);
  81.           chop($cn);
  82.         }
  83.         if ($debug) { print "CN: $cn\n"; }
  84.         $certs{$ip}{$port}{'cn'} = $cn;
  85.       }
  86.       case /Signature Algorithm:/ {
  87.         $line =~ /Signature Algorithm:\W(.*)/;
  88.         $algo = $1;
  89.         if ($debug) { print "Algorithm: $algo\n"; }
  90.         $certs{$ip}{$port}{'algo'} = $algo;
  91.       }
  92.       case /Issuer:/ {
  93.         $line =~ /Issuer:\W(.*)/;
  94.         $issuer = $1;
  95.         if ($debug) { print "Issuer: $issuer\n"; }
  96.         $certs{$ip}{$port}{'issuer'} = $issuer;
  97.       }
  98.       case /Not valid before:/ {
  99.         $line =~ /Not valid before:\s(\w+\s+\d+).*(\d{4})/;
  100.         my $date = "$1 $2";
  101.         if ($debug) { print "Start Date: $date\n"; }
  102.         $certs{$ip}{$port}{'start'} = $date;
  103.       }
  104.       case /Not valid after:/ {
  105.         $line =~ /Not valid after:\s(\w+\s+\d+).*(\d{4})/;
  106.         my $date = "$1 $2";
  107.         if ($debug) { print "End Date: $date\n"; }
  108.         $certs{$ip}{$port}{'end'} = $date;
  109.       }
  110.     }
  111.   }
  112. }
  113.  
  114. if ($debug) { print "Completed Scan\n"; }
  115. if ($debug) { print Dumper %certs; }
  116.  
  117. if ($debug) { print "^IP^Port^Name^Keysize^Algorithm^Issuer^Start^End^Life^\n"; }
  118. else {
  119.   open(FH, '>', $outfile);
  120.   print FH "^IP^Port^Name^Keysize^Algorithm^Issuer^Start^End^Life^\n";
  121. }
  122. foreach my $ip (keys %certs){
  123.   foreach my $port (keys %{$certs{$ip}}){
  124.     if (defined $certs{$ip}{$port}){
  125.       my $line = "";
  126.       switch ($output) {
  127.         case 1 { # all certs
  128.           $line = "|$ip|$port|$certs{$ip}{$port}{'cn'}|$certs{$ip}{$port}{'keysize'}|$certs{$ip}{$port}{'algo'}|";
  129.           $line = $line."$certs{$ip}{$port}{'issuer'}|$certs{$ip}{$port}{'start'}|$certs{$ip}{$port}{'end'}|";
  130.         }
  131.         case 2 { # error certs
  132.           if ($certs{$ip}{$port}{'keysize'} < $minkeysize || ! exists $goodalgo{$certs{$ip}{$port}{'algo'}}){
  133.             $line = "|$ip|$port|$certs{$ip}{$port}{'cn'}|$certs{$ip}{$port}{'keysize'}|$certs{$ip}{$port}{'algo'}|";
  134.             $line = $line."$certs{$ip}{$port}{'issuer'}|$certs{$ip}{$port}{'start'}|$certs{$ip}{$port}{'end'}|";
  135.           }
  136.         }
  137.         case 3 { # valid certs
  138.           if ($certs{$ip}{$port}{'keysize'} >= $minkeysize && exists $goodalgo{$certs{$ip}{$port}{'algo'}}){
  139.             $line = "|$ip|$port|$certs{$ip}{$port}{'cn'}|$certs{$ip}{$port}{'keysize'}|$certs{$ip}{$port}{'algo'}|";
  140.             $line = $line."$certs{$ip}{$port}{'issuer'}|$certs{$ip}{$port}{'start'}|$certs{$ip}{$port}{'end'}|";
  141.           }
  142.         }
  143.       }
  144.       if (length $line){
  145.         if ($debug) { print "$line\n"; }
  146.         else { print FH "$line\n"; }
  147.       }
  148.     }
  149.   }
  150. }
  151. if (! $debug){
  152.   close(FH);
  153. }
Advertisement
Add Comment
Please, Sign In to add comment