本文主要以 POP3 为例讲解, 其他邮件协议可以参考思路, 自行尝试解决。
最近发生了一件比较尴尬的事, 公司邮箱密码忘记了, 又不想麻烦 IT 部门更改, 就想尝试下自己破解下本地的密码。 (密码已经以加密形式保存在本地电脑)
看到网上分享的一些办法, 如下:
- 破解本地密码文件。(密文通过秘钥(不通版本秘钥有差别), 异或运算计算出的密文密码, 解密就是按照加密规则逆运算回去)
- 去掉 SSL 访问, 用抓包工具( Wireshark 等)抓取明文数据。
第一种耗时耗力, 版本差异引起方法不通, 还需要破壳工具啥的自己去实际抓抓。
第二种不能用, 公司邮箱服务不允许明文连接, 加密数据不好破解。
所以我用了另一种方式, 下面直接分享步骤和代码, 后面再分享思路
- 更改 hosts 文件, 添加如下内容:
1127.0.0.1 <pop3邮件服务地址> - 更改 Foxmail 邮箱服务配置, 去掉 SSL
-
启动 Python 写的服务程序, 代码如下:
12345678910111213141516171819202122232425262728293031323334353637import socketif __name__ == "__main__":s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)s.bind(("127.0.0.1", 110))s.listen(1)print("ready")while True:conn, addr = s.accept()print("connected by "+str(addr))conn.send("+OK, POP3 server is ready.\r\n".encode("UTF-8"))while True:data = conn.recv(1024).decode("UTF-8")if(0 == data.find("QUIT")):conn.close()breakelse:if(0 == data.find("USER") or 0 == data.find("PASS")):print(data.strip())conn.send("+OK\r\n".encode("UTF-8")) -
Foxmail 中点击 “收件” , Python 服务打印用户名密码:
本地的加密用户名就获取到了。
下面说下思路。其实思路也很简单, 就是模拟 POP3 协议, 写个假的 POP3 服务, 然后让 Foxmail 连接这个POP3 服务, 并把用户名和密码发送给我们的 POP3 服务。也是参考抓包提取密码的方法。只是没见过其他人分享过, 自己就分享了下, 其他邮件协议也可以参考下, 不需要把邮件协议完全模拟出来, 只要能够骗过 Foxmail 把用户名密码传过来认证就可以了。
下面大体说下 POP3 协议:
- TCP 三次握手, 连接到 POP3 服务
- 服务端发送 “+OK...” 信息, 表示服务已经准备好, 等待客户端发送认证信息。( POP3 消息边界符也是 CRLF, 别忘记在消息后面添加)
- 客户端 发送 USER <邮箱名> 到 POP3服务
- POP3 返回 “+OK” 消息, 等待客户端发送密码认证
- 客户端发送 PASS <邮箱密码> 到POP3服务
- POP3 返回 “+OK” 消息, 表示认证成功, 就可以等待客户端接下来的操作。
- 客户端发送 QUIT 表示断开连接。
基于这个步骤, 我们就可以写个模拟 POP3 协议的服务, “骗取” Foxmail 的本地密码。
当然这种只适合用户忘记本地密码。