A primeira versão estável do MSF foi lançada em meados de 2004. Originalmente escrito em Perl, Assembler e C. Seus desenvolvedores (veja a lista no endereço) resolveram quebrar o paradigma de como os exploits eram desenvolvidos até então.
Escrever um exploit anteriormente era uma tarefa complexa, e a exploração de uma vulnerabilidade exigia conhecimentos profundos em programação especifica para cada plataforma. O MSF veio para diminuir essa complexidade e fazer intenso reuso de código, assim como faz a concepção da programação orientada a objetos.
Digamos que antes do MSF o desenvolvimento dos exploits era feito no melhor estilo da programação procedural tradicional, e depois do MSF a pesquisa começou a se basear na programação orientada a objetos.
A versão 2.x foi substituída pela versão 3.x, totalmente reescrita na linguagem Ruby que é uma linguagem O-O real, com características únicas, como: alto nível de introspecção, recriação automatizada de classes, suporte a threading com plataforma independente e, finalmente, porque é uma linguagem que os desenvolvedores realmente sentem prazer em usar. Como resultado do uso do Ruby, o código original foi enxugado em quase 40, entretanto algumas partes do código ainda estão em Assembler e C.
Com a versão 3.x, a licença passou da GPL 2 para a
Metasploit Framework License v1.2, mais parecida com a GPL 3. O Objetivo da nova licença é proteger o núcleo do projeto do uso comercial, mas ao mesmo tempo, autorizar a integração com módulos comerciais agregados, desde que estes módulos não modifiquem o framework. Em suma, o Metasploit continua sendo open source, e não acontecerá com ele, segundo os desenvolvedores, o que aconteceu com o scanner de vulnerabilidades Nessus.
Tecnologia
O núcleo do Metasploit reside no REX (Ruby Extension Library), que é uma coleção de classes e métodos. A descrição completa das classes e métodos pode ser acessada no endereço:
E a documentação da API REX:
Para exemplificar algumas entre as muitas funcionalidades dessas classes do REX, durante o desenvolvimento do exploit precisamos ajustar o stack pointer, muitas vezes isso significa chamar determinado operador, que são específicos para cada plataforma, como por exemplo: jmp opcode na arquitetura x86. Então invocamos a classe Rex::Arch:: para ajustar o stack pointer e depois especificarmos a plataforma com Rex::Arch::X86 com os métodos jmp, mov, sub, pack, add, call, clear etc.
Outro exemplo famoso e infame é a classe Rex::Exploration::Seh. O Structured Exception Handling, SEH, é uma proteção usada para checar o controle do fluxo cada vez que uma exceção acontece. Um estouro de buffer modifica o fluxo comum do programa e o SEH trata desses erros. A classe Rex::Exploration::Seh pode ser usada para evadir o SEH.
Para maiores informações consulte:
Ou ainda:
Framework Core: É formado de vários sub-sistemas como gerenciamento de módulos, sessões, despacho de eventos etc.
Framework Base: Provê a interface para interagir com o Framework Core provendo configurações, registro de logs e sessões.
Interfaces: Provê a interface com o usuário, atualmente são: msfconsole, msfcli, msfgui, msfweb, msfd.
Módulos: São compostos pelos exploits, payloads, encoders, NOP generators e módulos auxiliares, como por exemplo, scanners, conexão com base de dados (MS-SQL), fuzzers de protocolo etc. A lista completa pode ser acessada com o comando show all na interface msfconsole e informações específicas do módulo com o comando info <module_name>.
Plugins: Podem ser comparados aos módulos no sentido de trazer funções extras ao framework.
Para o iniciante é importante saber a diferença entre exploit e payload. Exploit é a exploração da falha em si, que permite ao explorador fazer alguma coisa. O payload é a coisa que será feita. Um comando a ser executado, um shell etc.
O Metasploit conta ainda com outras tecnologias, como por exemplo, a evasão de Intrusion Detection Systems (IDS) e Intrusion Prevention Systems (IPS), tornando a vida dos detectores de intrusão mais difícil. Atualmente os IDSs e IPSs ainda tem muitos problemas, e certamente ainda estão longe de uma funcionalidade considerada ideal e robusta.
O Metasploit pode servir para auditar essas ferramentas. Existem varias classes que podem ser usadas para evadir os detectores de intrusão, TCP::max_send_size, TCP::send_delay, HTTP::chunked, HTTP::compression, SMB::pipe_evasion, DCERPC::bind_multi, DCERPC::alter_context, entre outros.
Outra tecnologia que merece destaque é o Metasploit anti-forensics chamada de MAFIA (Metasploit Anti-Forensic Investigation Arsenal). O MAFIA é constituído basicamente das ferramentas:
- Timestomp: Usado para modificar os arquivos do sistema de arquivo New Technology File System (NTFS). Pode-se modificar os valores de quando os arquivos foram criados, deletados etc.
- Slacker: Usado para esconder arquivos em partições NTFS.
- Sam Juicer: Um módulo do Meterpreter usado pra extrair hashes dos arquivos SAM sem acessar o disco rígido.
- Transmogrify: Ferramenta usada pra passar pelo EnCases file-signaturing.
Tecnologia do Meterpreter Payload
A fase chamada pós-exploração foi significantemente melhorada na versão três. Um dos principais payloads do MSF é o Meterpreter. O Meterpreter tenta ser invisível ao sistema atacado. Para ilustrar, vamos ao exemplo de problemas: Host Intrusion Detection Systems podem soar um alarme assim que você digitar seu primeiro comando no shell ou mesmo deixar rastros para que o perito forense descubra o que foi feito durante o ataque.
Para finalizar esse capitulo introdutório, que não tem por objetivo ser exaustivo com relação à tecnologia do framework, lembre-se de que, como todo projeto open source, é muito dinâmico e novidades são incorporadas da noite para o dia. Esperamos que todos possam aprendam muito mais sobre segurança com o uso do Metasploit Framework.