lunes, 26 de octubre de 2009

Mi Mouse NO Funciona en Word 2007

Si notas que con el mouse no puedes ubicarte sobre alguna posición en particular o sombrear alguna palabra y finalmente te das cuenta que no puedes hacer nada sobre el documento de word sobre el cual estas trabajando, sino que sólo puedes seleccionar opciones del menú principal, entonces tu problema podría deberse a que tienes activo el complemento de Word: PowerDesigner 12.0. Si ese fuera el caso, para solucionar el problema de inutilización del mouse deberás desactivar el complemento como sigue:

1. Seleccciona el menú principal de Word.


Haz clic sobre el botón: "Opciones de Word".

2. Sobre la pantalla que se muestra, haz clic sobre la opción: "Complementos":


3. En la sección de complementos activos, selecciona el complemento relativo a PowerDesigner 12.0 y haz clic sobre el botón "Ir".


4. Se te mostrará una ventana como ésta, en donde deberás selecccionar y desmarcar el complemento de referencia.


5. Una vez desmarcado el coplemento, haz clic sobre el boton "Aceptar", reinicia Word y listo.


martes, 3 de febrero de 2009

Secuestro de Formatos en Sitios WEB

(Artículo original en inglés: anders.com)

Lo Que Pasa

Los generadores de SPAM son frecuentemente incluidos en las listas negras y expulsados de las redes. A causa de esto, truquear un sitio web que no envía SPAM y convertirlo en uno que si envíe SPAM se ha vuelto una prioridad para ellos. Una forma de los generadores de SPAM para encontrar servidores web vulnerables, es probar aplicaciones CGI (Common Gateway Interface)que permita esclavizar al servidor web. Una vez encontrado un servidor web vulnerable, el generador de SPAM puede disfrazar el verdadero origen de su SPAM, mientras que el servidor WEB esclavizado hace el trabajo pesado.

¿Cómo lo Hacen?


