首页
社区
课程
招聘
[原创]如何使用Xposed+JustTrustMe来突破SSL Pinning
发表于: 2018-4-30 13:35 46124

[原创]如何使用Xposed+JustTrustMe来突破SSL Pinning

2018-4-30 13:35
46124

0x00 前面

      如果你是一干Web安全的,当你在测试目前大多数的手机APP应用程序时,你一定遇到过burpsuite无法抓到数据包的情况,开始你以为只是https的问题,但是当你使用了burpsuite伪证书也无法抓取到时,你心里除了有句“MMP……”外,你一定也在思考这其中的蹊跷。


      为什么https的网站使用伪证书可以抓到,而在app里面同样的方法就抓不到?答案是:app启用了SSL Pinning(又叫“ssl证书绑定“).


HTTPS的原理你必然懂,在建立ssl通道的过程中,当客户端向服务端发送了连接请求后,服务器会发送自己的证书(包括公钥、证书有效期、服务器信息等)给客户端,如果客户端是普通的浏览器,比如IE浏览器,则:

1.     使用内置的CA证书去校验服务器证书是否被信任,如果不被信任,则会弹出https的告警提示信息,由用户自己决定是否要继续.

2.     同样,用户也可以主动的将服务器证书导入到浏览器的受信任区,下次打开时该服务器证书将会自动被信任.


为啥中间人可以劫持https流量,以及在浏览器上我们为什么可以使用burp伪造证书,正是因为上面的2点,既:

1.     浏览器允许用户自行忽略证书告警,用户在无足够的信息安全意识时,可能会直接忽略刘浏览器的安全提示,在这篇文章的前2天以太坊钱包MyEtherWallet 就因为黑客使用“BGP流量劫持+HTTPS证书伪造“导致被干的鼻青脸肿.

2.     浏览器允许“导入证书到浏览器信任区“这个操作让浏览器信任burp伪造的证书.

这种伪造证书的中间人攻击给HTTPS带来了很大的威胁。


0x01 SSLPinning了解一下

    如果能够这样做,是不是就可以解决这种“中间人劫持+伪造证书“攻击的问题:

    客户端在收到服务器的证书后,对该证书进行强校验,验证该证书是不是客户端承认的证书,如果不是,则直接断开连接。


浏览器其实已经这样做了,但是如“前面”所说,选择权交给了用户,且浏览器由于其开放性允许让用户自导入自己的证书到受信任区域。


但是在APP里面就不一样,APP是HTTPS的服务提供方自己开发的客户端,开发者可以先将自己服务器的证书打包内置到自己的APP中,或者将证书签名内置到APP中,当客户端在请求服务器建立连接期间收到服务器证书后,先使用内置的证书信息校验一下服务器证书是否合法,如果不合法,直接断开。


当然攻击者也可以通过把这个APP源码给逆出来,然后找到证书校验这段逻辑,给他干掉,或者干脆把证书信息换成自己的服务器证书信息,然后重新打包签名,但是一旦APP做了代码加密和混淆,这个操作也会变得比较难搞。


因此这样看来,通过预先把服务器的证书信息“绑定“在APP的native端,然后建立连接时使用预先内置的绑定信息进行服务器证书校验,同时使用足够的代码加密或混淆,是比较合适的解决办法, 这个搞法就是“ssl pinning”.


补充:

不要将ssl pinning和https双向认证搞混了,HTTPS协议本身是支持双向认真的,既除了客户端对服务器证书进行验证外,服务器也可以要求客户端提供自己的证书信息并对其进行验证,在APP上,HTTPS双向认真的方案也可以防止中间人劫持,但这种双向认证开销较大,且安全性与”ssl pinning”一致,因此目前大多数APP都采用SSL Pinning这种方案。


0x02 使用Xposed + JustTruestMe来突破SSL pinning

如果你逆向比较在行,你就自己逆源码,然后过加密混淆,然后干掉SSL pinning.   不过使用Xposed + JustTruestMe应该也不丢人。

