martes, 27 de septiembre de 2016

SSL (II) - Fine tunning de servidores y no morir en el intento.


Autor: @RaulRenales

En episodios anteriores mostramos como obtener información de la instalación de certificados SSL para habilitar la navegación segura. Vimos cómo en algunos casos la nula o mala configuración de estos certificados presenta vulnerabilidades graves y agujeros de seguridad.

En este post intentaremos hablar sobre la configuración de estos certificados con el objetivo de obtener la calificación A+ de Qualys SSL Labs.


Paso 1: Obtención de los certificados. (Configuración básica)


Para la obtención de los certificados debemos o bien autogenerarlos, o bien debemos adquirirlo en alguno de los proveedores disponibles en internet. La oferta es muy variada y van desde precios muy elevados a pocos euros dependiendo de la entidad certificadora que los otorga y la calidad del certificado.

Nos centraremos en la compra de los certificados donde el proveedor nos tiene que facilitar los siguientes archivos:
  •          www.dominio.com.key - es el fichero con la Llave Privada que se ha usado para este certificado. Es privado y sólo Apache debe de tener acceso.
  •          www.dominio.com.crt - es el fichero con el Certificado SSL que queremos instalar en nuestro servidor web.
  •          ProveedorSSL-ca.crt - es el fichero con el certificado de la autoridad certificadora (CA) que ha firmado el certificado.



Paso 2: Configuración básica de los certificados en el servidor.


Una vez subidos los archivos al servidor procedemos a la configuración de los mismos en nuestro servidor.

Lo primero es dejar los archivos cada uno en su sitio:
  • Copiamos www.dominio.com.key en /etc/ssl/private
  • Copiamos www.dominio.com.crt en /etc/ssl/certs
  • Copiamos ProveedorSSL-ca.crt en /etc/ssl/certs


Ahora llega el momento de poner en marcha nuestro apache, lo primero activar el módulo ssl, para ello accedemos a nuestro servidor y en la consola habilitaremos el módulo con el siguiente comando:

sudo a2enmod ssl

Debemos asegurarnos de que el archivo ssl.conf este bien configurado, podremos encontrarlo en la ruta:

 /etc/apache2/mods-enabled/ssl.conf

Y deberíamos hacer que tuviera este aspecto añadiendo las rutas de nuestros certificados:

NameVirtualHost [Ip del servidor]:443

< VirtualHost [Ip del servidor]:443>
       ServerSignature On
       SSLCertificateFile    /etc/ssl/certs/ www.dominio.com.crt 
       SSLCertificateKeyFile /etc/ssl/private/ www.dominio.com.key        
       SSLCertificateChainFile /etc/ssl/certs/ ProveedorSSL-ca.crt 

      SSLEngine On



Una vez con el material en su sitio comenzamos a configurar la plantilla web que contiene los parámetros de navegación https, que podemos encontrar en la siguiente dirección:

/etc/apache2/sites-available/default-ssl

Su configuración básica debería de tener un aspecto similar a esto:

 ServerName mysite.com:443
 ServerAlias www.mysite.com
 DocumentRoot /var/www/sitioseguro


Tras realizar cualquier cambio en estos archivos, ya sea en el ssl.conf, como en el default-ssl  debemos de reiniciar apache para recoger los cambios:
 
#Comprobamos que las configuraciones realizadas son correctas
apache2ctl configtest
 
#Reiniciamos Apache2
sudo service apache2 restart

Hasta aquí lo que sería  una configuración muy básica de un servidor apache. Con ella obtendremos una bonita F en el test de Qualys. En el siguiente paso intentaremos subir nota y que no nos quede para septiembre.

 


Paso 3: Mejorar la configuración básica.


La idea principal de este punto es mejorar la configuración de nuestro servidor Apache2 y conseguir una seguridad más fuerte en el manejo de la navegación segura. Iré sugiriendo algunas configuraciones o operaciones para mejorar los problemas concretos detectados en estos casos.


Problema: Heartbleed

Heartbleed es una vulnerabilidad detectada en la versión 1.0.1f de OpenSSL, que permite a un atacante leer la memoria de un servidor o un cliente, permitiéndole por ejemplo, conseguir las claves privadas SSL de un servidor.

El único consejo que debemos dar en este punto es actualizar la librería OpenSSL y saltar la versión vulnerable. Para ello en nuestra consola lanzaremos el siguiente comando:

sudo apt-get openssl update
o
sudo apt-get openssl upgrade


Problema: SSL Compression (CRIME attack)


