sábado, 27 de marzo de 2010

Espacio libre

En un entorno con varios servidores en red, una de las cosas más importantes y que más suele pasar desapercibida es el espacio libre de sus discos duros.

Si una partición de un disco duro de un servidor comienza a quedarse sin espacio libre, las consecuencias suelen ser:
  • Caída del rendimiento del servidor que contenga la partición.
  • Caída del rendimiento de los servicios que utilicen tal servidor.
  • Con el tiempo, la interrupción de los servicios que utilicen tal servidor.
  • Si el servicio interrumpido se dedica a tareas de seguridad, mal vamos.
Para evitar esto de forma proactiva es conveniente conocer, por lo menos una vez a la semana, el espacio libre de cada partición de cada disco duro de cada servidor de la red, y si este espacio libre es menor que 1GB (por ejemplo), se avisaría al administrador del sistema para que remedie esta situación.

Automatizar lo anterior en un Directorio Activo con muchos servidores es posible utilizando Powershell y las Tareas Programadas en algún servidor.

Para ello, he escrito el script freespace.ps1 que busca en el Directorio Activo los nombres de todos sus servidores. Después, el script realiza las consultas adecuadas a los servidores dados, filtra resultados y si es necesario envía un email con la información pertinente al administrador del sistema para que pase a la acción.

freespace.ps1 debe estar ubicado en una carpeta de trabajo, por ejemplo, en c:\freespace

Ubicado freespace.ps1 en su sitio, es necesario editarlo y personalizar los valores de las siguientes variables que se encuentran al principio:

$limite = 1000000000 # con menos de un giga libre en una partición, se informa
$emailFrom = "pon_email_de@origen.es" # origen email

$emailTo = "pon_email_de@destino.es" # destino email

$smtpServer = "tu_servidor_smtp.tu_dominio.es" # servidor smtp de destino

$subject = "Particiones con menos de 1GB libre" # asunto


Una vez personalizadas las variables, guardamos los cambios del script y en la carpeta de trabajo creamos el archivo freespace.bat que debe contener la siguiente línea:

powershell c:\freespace\freespace.ps1

Por último, creamos una tarea programada que ejecute c:\freespace\freespace.bat una vez por semana. Los permisos de la tarea deben ser de un usuario que tenga acceso a todas las particiones de todos los servidores.

Un email enviado en un caso real es el siguiente:

sábado, 6 de marzo de 2010

Descubriendo troyanos 3/3

Ahora toca registrar las conexiones realizadas en Windows desde Windows.

Para ello, iniciamos Windows desde la máquina virtual e instalamos Wireshark. Abrimos Wireshark, elegimos el adaptador de red y comenzamos una captura de paquetes apuntando exactamente la hora y el minuto de inicio de la captura.

Ahora es el momento de abrir IE6 en Windows, navegar por páginas de dudosa reputación y aceptar todo lo que se ponga por delante. Cuanto más tiempo tenga la captura, más posibilidades tendremos de atrapar a algún troyano.

Cuando detengamos la captura de paquetes con Wireshark, exportamos los paquetes capturados mediante el menú File, Export, File..., y guardamos el archivo como export_w32.txt con formato de texto plano (plain text) en el directorio de trabajo.

El siguiente paso es extraer las IPs de las conexiones que se han realizado desde Windows hacia Internet, eliminar redundancias y mostrar más información de la IP (como ya hicimos con Ubuntu con el script conex_report.pl). Para ello, en el directorio de trabajo, ejecutaremos el script conex_report_w32.pl de la siguiente forma:

perl conex_report_w32.pl > windows.txt

Lo anterior genera el fichero windows.txt cuyo contenido será parecido a esto:



Ya tenemos todos los datos que necesitamos. Ahora tenemos que comparar los resultados de windows.txt y de ubuntu.txt para detectar sus diferencias. Para ello, copiamos el contenido de windows.txt, creamos otro windows.txt en el directorio de trabajo de Ubuntu y pegamos en él el contenido del primero.

