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.



martes, 25 de agosto de 2009

Directorio Activo, Usuarios, Permisos y Carpetas compartidas

En un Directorio Activo, es fácil saber qué usuario/grupo tiene acceso a un recurso como una carpeta compartida (sólo tienes que mirar las propiedades de la carpeta compartida en cuestión), pero las propiedades de un usuario/grupo no te dicen a qué carpetas compartidas tiene acceso en un momento dado.

Una debilidad muy común es el acceso del grupo Todos, y es imprescindible saber en qué carpetas compartidas tiene el permiso Control Total. Igualmente, saber puntualmente quién tiene acceso a qué, y qué tipo de permiso tiene, ayuda de una forma extraordinaria a mantener segura la política de seguridad de un Directorio Activo.

Como no encontré una herramienta que automatice esto, hice en Perl la herramienta de línea de comandos userperm-net, que hace lo siguiente:
  1. Pide al usuario el nombre de un usuario o un grupo
  2. Mediante net view genera un archivo de texto con la lista de los hosts en red
  3. Toma la lista generada y realiza lo siguiente en cada host:
  4. Intenta una conexión WMI para extraer la lista de carpetas compartidas
  5. De cada carpeta compartida, extrae la lista de usuarios/grupos con sus permisos NTFS
  6. Compara cada nombre de usuario/grupo del paso anterior con el introducido en el paso 1
  7. En caso de coincidencia, muestra el nombre del usuario/grupo, el permiso, el host y la ruta completa de la carpeta en cuestión
  8. Por último, si el usuario quiere, muestra una lista con los hosts donde no ha podido conectar con WMI
Consideraciones para utilizar userperm-net:
  • Es mejor ejecutarlo con permisos de administrador de dominio, así llegará al máximo de hosts del Directorio Activo
  • Hay que ser muy cuidadoso introduciendo el nombre de usuario/grupo porque tiene en cuenta mayúsculas/minúsculas, espacios, etc.
  • Como trabaja a nivel de permisos NTFS de carpetas compartidas y no a nivel de permisos de carpetas compartidas en sí, es posible que algunos resultados sólo tengan sentido para accesos locales y no desde otro host
Pantallazo:

martes, 11 de agosto de 2009

Cloud-Computing

La nueva plataforma web aplicada a negocios parece inexorable. Microsoft con Azure, Google con App Engine y otros del mismo calibre están apostando por el Cloud-Computing, que entre otras tiene las siguientes novedades y ventajas:
  • Reducción de costes: normalmente no se pagan licencias, sólo se paga cuota en base al número de usuarios o de uso de la infraestructura. Mantenimiento in-situ prácticamente nulo (sólo necesitas conexión a Internet).

  • Servicios de todo tipo centralizados y escalables: mensajería, blogging, video, intranet, colaboración, aplicaciones a medida, bases de datos, etc., que pueden crecer sin límite aparente y sin problemas.

  • Facilidad de desarrollo: sólo hay que ver este tutorial que traduje sobre Google Apps.

Ahora, ¿cuales son las dudas que invaden a los responsables de las empresas?:
  • Seguridad: las comunicaciones web por Internet no son seguras, ni lo han sido ni lo van a ser.

  • Disponibilidad de los datos: ¿qué ocurre cuando no hay conexión a Internet?

  • Privacidad de los datos: los datos físicamente no los tengo yo, están repartidos dinámicamente por servidores en todo el mundo ¿quien me garantiza su privacidad?

  • Migración: será fiel la migración si migro todo mi sistema al Cloud-Computing, ¿podré después migrar después a otro proveedor de Cloud-Computing?

sábado, 25 de julio de 2009

La desinformación de la red social

¿Sabes quien anda detrás de la otra pantalla?

En seguridad informática hay una cosa evidente: el factor más peligroso es el ser humano. Y aquí es donde entra la ingeniería social como método, donde la información consigue información mediante la desinformación. Actualmente en Internet, a esto lo podríamos llamar irónicamente human data injection o simplemente engaño, método antiguo como la picaresca.

Un nuevo campo en la aplicación del engaño, muy significativo y reciente, son algunas funcionalidades de la red social. Un usuario de Facebook tiene acceso prácticamente a toda la información que quiera publicar otro usuario aunque no sea su amigo, sólo basta ser amigo de un amigo suyo. El pequeño equivalente en el mundo real es el boca a boca: la información que le doy a un amigo, éste puede propagarla a sus amigos y así sucesivamente... nunca sabes a donde llega, y nunca sabrás cuando y cómo te repercutirá (efecto boomerang). En la red social, el "boca a boca" es automático.

Con esto deduzco que el mayor peligro de la red social no es acceder a la información de un usuario. El mayor peligro de la red social es la información que publica una persona, y en ésto hay que avisar a los neófitos/as. Cuando buscas la palabra Twitter en Google, al lado de la entrada correspondiente pone: -What are you doing?- (¿Qué estas haciendo?). El recebo del ego es un asunto muy delicado.

No es lo mismo comentar tu vida privada con tu amigo/a más leal, que escribirla en papelitos y distribuirla por la calle al primero que encuentres de una forma inconsciente. Algunas consecuencias, por desgracia, las vemos en los medios: acoso psicológico, robo de información, secuestros, engaños, desinformación, venganzas, robo de dinero, chantajes, y todo lo que permita la creatividad de un alma tocada por su lado más oscuro.

El problema tampoco está en la red social, está como dije antes, en el usuario. La gran ventaja también radica en este problema: los creadores de redes sociales de éxito tienen información a tiempo real de patrones de conducta de todo tipo de millones de personas, un campo de posibilidades a nivel de marketing nunca jamás visto antes.

Es muy natural entre humanos la curiosidad, algunos quieren saber más de nosotros, posiblemente de la misma forma que cualquier otra persona. La libertad de publicación de información en la red no puede discutirse, pero tiene límites éticos, morales y legales que han de ser distribuidos, fomentados y aprendidos. La red social apuesta por el gran negocio: mis amigos y los amigos de mis amigos son mis amigos.

Creo que las personas que trabajan en redes sociales deberían saber que los beneficios de ellas también supondrán desgracias a los más desprotegidos en el contexto informativo.

¿Crees que la red social aportará algo bueno a los humanos que no estén preparados para ello?

Saludos.

domingo, 12 de julio de 2009

Cuida el registro de Windows

El registro de Windows es su columna vertebral. Ahí reside toda la configuración tanto de Windows como de la mayoría del software instalado en tu sistema.

El registro de Windows es complejo y delicado, por eso conviene que lo cuides. Más de una vez he comprobado que puede producirse algún problema en él sin motivo aparente y hacer que Windows simplemente no arranque o que no pueda trabajar con él o con algún software.

El registro de Windows XP son 5 archivos ubicados en C:\Windows\System32\Config llamados:

default
SAM
SECURITY
software
system

Y es conveniente que hagas, de vez en cuando, una copia de seguridad de ellos cuando tu sistema funciona correctamente. Como alguno de esos archivos no se puede copiar directamente en una sesión normal porque están siendo utilizados, lo más sencillo es arrancar el ordenador con el CD de Windows XP y cuando aparezca el menú de instalación de Windows elige iniciar la consola de recuperación.

Una vez en la consola, puedes utilizar estos comandos para salvar el registro:

c:
cd \
cd windows
cd system32
cd config
mkdir BACK
copy default .\BACK
copy SAM .\BACK
copy SECURITY .\BACK
copy software .\BACK
copy system .\BACK

Y listo. Reinicia el ordenador y en la carpeta C:\Windows\System32\Config\BACK tendrás los 5 archivos del registro disponibles. Para mayor seguridad y comodidad, comprímelos y guarda esa copia comprimida fuera del disco duro, en otro disco o en un pendrive.

