Detectando intrusos en tu red wifi y bloqueándolos con Ubuntu.

Hace un rato comentaba en Facebook un artículo de El País sobre cómo detectar y echar a intrusos de tu red wifi. Aquí ya hablamos en el pasado sobre cómo asegurar una red wifi, y hace ya unos años sobre herramientas de Windows para detectar intrusos. Pero ¿y con Ubuntu/GNU Linux?

Recordaréis que hace unos meses hablamos sobre la forma de ver qué IP’s están libres en una red haciendo uso de nMap. Pues de forma similar, podemos usar esta herramienta para ver qué equipos están en nuestra red. Usaremos nMap para escanear nuestra red local en busca de todas las ip conectadas:

nmap -v -sP 192.168.1.1/24 | grep down -v

Nos dará un resultado tal cual este de la imagen (en mi caso está el portátil, un móvil y el router)

Escaneando ip con nMap
Captura de la consola usando el comando

Bueno, si compruebas que en esa lista de IP hay dispositivos que no deberían estar el primer paso es cambiar la contraseña del router para echarlos, pero antes puedes apuntar las MAC de los dispositivos para bloquearles el acceso a tu red. No es una medida definitiva, ya que les bastaría con camuflar su MAC para saltar el bloqueo, pero les dará la lata (otra solución, más efectiva aunque tampoco definitiva es usar una lista blanca, es decir, bloquear todas las MAC menos las de tus dispositivos). ¿Cómo conocemos las MAC de los equipos conectados? Pues ya que sabes su IP basta con un comando arp para que veamos la MAC:

#usamos arp -n seguido de la IP
#Para conocer la MAC de ese dispositivo
#en el ejemplo el 192.168.1.103
arp -n 192.168.1.103

De la lista de resultados obtenida, la MAC es el número que aparece como DirecciónHW. Una vez apuntadas las MAC a bloquear (o a permitir), te vas a la configuración de tu router y allí configuras el filtrado por MAC.

Y con esto tienes a los intrusos fuera, al menos por un rato.

Utilizar .htaccess para protegerse de inyecciones SQL

Llevo unos días que no encuentro tiempo para escribir, pero vamos con un tip cortito que puede servir de ayuda para mejorar la seguridad de nuestra web.

La inyección SQL es un peligro para la integridad de nuestros datos y ya más de una vez hemos visto formas de protegernos. Como un plus de seguridad nunca está mal, vamos a ver cómo usar el fichero .htaccess de nuestro servidor para conseguir un plus de protección contra este tipo de ataques. El siguiente cojunto de reglas nos ayudará a mejorar la protección de nuestro sitio:

RewriteCond %{QUERY_STRING} (;|<|>|’|”|\)|%0A|%0D|%22|%27|%3C|%3E|%00).*(/\*|union|select|insert|cast|set|declare|drop|update|md5|benchmark) [NC,OR]
RewriteCond %{QUERY_STRING} \.\./\.\. [OR]
RewriteCond %{QUERY_STRING} (localhost|loopback|127\.0\.0\.1) [NC,OR]
RewriteCond %{QUERY_STRING} \.[a-z0-9] [NC,OR]
RewriteCond %{QUERY_STRING} (<|>|’|%0A|%0D|%27|%3C|%3E|%00) [NC]
RewriteRule .* - [F]

Recordad que hay que tener el servidor configurado para que .htaccess esté activo y permita el filtrado de URL.

Seguridad en WordPress ¿cómo cambiar el prefijo de la base de datos?

Si alguna vez has hecho una instalación de WordPress verás que te solicita, para crear el sitio, el nombre de una base de datos, el usuario con el que se conectará a ella, la contraseña de ese usuario y un prefijo. ¿Por qué un prefijo? Simplemente porque así puedes tener varias instalaciones de WordPress (o de otros CMS que usen nombres de tabla muy genéricos tipo «users», «posts», etc.) en una misma base de datos.

Si no cambiamos esta configuración por defecto el sistema pondrá el prefijo «wp_» a las tablas. El no poner un prefijo personalizado, en si, constituye un error. Porque dejando el prefijo por defecto estás provocando: a)Que si un atacante logra ver el nombre de una tabla descubra que el CMS que estás utilizando es WordPress y b) Que dicho atacante, entonces, pueda conocer los nombres de las tablas de tu base de datos. La solución es simple, durante la instalación define un prefijo personalizado.

