Wireshark实战:从校园网抓包到自动化登录脚本的逆向分析

Wireshark实战:从校园网抓包到自动化登录脚本的逆向分析 1. Wireshark抓包基础与环境准备第一次接触Wireshark是在大二网络原理课上当时老师演示用这个工具抓取TCP三次握手的过程。没想到毕业后做爬虫开发时这个技能居然成了我的吃饭家伙。先说说最基础的抓包环境搭建安装注意事项官网下载时建议选择3.6.x以上的LTS版本目前最新是4.0.7安装过程中一定要勾选Install WinPcap选项这是网卡驱动支持的关键如果是Mac用户需要额外执行brew install wireshark-chmodbpf解决权限问题校园网抓包有个特殊技巧建议使用WiFi连接而非网线。因为多数校园网WiFi采用Web认证而有线网络可能需要802.1X认证后者抓包分析会更复杂。我常用的基础过滤语法# 只显示HTTP POST请求 http.request.method POST # 过滤特定IP的流量 ip.addr 192.168.1.100 http # 提取登录请求的URL路径 http.request.uri contains login实测发现校园网登录页面大多使用HTTP协议虽然安全性存疑但方便了我们分析像我们学校的登录地址是http://auth.xjtu.edu.cn。这里有个坑如果页面自动跳转到HTTPS需要在浏览器地址栏手动改回HTTP才能抓包。2. 校园网登录协议逆向实战去年帮学弟解决自动登录问题时发现不同学校的认证系统虽然界面各异但核心流程惊人地相似。以某高校为例抓包后通常会看到这几个关键请求典型登录流程先GET获取登录页面可能带CSRF TokenPOST提交表单含用户名、加密密码等GET轮询登录状态返回JSON格式结果最需要关注的是POST请求的Form Data部分。常见参数包括username: 通常是学号password: 可能是明文、MD5或RSA加密captcha: 验证码如果有token: 动态生成的会话标识我曾遇到最复杂的案例是密码经过三重加密先用MD5哈希再用BASE64编码最后用RSA公钥加密。通过Chrome开发者工具的Sources面板可以找到前端加密的JavaScript代码。3. 密码加密破解技巧当发现密码不是明文传输时可以尝试以下方法前端逆向三板斧在Chrome开发者工具中搜索encrypt、password等关键词查看Form Data的JavaScript处理代码使用debugger语句拦截加密过程比如某校的加密逻辑是这样的function encryptPwd(pwd) { return CryptoJS.MD5(CryptoJS.MD5(pwd).toString() salt123).toString(); }对应的Python实现import hashlib def encrypt_password(pwd): first_md5 hashlib.md5(pwd.encode()).hexdigest() second_md5 hashlib.md5((first_md5 salt123).encode()).hexdigest() return second_md5如果遇到RSA加密可以提取网页中的公钥用Python的rsa库处理import rsa public_key rsa.PublicKey.load_pkcs1(open(public.pem).read()) encrypted rsa.encrypt(password.encode(), public_key)4. 自动化脚本开发掌握了登录协议后就可以用Python实现自动化了。推荐使用requests库的Session对象保持会话import requests from urllib.parse import urlencode class CampusNet: def __init__(self): self.session requests.Session() self.headers { User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) } def login(self, username, password): # 1. 获取登录页面提取token login_page self.session.get(LOGIN_URL, headersself.headers) token re.search(rnametoken value(.*?), login_page.text).group(1) # 2. 准备表单数据 data { username: username, password: encrypt_password(password), token: token } # 3. 提交登录请求 response self.session.post( LOGIN_API, dataurlencode(data), headers{Content-Type: application/x-www-form-urlencoded} ) return 登录成功 in response.text对于需要验证码的情况可以使用OCR库自动识别适合简单验证码人工识别后手动输入找验证码绕过漏洞比如某些系统验证码在Cookie中5. 高级技巧与异常处理实际部署时会遇到各种妖魔鬼怪问题分享几个踩过的坑心跳保持有些校园网会定时踢掉空闲连接。解决方法是用定时任务每5分钟访问一次状态检查接口import schedule import time def check_online(): resp session.get(STATUS_URL) if 已下线 in resp.text: login() schedule.every(5).minutes.do(check_online) while True: schedule.run_pending() time.sleep(1)多设备冲突当检测到账号在其他设备登录时可以先发送注销请求def force_logout(): session.post(LOGOUT_URL, data{action: force}) login()代理设置如果在实验室服务器运行脚本可能需要配置代理proxies { http: http://proxy.example.com:8080, https: http://proxy.example.com:8080 } session.proxies.update(proxies)6. 安全与法律边界必须严肃提醒未经授权的网络访问可能违反校规甚至法律。我在实现自动化登录时遵循了几个原则只对自己的账号进行操作不干扰网络正常运行不窃取他人信息发现漏洞及时报告网络中心有个有趣的发现越是重点高校的认证系统安全性反而越弱可能是因为历史系统迭代困难。而某些职业院校反而用了商业级的认证方案。最后分享一个真实案例某同学写了自动登录脚本后不小心把循环间隔设为0.1秒结果被系统当成暴力破解封了IP。所以建议添加随机延迟1-3秒错误重试不超过3次关键操作记录日志