Escolar Documentos
Profissional Documentos
Cultura Documentos
Brute force
Investigação social
Senhas remotas
Capítulo 2 - Trojans
Solução
Antivírus
Ferramentas de integridade
Auditoria de processos
Capítulo 3 - Scanner
Scanners de portas
Scanners de SO
Scanners de falhas
Solução para scanners
Unicode
SQL Injection
Este livro possui uma abordagem direta aos principais assuntos da atualidade
no que diz respeito à segurança de sistemas.
Neste capítulo, serão mostradas as técnicas usadas ainda hoje para tentar
descobrir senhas consideradas fracas.
0 componente que escolhi não é muito aconselhável para uma aplicação real,
pois ele não tem criptografia forte, como as de hoje. 0 ideal, para o exemplo,
seria algum componente que siga o padrão PGP, mas o que escolhi deve-se
simplesmente pela portabilidade, pois ele já foi instalado em todos os Delphi que
já usei e até mesmo no Kylix. Assim, ninguém terá dificuldades em instalá-lo.
Basta clicar em Component> Instalicomponent, selecionar o arquivo com a
terminação.pas e mandar instalar. 0 código foi criado por Tom Lee. Ele é
gratuito, opera source, e pode ser facilmente encontrado na Internet.
Figura 1.1.
Vale adiantar que, sempre que você manda criptografar, é mesclado um valor
randômico, portanto, se você testar, dificilmente terá o mesmo resultado.
Brute force
Essa é a forma a partir da qual podemos ter certeza de que a senha será
descoberta. Ela pode ser a mais demorada, porém se a senha tiver poucos
caracteres, trabalha muito bem. Consiste em tentar todas as combinações
possíveis (1, 2, 3... 1a, 1b, 1c...), até que seja encontrada a senha correta.
Eu criei uma Unit em Delphi que faz a maior parte do trabalho. Ela contém
uma função que retorna qual será a próxima senha a ser tentada. Ela pede como
parâmetros a senha atual e os caracteres que estão sendo usados:
Brute.pas
Assim, nós temos uma função que retorna a próxima senha e sabemos qual o
algoritmo usado (no caso, o do componente). Então, agora, o que nos resta é unir
as duas coisas em um programa. Nosso programa será assim:
Figura 1.2.
A cada um segundo, ele também mostra o status e quantas senhas estão sendo
tentadas por segundo, a posição atual e o total de senhas tentadas desde o início
da execução. Veja o código:
Unitl.pas
Agora é só rodar. Eu o especifiquei para tentar apenas caracteres numéricos.
Em pouco tempo ele mostrou qual senha foi usada para encriptar o texto.
Figura 1.3.
Esse programa para Linux foi feito por hackers e mescla Dicionary attack e
Brute force. Utiliza também uma lógica de senhas muito interessante, além de
ser muito rápido.
Investigação social
Vamos supor, por exemplo, que uma pessoa dentro da empresa use nosso
programa de criptografia para guardar informações confidenciais e tenha
diversos documentos com a mesma senha. Vamos supor, também, que, por
algum momento, por exemplo, a noite, alguém conseguiu obter o acesso ao HD
da pessoa. Esse é um caso em que uma varredura seria muito útil para um
invasor. Ele pode obter uma lista de palavras mediante informações espalhadas
em seu disco rígido, e, se a pessoa tem o costume de usar como senha coisas
comuns a sua vida, possivelmente o invasor será bem sucedido. Ele também irá
varrer e-mails não apagados e históricos da Internet.
Vamos criar um programa que faça essa varredura. Ele deve ser mais ou
menos assim:
Figura 1.5.
Unit1.pas
Em computadores domésticos, esse programa poderia gerar detalhes
assustadores de acordo com as pessoas que o utilizam, graças a programas como
ICQ, mIRC e outros, relativos a bate papo, que preservam as conversações em
arquivos de log.
Senhas remotas
Senhas remotas são mais difíceis de descobrir, pois o tempo entre tentar uma
senha e outra é maior do que processar localmente. Isso se deve a três fatores
básicos:
Brutus
Figura 1.6.
Quem sabe, então, uma conexão ADSL boa não ajudaria? Servidores bem
configurados permitem apenas N conexões por IP, o que acaba limitando essa
técnica.
Então, como podemos ver, seria melhor descartar essa possibilidade também.
A única alternativa que parece viável, então, seria diversas máquinas com uma
boa conexão, trabalhando em conjunto, tentando descobrir tal senha, o que torna
a tarefa inviável para uma pessoa sozinha. A não ser que alguém crie um worm
com esse objetivo. Mesmo assim, os servidores têm um limite máximo de
conexões. Então, aconteceria um DoS (Ataque de recusa de Serviço).
Preferi não entrar em detalhes na questão "senhas remotas", pois não vi muita
utilidade no assunto, tendo em vista que as técnicas empregadas, hoje, são muito
fracas perto das proteções oferecidas.
A melhor solução é forçar os usuários a ter senhas fortes, com uma boa
quantidade de caracteres e com letras e números.
Figura 1.7.
Nota: programas como John the Ripper podem ajudar a descobrir quais
usuários possuem senhas fracas, sendo, então, não só útil para o hacker,
como, também, para o administrador. Assim o administrador pode solicitar
ao usuário alterar sua senha para uma outra mais forte.
Não podemos falar de trojans sem, antes, falar um pouco de sockets. 0
conceito é simples: um socket pode ficar no estado Listen (Ouvindo),
aguardando que alguém se conecte e envie dados, para que ele devolva uma
resposta. Ele também pode ser do tipo Connect (Conectar), que envia dados e
recebe uma resposta.
Figura 2.1.
Trojan cliente
0 nosso trojan divide-se em duas partes. 0 cliente é a parte mais fácil. Ele deve
se parecer com a figura seguinte:
Figura 2.2.
Na primeira aba, temos as funções de manipulação de arquivo, enviadas para
o servidor. Note que existem dois parâmetros. O primeiro parâmetro é
obrigatório em todas as ações.
0 cliente exibirá um log de tudo que ele está enviando para melhor
compreensão do que está acontecendo.
Main.pas
Basicamente, só enviamos texto para o servidor, de acordo com o botão
clicado. Ou seja, clicamos no botão que envia a mensagem, em que o primeiro
parâmetro envia um /msg para indicar a que ação é apresentada uma mensagem,
depois colocamos um &, apenas para separar o conteúdo do campo Edit1. 0
segundo parâmetro é apenas uma descrição a ser colocada no log.
Trojan servidor
Main.pas
Aprocedure Entrada é a que coordena todas as requisições enviadas pelo
cliente.
Nota: esse método não protege o.exe, como muitos pensam. É muito fácil
achar unpackers (desenpacotadores) pelos sites de busca mais conhecidos.
Figura 2.6.
Criei uma aplicação que, além de juntar os arquivos, fornece o ponto em que
começa o programa de disfarce:
Figura 2.7.
1.Se ele estiver sendo executado na pasta system32, abrirá a porta do trojan.
2.Caso esteja em qualquer outra pasta (como c:\down/oad, por exemplo), ele fará
uma cópia dele mesmo para a pasta system32 com o nome de Temp.exe.
Esse arquivo será manipulado.
3.É feita uma cópia do arquivo com o nome de sysexec.exe e executado. (note
que esse novo arquivo está na pasta system, assim ele abrirá a porta). Por
fim, o arquivo Temp é lido com a função seek. Ele vai até a posição do
arquivo declarada na constante nTrojanSize (no caso 176128) e copia tudo, a
partir daí, para outro arquivo, chamado file.exe (que no caso é o putty.exe).
Só então, é executado.
4.Esse arquivo copiado para fora e executado é justamente o arquivo que
concatenamos. Nosso trojan servidor estava programado para fazer essa
ação no procedimento de saída. Por fim, esse procedimento sai, aguarda dez
segundos e vai tentando apagar o arquivo file.exe. Só irá apagar com
sucesso após o programa ser fechado.
Do mesmo jeito que existem cada vez mais proteções, os ataques estão cada
vez mais avançados, e até mesmo os trojans estão ficando mais complexos.
Watch
Em nosso exemplo, foi criado o login "invasor", que tem permissão de root e
não precisa de senha para se conectar.
Para se ter um exemplo, vou esconder a porta 6000, que, como visto na
listagem anterior, está aberta:
Se tais comandos forem adicionados ao arquivo /root/.bashrc, o arquivo de
inicialização do usuário, quando o bash é executado e o administrador usa esses
comandos, ele poderia passar despercebido por qualquer trojan que esteja em
funcionamento. 0 mesmo pode ser feito com o comando ps, que lista os
processos.
Mas isso, talvez, não resolva, pois o invasor pode ter adicionado uma regra
em um firewall.
Antivírus
Chkrootkit
Existem rootkits muito bem elaborados, que alteram até mesmo as iibs de
rede, dificultando a detecção.
AIDE
Tripwire
Para:
Altere-as para:
Esse foi fácil, o firewaii Iptables está instalado no patch, basta mudar o
caminho:
Executando novamente:
AIDE X Tripwire
Vamos fazer uma breve comparação entre as duas ferramentas aqui mostradas:
0 AIDE percebeu que nosso arquivo /etc/passwd foi alterado.
De forma simples, ele aponta tudo que foi alterado em nosso arquivo. A
varredura demorou exatos nove minutos. Vejamos como o Tripwire se comporta:
0 Tripwire, de forma limpa, apontou que nosso arquivo /etc/passwd foi
alterado. As verificações demoraram exatos 18 minutos.
Auditoria de processos
Como podemos ver, as coisas não são tão simples como a maioria dos
administradores pensam.
Scanners de portas
Ou no modo texto:
scanners de SO
Não existem muitos scanners dessa categoria, mas os que existem suprem as
necessidades dos invasores. Esses scanners verificam as respostas que o
servidores dão às conexões e identificam o Sistema Operacional no qual estão
rodando.
QueSO
Observe:
Figura 3.2.
A primeira coisa que o Cheops-ng vai lhe pedir é o endereço de uma máquina
que tenha o agente instalado, em nosso caso, 127.0.0.1. Pronto, é só rodar:
Figura 3.3.
killall cheops-agent
Scanners de falhas
Nikto
0 Nikto é um scanner simples, feito em Perl, que procura por falhas em um
servidor. Por ter poucos recursos, ele é bem rápido, executando bem sua função:
Nessus
A segunda grande vantagem é o fato dele ser baseado em p/ug-ins, caso uma
nova falha apareça, alguém, ou você mesmo, pode criar p/ugins que a indique e
postar no site do Nessus: http://www.nessus.org.
Ele permite conexão via SSL e gera uma chave privada RSA de 1.024 bit:
Figura 3.6.
Esse relatório pode ser salvo em Ascii, HTM, HTML com gráficos, XML,
Latex e outros.
Snort
0 Snort, um sistema IDS, pode ser útil. Ele detecta varreduras e tentativas de
invasão de vários tipos:
PortSentry
Honeypots
Figura 3.7.
Single honey-pot
0 programa Single honey-pot é um dos mais simples de instalar. Ele vem com
um script de instalação:
Com ele instalado, faça uma cópia dos arquivos /etc/services e /etc/inetd.conf:
0 baixo.php é o rodapé:
Como já podemos perceber, index.php é a pagina inicial:
Veja o resultado:
Figura 4.2.
Como podemos ver, eu consegui obter uma listagem dos usuários da máquina,
mas o problema é mais grave do que aparenta.
SQL Injection
Figura 4.4.
0 nosso objetivo, aqui, é tentar entrar sem saber usuário ou senha. No campo
de usuário, vamos colocar o seguinte texto 'or 1=1#:
Figura 4.5.
Entramos! Agora, como isso pode ter acontecido? Para entendermos melhor o
que ocorreu, vamos alterar a variável $bDebug no arquivo restrito.php colocando
como True. Isso irá retornar as consultas executadas nesse script:
Figura 4.7.
Como podemos notar, a consulta final foi alterada, pegando o primeiro login
cadastrado. Nessa consulta, o script tenta localizar o usuário ", ou qualquer outra
coisa. 0 caractere # ignorou tudo em seguida:
Tabela 4.1.
Nota: vale lembrar que bancos de dados de grande porte, como o SQL
Server, Oracle, e outros contém storedprocedures perigosas. Tais procedures
devem ser eliminadas ou setadas em regras de permissões, evitando que
CGIs/Scripts tenha acesso a elas. No SQL Server, por exemplo, é possível
executar comandos com extended procedure: master..xp cmdshell.
Todos os scripts e CGIs podem conter falhas de acordo com sua programação,
independente da linguagem usada.
Auditoria de Iog
Nunca deixe de analisar os logs do servidor. Ele pode dar pistas de possíveis
tentativas de invasão por Unicode. Normalmente, os invasores usam como teste
de invasão o arquivo /etc/passwd. Use o comando cat e alguns filtros para
visualizar seu log:
Analog
Então, ele deve mostrar uma página que permite escolher os relatórios que
podem ser visualizados. Selecione uma e clique no botão Produce statistics:
Figura 4.8.
Veja:
Figura 4.9.