Xposed是一个框架,它可以改变系统和应用程序的行为,而不接触任何APK。

它支持很多模块,每个模块可以用来帮助实现不同的功能。

JustTrustMe 是一个用来禁用、绕过 SSL 证书检查的基于 Xposed 模块。JustTrustMe 是将 APK 中所有用于校验 SSL 证书的 API 都进行了 Hook,从而绕过证书检查。

n   准备工作:

1.  准备一个有root权限的andorid手机或者andorid模拟器

使用手机装Xposed容易变砖,刷来刷去,很麻烦。个人习惯也推荐直接用andorid模拟器,现在很多andorid模拟器长又好看,广告又少,各个是人才。

本文使用网易的MUMU模拟器,下载地址:http://mumu.163.com/baidu/  对应的andorid版本为4.4。


2. 下载Xposed的apk安装包,下载地址:

http://repo.xposed.info/module/de.robv.android.xposed.installer

在改页面找到点击下载即可,默认的版本支持Android 4.0.3 up to Android 4.4. 版本

Download:  de.robv.android.xposed.installer_v33_36570c.apk (770.28 KB)

注意官方的说明,如果你的模拟器andorid版本为5.0以上,请按照如下说明操作:

For Android 5.0 or higher (Lollipop/Marshmallow), these versions don't work! Use this instead:http://forum.xda-developers.com/showthread.php?t=3034811


3. 下载JustTrustMe模块


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

最后于 2018-4-30 16:54 被etlpom编辑 ,原因:
收藏
免费 5
支持
分享
最新回复 (35)
雪    币: 203
活跃值: (53)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
2
结合这个来看:
https://github.com/WooyunDota/DroidSSLUnpinning
这个问题对于经常抓包测app漏洞的人来说经常遇到,印象中半年内就已经有好几个人问过了。
最后于 2018-4-30 14:01 被静河流编辑 ,原因:
2018-4-30 14:00
1
雪    币: 19
活跃值: (1086)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
静河流 结合这个来看:https://github.com/WooyunDota/DroidSSLUnpinning这个问题对于经常抓包测app漏洞的人来说经常遇到,印象中半年内就已经有好几个人问过了。
请问,如果手机只能ROOT,不能装XPOSED怎么弄?很多手机都装不了XPOSED,而且某些系统APK不能在其他手机跑
2018-4-30 15:12
0
雪    币: 203
活跃值: (53)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
4
iceway 请问,如果手机只能ROOT,不能装XPOSED怎么弄?很多手机都装不了XPOSED,而且某些系统APK不能在其他手机跑
看这篇文章:https://bbs.pediy.com/thread-224465.htm
2018-4-30 16:01
0
雪    币: 6818
活跃值: (153)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
2018-4-30 23:38
0
雪    币: 102
活跃值: (2060)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
6
mark一下
2018-5-1 10:49
0
雪    币: 9941
活跃值: (2143)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
7
学习了  ,原来是SSL  Pinning
2018-5-3 01:28
0
雪    币: 14872
活跃值: (6093)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
个人感觉有些画蛇添足?
1、既然已经hook了某类方法,那么就可以hook其它方法直接获取https参数数据,不需要再替换证书然后抓包了。多此一举。
2、与其替换证书这么麻烦,不如替换https为http,这样更容易抓包。虽然抓到的是http包数据其实就是https包。因为已经替换了原来的https。
举例说明:
比如要抓https://xxx.xxx.xxx/login的https包,通过hook方法把https://xxx.xxx.xxx/login替换为http://sohu.com/login然后抓包。显然sohu.com会返回404错误,但是通过http发送的包的数据已经被捕获。这样就可以自己编程获取https数据了。
最后于 2018-5-5 10:35 被tDasm编辑 ,原因:
2018-5-5 10:34
0
雪    币: 1867
活跃值: (3978)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
9
tDasm 个人感觉有些画蛇添足?1、既然已经hook了某类方法,那么就可以hook其它方法直接获取https参数数据,不需要再替换证书然后抓包了。多此一举。2、与其替换证书这么麻烦,不如替换https为http ...
修改https到http,返回可能不是404,tcp三次握手都可能无法建立(比如只有443端口开启,80口没有开启)。另外这样只能看到请求,无法看到响应。真实场景可能是多次相关联的网络交互才能走到真正的逻辑,这个时候我们只能拿到第一次请求的请求报文。如果一步一步的通过编程来控制那一个请求走http,那个走https,感觉操作也会很复杂。

