jueves, 10 de diciembre de 2009

Recopilación de herramientas


adsetuserpass: cambia contraseñas de usuarios del Directorio Activo con un script de PowerShell.

control-drivers: identifica a los drivers actuales de Windows y los compara con futuras versiones o drivers nuevos para comprobar cambios sospechosos.

dirsize: informa sobre los tamaños de todas las subcarpetas de una carpeta.

ejecutable.pl: script en perl para detectar archivos ejecutables sospechosos.

error-sys-events: realiza un informe con los sucesos de error de varios servidores Windows.

infosis: realiza un informe html recopilando hardware/software de un host Windows.

limpia-medios-extraibles: detecta y elimina (con confirmación) archivos sospechosos que pudieran estar en algún medio extraible como un pendrive.

regsys-net: realiza informes html del hardware/software de todos los hosts Windows de una red.

regsys: realiza un informe recopilando hardware/software de un host Windows.

userperm-net: informa sobre los permisos que tiene un usuario/grupo en todas las carpetas compartidas de un Directorio Activo.


miércoles, 18 de noviembre de 2009

Informes de Windows masivos

Disponer de informes hardware/software de los ordenadores de una red administrada ahorra mucho tiempo al solucionar problemas.

Una muestra de los datos que se pueden incluir en estos informes puedes verla en el post de Informe del Sistema.

Para automatizar la elaboración de estos informes, las utilidades regsys e infosis extraen estos datos mediante WMI y el Registro de Windows en el mismo ordenador donde se ejecuta la utilidad y pasa los resultados a HTML.

Estas utilidades son muy prácticas al finalizar la instalación/configuración de un sistema Win32 nuevo, pero en el caso de necesitar los informes de decenas o cientos de ordenadores, por ejemplo, de un Directorio Activo, realizar los informes uno a uno es ineficiente.

Para automatizar esta tarea realicé regsys-net que hace lo siguiente:
  1. Ejecutas regsys-net con permisos de administrador de dominio en un ordenador que pertenezca al dominio (supongamos que este ordenador tiene la ip 192.168.1.56)

  2. regsys-net busca ordenadores para conectar con WMI desde la ip 192.168.1.1 hasta la 192.168.1.254 (busca en toda la subred en la que se encuentra)

  3. Si en su búsqueda, regsys-net encuentra un ordenador con el WMI disponible, conecta con él, le extrae la información mediante WMI y el Registro de Windows, y la pone en un archivo HTML, nombra al archivo HTML con el nombre DNS del ordenador correspondiente y lo guarda en la misma carpeta donde se encuentra regsys-net
Este proceso suele suele tardar entre una y tres horas. En el caso de necesitar informes de más ordenadores ubicados en otras subredes, bastará con repetir el proceso en algún ordenador de la subred correspondiente.

Observación: es necesario que los ordenadores con Windows Vista tengan iniciado el servicio Registro Remoto, así, regsys-net puede extraer la información del software instalado mediante el registro de Windows.

jueves, 12 de noviembre de 2009

Localiza evidencias de Rootkits

Los rootkits son procesos que tienen la capacidad de ocultarse al usuario mediante varias técnicas. Una de ellas es mediante la inyección de código malicioso desde un proceso maligno a un proceso víctima.

Una de las funciones que utiliza el malware para realizar esta inyección es CreateRemoteThread, por tanto, conocer qué archivos ejecutables tienes en tu Windows que utilicen esta función puede sacar a la luz archivos sospechosos.

Mediante la herramienta Filealyzer podrás ver dentro de un archivo ejecutable, entre otras cosas interesantes, la tabla de importación donde aparecerá una lista de funciones que utiliza el archivo ejecutable en cuestión. Pero ¿cómo saber si un archivo ejecutable utiliza la función CreateRemoteThread para fines lícitos o no? Una forma rápida es buscar dentro de los archivos ejecutables de un Windows recién instalado e identificar los que utilizan la función CreateRemoteThread.