Para restaurar la copia de seguridad en caso de problemas, inicia igual que antes la consola de recuperación e introduce los siguientes comandos en la consola:

c:
cd \
cd windows
cd system32
cd config
cd BACK
copy default ..
copy SAM ..
copy SECURITY ..
copy software ..
copy system ..

Después reinicia el ordenador y mira a ver que tal.

domingo, 21 de junio de 2009

Elimina virus de pendrives, más mejor

Como vimos en el anterior post, podemos eliminar archivos sospechosos de los pendrives u otros dispositivos de almacenamiento USB con la utilidad limpia_mem_usb.vbs.

Revisando el script me dí cuenta de que tiene una carencia importante: elimina archivos fijándose en su extensión. Puede darse el caso de que la memoria USB tenga archivos de virus ejecutables renombrados con extensiones de confianza, como TXT (archivo de texto) y pasarían desapercibidos. Si la memoria USB contiene un autorun.inf con las líneas adecuadas, podría ejecutar esos archivos ejecutables con extensión TXT y el virus produciría su infección.

Otro detalle del script es que no informa al usuario de los archivos que va a eliminar.

Además, el script sólo actúa en unidades USB, y no en otros medios extraíbles que también pueden contener virus, como memorias SD.

Para tener en cuenta estos factores, he realizado otra utilidad nueva limpia_medios_extraibles.exe, esta vez escrita en Perl y que tiene las siguientes características nuevas:
  • Detecta y elimina archivos ejecutables independientemente de su extensión.
  • Muestra los archivos sospechosos al usuario y una confirmación antes de eliminarlos.
  • Extiende su acción a cualquier medio extraíble reconocido por Windows.
Suerte con la cacería.


miércoles, 17 de junio de 2009

Elimina virus de pendrives

En el mundo de Windows, últimamente no hay pendrive de alguien que pase por mis manos que no tenga algún virus.

Los pendrives, conocidos también como memorias USB tienen la gran ventaja de que puedes transportar unos cuantos GB en el espacio de un mechero y puedes acceder a ello prácticamente en cualquier ordenador o aparato que soporte USB.

La desventaja es, que además de llevar consigo tus archivos, también puedes llevar unos cuantos virus de regalo sin que lo sepas. Los virus suelen alojarse en el directorio principal del pendrive en la forma de archivos ejecutables y normalmente están ocultos y protegidos para pasar inadvertidos al usuario.

No voy a hablar del proceso de infección con los pendrives (gracias al famoso archivo desencadenante de la infección autorun.inf), pero sí he preparado una pequeña utilidad realizada en Visual Basic Script para eliminar archivos sospechosos (candidatos a ser virus, incluyendo el mencionado autorun.inf) de cualquier pendrive que conectes a tu ordenador.

La utilidad está comprimida en un archivo disponible en este enlace de descarga y se llama limpia_mem_usb.zip. Cuando descomprimes este archivo, obtienes el archivo de la utilidad en sí que se llama limpia_mem_usb.vbs.

Al abrir limpia_mem_usb.vbs, éste comprueba si hay alguna memoria USB conectada al ordenador, si es así aparece una ventana indicando la letra de unidad detectada de la memoria USB y te pregunta si quieres limpiarla. Si le dices que Si, la utilidad eliminará los archivos de la memoria USB ubicados en su directorio principal con las siguientes extensiones sospechosas: sys, drv, ps1, vbs, msp, exe, com, dll, inf, scr, pif, dat, tmp, cmd, bat, lnk. Si la utilidad detecta más memorias USB, preguntará de nuevo indicando la nueva letra de unidad detectada para proceder con la limpieza.

Advertencia:
este script está diseñado para eliminar archivos ejecutables (.exe, .msp, etc.) que estén alojados en el directorio principal del pendrive. Si has guardado ahí algún archivo de este tipo o si ya había alguno,
será eliminado.

Novedad:
tienes disponible una versión mejorada de esta utilidad que se llama limpia_medios_extraibles.exe. La puedes descargar desde aquí y te recomiendo que leas este post para que veas las mejoras respecto a la versión anterior.


jueves, 28 de mayo de 2009

PowerShell, Directorio Activo y contraseñas

Si administras un Directorio Activo, te habrás dado cuenta que, a medida que hay más usuarios, mayor es la frecuencia de despistados que te llaman para reestablecer su contraseña. Esta tarea cada vez se vuelve más repetitiva y monótona.

Minimizar al máximo este proceso sin gastarte un duro extra y hacerlo desde tu propio ordenador conectado al dominio es posible si instalas PowerShell y ActiveRoles Management Shell for Active Directory. Estos últimos son unos Cmdlets que ha creado Quest para extender la capacidad de PowerShell al Directorio Activo. Estas dos herramientas unidas en tu ordenador conectado al dominio hacen posible que desde él puedas cambiar la contraseña de un usuario en una sóla línea de código.

Este script ( ADSetUserPass.ps1) escrito en PowerShell amplia esta funcionalidad ofreciendo además las siguientes comprobaciones:
  • Comprueba que el usuario proporcionado existe en el dominio.
  • Comprueba que la contraseña es correcta introduciéndola dos veces.
  • Comprueba que la contraseña tiene al menos 6 caracteres.
Para que este script tenga éxito es conveniente que lo ejecute un usuario que al menos tenga permisos de administración de cuentas en el dominio. Lo más sencillo es utilizar el comando runas especificando como argumento al usuario administrador del dominio. Por otro lado, tengo que aclarar que este script funciona en un dominio llamado DOMINIO. Si tu dominio tiene otro nombre, sustitúyelo en la línea 36 del script:

$userdom = "DOMINIO\"+$user

Más información y utilidades:

PowerGUI, un editor para PowerShell bastante ligero y completo.
La guía del administrador de los Cmdlets para administrar el Directorio Activo.


lunes, 20 de abril de 2009

Informe del Sistema 1.0 disponible

La versión 1.0 de infosis (Informe del Sistema) acabo de publicarla hoy y se encuentra disponible en el siguiente enlace:

http://sites.google.com/site/ramiroencinas/soft/infosis.zip

Se trata de un pequeño ejecutable realizado en VBNet que recopila información hardware/software del Windows XP donde se encuentre (creo que también funciona para Windows Vista). Es útil para administradores de sistemas que quieran realizar un informe completo de un ordenador para después tener información adecuada para resolver incidencias.

El aspecto de la utilidad una vez iniciada es la siguiente:
El campo de observaciones está bien para incluir en el informe la password del administrador local del sistema. Si lo dejamos en blanco no pasa nada.

Después de pensar en las observaciones, clicas en Siguiente y empezará a recopilar la información. Cuando termine puedes ver el resultado clicando en el botón Mostrar. El informe es un archivo HTML con el nombre del ordenador, y lo encontrarás en la misma carpeta donde infosis.exe se haya ejecutado.

El comienzo del informe de mi ordenador es el siguiente:

Como puedes ver, el fabricante de mi placa base (que es MSI) sólo se tomó la molestia de indicar el campo Modelo para identificar su producto a Windows, no indicando el número de serie y el fabricante de la placa base. Por contra, otros fabricantes como HP o Fujitsu son totalmente fiables en estos campos.

El informe primero registra el hardware y a continuación el software:

Sistema central

- Número de serie
- Fabricante de la placa base
- Modelo
- Arquitectura
- RAM
- Procesador

Discos duros

- Letra de unidad
- Modelo
- Capacidad

Unidades lógicas

- Letra de unidad
- Sistema de archivos
- Espacio total
- Espacio ocupado
- Espacio libre
- Espacio ocupado/libre (gráfica)