CRIME son las siglas de Compression Ratio Info-leak Made Easy, un exploit que trabaja contra las cookies generadas en las navegaciones HTTPS y SPDY que utilizan compresión de datos. Básicamente, cuando recuperamos el contenido de las secret authentication cookies se permite a un atacante obtener una sesión de usuario autenticado en la web atacada.

Para realizar este hechizo, CRIME utiliza SSL Compression como piedra angular con lo que puede ser muy interesante que deshabilitemos esta funcionalidad de en nuestro módulo SSL.
A partir de la versión 2.2.24 de Apache podemos incluir la siguiente línea en la configuración SSL para mitigar el problema:

SSLCompression off

Para versiones anteriores a la 2.2.24 de Apache se recomienda compilar OpenSSL sin soporte ZLIB. Con esto deshabilitamos el uso del método de compresión.

Problema: SSLv2 and SSLv3

La versión SSL v2 es insegura con lo que lo más normal es que la tengamos deshabilitada en nuestro servidor, además deshabilitaremos la versión SSLv3 para evitar que un atacante pueda habilitarlo para deshabilitar el forward secrecy.

Además SSLv3 permite explotar el bug de POODLE, con lo que esta es una muy buena razón para que deshabilitemos esta versión.

De nuevo en nuestro archivo de configuración del módulo SSL debemos incluir lo siguiente:

SSLProtocol All -SSLv2 -SSLv3


Problema: Poodle and TLS-FALLBACK-SCSV

Como hemos comentado en el punto anterior SSLv3 permite la explotación del bug POODLE. Y como comentamos en el punto anterior es razón suficiente para deshabilitar esta versión.

Además, Google ha propuesto una extensión para SSL/TLS llamada TLSFALLBACKCSV para prevenir el ataque de downgrades de versiones forzados en SSL, esta extensión estará habilitada para versiones recientes de OpenSSL. Recomendación actualizar OpenSSL.


Problema: OpenSSL CCS vuln. (CVE-2014-0224)

ChangeCipherSpec, más conocido por sus siglas CCS es una vulnerabilidad detectada en la librería OpenSSL en junio de 2014. Para más información recomiendo leer este txt: 

https://www.openssl.org/news/secadv/20140605.txt

La recomendación básica es actualizar OpenSSL a la última versión.


Problema: OpenSSL Padding Oracle vuln. (CVE-2016-2107)

Esta vulnerabilidad recientemente detectada abre la puerta a un atacante para desencriptar el tráfico de una conexión que utiliza AES CBC y está lanzándose en un servidor que soporta AES-NI

La manera más sencilla de solucionar este punto es mediante la actualización a la última versión de la librería OpenSSL.


Problema: OpenSSL OCSP Status Request extension unbounded memory growth (CVE-2016-6304)


Importante vulnerabilidad detectada en la extensión OCSP de OpenSSL mediante la cual se podría permitir el agotamiento de la memoria del servidor provocando una denegación de servicio. El atacante tan solo tendría que renegociar con esta extensión continuamente hasta agotar la memoria del servidor, la mayoría de los servidores con configuraciones por defecto son vulnerables a este ataque.

La solución a este problema es actualizar OpenSSL

Más información: http://security.360.cn/cve/CVE-2016-6304/

Problema: The BEAST attack and RC4

The Beast attack es un ataque que mediante la manipulación del algoritmo de encriptación CBC se puede desencriptar parte del trafico encriptado. Para más detalles se recomienda visitar este enlace: 


Para configurar nuestro servidor deberíamos incluir en nuestro archivo de configuración apache2.conf las siguientes líneas:

SSLHonorCipherOrder On
SSLProtocol -all +TLSv1 +SSLv3
SSLCipherSuite RC4-SHA:HIGH:!MD5:!aNULL:!EDH:!ADH
SSLInsecureRenegotiation off


Problema: Fallos en SNI

SNI son las siglas de Server Name, es una extensión del protocolo TLS.1 Este indica qué nombre de host el cliente está intentando conectar antes de que el proceso de handshaking se complete. Esta funcionalidad permite a un servidor utilizar múltiples certificados en una misma dirección IP y número de puerto y permitir múltiples sitios seguros (HTTPS).

En ocasiones si tenemos mal configurado nuestro servidor los handshakes no se completan y se provocan rechazos a las llamadas de determinados user-agents.

Para tener correctamente configurado el servidor no debemos olvidar incluir en la configuración del template ssl el siguiente comando:

ServerName www.example.com

ServerAlias example.com www.example.com




Problema: supports weak Diffie-Hellman (DH)


