Home Pentesting Android P.1 - O Princípio
Post
Cancel

Pentesting Android P.1 - O Princípio

Pentesting Android

INTRODUÇÃO

Recentemente surgiu o desafio profissional de me introduzir no universo dos testes em apk, o que logo no primeiro foi um tanto caótico, dada a necessidade do fast learning durante este período.

Bom, a falha grave, no meu ponto de vista, era simplesmente não estar preparado pelo menos com o mínimo esperado, ante um assunto aquecido no mercado.

Por conta disso, decidi separar uma parte deste ano, somente para me aprofundar nos estudos de pentesting mobile, e como meus estudos são bem melhores aproveitados quando eu expresso o aprendido de alguma forma, irei compartilhar em blog posts, toda a jornada de aprendizado.

O PRINCÍPIO

Aplicações mobile compreendem um universo de possibilidades que se convergem em vários pontos com outras áreas de segurança, portanto, antes de qualquer contato direto com técnicas específicas, é preciso pincelar sobre alguns temas básicos que fazem parte desta rotina, tais como:

  • Criptografia
  • SSL/TLS
  • mTLS
  • Proxies
  • Android e sua arquitetura

CRIPTOGRAFIA

A criptografia é um mecanismo aplicado a segurança e a privacidade utilizada para tornar a comunicação segura de diversas formas. A base principal da criptografia, desde sua origem a alguns séculos atrás, é tornar a comunicação initeligível para qualquer um que não tenha acesso aos mecanismos e códigos de tradução de uma mensagem.

Nas comunicações digitais, por exemplo, a criptografia tem grande papel na proteção de dados transmitidos entre dois ou mais nós, evitando que estes dados sejam lidos em texto claro, caso sejam interceptados, ou até mesmo evitando a interceptação em alguns casos.

Um mecanismo de criptografia tem como base, três principais elementos:

  • Chave: Um código que utilizado para encriptar e/ou decriptar uma mensagem, funciona basicamente como a chave de uma porta, onde somente quem possui a mesma, consegue abrir ou fechar esta porta. No mundo digital, existem vários tipos de chave, sendo os mais convencionais simétrica e assimétrica. Sua existência é necessária, pois é inviável manter o algoritmo criptográfico em segredo, sendo assim, utiliza-se a chave criada a partir de um algoritmo de criptografia;
  • Encriptar: É o processo de codificar uma informação utilizando uma chave, de modo que seu resultado final seja algo incompreensível;
  • Decriptar: É o processo de decodificar uma mensagem encriptada utilizando uma chave, ou seja, uma informação encriptada com uma chave é initeligível até que seja decriptada utilizando uma chave.

Criptografia Simétrica

Um sistema criptográfico é considerado simétrico quando é utilizada a mesma chave, uma chave privada, tanto para encriptar quanto para decriptar uma mensagem. A imagem abaixo mostra este fluxo.

Criptografia simétrica

Criptografia Assimétrica

Um sistema criptográfico é considerado assimétrico quando são utilizadas duas chaves no processo de encriptação e decriptação, no caso uma chave privada e um chave pública. Neste cenário, a chave privada deve ser mantida em segredo e a chave pública pode ser compartilhada.

Neste fluxo de criptografia, a chave pública é utilizada para encriptar uma mensagem, enquanto que somente a chave privada consegue decriptá-la. A imagem abaixo exemplifica este fluxo.

Criptografia assimétrica

Algorítmo de Hash

A hash é um algorítmo que recebe qualquer comprimento de entrada, sejam eles qualquer tipo de dados, e mescla esta entrada para produzir uma saída pseudoaleatória de largura fixa, ou seja, independente da largura dos dados encriptados, seu resultado terá sempre uma largura fixa.

Uma hash é identificada pelas seguintes características:

  1. Um algorítmo de hash sempre redumirá os dados de entrada em uma saída de tamanho fixo, independente do conteúdo de entrada;
  2. A saída de um algorítmo de hash é pseudoaleatória por princípios matemáticos;
  3. Se um único bit for alterado nos dados de entrada, a saída de uma hash será completamente diferente;
  4. Não pode ser reversível, ou seja, a partir de uma hash, é impossível reconstruir os dados de entrada, princípio conhecido como “função de via única”;
  5. Um algorítmo de hash não pode encontrar duas mensagens que produzam a mesma saída.

