Introdução
No início deste semestre na faculdade recebemos a missão de criar um projeto utilizando os conceitos do CORBA, dentro da matéria de Projetos de Redes e Sistemas Distribuídos.
O fato é que a literatura encontrada foi apesar de não ser tão pouco, era relativamente confusa, e levando em conta a minha falta de habilidade com programação, mesmo sem um trabalho em grupo, a tarefa tornou-se ainda mais complicada.
O trabalho passou por fases nas quais a ideia inicial era aproveitar uma implementação do CORBA já existente dentro do apache, passando por um projeto de caixa eletrônico, um hello world em um momento mais desesperado, e por fim acabou saindo como uma interface para envio de comandos remotos para máquinas Windows.
Este post é especialmente dedicado para aqueles que por ventura estejam enfrentando este mesmo desafio e espero que possa facilitar o trabalho de outros estudantes.
Afinal de contas, WTF é esse CORBA?
CORBA é a abreviado de Common Object Request Broker Architecture, uma arquitetura padrão criada pelo OMG, Object Management Group, não não é Oh My God, com o objetivo de estabelecer e simplificar a troca de dados entre sistemas distribuídos heterogêneos. Ou seja, é um padrão que tenta tornar simples a troca de dados entre máquinas com diferentes sistemas, buscando esta comunicação de forma transparente ao usuário, fazendo com que o CORBA seja um dos modelos mais populares de objetos distribuídos.
Uma das grandes vantagens que vi durante os estudos sobre o CORBA é o fato dele realmente buscar a integração transparente entre os sistemas, de forma que até mesmo a linguagem de programação dos cliente e servidor podem ser diferentes, característica essa que seus concorrentes como o RPC e RMI não possuem.
Para mais informações sobre o CORBA faça o download do material utilizado na apresentação deste trabalho que está no final da página, além disso uma pesquisa em outros sites é sempre uma boa pedida nesses casos.
Implementação
Partindo para a parte prática do trabalho, que foi onde realmente encontramos as dificuldades, vou descrever como fiz a implementação do código e algumas pequenas alterações também para deixar a ferramenta final mais prática.
Antes de iniciar, gostaria de deixar claro que NÃO ESCREVI ESTE CÓDIGO, eu encontrei ele pronto na internet, o link onde está o código original está nas referências no final do post, tudo o que fiz além da implementação dele foi criar algumas coisas para que seu uso fosse facilitado.
O código em questão foi escrito em Java, seu objetivo é criar um meio para que através de uma máquina Linux, seja possível enviar comandos remotos para uma máquinas Windows, de maneira bem semelhante a um rootkit, porém com um detalhe bastante importante, devido a estrutura desta aplicação, as ferramentas de antimalware não o viram como algo malicioso, ou seja, ela pode se usada de forma incorreta, ter um potencial destrutivo considerável.
Para facilitar aqueles que quiserem implementar este mesmo código, no final do post estarei colocando o link para download de todos os pacotes que utilizei no processo.
Implementando o Cliente - Linux
Para implementação do cliente, utilizei uma máquina virtual com o CentOS 7 instalado, uma das partes chatas do processo é com certeza a instalação do Java, e é justamente neste ponto que vamos iniciar.
1 - Preparando o ambiente
Antes de iniciar a instalação dos componentes para nosso laboratório com o CORBA, recomendo que sejam feitos alguns ajustes no sistema operacional, lembrando que o foco destes ajustes é simplesmente tornar a tarefa mais fácil, de forma que estaremos desconsiderando completamente neste momento recomendações de segurança, uma vez que estaremos desabilitando o firewall e selinux.
Para desabilitar o firewall e evitar que o mesmo seja ativado novamente quando reiniciarmos vamos utilizar o seguinte comando:
# chkconfig firewalld off
Lembrando que o comando acima somente marca o firewall para não ser iniciado no boot, ou seja neste momento ainda estamos com ele ativado, porém como reiniciaremos nossa máquina depois não precisamos nos preocupar com isso.
Agora vamos desabilitar o SELINUX, para isso vamos editar seu arquivo de configuração, no caso eu prefiro utilizar o vim para estas edições, porém ele não está instalado por padrão, caso queira utilizar ele deve primeiro instalar com o comando yum install vim. Para prosseguir com a configuração do SELINUX vamos utilizar os seguintes comandos:
# vim /etc/selinux/config
Após abrir o arquivo de configuração, procure pelo parâmetro SELINUX e coloque o valor como disabled.
Por último vamos atualizar nosso sistema operacional com o seguinte comando:
# yum update
Após concluir todas estas etapas reinicie com o seguinte comando:
# reboot.
Seu sitema agora está pronto para iniciarmos as implementações do CORBA, recomendo que faça o download do pacote contendo tudo o que utilizaremos link abaixo:
https://sourceforge.net/projects/corba-commander/
Após fazer o download descompacte ele com o seguinte comando:
# tar -vzxf corba.tar.gz
Dentro da pasta descompactada você encontrará todos os pacotes que utilizaremos, incluindo o instalador do java.
2 - Instalação do Java
Neste laboratório utilizei o pacote jdk-8u25-linux-x64.rpm disponível para download no site da Oracle.
Para instalação do pacote utilize o seguinte comando:
# yum -y localinstall jdk-8u25-linux-x64.rpm
3 - Implementação do cliente
Após instalado o java, utilizaremos o comando idlj para criar a estrura de stubs e sckeletons da nossa aplicação, primeiro entre na pasta onde estão os fontes e sem seguida execute o seguinte comando:
# /usr/java/jdk1.8.0_25/bin/idlj -fall Commander.idl
Após executar o comando você poderá ver que um novo diretório foi criado com o nome de Commander, dentro dele estarão os stubs e sckeletons.
Agora vamos compilar os pacotes do java com o seguinte comando:
Compilando cliente # javac Cliente.java
Compilando servidor
# javac Server.java
Aqui está um dos problemas que encontrei na implementação, quando tentei compilar o cliente no linux e o servidor depois no windows, tive problemas na compilação do servidor, porém quando compilei os dois no linux e mandei para o windows tudo já compilado não tive nenhum problema posterior.
Após compilar, copie tudo para a máquina Windows.
Ambos os arquivos na verdade são arquivos BAT que após sua criação usei o Advanced Bat to EXE para empacotar, desta forma a execução ficou mais prática, segue abaixo o conteúdo do arquivo tns.exe
@ECHO OFF
SET PORT="2000"
tnameserv -ORBInitialPort %PORT%
Note que o arquivo tns.exe definimos qual é a porta de comunicação e em seguida iniciamos o serviço tnameserv, este serviço é responsável pela comunicação entre nomes do cliente com o servidor, bem parecido com um DNS.
Abaixo segue o conteúdo do Commander.exe
@ECHO OFF
SET CORBA="c:\Corba Project\Commander"
SET PORT="2000"
netsh firewall set opmode disable
cd %CORBA%
java Server -ORBInitialHostlocalhost -ORBInitialPort %PORT%
Antes de iniciar a instalação dos componentes para nosso laboratório com o CORBA, recomendo que sejam feitos alguns ajustes no sistema operacional, lembrando que o foco destes ajustes é simplesmente tornar a tarefa mais fácil, de forma que estaremos desconsiderando completamente neste momento recomendações de segurança, uma vez que estaremos desabilitando o firewall e selinux.
Para desabilitar o firewall e evitar que o mesmo seja ativado novamente quando reiniciarmos vamos utilizar o seguinte comando:
# chkconfig firewalld off
Lembrando que o comando acima somente marca o firewall para não ser iniciado no boot, ou seja neste momento ainda estamos com ele ativado, porém como reiniciaremos nossa máquina depois não precisamos nos preocupar com isso.
Agora vamos desabilitar o SELINUX, para isso vamos editar seu arquivo de configuração, no caso eu prefiro utilizar o vim para estas edições, porém ele não está instalado por padrão, caso queira utilizar ele deve primeiro instalar com o comando yum install vim. Para prosseguir com a configuração do SELINUX vamos utilizar os seguintes comandos:
# vim /etc/selinux/config
Após abrir o arquivo de configuração, procure pelo parâmetro SELINUX e coloque o valor como disabled.
Por último vamos atualizar nosso sistema operacional com o seguinte comando:
# yum update
Após concluir todas estas etapas reinicie com o seguinte comando:
# reboot.
Seu sitema agora está pronto para iniciarmos as implementações do CORBA, recomendo que faça o download do pacote contendo tudo o que utilizaremos link abaixo:
https://sourceforge.net/projects/corba-commander/
Após fazer o download descompacte ele com o seguinte comando:
# tar -vzxf corba.tar.gz
Dentro da pasta descompactada você encontrará todos os pacotes que utilizaremos, incluindo o instalador do java.
2 - Instalação do Java
Neste laboratório utilizei o pacote jdk-8u25-linux-x64.rpm disponível para download no site da Oracle.
Para instalação do pacote utilize o seguinte comando:
# yum -y localinstall jdk-8u25-linux-x64.rpm
3 - Implementação do cliente
Após instalado o java, utilizaremos o comando idlj para criar a estrura de stubs e sckeletons da nossa aplicação, primeiro entre na pasta onde estão os fontes e sem seguida execute o seguinte comando:
# /usr/java/jdk1.8.0_25/bin/idlj -fall Commander.idl
Após executar o comando você poderá ver que um novo diretório foi criado com o nome de Commander, dentro dele estarão os stubs e sckeletons.
Agora vamos compilar os pacotes do java com o seguinte comando:
Compilando cliente # javac Cliente.java
Compilando servidor
# javac Server.java
Aqui está um dos problemas que encontrei na implementação, quando tentei compilar o cliente no linux e o servidor depois no windows, tive problemas na compilação do servidor, porém quando compilei os dois no linux e mandei para o windows tudo já compilado não tive nenhum problema posterior.
Após compilar, copie tudo para a máquina Windows.
Implementando o Servidor - Windows
Na máquina Windows não precisamos compilar nada, para facilitar a a execução eu criei dois arquivos executávei, um chamado tns.exe e outro Commander.exe.Ambos os arquivos na verdade são arquivos BAT que após sua criação usei o Advanced Bat to EXE para empacotar, desta forma a execução ficou mais prática, segue abaixo o conteúdo do arquivo tns.exe
@ECHO OFF
SET PORT="2000"
tnameserv -ORBInitialPort %PORT%
Note que o arquivo tns.exe definimos qual é a porta de comunicação e em seguida iniciamos o serviço tnameserv, este serviço é responsável pela comunicação entre nomes do cliente com o servidor, bem parecido com um DNS.
Abaixo segue o conteúdo do Commander.exe
@ECHO OFF
SET CORBA="c:\Corba Project\Commander"
SET PORT="2000"
netsh firewall set opmode disable
cd %CORBA%
java Server -ORBInitialHostlocalhost -ORBInitialPort %PORT%
Dentro do arquivo Commander.exe primeiro temos a desativação do firewall com o comando netsh, em seguida iniciamos nossa aplicação java definindo como porta de comunicação a mesma porta que informamos no tns.exe, no nosso caso 2000.
Executando o Servidor - Windows
O primeiro passo é executar o dentro do servidor o arquivo tns.exe, após sua execução verifique na lista de processos se o tnameserve.exe está em execução. Após confirmado execute o Commander.exe, repare que após executar o Commander.exe o firewall do windows deve ter sido desativado.
Executando o Cliente - Linux
Após confirmada a execução do servidor, na máquina linux execute o Commander.sh com o comando abaixo:
# sh Commander.sh
Informe o IP do cliente e a porta, no nosso caso ficou definida como 2000, e em seguida basta começar a enviar os comandos.
Este script foi criado para facilitar a execução do cliente pois originalmente a cada comando enviado ele encerrava e precisava ser aberto novamente, abaixo segue o conteúdo do script.
echo "Informe o ip/hostname do servidor: "; read SERVER
echo "Informe a porta de conexao: "; read PORT
while true; do
java Client -ORBInitialHost $SERVER -ORBInitialPort $PORT ;
sleep 5;
done;
Demonstração
Downloads
- CentOS - http://www.centos.org
- Pacote completo do Commander - https://sourceforge.net/projects/corba-commander/
- Slide do trabalho versão EXE (Prezi) - https://mega.co.nz/#!qQgWQCyD!vSJaiFw2_x7Ehg3BFraoyAZ4PUxHUi4FfyEpHNC91R4
- Slide do trabalho versão PDF (Prezi) - https://mega.co.nz/#!OFgDQQaZ!KtVbhMlY9tYBvOzfiaFssk9qoTFSSQz_MYNF-LnJGxs
Referências
- Mi Manual de Corba - John Michel Rivera de León - https://www.scribd.com/doc/171784793/Mi-Manual-Corba
- Desenvolvimento de Aplicações Java/Corba - Emerson Ribeiro de Mello, Fábio Favarin e Joni da Silva Fraga - https://www.yumpu.com/pt/document/view/12702582/tutorial
- Fundamentos da Engenharia de Software - Mauricio Maron e Ramiro Pereira - http://www.dcc.ufrj.br/~schneide/es/2002/2/t20/arquitetura.htm