返回列表 发帖

[原创]使用perl编写安全检测工具

[watermark]使用perl编写安全检测工具 By Xtiger perl是一种功能强大的脚本语言.只要是C语言能做的事,perl几乎都能做.记得曾经有一篇经典的HACKER入侵检测文章写到:"虽然服务器上安装了尽可能少的程序(没有办法利用),但由于服务器安装了perl使得admin的努力都白费了".我这里不是说perl是hacker的"帮凶"而是说它的强大和方便。 言归正传,perl语言常常被*UIX管理员拿来做系统的一些简单功能的扩展,或者说是自动进行某些工作。也常用于网络以及安全检测,比如检测某个主机是否正常运转,某个服务是否正常提供,是否存在某些安全隐患.admin的工具,如同windows的$IPC,常常是“双刃剑”在admin手中是解决问题的方便工具,而在入侵者手中则变成了“凶器”。 为了帮admin实现对服务器安全的检测,下面我们以入侵者的角度来用perl代码实现一些工具。 一、首先,入侵者需要知道目标主机是否存活,或者判断是否有防火墙或者其他安全策略以便使用其他更谨慎的方法入侵。一般大家使用ping命令,而在perl中有Net::Ping模块帮我们实现以上功能,看代码(#号后面为注释,不会运行后面的字符): #!perl -w use Net::Ping;#申明使用的模块 my $host=shift||';127.0.0.1';;#获取参数(IP地址),如果没有用户没有输入则默认$host为127.0.0.1 my $ipping = Net::Ping->new("tcp", 1);#创建ping连接 $ipping->ping($ipn) or print "[Err]主机$host不能连接!" and exit;#如果失败则输出错误信息并退出 print "[OK]主机$host能够连接!";#连接后输出正确信息 $ipping->close ; #退出连接 用“伪代码”既通俗的语言来解释。就是[我有个IP]-->[连接IP,并对结果判断]-->[连接好了,打印OK] |-->[连接失败,打印Err] 几个关键词:1、shift--获取用户输入的参数比如ping.pl 127.0.0.1,这时$host的值就是127.0.0.1;2、new--创建一个ping连接;3、or--判断是否成功连接,如果不成功就程序就执行or后面的代码print 错误信息然后exit 退出,如果成功就跳过or后面的代码转而执行print正确信息然后关闭连接close。 一个比较典型的扫描器或者说检测工具就完成了。类似的,我们可以通过替换创建ping连接那段代码改为实现其他功能的检测工具。 二、入侵者常常扫描目标开放了那些端口,以确定目标主机对外提供了那些服务,以便进行下一步的入侵。下面用perl实现端口扫描功能. #!perl -w use IO::Socket::INET;#申明使用的模块 my $host=shift||';127.0.0.1';;#获取参数-目标IP my @port=(21,23,25,80,135,137,138,139,443,445,1025,1027,3389,8080);#定义需要检测的端口,也可以使用如@port=(1..5)定义扫描端口号1至5的范围 foreach my $port(@port) #采用foreach循环 { my $sock = IO::Socket::INET->new(PeerAddr => $host, #创建Socket连接,三个参数是必须的PeerAddr、PeerPort、Proto(主机地址、端口号、采用的连接协议) PeerPort => $port, Proto => ';tcp';) or print "[×] $host:$port\n" and next; #同ping代码一样,连接失败就执行or后面的代码print错误信息,并next进入下一个循环 print "[√] $host:$port\n"; #连接成功后print正确信息,然后断开 $sock->close; } 这段代码和以上ping代码类似,不一样的地方有:1、使用了数组集合@port对端口范围定义。我们可以有两种定义方法用逗号隔开的特定端口号如@port=(21,23,80),或者连续的范围@port=(1..5);2、使用foreach循环,每次循环使用数组中的一个元素执行后面的代码;3、对连接返回的信息的判断中,使用了next在某端口连接失败后跳入下一个循环,而不是ping代码中的exit,因为还有其他端口需要继续扫描。 以上代码,判断执行ping连接或者Socket连接使用or。因为Net::Ping->new或IO::Socket::INET->new是定义了一个对象,而or常用来捕捉错误信息,就是说如果这个对象没有定义成功就执行or后面的代码。同样的很多判断错误信息的时候就用到or。还有需要注意的就是怎么样使我们的程序在捕捉到正确或错误信息后,输出对应的信息而不混淆。在ping代码中我们在输出错误信息后就exit,这样就不会再打印出连接正确的信息了。在端口扫描代码中,我们输出错误信息后使用next跳出本次循环而进入下一循环,就避免同时输出错和正确信息而达到不同情况给出相应的信息的目的。 三、接下来,一般入侵者就会根据端口扫描的结果,针对端口所对应的系统服务进行检测了。 比如入侵者发现目标主机是一个POP服务器,这时也许他会尝试猜解POP服务器帐号及密码,用代码实现这个过程。 #!perl -w use Net::POP3; #使用模块 $host=shift||';127.0.0.1';; #定义目标IP $pop = Net::POP3->new($host, Timeout => 2) or print "[Err]连接到$host失败\n" and exit; #建立到目标的POP服务的连接 open(US,") #循环使用列表中的用户名进行猜解 { chomp($username); open(PAS,") #循环使用列表中的密码进行猜解 { chomp($password); if ($pop->login($username, $password)) { #使用组合的用户名和密码进行登陆 print "[OK]$username, $password\n"; #成功则输出正确信息 } else{print "[Err]$username, $password\n"} #失败输出错误信息 } close PAS; #关闭句柄 } close US; $pop->quit; #退出连接 这次,我们同样使用Net::POP3模块,循环读取用户名和密码列表组合后尝试登陆.然后根据服务器反馈的情况判断是否成功.依此类推,我们可以使用其他模块进行其他基于网络的暴力猜解. 四、其他情况 perl爱好者中有一句话:实现目标的方法不只一个.同样,我们以上的工具可以有很多种方法实现,比如ping可以换成ICMP协议或者UDP协议,而端口检测也可以换成SYN连接,POP3检测我们可以使用IO::Socket::INET,然后模拟POP连接方式来实现.这就要求大家对网络协议及服务的协议有足够多的了解和熟悉. perl的功能如此强大,使用不同的模块进行方便的编程,然后进行相关的我们需要的安全检测.比如POP、SMTP、FTP、IPC的弱口令猜解,web漏洞及SQLInject检测。如我们把以上功能的代码整合,就可以写出完善的安全检测工具了。 -------------------- 这个本来是想拿来到杂志上投稿的,因为一些原因没成。于是到这里先发表吧,反正都写了。写得比较烂哈,见笑。说“安全检测工具”这个题大了些,但没有找到合适的题目。我自己也写了些相关的程序,可以到我站上下载:www.xtiger.net [/watermark]

[原创]使用perl编写安全检测工具

感谢x-tiger大哥带来的文章!
很系统和规范 :)

TOP

[原创]使用perl编写安全检测工具


   有点乱,需要做的事太多,有点忙,所以也没顾上修改。
   大概是这个意思吧。水平有限。

TOP

返回列表 回复 发帖