El protocolo criptográfico Diffie-Hellman es un protocolo de establecimiento de claves entre partes que no han tenido contacto previo, utilizando un canal inseguro, y de manera anónima (no autenticada).


Se emplea generalmente como medio para acordar claves simétricas que serán empleadas para el cifrado de una sesión (establecer clave de sesión). Siendo no autenticado, sin embargo, provee las bases para varios protocolos autenticados.

En ocasiones este protocolo presenta deficiencias en su uso que podemos solventar con las siguientes configuraciones:

Cipher Suites

Debemos deshabilitar el soporte para SSLv2 y SSLv3 y habilitar el soporte para TLS, debemos modificar la configuración en el archivo apache2.conf o en el propio de SSL dejándolo de esta manera:


SSLProtocol             all -SSLv2 -SSLv3

SSLCipherSuite          ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA

SSLHonorCipherOrder     on

DH Parameters

En las últimas versiones de Apache (2.4.8 y superiores) y en OpenSSL 1.0.2 o superior se puede especificar los parámetros DH directamente, quedando de esta manera:

SSLOpenSSLConfCmd DHParameters "{path to dhparams.pem}"



Finalizando ...


Si se siguen estos pasos mejoraremos la seguridad de nuestro servidor y evitaremos algunos problemas. En el próximo post hablaré de cómo después de haber afinado el servidor y pasando los test con buena nota podemos joderla y tener un servidor inseguro.

lunes, 26 de septiembre de 2016

Taller hacking etico otoño 2016

El próximo 20 de octubre  arrancara un nuevo grupo de talleres para las tardes de los jueves en UNED Guadalajara. En esta ocasión la temática sera Hacking ético. El objetivo es formar a los componentes de la asociación en estas materias aunque el taller esta abierto a cualquier persona que quiera realizarlo (pertenezca o no a la asociación).

Tasa Asociados: 30€ 
Tasa no Asociados: 150€ 

Se otorgara certificado  por la asociación al finalizar todos los talleres con aprovechamiento.

Nota: Se podrá plantear un Taller 0 para reciclar conceptos sobre sistemas operativos, redes y utilización de CMD y SHELL, con el objetivo de comenzar el curso en condiciones óptimas

Interesados pueden poner en contacto en el email: asociacion@honeysec.info


Fecha de los talleres: (Horario de 19.15 a 21.30 horas)







domingo, 25 de septiembre de 2016

SSL (I) - Information gathering


Autor: @RaulRenales

Recientemente por temas de trabajo he tenido que revisar algunos servidores Apache y la manera en la que tienen configurados sus certificados que habilitan la navegación segura. La experiencia me pareció interesante para compartir en este blog dado que hay mucha gente que no tiene claro algunos conceptos sobre certificados y servidores.

Este artículo es el primero de una serie de tres entradas relativas a SSL y configuración de servidores Apache.

En esta primera entrada hablaremos de cómo podemos obtener información relativa al certificado que nuestro servidor web tiene instalado y que diferentes opciones o herramientas tenemos.