¿Ya lo tienes instalado? Don’t worry, be nécora. No está todo perdido, tienes todavía varias opciones. La más rápida y simple, instalas este plugin que te permitará cambiarla cómodamente desde la interfaz gráfica. ¿La versión más larga y compleja y élite? Pues los siguientes pasos te lo explican:

Bueno, como paso previo, o paso 0 del proceso HAZ UN BACKUP DE TU BASE DE DATOS POR SI ALGO FALLA Y TIENES QUE RECUPERARLA. Consejo que debes tener siempre en mente cuando te pongas a tocar tablas de una instalación de cualquier cosa.

El primer paso: ir a wp-config.php y cambiar ahí el prefijo (en nuestro caso pondremos como prefijo personalizado my_b457Bch33s_ ).

$table_prefix  = 'my_b457Bch33s_';

El siguiente paso es renombrar todas las tablas de tu instalación de wordpress:

/*Básicamente vas haciendo esto con todas las tablas*/
RENAME table `wp_comments` TO `my_b457Bch33s_comments`;

Tras renombrar las tablas haces un update sobre la tabla options buscando todas las líneas que hagan referencia a tablas con el prefijo viejo para actualizarlas:

UPDATE `my_b457Bch33s_options` SET `option_name`=REPLACE(`option_name`,'wp_','my_b457Bch33s_') WHERE `option_name` LIKE '%wp_%';

Y con la tabla usermeta tres cuartos de lo mismo, update que te crió.

UPDATE `my_b457Bch33s_usermeta` SET `meta_key`=REPLACE(`meta_key`,'wp_','my_b457Bch33s_') WHERE `meta_key` LIKE '%wp_%';

Y tras esto deberías tener todo funcionando de nuevo, pero con el nuevo prefijo, más seguro contra potenciales atacantes.

Consejos para asegurar tu red WiFi

Soy una persona que valora mucho las formas. Por ejemplo, cuando un vecino logró colarse en mi WiFi el verano pasado ya me encargué de dejarlo claro que mejor no andar jodiendo con esos temas. En cambio, cuando llegó un nuevo vecino y me ofreció compartir los gastos no sólo le he dejado usarla, sino que se lo dejo de gratis (aunque me ha regalado unas botellicas de vino, un chaval agradecido).

2000px-Wi-Fi_Logo.svg

En todo caso, la mayoría de la gente no quiere a otros pululando por su red ¿cómo podemos fortificarla?. Vamos con una serie de consejos (que, por otra parte, no pueden garantizar protección total, eso por desgracia es una quimera):

  • Utiliza un cifrado fuerte, WPA/WPA2 – PSK es el más robusto para redes domésticas. No es infalible, desde luego, pero sí bastante más consistente que otras opciones.
  • El nombre de la red (el SSID) puede ser utilizado para crackearla con un ataque de diccionario, así que cambiarlo será una de las primeras cosas que deberías hacer (y pones un nombre que probablemente no esté en los diccionarios habituales, tipo CaghoN0KaRaLloDTeUPae).
  • Cambiar la contraseña por defecto es otro must. Hay herramientas para crackear redes que se basan en los algoritmos que usan las compañías para generar las contraseñas por defecto. Como siempre que hablamos de claves, usa una contraseña fuerte (puedes servirte de un generador aleatorio de contraseñas).
  • Desactiva el WPS (por los motivos expuestos en el enlace).
  • Cambia periódicamente la contraseña y el nombre de la red, y apágala cuando no la estés usando. El tiempo es un factor fundamental para encontrar la clave, por tanto si lo apagas le estás limitando ese tiempo al atacante, mientras que un cambio de contraseña tirará por tierra todo el trabajo ya realizado. Tienes la opción de ocultar la WiFi también, pero yo nunca le he acabado de ver la práctica, ya que el atacante puede configurar su equipo para buscar redes ocultas.
  • Seguramente la configuración de tu router te permita hacer un filtrado por MAC (hablo de media access control, no de orenadores con manzanitas).Todos los routers suelen tener esta opción, basta con que accedáis al mismo, la busquéis, hagáis una lista blanca con las MAC de vuestros dispositivos y bloqueéis el resto. Es un coñazo si un amigo viene a casa y quiere conectarse a la WiFi, y puede ser burlado, pero es un escollo más para el atacante.
  • Fortifica tu Router: Si alguien logra romper tu contraseña, a pesar de toda la seguridad extra aplicada, lo que menos te interesa es que entre en la configuración de tu punto de acceso. Esencial, desde luego, es cambiar tanto la contraseña por defecto como el usuario (una simple búsqueda en Google te puede decir la del tuyo). Básico tambien es tener el firmware actualizado. Pero la medida más efectiva, que permiten casi todos los routers y que además no genera mucho problema al 90% de los usuarios, es restringir el acceso al router vía WiFi, para que sólo puedan acceder a él los usuarios conectados mediante cable, lo cual ya te da un plus de fortificación.

