Utilizando RPM para detecção de intrusos
Este artigo escrito por Osvaldo J. Filho elucida algumas maneiras de verificação de integridade dos arquivos mais importantes do sistema afim de detectar se alguma invasão foi realizada ou não, ou se após uma invasão estes arquivos foram modificados.
Introdução
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):
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.
# 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.
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:
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)
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:
util-linux fileutils net-tools lsof
E então iremos verificar os pacotes com o seguinte shellscript:
echo "Por favor, entre com o disquete"
mount /dev/fd0 /mnt/floppy
echo "Verificação de pacotes"
for Pacote in `cat /mnt/floppy/Lista-Arquivos`
do
echo Verificando $Pacote
rpm --verify -l $Pacote
done
echo "Teste finalizado."
mount /dev/fd0 /mnt/floppy
echo "Verificação de pacotes"
for Pacote in `cat /mnt/floppy/Lista-Arquivos`
do
echo Verificando $Pacote
rpm --verify -l $Pacote
done
echo "Teste finalizado."
Espero que este artigo seja de ajuda para os profissionais e qualquer sugestão para novos artigos como estes, ou correções/opiniões, mande me um email!