Tcpxtract: extraer archivos del tráfico de tu red

Supongamos que eres el sheriff de una red, ya sea doméstica o empresarial, y tienes que monitorizar el tráficto de la misma, para lo que estás usando por ejemplo Wireshark. Ahora imagina también que quieres extraer los ficheros que se ocultan en esa comunicación ¿cómo lo hacemos? Bueno, pues para eso está Tcpxtract.

El primer paso es instalarlo. En Windows lo puedes descargar dese Sourceforge, en el caso de Linux puedes instalarlo con apt tal que así:

sudo apt-get install tcpxtract

Y ¿cómo le damos uso? la sintxis sería

tcpxtract [OPTIONS] [[-d ] [-f ]],

permitiéndonos -d capturar desde una interfaz de red y -f hacerlo desde un fichero. Dos ejemplillos en Linux

#extraemos datos directamente
#de la caputra de nuestra tarjeta
#de red
tcpxtract -d eth0

#extraemos datos de un archivo
#de tipo pcap
#generado por Wireshark
tcpxtract -f ejemplo.pcap

Tcpxtract reconoce los archivos que se envían por su firma o huella, estando estas registradas en el archivo tcpxtract.conf, lo que nos permitiría en todo caso poder añadir más editándolo, si conocemos dicha firma.

Se puede añadir una opción -o que permitiría definir en qué carpeta queremos que se extraigan los archivos capturados de nuestro tráfico.

#extraemos datos de un archivo
#de tipo pcap
#generado por Wireshark
#ejemplo definiendo salida
tcpxtract -f ejemplo.pcap -o imagenesExtraidas

Ten en cuenta este tipo de cosas, tanto por los temas de seguridad en las comunicaciones y usar siempre que sea posible la conexión https como si decides colarte en la wifi de tu vecino para usarla de gratis.

Lynis 2.2.0 ya ha salido. ¿Cómo lo instalo en mi Linux?

Lynis es una conocida herramienta para auditoría de seguridad en sistemas UNIX/Linux. Nos permite gestionar parches de seguridad de nuestro software, buscar malware y detectar vulnerabilidades en nuestro sistema. Una herramienta básica para administradores de sistemas, pentesters y demás gente que deba encargarse de la seguridad.

¿Cómo podemos contar con Lynis en nuestro sistema? Muy simple, en tres pasos:

##Primero creamos un
##directorio para guardar
##Linys
mkdir /usr/local/lynis

#Nos situamos en dicho directorio
cd /usr/local/lynis

##Con la herramienta
##wget descargamos el
##paquete de Lynis comprimido
wget https://cisofy.com/files/lynis-2.2.0.tar.gz

##Ahora ya sólo nos queda
##desempaquetar el Lynis
tar -xvf lynis-2.2.0.tar.gz

##Un último dato: para funcionar
##lynis requiere permisos de administrador
##así que ejecútalo precedido de sudo
#como en el ejemplo
cd lynis
sudo ./lynis

En el ejemplo ejecuto Lynis sin parámetros, de esta forma os mostará la información de todos los que puede recibir para que así podáis darle uso a la herramienta. Probablemente en el futuro haga algún tutorial sobre esta herramienta si os interesa.

Cifrado extremo a extremo en Whatsapp ¿de qué va esto?

Seguramente a muchos ayer os apareció un mensaje tal que así si sois usuarios de Whatsapp:

actualización seguridad whatsapp

Por culpa del mensaje me pasé el día hablando de esto, así que creo que lo mejor es comentarlo por aquí. Whatsapp añade cifrado de extremo a extremo ¿esto qué significa?

Bueno, empezamos recordando que Whatsapp en sus inicios no era una aplicación que destacara por su seguridad ya que enviaba sus mensajes en texto plano. Las constantes publicaciones sobre los fallos de seguridad del popular servicio de mensajería llevaron a que en 2011 la compañía se decidiera a mejorar la seguridad aplicando un sistema de cifrado en tránsito. Esta solución evitaba que un atacante pudiera ver los mensajes mientras se enviaban, pero no protegía los mensajes almacenados a nivel local.

