|
Introducción
A lo largo del tiempo, me he encontrado
con todo tipos de sistemas operativos en servidores mexicanos, Linux,
SunOS, Windows, MacOS, HP-UX, SCO Unixware/Openserver, FreeBSD, OpenBSD,
NetBSD, IRIX, y hasta OpenVMS, siendo Linux Redhat el mas usado aparte
de Windows.
En este articulo tratare de ayudarles un poco a asegurar
su Linux Redhat 6.2. No estoy tratando de enseñarles como hacer
su sistema seguro, libre de intrusos y gente que pueda entrar sin permisos,
solo trato de dar una poca ayuda para que por lo menos este un poco seguro.
ningún sistema es completamente seguro..., creo que hay que reconocer
eso.
Podrías poner firewalls y hacer shells falsas, cerrar todo tipo
de acceso etc, pero yo creo que Redhat no es un sistema para alguien que
quiere realmente poner seguridad en su maquina, en este caso puedes instalarte
NetBSD, u OpenBSD.
Lista de bugs Remotos Conocidos
Hay muchos bugs remotos conocidos
en Linux Redhat 6.2, como el famoso wu-ftpd 2.6.0(1) bug, o el bug en
el Named 8.2.2. Estos bugs pueden hacer que el atacante se apodere de
tu computadora de una manera rápida y sencilla. En esta parte diré
que corre o hace cada bug y un link al nuevo package (i386) para Linux
Redhat 6.2.
1. Wu-FTPD 2.6.0(1):
Efecto: Ejecuta una shell con privilegios de root. o puede ejecutar una
shell con privilegios del user por el que se acceso, según el bug
usado.
Parche: ftp://updates.redhat.com/6.2/en/os/i386/wu-ftpd-2.6.0-14.6x.i386.rpm
2. imapd IMAP4rev1 v12.264:
Efecto: Ejecuta una shell con privilegios del user con el que se acceso
al servicio.
Parche: ftp://updates.redhat.com/6.2/en/os/i386/imap-2000-2.6.i386.rpm
3. Named 8.2.2:
Efecto: Ejecuta una shell con privilegios de root.
Parche: ftp://updates.redhat.com/6.2/en/os/i386/bind-8.2.3-0.6.x.i386.rpm
4. innd 2.2.2:
Efecto: Crea una suid shell en cualquier lugar del sistema.
Parche: ftp://ftp.rpmfind.net/linux/redhat/7.1/en/os/i386/RedHat/RPMS//inn-2.3.1-2.i386.rpm
5. gdb 2.0beta2-23:
Efecto: Ejecuta una shell con privilegios de root.
Parche: ftp://updates.redhat.com/6.2/en/os/i386/gdm-2.0beta2-26.i386.rpm
6. rpc.statd:
Efecto: Ejecuta una shell con privilegios de root.
Parche: ftp://updates.redhat.com/6.2/en/os/i386/nfs-utils-0.3.1-0.6.x.1.i386.rpm
7. piranha:
Efecto: tiene un bug en el user y password default del piranha.
Parche: ftp://updates.redhat.com/6.2/en/os/i386/piranha-0.4.14-1.i386.rpm
Bugs locales conocidos:
Hay muchos bugs locales conocidos en Redhat
6.2, son demasiados como para listarlos en el orden de los remotos, todos
los parches los puedes encontrar en ftp://updates.redhat.com/6.2/en/os/i386/
Es muy altamente recomendado que parches estos bugs locales, ya que si
en tu servidor das shells a los users pueden conseguir root en un dos
por tres.
Servicios en el Inetd
Los servicios son programas de ejecución remota
a través de un cliente/servidor, como lo son en este caso talk,
telnet, ftp, rlogin, gopher, tftp, etc..., Redhat 6.2 instala muchos de
estos servicios por default en la instalación. Ahora cerraremos
los servicios que en realidad
no te sirvan.
Edita el archivo /etc/inetd.conf (como root) con el
editor que quieras, pico, vi, emacs, o el que sea, veras las primeras
líneas como esto:
#
# inetd.conf This file describes the services that will be available
# through the INETD TCP/IP super server. To re-configure
# the running INETD process, edit this file, then send the
# INETD process a SIGHUP signal.
#
# Version: @(#)/etc/inetd.conf 3.10 05/27/93
#
# Authors: Original taken from BSD UNIX 4.3/TAHOE.
# Fred N. van Kempen, <waltje@uwalt.nl.mugnet.org>
#
# Modified for Debian Linux by Ian A. Murdock <imurdock@shell.portal.com>
#
# Modified for RHS Linux by Marc Ewing <marc@redhat.com>
#
# <service_name> <sock_type> <proto> <flags> <user>
<server_path> <args>
#
# Echo, discard, daytime, and chargen are used primarily for testing.
#
# To re-read this file after changes, just do a 'killall -HUP inetd'
Bla bla bla bla, el punto esta mas abajo, veras líneas como estas:
#echo stream tcp nowait
root internal
#echo dgram udp wait root internal
#discard stream tcp nowait root internal
#discard dgram udp wait root internal
#daytime stream tcp nowait root internal
#daytime dgram udp wait root internal
#chargen stream tcp nowait root internal
#chargen dgram udp wait root internal
#time stream tcp nowait root internal
#time dgram udp wait root internal
Ok, hasta aquí todo bien, estos
servicios están cerrados porque tienen un "#" al principio
de la línea, que los señala como comentarios.
Ahora vemos algo como esto:
ftp stream tcp nowait
root /usr/sbin/tcpd in.ftpd -l -a
telnet stream tcp nowait root /usr/sbin/tcpd in.telnetd
#
# Shell, login, exec, comsat and talk are BSD protocols.
#
shell stream tcp nowait root /usr/sbin/tcpd in.rshd
login stream tcp nowait root /usr/sbin/tcpd in.rlogind
#exec stream tcp nowait root /usr/sbin/tcpd in.rexecd
#comsat dgram udp wait root /usr/sbin/tcpd in.comsat
talk dgram udp wait nobody.tty /usr/sbin/tcpd in.talkd
Ok, que vemos aquí?, el servicio
rsh, ftp y rlogin están abiertos, y aquí, si tienes telnet
abierto, de que te sirve telnet el rlogin abierto?, ponle un signo de
"#" al principio de la línea y continuemos...
talk dgram udp wait
nobody.tty /usr/sbin/tcpd in.talkd
ntalk dgram udp wait nobody.tty /usr/sbin/tcpd in.ntalkd
#dtalk stream tcp wait nobody.tty /usr/sbin/tcpd in.dtalkd
#
# Pop and imap mail services et al
#
pop-2 stream tcp nowait root /usr/sbin/tcpd ipop2d
pop-3 stream tcp nowait root /usr/sbin/tcpd ipop3d
imap stream tcp nowait root /usr/sbin/tcpd imap
Todos estos son servicios que solo
dejaras abiertos si los necesitas, por ejemplo, tu tienes un servidor
de webhosting de usuarios Ok, el pop3d y el imapd están abiertos,
de seguro los necesitas.., pero sino ya sabes que hacer... asi te iras
hasta acabar con el archivo y ver que servicios te sirven y cuales no,
poniéndoles el "#".
Ahora, después de haber editado el /etc/inetd.conf,
darás el comando "killall -HUP inetd", y esto para resetearlo....Ahora,
solo es cuestión de hacerte un portscan para ver si todo quedo
en orden.
Otros Daemons
Si usas tu maquina para accesar remotamente a ella,
te recomiendo que cierres el rlogind y el telnet, ya que pasan toda la
información sin encriptar, y usa ssh, ssh es un servicio de acceso
remoto encriptadamente. A continuación el link de donde te puedes
bajar este programa:
SSH:
ftp://ftp.ssh.com/pub/ssh/ssh-2.4.0.tar.gz
Realmente a mi no me gusta el Wu-FTPD, ya que esta lleno
de bugs, por mas que no sean públicos, pero a todas las versiones
se les encuentran bugs muy serios. por eso te recomiendo que te bajes
el ProFTPD o el NcFTPD. A continuación los links de estos:
ProFTPD:
ftp://ftp.proftpd.org/distrib/proftpd-1.2.2rc2.tar.gz
<-- Source.
ftp://ftp.proftpd.org/distrib/packages/RPMS/i686/proftpd-1.2.2rc2-1.i686.rpm
<-- RPM.
NcFTPD:
ftp://ftp.ncftp.com/ncftpd/2.6.3/ncftpd-2.6.3-linux-x86-export.tar.gz
<-- Source.
También puedes bajarte el GNU pop3d en lugar de el clásico
pop3 del Redhat.
Otros Detalles
Ok, aquí daré pequeños detalles de
configuración e instalación.
Sendmail: hay dos comandos de verificación de usuarios ("VRFY",
"EXPN"), y exponer que usuarios existen en tu maquina puede
ser muy peligroso, ya que pueden hacer bruteforce del password del usuario
y penetrar tu sistema. el truco luce como esto:
sh-2.04# telnet 127.0.0.1 25
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
220 Servidor.Panchito.com ESMTP Sendmail 8.11.0/8.11.0; Sat, 5 May 2001
vrfy enano_bodoke <-- vrfy + user.
550 5.1.1 enano_bodoke... User unknown <-- No existió esta vez.
vrfy carlitos
250 2.1.5 Carlitos <carlitos@Servidor.Panchito.com> <-- El user
Carlitos existe.
No crees que esta mal?, ahora se que
el usuario "Carlitos" existe, podría usar ingeniería
social con el, o el típico método de atinarle al password.
Añade esta línea al /etc/sendmail.cf (en cualquier parte)
para bloquear estos dos comandos:
Opnoexpn,novrfy Resetea el Sendmail, ya sea /etc/rc.d/init.d/sendmail
restart o kill -HUP sendmail. Listo, ahora luce como esto:
sh-2.04# telnet 127.0.0.1
25
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
220 Servidor.Panchito.com ESMTP Sendmail 8.11.0/8.11.0; Sat, 5 May 2001
04:48:20 -0500
vrfy carlitos
252 2.5.2 Cannot VRFY user; try RCPT to attempt delivery (or try finger)
Ok, ahora si, ya no dice si existe o no, bien :).
Ahora, para que queremos hacer esto..., si tenemos el
finger abierto?, también recomiendo cerrar el finger, por la misma
razón de que da mucha información acerca de los usuarios
en el sistema.
SPFX:
Existe un modulo que yo uso mucho que cambia algunas cosas
en el sistema, para que algunos exploits locales no funcionen, sirve para
el kernel 2.2, perfecto para un Redhat que corre 2.2.14. Este modulo es
llamado
Este modulo lo puedes encontrar en:
http://packetstorm.securify.com/linux/security/spfx.c <-- lee el código
para instrucciones.
SHELLS:
Otro error muy conocido en los administradores
es darle shell a cualquier usuario que exista en el sistema. Supongamos
que yo cree un usuario que se llama "soporte" para que me contacten
los clientes que necesiten soporte, claro todo bien, me contactan perfectamente,
pero que pasa si una persona por algún método consigue el
password de soporte?, podría entrar por un acceso remoto(SSH en
este caso) y conseguir tomar el control de todo el sistema.
Si yo me hubiera tomado la molestia de editar el /etc/passwd
y cambiarle la shell ("/bin/bash" por default en Redhat 6.2),
por /dev/null, nada de esto hubiera pasado, al menos que hubiera explotado
el Imapd o el Pop3d por algún bug conocido (ya hablamos de eso
en el primer tema).
Así esta la línea de soporte:
soporte:x:69:69:Usuario
de Soporte:/home/soporte:/bin/bash
Ok, aquí vemos que el usuario soporte
tiene shell (/bin/bash) si no la necesita, cámbiasela por /dev/null.
Puedes usar la shell /bin/false si el usuario usa también el FTP,
si solo usa el POP3 y el Imapd, usa /dev/null o quítasela simplemente...
También a los usuarios defaults del sistema, quítales la
shell que no necesiten, como el tipico postgresql en Redhat 6.2, quítale
la shell, déjale en blanco hasta los dos puntos.
TCP WRAPPERS:
En los tcp wrappers, se ponen los ips
o hosts de acceso a tus servicios, puedes denegar todos los accesos menos
de .panchito.com por ejemplo.
Muy recomendable también, si piensas
hacer esto entonces te recomiendo que pongas en el /etc/hosts.deny la
siguiente línea:
ALL : ALL
Así deniegas acceso a cualquier
usuario que no este alojado en el /etc/hosts.deny. Ok ahora quieres que
todos los de .panchito.com puedan accesar a pop3 y a ftp?, en este caso
seria esta línea en el /etc/hosts.allow:
ipop3d: .panchito.com:
ALLOW <-- Lo agregamos al acceso pop3.
in.ftpd: .panchito.com: ALLOW <-- Ahora al ftp.
Quieres denegar a todo .prodigy.net.mx
para que no pueda accesar al telnetd y al ftpd?, también puedes
poner esta línea en /etc/hosts.allow:
in.ftpd: .prodigy.net.mx:
DENY
in.telnetd: .prodigy.net.mx: DENY
Existe también in.fingerd(finger),
in.talkd(talkd), etc.. si usas proftpd en lugar de wu-ftpd en todo caso
seria in.proftpd, no in.ftpd. todos los puedes encontrar en el directorio
/usr/sbin. Hay una buena guía sobre wrappers en la pagina de Ezkracho
Team.
A continuación el link de esta guía:
http://www.ezkracho.com.ar/pub/seguridad/tcp_wrapper_logs.zip
<-- Guía de generación de LOGS con el tcp-wrapper.
Despedida
Bueno, aquí acaba el articulo, espero que te
haya servido de algo, en este articulo no intento hacerte un súper
Linux Redhat Admin, porque esto no es todo lo que necesitas para mantener
tu sistema seguro, podrías poner firewalls, shells falsas, comandos
no existentes, cambiar configuraciones, bajar loggers, etc..., ningún
sistema es seguro, pero puedes asegurarlo lo mas que puedas.
Hay miles de trucos mas, pero estos son los esenciales supongo yo.
Trata de mantenerte al día de los nuevos bugs, un lugar donde
se publican es el sitio http://www.securityfocus.com.
Si esta un poco revoltoso, perdóname, es mi primer articulo :)
Nos vemos.
|