Con esta serie de consejos, ya te lo comentaba arriba, no lograrás la seguridad completa e infranqueable (lo dicho, una quimera, no existe a día de hoy, y seguramente no existirá), pero al menos ganarás bastantes puntos respecto a lo que supone dejar todas las configuraciones por defecto.

Pin WPS ¿por qué se recomienda desactivarlo?

El sistema WPS fue promovido como un standar de seguridad en 2007 para redes wifi, que además permitía simplificar la configuración de las mismas haciendo uso de un código PIN de 8 dígitos para conectar nuevos dispositivos a la red.

En 2011 dos especialistas en seguridad, Stefan Viehböck y Craig Heffner, descubrieron (cada uno trabajando por su cuenta) una vulnerabilidad en este sistema, en la forma en que los routers devuelven la respuesta a la inserción de un pin erróneo, lo cual facilita a los atacantes obtener dicho código por medio de un ataque por fuerza bruta. Una vez han conseguido dicho código, los atacantes puede hacerse con la clave de la wifi de manera rápida utilizando unas simples herramientas comunes.

No existe más solución que desactivar la opción del pin WPS en vuestro router para protegeros de este ataque. Me encantaría daros una explicación de cómo hacerlo… pero no hay explicación genérica posible, ya que en cada router es distinto, por lo que os tocará recurrir a algún buscador para encontrar las instrucciones de vuestro modelo. En cualquier caso, lo normal es hacer lo siguiente:

  • Accedéis al router desde vuestro navegador, introduciendo la ip del mismo en la barra de direcciones (podéis saber la ip del router mirando vuestra configuración de red, ya que ahí aparece con el nombre de «Puerta de Enlace«).
  • Lo normal es que os pida un usuario y contraseña para acceder al mismo. Si se lo habéis configurado previamente ya lo sabréis, si nunca lo habéis hecho lo más probable es que tenga la que trae por defecto el dispositivo. Suele venir en el manual del dispositivo, y si no lo tenéis a mano es posible que la encontréis en algún foro realizando una simple búsqueda.
  • Una vez en la configuración del router buscáis la opción de «Habilitar Seguridad WPS«, «Habilitar WPS«, «PIN WPS«… en fin, hay múltiples posibles nombres según el router, pero os hacéis una idea de que tiene que poner WPS en algún sitio. Allí lo desconectáis, si es posible (algunos routers no permiten desactivarlo)

Ver qué IP’s están libres en una red

Por la mañana me preguntaba un compañero «¿hay forma de ver qué Ip’s están libres en una red?», ya que estaba configurando una red que requiere que las dichas IP estén fijas.

¿Hay forma de hacerlo? Sí, la hay. Y es muy sencillo. Desde tu terminal linuxero (testeado en Ubuntu) la útil herramienta nMap te puede dar esa información:

#Con el siguiente comando 
# nmap -v -sP seguido del rango donde buscaremos
#podemos ver todas 
#las ip's que hay dentro de una subred local 
#y su estado:
#

nmap -v -sP 192.168.1.*

#como queremos ver las libres
#recurriremos a una expresión regular
#sacando sólo las que estén "down":

nmap -v -sP 192.168.1.* | grep down

En vuestro caso cambiáis los datos por el rango de ip que os corresponda según la configuración de la red y la máscara de subred. Podéis conocer esos datos utilizando el comando ifconfig, y si no sabes calcular el rango de direcciones de la red siempre puedes recurrir a esta herramienta.

La herramienta nMap es sumamente útil para auditorías de seguridad, aunque también puede usarse para pequeñas consultillas como esta.

Instalar KeePass en Ubuntu e integrarlo en nuestro navegador

¿El gestor de contraseñas KeePass2 no es una herramienta sólo para Windows? En principio sí, y además tenemos para Linux otras herramientas muy válidas, algunas ya instaladas de forma predefinida en nuestra distribución (por ejemplo KeePassX, pero hasta donde he llegado no permite integración con el navegador, de ahí este tutorial), pero algunos usuarios que han migrado desde el SO de Redmond lo echan de menos ¿es posible utilizarlo en mi nuevo Ubuntu? Sí, con el antes citado KeePassX, ¿y la integración con el navegador de KeePassHttp? Lo dicho antes, KeePassX en principio no lo permite pero tenemos una solución para instalar KeePass2 e integrarlo en Chrome o en Firefox.

