通过下载功能在 Facebook for Android 上执行任意代码
https://dphoeniixx.medium.com/arbitrary-code-execution-on-facebook-for-android-through-download-feature-fb6826e33e0f
长话短说
最近我在 Facebook 上发现了一个适用于 Android 的 ACE,可以在不打开文件的情况下通过从组文件选项卡下载文件进行分类。
背景
我正在深入研究 Facebook 从群组下载文件的方法,我发现 Facebook 使用两种不同的机制来下载文件。如果用户从帖子本身下载文件,据我所知,它将通过名为 DownloadManager 的内置 android 服务进行下载 这是下载文件的安全方法。如果用户决定从“文件”选项卡下载文件,它将通过不同的方法下载,简而言之,应用程序将获取文件,然后将其保存到“下载”目录,不进行任何过滤。
注意:所选代码是 Facebook 推送的修复程序。易受攻击的代码没有此代码。
路径遍历
漏洞在第二种方法中,上传文件时在服务器端做了安全措施,但很容易绕过。应用程序只需获取下载文件,例如,在/sdcard/Downloads/FILE_NAME不过滤文件的情况下保存文件FILE_NAME以防止路径遍历攻击。我想到的第一个想法是使用路径遍历来覆盖本地库,这将导致执行任意代码。
我已经设置了我的 burp 套件代理然后拦截了上传文件请求并修改文件名然后../../../sdcard/PoC转发请求。
Web 上传端点
不幸的是,由于服务器端的安全措施,这还不够,我的路径遍历有效负载被删除了。我决定尝试使用有效载荷,但不幸的是,没有任何有效载荷起作用。
绕过安全措施。(旁路?)
在许多有效负载之后,我无法绕过该过滤器。我又回来浏览应用程序,可能会发现一些有用的东西,它来了!
我第一次注意到我可以通过 Facebook 移动应用程序上传文件。在我的手机上设置 burp suite 代理,在应用程序上启用白帽设置以绕过 SSL pinning,拦截上传文件请求,将文件名修改为../../../sdcard/PoC,文件已成功上传,我的有效载荷现在在文件名中!
我尝试从帖子中下载文件,但正如我所说的那样,DownloadManger 服务是安全的,因此攻击没有奏效。导航到“文件”选项卡,然后下载文件。这是我们的攻击。我的文件被写入了/sdcard/PoC!
由于我能够执行路径遍历,我现在可以覆盖本地库并执行 ACE 攻击。
开发
为了利用该攻击,我启动了一个新的 android NDK 项目来创建一个本地库,并将我的任意代码放在 JNI_OnLoad 函数上,以确保在加载库时执行恶意代码。
#include <jni.h>
#include <string>
#include <stdlib.h>
JNIEXPORT jint JNI_OnLoad(JavaVM* vm, void* reserved) {
system(“id > /data/data/com.facebook.katana/PoC”);
return JNI_VERSION_1_6;
}
我构建了项目来获取我的恶意库,然后通过移动上传端点上传并将其重命名为/../../../../../data/data/com.facebook.katana/lib-xzs/libbreakpad.so
我们的漏洞现在已经准备好了!
PoC 视频:
时间线
2020 年 4 月 29 日,凌晨 5:57:将报告提交至 Facebook。
2020 年 4 月 29 日上午 11:20:Facebook 能够重现它。
2020 年 4 月 29 日中午 12:17:分类。
2020 年 6 月 16 日,中午 12:54:漏洞已修复。
2020 年 7 月 15 日,下午 5:11:Facebook 奖励了我!