作者:H_debug | 来源:互联网 | 2023-07-26 19:55
背景
我需要每周通过 python 脚本从亚马逊的卖家中心门户为我们的多个客户提取报告。我尽量避免使用 webdriver,因为它们在不同的操作系统上不一致、容易出错(根据经验)。因此,我认为尝试对 Sellercentral.amazon.com 的登录过程进行逆向工程将是一个有趣的小项目(也许最终是徒劳的)。这个过程并不难,除了初始登录表单中的两个字段:password
和metadata1
。password
下面将详细讨论该字段。该metadata1
领域似乎采用了类似的技术,同时引入了每隔几秒更改一次的额外障碍。当我监控metadata1
它似乎是使用各种浏览器指标的大型 json 对象生成的。但是,一次做一件事,所以我将在这篇文章中关注密码加密,并metadata1
在以后的文章中担心。
切入正题 提交表单后,password
字段中的值使用本文中进一步讨论的技术进行加密。生成的加密值然后替换密码字段中的值并重命名该字段encryptedPwd
我的发现到目前为止,我一直在查看 Javascript 文件并逐步完成代码序列,并了解到以下内容:
- 他们使用专有的SiegeCrypto.js脚本作为主要的加密库(Siege 是亚马逊的安全入口和出口团队)和SubtleCrypto作为生成 encryptedPwd 过程的一部分 - SiegeCrypto 首次在AuthenticationPortalSigninNA.js 中找到,声明了基本的初始加密定义:
SiegeCrypto.addProfile("AuthenticationPortalSigninNA", {
"password": {dataType: "AuthPortalSigninPasswordNA", requiresTail: false},
});
...
SiegeCrypto.addDataType({
"dataTypeId": "AuthPortalSigninPasswordNA",
"jwkPublicKey": {"kty":"RSA","e":"AQAB","n":"gXXZV1VqZ6k_uQtyJNJy5q-qvKdqrXJNgKUO1aYc1UPBVqlhCP0GPxf-0GSo-LEtArgcbF8-j6_vSLSqztYxxF8og--rB8zAyZ8DXZaugX-UiJDQnoJL_HtXKuwIm9U7oEPoeD6H4ZDcfbsPj77xVn7UA2-a90N4aZqMC8EIfXIy1tqSbSPnxPOaiEmy8xGtG-L3RdCyc7TL0Swd_f0_DjRT6ip91IBlCmquoa-xJgZ9e44PVH4AwdyssiV4ZLEZ5yFcE0zcRb_62kx_TQptidbJ4nHocFVjmUW9YsrAWeKrBmOGZEjO4vbATYs1Yf4vgcH7Ix61EPR5sbDP4SlBWQ"},
"providerId": "si:md5",
"keyId": "56d14edce8e2cb6c6842c59ddaee426e"
});
单步执行代码,我能够找到算法的更多细节
*profile* (used by SiegeCrypto)
- password: {dataType: "AuthPortalSigninPasswordNA", requiresTail: false}
*publicKeyProvider* (added as a DataType to SiegeCrypto)
- keyId: 56d14edce8e2cb6c6842c59ddaee426e
- providerId: si:md5
*wrapKey*
- wrappingAlgorithm
- name: RSA-OAEP
- hash: SHA-256
- modulusLength: 2048
- publicExponent: [1, 0, 1]
*Additional Fields*
name: aes_128_gcm_iv12_tag16
encryption: AES-GCM
ivLength: 12
keyLength: 128
tagLength: 128
在此过程的后期,我能够找到以下内容,我假设这是根据上述加密规范处理的参数,但我不知道如何达到这一点
cipherMessage: Uint8Array(413) [1, 128, 0, 20, 124, 132, 165, 153, 149, 96, 94, 4, 210, ...]
messageHeader:
- algorithmId: 20
- contentType: 2
- encryptedDataKeys: [{"keyInfo": "56d14edce8e2cb6c6842c59ddaee426e"}]
- encryptionContext: {}
- frameLength: 12
- headerIvLength: 12
- messageId: Uint8Array(16) [124, 132, 165, 153, 149, 96, ...]
- type: 128
- version: 1
查看 Amazon 的 AWS 加密 SDK ( Python Repo ) 我发现以下三个部分似乎是我需要的。但是,我不确定从这里开始。
*profile* (used by SiegeCrypto)
- password: {dataType: "AuthPortalSigninPasswordNA", requiresTail: false}
*publicKeyProvider* (added as a DataType to SiegeCrypto)
- keyId: 56d14edce8e2cb6c6842c59ddaee426e
- providerId: si:md5
*wrapKey*
- wrappingAlgorithm
- name: RSA-OAEP
- hash: SHA-256
- modulusLength: 2048
- publicExponent: [1, 0, 1]
*Additional Fields*
name: aes_128_gcm_iv12_tag16
encryption: AES-GCM
ivLength: 12
keyLength: 128
tagLength: 128
问题
有人可以提供一个利用上述加密技术的简短 python 片段以及解释,以便我可以看到encryptedPwd
字段值是如何生成的吗?这是一个用于演示的虚拟密码:Blamazon123
上述虚拟密码的两个示例值encryptedPwd
(我在看到一致性的地方添加了空格):
AYAAF P/a2u8yLSNjLWzPRIi0Bac AAAABAAZzaTptZDUAIDU2ZDE0ZWRjZThlMmNiNmM2ODQyYzU5ZGRhZWU0MjZlAQ Brthm+db6k/Oo832X/5U+JtXcBrVnCetjOnvcypG5ZZ6xZr0rXDDMctQevThwGjGYqOOQTy6tFALgMHnjWC2bcBBtyKMhUflpCjGTRodjE7btdqrgExEr07k1ErejaQ1vAW8hQSedfsQR3gyWxJcKKlQ91B4CYO5UMMJzevQyln0SASh5MLW6xOHMnjwdHI8aKFw2ErcvIFg5OpqCDSIyPjifvxkSTue7gJ3fB0ACda04EA5wxmkRteCF753kVGYNBD0h9eOHCPcCm/Y7bWoJAelvqu/U/LxAPkl216deDko4oxjVqLeRy/IExbx6cdEDT7zu0U7HROhvstu8TZE1f AgAAAAAMAAAADAAAAAAAAAAAAAAAA O0Gt/txLoiiXlGQcb5dyFn///// AAAAAQAAAAAAAAAAAAAAAQAAAAv LEJ4zlnbivrzliBrcFGIsPBU3srfmTu91dw4=
AYAAF L1E3ydr57mIKpAQtOrAPsE AAAABAAZzaTptZDUAIDU2ZDE0ZWRjZThlMmNiNmM2ODQyYzU5ZGRhZWU0MjZlAQ AUJX+8tRKZESh1o09BLe6Qj13iuyP5Kb2IC/ipA1mRlWIQtIYApU8792+f5U2x8wv7rTVHcKM8wnFXP2I78PCbo4kXwV5Q6JE99bV4BP+5YnzB1YI6XUgrZ2ubm1wcSV3W1K3OhMogcXIbWjeEjKj2WmpVgSgCXKS6+Z6GxMnE+hArZlNIATYojL7IlLPR5kiGzN4pq86gLzGbfcG2at1MNQ5DdrJtktixLJPU1oFwCtT4AFfy6kiGfoepN+VE0AK0ysMyX3FY7QaI9qLtuA20zQX52NbLzG/qSENYohHzgvOOVzCIr4uwyJ3uXSA0kKXEJ4IbWmQ+k30cotoWRSJW AgAAAAAMAAAADAAAAAAAAAAAAAAAA NUNRLibdfG4P1ac0dL8Ka////// AAAAAQAAAAAAAAAAAAAAAQAAAAv 4vyjW2MLIuuBm8D1c41v5ZwEQFk8k/p4GOss=
添加带有分析的额外源代码
主要负责生成该metadata1
字段的 Javascript 文件可以在这里找到。我已经解密了我看到的函数是metadata1
生成过程的一部分。它们从以下几行开始:
- 1827(与 相关
encryptedPwd
)将加密事件侦听器添加到表单提交操作
- 332发送加密步骤的核心生成函数
- 789 & 810 创建一个用于生成的 crcTable
- 1839 计算校验和(
metadata1
过程中使用)
- 2540 是
metadata1
返回值的地方(来自第 332 行)
- 2672 和 2704 是我注意到电子邮件被转换为十六进制值的地方,即
metadata1
在加密之前作为内容的前缀