Nikto是一款开源的网站扫描器,软件的编写语言为perl。本文主要对入口 文件nikto.pl进行简单解析。
nikto的目录结构:
nikto
|
+-----+ databases/ #规则库目录
|
+-----+ plugins/ #插件目录
|
+----- nikto.pl #入口文件
------------------------------------------------nikto.pl-------------------------------------------------
#!/usr/bin/perl
#加载所需模块,没什么可说的
use strict;
use Getopt::Long;
use Time::Local;
Getopt::Long::Configure('no_ignore_case'); # 处理配置时启用大小写敏感
# 定义全局变量, 没什么可说的
use vars qw/$TEMPLATES %CLI %VARIABLES %TESTS/;
use vars qw/%NIKTO %CONFIGFILE %COUNTERS %db_extensions/;
use vars qw/@RESULTS @PLUGINS @DBFILE @REPORTS %CONTENTSEARCH/;
$COUNTERS{'scan_start'} = time(); # 取得时间
$VARIABLES{'DIV'} = "-" x 75; # 设置分割符号
$VARIABLES{'name'} = "Nikto"; # 设置名字
$VARIABLES{'version'} = "2.1.5"; # 设置版本号
$VARIABLES{'configfile'} = "/etc/nikto.conf"; # 定义配置文件路径
# 自定义中断处理函数,按了ctrl+c就会执行该函数
$SIG{'INT'} = \&safe_quit;
config_init(); # 配置文件初始化
setup_dirs(); # 设置目录路径
require "$CONFIGFILE{'PLUGINDIR'}/nikto_core.plugin"; # 加载plugins/目录下的nikto_core.plugin
nprint("T:" . localtime($COUNTERS{'scan_start'}) . ": Starting", "d"); # d表示debug模式,输出该模式下的信息,(不输出到正常结果文件)
require "$CONFIGFILE{'PLUGINDIR'}/LW2.pm"; # 加载plugins/目录下的LW2.pm
require "$CONFIGFILE{'PLUGINDIR'}/JSON-PP.pm"; # 加载plugins/目录下的JSON-PP.pm
$VARIABLES{'GMTOFFSET'} = gmt_offset(); # 设置相对于格林威治时间的偏移量
LW2::init_ssl_engine($CONFIGFILE{'LW_SSL_ENGINE'}); # 配置SSL相关
my ($a, $b) = split(/\./, $LW2::VERSION); # 分割版本号,以便判断版本是否合适,版本号在LW2.PM里面有定义
die("- You must use LW2 2.4 or later\n") if ($a != 2 || $b < 4); # 如果LW2版本低于2.4,则报错
general_config(); # 进行配置,对命令行参数进行基本的验证
load_databases(); # 加载系统默认规则库
load_databases('u'); # 加载自定义规则库
nprint("- $VARIABLES{'name'} v$VARIABLES{'version'}"); # 输出指定模式下的信息
nprint($VARIABLES{'DIV'}); # 单参数情况,跟print效果一样
# 目标为空,报错
if ($CLI{'host'} eq "") {
nprint("+ ERROR: No host specified");
usage();
}
$COUNTERS{'total_targets'} = $COUNTERS{'hosts_completed'} = 0; #初始化扫描完成的目标个数为0
load_plugins(); #加载插件
# 传递获取到的参数,目标地址,端口,ssl选项,目标路径
my @MARKS = set_targets($CLI{'host'}, $CLI{'ports'}, $CLI{'ssl'}, $CLI{'root'});
# 指定了证书,则使用证书
if (defined($CLI{'key'}) || defined($CLI{'cert'})) {
$CLI{'key'} = $CLI{'cert'} unless (defined($CLI{'key'}));
$CLI{'cert'} = $CLI{'key'} unless (defined($CLI{'cert'}));
}
# 对上面获取到的参数进行处理
nikto的目录结构:
nikto
|
+-----+ databases/ #规则库目录
|
+-----+ plugins/ #插件目录
|
+----- nikto.pl #入口文件
------------------------------------------------nikto.pl-------------------------------------------------
#!/usr/bin/perl
#加载所需模块,没什么可说的
use strict;
use Getopt::Long;
use Time::Local;
Getopt::Long::Configure('no_ignore_case'); # 处理配置时启用大小写敏感
# 定义全局变量, 没什么可说的
use vars qw/$TEMPLATES %CLI %VARIABLES %TESTS/;
use vars qw/%NIKTO %CONFIGFILE %COUNTERS %db_extensions/;
use vars qw/@RESULTS @PLUGINS @DBFILE @REPORTS %CONTENTSEARCH/;
$COUNTERS{'scan_start'} = time(); # 取得时间
$VARIABLES{'DIV'} = "-" x 75; # 设置分割符号
$VARIABLES{'name'} = "Nikto"; # 设置名字
$VARIABLES{'version'} = "2.1.5"; # 设置版本号
$VARIABLES{'configfile'} = "/etc/nikto.conf"; # 定义配置文件路径
# 自定义中断处理函数,按了ctrl+c就会执行该函数
$SIG{'INT'} = \&safe_quit;
config_init(); # 配置文件初始化
setup_dirs(); # 设置目录路径
require "$CONFIGFILE{'PLUGINDIR'}/nikto_core.plugin"; # 加载plugins/目录下的nikto_core.plugin
nprint("T:" . localtime($COUNTERS{'scan_start'}) . ": Starting", "d"); # d表示debug模式,输出该模式下的信息,(不输出到正常结果文件)
require "$CONFIGFILE{'PLUGINDIR'}/LW2.pm"; # 加载plugins/目录下的LW2.pm
require "$CONFIGFILE{'PLUGINDIR'}/JSON-PP.pm"; # 加载plugins/目录下的JSON-PP.pm
$VARIABLES{'GMTOFFSET'} = gmt_offset(); # 设置相对于格林威治时间的偏移量
LW2::init_ssl_engine($CONFIGFILE{'LW_SSL_ENGINE'}); # 配置SSL相关
my ($a, $b) = split(/\./, $LW2::VERSION); # 分割版本号,以便判断版本是否合适,版本号在LW2.PM里面有定义
die("- You must use LW2 2.4 or later\n") if ($a != 2 || $b < 4); # 如果LW2版本低于2.4,则报错
general_config(); # 进行配置,对命令行参数进行基本的验证
load_databases(); # 加载系统默认规则库
load_databases('u'); # 加载自定义规则库
nprint("- $VARIABLES{'name'} v$VARIABLES{'version'}"); # 输出指定模式下的信息
nprint($VARIABLES{'DIV'}); # 单参数情况,跟print效果一样
# 目标为空,报错
if ($CLI{'host'} eq "") {
nprint("+ ERROR: No host specified");
usage();
}
$COUNTERS{'total_targets'} = $COUNTERS{'hosts_completed'} = 0; #初始化扫描完成的目标个数为0
load_plugins(); #加载插件
# 传递获取到的参数,目标地址,端口,ssl选项,目标路径
my @MARKS = set_targets($CLI{'host'}, $CLI{'ports'}, $CLI{'ssl'}, $CLI{'root'});
# 指定了证书,则使用证书
if (defined($CLI{'key'}) || defined($CLI{'cert'})) {
$CLI{'key'} = $CLI{'cert'} unless (defined($CLI{'key'}));
$CLI{'cert'} = $CLI{'key'} unless (defined($CLI{'cert'}));
}
# 对上面获取到的参数进行处理