Hacer esto con Filealyzer es muy tedioso, así que para automatizar este proceso puedes utilizar la herramienta Strings de Sysinternals, ubicarla en una carpeta del Path (por ejemplo en c:\windows\system32), ir a esa misma ubicación en la línea de comandos y poner:

strings * | findstr CreateRemoteThread > report.txt

De esta forma,
Strings buscará CreateRemoteThread en todas las cadenas de texto de todos los archivos de c:\windows\system32 y pondrá el resultado en el archivo report.txt.

Observando el report.txt en un Windows XP SP3 recién instalado con las Windows Update al día, los archivos ubicados en c:\windows\system32 que utilizan la función CreateRemoteThread son:

csrsrv.dll
dbgeng.dll
kernel32.dll
safrslv.dll
usrcoina.dll
vdmdbg.dll
winlogon.exe
winsrv.dll

Todos ellos son archivos ejecutables de Windows que se suponen lícitos, pues al sistema, se supone que no le ha dado tiempo de infectarse con malware. Por tanto, si generas un report.txt de la manera mencionada en tu Windows XP SP3 y observas que además de los archivos listados hay alguno más, mosquéate, porque los que no aparezcan en esta lista utilizan la función CreateRemoteThread y no es de Windows.

jueves, 22 de octubre de 2009

Errores de sistema en varios servidores Windows

Comprobar los sucesos de error de sistema que se producen en un servidor Windows forma parte imprescindible en la administración de sistemas en estas plataformas. Para ello tienes el Visor de Sucesos y el procedimiento: eventvwr.msc, Sistema, Filtrar por Tipo y seleccionar sólo el tipo Error. Luego queda ver lo que ha sucedido y comprobar si todo va como tiene que ir.

Esto está bien si lo haces con un servidor, pero si lo tienes que hacer con más de tres, el procedimiento es más ineficiente: desde el Visor de Sucesos tienes que ir conectando con cada uno de los distintos servidores y repetir el procedimiento anterior (menos el primer paso que es la ejecución del visor de sucesos).