Alguns algoritmos de hash conhecidos:

AlgorítmoTamanho de saídaHashes possíveisExemplo
MD516 Bytes / 128 bits2128196024cd532a9b08c8096eb3632a97b7
SHA-120 Bytes / 160 bits216054aa06f5a16d8eb7d1141cf49ce3da68c81e90a4
SHA-25632 Bytes / 256 bits2256ca08547be53fa295c6d3f127fc7692096150cd3a2f3a618991991eb0f9983ad6
SHA-51264 Bytes / 512 bits2512abb5d711e31907f0021e346ce34ae7df7e5e866a5369811a4354b533fc451544
0ac9f9d5fa08e7ebf42787e4ca569c3a71378a6a4d112ce461628c5214c9632a

Assinatura Digital

A assinatura digital, nada mais é que uma chave privada virtual, vinculada a um certificado digital, assim como uma assinatura em um papel, a assinatura digital assume a legalidade de uma assinatura comum.

Uma assinatura digital é composta de dois principais fundamentos:

  1. A chave primária precisa ser segura e somente o proprietário desta chave possa utilizá-la;
  2. A única maneira de produzir uma assinatura digital seja utilizando uma chave pública.

Portanto, para ter uma criptografia segura, os dados devem ser criptografados com a chave pública para que somente a chave privada possa decriptar.

Certificado Digital

O certificado digital, nada mais é do que uma forma de associar uma chave pública a uma entidade de destino, pois ele associa esta chave a um nome. Ele é composto basicamente do nome, da chave pública e da assinatura digital.

A construção de um certificado digital, é feita de uma maneira que torna perceptível caso alguém ou algo com comportamento malicioso altere qualquer informação que o compõe.

A assinatura de um certificado digital, é normalmente (mas não sempre) feita pr meio de uma autoridade certificadora, ou “CA” (Certification Authority). Atualmente, o certificado digital mais utilizado segue o padrão X.509.

A estrutura de um certificado digital no padrão X.509 segue exemplificado na imagem abaixo e também pode ser lida com detalhes na RFC 5280 na sessão 4.1.1.

Estrutura do certificado no padão X.509

SSL/TLS

O SSL/TLS (Secure Sockets Layer e Transport Layer Security) é utilizado para garantir a autenticidade e o sigilo na comunicação entre servidores e clientes, geralmente utilizado nos protocolos HTTP e SMTP.

O SSL/TLS adiciona uma nova camanda, ou layer na comunicação HTTP conforme ilustrado abaixo.

Requisição sem e com SSL/TLS

Durante o processo de comunicação entre um cliente e um servidor utilizando SSL, fluxo segue da seguinte maneira:

Comunicação via SSL

mTLS

O mTLS ou Mutual TLS é o proceso pelo qual o servidor solicita ao cliente um certificado TLS durante o estabelecimento do TLS, quendo este certificado é recebido, o servidor possui condições de avaliá-lo.

Este processo chamado de TLS Handshake Certificate Request é uma troca de mensagem opcional enviada do servidor para o cliente. Esta requisição é composta de uma lista de certificados digitais raiz aceitos pelo servidor.

Portanto, quando um cliente recebe esta requisição de um servidor, deve enviar uma resposta com ceu próprio certificado de um dos certificados raiz.

A imagem abaixo, ilustra este fluxo de comunicação.

Comunicação via mTLS

PROXY

O proxy, de forma bem simplificada ,é um servidor que age como um intermediário entre requisições de clientes para outros servidores. Esta funçã de intermediação não só monitora, como pode filtrar e/ou armazenar dados transitados.

Desta forma, por mais que um proxy seja diferente de um firewall, ainda assim pode realizar filtros, e por mais que não seja um cache também pode implementar esta funcionalidade.

