其实我是15年11月左右就完成的, 因为担心利益的原因所以一直没有公布. 这学期发现Github上已经有V4版本的了, 而V3和V4相差不多, 遂公布了我当时逆的V3算法.
mentohust with v3 (我喜欢用代码说话)
前言
锐捷客户端其实就是个802.1x认证客户端, 之所以要这么个东西是因为锐捷不喜欢你共享网络给别人用. 锐捷客户端除了帮你认证一下还要检查你的端口, 网络接口来防止你共享网络.
可能五年前这么说还有点道理, 但如今已经是人手一台智能手机的时代了, 不仅电脑要用网络, 手机, 平板也都要网络, 所以锐捷的做法已经没有根据了.
锐捷为了保证每个人都用了自己的客户端, 在原本的802.1x协议上附加了一套验证算法, 来保证用户必须用自己的客户端, 于是mentohust就诞生了.
mentohust本身是为了linux系统下认证而用的, 但其实用处最多的是在路由器上. 所以mentohust项目的源码部分只公布到V2, 而V3以release版本发行, 不提供源码. V2和V3的关系就是V3比较复杂, 会验证客户端的代码, 因此有些用WinHex改exe的方法可能会在V3认证下失效.
大一刚开始的时候我是用电脑认证并用dll进行api hook再用双网卡接路由器来共享的. 但这样明显多走了一步, 实在不爽, 就想直接把mentohust改一下, 扔到路由器上. 我用的是mentohust的V2源码交叉编译到路由器上, 本来一切都很好, 直到大二上学期, V2认证的用户被限速到了250kBps. 于是我花了一周时间终于把mentohust改成了V3版本.
RE
我记得当时逆向的原料有两个, 一个是官方给的linux版客户端, 因为没有去除符号表, 所以能看到函数名; 还有一个就是release版的mentohust带V3的版本, 因为是用C写的而官方的是用C++, 复杂程度会低许多.
mentohust原本是在Google Code上的, 而code已经被关闭了, 所以现在我也懒得去找原来的页面了..
总之, google code上的团队实际上是有开放V3源码的准备的, 但因为利益关系并没有放出(原因淘宝一下就知道了, 估计有保密协议啥的).
V3认证有5个子算法, 每个算法都使用不同的顺序对服务器发来的Challenge进行Hash操作, 而Hash算法包含了5个现有的算法.
而这5个子算法不是拿来就用的, 是稍有修改的. 比如把常数的6改成9, 算法中的+1改成-1. 这样改的目的就是为了加大逆向的难度, 并没有实际作用.
我总共就手动重现了两个Hash, 另外三个在Github上能搜索到, 而且是别人已经重现好的. 估计mentohust的开发者本来也打算开源, 但是只开源了一部分, 把最难的留给了后人.
另外在官方版客户端中有个有趣的现象, 有一个Sha1算法的函数名叫DES…这个坑误导了我一天, 后来在搜索中也发现有前人在逆向的时候也被这个坑到了, 到最后也没想到是Sha1.
技巧
重现V3算法, 我认为需要一定的技巧. 最重要的就是单元测试.
在重现完一个Hash后, 需要单元测试一波, 保证自己写的Hash和官方的Hash运算结果一致. 在gdb中可以用call命令来让mentohust的release版执行一遍Hash来测试. 不然等全部写完发现结果不对, 再无脑的去对照, 效率实在是太低了.