Ya a finales de 2014 Whatsapp anunció que comenzaría a aplicar un sistema de cifrado extremo a extremo, o end to end, para mejorar la seguridad en ese sentido, delegando del desarrollo y la implementación en una tercera empresa: Open Whisper Systems. Dicha empresa se ha basado en el software de código abierto de su creación TextSecure, que fue la base para el software de mensajería seguro Signal (nota: un amigo mío, experto en seguridad, me recomienda encarecidamente dicho software).

El funcionamiento del nuevo sistema de seguridad es el siguiente: se crea una clave privada vinculada al dispositivo cada vez que se envía un mensaje, que sólo se almacena en dicho dispositivo. El mensaje es cifrado con una clave pública y sólo puede ser descifrado con dicha clave privada. De esta forma ni la propia compañía podría tener acceso a los mensajes, al menos en teoría (luego en la práctica ya veremos).

¿Cómo se activa? En principio viene activado por defecto en la última versión, así que si actualizáis ya lo veréis. Si queréis saber si lo tenéis activado os vais a los ajustes de Whatsapp:

ajustes cuenta whatsapp

Y ahí pulsáis en Seguridad:

Pestaña seguridad

Debería estar tal que así. Para que esto funcione el usuario con el que os comunicáis debe tener también el whatsapp actualizado. Para saber si podéis comunicaros con esa persona de forma segura podéis pulsar en su nombre para ver sus datos, y por allí os aparecerá un mensaje tal que así para confirmaros si la conexión está cifrada:

whatsapp confirma cifrado

Pulsando este código además podrás confirmar que los mensajes se están enviando cifrados. Si el contacto está presente físicamente puedes hacerlo mediante el escaneo de un código QR en pantalla, y si no mediante la comparación de un código de 60 dígitos que aparece bajo el código.

En resumen, que Whatsapp es sensiblemente más seguro que antes de esta actualización, y probablemente en cuatro días tendrá una pelotera tremenda con el FBI por esto, sobre todo tras la polémica que también tuvieron con Apple. ¿Significa esto que puedes mandar fotos tuyas en pelotas por este medio? Yo no te lo recomendaría.

Cifrar una memoria USB en Ubuntu

Tras una serie de artículos dedicados a otros temas volvemos con algunas de mis cuestiones favoritas: software libre, cifrado/encriptación y seguridad informática. Aunque algunos gobiernos nos quieran hacer creer que esto es sólo para quien tiene algo que ocultar, la privacidad es un derecho y el cifrado una herramienta necesaria para ello. ¿A alguien le parecería lógico pedir una ley  nos obligara a vivir en casas de paredes transparentes? ¿que quitáramos las persianas de nuestras ventanas y las cerraduras de nuestras puertas por si ocultamos algo tras ellas? El cifrado es la pared de tus datos, es la persiana, es la puerta.

En mis tiempos de subsistencia freelance llevaba muchas veces el proyecto de un cliente en un pendrive. ¿Qué pasaría si lo pierdo? La propia Ley Orgánica de Protección de Datos nos solicita almacenar la información sensible de una persona de forma segura. Si la tengo que llevar en una unidad extraíble entonces esta necesariamente debe estar cifrada.

Lo primero para nuestro caso es instalar el paquete cryptsetup si todavía no lo tenemos disponible en nuestra distro:

sudo apt-get install cryptsetup

Una vez instalado, y con el pendrive conectado al equipo, abrimos el administrador de discos de Ubuntu.

Administrador de discos de Ubuntu

Bajo la tabla de particiones del dispositivo verás un botón cuadrado parecido a un botón de stop (en la captura que he puesto a continuación es un botón de play porque ya lo había pulsado) que nos dará la opción de desmontar el volumen.

Particionando unidad usb

