首页
社区
课程
招聘
[原创]苹果 gsa 服务器login 算法
发表于: 2017-9-8 02:22 40580

[原创]苹果 gsa 服务器login 算法

2017-9-8 02:22
40580
闲得蛋疼,对iTunes 登陆过程进行了初步的分析。 解密得到了spd字段内容。 将分析过程写出来,混个熟脸。

在分析这个东西之前, 需要做一些准备工作。  比如收集论坛前辈们的工作经验, github上某些开源代码。

通过对iTunes windows 和iOS10.x 系统进行抓包。 发现数据包基本是大同小异,iOS 调试非常不方便,特别构造win7 x86环境对 iTunes 12.6.20 进行了逆向分析。
加上 标准版OD + 海风StrongOD, 开始了这次逆向分析。

在分析之前,大概介绍下apple的这套东西,和平日玩windows逆向的区别。  iTunes 或者mac iTunes 或者 iOS 的绝大部分代码是完全一样的。 
对登陆过程进行抓包


服务器地址 https://gsa.apple.com/grandslam/GSService2 数据是通过post传输。数据分为2部分
1. header 苹果的header和浏览器的header不同的是,他喜欢携带"设备", "签名"类信息
2. body body中的核心数据是用AES256_CBC加密的
整个登陆协议是非常标准的srp 密钥交换协议。 对SRP协议不熟悉的朋友可以参考下rfc文档,苹果并没做比较大的变更。
通讯过程如下
1. reqeust1  : 客户端计算随机数A  =  g^a mod N   其中 g = 2 , a 随机。 N是一个2048bit的大素数。 A这个数字用base64编码后被放在request body的A2K字段

   其余字段比如CPD 主要是描述硬件设备信息, 电脑端和i设备会有一些出入。 这都不参与密码验证的计算

2. response1: 服务器根据SRP协议计算出B 回包如下

回包内容中 s 是一个16字节的salt值,该值是固定的,srp协议要用到。
B 也是一个大数。 客户端根据B 计算M1
3. request2: 客户端提交M1 服务器校验密码的正确性。 SRP协议厉害的地方是对称加密的密钥是通过协商计算出来的。 非传输得到。
 
根据SRP协议, 服务器拿到M1后,就可以校验客户端的密码是否正确。 并返回结果给用户。 如果正确,会返回M2给用户,这样密码协商就完成。

4.Response2


登陆成功后, 服务器返回了M2, np, spd.  其中np用于校验spd解密。  spd 字段是用aes加密的。 aes的解密key ,我暂时算不出来,通过扣代码的方式,能正确的解出
spd内容。


SPD 字段中你会得到几个ID 和token ,这些token 是用于后续登陆authenticate服务器用。  由于整个登陆过程是比较标准的SRP协议。分析起来有参照。 完全无脑的往后干。

SRP协议中, hash算法, 苹果使用的hash 比较奇怪,我没能完全的模拟出来, 该hash代码看起来和sha256是一模一样的,很多地方能够重复验证。 但是在计算M1时, 就不行。 后来是通过扣代码的方式将M1计算出来,并得到gsa.apple.com服务器的认证。
在这个会话过程中,暂不涉及到header的复杂计算。 http头的内容,你随便怎么填,苹果服务器也有点累吧,懒得搭理你。你爱咋咋。

为了得到高质量的并发client, 做了很多种失败的尝试。
1. 想去重现苹果的hash算法, 在分析中,发现他的算法虽然像sha256, 但在补位 (sha_ltc_comress)迭代过程中,数据总是对不上。
2. 想完美的将代码柔和到自己的模块中, 直接LoadLibrary加载iTunes 是不行的  x86 和x64 不行, x86拿到x64上也不行。 32->64之后,很多IAT是乱填的不知道为什么
即使x86平台上, LoadLibrary虽然能成功, 但内部依然有很多IAT函数没得到修正, 各种崩。


勉强能用的
1. 多开iTunes, 并注入dll, 架设一个client的服务器, 对M1提供计算服务。 该方法勉强能用, 比较麻烦的是, iTunes中很多代码是用oc编写, 构造出的oc 指针,你需要在合适的时候释放掉。 由此导致的崩溃就不计其数了。
 2.   在同一个进程中保存多个会话的instance。 涉及全局变量并不多, 可以在出入口加锁。 这样instance之间不会相互干扰。 如此一来,并发的登录账号服务器就搭建完毕。 在网络畅通的情况下, 2秒左右能得到一个账号的会话token。并支持并发操作。

后续:

   后续的会话中,包头需要用到设备信息和signature, 这些算法是苹果的掌中宝, 想窥探其中奥秘是需要花费非常大的时间代价。 尤其keybag的逆向。 keybag 模块提供了signature kbsync sbsync 计算的服务, 涉及加密的东西,最终都会落到keybag。 而整个keybag模块, x86 x64, arm* ,苹果都做了类似的处理,号称几百万行汇编代码。 这些代码中充斥着大量的垃圾运算。 本人才疏学浅,实在没法参透其中奥秘。 
   以signature为例, github上有代码是直接getproxy的形式得到了 keybag计算所需要的魔数, 现版本中,该魔数是与会话相关联的, 人为的call函数构造C++类,得到的魔数,在计算的时候,会被认出来, 导致hash失败。 更低级的方式构造魔数,得到的就是crash。  

actionSignature计算:
itunes的base = 0


keybag 模块中硬件断点经常会失效, int3断点,偶尔会导致崩溃。

[课程]Android-CTF解题方法汇总!