Una tarea común realizada por los sitios web es enviar un correo electrónico al propietario del sitio web con los datos que alguien haya ingresado en una forma. Por ejemplo, un "script" que haga justamente esto, se llama formmail.pl o formmail.cgi del archivo de scripts de Mat. En este "script", así como en muchos otros similares, algunos campos en la forma se utilizan directamente en el encabezado ("header") de un correo electrónico ("email").(Por ejemplo el campo "Responder a:" de un correo electrónico algunas veces toma el valor de lo que sea que el usuario de la forma haya ingresado en el campo llamado "email", de modo que el propietario del sitio web pueda hacer click rápidamente en el botón "Reply" para enviar una respuesta al correo electrónico. Si estos campos se incluyen sin modificación, un generador de SPAM puede simplemente sobre escribir el resto de las líneas de encabezado y efectivamente enviar cualquier correo electrónico que deseen a través del sistema correo electrónico subyacente,efectivamente esclavizando el servidor web y el sistema de correo para enviar SPAM.

¿Cómo exactamente explotan el "script"?

El destino de un correo electrónico esta puesto en sus encabezados. Los encabezados, como todo lo demás en un correo electrónico, sólo son líneas de texto. Lo que separar a los encabezados del cuerpo de un correo electrónico son solamente dos líneas en blanco. Si tu "script" de la forma de correo coloca cualquier cosa en el encabezado de un correo electrónico que esta inalterado con respecto a lo que los usuarios de la web introdujeron, podrían agregar fácilmente esas dos líneas en blanco. Esto, naturalmente, únicamente truncaría los encabezados antes y hace que el cuerpo del correo electrónico contenga algo de los encabezados también. Sin embargo si el usuario de la web decide agregar unos cuantos encabezados más antes de enviar las dos líneas blancas, el sistema de correo subyacente escuchará aquellos encabezados también ; así que lo que los generadores de SPAM estan haciendo es incluir una "CCO:" ("Bcc:") lista de víctimas de spam al correo electrónico. Cuando el subsistema de correo tien el correo electrónico, sigue ciegamente lo que esta escrito en los encabezados y felizmente envía una copia del mensaje a cada persona listada en la línea "CCO:" ("Bcc:"). Ahora naturalmente los geenradores de SPAM probablemente también agregarán su propia línea de "Asunto:" y algo de contenido SPAM en el correo electrónico.

Con objeto de encontrar los servidores web vulnerables , los generadores de SPAM generalmente prueban la "forma" enviando un correo de muestra copiando de forma oculta ("CCO:") a una dirección de correo electrónico a la que ellos tengan acceso y que puedan desechar en cualquier momento. Los administradores de sitios web se dan cuenta de esto cuando reciben de 5 a 10 correos en menos de 1 segundo.

¿Y que podemos hacer al respecto?

La manera más sencilla de mitigar el peligro es deshabilitar cualquier caracter "linefeed" or "carriage return" en campos utilizados en los encabezados del correo electrónico y en consecuencia deshabilitando la posibilidad de un atacante de agregar esas dos líneas en blanco y truquear tu sistema de correo para enviar lo que a ellos se les antoje. Entonces el problema se convierte en una tarea de limpieza de código mas que estar esclavizado a perseguir generadores de SPAM.

¿Eh? ¿Cómo le hago?

Bueno, aquí es donde se vuelve un poco complicado. La respuesta a esta cuestión depende de que software este ulizando el procesador de "formas" en tu servidor web. Si no escribiste tu propio procesador de "formas", tu primer paso es probablemente preguntar a la gente que te ayudó a configurar tu sitio web. Las formas procesadoras de correo más comunes han tenido arreglos de problemas ("bug fixes") liberados desde que esta vulnerabilidad apareció. ¿Tu proveedor de servicios de "hosteo" ha actualizado su código para el posteo de "formas"?

Si sabes lo que estas haciendo, checa todos los campos en las "formas" que se utilizan en los encabezados de correo electrónico y elimina los caracteres "carriage return" (\r) y "line feed" (\n). En perl, se hace así:

$field =~ s/\r//g; $field = ~ s/\n/ /g;

Si estas utilizando PHP, puedes hacer esto para cada variable utilizada en los encabezados de correo electrónico:

$_POST['email'] = preg_replace("/\r/", "", $_POST['email']);
$_POST['email'] = preg_replace("/\n/", "", $_POST['email']);

¿Cómo se si he sido atacado?

Como la mayoría de los "scripts" de formatos para enviar correo no escriben en algún lugar de un archivo lo que estan haciendo, la mejor manera de distinguir si tu configuración ha sido esclavizada para enviar SPAM es verificar tus "logs" del servidor de correo. Si estas con proveedor de servicios de "hosteo", generalmenete ellos puedes verificar esto por ti.

¿Que debería hacer si he sido atacado?

Deberías actualizar tus "scripts" de formatos para envió de correo electrónico de modo que intentos repetitivos no sean exitosos. (hazlo como se describió antes). Luego podrías rastrear la dirección de correo electrónico desechable que utilizó el generador de SPAM para probar la vulnerabilidad.

Bien, estoy limpio. ¿Ahora cómo detengo los molestos correos de prueba?

De nuevo, pregunta a tu proveedor de servicios de "hosteo". Sin embargo, si tu has hecho las ediciones por tu cuenta, busca una huella en el correo electrónico que lo señale como obviaente malo. Como si el campo de correo contiene los caracteres "Bcc:" ("CCO:"), es muy probable que estes viendo una prueba de vulnerabilidad. Nada mas coloca un enunciado "if" alrededor del bloque de código que te envía un correo que prueba la vulnerabilidad. No olvides ignorar las mayúsculas dado que "Bcc:" y "bcc:" funcionan igual. Alternativamente podrías buscar sólo las dos líneas en blanco, sin embargo debes tener cuidado con "\r\n\r\n" y con "\n\n" ya que las dos opciones se interpretan como dos líneas en blanco. Si vas a proceder de sta manera, Te sugiero que quites primero todas los caracteres "\r" y luego busques "\n\n".

¿Qué mas puede hacerse?

Una mejor (aunque mas complicada) manera de hacer esto es requerir algo que es fácil de hacer para un humano pero difícil para una computadora. Tal método que es bastante popular es utilizar una imágen Captcha con algún texto en ella que el usuario deberá introducir en la forma antes de enviarla. Puedes también encontrar otro método de reconocimiento de figuras en JustHumans.com

Quiero una explicación más técnica con un ejemplo!

Considera una forma CGI que acepta una variable de "forma" llamada "reply- to" la cual se inserta en los encabezados de un correo de comentarios enviado al administrador del sitio web ("webmaster"). El correo resultante que el CGI envía al sistema de correo local se vería asi:

From: My Comment Form
To: me@example.com
Reply-To: webuser@company.com
Subject: New Comment!

I like your website. Thanks for the resource.

El sistema de correo subyacente obtiene este correo y lo procesa como lo esperarías, enviando una copia de este mensaje a me@example.com.

Ahora, un generador de SPAM quiere atacar esta "forma", así que llena todos los campos como vimos antes pero envía lo siguiente a la variable de la "forma" CGI llamada "reply-to":

webuser@company.com
Bcc: joe@foo.com, jane@bar.com
Subject: Compra Viagra!

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Consigue tu viagra aquí! http://xxx.viagra.com/xxx
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

Luce peligroso, ¿no?. Con un procesador de "formas" no verificado, el correo electrónico resultante enviado al subsistema de correo se vería así:

From: My Comment Form
To: me@example.com
Reply-To: webuser@company.com
Bcc: joe@foo.com, jane@bar.com
Subject: Compra Viagra!

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Consigue tu viagra aquí! http://xxx.viagra.com/xxx
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!


Subject: New Comment!

I like your website. Thanks for the resource.

Debido a que la variable CGI "reply-to" incluye caracteres "new-line" y una gran cantidad de direcciones para SPAM, el atacante puede engañar al que envía el correo haciéndolo pensar que la línea "Bcc:" ("CCO:") y la línea "Subject" son legítimas. De esa forma joe@bo.com y jane@bar.com obtienen un correo con el Asunto "Compra Viagra!".

Otra vez, para protegernos de esto, sólo necesitamos deshacernos de los caracteres return ("\r") y "newline" ("\n"), en todos los campos de la "forma" CGI utilizados en los encabezados del correo electrónico. Si lo hicimos, el correo electrónico para el subsistema subyacente se vería así:

From: My Comment Form
To: me@example.com
Reply-To: webuser@company.comBcc: joe@foo.com, jane@bar.comSubject: Compra Viagra!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!Consigue tu viagra aquí! http://xxx.viagra.com/xxx!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

Subject: New Comment!

I like your website. Thanks for the resource.

y el subsistema de correo subyacente enviaría el correo como se esperaba.


viernes, 26 de diciembre de 2008

Maestro-Esclavo con MySQL

En cierta ocasión surgió la necesidad de contar en forma centralizada y con un retraso menor a una hora con la información que se estaba generando en cualquiera de las sucursales, por lo que se implementa una solución que a continuación se detalla, considerando que en todas las sucursales se cuenta con MySQL y servidores ya sea Linux o Windows.

Con anterioridad se había definido e implementado una vpn para tener acceso a los servidores de cada sucursal de forma remota.

La idea es que cada una de las bases de datos contenidas en los respectivos servidores de cada sucursal sea replicada de forma casi inmediata al servidor LINUX ubicado en las oficinas corporativas.

Con esto en mente definiremos a cada uno de los servidores de cada instalación como maestro; es decir, la instancia de MySQL que se esté ejecutando ya sea en un servidor Windows o en un LINUX será la que mande o le indique a una instancia esclava ubicada en el anteriormente mencionado servidor LINUX que debe replicar la instrucción SQL realizada en la base de datos maestra.

Para cada sucursal, el puerto de MySQL siempre será el de omisión: 3306 y la identificación de los servidores dentro del archivo de configuración para MySQL, my.cnf será el indicado en la columna master de la tabla que aparece a continuación:




server-id






sucursal

instalación

pto. En corporativo

master

slave

S.O.

ip de la vpn

A

baseA

3307

107

307

linux

192

168

253

10

B

baseB

3308

108

308

win

192

168

253

12

C

baseC

3309

109

309

linux

192

168

253

14

D

baseD

3310

110

310

win

192

168

253

16

E

baseE

3311

111

311

win

192

168

253

18

Tabla 1.

En la instalación del corporativo, los parámetros para cada instancia del servicio MySQL están definidos en el archivo de configuración mysql.cnf ubicado en el directorio /etc, de acuerdo a lo especificado en la Tabla 1.

COMO DEFINIR LA PARTE MAESTRO DE LA RELACION MAESTRO-ESCLAVO PARA MYSQL.

1. Editar my.cnf (o my.ini si el sistema operativo es Windows)

1.1. Comentar (si existen), las líneas:

skip-networking

bind-address = 127.0.0.1

1.2. Incluir las líneas:

Para Linux:

log-bin = /var/log/nombre-sucursal-bin.log (para Linux)

Para Windows:

log-bin = c:\Archivos de programa\Mysql\Mysql Server 5.0\nombre-sucursal-bin.log

Para Linux y para Windows:

binlog-do-db = nombre-base

server-id = número

Sustituir nombre-sucursal por el nombre de la sucursal de la que se trate, por ejemplo: A.

Sustituir nombre-base por el nombre de la base de datos que esté utilizando en la sucursal, por ejemplo: baseA.

Sustituir número por el número que corresponda, indicado en la columna master de la Tabla 1, siguiendo con nuestro ejemplo: 102.

1.3. Guardar los cambios y salir del editor.

1.4. Reiniciar MySQL

service mysqld restart

1.5. Crear usuario esclavo

mysql –u root [-ppassword]

Nota: si el usuario root tiene contraseña (como debería de ser), escribirla después del modificador –p y sin dejar ningún espacio.

mysql>CREATE USER esclavo IDENTIFIED BY ‘password’;

mysql>GRANT REPLICATION SLAVE ON *.* TO esclavo@’%’ IDENTIFIED BY ‘password’;

mysql>FLUSH PRIVILEGES;

mysql>use nombre-base;

mysql>FLUSH TABLES WITH READ LOCK;

Con esto aseguramos que ningún usuario pueda modificar las tablas de la base de datos, se recomienda dar aviso de que se salgan para evitar contratiempos.

mysql>SHOW MASTER STATUS;

Debemos tomar nota de la información mostrada como resultado del comando, ya que se utilizará mas tarde.

Ejemplo:

+---------------+----------+--------------+------------------+
| File | Position | Binlog_do_db | Binlog_ignore_db |
+---------------+----------+--------------+------------------+
| mysql-bin.006 | 183 | exampledb | |
+---------------+----------+--------------+------------------+
1 row in set (0.00 sec)

mysql>quit;

1.6. Respaldar la Base de Datos

mysqldump –u root [–ppassword] --opt nombre-base [|bzip] > nombre-base.sql[.bz2]

1.7. Quitar el bloqueo a las tablas

mysql –u root –p[password]

mysql>UNLOCK TABLES;

mysql>quit;

1.8. Pasar el respaldo realizado al servidor esclavo

1.8.1. Opción 1: Vía SCP

scp nombre-base.sql[.bz2] root@192.168.253.1:nombre-base.sql[.bz2]

donde 192.168.253.1 es la dirección ip, correspondiente al servidor Linux del corporativo, visto desde el punto de vista de la vpn.

El archivo quedará en el directorio /home de root en el servidor esclavo.

1.8.2. Opción 2: Vía GoToAssist

Transferir el archivo con la herramienta de soporte GoToAssit al servidor esclavo.

COMO DEFINIR LA PARTE ESCLAVO DE LA RELACION MAESTRO-ESCLAVO PARA MYSQL.

1. Editar el archivo de configuración my.cnf

Entrando con el usuario root al servidor:

cd /etc

nano my.cnf

Incluir las siguientes líneas:

[mysqldxxx]

socket = /tmpmysqldxxx.sock

port=yyyy

pid-file= /var/lib/mysqlxxx/localhost.pid

datadir= /var/lib/myqlxxx

user=root

log-error= /var/log/mysqldxxx.log

#server-id=xxx

#master-host=192.168.253.nnn

#master-user=esclavo

#master-password=password

#master-connect-retry=60

#replicate-do-db=nombre-base

#replicate-ignore-db=sfcontrol

#replicate-ignore-db=mysql

#replicate-ignore-table=nombre-base.JOURNAL

Donde:

xxx es el número de identificación de la instancia de mysql del esclavo para la base en cuestión, de acuerdo a lo indicado en la columna slave de la Tabla 1.

yyyy es el número de puerto asociado a la instancia de mysql del esclavo para la base en cuestión, de acuerdo a lo indicado en la columna pto. en corporativo de la Tabla 1.

nnn es el número de la última parte de la dirección ip del servidor maestro, de acuerdo a lo indicado en la columna ip de la vpn de la Tabla 1.

nombre-base es el nombre de la base de la base a replicar, de acuerdo a lo indicado en la columna instalación de la Tabla 1.

2. Guardar y salir del editor

3. Crear directorio para la instancia de mysql

mkdir /var/lib/mysqlxxx

4. Instalar la nueva base en el servidor esclavo

mysql_install_db --datadir=/var/lib/mysqlxxx

5. Verificar que existan las bases mysql y test

En el directorio /var/lib/mysqlxxx deben existir las bases mysql y test.

6. Iniciar la nueva instancia

mysqld_multi start xxx

7. Crear la Base de Datos esclava

mysql –h 127.0.0.1 –port=yyyy -u root –p

Enter password:

mysql>CREATE DATABASE nombre-base;

mysql>quit;

8. Cargar el respaldo que se hizo en el master

Si se utilizó bzip2:

bunzip2 nombre-base.sql.bz2

mysql –h 127.0.0.1 –port=yyyy –u root [-ppassword] < nombre-base.sql

9. Editar el archivo de configuración my.cnf

Para la instancia que estemos trabajando eliminar el # de las líneas que lo tienen descritas en el punto 1 de esta sección.

Guardar y salir del editor.

10. Reiniciar el servicio para la instancia que estamos trabajando

mysqld_multi stop xxx

mysqld_multi start xxx

11. Iniciar sincronización

mysql –h 127.0.0.1 --port=yyyy –u root [-ppassword]

mysql>SLAVE STOP;

mysql>CHANGE MASTER TO MASTER_HOST=’192.168.253.nnn’, MASTER_USER=’esclavo’, MASTER_PASSWORD=’password’, MASTER_LOG_FILE=’sucursal-bin.sss’, MASTER_LOG_POS=pos;

· MASTER_HOST es la dirección ip del servidor maestro

· MASTER_USER es esclavo

· MASTER_PASSWORD es password

· MASTER_LOG_FILE es el nombre del archivo que se mostró cuando dimos la instrucción SHOW MASTER STATUS en el servidor maestro, como indicamos en la sección anterior.

· MASTER_LOG_POS es el número que aparece en la columna Position de la tabla que aparece como resultado de la instrucción SHOW MASTER STATUS en el servidor maestro, como indicamos en el ejemplo de la sección anterior.

mysql>SLAVE START;

mysql>SHOW SLAVE STATUS;

Verificar que se esté realizando la replicación automática.

mysql>quit;