Una vez desmontado el volumen pulsas el botón con dos engranajes que está a la derecha del de desmontar y eliges la opción de Formatear. En el menú desplegable de la ventana flotante que se abrirá eliges Cifrado, compatible con sistemas Linux (LUKS + Ext4) en el menú desplegable con todos los formatos. Como puedes observar este método nos permite cifrar una partición, de forma que si no quieres no tienes por qué cifrar todo el pen, puedes hacerlo sobre una parte y dejar otra con menos seguridad para llevar algo intrascendente y tener un acceso más rápido. Seguidamente añades un nombre para el volumen que vas a formatear y una contraseña.

Finalizando el formateo de unidad cifrada

Si en el futuro quieres deshacerte de la partición formateada tendrás que volver a formatear el dispositivo, pero en cambio si quieres cambiar la contraseña el administrador de discos te dará esa opción.

Cuando insertes un volumen así cifrado en un equipo con Ubuntu te dará varias opciones: pedir siempre la contraseña, recordarla mientras dure la sesión o recordarla siempre. Esta última puede ser muy cómoda, pero piensa que en según qué casos puede que no te interese que los datos estén accesibles siempre que el pen se conecte a ese equipo.

Ultimate Boot CD Live: Creando un usb arrancable y activar la persistencia.

Hoy descubría la existencia de un interesante proyecto ¿Recordais Ultimate Boot Cd? Se trata de un disco de arranque con utilidades muy tipo Hirens Boot Cd. La cuestión es que han sacado una versión de Ultimate Boot CD basado en un LiveCD de Debian, para poder usar las aplicaciones desde entorno gráfico: Ultimate Boot CD Live. Incluye una colección de freeware, shareware y software libre para poder realizar tareas de reparación y recuperación del sistema que puedes ver listas en la página del proyecto.

El proyecto está guay, pero siendo prácticos a día de hoy muchos equipos, sobre todo portátiles, no tienen cd (mismo el caso del equipo desde el que estoy escribiendo) ¿cómo creamos un cd arrancable con Ultimate Boot CD Live? Pues sin mucha dificultad porque,a fin de cuentas, se trata de una distribución Live de Linux como otra cualquiera. En caso de que seais usuarios de Windows os tocará recurrir a opciones como Universal USB Installer o LinuxLive USB Creator. En caso de estar usando Linux, yo suelo ser partidario de Unetbootin. En todo caso los tres son bastante intuitivos, basta con descargar la ISO desde el enlace al proyecto y seleccionarla luego desde el programa que useis para crear el USB. Con LinuxLive USB Creator ya explicamos aquí en su día cómo hacerlo, y con el resto lo podéis encontrar con una simple búsqueda.

Captura de Pantalla de UBCDLive

Ahora vamos con la parte de la persistencia. En caso de que querais guardar cambios en el USB existe una forma de conseguir un giga de espacio para persistencia. Con el cd una vez creado tenéis que buscar el archivo persistence.bz2 y descomprimirlo, de forma que obtendréis un archivo llamado persistence de un giga de tamaño que es en el que se almacenarán los cambios. Además os tocará modificar el archivo isolinux/live.cfg y añadir toram persistence a los parámetros de arranque tal que así:

label live-486
   menu label ^Live (486)
   menu default
   linux /live/vmlinuz
   initrd /live/initrd.img
   append boot=live config username=root vga=normal toram persistence

label live-486-failsafe
   menu label ^Live (486 failsafe)
   linux /live/vmlinuz
   initrd /live/initrd.img
   append boot=live config username=root memtest noapic noapm nodma nomce nolapic nomodeset nosmp nosplash vga=normal toram persistence

Y con esto ya estaría la opción habilitada, y vuestro pendrive listo para ayudaros a rescatar el sistema.

Clase para prevenir ataques XSS en Java

Buscando información para aumentar la seguridad de una aplicación web basada en Java me encontré con esta clase para filtrar los posibles ataques XSS en la web de un veterano ingeniero llamado Ricardo Zuasti.

