Autor: Osvaldo J. Filho (KByte -
kbyte@linuxsecurity.com.br)
Neste método não descreverei maneiras já bastante conhecidas, como
tripwire por exemplo, que tiram uma 'foto' do sistema e depois
comparam informações (como data, tamanho e um 'hash') dos arquivos para
saber se estes foram comprometidos. Irei propor um método bem mais
simples, tão seguro quanto (se bem feito), mas incrivelmente funcional.
Como a grande maioria das distribuições são baseadas em RPM (RPM
Packet Manager, um nome recursivo, e não RedHat Packet Manager como
muitos pensam) irei dedicar este artigo à estes usuários, pois o
método que detalharei funcionará apenas em sistemas usando este tipo
de pacotes.
Para sistemas
Debian, existe o
debsum, que atua de maneira
similar ao que iremos propor neste artigo. Infelizmente não iremos tratar
dele, quem sabe alguém possa fazer um artigo sobre ele. Continuando...
Todos os arquivos de pacotes RPMs depois de instalados, tem suas
características armazenadas num banco de dados central, e é por isso que
podemos usar o comando RPM para verificar a integridade destes arquivos.
Usaremos, primeiramente, o pacote (imaginário)
LS-kbyte-0.5.rpm
como exemplo. Primeiro instalar-o-emos:
# rpm -ivh LS-kbyte-0.5.rpm
LS-kbyte-0.5.rpm ##############################
Após isso, podemos verificar os arquivos instalados deste pacote com a
diretriz QUERY do RPM, como no exemplo abaixo:
# rpm --query -l LS-kbyte-0.5.rpm
/usr/doc/LinuxSecurity/Artigos/RPM.txt
/usr/doc/LinuxSecurity/Artigos/RPM.html
Com isso temos uma listagem completa de quais arquivo pertencem a este
pacote e agora iremos verificar a integridade deste com a diretriz
VERIFY do rpm com o exemplo:
# rpm --verify -l LS-kbyte-0.5.rpm
S.5....T c /usr/doc/LinuxSecurity/Artigos/RPM.txt
Obtivemos a resposta S.5....T c do arquivo RPM.txt, e como não obtivemos
mais nenhuma resposta, significa que os outros arquivos estão íntegros.
Analisando a resposta do RPM para o arquivo RPM.txt, notamos que este
contém 9 campos de informação, sendo estes (na ordem apresentada):
- S - Tamanho do arquivo
- 5 - MD5 Sum do arquivo (hash criptográfico, uma assinatura única
de cada arquivo)
- L - Symlink
- T - Mtime
- D - Device
- U - User
- G - Group
- M - Mode (permissões e tipo de arquivo)
E se o caractere 'c' aparecer, isso significa que o arquivo é de
configuração, que geralmente é modificado após instalado, portanto
não devemos nos espantar se este arquivo deste tipo foi mudado, a não
ser que você saiba que não mexeu neste arquivo.
Alguns binários mais visados pelos crackers e que devemos prestar mais
atenção são:
login, ls, netstat, lsof, ifconfig entre outros, que
pertencem aos pacotes:
util-linux, fileutils, net-tools, lsof.
Se você quer saber qual pacote RPM um determinado arquivo pertence, terá
que usar a diretriz QUERY para o RPM, como no exemplo:
# rpm --query -f /bin/ps
procps-2.0.6
Claro que você, para ter certeza, terá que ter seu banco de dados do
RPM íntegro, que usualmente está no diretório
/var/lib/rpm/. Uma
boa dica seria copiar esse banco de dados para um disquete e sempre
comparar (lembre-se de sempre que instalar um RPM ou desinstalá-lo, de
refazer o backup dos dados). À seguir alguns passos para fazer o backup
do seu banco de dados RPM em disquete e compará-los com o do sistema.
Fase 1 - Comparando o banco de dados
# mount /dev/fd0 /mnt/floppy
Primeiramente, deve se montar o disquete
# tar cfz /mnt/floppy/RPM-db.tgz /var/lib/rpm
Agora usaremos o TAR e o GZIP para criar um .tgz e colocá-lo no
disquete.
# umount /dev/fd0
Desmontamos o disquete para que os dados sejam gravados.
Neste ponto, recomendo você proteger o disquete de gravação. Iremos
agora para a parte de verificação do banco de dados:
# mount /dev/fd0 /mnt/floppy
Montamos o disquete, que agora é somente leitura.
# cd /tmp/
Vamos para um diretório TEMPorário.
# tar xfvz /mnt/floppy/RPM-db.tgz
Descompactamos o backup do banco de dados, que agora está em /tmp/var/lib/rpm.
# diff /var/lib/rpm /tmp/var/lib/rpm
E finalmente comparamos os diretórios. Se o diff não acusar nada, então
seu banco de dados esta íntegro e podemos ir para a verificação dos
binários do sistema.
FASE 2 - Comparando os binários
Iremos criar um arquivo com os pacotes que iremos verificar e o
colocaremos no (mesmo) disquete. Por enquanto, teremos o arquivo
Lista-Arquivos com o seguinte conteúdo: