Segurança: Rootkits
Por marvinlemos - marvinlemos@gmail.com
A definição de
MALWARE encontrada na wikipedia é de um
"software destinado a infiltrar-se em um sistema de computador alheio de forma ilícita com o intuito de causar algum dano ou roubo de informações(confidenciais ou não)". Podemos citar, como exemplo, os vírus, cavalos-de-tróia, spyware, dentre outros. No mundo unix-like, uma categoria bastante conhecida de malware são os rootkis. Uma classe de softwares cujo objetivo consiste em ocultar processos, arquivos ou dados do sistema do sistema operacional.
Um atacante, após comprometer, com sucesso, um determinado alvo, busca esconder seus vestígios, bem como deixar alguma porta aberta para que ele possa voltar outras vezes. Os rootkits ajudam nesse sentido, uma vez que é possível esconder processos, conexões de redes, arquivos, dentre outros, dos administradores.
Originalmente, os rootkits surgiram como versões recompiladas de programas unix. Por exemplo, um versão do
netstat com um cavalo-de-tróia embutido conseguiria esconder as conexões de redes estabelecidas pelo atacante, enquanto um
ps, igualmente comprometido, poderia ocultar processos ilícitos.
Leia o resto da matéria
AQUI
Alguns Aspectos sobre TCC para cursos relativos à computação
Por weylerlopes - weylerl@hotmail.com
Um dos requisitos básicos para conclusão de curso em praticamente todas as instituições de ensino superior é o trabalho de
Conclusão de Cursos(TCC).
Alunos comumente se deparam com as mesmas dificuldades na implementação de um TCC. Visando atacar essas dificuldades, assim como algumas questões recorrentes, com base na nossa experiência com
orientação, resolvemos abordar nesse documento itens que venham servir
para dar suporte e elucidar algumas dúvidas referentes ao referido assunto.
Leia mais
AQUI
Linux: comando lsof
Por marvinlemos - marvinlemos@gmail.com
O
LSOF
é um comando bastante útil para quem trabalha com
sistemas
UNIX like. Como diz o ditado, "no Unix
tudo é um arquivo", ou seja, quase todas as atividades de um
sistema
unix like possuem uma
relação com arquivos abertos. Por exemplo:
arquivos regulares, arquivos de blocos especiais,
executáveis, sockets e por aí vai. O
lsof
é útil no sentido que permite coletar e
sintetizar de forma centralizada todas essas
informações. Informações
que podem ser úteis, por exemplo, para investigar uma
suspeita de ataque.
O
lsof utiliza um formato tabular para mostrar as
informações filtradas:
- Nome do Processo: COMMAND
- ID do Processo: ID
- Nome da Conta de usuário
sob a qual o processo está rodando: USER
- Descritor do arquivo: FD
- Tipo do Arquivo: TYPE
- Dispositivo: DEVICE
- Tamanho: SIZE
- Conexão: NODE
- Nome Completo: NAME
É possível manipular a saída para
processá-la com outras ferramentas, com o uso do
lsof
-F.
Uma coluna interessante é o Descritor de Arquivo, o qual
representa a forma como o processo vê o arquivo. Alguns
valores desse campo podem ser:
-
cwd: representa o
diretório corrente da aplicação
-
txt:
representa um arquivo binário, geralmente uma biblioteca ou
um arquivo executável
Além disso, pode aparecer um número, o qual
representa o descritor propriamente dito. Mais sobre descritores pode
ser encontrado
aqui.
Outra coluna bastante útil é o tipo do Arquivo,
que pode ser:
-
REG:
arquivo regular
-
DIR:
diretório
-
CHR:
arquivo de dispositivo do tipo caractere
-
BLK:
arquivo de dispositivo do tipo bloco
-
UNIX:
sockets UNIX
-
FIFO:
arquivos de pipes
-
IPv4:
conexões de rede IP
Utilizar o lsof sem parâmetros retornará uma lista
bastante grande e de difícil
interpretação. Por isso é interessante
sempre utilizá-lo com alguma opção de
linha de comando.
Um uso bastante comum do lsof é utilizá-lo para
descobrir qual processo está travando uma mídia
removível. A opção "
-t
/nome_do_diretório" retorna uma lista de ID's de
processos que estão usando aquele diretório. Por
exemplo:
$ umount /dev/cdrom
umount: /cdrom: device is busy
$ kill -9 `lsof -t /dev/cdrom`
$ umount /dev/cdrom
EXEMPLOS DO LSOF
-----------------------------
lsof - Sem parâmetros, mostra um panorama.
lsof /bin/bash - Lista todos os processos que usam o
bash.
lsof -p PID - Lista os arquivos abertos pelo
processo identificado pela ID informada.
lsof +D /tmp - Lista todos os processos abertos em
/tmp e seus subdiretórios sem links simbólicos.
lsof -u USER - Lista todos os arquivos abertos para
o usuário especificado.
lsof -u ^root - Lista todos os arquivos abertos,
exceto aqueles abertos pelo superusuário.
lsof -d txt - Lista todas as entradas com o descrito
txt, ou seja, arquivos executáveis
lsof +L1 - Mostra todos os arquivos apagados que ainda
estão abertos, e, portanto, ainda ocupam espaço
em disco.
lsof -i - Arquivos relacionados à rede.
Como podemos percebr, o lsof é um comando bastante poderoso
e com muitos recursos. Para que quiser conhecer mais, recomendo a
revista
LINUX
MAGAZINE n. 29 e os seguintes sites:
http://www.netadmintools.com/html/lsof.man.html
http://dmiessler.com/study/nix/commands/lsof/
http://www.ibm.com/developerworks/aix/library/au-lsof.html
Shell Script: /dev/null
Por marvinlemos - marvinlemos@gmail.com
Quem trabalha com sistemas operacionais do tipo UNIX, hoje em dia principalmente o Linux, deve ter, ou espera-se que tenha, conhecimento de um arquivo chamando
/dev/null. É um dispositivo especial que descarta qualquer informação redirecionada a ele e não retorna nenhuma informação para processos que a leiam, na verdade ele retorna um "EOF" (
End-of-file). Por esse motivo, na programação UNIX, ele é conhecido como
bit bucket ou "buraco-negro". Eu, carinhosamente, chamo de "Dimensão-X". :P
Qual a função de um dispositivo que descarta tudo que é redirecionado a ele? Muitas vezes precisamos descartar o fluxo de saída de algum processo que, por um motivo ou outro, não nos interessa.
Vamos analisar o exemplo abaixo:
if grep "$1" /etc/passwd > /dev/null; then
echo "usuário cadastrado no sistema!!!"
else
echo "usuário não existe!!!"
fi
Neste exemplo, queremos apenas testar se o conteúdo da variável "$1" (parâmetro passado em linha de comando) existe no arquivo
/etc/passwd. Entretanto, ao executar o shell script, caso o
grep encontrasse alguma coisa, veríamos sua saída na tela, juntamente com a mensagem: "usuário cadastrado no sistema!!!". Desejamos exibir apenas a última mensagem, por isso redirecionamos a saída do comando para a
/dev/null. :P
Shell Script: Código de Retorno
Por marvinlemos - marvinlemos@gmail.com
Quando trabalhamos com shell script, um recurso bastante útil e poderoso consiste em verificar o código de retorno(ou código de
escape) de um comando.
O que seria esse código de retorno? Basicamente um valor que o shell usa para representar o sucesso ou falha de um comando. Esse valor é armazenado dentro da variável
?. Sempre após a execução de um determinado comando, o shell armazena, dentro desta variável, o valor 0 (zero) para indicar sucesso. Qualquer outro número diferente de zero representa uma falha.
Vamos olhar o exemplo abaixo:
$ ls /etc/passwd
/etc/passwd
$ echo $?
0
$ ls /etc/passwd2
ls: /etc/passwd2: No such file or directory
$ echo $?
1
Podemos perceber que o código de retorno para o primeiro comando foi 0, pois o mesmo foi executado com sucesso (o arquivo /etc/passwd existe). Entretanto, o segundo comando obteve uma falha, uma vez que o arquivo /etc/passwd2 não existe nesse sistema hipotético.
Uma observação muito importante é necessária ser feita nesse ponto: Após a execução de vários comandos encadeados através de um pipe ( | ), o código de retorno irá refletir apenas o último comando do pipe. Casos seja necessário descobrir o código de cada um dos comandos, basta visualizar o conteúdo da variável PIPESTATUS. Nada mais do que um array que o shell usa para armazenar todos os códigos de retorno dos comandos que compõe o pipe.
Exemplo:
# cat /etc/passwd | grep ROOT | wc –l
0
# echo ${PIPESTATUS[*]}
0 1 0
Neste caso, o primeiro
0 corresponde ao retorno do comando
cat, o
1 ao retorno do grep e o último
0 ao retorno do wc. Perceba que o grep retornou
1 pois o mesmo não encontrou a expressão "ROOT" dentro do arquivo "/etc/passwd".