使用perl编写安全检测工具

上一篇 / 下一篇  2008-12-21 13:28:43 / 个人分类:perl

  • 文件版本: V1.0
  • 开发商: 本站原创
  • 文件来源: 本地
  • 界面语言: 简体中文
  • 授权方式: 免费
  • 运行平台: Win9X/Win2000/WinXP

9WJ&]"zb i6bi%M0  perl语言常常被*UIX管理员拿来做系统的一些简单功能的扩展。也常用于网络以及安全检测,比如检测某个主机是否正常运转,某个服务是否正常提供,是否存在某些安全隐患.admin的工具,如同windows的$IPC,常常是“双刃剑”在admin手中是解决问题的方便工具,而在入侵者手中则变成了“凶器”。51Testing软件测试网_nycy'L3R
    为了帮admin实现对服务器安全的检测,下面我们以入侵者的角度来用perl代码实现一些工具。51Testing软件测试网-v&X:Z(D6M/t
一、首先,入侵者需要知道目标主机是否存活,或者判断是否有防火墙或者另外的安全策略以便使用更谨慎的方法入侵。一般大家使用ping命令,而在perl中有Net::Ping模块帮我们实现以上功能,看代码(#号后面为注释,不会运行后面的字符):
/iH4}&l$d5H/q0  #!perl -w
T4~-J$c"xK@`I0  use Net::Ping;#申明使用的模块51Testing软件测试网~kG"mZ q3?Uq;r
  my $host=shift||'127.0.0.1';#获取参数(IP地址),如果没有用户没有输入则默认$host为127.0.0.151Testing软件测试网*x7ZaYGz(e&t
  my $ipping = Net::Ping->new("tcp", 1);#创建ping连接51Testing软件测试网:R*KH8Qcy&jM
  $ipping->ping($ipn) or print "[Err]主机$host不能连接!" and exit;#如果失败则输出错误信息并退出51Testing软件测试网!h*ZN,j#@ k&N
  print "[OK]主机$host能够连接!";#连接后输出正确信息51Testing软件测试网2D"ul%F7fpk:O
  $ipping->close ;     #退出连接
"we'd9q+gH0    用“伪代码”既通俗的语言来解释。就是[我有个IP]-->[连接IP,并对结果判断]-->[连接好了,打印OK]51Testing软件测试网@%jTh wO
                                                                          |-->[连接失败,打印Err]51Testing软件测试网 [t6m_ T"P/t)]
    几个关键词:1、shift--获取用户输入的参数比如ping.pl 127.0.0.1,这时$host的值就是127.0.0.1;2、new--创建一个ping连接;3、or--判断是否成功连接,如果不成功就程序就执行or后面的代码print 错误信息然后exit 退出,如果成功就跳过or后面的代码转而执行print正确信息然后关闭连接close。51Testing软件测试网|Q7qe:n!a[B-P
    一个比较典型的扫描器或者说检测工具就完成了。类似的,我们可以通过替换创建ping连接那段代码改为实现功能的检测工具。51Testing软件测试网7Z_uA2c?
二、入侵者常常扫描目标开放了那些端口,以确定目标主机对外提供了那些服务,以便进行下一步的入侵。下面用perl实现端口扫描功能.
fk.S$g}*A7w0#!perl -w51Testing软件测试网{o~Dz9E8_MU
use IO::Socket::INET;#申明使用的模块51Testing软件测试网)_Z-o dS
  my $host=shift||'127.0.0.1';#获取参数-目标IP51Testing软件测试网cF%k%J:A1x-gK
  my @port=(21,23,25,80,135,137,138,139,443,445,1025,1027,3389,8080);#定义需要检测的端口,也可以使用如@port=(1..5)定义扫描端口号1至5的范围51Testing软件测试网 j M$W E,ZGq|Zq
  foreach my $port(@port) #采用foreach循环
)]H:x/U1bF4x0{
!Vy$pmA0my $sock = IO::Socket::INET->new(PeerAddr => $host,   #创建Socket连接,三个参数是必须的PeerAddr、PeerPort、Proto(主机地址、端口号、采用的连接协议)51Testing软件测试网C,H_m`
                                PeerPort => $port,
xg&_IaS%r#_8}0                                Proto     => 'tcp')
m2z3UXDu0or print "[×] $host:$portn" and next;     #同ping代码一样,连接失败就执行or后面的代码print错误信息,并next进入下一个循环
*GTw-Y3p){Ta~0print "[√] $host:$portn";       #连接成功后print正确信息,然后断开51Testing软件测试网7oLc Q7\'I4JFT!F
$sock->close;51Testing软件测试网 A7n R+b%@5x-X
}
#s8P)O&Jk1Uy-e0    这段代码和以上ping代码类似,不一样的地方有:1、使用了数组集合@port对端口范围定义。我们可以有两种定义方法用逗号隔开的特定端口号如@port=(21,23,80),或者连续的范围@port=(1..5);2、使用foreach循环,每次循环使用数组中的一个元素执行后面的代码;3、对连接返回的信息的判断中,使用了next在某端口连接失败后跳入下一个循环,而不是ping代码中的exit,因为还有其他端口需要继续扫描。51Testing软件测试网_)fC2O`,M
    以上代码,判断执行ping连接或者Socket连接使用or。因为Net::Ping->new或IO::Socket::INET->new是定义了一个对象,而or常用来捕捉错误信息,就是说如果这个对象没有定义成功就执行or后面的代码。同样的很多判断错误信息的时候就用到or。还有需要注意的就是怎么样使我们的程序在捕捉到正确或错误信息后,输出对应的信息而不混淆。在ping代码中我们在输出错误信息后就exit,这样就不会再打印出连接正确的信息了。在端口扫描代码中,我们输出错误信息后使用next跳出本次循环而进入下一循环,就避免同时输出错和正确信息而达到不同情况给出相应的信息的目的。
O$u,`#{6@0三、接下来,一般入侵者就会根据端口扫描的结果,针对端口所对应的系统服务进行检测了。

2O't/l1R"E051Testing软件测试网$X$NzLuY+NH7F

    比如入侵者发现目标主机是一个POP服务器,这时也许他会尝试猜解POP服务器帐号及密码,用代码实现这个过程。51Testing软件测试网yD,c'`z
#!perl -w
kZ d!CBd,Q0    use Net::POP3;     #使用模块51Testing软件测试网-p#{/Z3R8g+^P
    $host=shift||'127.0.0.1';   #定义目标IP51Testing软件测试网!T.zr/~ia
    $pop = Net::POP3->new($host, Timeout => 2) or print "[Err]连接到$host失败n" and exit; #建立到目标的POP服务的连接51Testing软件测试网{d)| ~-NAS
    open(US,"<user.dic") or print "[Err]打开用户名文件失败:$!";   #打开用户列表文件
9j[({9S)PC"@0    while($username=<US>)                                         #循环使用列表中的用户名进行猜解
%O%F S1e"f!j2B0    {
fG!G%w5m-z r0    chomp($username);                                          
&W,x+p4{5u%^0    open(PAS,"<pass.dic") or print "[Err]打开密码文件失败:$!";     #打开密码列表文件51Testing软件测试网6P}.R_"c,r9NX8p.|:U
    while($password=<PAS>)                                         #循环使用列表中的密码进行猜解51Testing软件测试网G,]@+mW fa1Q
    {
b#fBkY0    chomp($password);51Testing软件测试网'T8Oy,[7j h'G
    if ($pop->login($username, $password)) {                       #使用组合的用户名和密码进行登陆51Testing软件测试网1epbh)bV
    print "[OK]$username, $passwordn";                             #成功则输出正确信息51Testing软件测试网 w$n"W5y0L m/X$FW
    }51Testing软件测试网#V |7d'I L5qL
    else{print "[Err]$username, $passwordn"}                       #失败输出错误信息51Testing软件测试网BWo oNMBl+dJ
    }51Testing软件测试网~P0`Z ^A
    close PAS;                                                     #关闭句柄
H!Q8l"R;o0    }
(o&|n*JtC7K7V0    close US;
9r0C P&K h/K2k0    $pop->quit;                                                     #退出连接51Testing软件测试网e2fl[{&r
    这次,我们同样使用Net::POP3模块,循环读取用户名和密码列表组合后尝试登陆.然后根据服务器反馈的情况判断是否成功.依此类推,我们可以使用其他模块进行其他基于网络的暴力猜解.
Utn c p0四、其他情况
^ Rfm*K9V;q~0    perl爱好者中有一句话:实现目标的方法不只一个.同样,我们以上的工具可以有很多种方法实现,比如ping可以换成ICMP协议或者UDP协议,而端口检测也可以换成SYN连接,POP3检测我们可以使用IO::Socket::INET,然后模拟POP连接方式来实现.这就要求大家对网络协议及服务的协议有足够多的了解和熟悉.51Testing软件测试网 N#F/Pjn
    perl的功能如此强大,使用不同的模块进行方便的编程,然后进行相关的我们需要的安全检测.比如POP、SMTP、FTP、IPC的弱口令猜解,web漏洞及SQLInject检测。如我们把以上功能的代码整合,就可以写出完善的安全检测工具了

^oz/JG3x,Q]0

TAG: Perl perl

 

评分:0

我来说两句

Open Toolbar