La comparación de ambos ficheros la realizaremos con el script compara_conex_report.pl que ejecutaremos en el directorio de trabajo de Ubuntu donde también deben figurar los archivos ubuntu.txt y windows.txt

Conclusión y aclaraciones:

Como el procedimiento explicado en el segundo y tercer post depende de ciertos scripts para permitir la automatización de tal, la presentación en PDF del primer post muestra el concepto general, mientras que el procedimiento detallado paso a paso es el siguiente:
  1. En un ordenador conectado a Internet mediante un router con IP 192.168.1.1 instalamos Ubuntu 9.10 (Karmic Koala).
  2. Ubuntu debe tener la interface de red eth0 con la IP 192.168.1.33, máscara 255.255.255.0 y un par de DNS válidas.
  3. En Ubuntu, instalamos el módulo de Perl Net::Whois::IP con CPAN.
  4. En Ubuntu, instalamos VirtualBox.
  5. Creamos una máquina virtual en VirtualBox para Windows XP, configuramos el adaptador de red en modo bridged. Iniciamos la máquina virtual e instalamos en ella Windows XP.
  6. En Windows XP configuramos la IP fija 192.168.2.35, máscara 255.255.255.0 y las mismas DNS que tiene Ubuntu.
  7. En Windows XP instalamos Strawberry Perl y Wireshark (implica la instalación de Winpcap).
  8. En Windows XP, instalamos el módulo de Perl Net::Whois::IP con CPAN.
  9. Ya tenemos todo montado.
  10. En Ubuntu, creamos NAT para la red 192.168.2.0 permitiendo su tráfico de E/S e iniciamos el logeo para el tráfico de dicha red. Para ello, en Ubuntu podemos crear un directorio de trabajo, bajamos a él este script en bash: captura.sh y lo ejecutamos en un terminal.
  11. En Windows XP, iniciamos Wireshark y empezamos a capturar paquetes apuntando la fecha, la hora y el minuto de comienzo de la captura de paquetes.
  12. Iniciamos IE6 en Windows XP y navegamos por webs maliciosas abriendo todo lo que se ponga por delante.
  13. Después de un tiempo prudencial (cuanto más mejor), detenemos la captura de Wireshark, exportamos los resultados a un archivo de texto plano llamado export_w32.txt y lo guardamos en un directorio de trabajo junto con el script conex_report_w32.pl
  14. Iniciamos una shell en Windows (Inicio, Ejecutar, cmd), vamos al directorio de trabajo y ejecutamos: perl conex_report_w32.pl > windows.txt
  15. Abrimos windows.txt, seleccionamos su contenido, lo copiamos y lo pegamos en otro windows.txt nuevo, pero en el directorio de trabajo de Ubuntu.
  16. En el directorio de trabajo de Ubuntu, bajamos los scripts conex_report.pl y compara_conex_report.pl
  17. En el directorio de trabajo de Ubuntu, ejecutamos en un terminal: perl conex_report.pl, le proporcionamos el mes, el día, la hora, el minuto y el segundo de inicio que tenemos apuntados de la captura con Wireshark y después el mes, el día, la hora, el minuto y el segundo de fin de captura. El tiempo de inicio debe ser lo más exacto posible, mientras que el tiempo final mejor que vaya sobrado.
  18. El resultado del script anterior es el fichero ubuntu.txt que contiene las IPs de conexión únicas con la información de whois en el intervalo de tiempo dado.
  19. Por último, en un terminal de Ubuntu y en el directorio de trabajo, ejecutamos: perl compara_conex_report.pl. Las IPs resultantes con su correspondiente información son las de las conexiones que inició Windows, que han sido capturadas por Ubuntu y no han sido capturadas por Wireshark desde Windows, esto es: conexiones realizadas por rootkits troyanizados. En caso de que el resultado no indique ninguna IP, quiere decir que todas las IPs de windows.txt y ubuntu.txt coinciden y todo es correcto: no hay rootkits en Windows.