martes, 24 de mayo de 2016

Esteganografía con ficheros de audio WAV



Podéis ver mi artículo sobre el "Esteganografía con ficheros de audio: enviar documentos secretos en tus canciones preferidas" en el blog de Chema Alonso "Un informático en el lado del mal".

Esta es la dirección del post http://www.elladodelmal.com/2016/05/esteganografia-con-ficheros-de-audio.html


Un saludo!

martes, 3 de mayo de 2016

Apagar y encender el router de una manera muy vaga


¿Cuántas veces te has visto en el caso de que el Internet de tu casa ha dejado de ir hasta que has apagado y encendido el router? Muchas verdad...?


Bueno, pues a mi también me ha pasado, lo malo, es que yo tengo el router a 2km de distancia (en mi casa no llega ni el cobre de telefónica...). Para ello, y después de ver que había una necesidad real de plantearse una solución. Cogí una raspberry PI con un módulo de relé y le configuré una tarea de cron para ejecutar el siguiente código (Python) cada 5 minutos (le podemos poner el nombre que nos de la gana siempre y cuando nos acordemos...):


#!/usr/bin/python
# -*- coding: utf-8 -*-

import RPi.GPIO as GPIO

import time, sys, os

ipTest = "8.8.8.8"

relayRouter = 7
segundosApagado = 30

GPIO.setwarnings(False)

GPIO.setmode(GPIO.BOARD)

# Declaración de modos de los pines

GPIO.setup(relayRouter, GPIO.OUT)

resultPing = os.system("ping -c 1 " + ipTest)


if resultPing != 0:

        print "No hay internet. Apagando el router durante %d segundos" % segundosApagado
        GPIO.output(relayRouter, GPIO.HIGH)
        time.sleep( segundosApagado )
        print "Encendiendo el router."
        GPIO.output(relayRouter, GPIO.LOW)

exit(0)




Como podéis ver, el código es muy sencillo. Simplemente hace un intento de ping a la ip del DNS principal de Google, y en caso de fallar, desconecta e router durante 30 segundos y lo vuelve a encender, lo que hace que el Internet vuelva de forma mágica...

Para automatizar la ejecución del script cada 5 minutos, haremos lo siguiente:

  1. ejecutaremos el comando "crontab -e"
  2. añadiremos la siguiente linea "*/5 * * * * /rutadelfichero.py" (sin las dobles comillas y sustituyendo por nuestra ruta y nombre de fichero que le hayamos puesto)
  3. guardamos los cambios y ya estaría


Más adelante pondré fotos de como se realiza el cableado y de como saber la versión de GPIO de nuestra Raspberry PI para configurar los pines correctamente. Aquí un pequeño adelanto...



Un saludo!


viernes, 26 de febrero de 2016

Repositorio GIT script BASH backups en sistemas *NIX



Buenas noches amigos.

En esta ocasión os traigo un enlace a uno de mis repositorios de GitHUB

https://github.com/sylm87/bashckNIX

Dicho repositorio, contiene un script de backup para sistemas *NIX, el cual dispone de las siguientes opciones:


  • Puedes decidir si guarda un backup local en disco mediante rsync(a veces no interesa por espacio).
  • Selección de los directorios de los cuales se quiere realizar backup.
  • Opción de realizar backup remoto rsync +  ssh
  • Compresión en la parte del servidor (libera a tu ordenador de la carga de la compresión del backup) para que si utilizas un equipo compacto no lo calientes y además puedas trabajar sin problemas de rendimiento de CPU.
  • Utilización de RSA para conectar con el equipo remoto (la configuración aun es manual)
  • Numero de backups anteriores guardados (comprimidos en tar.gz) a gusto en el equipo remoto (en local aun no tiene la opción)
  • numero de sincronizaciones rsync (backups diferenciales) antes de un full-backup

El script aun está en desarrollo, pero si quieres usarlo, ya puedes hacerlo. Yo mientras iré añadiendo funcionalidades y corrigiendo fallos, para hacer un señor script de backups jejeje.


Un saludo!

jueves, 1 de octubre de 2015

Instituto en apuros por una mala administración de los sistemas.



Si señores, tal y como dice el título de la entrada, este post trata de una broma que hicimos al administrador de sistema lliurex en un sistema de login remoto, el cual estaba mal gestionado/configurado. Los fallos de seguridad eran muy graves, para que os hagáis una idea, si alguien metía un pendrive en uno de los equipos del instituto, podías hacer que dicho contenido se volcase donde tú quisieras.

