1#!/usr/bin/perl
2use strict;
3use warnings;
4
5use FindBin qw($Bin);
6
7my $target = shift || die("You must specify target IP address\n");
8my $port   = shift || die("You must specify target open TCP port\n");
9
10use Net::SinFP;
11use Net::SinFP::DB;
12use Net::Packet::Target;
13use Net::Packet::Env qw($Env);
14
15$Env->updateDevInfo($target);
16
17my $db = Net::SinFP::DB->new(db => "$Bin/../bin/sinfp.db");
18$db->loadSignatures;
19
20my $sinfp = Net::SinFP->new(
21   db       => $db,
22   h2Match  => 1,
23   doP1     => 1,
24   doP2     => 1,
25   doP3     => 1,
26   target   => Net::Packet::Target->new(
27      ip   => $target,
28      port => $port,
29   ),
30);
31
32$sinfp->start;
33$sinfp->analyzeResponses;
34$sinfp->matchOsfps;
35
36if ($sinfp->resultList) {
37   my $buf = '';
38   my %os;
39   for ($sinfp->resultList) {
40      $os{$_->os.':'.$_->osVersion} = $_;
41   }
42   for (sort keys %os) {
43      $buf .= $os{$_}->os.': '.$os{$_}->osVersion.
44         ' ('.$os{$_}->matchMask.'/'.$os{$_}->matchType.')';
45      $buf .= "\n";
46   }
47   $buf ? print $buf : print "sinfp error\n";
48}
49else {
50   print "Unknown operating system\n";
51}
52
53$sinfp->clean;
54