Su solución propone dos clases. La primera, que copio de su entrada original a continuación, lo que hace es filtrar las peticiones HTTP para que sean filtradas por la clase especializada creada para eso:

public class XSSFilter implements Filter {
 
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    }
 
    @Override
    public void destroy() {
    }
 
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
        throws IOException, ServletException {
        chain.doFilter(new XSSRequestWrapper((HttpServletRequest) request), response);
    }
 
}

Tras esto propone la siguiente clase para realizar el filtrado. Esta clase sobreescribe los métodos getParameterValues(), getParameter() y getHeader() y utiliza una serie de patrones para evitar la entrada de código malicioso en tu web. El método stripXSS() es el que realiza la labor de filtrado.

import java.util.regex.Pattern;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
 
public class XSSRequestWrapper extends HttpServletRequestWrapper {
 
    private static Pattern[] patterns = new Pattern[]{
        // Script fragments
        Pattern.compile("<script>(.*?)</script>", Pattern.CASE_INSENSITIVE),
        // src='...'
        Pattern.compile("src[\r\n]*=[\r\n]*\\\'(.*?)\\\'", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL),
        Pattern.compile("src[\r\n]*=[\r\n]*\\\"(.*?)\\\"", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL),
        // lonely script tags
        Pattern.compile("</script>", Pattern.CASE_INSENSITIVE),
        Pattern.compile("<script(.*?)>", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL),
        // eval(...)
        Pattern.compile("eval\\((.*?)\\)", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL),
        // expression(...)
        Pattern.compile("expression\\((.*?)\\)", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL),
        // javascript:...
        Pattern.compile("javascript:", Pattern.CASE_INSENSITIVE),
        // vbscript:...
        Pattern.compile("vbscript:", Pattern.CASE_INSENSITIVE),
        // onload(...)=...
        Pattern.compile("onload(.*?)=", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL)
    };
 
    public XSSRequestWrapper(HttpServletRequest servletRequest) {
        super(servletRequest);
    }
 
    @Override
    public String[] getParameterValues(String parameter) {
        String[] values = super.getParameterValues(parameter);
 
        if (values == null) {
            return null;
        }
 
        int count = values.length;
        String[] encodedValues = new String[count];
        for (int i = 0; i < count; i++) {
            encodedValues[i] = stripXSS(values[i]);
        }
 
        return encodedValues;
    }
 
    @Override
    public String getParameter(String parameter) {
        String value = super.getParameter(parameter);
 
        return stripXSS(value);
    }
 
    @Override
    public String getHeader(String name) {
        String value = super.getHeader(name);
        return stripXSS(value);
    }
 
    private String stripXSS(String value) {
        if (value != null) {
            // NOTE: It's highly recommended to use the ESAPI library and uncomment the following line to
            // avoid encoded attacks.
            // value = ESAPI.encoder().canonicalize(value);
 
            // Avoid null characters
            value = value.replaceAll("\0", "");
 
            // Remove all sections that match a pattern
            for (Pattern scriptPattern : patterns){
                value = scriptPattern.matcher(value).replaceAll("");
            }
        }
        return value;
    }
}

Entre las recomendaciones que da en el artículo original está la de configurar este filtro como el primero en tu web.xml y también, en referencia al código que aparece comentado en la segunda clase, echarle un ojo a la librería ESAPI, que nos proporciona diversas soluciones de seguridad.

Desde aquí sólo me queda enviarle mi agradecimiento por su trabajo al señor Zuasti y animarle a recuperar su blog, que tiene material interesante pero hace tiempo que no actualiza.

Comprimiendo en zip desde línea de comandos en Linux (Ubuntu/Debian)

Esta mañana a uno de mis equipos se empezó a ir un poco la pinza. No me digais por qué pero si intentaba comprimir utilizando la utilidad gráfica por defecto de Ubuntu no me lo permitía, se quedaba tirado el programa al hacerlo. Al final se arregló reinstalando, pero el caso es que en aquel momento no tenía conexión a internet para hacerlo y necesitaba crear un zip para pasarle una serie de archivos a una usuaria de Windows. Así que tocó usar la consola de comandos.