Lo que hicimos fue generar un script para la prueba, el cual no dejaba trabajar al usuario, porque generaba por toda la pantalla una fotografía un poco “molesta?” llegando a saturar la maquina y dejándola pillada. Dicho programa se cargaba de manera remota desde el servidor central a todos los usuarios que hacían login en los equipos clientes (en la ejecución del .bashrc).

El script iniciador está hecho en bash y el script que genera las imagenes sin marco de ventana  está hecho en python.

A continuación os muestro un vídeo de lo molesto que resultaba tener esto cargado en el sistema ;-)


----
CONSEJO:
Cuidado con usuarios de sistema genéricos, servicios abierto en clientes de manera innecesaria y sistemas de login remoto mal configurados. La administración de sistemas no es un juego, y tratándose de una escuela estamos exponiendo la privacidad e integridad de datos del alumnado y profesorado.


Un saludo y gracias a todos.

En producción, mejor desactivar los mensajes de error

Cuando tenemos una web en producción, debemos de tener los mensajes de error desactivados para que el usuario no pueda saber como funciona por dentro, ya que damos demasiadas pistas si la persona que lo está viendo quiere atacarnos.


"Espiado" por una imagen...

Hoy os traigo algo que la mayoría de desarrolladores ya sabíamos, pero que no está de más saber para todo el que quiera saberlo (pero que lol).

Me refiero a que nuestros emails nos espían ¿COMO! O_o? Pues fácil, cuando por ejemplo nos metemos a nuestro gestor de correo online (Gmail, Hotmail, Chimichanga, etc, etc…), si al abrir los mensajes tenemos activado que automáticamente los correos con formato html carguen las imágenes, ahí ya el sitio web o empresa que te ha enviado el correo ya sabe que lo has leído y desde donde lo has leido (mediante seguimiento IP por ejemplo). 

¿Te estás preguntando por qué?

El por qué es sencillo. Muchas imágenes que se nos cargan no tienen una fuente que apunte directamente a una imagen normal colgada en un servidor contenedor de la misma. Sino que son fuentes que apuntan a fuentes dinámicas con identificación única de usuario.

¿Pero qué me estas contando?
dicho de otra manera,  con un ejemplo:

si te envían un email, que por ejemplo en una imagen pone este source:

http://servidortal/rutapascual/imagepubli?id=200&client=422445

la primera parte http://servidortal/ es el dominio del servidor
la segunda rutapascual/imagepubli es el path dentro del servidor que apunta al fichero que supuestamente cargará
y aquí en la tercera y cuarta parte la parte de espionaje

id=200&client=422445

id=200 puede que nos esté diciendo que el fichero enlazado cargue una imagen dinámica que esté identificada por el número 200

client=422445 seguramente sea nuestro id de cliente de newsletter (por ejemplo) único

Por este motivo, cuando el gestor de correo carga la página, el script que nos devuelve una imagen (el del src de la etiqueta img), seguramente tenga activo algún tipo de vigilante que cuando recibe la petición de carga con el id de usuario único, la empresa ya sabe que ese email ha sido leido por X persona en X fecha, además de saber también desde que dirección IP ha sido cargado (pudiendo hacer geolocalización del usuario).
—————-
A continuación os pongo unas capturas de ejemplo, en las que vemos que no obtenemos el mismo resultado visualizando la imagen desde un gestor online como gmail o hotmail que si lo hiciésemos a través de un gestor de correo local como outlook o thunderbird (estos segundos gestores locales nos exponen mucho más ya que no nos filtran nada al no hacernos de proxys intermediarios).

CASO 1: Ejemplo de visualización en la web de GMAIL



CASO 2: Ejemplo de visualización en el gestor de correo LOCAL


En este caso estamos tan expuestos que pueden averiguar nuestra IP, sistema y tipo de gestor utilizado entre otras muchas cosas.

CASO 3: Ejemplo de  visualización en gestor de correo de GMAIL (App de Android)


Ahora vemos que la aplicación de cliente de Gmail para Android, es simplemente un cliente de la aplicación web de Google, y por lo tanto también utiliza el proxy de Google para cargar las imágenes.

CASO 4: Ejemplo de visualización en gestor de correo móvil Android para cuentas Hotmail