KeePass2 hace uso de librerías de .NET
, por lo que necesitaremos incluirlas en la instalación, siriviéndonos de la del proyecto MONO :

sudo apt-add-repository ppa:jtaylor/keepass
sudo apt-get update
sudo apt-get install keepass2 mono-complete

El siguiente paso será descargar el módulo KeePassHttp desde GitHub. Tras descargarlo y descomprimirlo en tu equipo busca el archivo KeePassHttp.plgx y muévelo a la carpeta /usr/lib/keepass2/plugins (si no existe dicha carpeta, créala, necesitarás permisos de administrador para esto, así que usa sudo).

Una vez hecho esto si ejecutas KeePass2 verás la opción KeePassHttp Options en el menú de Herramientas (Tools), lo cual será señal de que el módulo está funcionando (si no lo ves es que algo falló). Tras esto basta instalar los complementos para los navegadores: ChromeIPass y PassIFox para el navegador de Mozilla. En el caso de Firefox tendrás que reiniciar el navegador tras instalar (Chrome creo recordar que no).

Tras eso, al abrir el navegador, te pedirá que introduzcas una clave de encriptación para operar con KeePassHttp, que será almacenada en tu llavero de claves de KeePass2. Una vez la hayas introducido ya podrás comenzar a utilizar KeePass integrado con tu navegador, pudiendo rellenar los campos e usuario y contraseña con un simple click en tu menú contextual.

Servicio AntiBotNet de la OSI

La Oficinia de Seguridad del Internauta, dependiente de INTECO y del Ministerio de Industria suele presentar además de múltiples consejos de seguridad informática básica en su web algunos productos para mejorar la seguridad de los usuarios. En el pasado ya hablamos por aquí de CONAN, una herramienta para chequear la seguridad de teléfonos Android. Hoy el producto a comentar, que podéis ver en el vídeo de arriba, es su servicio AntibotNet, que verificará que vuestro equipo no pertenezca a una red zombi. Podéis acceder a dicho servicio en el siguiente enlace, desde el que también podréis descargar los complementos para Chrome.

El servicio en principio chequeará vuestra IP externa y comprobará que no aparezca en su base de datos de ip’s relacionadas con incidentes con BotNets. Sobre su fiabilidad ya no podría deciros nada, no tengo herramientas para comprobarla, desde la información que vierten en su propia web afirman que puede haber falsos positivos, pero dicen que su fiabilidad es muy alta (claro que tampoco van a decir que es una patata). En cuanto al complemento para Chrome lo que hará será avisaros automáticamente si vuestra IP apareciera por algún motivo en su base de datos.

El uso de este servicio implica que estaréis enviando vuestra dirección IP a un servicio dependiente del gobierno español, tenedlo claro a la hora de pensar en vuestra privacidad y en lo queréis enviar o no, si bien afirman que la IP pública sólo la guardan para estadísticas y sin relacionarla con ningún usuario (eso es cuestión de que os lo queráis creer o no). En todo caso puede ser una herramienta muy útil para determinados usuarios.

Mailvelope: encriptar correos de Gmail en Chrome con GPG

Mailvelope es un complemento de Chrome que nos permite utilizar GPG para encriptar nuestros correos. De momento para Firefox no está disponible pero podéis descargar desde GitHub el código y compilarlo.

Si sois novatos en esto de la criptografía os diré que GPG funciona como un sistema criptográfico asimétrico. Ya he hablado de esto antes, pero resumiendo rápidamente hay dos claves, una pública que puede saber cualquiera y una privada que sólo tú sabes. Si quieres enviar un correo encriptado usas la clave pública del receptor para encriptarlo, y ese correo sólo podrá ser leído si se usa la clave privada para desencriptarlo.

Lo primero, tras la instalación, es generar una clave. Podéis hacerlo pulsando el icono que tenéis arriba a la derecha. En el submenú desplegable elegís Options.

Icono del navegador Mailvelope

En el menú de la izquierda seleccionáis Generate Key y ahí veréis un menú como el de la imagen de debajo donde podéis elegir el algoritmo y la longitud de clave, la contraseña que usaréis para desencriptar con vuestra clave privada y varios datos como el correo o el nombre.