另外,替换证书这里,一般的的api都有证书检查扩展。其实可以hook掉证书检查逻辑,这样倒也不需要导入证书。不过不知道是不是能够覆盖所有case。

还有另一种无法抓包的case,抓包软件抓https的原理,都是将代理服务器设置到环境变量。一般的http框架有默认的读取环境变量中代理配置的动作。这里有四个环境变量的key:http.proxyHost;http.proxyPort;https.proxyHost;https.proxyPort,如果apk代码对http API做了设置,可以让业务逻辑不走环境变量中的配置。那么楼主你那里设置WLAN的代理服务器将会失效。这是由于https&&http是应用层协议,是否走代理应该是应用自己决定,操作系统无法感知到内核层的数据包是否为http或者https,也不知道如何解码的。同时,走代理也决定了报文将会走指定的port,这个行为也应该是应用自己决定。如果在应用层不走系统配置的代理服务器port,那么数据不会发送到我们的代理服务器的,当然也无法拦截到数据。

常见的让环境变量中代理配置无效的case比如:maa方案(Mobile Application Accelerator),他在本地自建一个代理服务器,然后让所有http api的代理配置到本地代理服务器。覆盖了系统的默认代理服务器配置。

终极抓包方案应该是这个:https://www.coolapk.com/apk/app.greyshirts.sslcapture  
他的原理是通过自建一个VPN服务器,在VPN服务端接流量进行解码。由于VPN是链路层开始模拟的网络协议栈,且修改路由表后具有最高的路由优先级,那么所有的流量必然经过VPN服务器。
2018-5-7 19:47
0
雪    币: 14872
活跃值: (6093)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
virjar 修改https到http,返回可能不是404,tcp三次握手都可能无法建立(比如只有443端口开启,80口没有开启)。另外这样只能看到请求,无法看到响应。真实场景可能是多次相关联的网络交互才能走到真正 ...
没看懂就来瞎说?已经多次使用把https替换http进行抓包完全可行,这是实践的产物。例子说得很清楚:抓https://xxx.xxx.xxx/login的https包,通过hook方法把https://xxx.xxx.xxx/login替换为http://sohu.com/login然后抓包,这里不一定是sohu.com,可以其他,因为没有这个链接,肯定返回404.你脑子怎么转不过弯?抓了发送包就可以自己写程序发送原始https包到真正的服务器获取真实的返回数据。
最后于 2018-5-7 20:08 被tDasm编辑 ,原因:
2018-5-7 20:04
0
雪    币: 1867
活跃值: (3978)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
11
好像,你曾经就骂过我。。。我没有仔细看是你。否则我就不会回复了。
1.貌似我回复的时候,都是对事本着讨论知识的角度,没有带有一点语气吧。我也没有说你不对,只是提了一点方案之外的可能场景而已。
2. “抓https://xxx.xxx.xxx/login的https包,通过hook方法把https://xxx.xxx.xxx/login替换为http://sohu.com/login然后抓包,这里不一定是sohu.com,可以其他,因为没有这个链接,肯定返回404”,我说得很清楚吧。不是所有开启了https的服务器,都一定会开启http服务。你这个只有同时存在https和http的时候才可以生效,这种一般在比较大的公司网站的确会存在。如果只有443口开了,80口没有开。tcp握手都不成功。
3.谁说的链接不存在就一定是404?那个协议这样规定的。
4. 另外我说,你这样只能抓请求,看不到响应。我说不方便。这个你能否认他有问题嘛?
5. 如果请求报文是加密的,需要请求和响应运算得到访问token。单单看第一次请求报文能够分析出来协议?
6.我的回复不全是针对于你,我讨论的更多的是关于系统api在设置代理,以及如何配合代理服务器抓包的原理流程上面。你太高看你了。
7.我建议你滚回大学重学一遍计算机网络
8.世上大牛太多,我不敢随便说大话,大多数时候我都希望自己小心谨慎的分享自己的认知,目的是验证自己所理解的知识点有没有错误,并不是为了装逼。现在你我认知不在同一个频道,我觉得我尝试过去理解你的言论,但是感受到的只是无脑的、带有攻击力的喷子。
9.我很多次在技术点上门表达错误或者表达不完整,我觉得我能够认识自己的错误并修正他,前提是在双方存在认知的差异的时候,能够努力的表达自己观点,消除差异。所以,你针对我的表达的每一个点,我都可以标红回答你。one by one。如果我认知有误了,我愿意为自己的错误表达道歉。如果你错了呢?

