domingo, 20 de julho de 2014

Segurança: como configurar o tomcat

Boa noite a todos.

Hoje vou escrever sobre um assunto extremamente importante quando vamos fazer um deploy de uma aplicação na internet usando tomcat. O motivo desse post é porque eu migrei recentemente do kinghost para o digitalocean. No kinghost, você recebe um tomcat já preparado contra essa vulnerabilidade. Mas no digitalocean, como você "aluga" uma máquina, você mesmo tem que tomar esses cuidados.

Primeiramente, vou explicar como funciona essa vulnerabilidade do tomcat (na verdade não pode nem ser considerado uma vulnerabilidade pois não há falhas. O que há é falta de configuração).

Vamos supor que você baixe o tomcat do site da apache, descomente os usuários e permissões no arquivo tomcat-users.xml para ter acesso à àrea de administração (deploy de aplicativos) e coloque ele pra rodar no seu servidor. Já lascou tudo! A sua área de administração (manager) está exposta. Mas vamos desde o início... Vamos subir o tomcat sem nenhum projeto para deploy. Quando você acessar http://localhost:8080, você vai ver o index do tomcat como na imagem abaixo:


Note que no canto esquerdo tem um quadro de administração. E o segundo link é Tomcat Manager.
Essa é a área de administração que eu estava falando. Quando você clicar nesse link, ele pede usuário e senha para entrar. Essas credenciais devem ser definidas no arquivo $TOMCAT_HOME/conf/tomcat-users.xml.



Caso você esteja se perguntando qual o problema disso, vou explicar:
O atacante dentro da página de gerenciamento com credenciais de administrador, pode tirar nossa aplicação no ar. Pior que isso: ele pode adicionar uma aplicação no nosso tomcat. E essa aplicação normalmente adicionada pelo atacante, abre um shell reverso(*) que possibilita acesso ao seu servidor. Resumindo, se um atacante entrar nessa área e fazer deploy dessa aplicação, ele pode ter acesso a todos os dados do seu servidor.

Agora vamos considerar o seguinte: normalmente, as pessoas utilizam sistemas Linux como servidor. E em um sistema unix-base, você só sobe seu servidor na porta 80 se for root. O que um usuário normal faz ? Acessa o usuário root e sobe o servidor na porta 80. Quando o atacante fizer o deploy, ele vai acessar o shell com permissão do usuário que iniciou o processo, ou seja, o root!

Acho que agora já deu pra entender a gravidade da situação né ? É tenso mesmo.
Vejamos agora as formas de acabar com isso:

1) Alterando as senhas e usuários padrões (o mais lógico a se fazer)

Para isso, basta que modifique o arquivo $TOMCAT_HOME/conf/tomcat-users.xml alterando os valores padrões e colocando senhas fortes.

2) Remover a área administrativa (modo ignorante)

Nesse ponto é importante saber que a área administrativa é uma aplicação java normal como qualquer outra. E se a vulnerabilidade está nela, então basta deletá-la que a vulnerabilidade irá sumir (quanto menos código, menos bug e menos vulnerabilidade).
Para isso, basta ir na pasta $TOMCAT_HOME/webapps e deletar as pastas docs, examples, host-manager e manager. São todos aplicações do tomcat e não precisamos de nenhuma delas. Delete essas mesmas pastas dentro de $TOMCAT_HOME/work/Catalina/localhost

3) Remover a área administrativa e alterar permissões de pasta (modo ignorante nível hard)

Essa terceira opção, além de remover os aplicativos que não precisamos, funciona como uma prevenção contra outras possíveis vulnerabilidades que o tomcat possua e que ainda não foram descobertas. Não é necessário fazer esse passo pois ele é apenas preventivo.
A lógica desse ataque, é que o atacante utiliza o próprio tomcat para escrever um projeto dentro do servidor. A partir daí, ele faz o que quiser... Mas e se o tomcat não puder escrever na pasta webapps ??? Parece meio estranho mas funciona. Basta você tirar as permissões de escrita na pasta $TOMCAT_HOME/webapps após subir o tomcat. Assim, quando o atacante tentar fazer deploy na pasta, ele não vai ter permissão para escrita e não irá funcionar.


Exemplos:

Eu resolvi fazer esse post porque em 1 dia que coloquei meu tomcat desconfigurado no digitalocean, sofri 2 ataques desse tipo. Eu acho que tinha deixado usuário e senha como "admin" (vacilão). E detalhe: só fiquei sabendo porque o atacante começou a levar tudo do meu servidor e o digitalocean percebendo o grande fluxo de upload, bloqueou meu droplet.