¿Cómo hice para comprimir la carpeta? Bueno la sintaxis del comando zip es

zip nombreDeArchivoFinal archivoacomprimir1 archivoacomprimir2…

En el ejemplo os dejo varias posibilidades comentadas:

#para incluir subdirectorios
#hay que añadir la opción -r
zip -r resultado.zip carpeta1

#con el comodín * podemos comprimir
#todos los ficheros dentro de una carpeta
zip resultado.zip *

#zip nos permite proteger el archivo
#con una contraseña, pero hay que
#ver que su algoritmo no es muy seguro
zip --password MI_CONTRASEÑA_ELEGIDA protegido.zip archivo1 archivo2 archivo3

#Una opción para codificar con más seguridad sería usar GPG
#primero comprimimos en zip
#luego codificamos la carpeta
#nos pedirá que insertemos la contraseña tras el comando GPG
zip -r resultado.zip carpeta1
gpg -c resultado.zip

#otra opción es usar openssl para encriptar
#primero comprimimos en zip
#luego codificamos la carpeta
#y nos pedirá password igual que antes
zip -r resultado.zip carpeta1
openssl aes-256-cbc -e -in resultado.zip -out resultado.zip.aes

En los ejemplos hemos usado criptografía de clave simétrica, pero siempre podeis investigar formas de utilizar algoritmos de clave pública/privada, ya que tanto gpg como openssl están pensados para poder hacerlo.

Configurando un sistema Debian para que monte en el inicio las carpetas compartidas NFS

Recordarás que hace un par de días hablamos sobre cómo configurar y montar una carpeta en red usando NFS en un sistema Debian. Ese artículo nos servirá de ejemplo para el presente ¿cómo hacemos que los clientes monten la carpeta desde el inicio?.

Vamos con un resumen rápido del artículo anterior (por si estás vago para leerlo): la ip del servidor es 192.168.1.2, la carpeta se llama /compartida y el punto de montaje es /mnt/nfs/compartida.

Bueno, basándonos en nuestro conocimiento de Linux sabemos que los discos y particiones montados en el arranque se configuran en el archivo /etc/fstab (abreviatura de File Systems Table) así que lo abrimos con un editor de texto (nano, gedit, vi, emacs… el que más o guste) y añadimos una nueva línea para montar. Cada una de estas líneas se compone de la siguiente forma:

  1. Primero la dirección de la unidad compartida, en este caso 192.168.1.2:/compartida
  2. Después va el punto de montaje, para el ejemplo /mnt/nfs/compartida
  3. El sistema de archivos, que en este caso es nfs.
  4. Las opciones son varias, y las puedes ver en la página oficial de Ubuntu. Para el ejemplo serán auto,noatime,nolock,bg,nfsvers=3,intr,tcp,actimeo=1200.
  5. La frecuencia con la que se usará dump para respaldar el sistema de archivos. Si se pone a 0 no se hará copia (más velocidad, menos seguridad).
  6. La frecuencia con la que fsck revisará el volumen en busca de errores. Si se deja a 0 no lo hará (más velocidad, menos seguridad)

Así que al final la línea que meteríamos, siguiendo el ejemplo del artículo anterior, sería tal cual esta:

192.168.1.2:/compartida /mnt/nfs/compartida nfs auto,noatime,nolock,bg,nfsvers=3,intr,tcp,actimeo=1200 0 0

Una vez guardados los cambios bastará reiniciar para comprobar que han surtido efecto

Reglas de grupo para proteger un servidor Windows del troyano Cryptolocker