Generar clave Mailvelope

El par de claves que creamos debe aparecerá en Display keys. La seleccionamos y hacemos click en Export » Display public key, como puedes ver en la imagen. Puedes elegir entre exportarla a un fichero o copiar el texto y subirlo a un servidor de llaves públicas.

Ok ¿cómo enviar un correo? Es simple. Lo primero es que tenéis que añadir a vuestro llavero/keyring la clave del usuario al que le queréis enviar el correo, que podéis importar desde el menú de opciones (como ya hemos dicho en el párrafo anterior, los usuarios pueden publicar su clave pública en un servidor de llaves o enviarte un archivo con ella).

Importando clave
Menú de importación de claves

Una vez tienes tu clave entras en tu webmail (es compatible con varios) y desde allí ya verás a la derecha un icono como el de la imagen cuando empieces a redactar.

icono de redactar Mailvelope

Si pulsas en él se te abrirá una ventana modal como la de la siguiente foto. En ella puedes redacatar el correo normalmente. Si pulsas el icono con forma de candado te abrirá un menú donde eliges la clave pública del receptor y, aceptando al clickar en Transfer, generará el mensaje encriptado. Luego simplemente envías de forma habitual.

redactar correo encriptado

Para leerlos es más simple, tan pronto recibas un correo encriptado con tu clave pública sólo tendrás que hacer click, meter tu clave privada y leer.

Así que ya puedes gozar de seguridad en tus envíos confidenciales sin necesidad de romperte mucho la cabeza.

Función PHP para hash de contraseñas con GOST y salt

Se está poniendo de moda GOST (así, sin H, que no es inglés) desde todo el asunto Snowden porque, según han empezado a decir algunos expertos en seguridad, es uno de los algoritmos que la NSA no ha logrado romper (al menos no se sospecha que lo lograran). Se trata de un algoritmo criptográfico parido por matemáticos soviéticos en los últimos años de la Guerra Fría, revisado posteriormente un par de ocasiones. Para más info, como siempre, la wikipedia.

El caso es que con el tema de la paranoia de la seguridad me han pedido una función para encriptar passwords segura en PHP, aunque en PHP 5.5 ya tengamos unas muy cómoda y seguras funciones para trabajar con passwords. Pero cliente manda, y ha leído que GOST tralarí y no se fía de algo que sea standar… así que me he hecho una función propia, que os comparto por si queréis usarla.

<?
function getSecurePass($password_plano, $username){
    if(strlen($password_plano)<8){
	//exigimos un mínimo de 8 caracteres
        $response = array("aceptado"=>FALSE, "Resultado"=>"Error: Contraseña demasiado corta");
    }else{	
                if(strlen($password_plano) % 2){
                     $salt0="@fr!87$"; //aquí metemos una cadena, la que vosotros prefiráis
                }else{
                     $salt0="~m¿0kL" //aquí metemos otra, y según sea par o impar la longitud cogerá la que corresponda
                }		
		$salt1 = substr($password_plano, strlen($texto_plano)-6, 5);
		$salt2 = substr(md5($username), 6, 6);
		$salt3 = substr($username, strlen($username),-2);
		$arrayPss = str_split($password_plano,(strlen($password_plano)/2)+1);
		$hash = hash('gost', $salt3.$arrayPss[0].$salt0.$salt1.$arrayPss[1].$salt3.$salt2);
		sleep(1);
		$response = array("aceptado"=>True, "Resultado"=>$hash);
	}
    reutrn $response;
}

?>

Y para complementar el sistema de login contra ataques por fuerza bruta es una buena idea ralentizar la respuesta desde el servidor. ¿Y cómo hacerlo sin darle la vara al usuario mucho? Haciendo una función de login que espere, pero sólo cuando el password sea erróneo. En este caso no desarrollé nada y copié un ejemplo desde php.net que ahí os pego (en mi caso lo adapté para usarlo con el resto del sistema de login desarrollado, en los comentarios del enlace está la función original son su explicación):

<?php
public function handle_login() {
    if($uid = user::check_password($_REQUEST['email'], $_REQUEST['password'])) {
        return self::authenticate_user($uid);
    }
    else {
        // delay failed output by 2 seconds
        // to prevent bruit force attacks
        sleep(2);
        return self::login_failed();
    }
}
?>

Espero que os sirva de ayuda a la hora de asegurar vuestras contraseñas.