Essa primeira imagem está o index do primeiro ataque. Olhei pouco o código mas vi que serve pra roubar dados do servidor e mandar pra um server remoto.


Nessa segunda imagem, foi o segundo ataque



Criei esse post aqui para mostrar outra forma de barrar um shell reverso.


quarta-feira, 2 de julho de 2014

Realizando acesso externo a um servidor JBoss

Ontem meu grande brother Miller precisou de uma mão nesse ponto e então surgiu a idéia de fazer esse post. Hoje vou falar sobre como acessar externamente diferentes versões do JBoss.

Primeiramente, vamos situar o problema. Voce é desenvolvedor e utiliza o JBoss para testar seu projeto na sua própria máquina. Até aí tudo bem. Tudo funciona. No entanto, no momento de por o projeto em homologação do cliente ou então em produção, voce não consegue mais acessar o servidor. Porque ?
É simples. O JBoss vem configurado apenas para acessos locais (da própria máquina que está instalado). Quando o acesso vem da rede, ele é negado.

Como corrigir isso ?

JBoss 4.X e 5.X

Para esses JBoss, sendo os mais famosos as versões 4.2.3 e 5.0.1, temos a mesma forma de liberar acesso externo. Basta adicionarmos o comando -b 0.0.0.0 !! Isso por si só já libera acessos da rede ao JBoss. Mas onde colocarmos esse comando ?? Aqui dividimos em duas partes:

  1. Iniciar JBoss pelo Eclipse

    Existem várias formas de iniciar o servidor pelo eclipse. A primeira é pela view de Server
    No entanto dessa forma, não nos permite mexer na configuração do JBoss.



    Então nós iremos pelo botão de RUN do eclipse que é esse verde do meio na imagem abaixo.



    Tudo que é iniciado pelo eclipse (seja servidor, programa java standalone ou programa android) fica no histórico. E ao clicar na setinha para baixo ao lado do botao de RUN, temos o histórico e a opção Run Configurations que é onde iremos clicar.


    Quando abrimos essa tela de configuração de execução, será mostrado as configurações do ultimo RUN executado (que no meu caso é do servidor).



    Repare que na tela à esquerda, abaixo de Generic Server temos a configuração do JBoss v4.2 at localhost que é o que quero alterar.
    Ao abrir na tela direita as configurações de startup do servidor, clica na aba Arguments para colocar nossa opção -b 0.0.0.0 como Program Argument de execução do servidor. Agora basta clicar em Apply e Run. Pronto! Seu servidor estará acessível de outras máquinas.

    OBS.: Execute o mesmo procedimento para DEBUG
  2. Iniciar JBoss por linha de comando

    Quando o startup do JBoss é feito apenas por linha de comando (que é o caso de servidores sem interface gráfica - até porque ninguém abre o eclipse dentro de um servidor pra iniciar o JBoss), temos que passar esse argumento na linha de comando. Isso pode ser feito de dois jeitos.
    1. bash run.sh --host 0.0.0.0

      Para subir o jboss é necessário entrar no diretório de instalação do JBoss, acessar a pasta bin e executar o arquivo run.sh. Se voce estiver em um windows, deve executar run.bat. Agora basta passar como argumento --host 0.0.0.0 e pronto! Todo mundo por acessar seu JBoss.
    2. bash run.sh -Djboss.bind.address=0.0.0.0

      É o mesmo que a opção 1 mas dito de outro jeito. Ambas funcionam

JBoss 7.X e 8.0.1 (Wildfly)

Para o JBoss 7 e 8, cujo versões mais famosas é a 7.1.1 e 8.1.0, muda um pouco a forma de fazer essa configuração. Isso porque o servidor foi reestruturado com a idéia de domínios (assim como o glassfish já fazia). 
Agora temos a opção de subirmos domínios do JBoss ou também subir standalone (que é a forma como as versões antigas faziam).

Para essa versão do JBoss, vamos realizar o acesso pelo JBoss standalone. Para isso vamos acessar o arquivo standalone.xml que fica em $JBOSS_HOME/standalone/configuration.standalone.xml e busca pela palavra inet . Basta colocar o "famoso" 0.0.0.0 nesse endereços.



A imagem acima mostra que coloquei em todos. No entanto só é necessário e recomendado, colocar o 0.0.0.0 na interface com nome public. Não é necessário colocar em todos como foi feito na imagem acima.

Lembre-se... Se voce estiver em ambiente corporativo, pode ser necessário criar regra em firewall para liberar acesso.
Qualquer dúvida que voce tiver, posta aí que vou dar um jeito.

Abraço!!!