CD/DVD ROM

- Letra de unidad
- Marca y modelo

Adaptadores de red

- Descripción del adaptador de red

Adaptadores de video

- Descripción del adaptador de video

Adaptadores de sonido

- Descripción del adapatador de sonido

Sistema Operativo

- Nombre
- Versión
- Service Pack
- Unidad de arranque
- Partición de inicio
- Directorio de Windows

Config. de red (del adaptador de red que tenga IP)

- Adaptador de red
- MAC
- IP
- Máscara de subred
- Puerta de enlace predeterminada
- Servidores DNS
- DHCP Activado (si o no)
- Servidor DHCP (si DHCP Activado es si)
- Dominio/Grupo de trabajo

Software instalado

- Descripción
- Versión
- Fabricante

Si lo pruebas, te agradeceré que me reportes tu parecer para mejorarlo.


domingo, 22 de marzo de 2009

Rootkits de firmware

Interesante artículo de Invisible Things Labs donde muestran cómo hackear la memoria SMM, la zona de memoria más privilegiada del firmware de algunas placas base modernas de Intel.

A continuación, una traducción que he realizado de la parte más relevante:


3. Detalles del ataque

Ahora describiremos como realizar el envenenamiento de caché para lograr acceso a la SMRAM. Asumimos que el atacante tiene acceso a cierta plataforma con registros MSR. En la práctica esto es equivalente a que el atacante tenga privilegios de administrador en el sistema objetivo, y en otros sistemas, como Windows, la habilidad de cargar y ejecutar código arbitrario en el kernel.

- 1. El atacante primero tiene que modificar los registros MTRR del sistema para marcar la región de la memoria del sistema donde la SMRAM está en modo cacheable de tipo Write-Back (WB).

- 2. Ahora, el atacante realiza accesos de escritura a las direcciones físicas correspondientes a las ubicaciones donde se encuentra la SMRAM. Estos accesos serán cacheados debido a que hemos marcado este rango de direcciones físicas como cacheable WB. Habitualmente, las direcciones físicas que corresponden con la ubicación de la SMRAM pueden ser no cacheables y cualquier acceso de escritura a estas direcciones puede ser abortado por el controlador de memoria (chipset).

- 3. Por último, el atacante necesita lanzar un SMI que transferirá la ejecución al código SMM. La CPU comenzará a ejecutar el código SMM, pero primero seguirá las instrucciones de la caché antes de leerlas de la DRAM. Debido a que el atacante en el punto 2 realizó accesos de escritura en las ubicaciones de la SMRAM, la CPU procesará los datos de la caché proporcionados por el atacante y los ejecutará como un manipulador SMI, con todos los privilegios de la SMM.

