导语:本文我会想向你展示一个相当简单的方法,该方法能绕过所有Android移动目标的“证书锁定”(certificate pinning)。本文描述的方法是基于Piergiovanni Cipolloni的研究文章和他开发的脚本。
本文我会向你展示一个相当简单的方法,该方法能绕过所有Android移动设备的“证书锁定”(certificate pinning)。本文描述的方法是基于Piergiovanni Cipolloni的研究文章和他开发的脚本。如果需要在Android手机上绕过认证,都要涉及SSLContext。本文会讲解一种通过调用Frida并操纵SSLContext来构建一个能够在Android上普遍绕过证书锁定的脚本。
简单地说,脚本的运行分以下3步:
1.它会从文件系统(Burpsuite的CA证书)中加载一个流氓证书;
2.它会创建一个包含用户信任的CA密钥库(Keystore);
3.最后,它会创建一个TrustManager,它会信任用户的密钥库中的CA。
每当应用程序初始化其SSL Contex时,Frida脚本都会劫持sslcontext.init()方法,当它被调用时,第二个参数即应用程序TrustManager会出现。在Android上,SSLContext函数调用又被称为SSLContext.init(KeyManager,TrustManager,SecuRandom)。
对于初学者来说,要理解Piergiovanni Cipolloni的方法会显得很困难。因此,为了让这部分读者能读懂,我特意加了一些基本知识在里面。
本文会包含以下7方面内容:
1.如何将Burp证书安装到你的设备上;
2.如何为移动设备配置Burpsuite;
3.如何在你的Android设备上安装Frida;
4.如何远程运行Frida服务器;
5.如何在你的服务器上安装Frida;
6.如何使用应用程序调用脚本;
7.为什么要进行证书锁定。
通过证书锁定,开发人员可以确保其应用程序不接受实际由官方认证机构签名的假证书。 由于Android系统本身只检查证书的层次结构是否正确以及是否在所谓的“信任证书存储库”中体现CA的标识,所以如果攻击者将伪造的CA标识嵌入到信任存储库,那后果不堪设想。如果发生以上的攻击,攻击者基本上就能够拦截应用程序的整个HTTPS传输。为此,开发人员才会进一步,在应用程序中编译真实证书,并确保应用程序只使用该证书。
构建运行环境:
1.你需要一台Android虚拟机或真实设备;
2.一些空闲时间;
3.安装并配置ADB / Android 工具。
安装Burp证书
使用Burpsuite运行浏览器(默认值:127.0.0.1:8080),然后单击CA认证。
这时一个名为cacert.der的文件会被下载,不过下载后该文件会被重命名为cacert.cer,关于cacert.der和cacert.cer的区别,简而言之,就是一种替代关系,如要详细了解,请点此。
如果你的运行设备是Mac,而且默认下载目录就是“下载”,就可以执行以下操作:
1.cd / Downloads,将你的目录更改为“下载”;
2.mv cacert.der cacert.cer,重命名证书;
3.adb push cacert.cer / mnt / sdcard / DCIM /,将证书复制到设备的SD卡。
接着,在设备上(无论是虚拟的还是实际的),你必须安装证书才能将其放入Android的信任证书存储库中。
具体操作步骤是这样的:点击菜单按钮→进入设置→一直向下滚动到安全→选择从SD卡安装。
点击cacert.cer并命名证书,例如命名为Burp。如果一切正常,你应该在设置→安全→可信凭证→用户下看到以下显示。
这样,你就成功地将自己的CA安装到系统中。
配置Burpsuite
现在你已经在系统上安装了PortSwigger CA,为此需要先设置代理,以便拦截应用程序服务器的流量。
设置你的Android设备
再次进入设置→点击Wi-Fi→点击WiredSSID→点击修改网络 →点击代理→选择手动设置,这样屏幕就会出现以下信息列表。
你需要填写的内容如下:
1.你的Burp Suite应用程序的IP地址是代理主机名吗;
2.端口是否启动了Burp Suite(默认为8080)。
设置Burp
在默认情况下,Burp会在主机端口8080上打开一个本地代理,以拦截你的移动流量。为此,你必须设置Burp来监听外部IP地址。启动Burpsuite并转到代理项,然后选项当前配置(如下图所示),最后进行编辑。
现在选择特定地址选项并选择你的本地IP地址,比如我的就是192.168.0.193,而对于读者来说,这取决于你的DHCP服务器如何分配地址。
如果你不确定你的IP地址是哪个,以OSX为例,请打开终端并输入ifconfig en0 | grep inet命令进行查找。
如果你按着我说的步骤下来,那么你现在就可以无需证书锁定来拦截应用程序流量了。
在你的Android设备上安装Frida
这一步要进行的就是绕过证书锁定了,为此你需要在你的Android设备上安装一个Frida-Server的副本。首先,你需要下载最新版本的Frida-Server,点此进行下载。不过,问题来了你需要知道下载的版本,是x86还是x86_64,在此,我告你一个简单方法:只需要输入adb shell getprop ro.product.cpu.abi即可找出正确的版本,比如我就是x86。所以对我来说,正确的版本是frida-server-10.6.15-android-x86.xz。你可能会会注意到.xz扩展名是一个档案文件,所以,在使用二进制文件之前,我们首先要对它进行解析。对于资深用户来说,你只需输入tar -xJf frida-server-10.6.15-android-x86命令,然后使用 MAC解压神器The Unarchiver即可。在解析该二进制文件以后,你就需要使用终端了。
1.mv frida-server-10.6.15-android-x86 frida-server,将其重命名为frida-server;
2.adb root,确保你的环境能够以root身份运行命令;
3. adb push frida-server /data/local/tmp/,将frida-server二进制文件复制到设备;
4.adb shell“chmod 755 / data / local / tmp / frida-server”,为二进制文件系统提供正确的权限;
5.adb shell“/ data / local / tmp / frida-server&” – 在后台将frida-server作为一个服务运行;
5.1. 如果要在外部IP上运行frida-server就要输入 adh shell "/data/local/tmp/frida-server –listen 0.0.0.0 &命令。
在你的设备上安装Frida
不管你用的是什么设备,你都需要执行sudo pip来安装Frida。
为验证你是否安装了Frida(不管是远程还是本地),你都需要执行frida-ps。此时会显示一个ps命令,该命令将在你的设备上生成当前正在运行的进程列表。
如果通过USB连接则会显示frida-ps U;
如果你在外部地址使用frida ,那无论你手机的地址是什么,都会显示frida-ps -H 192.*.*.*。
如果你看到类似以下的输出:
那证明你可以准备绕过“证书锁定”了。
为了证明我的判断,我将在这里使用一个随机应用程序,如果你想要看更多的实践案例,可以在Hackerone,Bugcrowd,Synack或Zerocopter上找到。
为了绕过证书锁定,我需要通过Piergiovanni Cipolloni编写的Android SSL Re-pinning Frida脚本来实现,该脚本可以在这里找到。
使用Frida绕过证书锁定
首先,我需要在设备上安装我的目标,这可以通过多种方式完成:
1.从Google应用商店中下载安装应用程序;
2.使用Apkpure或apk-dl下载应用程序。
下载完以后,打开终端并使用adb install com.company.whatever.apk安装应用程序。
下一步是从应用程序中选择你的目标,就像我之前所讲的那样,可以使用frida-ps -H 192.*.*.*用于远程Frida服务器,如果你是通过USB连接设备的,请使用frida-ps -U。接下来,我需要做的就是创建一个以前生成的cacert.cer的副本,如果你完全是按着我的步骤来做的,那此时cacert.cer的副本仍然位于“下载”文件夹中。
最后打开终端,进行以下5步操作:
1.通过cd Downloads命令,把“cacert.cer”移动到“下载”文件夹;
2.通过mv cacert.cer burpca-cert-der.crt 命令来进行重命名,以匹配Frida脚本中的文件;
3.通过wget https://techblog.mediaservice.net/wp-content/uploads/2017/07/frida-android-repinning_sa-1.js命令下载Frida脚本;
4.通过adb push burpca-cert-der.crt /data/local/tmp/cert-der.crt命令将流氓证书推送到设备;
5. 通过frida -U -f it.app.mobile -l frida-android-repinning_sa-1.js –no-pause命令实现绕过。
如果看到以下输出,就意味着你可以绕过所有Android移动目标的“证书锁定”。