穷追猛打:破译Foxmail“密码天书”
笔者最常用的邮件客户端软件是Foxmail5.0,相信许多人也在用它,因为它的界面简洁、功能强大。在使用Foxmail的过程中发现一个问题,即Foxmail邮箱密码不够安全!而且这个问题在Foxmail 4.x和5.0正式版(包括测试版)中都存在,在这里提醒大家注意保管好自己的密码。
Foxmail邮箱加密密码保存在哪里
在正式开始以前,先说说在Foxmail中邮箱口令保存在哪里。右键点击你的账户(假设账户名为abcde),在弹出菜单中选择“属性”,然后点击“邮件服务器”,在这里你会看到以“*”号显示的邮箱密码(图1)。
用任意一款密码查看软件就可以发现“*”号中是什么内容。其实,即便不使用查看*号工具也可看到Foxmail的密码!
当选择保存邮箱口令后,邮箱密码加密后的密文保存在一个文件中,这个文件位于Foxmail安装目录下的Mail文件夹(如果采用默认安装方式,一般在C:\ProgramFiles\Foxmail下),那里有个以你的账户名为名字的文件夹(如账户名为abcde,则Mail文件夹下有个abcde文件夹),其下有个accounts.cfg文件,打开它就会看到你的邮箱密码密文。
再现一个众所周知的Foxmail漏洞
大家都知道,打开“资源管理器”或“我的电脑”,找到Foxmail文件夹,打开里面的“Mail”文件夹,你会发现这里有许多以账户名命名的文件夹,进入Mail文件夹下你想侵入的账户对应的文件夹,将其中的account.stg文件更名或删除,然后运行Foxmail,你会发现该信箱上原来的小“锁头”不见了(加有口令的账户会带有红色小“锁头”标志)!此时不需要任何密码就可以看到被保护的信件!
为什么将Account.stg这个文件复制到别人的账户文件夹下,就有这么大的“威力”呢?用“记事本”打开该文件看看就明白了(图2)!事实上,你在Foxmail的“帐户→属性”菜单中设置的所有内容几乎都包括在其中了(如果你细心的话,会发现“属性”中的“模板”并没有包含在内),其中也包括了经过加密的信箱密码密文,也就是“POP3Password=”后面的部分。下面我们就谈谈这个令人感兴趣的话题。
Foxmail分析
先假设你在Foxmail中有且仅有一个账户:abcde,它的E-mail地址是abcde@163.net,这个信箱的密码是12345。
用记事本打开accounts.cfg文件,一开始是一些乱七八糟的内容,再往下你会看到如下所示内容:
MailAddress=abcde@163.net //这是邮件地址
………………………………
POP3Account=abcde
POP3Host=pop.163.net //POP3服务器地址
POP3Password=BB6DFB5DF061 //邮箱密码加密后显示的密文
POP3Port=110 //POP3服务器端口
PrintFont=宋体,9
ReplyAddr=
ReplyFormat=1
SameWithPop=1
SMTPHost=smtp.163.net //SMTP服务器地址
SMTPPort=25 //SMTP服务器端口
……
在计算Foxmail邮箱密码明文之前,请你先记住一个单词:~draGon~(注意要区分大小写),它是Foxmail邮箱密码的加密密钥。记住后我们开始行动:
第一步:下载一个十六进制文件编辑器UltraEdit,这是一套极棒的文字、Hex、ASCII码编辑器,内建英文单字检查、C++及VB指令突显,可同时编辑多个文件,而且即使开启很大的文件速度也不会慢。其并且附有HTML Tag颜色显示、搜寻替换以及无限制的还原功能;一般大家常会用其来修改EXE或DLL文件。大家可以在这里下载到它:http://software.wx88.net/down/cuedit1010b.exe。安装完毕,运行UltraEdit,在它的文件编辑状态下输入“~draGon~”这个单词(没有引号),然后单击“Edit”(编辑)菜单下的“Hex Edit”(16进制编辑),可以查到这个词的16进制编码(图3),为:7E 64 72 61 47 6F 6E 7E,分别记为a1,a2,a3,a4,a5,a6,a7,a8,我将它们称之为Ai。
第二步:再记住一个恒定的值:5A(其实也是由上面的a1~a8计算而来,具体方法就不多说了),记为C0,这个C0我们在下面会用到。
第三步:取邮箱密码加密后的密文,在本例中为:BB6DFB5DF061,将它们两两分开,得到:BB,6D,FB,5D,F0,61,分别记为b1,b2,b3,b4,b5,b6。由于此加密密文的总长度为12,所以我们可以判断邮箱真正地密码长度为12÷2-1=5,即邮箱密码为5位。
第四步:计算Ci的值(Ci为一系列数的总和,即C1,C2,C3,C4,C5……)。其中,C1由C0(即16进制的0x5A)和第一位密文(即b1,也就是我们这个例子中的BB)经异或运算得来。由于C0=0X5A,所以C1=C0^0XF9=0xE1,其中“^”代表异或运算。大家可以使用Windows自带的计算器来进行计算,点击“开始→程序→附件→计算器”即可打开计算器(图4),计算器中的“XOR”就代表异或运算。由此得到:
C1为0xE1
C2由b2直接继承得到,为0x6D
C3由b3直接继承得到,为0xFB
C4由b4直接继承得到,为0x5D
C5由b5直接继承得到,为0xF0
这样,我们就得到了至关重要的参数Ci。
第五步:下面请大家用从第二位起的密文(即b2)和密钥对应的ASCII码(即Ai)作异或运算,由于我们已经知道密码为5位,所以用a1~a5分别与b2~b6进行异或运算,得到Di(即D1~D5这5位数)。在我们这个例子中,可以得到:
D1=b2^a1=6D^7E=13
D2=b3^a2=FB^64=9F
D3=b4^a3=5D^72=2F
D4=b5^a4=F0^61=91
D5=b6^a5=61^47=26
如果密文很长(Foxmail最多允许18位密码),该怎么办呢?还是用上面所说的方法。只是在计算Di时要循环利用Ai的值。举个例子,假设密文两两分开后有10位这么多(即B1~B10),则计算D8时用B9与A8异或,计算D9则用B10与A1异或。明白了吗?即密文长度大于密钥长度,则循环利用密钥进行计算。
第六步:这是最后一步,求解出账户密码明文。用Di-Ci得到Ei,其中Ei就是密文解码后的明文。注意,如果Di小于Ci,则要用Di+0xFF(0xFF为16进制的FF,即十进制的255),然后再减去Ci即可。好了,赶快打开计算器,然后可以得到:
E1=D1-C1=31,转为十进制为1
E2=D2-C2=32,转为十进制为2
E3=D3-C3=33,转为十进制为3
E4=D4-C4=34,转为十进制为4
E5=D5-C5=35,转为十进制为5
将上面的结果串联起来,就是12345,而这正是我们当初设定的邮箱口令!怎么样?Foxmail的密文不安全吧!
上面的过程说起来麻烦,而且好像不容易理解,将上述Ai、Bi、Ci、Di列个表(图5),然后再按上面说的自己动手试试就很容易搞清楚了!与我们事先设定的完全一样!从此可以推断~draGon~就是Foxmail的密钥!仔细想想,从Foxmail的原作者“张小龙”的名字不难推断到这个结论,因为“龙”字的英文单词为“dragon”。那么我是如何发现“~draGon~”这个单词呢?用UltraEdit打开Foxmail的主程序Foxmail.exe,点击“搜索→查找”(或直接按Alt+F3),输入dragon,在UltraEdit中搜索到的第一个词就是“~draGon~”!
注意,上文中提到的Ai、Bi、Ci、Di和Ei都是十六进制数值,大家一定要搞清楚,不要弄混了。对了,得到了Ei之后,不要忘记按位分别转化为十进制,这才是真正的邮箱密码!另外,即便是同一个邮箱,在更改了密码并保存之后,下一次再改回原来的密码,你在accounts.cfg文件中看到的邮箱密码密文也会不一样,但用本方法计算下来之后结果不会变,也就是说你仍能用本方法得到你的密码。
防范方法
上面介绍了Foxmail密码的破解,方法非常的简单,所以在大家共用一台电脑的场所,建议不要将自己的邮箱密码保存下来,如果已经保存下来,可以采用下面的解决方法:在新建账户时不要选择保存密码,如果已经选择了,可以右击账户,在弹出菜单中选择“属性”,会出现“账户属性”窗口,选择“邮件服务器”,然后,将“密码”栏中的密码清除即可。这样,当你再打开account.stg文件时,会发现“POP3Password=”后面是空空如也,这样就不怕别人发现你的密码了。同时,建议Foxmail的开发商能改变加密算法,使得软件能更安全。
最后提醒大家不要用本文所涉及的内容干破坏,这不是笔者的初衷,切记:己所不欲,勿施于人!