As proxies geralmente são divididas em duas categorias:

  1. Proxy ativo: O tipo de proxy que precisa ser configurado do lado do cliente, definindo o socket do proxy, o BurpSuite é um exemplo de proxy ativo;
  2. Proxy transparente: Este proxy direciona conexões que passam por ele para um servidor ou aplicação específico local. Este tipo de proxy não exige configuração do lado do cliente que geralmente não sabe de sua existência. O webserber NGINX implementa este tipo de proxy.

Web Application Proxy

O web application proxy atua diretamente na camada de aplicação, ou seja, na camada 7 do modelo OSI e permitem que os payloads dasrequisições e respostas do protocolo HTTP sejam filtradas, analisadas e armazenadas.

ANDROID E SUA ARQUITETURA

O Android é um sistema operacional de código aberto baseado em Linux, inicialmente para dispositivos móveis, porém largamente utilizado em diversos outros dispositivos.

A arquitetura do sistema Androide consiste em uma série de componentes que podem ser separados em ses camadas, a imagem abaixo foi retirada da própria Android Developers e listra estas camadas.

Arquitetura Android

Onde:

  • Camada System Apps: É a camada onde as aplicações são instaladas, armazenadas e executadas. Nesta camada, estão os instalados os aplicativos nativos e os aplicativos do usuário;
  • Camada Java API Framework: Esta camada fornece as APIs do sistema para serem utilizadas pelas funcionalidades comuns das aplicações, tais como funcionalidades de compartilhamento de dados, acesso ao telefone, GPS e elementos visuais;
  • Camada Native C/C++ Libraries: Esta camada fornece as bibliotecas C e C++ que são utilizadas para gerenciar processos em baixo nível, processos como encriptação, renderização de imagens e multimídia, entre outros;
  • Camada Android Runtime: Cada aplicação dentro do Android executa em uma própria máquina virtual, por fins de segurança e integridade. E é nesta camada que reside a máquina virtual responsável pelas aplicações em execução;
  • Camada Hardware Abstraction Layer (HAL): Esta camada define os padrões para os fabricantes de hardware implementarem suas funcionalidades. Utilizando a HAL, os fabricantes podem implementar suas funcionalidades sem afetar o sistema em alto nível;
  • Camada Linux Kernel: Esta camada contém o kernel Android que é baseado no kernel Linux 2.6. O kernel é responsável pelo gerenciamento de memória, processos e energia. Esta camada é responsável por controlar o acesso ao hardware do dispositivo por meio de drivers. Como sendo a camada base, ela é quem une todas as camadas superiores.

Máquina Virtual Android (AVM)

As máquinas virtuais são basicamente camadas abstração entre uma aplicação e as camadas subjacentes do dispositivo. Os aplicativos Android e o Java API Framework são desenvolvidos na linguagem de programação Java ou Kotlin e são executados dentro de uma máquina virtual Dalvik.

Máquina Virtual Android (Dalvik)

O Dalvik é uma máquina virtual baseada em registro que interpreta códigos em baixo nível em bytes do Executável Dalvik (DEX). Para seu funcionamento, o Dalvik depende de funcionalidades fornecidas por várias bibliotecas de código nativo de suporte.

Isso se torna necessário, para que o sistema consiga suportar todas as diferenças entre sistemas operacionais sem que o desenvolvedor precise desenvolver aplicativos diferentes para dispositivos específicos.

Segurança de Aplicativos no Android

Por padrão, os aplicativos Android não tem acesso direto a recursos de hardware e cada aplicativo é executado em sua própria sandbox, ou seja, cada aplicativo é executado “enjaulado” em um ambiente. Como o Android é baseado em Linux, o sistema de permissionamento é similar ao permissionamento entre usuários, onde cada usuário compartilha recursos do sistema, mas não tem acesso a ambientes e recursos específicos de outros usuários.

Isto ocorre, para permitir o controle preciso sobre recursos, pois não permite que um aplicativo com falha ou malicioso efete outros aplicativos em execução no dispositivo.

CONCLUSÃO

Acredito que isto é o básico para iniciar o entendimento sobre Android e seu funcionamento, antes de iniciar os testes em aplicativos.
Com estas informações em mente, avancaremos nos próximos artigos.

This post is licensed under CC BY 4.0 by the author.