JSON数据解密

信息安全 AES 解密
2021-08-29 00:09:17

语境

我正在尝试通过研究各种 iOS 原生应用程序如何在后台工作来了解有关网络安全的更多信息。我一直在使用 Burp Suite 作为 MITM 工具来检测从应用程序发送和接收的网络流量,并且在 iPhone 上我安装了 SSL Kill Switch 2 以绕过任何证书锁定。对于像我这样的初学者来说,看看引擎盖下的一切是如何运作的,这非常有趣和令人惊奇。

大多数应用程序我都没有遇到任何问题,这包括一些应该具有高安全性的应用程序,例如几个移动银行应用程序 - 一旦解除 SSL,一切都以纯文本形式可见。有趣的是,一些手机游戏让我很难过。

挑战

截获的流量似乎是加密的 JSON 文件。例如,

{
"F4q6i9xe":{"aV6cLn3v":"542668","Hhgi79M1":"ynB7X5P9"},
"a3vSYuq2: {"Kn51uR4Y":
"f3SQ5sySeaoDupGhGmCD9MKt0V4naBjXXR+jDEjqU1gmL32FgS8v1/6vy61RFO/rwmXwFYZHfTRgV2XujI6U7fESlcSZjMjdeiULExVg0uFmnSgiYA5040hBtuxfFqn+lP1ZCsvnua2IQHoYZDBagkr8I9VZVxQbzivc7rv5d17qscgnD2Jd4BBImn+ohuTpxPEC2H2sLBpAldLe/5EAbXUIkF8griS73lvjyWhmHubZguNUa9EzOCH8o0UPwo5BLB8Fz7xok1GE85/wwSzrlyapQw76/U/RJBF+/0YQ75BACuE4/SfIknim9XZk2EspKrCOu/Gi2K+7pHS+jytfXHR6zTjmeMyV2o967MUVXag="}
}

我做了什么

如果我理解正确,我现在处于解密领域。使用我从谷歌搜索中找到的一些分析方法,以下是我的一些发现(对于有经验的人来说,有些可能看起来非常明显和微不足道):

  1. 从应用程序发送的所有请求都采用这种精确的格式/结构。加密的密钥名称始终相同,只是值不同。

  2. 键的值aV6cLn3v似乎对应于某种时间戳,因为它在不断增加。

  3. 我之前怀疑键对应的值Hhgi79M1会是一些基于时间戳的校验位,但事实并非如此。在游戏中执行相同的动作将导致相同的值,尽管时间戳不同。但是,不同的动作会产生不同的值。

  4. 键的值Kn51uR4Y是实际有效负载所在的位置。我相信它是加密下的 JSON,但我不确定。

  5. 有效载荷中的/符号似乎是数据段的分隔符。第二段/6vy61RFO/似乎是基于时间戳的校验位。因为在游戏中执行两个相同的操作会产生两个几乎相同的 JSON,除了时间戳和负载中的这个特定部分。

  6. 有效载荷的加密与 Base64 或 AES 有关,因为签名尾随 =('s),并且不同有效载荷的长度总是 4 的倍数。我不确定后者是否意味着什么。

  7. 使用的加密密钥似乎是恒定的。它不会因不同的会话和不同的设备而改变。

问题

到目前为止,我的分析是否正确?我应该从这里去哪里?由于我在这些领域的知识几乎为零,我不确定下一步该采取什么措施。我想我可能需要反编译应用程序并查看二进制文件以尝试查看是否可以找到解密密钥/功能。但我不确定。

我知道前面会有很多学习,但我不介意,因为我非常喜欢它,我非常感谢一些帮助,即使它只是我应该查看的主题和 URL 的快速列表进入。

更新 2015/11/23

我转储了应用程序的解密二进制文件并在它们上运行了一个字符串命令,然后我制作了一个 Python 脚本来成功挑选出加密密钥。感谢所有帮助过的人!

2个回答

我会说你到目前为止是对的,但这只是到目前为止的猜测(尽管可能是正确的:))。

是的,我认为对应用程序二进制文件进行逆向工程是您的下一步。如果您确定了加密函数和密钥,那么您可以在 python 中重新实现加密函数,并根据需要解密/加密您的值。

所以,

  1. 获取应用程序二进制文件。(要么从手机中提取它(可能需要越狱),或者从 iTunes 下载 IPA,更多信息在这里

  2. 在应用程序上运行“字符串”它可能会产生许多有趣的字符串,甚至可能会列出加密密钥或有关使用什么算法的一些线索。

  3. 使用静态调试器,例如 IDA Pro 或Hopper(需要支持 ARM)来查看二进制文件。如果你很幸运,它有函数名,这可以极大地帮助你找到你正在寻找的东西。如果没有,您可以尝试在二进制文件中搜索已知的加密常量在这里查看我对此的回答也看看这个这个如果您发现加密函数中使用了一个常量,您可以交叉引用该常量被访问/使用的位置,最终您将找到密钥作为加密函数使用的参数或静态变量。

  4. 如果一切都失败了,您将不得不使用动态调试器(例如 GDB),并附加到手机上运行的进程并从那里开始工作。找到一条您确定它最终会被加密的数据,并跟踪访问该数据的函数调用,直到它被加密

不要忘记逆向工程Crypto stackexchange 网站,当然还有很多谷歌!;)

我认为你在正确的轨道上。解压和分析应用程序二进制文件绝对是下一步。作为一名应用程序开发人员,我会提出一些理论,也许它们会对你有所帮助。

由于这看起来像包含完全加密请求的元数据 json,我猜该aV6cLn3v值可能是某种事务 ID(指的是先前的事务。看起来太小而不能用作有用的时间戳,时间戳也可以是在 HTTP 标头中,这会使放入 JSON 请求元数据变得多余)。另一个字段可能是应用程序当前为它已经拥有的特定数据状态生成的哈希,这对于请求增量(节省移动数据使用)很有用,或者它可能是某种方法标识符。

如果我不得不大胆猜测,我会说至少解密这个 JSON 中的密钥看起来像:

{
    "metadata" : {"transactionId" : "542668", "delta" : "ynB7X5P9"},
    "request" : {"body": "encrypted data goes here"}
}

查看该应用程序不会有任何伤害,但请确保您不要手动向服务器发出任何请求(取决于您当地的法律)。