Quiero que la extracción de los sucesos de error de sistema de varios servidores se realice en un sólo paso, y después consultarlo tranquilamente, y para ello he realizado la herramienta error-sys-events.exe que funciona así:
  1. Creo una carpeta y pongo en ella la herramienta error-sys-events.exe
  2. Creo en esa misma carpeta un archivo de texto llamado servers.txt y pongo un nombre de servidor por cada línea (también valen ip's)
  3. Ejecuto con los privilegios adecuados (administrador local o de dominio) la herramienta error-sys-events.exe, y a esperar
  4. Al terminar tendré un archivo llamado syslogerror-nombre_servidor.txt en esa misma carpeta con los resultados del servidor correspondiente
Después sólo queda ir mirando los distintos informes y ver qué pasa realmente con los servidores.

viernes, 25 de septiembre de 2009

Alertas con PowerShell

Si administras servidores con Windows, existen soluciones como MOM o Vbscript para que, si ocurre un evento que consideres importante, salte una alerta que te informe por email. Un ejemplo muy común es que salte la alerta cuando quede poco espacio libre en alguna unidad de un servidor de archivos.

Vamos a ver como se hace con PowerShell.

El requisito es, que en el servidor en cuestión debemos tener instalado PowerShell (Windows 2008 ya lo incorpora).

Abrimos un editor de texto (recomiendo PowerGUI) y empezamos asignando un par de variables: la letra de unidad en cuestión y el tamaño en bytes de espacio libre que, cuando se alcance, queramos que salte la alerta.

$ud = "C:"
$gb1 = 1048576000

En este caso queremos la alerta sobre la unidad C: y el tamaño de espacio libre de alerta es 1 GB.

Ahora hacemos la consulta utilizando WMI (una línea):

$i = get-wmiobject -query "select DeviceID, FreeSpace from win32_logicaldisk" | where-object { $_.DeviceID -eq $ud }

En $i queda el objeto que contiene la letra de unidad (DeviceID) y el espacio libre (FreeSpace) de la unidad C: ($ud).

Ahora queda comprobar si la unidad C: tiene menos de 1GB y enviar el email de alerta si así es:

if ( $i.FreeSpace -lt $gb1 )
{
  $emailFrom = "admin@dominio.dom"
  $emailTo = "destino@dominio.dom"
  $subject = "Menos de 1GB en C: en el servidor x"
  $body = ""
  $smtpServer = "smtp.dominio.dom"
  $smtp = new-object Net.Mail.SmtpClient($smtpServer)
  $smtp.Send($emailFrom, $emailTo, $subject, $body)
}


En $emailTo podemos indicar más de un destinatario separados por comas. En este caso el cuerpo del mensaje $body no tiene nada y $smtpServer es la dirección del servidor smtp de destino donde está el buzón de correo del destinatario.

Ahora sólo queda guardar el script, por ejemplo, como pocoespacio_c.ps1, en alguna carpeta y ejecutarlo de forma programada con las Tareas Programadas de Windows. Una buena programación en este caso sería que este script se ejecute de lunes a viernes, durante la jornada laboral y a cada hora.

Detalle importante: a la hora de definir el comando a ejecutar en Tareas Programadas es necesario indicar toda la ruta del ejecutable powershell.exe, un espacio en blanco y después entre comillas dobles indicar toda la ruta del script, por ejemplo:

C:\WINDOWS\system32\WindowsPowerShell\v1.0\powershell.exe "C:\scripts\pocoespacio_c.ps1"

Y a esperar a quedarnos con menos de 1GB en C:

domingo, 6 de septiembre de 2009

Conoce la web y defiéndete con ella

Para navegar por la web de forma segura hay, entre otros, conceptos básicos como:
  • Saber en qué URL estamos y como se construyen
  • Diferenciar webs falsas de las verdaderas
  • Diferenciar un enlace javascript de otro convencional
  • Rellenar formularios de forma segura
  • Identificar y gestionar los complementos web del navegador
Explicados junto con más cosas en esta presentación.

Felíz rumbo.

domingo, 30 de agosto de 2009

DirSize

Con Windows siempre hay una carpeta que ocupa demasiado y no sé donde está. Me pongo a buscarla y llegar a ella es tedioso: clicar en las propiedades de cada carpeta, comprobar el tamaño, y así sucesivamente...

Qué práctico sería ver directamente los tamaños de cada carpeta de la unidad C: (por ejemplo), y más práctico todavía sería ver esos tamaños ordenados para saber primero cual es la carpeta con más tamaño. Así puedo entrar en ella y repetir la operación hasta dar finalmente con la carpeta con más tamaño.

Para ello he implementado una utilidad llamada dirsize que funciona en línea de comandos y que directamente, allá donde se ejecute, te muestra los tamaños de las carpetas.

Por ejemplo, este es un pantallazo de los resultados de ejecutar dirsize en la unidad C:

Con estos resultados, ya sé que la carpeta Windows es la de mayor tamaño en la unidad C: con unos 4,7 Gb.

Ahora sólo me quedaría entrar en la carpeta Windows y volver a ejecutar dirsize para que me diga cual es la carpeta con más tamaño del "lugar".

Y así sucesivamente.

En este caso concreto, os sorprendería saber cual es la más gorda del "lugar", pues Windows oculta el tamaño real de algunas de sus carpetas (si se realiza la consulta mediante las propiedades de la carpeta en cuestión). Con dirsize esta información queda al descubierto y permite saber exactamente el tamaño de cada carpeta y poder tomar medidas si es necesario.

Por último, es recomendable ubicar a dirsize en una carpeta con path (por ejemplo: c:\windows\ o c:\windows\system32\) para que funcione en cualquier sitio.

Buena cacería de carpetas de gran tamaño.