收藏
免费 4
支持
分享
最新回复 (41)
雪    币: 3907
活跃值: (5817)
能力值: ( LV12,RANK:200 )
在线值:
发帖
回帖
粉丝
2
条理清晰,鞭辟入里!
2017-9-8 10:03
1
雪    币: 3121
活跃值: (1609)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
关于Keybag,你可以吧参数填进去,然后让它自己计算好,你在复合调用  就好了,
2017-9-8 10:13
0
雪    币: 154
活跃值: (550)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
4
MsScotch 关于Keybag,你可以吧参数填进去,然后让它自己计算好,你在复合调用 就好了,
我自己构造的参数,  他计算返回失败。  我自己够了几个他需要的this指针。  被苹果爸爸打晕了。
2017-9-8 10:16
0
雪    币: 154
活跃值: (550)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
5
ppbb 我自己构造的参数, 他计算返回失败。 我自己够了几个他需要的this指针。 被苹果爸爸打晕了。
用他ui  login  时候顺便生成的指针就可以计算。我自己构造的,  还有某些我不知道的细节没处理好
2017-9-8 10:18
0
雪    币: 23
活跃值: (13)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
然并卵
2017-9-8 10:32
0
雪    币: 3121
活跃值: (1609)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
ppbb 用他ui login 时候顺便生成的指针就可以计算。我自己构造的, 还有某些我不知道的细节没处理好
在复用的时候  注意参数格式,一些函数使用  IDA  F5出来的是不完全正确的。
2017-9-9 20:51
0
雪    币: 101
活跃值: (48)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
MsScotch 在复用的时候 注意参数格式,一些函数使用 IDA F5出来的是不完全正确的。
F5  为嘛不好用呢,没反应
2017-9-11 15:23
0
雪    币: 3017
活跃值: (3060)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
9
我有算法src
2017-9-11 15:41
0
雪    币: 36
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
小调调 我有算法src
完全脱离dll的吗?
2017-9-12 12:13
0
雪    币: 3017
活跃值: (3060)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
11
yzzzzzzz 完全脱离dll的吗?
yeap
2017-9-12 14:24
0
雪    币: 6818
活跃值: (153)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
不错!!!!!!
2017-9-12 18:18
0
雪    币: 6818
活跃值: (153)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
不错!!!!!!
2017-9-12 18:18
0
雪    币: 36
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
小调调 yeap
卖吗?还是无私分享?怎么联系?
2017-9-13 15:23
1
雪    币: 350
活跃值: (13)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
那个所谓"魔数",  其实是加密过的keybag  session  id,  相当于HANDLE,  你当然构造不出来,  你需要调接口创建
2017-9-14 14:05
0
雪    币: 3017
活跃值: (3060)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
16
Diabloking 那个所谓"魔数", 其实是加密过的keybag session id, 相当于HANDLE, 你当然构造不出来, 你需要调接口创建
我看好你~
2017-9-14 18:41
0
雪    币: 36
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
小调调 我看好你~
qq  3510592195
聊一聊吧
2017-9-14 20:38
0
雪    币: 1
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
膜拜一波~~~~
2017-9-29 21:15
0
雪    币: 1
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
如何才能在mac和windows上抓包itunes的登录https明文数据?  客户端应该有ssl  pinning  ,只用charles抓不了
2017-11-13 10:56
0
雪    币: 29
活跃值: (61)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
20
我们把协议都弄出来了,  10.3的协议,但是ASO还是没效果,不知道什么细节出了问题。有兴趣的朋友加我  92920  4200。  生活困难,我都想出售ASO源代码了。
2017-11-22 15:59
0
雪    币: 181
活跃值: (66)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
不明真相群众 如何才能在mac和windows上抓包itunes的登录https明文数据? 客户端应该有ssl pinning ,只用charles抓不了
我也想知道
2017-11-24 20:09
0
雪    币: 1
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
跪求联系方式
2017-12-8 10:39
0
雪    币: 144
活跃值: (209)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
在这里感谢一下楼主的这篇文章,前段时间有项目要实现gsa  login,楼主这篇文章给了我很大的启发。使我分析ios的登陆过程中少走了很多弯路,ios里面的这个srp过程是在一个名称为akd的service中实现的,我后来是通过将运行中的akd进程整体进行dump得到一个core文件,把core文件拷贝到pc上,找到计算关键数据的入口地址,然后再pc上模拟执行arm64来得到http  request  body,以及对http  response  body进行解析。因为大部分是纯的cpu运算,所以模拟执行过程中只需要hook  很少的sys  call就可以了。后来这个srp过程算是被完美的从ios上迁移到pc上了,但遗憾的是,X-Apple-I-MD-*系列的参数以及actionsignature的计算并没能通过上面这个办法解决,通过不断的深入分析,发现计算这些参数的一些关键流程被放在了系统内核里面,以我的能力实在是不知道如何去分析调试内核了,就停在这里。虽然搞清楚他的算法很难,但是找到计算他们的接口还是比较简单的,后来买了一些iphone设备专门做X-Apple-I-MD-*和actionsignature的计算,srp过程放在了服务器上,极大的提升了效率。最后,感谢楼主。
2017-12-23 20:29
0
雪    币: 576
活跃值: (47)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
嗯嗯
最后于 2019-6-17 15:20 被江北布衣编辑 ,原因:
2017-12-30 11:40
0
雪    币: 0
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
膜拜一波~~~~
2018-3-1 23:25
0
游客
登录 | 注册 方可回帖
返回
//