Aquí podemos ver, que este gestor de correo no utiliza ningún tipo de protección proxy para la carga de imágenes, y por lo tanto es nuestro dispositivo el que descarga directamente la imagen del servidor (lo sabemos porque los datos que aparecen en la imagen son los nuestros).

CASO 5: Servidor de correo web empresarial con las políticas de seguridad bien configuradas



Este gestor de correo, aunque no nos haga de intermediario de la descarga de la imagen, simplemente no nos la carga al hacer una lectura de cabeceras de correo electrónico y ver que algo no cuadra (efectivamente las cabeceras del correo están manipuladas). Y aunque podamos cambiar las políticas para este remitente y dejarnos cargar la imagen, ya somos nosotros los que decidimos arriesgarnos a cargarlo teniendo en cuenta las consecuencias de lo visto anteriormente en los otros ejemplos ;-).

—————-
CONCLUSIÓN:
Si no queréis estar tan controlados, activar que no se carguen las imágenes automáticamente, excepto a vuestra expresa petición y sabiendo que el remitente sea lo más altamente fiable posible (y aun asi sigue habiendo riesgos…)

sábado, 26 de septiembre de 2015

¿Qué esconde http://www.omfgdogs.com? xDD

El otro día, mi amigo Thomás me pasó un enlace a la página http://www.omfgdogs.com y me quedé un poco pillado cuando ví aparecer lo siguiente:


Lo que vemos en la imagen de arriba, es una serie de perritos repetidos por toda la pantalla corriendo en bucle.

Si inspeccionamos el código fuente, podemos ver que captura los eventos de las pulsaciones del teclado.


En este caso, podemos ver que el evento "keydown" incluye el siguiente código:


function(e) {
  kkeys.push(e.keyCode);
  if (kkeys.toString().indexOf(konami) >= 0) {
    if (triggered == false) {
      triggered = true;
      kkeys.length = 0;
      soundManager.stopAll();
      $("body").append("<div><video class='centre' id='stormvind' autoplay controls loop width='window.innerWidth' height='window.innerHeight'><source src='stormvind.webm' type='video/webm'></video></div>");
      var video = document.getElementById("stormvind");
    } else if (triggered == true) {
      triggered = false;
      $("#stormvind").remove();
      soundManager.play('omfgdogs');
    }
  }
  while (kkeys.length >= konami.split(',').length) {
    kkeys.shift();
  }
}


Podemos observar que la tecla pulsada es buscada dentro de una variable, y si buscamos esa variable, vemos que se inicializa en el fichero wat.js de la siguiente manera:

var kkeys = [], konami = "38,38,40,40,37,39,37,39,66,65";

 Dichos valores tienen un significado, el cual es el siguiente:

38 = Flecha arriba
38 = Flecha arriba
40 = Flecha abajo
40 = Flecha abajo
37 = Flecha izquierda
39 = Flecha derecha
66 = B
65 = A
(Según mis amigos de Puerta de Hades, se trata de un truco usado en los juegos de antaño de la compañía Konami :-) )


Volviendo al script, nos dice que si el valor de la tecla pulsada se encuenta dentro de la variable konami, se cumple la primera condición:

if (kkeys.toString().indexOf(konami) >= 0)

 La segunda condición a cumplir, es que la variable triggered sea false, y como vemos en la siguiente linea del archivo wat.js, ya está declarada al inicio como false:

var triggered = false;
 
por lo cual, la siguiente condición también se cumple:

if (triggered == false)

A continuación resumimos un poco lo que continúa en la función, en las cosas más importantes.

pone triggered en true para evitar más lecturas del teclado hasta que este bloque de código haya sido procesada:

triggered = true;

Y ahora mostramos la parte del código que más mola (xD):

$("body").append("<div><video class='centre' id='stormvind' autoplay controls loop width='window.innerWidth' height='window.innerHeight'><source src='stormvind.webm' type='video/webm'></video></div>");

Que lo que hace es lo siguiente, en la etiqueta body nos añade el siguiente html:

<div><video class='centre' id='stormvind' autoplay controls loop width='window.innerWidth' height='window.innerHeight'><source src='stormvind.webm' type='video/webm'></video></div>

Que como podéis ver, no es nada más que un video con la música del bucle de los perritos de la web pero sin acelerar, el cual su url de acceso directo es la siguiente:

http://www.omfgdogs.com/stormvind.webm


Y eso es básicamente lo que hace la web... aunque hay que decir que rular, muy bien no rula jeje.

Saludos, y espero que os haya gustado la tontería.

Gracias.