Estos días la enésima mutación de Cryptolocker está generando problemas a muchos usuarios y administradores. Como siempre el tener una buena política de copias de seguridad, el sistema actualizado, una política de contraseñas fuerte y un control adecuado sobre los permisos de los usuarios serán los cimientos de nuestra defensa. En caso de sufrir un ataque que este afecte al menor número de archivos posible y que estos sean recuperables. Pero al final la desinfección y recuperación de datos lleva un rato de trabajo ¿hay una manera de protegerse? Bueno, con algunas versiones de Cryptolocker, no con todas, es posible evitar su impacto generando una regla de grupo que no permita ejecutar archivos desde las ubicaciones en las que este habitualmente se aloja.

En la configuración de seguridad local te vas crear una nueva Directiva de restricción de Software. Alguno pensará en que se podría hacer con una directiva basada en el hash del virus pero hay dos problemas: a) Que para eso tendríamos que tener el exe del virus (aunque esto es conseguible) b)Que nos lo solucionaría para esta versión de Cryptolocker, pero la próxima mutación con algún cambio en el código ya tendría un hash distinto. ¿Cual es la idea? Pues crear una directiva basada en el bloqueo de rutas, que funciona contra varias versiones del virus.

Como ya decíamos, el primer paso es crear una nueva directiva de bloqueo de software:

directiva de bloqueo de software

Una vez creada la directiva la cosa es ir creando una serie de Reglas de Nueva Ruta para cada una de estas excepciones, marcándolas como No Permitidas (Disallowed si tienes el servidor en inglés):

%AppData%\
%AppData%\*\
%localappdata%\
%localappdata%\*\
%localappdata%\Microsoft\Windows\Temporary Internet Files\
%localappdata%\Microsoft\Windows\Temporary Internet Files\Content.Outlook\
%localappdata%\Microsoft\Windows\Temporary Internet Files\Content.Outlook\*\
%localappdata%\Microsoft\Windows\Temporary Internet Files\Content.Outlook\*\*\
%Temp%\
%Temp%\$*\
%Temp%\*.zip\
%userprofile%\
%AppData%\*.scr
%AppData%\*\*.scr
%UserProfile%\Local Settings\Temp\rar*\*.scr
%UserProfile%\Local Settings\Temp\7z*\*.scr
%UserProfile%\Local Settings\Temp\wz*\*.scr
%UserProfile%\Local Settings\Temp\*.zip\*.scr
%UserProfile%\Local Settings\Temp\*.cab\*.scr
%UserProfile%\Local Settings\Temp\*.scr
%UserProfile%\Local Settings\Temp\*\*.scr

Es posible que estas reglas bloqueen algún software que quieras utilizar, en ese caso puedes crear excepciones para esas aplicaciones creando un nueva regla y dándole un perfil con más permisos. Esto no garantiza protección total, ya que desde hace un par de años cada X meses aparece una nueva variante del malware más puñetera que la anterior, pero al menos sí te ayudará a minimizar el efecto de algunas de las versiones hasta ahora conocidas.

Desactivar el bloqueo de SSLv3 en Firefox

A partir de Firefox 34 el popular navegador libre bloquea el acceso a todas las páginas que usen SSLv3 por ser un protocolo de seguridad roto. ¿Cual es el problema? Que hay routers, por ejemplo los de fibra optica de Telefónica, que usan este protocolo para el acceso a su página de administración, así que si intentas acceder a la configuración simplemente no puedes, te quedas en una página de error. ¿Hay solución? , si no ya no me molestaría en escribir esto.

Primero hay que entrar en la configuración del navegador poniendo en la barra de direcciones about:config. Te dará un aviso de que por ahí mejor no tocar que igual se rompe, tú con aplomo y seguridad tira p’alante. En el campo de búsqueda pones security.tls.version.min, cuando lo encuentre haces doble click sobre él y cambias el valor que tiene por un 0. Tras esto cierras firefox y lo vuelves a abrir. Ahora ya debería permitirte acceder al router (o a la web a la que querías acceder, pero en caso de un sitio web externo ten en cuenta la seguridad de la transmisión no está garantizada)