Opción 1:  Qualys SSL Labs (https://www.ssllabs.com/ssltest)


Una de las primeras opciones que siempre me gusta utilizar es la herramienta online de Qualys. Se trata de una herramienta 100% online y que nos puede dar un primer vistazo y muchas pistas de cómo está configurado nuestro servidor.


Como se puede ver en la imagen tan sencillo como indicarle el dominio o ip del servidor y dar al botón enviar. 

Una vez finalizado el análisis podemos observar los resultados, donde lo primero que veremos será una evaluación global con los puntos más importantes del análisis.


Si tiramos de scroll hacia abajo podremos ver los detalles del análisis, que se agrupan en dos categorías:

  •          Authentication: donde podremos ver los datos del certificado y de los certificados adicionales o intermedios relacionados con el principal.



  •         Configuration: donde podemos ver datos relativos a los protocolos, Cipher suites, área de simulación de handshakes para ver cómo se comporta nuestro certificado con varios user-agents. En la zona de Protocol details quizá podamos obtener la información más relevante de cara a explotar alguna vulnerabilidad relacionada con el certificado.


Como se puede ver en la siguiente imagen, el análisis ha encontrado una vulnerabilidad grave en esta instalación. Se trata de CVE-2016-2107 que permite obtener información sensible sin cifrar a través de un ataque de padding-oracle contra una sesión AES CBC.



Se trata de un conjunto de herramientas que nos ayudaran con los trabajos relacionados con los certificados y su instalación en los servidores. Además de la opción Checker que nos ofrece datos tan interesantes como los vistos en la opción 1, esta web nos ofrece herramientas de conversión de certificados, revisión de logs de transparencia y alguna que otra opción más.






Opción 3: SSL Tools (https://ssl-tools.net/)

Por último, y por no alargar mucho el post, también podemos utilizar la web SSL Tools, una interesante web que vive para y por el SSL. Entre sus opciones podemos encontrar interesantes herramientas que nos harán la vida más fácil.

También encontraremos muy buena información sobre vulnerabilidades como Heartbleed y Poodle.



Bueno, creo que de momento con estas tres opciones cubrimos de sobra la obtención de información sobre los certificados instalados en webs con navegación segura, permitiéndonos utilizar la información para avanzar en nuestra auditoría, o bien, afinar la configuración de nuestro servidor de cara a minimizar los riesgos.

En la próxima entrega hablaremos de cómo podemos afinar los servidores y obtener la nota más alta en los análisis que hemos visto anteriormente, nos vemos…




miércoles, 31 de agosto de 2016

Fundamentales. Vi


Autor: @jantoniorobledo

Soy uno de esos nostálgicos que pese a existir alternativas sigo editando ficheros de texto con “vi” (ahora “vim”), será porque después de tantos años trabajando en entornos *nix (Unix, HP-UX, Linux de distintos sabores…) en un elemento común a todos ellos, por costumbre, por pereza a usar otras herramientas, por masoquismo…no lo sé.

Lo que sí sé es que uses o no “vi” hay una serie de comandos que no se usan solo en este editor. ¿Cuántas veces te has encontrado frente a una pantalla con texto que en su parte inferior izquierda tenía el símbolo dos puntos “:” y no sabías como salir de allí?


Pues la solución está en los comandos del vetusto editor, que siguen usándose en utilidades tan usuales como “man”, “less”, “more”, etc.

Por ejemplo, sabemos que con el comando “man” seguido por el nombre de un programa obtenemos la ayuda de este programa (siempre que tenga sus entradas en la relación de manuales). ¿Cómo buscamos un texto en el manual?, ¿Cómo encontramos la siguiente ocurrencia de la búsqueda?, ¿Cómo nos movemos a lo largo del manual? Las respuestas a continuación.

Comandos básicos de vi

Los comandos suelen consistir en la pulsación de una tecla o una combinación de estas:


Adicionalmente en “vim” (Linux) podemos usar las teclas Inicio, Fin, Av. Pág, Re. Pág y el cursor para movernos a lo largo y ancho del documento. Estos comandos son válidos también en “man”, “less”, “more”, etc.


Comandos de edición de vi

Los siguientes comandos nos permitirán editar el fichero. También veremos cómo guardar cambios, deshacerlos, etc.


¿Cómo se usan estos comandos? Veamos un ejemplo:

Vamos a editar un fichero nuevo llamado texto.txt. 
  1. Abrimos el fichero con vi ejecutando vi texto.txt
  2. Pulsamos la tecla i para insertar texto
  3. Tecleamos el texto que queramos
  4. Pulsamos ESC (escape) para salir del modo inserción
  5. Guardamos y salimos tecleando :x


Y con esto ya hemos visto cómo usar vi de forma casi profesional. Hay comandos más avanzados para búsqueda y sustitución, edición, movimiento, borrado…etc. Para nosotros es más que suficiente con esto. Os animo a probar y aunque sigáis usando “nano” por lo menos sepáis que hacer cuando os aparezcan los dos puntos en la parte inferior de una pantalla ;)



sábado, 18 de junio de 2016

Fundamentales. De unos y ceros




Hoy vamos a ver un tema muy cercano al hierro y a su vez a las matemáticas pero unido con los sistemas operativos, aplicaciones, lenguajes de programación... Vamos a ver en qué consisten las unidades de información, los diferentes sistemas numéricos usados en nuestro mundillo y algo de lógica booleana.

Definiciones

Lo primero es lo primero, ¿qué es eso de los unos y los ceros? Casi seguro que todos lo sabéis. Se trata de bits (acrónimo de Binary Digits), que es la unidad mínima de información que puede manejar un sistema digital. A nivel de la máquina, de una forma muy simplista pero válida, la presencia o ausencia de señal eléctrica es lo que define a su vez el estado uno o cero: encendido o apagado. Se suele representar con la letra b minúscula

¿Qué pasa si agrupo varios bits?: pues que obtenemos estructuras de información más complejas. Repasemos las principales:

Byte: consiste en un conjunto agrupado de 8 bits (normalmente). Ocasionalmente, y para no usar el anglicismo, también lo llamamos octeto. Lo representamos con la letra B mayúscula. Tiene 28=256 valores posibles.

Una cuestión importante cuando hablamos de los bits dentro de un byte es del peso del mismo. Todos habréis oído eso de “bit más significativo” o “bit menos significativo”.

El bit menos significativo o LSB (Least Significant Bit) hace referencia al bit más a la derecha, el que menos valor tiene ya que su peso es de 20=1 multiplicado por su valor, es decir vale 1 en decimal si el bit vale 1 y vale 0 en decimal si el bit vale 0.

El bit más significativo o MSB (Most Significant Bit) es el bit más a la izquierda, el que más valor o peso tiene: 27=128, es decir, que si el octavo bit es 1 vale 128 en decimal y si es 0, pues obviamente, también vale 0 en decimal.

En ciertos métodos estenográficos se usa el LSB para ocultar información porque su alteración es despreciable si el valor se “usa” de forma analógica, como puede ser el valor de color de un pixel o la amplitud de una onda de sonido.

Word: o palabra. En la estructura x86 es un conjunto de 16 bits, o 2 Bytes pero se mantiene por compatibilidad en la arquitectura x86-64 con el mismo tamaño. Tiene 216= 2562=65536 valores posibles.

DWord: o doble palabra…pues el doble que la anterior: 32 bits, 4 Bytes o 2 palabras. Tiene 232= 655362=4294967296 valores posibles.

QWord: o cuádruple palabra. Otra vez doblamos la anterior: 4 bits, 8 Bytes, 4 palabras o 2 doble palabras y como en los casos anteriores elevamos al cuadrado el numero anterior de valores posibles: tiene 264= 42949672962=18446744073709551616 valores posibles!

Sistemas numéricos usados en informática

En nuestro mundo usamos 4 sistemas: binario, octal, decimal y hexadecimal. La realidad es que el sistema octal apenas se usa, pero por lo menos que sepáis de su existencia.

Binario: se representa con dos dígitos o guarismos diferentes ya que solo puede tener dos posibles valores: 0 y 1. Es el mas básico y el que usa el ordenador internamente, la información se almacena, sea en disco, memoria, registros de CPU, etc., con este sistema…ya veremos qué pasa cuando llegue la informática quántica! J

Octal: en este caso que puede tener 8 valores diferentes usa 8 guarismos: 0, 1, 2, 3, 4, 5, 6, 7. En un sistema de base 8 que se usaba para representar triadas de números binarios o bits. Para que veáis un caso donde todavía se usa: cuando cambiamos los atributos de un archivo/directorio en Linux con chmod y usamos algo así como chmod 750 mifichero, ese 750 son valores octales:

·         7 octal = 111 binario = rwx en nuestros atributos de Linux.
·         5 octal = 110 binario = rw- en nuestros atributos de Linux.
·         0 octal = 000 binario = --- en nuestros atributos de Linux.

Evidentemente, en este caso, como los valores se representarían igual en decimal o hexadecimal que en octal no se ve claramente que este sea el sistema numérico usado.

Decimal: el sistema más universal y que usamos a diario en nuestra vida cotidiana. Es un sistema de base 10 cuyas cifras se representan con 10 guarismos: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9.

Hexadecimal: Este sistema se usa de forma casi exclusiva en el mundo de la computación. Es un sistema de base 16 que representamos con los siguientes 16 guarismos: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F que tienen el valor decimal de 0 a 15 para la F. Su uso esta tan extendido porque permite representar el valor de un Byte con dos dígitos: 11111111 binario = 255 decimal = FF hexadecimal.

Cuando nos referimos a valores hexadecimales, y para evitar confusión con otras bases, los debemos representar con 0x (cero x) delante del valor, como por ejemplo 0xFF o 0x1234. También los podremos encontrar con una letra h (minúscula o mayúscula) detrás de la cifra: FFh o 1234H.


Tabla ASCII con los valores decimal, hexadecimal y octal de algunos caracteres.


Equivalencia de los primeros valores en los cuatro sistemas de numeración


Evidentemente el cambio de base de un valor es relativamente sencillo y os recomendaría que busquéis vosotros mismos información y aprendáis a hacerlo. Familiarizarse con esta parte de las matemáticas es tremendamente útil en nuestra profesión!

Lógica binaria

Este es un tema que usamos todos los que nos dedicamos a la informática, seamos programadores, nos dediquemos a redes y o sistemas…

Esta lógica está basada en el álgebra de Boole y aunque existen más operaciones, solo vamos a ver las más usuales:

·         Negación o complemento (NOT)
·         Suma o disyunción (OR)
·         Multiplicación o conjunción (AND)
·         Suma o disyunción exclusiva (XOR)

Negación o complemento (NOT)

Este operador invierte el valor al que se le aplica. La negación del valor binario 1 es 0 o dicho de otra forma: 1 = NOT 0. En programación se suele usar el signo de la exclamación cerrada (!) para representarlo, de forma que 1!=0.

Para representar las salidas en función de las entradas de un operador lógico se usan las tablas de la verdad. La siguiente es la tabla de la verdad del operador NOT:



En secuencias lógicas, como las que podemos escribir en los filtros del Wireshark, usamos el operador para indicar que aplique el filtro si no se cumple la condición.

Si por ejemplo quiero que solo capture los paquetes UDP pondré la condición en el filtro como muestro a continuación:



Pero si lo que quiero es que capture todos los paquetes excepto los UDP usaré el operador NOT para indicarlo:



¿Qué ocurre si aplico este operador a un byte completo?, pues que todos los bits de ese byte se invierten: 10010110!=01101001.

Suma o disyunción (OR)

La suma lógica requiere de 2 o más entradas con las que operar, básicamente se puede decir que el resultado en 1 si cualquiera de las entradas tiene el valor 1.  En programación se suele usar tanto el término OR como el doble pipeline (||). La tabla de la verdad de este operador es la siguiente:



Usemos de nuevo los filtros de captura de Wireshark para mostrar cómo usar este operador en una sentencia lógica: siguiendo con el ejemplo anterior, quiero hacer un filtro que capture todos los paquetes que no sean UDP o que sean peticiones al puerto 80:


Si aplicamos el operador a un par de Bytes se hará la operación bit a bit para cada posición: 01010001 OR 11000100 = 11010101

Multiplicación o conjunción (AND)

La conjunción AND requiere que las dos entradas sean 1 para que la salida sea 1, en cualquier otro caso la salida es 0. Se suele indicar tanto con el término AND como con el doble ampersand (&&). Su tabla de la verdad es la siguiente:



Sigamos con los filtros de captura de Wireshark para ver su uso en sentencias lógicas. Ya teníamos un filtro donde capturábamos todos paquetes que no fueran UDP o que fueran peticiones al puerto 80. Ahora queremos incluir la condición que sea del protocolo IPv6 (ojo a los paréntesis para agrupar las operaciones):



Vamos a operar un par de Bytes con este operador que también se hará la operación bit a bit para cada posición: 01010001 AND 11000100 = 1000000
Este operador también se usa para calcular la dirección base de una red usando como entradas la dirección Ip y la máscara de subred (en formato binario ambas).

Suma o disyunción exclusiva (XOR)

Este operador, usada en los sumadores digitales junto a un operador AND, de una resultado de 1 solo si solo una de las entradas es 1. Esta es su tabla de la verdad:



Este operador no se usa en los filtros de Wireshark por lo que omito el ejemplo de uso, en cambio si es usado en creación de máscaras de imagen, en criptografía, generación de números pseudo-aleatorios, detección de correlación y secuencia… También nos permite calcular la dirección de broadcast de una red usando como datos de entrar la dirección Ip y la máscara de subred.

Todas estos operadores (excepto NOT) tienen sus correspondientes “versiones” negadas: NOR, NAND y XNOR que tienen el resultado de salida invertido a sus “versiones” no negadas.

En un contexto típico de programación no nos referimos a los valores lógicos 1 y 0 de esta forma, se suele usar True y False respectivamente para inicializar variables, comparar en sentencias de control, etc.


Lo que hemos visto en este post es un tema, que no es que sea de obligado conocimiento, es necesario controlar para poder desenvolvernos con soltura en el mundo de la informática.

sábado, 11 de junio de 2016

Fundamentales. Atributos de los archivos




¿Qué es eso que sale cuando listo con detalle un directorio?

Esto es lo puedo ver cuando hago un listado de archivos en un directorio con el comando “ls -la”:



Vamos a ver con detalle que información aparece:

El primer dato que devuelve el comando es “total 32”. Esto nos indica el espacio en bloques de 1KB (1024 Bytes) que ocupan todos los archivos que están en este directorio.

El resto de líneas nos muestran la información detallada de los directorios o ficheros existentes.
Vamos a usar como ejemplo la tercera línea: el fichero filtrado.txt.
-rw-rw-r--  1 lubuntu lubuntu  6515 jun  4 11:26 filtrado.txt

La primera parte, que es ese montón de letras sin aparente sentido son los atributos o permisos del archivo. Lo veremos en detalle después, vamos primeramente a ver cosas más sencillas.
Seguidamente tenemos un número, en nuestro ejemplo el valor es 1, que indica el número de enlaces que existen a este fichero.

A continuación, tenemos el nombre del usuario y el nombre del grupo propietario del fichero, en este caso usuario lubuntu, grupo lubuntu. Pensar que un fichero puede ser propiedad de un grupo al que no pertenece el usuario, por ejemplo, usuario lubuntu, grupo root. Esto afecta a la gestión de seguridad de acceso del fichero en cuestión.

Después nos encontramos otro número: 6515. Es el tamaño en bytes del fichero. Os recomiendo usar el parámetro “-h” (Human readable) junto a nuestro “ls -la” para que la información de tamaño, sobre todo en el caso de archivos de gran tamaño, sea más fácilmente legible. Este es un ejemplo de como se ve una lista de directorio con y sin -h con archivos de cierto tamaño:



Como podéis observar, usar -h nos evita contar el número de dígitos para leer el tamaño correctamente.

Seguimos con nuestra línea. Ahora tenemos la fecha y la hora de última modificación del archivo: “jun  4 11:26”. Veréis que el año no aparece por que ha transcurrido menos de ese periodo de tiempo desde la última modificación. ¿Qué ocurrirá el 4 de junio de de 2017 a las 11:27 de la mañana?: pues que si no se ha modificado el fichero desde la fecha que vemos hoy, el comando nos mostrará “jun  4  2015”, es decir, tendremos precisión de hasta minutos en esta información durante un año, después se considera que con saber el día de la última modificación es más que suficiente J!

No es necesario explicar que el último dato que aparece es el nombre del fichero: filtrado.txt

Ahora los atributos

Pues vamos al meollo del post, ver que significan y que información nos aportan los atributos de seguridad de un archivo.

Vemos que es una lista de 10 caracteres que indican lo siguiente:
·         Primer carácter. En el ejemplo veréis valores diferentes (d, l, -). Puede tener otros valores, pero estos son los 3, llamémoslo, principales. ¿Que nos indica?: el tipo de objeto que es:
o   d: indica que es un directorio. Sí, eso del punto y los dos puntos también son “punteros” a directorios: el punto es un puntero al propio directorio que estáis mostrando y los dos puntos al directorio padre, es decir el directorio jerárquicamente anterior en el árbol de directorios.
o   l: nos dice que es un enlace (link) a otro archivo. En nuestro ejemplo veréis que hay un archivo readme.sll.txt que apunta al fichero /usr/share/doc/ssl-cert/README. Esto nos permite actuar sobre el fichero apuntado (el /usr/share/…/README) usando nuestro enlace (readme.sll.txt), para por ejemplo visualizar su contenido o editarlo. Cuando hacemos nano readme.sll.txt, realmente estoy editando el fichero README en /usr/share/. ¿Y qué pasa si borro con un rm el enlace?, pues eso, que borro el enlace, no el fichero enlazado.
o   -: un sencillo guion nos indica que lo que estamos viendo es ni más ni menos que un simple archivo.

Los 9 caracteres siguientes son 3 grupos de 3 atributos y vamos a verlos así.

  •     El primer grupo de 3 indica que permisos tiene el usuario, en este caso lubuntu, sobre el fichero. Cada carácter indica una cosa y siempre están en el mismo orden:

o   r: tenemos permiso de lectura (Read) sobre el fichero. Si aparece un guion indica que no tenemos ese permiso.
o   w: indica que tenemos permiso de escritura (Write) sobre el fichero. Como en el caso anterior si aparece un guion indica que no tenemos ese permiso.
o   x: tenemos permiso de ejecución (eXecution) sobre el fichero, y como anteriormente si aparece un guion indica que no tenemos ese permiso.
  •  El segundo grupo de 3 caracteres indica que permisos tiene el grupo, también en este caso el grupo se llama lubuntu sobre el fichero. Los valores que podremos ver son los mismos que en el caso anterior
  • Y por último, el tercer grupo nos indica que permisos tiene el resto de usuarios/grupos. Tambien puede tener los mismos valores.


Ahora vamos a analizar nuestro ejemplo: el archivo filtrado.txt tiene los atributos -rw-rw-r—

El primero, “-“, nos dice que es un archivo.

El grupo de permisos de usuario es “rw-“: el usuario lubuntu tiene permisos de lectura y escritura.

El grupo de permisos del grupo es también “rw-“, por tanto todos los usuarios que pertenezcan al grupo “lubuntu” también tendrán permisos de lectura y escritura sobre el archivo.

Por último, tenemos el grupo de permisos de otros, que en este caso es “r—“, lo que indica que cualquier usuario que no sea lubuntu o pertenezca al grupo lubuntu solo podrá leer el archivo.
Como veis no es posible ejecutar el archivo para ningún usuario ni grupo por no tener el atributo “x” de ejecución activo.

Y esto es todo por hoy, en próximos post veremos cómo actuar sobre los permisos de los archivos y muchas más cosas.


domingo, 5 de junio de 2016

Fundamentales. Redirecciones: stdout y stdin




Algo realmente útil que tienen los comandos, no todos, de Linux/Unix es la posibilidad de redirigir su salida como entrada de otro comando.

stdout, standard output o salida estándar es la más fácil de entender: se refiere a la información que devuelve un comando cuando es ejecutado, si no indicamos otra cosa, a la pantalla o terminal.

stdin, standard input o entrada estándar: aquí la cosa se complica más. Hay que ver cada comando si tiene alguna de sus parámetros habilitados para ser indicados como entrada estándar.

Vamos a ver por ejemplo que nos dice la ayuda del comando cat, para lo cual hacemos man cat en la consola:




En la descripción vemos que concatena el fichero o ficheros indicados en el parámetro FILE o el contenido de la entrada estándar hacia la salida estándar.

Vemos ahora las instrucciones del comando grep:



Nos dice en la descripción que buscará el patrón indicado en el/los ficheros indicados en FILE o en la entrada estándar si no indicamos ningún fichero o indicamos – (guión) como nombre de fichero.

Caso práctico

Supongamos que queremos hacer lo siguiente: visualizar la lista de ficheros modificados en febrero en el directorio /etc.

Para hacer esto necesitamos:
  1. Listar el directorio con el comando ls
  2. Filtrar la lista con los ficheros que fueron modificados en febrero con el comando grep
  3. Visualizar la lista de forma paginada para verla con comodidad con el comando less


Primero vamos a ver cómo no debe de hacerse, pero creo que os ayudará a entender cómo funciona cuando lo hagamos correctamente usando la redirección.

Como funciona, pero NO debe de hacerse

Primer paso: listamos el contenido del directorio y volcamos su stdout a un fichero llamado lista.txt:

ls -l /etc >lista.txt

El comando no devuelve nada, pero si miramos con ls (o ll, o la, etc) el directorio actual veremos lo siguiente:



Se ha generado un fichero con el nombre lista.txt que si miramos con cat, por ejemplo, contendrá la lista de todos los ficheros del directorio /etc

Segundo paso: filtramos el contenido del fichero lista.txt y generamos uno filtrado llamado filtrado.txt:

grep “ feb “ lista.txt > filtrado.txt

Igual que con el comando anterior no veremos nada en la salida del comando pero con ls comprobaremos que se ha generado otro fichero llamado filtrado.txt:



Tercer paso: visualizar el fichero filtrado.txt de una forma cómoda que nos permita paginar y movernos arriba y abajo en su contenido:

less filtrado.txt




Facil, no?...pues no señor@s!: tres pasos, dos ficheros que luego tendremos que borrar porque no nos sirven para nada…

¿Cómo SI debe de hacerse usando redirecciones?

Ahora vamos a hacer lo mismo usando redirecciones. Para redirigir la salida de un comando a otro se usa el carácter pipeline  “|” (con Alt Gr+1).

Primer y único paso: Ejecutamos el listado del directorio, redirigimos al filtro y la salida de este la redirigimos nuevamente al visor:

ls -l /etc|grep “ feb “|less

Resultado, el mismo, pero mucho más elegante y sencillo.



Redirección de stdout a fichero

Aunque lo hemos usado en el ejemplo voy a aclarar cómo se redirige la salida estándar de un comando a un fichero. En este caso no se usa el pipeline, sino el símbolo de mayor que “>”. Hay, llamémoslo, dos formas de usarlo:

  • Si se pone una sola vez, por ejemplo: ls -l > fichero.txt, la salida del comando ls generará un fichero llamado fichero.txt, pero si este fichero ya existía previamente se perderá la información que contenía, es decir, que la nueva información sustituirá a la anterior.
  • Podemos ponerlo dos veces, por ejemplo: ls -l /etc >>fichero.txt. En este caso la salida del comando ls se añadirá al final del fichero, no perdiéndose la información contenida en él previamente y en el caso de que no exista se creará.

En las próximas semanas seguiremos publicando más artículos relacionados con los Básicos de Linux, dado que queremos generar información para los socios que están haciendo los talleres de introducción.


Gracias y nos vemos ...