最近我一直在检查 IDA Pro 中的一个密钥生成器程序。我相信这里的线程讨论了一个类似的密钥生成器。因此,某些细节可以参考。密钥生成器将设备序列号作为输入,并生成一个 32 字节(字符)的主密钥以及上述链接中形式的OTPAUTH URI。
- 主密钥只是当前时间的函数(从纪元开始以秒为单位)。因此,无论序列号如何,每秒都会发生变化。
由于密钥每秒都在变化,因此 OTPAUTH URI 也是如此。我想知道在这种情况下,一旦客户端进入 TOTP,服务器应该如何验证 TOTP?
编辑: 所以现在有一些新问题:
- 我如何使用此密钥生成器向服务器进行身份验证,知道该密钥生成器正在
srand(time(NULL))用于种子,同时rand()连续调用8 次以生成 32 字节的随机序列。 - 说 OTP 代码的时间步长仍然是 30 秒是否合乎逻辑,而我们知道密钥和因此的秘密每秒都在变化?这是否转化为 OTP 有效期现在为 1 秒的事实?
漏洞:服务器是否容易创建未来的 TOTP 并将其保存在存储库中?当我写这个部分时,自纪元以来已经过去了 1476946414 秒。假设创建一个 TOTP 的时间相当于从 epoch 过去的 1476947000 秒。可以修改密钥生成器,以便将 1476947000 传递给srand()而不是time(NULL)。大概也有足够的时间从 OTPAUTH URI 派生 TOTP。
使用 IDA Pro 6.8 打补丁:
所以我认为最好继续接触时尚。滚动反汇编,我将调用更改time(NULL)为mov指令,将我最喜欢的时间分配给eax。为了检查我的补丁,我在最喜欢的时间运行了原始的注册机。结果是相同的。三件事仍然困扰着我:
- 服务器执行的验证过程是否可以隐藏在密钥生成器中,或者密钥生成器是它唯一期望的密钥生成器?!
- 反汇编有一堆类似于我假设的 openssl 子例程的字符串。例如digest.c、pmeth_gn.c、pmeth_lib.c等。代码可以在网上找到。但是,我没有找到适合外行的清晰文档。我怀疑这里是否定义了服务器的验证参数。我还能够使用findcrypt2在反汇编中检测 SHA256 和 SHA512 加密常量。
- 我被警告说密钥是使用 Linux 生成的。这可能会产生什么影响?我仍然在 Windows 轨道上!
切换到 Linux:
所以我安装了 Ubuntu 16.04 并运行了打补丁的 linux 二进制密钥生成器。密钥文件和秘密与Windows同时生成的完全不同。在到达指定时间之前,我创建了 HMAC 并导出了该特定时间的 TOTP 代码,并在特定时间准确输入它们。但是,我无法进行身份验证。服务器当前似乎并不期待 TOTP。我不知道我应该在什么时间向服务器提供 TOTP!
虽然findcrypt2在 Windows 密钥生成二进制文件中没有发现任何 AES 迹象,但它确实注意到Linux 密钥生成二进制文件中有多个Rijndael的(只是作为附加信息添加)。
我已经能够接收服务器二进制文件。我认为必须在那里概述身份验证程序。但是我应该在哪里看?
这是最后的问题: 密钥生成器程序用于生成设备特定的密钥。这些密钥的生成方式存在一个弱点,应该利用这些弱点为任何设备生成有效的一次性代码。