El escenario anterior permite una sobreescritura arbitraria en la memoria SMM (y una posterior ejecución de código de estos datos arbitrarios escritos en la SMM. Se puede pensar en un ataque similar que pueda permitir la lectura de la memoria SMM. Esto es especialmente útil para poner en práctica una explotación, donde el atacante primero debería obtener los offsets específicos del firmware para generar un código fiable que ejecute el exploit (lo veremos en el siguiente capítulo). En el caso actual, la secuencia de eventos sería:

- 1. De nuevo, el atacante primero marca a la SMRAM en modo cacheable WB manipulando los registros MTRR del sistema.

- 2. Ahora el atacante necesita lanzar un SMI que produzca la ejecución del manipulador original. Esto también tendrá un efecto colateral en la mayoría de las instrucciones que se cacheen.

- 3. Por último, el atacante debería leer la caché, preferiblemente utilizando una instrucción no invasiva como movnti, que no contamine la caché con datos nuevos.


4. La explotación puesta en práctica

En sistemas Linux, el usuario root puede modificar los MTRRs mediante el pseudo-archivo /proc/mtrr. Si asumimos que tu sistema tiene una placa base DQ35 de Intel con 2GB de RAM es posible que el "mapa de caché" de tu memoria sea parecido a esto:

[root@localhost ~]# cat /proc/mtrr
reg00: base=0x00000000 ( 0MB), size=2048MB: write-back, count=1
reg01: base=0x7f000000 (2032MB), size=16MB: uncachable, count=1
reg02: base=0x7e800000 (2024MB), size=8MB: uncachable, count=1
reg03: base=0x7e400000 (2020MB), size=4MB: uncachable, count=1
reg04: base=0x7e200000 (2018MB), size=2MB: uncachable, count=1


Aquí vemos que la primera entrada (reg00) está marcando a toda la memoria como cacheable Write-Back. Después vemos unas cuantas regiones de memoria "excepcionales" marcadas como no cacheables. Una de estas regiones (reg03) corresponde con la memoria donde está ubicado el segmento TSEG de la SMM.

Tan simple como eliminar esta entrada MTRR del TSEG con el siguiente comando:

echo "disable=3" > /proc/mtrr

En otros sistemas puede que no tengamos la entrada cacheable WB por defecto (como hemos visto antes) y entonces tendríamos que modificar manualmente la entrada MTRR del TSEG para indicar el tipo de cacheo como Write-Back (crucial para el ataque).

En sistemas Windows podemos modificar los MTRRs utilizando las instrucciones WRMSR estándar.

Una vez marcada la memoria TSEG como cacheable WB, tan simple como hacer esto:

*(ptr) = datos_perversos;
outb 0x00, 0xb2 // lanza el SMI


Donde ptr, por ejemplo, puede ser un puntero a una dirección virtual mapeada a la dirección física dentro del segmento TSEG. Una forma sencilla de conseguir esto es utilizar el dispositivo /dev/mem en Linux o el objeto \Device\PhysicalMemory de Windows.

¡Y ya está!

Ahora, cuando se genera el SMI (en sistemas Intel puede realizarse fácilmente con sólo una instrucción como vimos antes), y si se ejecutan las instrucciones de las direcciones físicas que hemos puesto en "datos_perversos", la CPU procesará estos datos perversos de la caché y los ejecutará en vez de ejecutar las instrucciones originales SMM de la DRAM. Es necesario decir que podemos estar seguros que la CPU siempre ejecutará nuestras instrucciones sobreescribiendo el punto de entrada del manipulador SMI.

En los sistemas DQ35 en particular, uno puede ver que el manipulador SMI ejecuta el siguiente código (localizado en TSEG) poco después del punto de entrada de SMM:

mov $0x7e5fcfe0,%rsp
mov 0x8(%rsp),%rax
mov (%rsp),%ecx
callq *(%rax)

Después, la ejecución de código en el SMM puede conseguirse con el siguiente pseudo-código (asumiendo que tenemos también ubicado un buffer cuya dirección física está en la variable myaddr):

fd = open("/dev/mem", O_RDWR);
*ptr = mmap (…, fd, …, 0x7e500000);
ptr2 = ptr + 0xfcfe0; // 1st core
ptr2[1] = myaddr;
ptr2 = ptr + 0xfefe0; // 2nd core
ptr2[1] = myaddr;
iopl(3); // allow IN/OUT from usermode
smi(); // trigger SMI#

El exploit tiene varias constantes hard-coded que necesitan ajustarse para sistemas distintos al DQ35 con 2GB de RAM. Además, para simplificar utilizamos un módulo kernel dedicado para ubicar el buffer del shellcode y así calcular su dirección física. El shellcode del exploit no hace nada espectacular, sólo incrementa un contador que se puede ver mediante /proc/mymem, que es un pseudo-archivo creado por el módulo, y por tanto, este exploit es inofensivo (también tiene la prudencia de ejecutar el código SMM original).

Como vemos, la explotación se puede conseguir incluso desde el modo usuario (escalando desde el anillo 3 hasta el SMM), asumiendo que el sistema operativo permita operaciones de E/S y manipulación del MTRR desde el modo usuario. La mayoría de los sistemas Linux permiten al usuario root realizar lo mencionado mientras que en Windows no. Esto también quiere decir que el ataque anterior pueder ser utilizado de una forma potencial utilizando escalada de privilegios desde el entorno usuario hasta el kernel en sistemas que tienen especial cuidado en proteger el kernel, por ej., deshabilitando el soporte LKM y bloqueando escrituras en dispositivos /dev/(k)mem. No hemos intentado nuestro ataque en sistemas de este tipo.

Para realizar el ataque mencionado es necesario conocer los "offsets" específicos del SMM que utiliza el manipulador SMI.

Hay más de una forma de resolver este problema. Una forma elegante es utilizar el mismo ataque de cacheo para leer, en vez de escribir, la memoria SMM.

El siguiente pseudo-código es un exploit que puede utilizarse para leer código SMM:

fd = open("/dev/mem", O_RDWR);
*ptr = mmap (…, fd, …, 0x7e500000);
memset(outbuf, 0, sizeof(outbuf));
iopl(3);
smi();
asm("push %rsi\n"
"push %rdi\n"
"mov $0x40000, %ecx\n"
"mov $outbuf, %rdi\n"
"mov ptr, %rsi\n"
"lp:\n"
"mov (%rsi), %eax\n"
"movnti %eax, (%rdi)\n"
"add $4, %rdi\n"
"add $4, %rsi\n"
"loop lp\n"
"pop %rdi\n"
"pop %rsi\n"
"mfence");
write(1, outbuf, SIZE); // stdout

El truco es la instrucción movnti que puede utilizarse para leer datos desde la caché (datos dejados por el manipulador SMI en el modo de cacheo WB) sin contaminar la caché con datos nuevos. De esta forma no elimina datos interesantes de la caché antes de que puedan ser leidos. Con este método sólo podemos leer aquellas direcciones que haya ejecutado el manipulador SMI.

domingo, 15 de marzo de 2009

Contra los rootkits: SpyDLLRemover

Nueva utilidad de Nagareshwar Talekar para descubrir rootkits basados en archivos DLL. Analiza los procesos activos y saca sus entresijos. Lo he probado en Windows XP SP3 y he visto cosas muy interesantes.

SpyDLLRemover es una utilidad para detectar y eliminar eficientemente spywares del sistema. Utiliza varias técnicas como la implementación directa de llamada al sistema, detección de manipuladores de procesos CSRSS, método PIDB, etc. para detectar rootkits de entorno de usuario.

El objetivo principal de esta herramienta es ayudar a eliminar DLLs maliciosas rápida y fácilmente mostrando todas las DLLs dentro de los procesos. Para ello se extraen varios niveles de amenaza utilizando técnicas de inyección de DLL empleando una implementación a bajo nivel muy efectiva contra los rootkits de entorno de usuario.


Más info:

http://nagareshwar.securityxploded.com/2009/03/16/spydllremover-detect-delete-spywares-from-the-system/

http://rootkitanalytics.com/userland/spy-dll-remover.php


miércoles, 11 de febrero de 2009

Windows XP más seguro

Si inicias Windows XP con una cuenta que tiene privilegios de administrador local o con la misma cuenta de administrador (cosa corriente), tiene sus ventajas porque puedes hacer lo que quieras sin restricción alguna, y también tiene sus inconvenientes: cualquier cosa maliciosa que venga de fuera puede aprovechar perfectamente estos privilegios y también puede hacer lo que quiera sin restricción alguna.

Estas cosas maliciosas, o las cosas que hacen cosas sin que te enteres, como utilizar los recursos de tu ordenador para el enriquecimiento de otros, o simplemente robarte credenciales bancarias para robar el sudor de tu frente, actualmente han crecido tanto en número como en sofisticación.

No existe software que te protega 100%, y tal y como está la cosa actualmente, cuanto más promíscuo seas en la red, más posibilidades tienes de llevarte un premio.

A la vez, el negocio de la seguridad informática es una carrera de tiempos dentro de un toroide cerrado donde tu ordenador está en medio pagando tributos, primero a uno, luego a otro, luego a otro y así sucesivamente. No estás más seguro por tener más software de seguridad, estás más seguro sabiendo lo que tienes y unas buenas contraseñas.

Para tener un buen nivel de seguridad en Windows XP, sólo necesitas cuatro cosas:
  1. Windows XP actualizado todos los días con Windows Update.
  2. Antivirus actualizado todos los días.
  3. Utilizar normalmente una cuenta de usuario que sólo pertenezca al grupo "Usuarios".
  4. Sentido común.

El punto 1 y 2 es una rutina, el 4 depende de tí y ahora hablemos del punto 3.

En el caso de Windows XP, esto se realiza con la Administración de equipos ubicada en las Herramientas Administrativas del Panel de Control, o utilizando el comando compmgmt.msc. Dentro de Administración de equipos, en el apartado de Usuarios locales y grupos aparecen dos carpetas: Usuarios y Grupos.

Dentro de la carpeta Usuarios haz doble click en tu usuario y aparece la ventana con sus opciones, ve a la pestaña Miembro de, agrega el grupo Usuarios y elimina cualquier otro grupo (incluido el grupo de Administradores).

Aparte de esto, no hace falta recordar que tanto nuestro usuario como el usuario Administrador deben tener contraseñas fuertes. Para asignar una contraseña a un usuario basta con clicar en él con el botón derecho y elegir Establecer contraseña...

De esta forma, hagas lo que hagas con tu usuario, éste no podrá escribir o modificar archivos de zonas importantes de Windows y por tanto tampoco ningún código malicioso que puedas "adquirir", sea por Internet, pendrive o disquete de 5 1/4.

Ahora, si necesitas instalar algún software que requiera privilegios elevados, realizar alguna tarea administrativa o cualquier otra cosa que necesite privilegios de administración puedes utilizar el botón derecho del ratón y elegir Ejecutar como dando las credenciales del administrador local, o también puedes utilizar la versión de línea de comando "runas".

Por ejemplo, si necesitas comprobar e instalar actualizaciones de Windows XP con Windows Update en la versión línea de comandos, puedes crear en escritorio el archivo WindowsUpdate.BAT con estas líneas:

@echo off
cd %systemroot%\system32
runas /env /user:administrador wupdmgr.exe


Lo abres, te pide la contraseña del administrador local, se la das y Windows Update empezará a realizar su trabajo, mientras el usuario actual sigue restringido y protegido.

domingo, 1 de febrero de 2009

Detecta y elimina malware en Windows XP

El malware puede tomar cualquier forma dentro del sistema operativo, y conociendo al detalle al sistema operativo, es más sencillo detectar al malware para aislarlo y eliminarlo con herramientas sencillas.

El año pasado escribí una guía de 26 páginas acerca de cómo identificar malware en un Windows XP.

En esta guía verás como utilizar varias herramientas de administración de Windows y, entre otros métodos, detalla el funcionamiento de varias herramientas de Sysinternals como Process Explorer y Autoruns para sacarle la información a Windows y poder interpretarla correctamente para detectar malware. Actualmente, esta guía se encuentra en formato PDF en este enlace.

sábado, 31 de enero de 2009

Windows XP más rápido = servicios necesarios

Windows XP, como cualquier otro sistema operativo viene por defecto con una serie de servicios que se inician automaticamente cuando el ordenador arranca. Dependiendo del uso que demos al ordenador utilizaremos algunos y otros no.

En este post, explicaré algunos servicios de Windows XP, comprobaremos si los necesitamos o no, y los que no necesitemos los desactivaremos. El resultado será el ahorro de recursos y el incremento de la rapidez de Windows XP, tanto en arranque como en el uso normal.

Lo primero que haremos es abrir el gestor de servicios y ver lo que hay. Para ello vamos a inicio, ejecutar y ponemos: services.msc, pulsamos ENTER y aparecerán los servicios. Para verlos mejor, maximizamos la ventana y pinchamos abajo en la pestaña "Estándar".

La columna interesante es Tipo de inicio. Si ordenamos los servicios por Tipo de inicio los veremos mejor. Hay tres tipos de inicio:

  • Automático: siempre inicia el servicio en el arranque de Windows.

  • Manual: se inicia a demanda. Normalmente lo inicia otro servicio ya iniciado, como por ejemplo alguno que ya se inicie de forma automática.

  • Deshabilitado: nunca se inicia.

Podemos cambiar el tipo de inicio de un servicio dado, además de iniciarlo o detenerlo haciendo doble click izquierdo en él e indicando lo que queremos.

A continuación voy a explicar algunos de los servicios de Windows XP SP3 Profesional que podemos tocar sin problemas, y así averiguamos si los necesitamos o no:

Acceso a dispositivo de interfaz humana: Si tienes un teclado con botones multimedia tipo volúmen, enviar correo, hacer la colada, etc., déjalo en automático. Si tienes un teclado convencional y no utilizas este tipo de controles multimedia, lo puedes detener y deshabilitar.

Actualizaciones automáticas:
es recomendable que esté en automático sino quieres que tu Windows se convierta en un colador.

Administrador de IIS:
 si tienes un servidor Web, o ftp, o alguna aplicación que utilice IIS (Internet Information Server) déjalo en automático. Si utilizas otro servidor web como Apache o Tomcat, lo puedes desactivar. Si lo anterior te suena a chino, desactívalo.

Administrador de sesión de Ayuda de escritorio remoto:
esto sirve para que un amigo tuyo se conecte a tu ordenador y te ayude con algún problema. Desactívalo sino necesitas ayuda on-line.

Adquisición de imágenes de Windows (WIA):
si tienes un escáner o cámara conectado al ordenador, déjalo en automático, sino, lo puedes desactivar.

Agente de Protección de acceso a redes:
 el servicio NAP, una capa nueva extra de seguridad que Microsoft sacó ya con Windows Vista y Windows 2008. Tiene sentido en una red local de ordenadores donde queremos más seguridad. En entornos corporativos donde la seguridad es un factor crítico entre ordenadores y servidores no estaría mal. En el caso doméstico no le veo utilidad y puede desactivarse.

Ayuda y soporte técnico:
por la utilidad que he visto en este servicio, es mejor desactivarlo.

Configuración inalámbrica rápida:
si tu ordenador tiene WIFI, déjalo activado, sino, desactívalo.

DDE de red: otro servicio para dar seguridad al transporte de datos en determinadas aplicaciones (nunca he visto una aplicación que utilice este servicio). No es necesario para compartir carpetas en una red local, por tanto se puede desactivar.

DSDM de DDE de red: más de lo mismo que el servicio anterior. 

Enrutamiento y acceso remoto: desactívalo. Un router es un router, y un Windows es un Windows.

Escritorio remoto compartido de NetMeeting: esto es una cosa parecida a la asistencia remota, pero utilizando NetMeeting. Sino te suena, desactívalo.

Instantáneas de volumen: si utilizas el sistema de copia de seguridad propio de Windows, puede ser útil, sino, desactívalo.

Machine Debug Manager: si te dedicas a analizar volcados de memoria cuando algo revienta, es hasta necesario. Si lo anterior te suena a chino, desactívalo.

Mensajero: esto tiene sentido en la oficina cuando el administrador de sistemas necesita alertar de algo a los usuarios. A nivel doméstico no tiene sentido.

MS Software Shadow Copy Provider: esto es lo mismo que el servicio de Instantáneas de volumen.

Programador de tareas: si necesitas hacer algo de forma automática de vez en cuando, tiene sentido, sino, desactívalo.

Publicación en World Wide Web: igual que el Administrador de IIS.

Servicio de alerta: igual que el servicio Mensajero, pero en vez de que la alerta la realice el administrador de sistemas la realiza alguna aplicación en respuesta a algún evento. En entorno doméstico no tiene sentido.

Servicio de Index Server: dice que mejora la velocidad de las búsquedas de archivos en Windows, pero yo no he visto ninguna mejora significativa. Lo puedes desactivar perfectamente.

Servicio de restauración de sistema:
yo lo he probado en varios contextos, y es mejor tener una copia de seguridad de nuestros archivos que no pueden perderse fuera del ordenador, por ejemplo en un disco duro externo. Además, es un nicho de virus. Mejor desactivado.

Servicio de uso compartido de red del Reproductor de Windows Media:
 si utilizas Windows Media Player junto con aparatos reproductores externos, puede servir para que compartan datos entre si (esto es como el itunes y el ipod pero en plan Windows), sino, desactívalo.

Servicio del número de serie de medio portátil:
 íntimamente ligado al servicio anterior.

Servicios de Terminal Server:
si quieres conectar con el escritorio de otro ordenador en red, bien, sino, desactívalo.

Servicios IPSEC:
este servicio de cifrado de red tiene sentido en comunicaciones cifradas entre servidores de archivos confidenciales. En entornos domésticos no tiene sentido.

Sistema de alimentación ininterrumpida: si tienes un SAI conectado al ordenador y quieres mirar su estado con el mismo Windows, bien. Si tu SAI ya dispone de software para esto, o no tienes un SAI, desactívalo.

Tarjeta inteligente: esto se utiliza en caso de que algún programa necesite leer tarjetas de identificación, para temas de seguridad. Sino tienes alguna tarjeta de estas, puedes desactivarlo.

Telnet:
si te gusta la línea de comandos con conexión remota y la inseguridad, pues vale, sino desactívalo.

Temas:
Windows más bonito. Si lo desactivas, se queda con los gráficos en plan Windows 95, y ten por seguro que Windows irá más rápido.

Como dije, el resto de servicios suelen ser más necesarios y están más vinculados con el funcionamiento de Windows, aunque puedes probar a desactivar alguno a ver que pasa.

Si dejamos activos sólo los servicios que utilizamos y deshabilitamos los que no utilizamos, tendremos una mejora significativa en rapidez, que si por contra dejamos los servicios configurados por defecto.

miércoles, 28 de enero de 2009

Ejecutable ¿o no?, esa es la cuestión

Que un archivo comience con los bytes "4d5a" (hexadecimal), no es casualidad. Se trata de un archivo ejecutable de cualquier sistema operativo de Microsoft.

Concretamente estamos hablando del comienzo de la cabecera PE (Portable Executable), que identifica a los archivos ejecutables de MS-DOS también soportados por compatibilidad en las versiones de los ejecutables posteriores de Windows. Disponemos de más información acerca de la estructura de la cabecera PE aquí y aquí.

Las extensiones de los nombres de los archivos ejecutables de Windows son muchas, las más conocidas son .EXE, (el de toda la vida), .DLL (librerías dinámicas) y los .SYS (Drivers). Menos conocidas son .CPL y DPL. En cualquier caso, todos estos tipos de archivos comienzan con los bytes mencionados y tienen la capacidad de ejecutar código en el sistema, para bien y para mal.

Entrando en el contexto de la seguridad, lo normal es que un archivo ejecutable tenga una extensión como las que hemos visto, como EXE, y lo extraño es encontrar un archivo que por su nombre/extensión no parezca ejecutable y su contenido sí lo sea.

Muchos virus utilizan archivos con extensión .TMP (temporal) para alojarse en ellos y "despistar" al observador. Ahora, su contenido comienza con "4d5a", y digo .TMP como si se trata de cualquier otra extensión que no parezca ser un ejecutable, o simplemente que no tenga extensión. Si no nos percatamos de este detalle, el .TMP de turno puede ser abierto por cualquier otro proceso y ejecutarlo... y en ese caso tenemos papeletas para el premio.

Para saber si existe en nuestro sistema algún archivo que por su extensión no denote "ejecución", he preparado un script en perl. Este script trabaja sobre archivos que NO tengan las extensiones típicas de los ejecutables (exe, dll, sys, drv, ocx, com, cpl, dpl) para comprobar si el contenido comienza con "4d5a". Si el script detecta estos bytes al inicio del archivo, indica la ruta y el nombre del archivo en cuestión. En estos casos, habría que buscar información de la extensión de este archivo y comprobar de qué se trata.

Este script da la opción de realizar esta búsqueda en toda la unidad C: incluyendo todos sus subdirectorios (tarda un buen rato), y también da la opción de realizar esta búsqueda en el directorio actual. En ambos casos, el resultado lo dejará en el archivo resultados.txt del directorio donde se ejecute el script.

He pasado este script en tres ordenadores con Windows XP SP3, y no podeis imaginar la cantidad de archivos que existen, que no parecen ejecutables, y sí lo son. En próximos posts intentaré dar más información acerca de este tipo de extensiones como ax, flt, mui, wpc, etc.

El script está disponible en este enlace.

martes, 27 de enero de 2009

Protege los drivers de tu Windows, y 2

El script del post anterior sólo trabaja con MD5: crea MD5 de los drivers actuales a un archivo (drivers.md5) y también puede comprobarlos en un futuro.

Pero le falta una cosa importante: si hay drivers nuevos no los procesa porque toma como referencia el archivo drivers.md5, y en base a su contenido comprueba si existe el driver correspondiente en el sistema, sin realizar un recorrido en éste. Por tanto, sólo procesa los que tiene en drivers.md5 ignorando los nuevos que pudieran existir. Esta funcionalidad es crítica y necesaria puesto que necesitamos saber si algún driver ha sido instalado en el sistema desde la última "foto" que le hicimos.

Para ofrecer esta nueva funcionalidad, he ampliado el script dando una opción más que es: Comprobar drivers nuevos. Además, como ahora he utilizado contadores para contar tanto los drivers en drivers.md5 como en el sistema, los resultados en general se han ampliado.

Como los cambios son significativos respecto al script anterior, a éste lo he llamado control-drivers.pl y su versión es la 1.0.

Y para evitar erratas producidas por blogger, el nuevo script se encuentra en este enlace.

lunes, 26 de enero de 2009

Protege los drivers de tu Windows

En base al trabajo del post anterior, podemos eliminar los drivers que no utilizamos, y si el resto es de confianza, podemos controlarlos haciéndolos una foto con MD5 para después compararlos con la realidad. De esta forma sabremos si alguno es modificado.

El sentido de esto es saber cuando queramos si estos archivos (de confianza) han sido alterados o no, comparándolos con sus MD5 antes generados. Así, si instalamos una versión nueva de un driver, o si Windows Update lo hace, lo podremos confirmar. Y si ha habido algún cambio sin que nosotros lo sepamos, pues puede ser un virus.

Para ello, realizaremos un script con perl con un menú donde podamos elegir realizar el MD5 de los drivers, que son los archivos que tengan extensión .SYS, o .sys, o, Sys (perl distingue entre mayúsculas y minúsculas), que se encuentren tanto en system32 como en system32\drivers y guardarlo en un archivo de texto.

La segunda opción tendrá sentido a futuro, cuando comparemos los MD5 de los drivers actuales con los guardados (la foto) . Si no hay ningúna discrepancia, el script no dará ningún resultado, y si la hay, indicará cual es el driver afectado.

------------- Comienzo md5-drivers.pl -------------------------------

# Generación y comprobación de los MD5 de los drivers de Windows
# ramiro.encinas@gmail.com - 2009
# Tuya es la responsabilidad del buen o mal uso de este script


use Digest::MD5::File qw(file_md5_hex); # Cargamos el módulo MD5 para archivos

sub menu # El menú con las tres opciones
{
print "\nControl de drivers. Elige opcion:\n";
print "-------------------------------------\n";
print "- [1] Generar MD5 de los drivers en $file_out\n";
print "- [2] Comparar los MD5 de los drivers con el de $file_out existente\n";
print "- [3] Salir\n";
print "->";
}

sub genera # Procesa los MD5 de los drivers actuales en ambas ubicaciones
{
open f_out, ">$file_out"; # Abre para escritura a drivers.md5

$path = $path1; # Procesa la primera ubicación
busca($path); # Y llama a la función correspondiente para generar los MD5

$path = $path2; # Procesa la segunda ubicación
busca($path); # Y llama a la función correspondiente para generar los MD5

close f_out; # Cierra drivers.md5
print "Archivo $file_out generado ok.\n";
}

sub busca # Busca drivers en ubicación, genera MD5 y los guarda en drivers.md5
{
opendir DIRECTORY, $path or die; # Abre la carpeta $path (la ubicación actual)

# Recorre $path y deja en $file cada nombre de archivo

while ($file = readdir(DIRECTORY)) # Leemos todos los archivos de la ubicación
{
if ( -d $path.$file ){# $file es un directorio
}
else # $file es un archivo (porque puede un directorio)
{
if ($file =~/.[sS][yY][sS]$/) # Sólo *.SYS (mayus y minus).
{
$md5 = file_md5_hex($path.$file); # Calcula el MD5 de $file
print f_out "$path$file\:\:$md5\n"; # Escribe en drivers.md5 path+archivo+::+md5
}
}
}
}

sub compara # Compara los MD5 actuales con los guardados en drivers.md5
{
open f_in, $file_out or die "No puedo abrir $file_out"; # Abre drivers.md5

while () # Leemos línea a línea hasta la última
{
chomp $_; # Quitamos el fin de línea
$_ =~ /(.*)::/; # Extrae el nombre del archivo (path incluido) de drivers.md5
$f = $1; # y lo pone en $f

$_ =~ /::(.*)/; # Extrae el MD5 del archivo de drivers.md5
$md5 = $1; # y lo pone en $md5

$md5_actual = file_md5_hex($f); # Generamos el MD5 del driver actual

# Y comparamos. Si hay discrepancia la pone, sino, no la pone

if ($md5 ne $md5_actual){print "\nCuidadito, el MD5 de $f no coincide.\n";}
}
close f_in; # Cerramos drivers.md5
}

sub principal # Empezamos aquí
{
$path1="C:\\WINDOWS\\system32\\"; # Primera ubicación de los drivers
$path2="C:\\WINDOWS\\system32\\drivers\\"; # Segunda ubicación de los drivers
$file_out = "drivers.md5"; # Nombre de archivo donde se guardarán los MD5 actuales

menu(); # Llama al menú
while ($opcion=) # Espera opción desde el teclado para meterla en $opcion
{
chomp $opcion; # Elimina el fin de línea
if ($opcion == 1){genera($path1,$path2);exit;} # Llama a sub genera
elsif ($opcion == 2){compara($file_out);exit;} # Llama a sub compara
elsif ($opcion == 3){exit;} # A la calle
else {$opcion = NULL;menu();} # Sino hay opción válida, volvemos.
}
}

principal(); # Esta es la primera función que se ejecuta

-------------- Final md5-drivers.pl -------------------------------

AVISO: Debido a que blogger elimina los símbolos mayor menor que, a este script le faltan algunas cosas para funcionar. El script completo puedes verlo y descargarlo en este enlace.

sábado, 24 de enero de 2009

Perl, MD5 y los drivers sospechosos de Windows

En Windows, los drivers que normalmente están alojados en

c:\windows\system32 y

c:\windows\system32\drivers,

pueden ejecutarse en el espacio de memoria del núcleo y por tanto, pueden hacer lo que quieran en el sistema. Estos archivos suelen tener la extensión .sys, y normalmente no se les presta atención.

Hay drivers que ya los pone Windows, otros se alojan ahí cuando instalamos algún dispositivo, y hasta hay programas que también dejan ahí su .sys para hacer cosas. Los virus también los utilizan para sus cometidos, y con más frecuencia que lo que creemos.

Se inicie el driver o no al encender el ordenador dependerá si el driver es llamado desde el registro. Para ver esto, aconsejo autoruns de Sysinternals.

A veces es difícil saber si un .sys es de fiar o no, aunque consultemos en la red. Una forma de averiguarlo es, si sospechamos de alguno, crear una carpeta en la misma carpeta donde se aloja el driver y moverlo ahí. Después reiniciamos y a ver que pasa. Si hemos movido un driver crítico del sistema, seguramente nos toque arrancar con un live-cd y volver a poner el driver en su ubicación original. Sino ocurre nada, podemos esperar a ver que pasa, y si sigue sin pasar nada, pues lo mismo ese driver no se usa.

Si da la casualidad de que hemos movido un driver que es utilizado por algún virus u otro programa malicioso, es posible que, si el virus está en memoria, lo vuelva a crear incluso con otro nombre, y aquí es donde entra el

MD5

El MD5 de un archivo es un resumen del contenido del archivo y además es único para ese archivo. Lo bueno es que ese resumen sólo ocupa 32 dígitos hexadecimales (128 bits), ocupe lo que ocupe el archivo. De esta forma, con estos 32 dígitos podemos verificar la integridad de un archivo.

Si hemos apartado los drivers sospechosos a una carpeta llamada "sospechosos", podemos calcular el MD5 de cada uno y crear un archivo de texto donde cada línea tendrá el nombre del archivo y su MD5. Después, si alguno de estos drivers sospechosos es el resultado de un virus y éste vuelve a crear el driver, aunque sea con otro nombre, para identificarlo podemos comparar los MD5 sospechosos que contiene nuestro archivo de texto con los MD5 de los archivos de las carpetas de sistema de Windows (system32 y system32\drivers) hasta que salte la coincidencia. Si el nuevo driver tiene otro nombre y el mismo MD5, se trata de un virus seguro.

Entrando en harina

Primero vamos a hacer un pequeño script en perl llamado md5.pl para sacar los MD5 de un archivo dado:

------- comienzo md5.pl -----------------------------------------------
# ramiro.encinas@gmail.com - 2009
# Tuya es la responsabilidad del buen o mal uso de este script

use Digest::MD5::File qw(file_md5_hex);

if ($ARGV[0]) {$archivo = $ARGV[0];}
else {print "\n";print "Sintaxis: perl md5.pl nombre_archivo.\n";exit;}

if ( -e $archivo )
{
    $md5 = file_md5_hex($archivo);
    print "\n";print "El MD5 de $archivo es: $md5\n";
}
else {print "\n";print "Sintaxis: perl md5.pl nombre_archivo.\n";exit;}
------- fin md5.pl ----------------------------------------------------


Con este script podemos sacar los MD5 de los archivos sospechosos. Después, en la carpeta de trabajo, creamos un archivo de texto llamado drivers-sospechosos.txt, donde cada línea contendrá cada nombre de archivo sospechoso y su MD5 correspondiente. Para separar el nombre del archivo y su MD5 utilizaremos "::" como vemos en este ejemplo:

data.sys::ee2f07a2d1f81e2f5a8a454f61d9395a

Cuando tengamos drivers-sospechosos.txt lleno con los archivos (drivers) sospechosos y sus MD5, y además tengamos movidos dichos archivos a la carpeta "sospechosos", podemos esperar unos días y ejecutar el siguiente script que realizará la búsqueda-comprobación:

------- comienzo drivers-sospechosos.pl ----------------------------------------

# Los drivers sospechosos de c:\windows\system32 y c:\windows\system32\drivers
# han sido movidos a la carpeta "sospechosos" que está en la misma carpeta donde
# estaba el driver sospechoso.

# Cada uno de los nombres de estos drivers sospechosos junto con su MD5 están en
# una línea de drivers-sospechosos.txt, y éste archivo está en la carpeta de trabajo.

# Este script busca los MD5 de los archivos de drivers-sospechosos.txt
# en c:\windows\system32 y c:\windows\system32\drivers
# para comprobar si existe alguna coincidencia.

# Este script asume que la carpeta de trabajo es 
# C:\WORKSPACE\drivers-sospechosos 
# y que dentro está el archivo drivers-sospechosos.txt con los nombres y MD5 
# de los archivos sospechosos, uno por línea y este mismo script, claro.

# Este script también asume que por cada línea de drivers-sospechosos.txt hay
# un nombre de driver sospechoso, una separación "::" y su MD5.

# ramiro.encinas@gmail.com - 2009
# Tuya es la responsabilidad del buen o mal uso de este script

use Digest::MD5::File qw(file_md5_hex);

# Ubicación del archivo con los archivos sospechosos

$path_filein = "C:\\WORKSPACE\\drivers-sospechosos\\drivers-sospechosos.txt";

# Función principal

sub todo 
{
    # Apertura drivers-sospechosos.txt
    open f_drivers, $path_filein or die "No puedo abrir $path_filein";
    $c = 0; #Número de coincidencias
 
    while( ) # Abro drivers-sospechosos.txt y lee línea a línea
    {
        chomp $_; # Quita el fin de línea, que si se queda esto no funciona
  
        $_ =~ /(.*)::/; # Extrae el nombre del archivo 
        $filein = $1; # y lo pone en $filein
  
        $_ =~ /::(.*)/; # Extrae el MD5 del archivo 
        $fileinmd5 = $1; # y lo pone en $md5
  
        $path = "C:\\WINDOWS\\system32\\"; 
        proceso($path,$filein,$fileinmd5); # Búsqueda en system32
  
        $path = "C:\\WINDOWS\\system32\\drivers\\";  
        proceso($path,$filein,$fileinmd5); # Búsqueda en drivers
    }
    close f_drivers; # Cierra drivers-sospechosos.txt
    print "\n";
    print "Coincidencias: $c\n"; # Muestra número de coincidencias
}
 
# Función de búsqueda por cada $path

sub proceso($path,$filein,$fileinmd5) 
{
    opendir DIRECTORY, $path or die; # Abre la carpeta $path
 
    # Recorre $path y deja en $file cada nombre de archivo
 
    while ($file = readdir(DIRECTORY)) 
    {  
        if ( -d $path.$file ){# $file es un directorio}
        else # $file es un archivo
        {  
            $filemd5 = file_md5_hex($path.$file); # Calcula el MD5 de $file
   
            if ($filemd5 eq $fileinmd5) # Si los MD5 coinciden, premio
            {
                print "\n";
                print "Cuidadito, $path$file tiene el mismo MD5 que $filein.\n";
                $c++;
            }
        }
    }
}

todo();

------- fin drivers-sospechosos.pl ---------------------------------------------

Este proceso normalmente tarda un buen rato, así que podeis ir a preparar un café y esperar a que a la vuelta no haya premio.

viernes, 16 de enero de 2009

Asegurando a Apache2

Llevo poco tiempo con Apache2 en Debian etch (la versión estable actual) y lo que me interesa es realizar un sitio web con comunicación cifrada (OpenSSL) y que tenga algún directorio privado protegido con nombre de usuario y contraseña.

La instalación y configuración de Apache2 con soporte de OpenSSL no da problemas en Debian etch, pero el tema de la autenticación del directorio privado me hizo dar más vueltas.

La documentación de Apache2 ofrece un sistema de autenticación simple que requiere un archivo con los nombres de los usuarios para autenticarlos, pero, ¿quien quiere crear un archivo con usuarios cuando ya tenemos usuarios locales? De la misma forma, utilizar el soporte de autenticación con MySQL (auth_MySQL) supone trabajo extra, aunque es más eficiente si tenemos que autenticar a una montaña de usuarios.

Al final llegué al sistema de autenticación PAM. PAM tiene bastantes implementaciones para autenticar incluyendo a Apache2 y permite autenticar a los usuarios locales que queramos, utilizando un grupo para ello. No obstante, una vez instalado el módulo de PAM para Apache2, hay que realizar una serie de ajustes en el sistema para que funcione.

He documentado todo el proceso aquí, para tenerlo como referencia.

La persistencia del adware

Fragmento extraido de http://philosecurity.org/2009/01/12/interview-with-an-adware-author

¿Puedes contarnos más sobre como hacer que el adware sea complicado de eliminar en un ordenador?

Si. Primero prefiero contarte como funciona el adware. El objetivo fundamental del adware son los usuarios de Internet Explorer porque obviamente es el más utilizado en el mercado. Además, tienden a ser los más ingenuos. Si utilizas IE quiere decir que, o no pones cuidado, o no sabes nada sobre vulnerabilidades en IE.

IE tiene un mecanismo llamado Browser Helper Object (BHO), que básicamente es un trozo de código ejecutable que consigue información de las solicitudes web que se están produciendo. Esto corre en el proceso actual del navegador, quiere decir que puede hacer cualquier cosa que pueda hacer el navegador - y esto básicamente quiere decir: cualquier cosa. Nosotros podemos tener un BHO que actualmente es el servidor de ads, y lo hemos realizado de forma que para eliminarlo tengas que eliminar todas las instancias del navegador. Esto es una pequeña parte en cuanto a la persistencia.

Si además tienes un instalador, un pequeño ejecutable, puedes crear una entrada en el Registro para que en cada reinicio el instalador compruebe que el BHO existe. Si existe, bien. Sino existe lo instala. Esto funciona hasta que alguien elimina el ejecutable.

Lo siguiente es crear un ejecutable que continuamente compruebe cada 10 segundos que el BHO está activo y en su sitio. Si así es, perfecto. Sino, el ejecutable lo instalará. Para asegurarse de que el ejecutable sea dificilmente detectable, desarrollamos un algoritmo para hacer que los nombres de estos ejecutables sean aleatorios, a la vez que estén relacionados con el ordenador anfitrión y que sea complicado descubrirlos. Creo que utilizabamos los primeros 6 u 8 caracteres de la codificación DES de la dirección MAC del ordenador. Codificas la MAC con DES, tienes en cuenta los primeros 6 u 8 caracteres y ya está. Esto está muy bien. La pega es que el archivo en sí podía ser el mismo binario. Si sumas el MD5 del archivo siempre sería el mismo, y siempre estaría en el mismo ordenador (con esa MAC).

Lo siguiente que hicimos fue una función para repartir funciones, que podía ir dentro de un ejecutable, tomando funciones y repartiéndolas aleatoriamente, de forma que las firmas de los archivos estén mezcladas. También mezclábamos un montón de punteros con cada función corriendo. Esto cambia completamente la forma del ejecutable.

Luego creamos un lanzador, que es un minúsculo trozo de código escrito en ensamblador que descifraba el ejecutable en memoria y lo ejecutaba. Al mismo tiempo también creabamos un proceso ejecutable virtual. Nunca he oído que alguien hiciera esto antes. Windows tiene una cosa llamada Create Remote Thread. Semánticamente quiere decir: eres un proceso, yo soy un proceso distinto, puedo llamarte y decirte "¡Oye! tengo este código, y me gustaría que lo ejecutaras". Tu dices "Claro" porque eres un proceso de Windows -tu eres un hippie que crees en el amor libre-. Los procesos de Windows, dicho sea de paso, son peligrosamente promíscuos. Por tanto, podemos pillar unos cuantos procesos de Windows y darles un trozo de código para que lo ejecuten. Cada proceso conoce a los dos anteriores (el anfitrión y el que le hemos dado que es el trozo de código), y de esta forma podemos hacer un anillo para que se ayuden mutuamente, ¿ok?.

Hasta ahora tenemos una entrada en el registro, un ejecutable, nombres aleatorios para ejecutables, un ejecutable que es repartido en cada ordenador, uno de ellos está cifrado -y para más ofuscación- un ejecutable que ni siquiera se ejecuta como tal. Esto se ejecuta simplemente en forma de hilos. Ahora, esos hilos pueden comunicarse entre sí, pueden comprobar que el BHO está activo, y que cualquier otro software que queramos también esté bajo control.

Hay una cosa más avanzada que empezamos a realizar pero no terminamos de probar, y es prescindir de los hilos y utilizar los manejadores de las interrupciones.Resulta que en Windows puedes acceder facilmente al manejador de interrupciones. De hecho, puedes registrar con el OS un trozo de código para manejar una interrupción dada. Todo lo que tienes que hacer es pillar una interrupción, y cuando ésta se inicie, haces tu trabajo y listo. Nunca hemos hecho esto pero es algo que estamos pensando hacer.

Creamos claves de registro y nombres de archivos que no se podían modificar, explotando una "desajuste de impedancia" entre la API de Win32 y la API de NT. Windows XP está basado en el kernel de NT. La mayor parte de NT es un sistema Unicode, y debido a ello, los strings internamente son Unicode de 16-bit. La mayor parte de la API Win32 es ASCII. Existen strings que puedes expresar como Unicode 16-bit pero no puedes expresar en ASCII. Sorprendentemente, puedes ver cosas con un Null en medio de ello.

Esto quiere decir que podemos, por ejemplo, escribir una clave de Registro que contenga un Null. Debido a que la interfaz de usuario está basada en la API Win32, éste podría ver la clave, pero no podría modificarla porque no sabría interpretar el Null. De esta forma podemos hacer que las claves del Registro sean invisibles o inmodificables para cualquiera que utilice la API Win32. Esto es muy interesante, no para la gente común, pero sí para nuestros competidores y para las compañías antivirus.

También escribí un controlador y luego un controlador de impresora. Cuando escribes un controlador puedes hacer las cosas más locas que puedas imaginar, incluso más locas todavía que pudieras hacer normalmente con Windows. Esto ocurría cuando Eliot Spitzer demandó a la compañía y empezó a decaer. Tomaron una mala decisión justo cuando empezaron a dar más visibilidad a la compañía y entonces todo el mundo al mismo tiempo me quería para deshacerse de nuestros competidores y nosotros mientras tanto trabajando en todo lo anterior.

Por supuesto que se trataba de un plan. No nos gustaba escribir un nuevo programa en C cada vez que queríamos echar a alguien fuera de una máquina. Todo el mundo decía, "Lo que necesitamos es algo configurable". Yo decía, "Instalemos un lenguaje basado totalmente en Turing", y para eso utilicé tinyScheme, que es un intérprete muy pequeño y rápido con licencia BSD que puede compilarse en un ejecutable de 20kb, si sabes lo que estas haciendo.

A veces, en vez de escribir ejecutables independientes, utilizamos un gusano, así podemos escribir código, lo ponemos en el servidor, e inmediatamente las cosas deberían oscurecerse, llegando a repartirse el código en una guerra de entre 4 y 10 millones de nodos en red.