我回帖,是因为这篇帖子对我有了帮助,我迁移了帖子对应的代码到我的工具包里面。同时基于我自己遇到的case,以及自己掌握的一些东西提出自己的见解,我希望在我自己有所收获的同时能够对大家也有所启发。但是连续两次回帖,都被怼。而且我觉得被怼得不明不白。上次被怼,(https://bbs.pediy.com/thread-225427.htm)我觉得是他本人表达不完整引起我的误解,后来貌似我主动道歉,但是他似乎只是骂爽了,也没有给出最终的解决方案。这次,我感觉更加无脑了。我觉得我的言语里面,可能只有前三句他看到了,其他的表达他似乎都会主动忽略。

大多数情况,做一个伸手党也能满足工作需要,大多数情况我更加愿意自己去啃源码而非网上找解决方案。所以,未来安静做伸手党吧。不想在看雪回帖了。

最后于 2018-5-7 21:45 被virjar编辑 ,原因:
2018-5-7 21:44
0
雪    币: 14872
活跃值: (6093)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
virjar 好像,你曾经就骂过我。。。我没有仔细看是你。否则我就不会回复了。1.貌似我回复的时候,都是对事本着讨论知识的角度,没有带有一点语气吧。我也没有说你不对,只是提了一点方案之外的可能场景而已。2. “抓h ...
http协议都不懂还来回帖,真是服了你。自己不实践只会空谈。
https://xxx.xxx.xxx/login 和http://sohu.com/login 是一样吗?你看清楚? https://xxx.xxx.xxx/login对应的80端口不见得开但是sohu.com的80端口一定开因为现在就在用。意思都没看懂还来瞎说。真是因为 https://xxx.xxx.xxx/login 对应的80端口不见得开才改为sohu.com来获取。
最后于 2018-5-7 22:36 被tDasm编辑 ,原因:
2018-5-7 22:32
0
雪    币: 203
活跃值: (53)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
13
楼上两位技术讨论归讨论,不要人身攻击。如果回帖描述不清问题,可以重新发一篇帖子写明实际操作步骤验证自己的观点。
2018-5-8 02:04
0
雪    币: 223
活跃值: (14)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
写得很详实,希望那些被此困惑的朋友看到。
我之前就遇到这个问题,网上很多教程都有说要装SSL证书到手机,却忽略了证书绑定的问题。
包括FreeBUF有篇教程贴里提到这个【http://www.freebuf.com/articles/terminal/113940.html】,评论里好多人对此不置可否。
我也是受此误导,觉得【JustTrustMe】模块可装可不装。直到上次抓某APP包时经过反复试错才发现就是证书绑定的问题。
谢谢楼主分享。
2018-5-8 05:28
0
雪    币: 203
活跃值: (53)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
15
chinanala 写得很详实,希望那些被此困惑的朋友看到。 我之前就遇到这个问题,网上很多教程都有说要装SSL证书到手机,却忽略了证书绑定的问题。 包括FreeBUF有篇教程贴里提到这个【http://www.fr ...
之前也看过这篇文章,的确是误导。
2018-5-8 09:36
0
雪    币: 1461
活跃值: (1457)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
16
你好,按这个帖子环境都搭好了,抓聊天工具whatsapp的包,没用这个justtrustme的时候确实登陆都登陆不上,但是现在也只能抓到登陆的报文,后面聊天,视频,语音的报文都抓不到,这个是什么原因呢一般?是因为上面大哥说的不走系统代理?还是因为burpsuite只能抓80和443端口,特殊端口抓不了?还是只能抓标准http和https协议?还是什么其他原因呀?谢谢
2018-5-8 16:55
0
雪    币: 45
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
mumu模拟器现在都是android6.0.1  去哪下载android4.4版本的?求链接
2018-8-1 16:21
0
雪    币: 45
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
找到了  有的选择的 
2018-8-1 16:30
0
雪    币: 37
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
请问一下,关于maa方案(Mobile Application Accelerator)。我没能理解具体实现该怎么弄呢,也没查到相关的资料。谢谢
2018-8-2 17:27
0
雪    币: 37
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
virjar 修改https到http,返回可能不是404,tcp三次握手都可能无法建立(比如只有443端口开启,80口没有开启)。另外这样只能看到请求,无法看到响应。真实场景可能是多次相关联的网络交互才能走到真正 ...
请问一下,关于maa方案(Mobile Application Accelerator)。我没能理解具体实现该怎么弄呢,也没查到相关的资料。谢谢
2018-8-2 17:28
0
雪    币: 52
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
virjar 好像,你曾经就骂过我。。。我没有仔细看是你。否则我就不会回复了。1.貌似我回复的时候,都是对事本着讨论知识的角度,没有带有一点语气吧。我也没有说你不对,只是提了一点方案之外的可能场景而已。2. “抓h ...
"抓聊天工具whatsapp的包,没用这个justtrustme的时候确实登陆都登陆不上,但是现在也只能抓到登陆的报文,后面聊天,视频,语音的报文都抓不到,这个是什么原因呢一般?" 我也遇到类似的问题。 @hackdaliu 你后面是怎么解决的呢? 
@all : 我想有偿请人帮我抓一个APP的吧,有意向的联系我吧。谢谢!
2018-9-26 00:10
0
雪    币: 52
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
@hackdaliu 你后面是怎么解决的呢? 
2018-9-26 00:11
0
雪    币: 52
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
hackdaliu 你好,按这个帖子环境都搭好了,抓聊天工具whatsapp的包,没用这个justtrustme的时候确实登陆都登陆不上,但是现在也只能抓到登陆的报文,后面聊天,视频,语音的报文都抓不到,这个是什么原因呢 ...
@hackdaliu 你后面是怎么解决的呢? 
2018-9-26 00:11
0
雪    币: 1867
活跃值: (3978)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
24
月下门推 请问一下,关于maa方案(Mobile Application Accelerator)。我没能理解具体实现该怎么弄呢,也没查到相关的资料。谢谢
我当时逆向了一个maa的,就是通过内置代理的方法。在app里面开了一个代理服务器,然后所有业务代码请求到自己的代理服务器上面(本地内嵌代理),然后代理服务器接收服务器的配置,决定向最终的云端服务器交互。类似实现了CDN吧。不过CDN一般依靠域名解析实现,这个控制精准一些。所谓加速,其实就是好几个服务器,通过app的代理服务器控制具体使用哪个服务器的服务,选择比较近,压力小的服务器能够可以增加app的效果??
2018-9-26 22:45
0
雪    币: 1085
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
不错不错,很好的风险,解决了我一个大问题!
谢谢楼主!
2018-10-17 23:15
0
游客
登录 | 注册 方可回帖
返回
//