viernes, 25 de septiembre de 2015

MOOC de Hacking Ético de la Universidad de Mondragon II

El segundo ejercicio de este curso trata simplemente de identificar 3 sitios en la red donde se comparta información relacionada con el curso, es decir, seguridad informática. Tengo que decir que sólamente son 3 sitios que he elegido yo a título personal, pero hay muchísimos más sitios y canales donde poder formarte en seguridad, estar al tanto de noticias, relacionarte con profesionales del sector, etc, con una calidad no por ello menor de los que pongo a continuación.

1.- www.securitybydefault.com Para los que no conozcáis aún este blog, se trata de uno de los sitios más recomendados tanto para empezar como para aquellos que ya tienen cierta experiencia en el sector. Los artículos siempre son de una calidad y nivel excepcionales, y cuyos redactores tienen una dilatada experiencia en diferentes ámbitos de la seguridad.

2.- www.exploit-db.com Se trata de la extensísima base de datos de exploits actualmente mantenida por Offensive Security (34.602 exploits a la hora de escribir este post).

3.- En este caso he elegido la lista de correo del congreso de seguridad RootedCON: listas.rooted.es/mailman/listinfo/rootedcon En dicha lista de correo puedes estar al tanto de noticias y novedades en seguridad y hacking, participar en conversaciones técnicas (y a veces políticas y filosóficas), plantear cuestiones y, en definitiva, compartir información sobre hacking, en cualquiera de sus variantes.

MOOC de Hacking Ético de la Universidad de Mondragon I

Actualmente estoy cursando el MOOC de Hacking Ético de la Universidad de Mondragon. La cosa empieza suave, pero con buen pie, así que aquí os dejo los primeros ejercicios del curso.

Empezamos con un ping al servidor que en teoría estamos auditando. En este caso hacemos un ping a www.google.com para verificar el que equipo tiene conectividad, y donde podremos ver el nombre del servidor, su dirección ip y los tiempos de respuesta:


El segundo ejercicio consta de una petición whois al dominio en cuestión. En ella podremos ver información sobre el registro del dominio, como las fechas de creación, renovación y expiración, los contactos administrativo, técnico (importantes en caso de un ataque de ingeniería social) o propietario. En este caso he omitido parte de la salida para que la imagen no sea tan extensa:


En este caso todos los contactos son Google Inc., pero en el caso de otros dominios podría tratarse de diferentes personas o entidades.

Por último, hacemos uso de la herramienta Nmap para realizar un escáner de puertos al equipo en concreto que queremos auditar. A modo de ejemplo, he utilizado un escaneo de tipo TCP Syn Scan (opción -sS), con identificación de versiones de los servicios que están corriendo en los puertos abiertos (opción -sV), y de Sistema Operativo (opción -O):


Como vemos en la imagen anterior, están abiertos los puertos 80 y 443 correspondientes a los servicios http y https respectivamente, y cuya versión de servidor web es Google httpd 2.0. También hemos podido identificar que se trata de un servidor Linux.

Si buscamos esta versión de servidor web en NVD no encontramos ningún resultado. Pero pongamos por ejemplo que el servidor fuera un Apache 2.4.10. En ese caso encontraríamos que dicho servidor web es vulnerable a CVE-2014-3583, mediante la cual podríamos provocar una denegación de servicio.

miércoles, 12 de noviembre de 2014

Sh3llCON - Primer Congreso de Seguridad Informática en Cantabria



Recientemente se ha publicado un nuevo congreso de seguridad informática en Cantabria, Sh3llCON. Su primera edición tendrá lugar los días 23 y 24 de Enero de 2015, y será en Santander.

En su web www.sh3llcon.es podemos ver los ponentes hasta ahora confirmados como Pablo González, Jose Selvi, Alejandro Ramos o Pedro Sánchez entre otros, todos ellos de primer nivel.

También hay ofertas de alojamiento y transporte a asistentes, y contarán con un concurso de desarrollo de software orientado a seguridad de la mano de Netkia, empresa colaboradora.

Cuentan, además, con el patrocinio del CCN-CERT y la editorial de libros técnicos 0xWord.

En definitiva, un congreso que promete rock & roll, en una zona privilegiada como es El Sardinero, cubriendo una falta de este tipo de eventos en la zona central del norte de la península.

martes, 2 de septiembre de 2014

Evasión de antivirus

Esta mañana leía en System Exposed esta entrada sobre evasión de antivirus de ejecutables basada en firma digital.

Como "mente inquieta" que soy, tenía que probar esta técnica y testearlo en Virus Total como había leído en el citado post.

Así, igualmente hice las pruebas con el troyano educativo Flu, analizándolo sin ningún tipo de modificación:


Como vemos en la imagen, el troyano es detectado por 36 de 55 motores antivirus.

Siguiendo con las pruebas, procedemos a firmarlo con OpenSSL Sign Code:


Y lo analizamos de nuevo:


Esta vez lo detectan 27 antivirus, todavía es un número grande.

Tirando de recursos, lo pasé por msfencode de Metasploit para ver si podía reducir la detección de antivirus:



Y lo volví a analizar:

https://www.virustotal.com/es/file/31b2851c96ef02d164c4efad0759d9ce44ef625d94672101e8197caa1c4b0788/analysis/1409662879/

36 detecciones... hemos subido el número en vez de reducirlo.

De repente me acordé que una de las técnicas para "camuflar" archivos ejecutables a los ojos de los motores antivirus era utilizar el famoso packer Themida.

De modo que descargué la versión demo, dejé todos los parámetros por defecto y le pasé el ejecutable firmado y encodeado:


Vamos a ver qué pasa esta vez...


Tan sólo 4 detecciones, y lo mejor es que ha pasado desapercibido ante los antivirus más prestigiosos, a excepción de ESET-NOD32.

Pero no me quedé ahí y seguí haciendo pruebas. Ya que el ejecutable que dió menos detecciones antes de pasarle por Themida fue el original firmado (sin encodear), vamos a ver si éste daría menos detecciones aún:



Hemos conseguido bajar a 3 detecciones. Nos hemos librado de ESET-NOD32, pero a cambio nos ha detectado AntiVir (Avira).

En conclusión, podemos evitar que la mayor parte de los antivirus nos chafen nuestro ataque. Para estos antivirus que sí lo detectan habría que hacer una parte de investigación sobre la víctima, averiguar qué antivirus tiene instalado y conseguir que éste no detecte nuestro troyano, y otra parte de ingeniería social para conseguir que la víctima lo ejecute.

Esto que hemos hecho es solamente la concatenación de una serie de técnicas, no hemos inventado ni desarrollado nada, sólo hemos aplicado unas ciertas técnicas que otra gente ha desarrollado previamente, a quienes se debe el reconocimiento.

--EOF--

martes, 11 de marzo de 2014

RootedCon 2014



Los pasados días 6, 7 y 8 de marzo se celebró en Madrid la 5ª edición del congreso de seguridad informática RootedCon. Con unos ponentes de lujo como Chema Alonso, Hugo Teso, Andrés y Miguel Tarascó, David Pérez y José Picó, Raúl Siles, Jaime Sánchez y un largo etcétera, fueron 3 días intensos hablando de hacking. Curiosamente este año la temática se ha centrado especialmente en APT's, ciberguerra, cibercrimen, y un sinfín de términos que comienzan por ciber, a mi modo de ver innecesariamente, puesto que no necesitamos que nadie nos cuente qué es una ciberarma o una ciberguerra, todos los que estamos en el mundo de la seguridad ya sabemos ese tipo de cosas.

Así que tuvimos charlas sobre clonado de tarjetas, vimos a Latch en acción, análisis de malware desde el punto de vista económico, cómo saltarse un portal cautivo, cómo montar un servidor de comunicaciones seguras, tuvimos un análisis forense a muy bajo nivel en Mac OS X, y hasta vimos cómo hackear un avión comercial (los que no estuvisteis ahí os dejo con la duda :-) )


Por otro lado, este año la organización del congreso ha querido darle una proyección internacional, y lo ha conseguido con éxito, puesto que el aforo se ha completado con maś de mil asistentes. Todo hay que decirlo, es mucho curro el que conlleva montar un evento de este tipo, y la organización de RootedCon ya es veterana en esto, de modo que salvo algún contratiempo de última hora sin importancia, en mi opinión estuvieron excelentes.

Ya hemos empezado la cuenta atrás para RootedCon 2015, que seguro que, como todos los años,  subirán el nivel y a pocos dejará indiferentes.

--EOF--

viernes, 28 de febrero de 2014

De Windows y máquinas virtuales

En este post veremos cómo instalar un Windows virtualizado en VirtualBox sobre un Linux. El concepto en sí no es que sea nuevo ni mucho menos, pero muchas veces nos ha pasado que en un momento dado necesitamos un Windows y nuestro sistema operativo es Linux, y por unas razones u otras, en ese momento no disponemos de ninguna imagen que nos sirva para instalar una máquina virtual (bien porque no es de la misma arquitectura, bien porque directamente no la tenemos, etc...). Pero lo que sí tenemos es red, tener red es como... tener la varita mágica, la llave de Mordor, la puta ostia vamos.

Y como tenemos red, podemos bajarnos una iso e instalarla, cierto. Pero más comodo es echar mano del proyecto GitHub de xdissent, ievms. La url completa la tenéis aquí.

No tenemos más que ejecutar la siguiente orden con permisos de root:
curl -s https://raw.github.com/xdissent/ievms/master/ievms.sh | bash
Con esto se instalarán las versiones de Windows 7 con Internet Explorer 7, 8 y 9, de la arquitectura correspondiente a nuestra máquina (32 o 64 bits).

Si queremos sólamente una versión en concreto, sólo tenemos que especificarlo en la instrucción anterior:
curl -s https://raw.github.com/xdissent/ievms/master/ievms.sh | IEVMS_VERSIONS="7" bash
cambiando el número de versión por la que nos interese, claro está.

Cuando finalice, si abrimos Virtual Box veremos la máquina (o máquinas) virtual instalada.

Con todo esto, el sistema que instalamos es una versión de prueba de 30 días. Por lo que, si sólo lo necesitamos para algo temporal, nos viene que ni pintado.

Por último, decir que le lleva su rato descargarse la máquina virtual e instalarlo (dependiendo del equipo que tengamos), por lo que hay que tener un poco de paciencia.

--EOF--

viernes, 31 de enero de 2014

Backups automatizados en red: Bacula

Bacula es una solución open source de backups, que permite realizar copias de seguridad de forma automatizada y programada, y su principal característica a destacar es que permite hacerlo a través de la red. Esto es, aunque se puede utilizar en entornos domésticos (aunque quizás ésta no sea la mejor solución, sino ésta otra), donde mejor se desenvuelve Bácula es en un entorno empresarial, donde hay máquinas y servidores virtuales, servidores dedicados, equipos de usuario, etc...

Aquí tenéis la web del proyecto: http://www.bacula.org

Supongamos el siguiente escenario: Estamos en una red donde tenemos un dispositivo de almacenamiento tipo NAS o similar, de varios chorrocientos de gigas. También tenemos en la misma red varios equipos de usuario y algún que otro servidor. Pues bien, lo que queremos hacer es que todos los sábados (por ejemplo) se haga una copia de seguridad completa de ciertos directorios y archivos de interés de todos nuestros equipos, y que todos los días se haga una copia incremental de los mismos. Aquí es donde entra en juego Bacula.

Cabe decir que Bacula no es apropiado para backup de bases de datos, sino de archivos.

Bacula se compone de varias partes, las explicaré de forma resumida, y luego veremos más en detalle cómo se configura todo ello (supondremos que todos los equipos corren Linux Debian o similar, para simplificar un poco).
  • Por un lado tenemos el Storage Daemon, o Bacula-sd, es el demonio de almacenamiento, el que va a almacenar las copias.
  • Tenemos también los clientes, o Bacula-client, que son los demonios instalados en los equipos de los cuales queremos hacer backup.
  • Disponemos también de una consola llamada bacula-console, que nos servirá de utilidad a la hora de hacer backups manuales, restaurar un backup antiguo, simular una operación de backup (a modo de "a ver cómo quedaría"), crear/modificar/eliminar dispositivos de almacenamiento, etc.
  • Y por último tenemos el Director de la orquesta, o Bacula-director, es el componente que va a dirigir el cotarro, por así decirlo, es el que dice quién hace qué en cada momento.
Debo decir que Bacula permite trabajar con las llamadas "tapes", pero aquí veremos almacenamiento digital, sobre un disco duro (ya sea cifrado o no).

En primer lugar instalamos el Director en el servidor principal desde el cual controlaremos el proceso de copias (luego veremos cómo configurarlo):
aptitude install bacula-director-common bacula-director-mysql
Instalamos también todas las dependencias requeridas, claro.

Después instalamos el Storage Daemon en el servidor que hará el almacenamiento de las copias (puede ser el mismo servidor en el que instalamos el director):
aptitude install bacula-sd
Por último, instalamos el cliente en cada equipo del que queremos realizar un backup:
aptitude install bacula-client
Con las herramientas instaladas, vamos a ver cómo configurarlo.

Como cada "demonio" puede ser nombrado de una forma determinada, nosotros les llamaremos debian-dir al Director, debian-sd al Storage Daemon, y debian-fd1/2/3... a cada cliente (ya que, por defecto, Bacula coge el hostname para nombrar cada componente). Aún así, la mayor parte de la configuración por defecto está bien, pero modificaremos algunas cosas.

En el bacula-sd (/etc/bacula/bacula-sd.conf) debemos configurar los parámetros de la unidad de almacenamiento (puede ser un volumen local, remoto, o puede estar sobre un sistema de ficheros cifrado). Empezamos por el Storage, que es la definición del propio módulo en sí:


Importante: Bacula no trabaja bien con nombres de hosts, por lo que siempre que haya que configurar una ip, así lo haremos (aunque sea una dirección de localhost, definiremos la ip que utiliza en la red).

A continuación le decimos a bacula-sd quién es el Director:


Aquí figuran 2 directores, el principal por así decirlo (debian-dir) y el monitor (debian-mon). El monitor es el que va a consultar el estado en el que se encuentra bacula-sd. Como véis, tenemos que decirle con qué pass se va a conectar cada uno (ojo, no son pass de usuario, ni mucho menos, son contraseñas que sólo usará Bacula). Sí, ya sé que es una barbaridad enviar contraseñas sin cifrar por la red, pero es así como funciona (también las enviábamos en conexiones http y nadie se echaba las manos a la cabeza... :-) ).

A continuación definimos el tipo de almacenamiento que utilizaremos:


También tenemos la opción de definir un  cargador de cintas, pero en este caso no lo vamos a utilizar.
Por último, permitiremos que bacula-sd envíe mensajes al Director:


Pasemos ahora a los clientes. En cada uno de ellos configuraremos los siguientes parámetros:


Tenemos el Director y el monitor, con sus respectivas contraseñas. También definimos el propio demonio cliente y el envío de mensajes.


Finalmente, definiremos el bacula-dir (este tiene un poco más de chicha). Principalmente se basa en definiciones de trabajos y entidades, ahora lo veremos.

En primer lugar definimos como siempre al propio Director:


Seguidamente definimos un trabajo de backup:


Definimos también el trabajo que engloba a esta definición de trabajo (es un poco lioso, pero al final es una jerarquía de Trabajo -> Definición de Trabajo -> Definición de elementos que lo componen).


Definimos un trabajo de Restore, para poder restaurar las copias que hagamos (los parámetros son casi autoexplicativos):


Definiremos un File Set, es decir, los archivos de los que queremos hacer backup, y los que queremos excluir, si los hubiera. También podemos definir una firma de tipo MD5, que utilizará Bacula para determinar si ha habido cambios o no.


Definimos ahora la programación horaria, para decir cuándo se ha de hacer un backup completo, cuándo un icremental, etc. En este caso haremos un backup completo todos los domingos a las 23:05, y un incremental todos los días a las 23:05:


Definimos también el catálogo, donde Bacula hará su inventario de archivos de los que ha hecho backup, diferencias, etc...


Ahora definiremos los clientes de los cuales hay que hacer backup:


Le decimos el dispositivo de almacenamiento:


En caso de tener un cargador de cintas, lo definiríamos aquí. En la configuración por defecto hay unos cuantos ejemplos.

Especificamos los datos de conexión a la base de datos:


Y habilitamos el envío de mensajes estándar y, opcionalmente, por email, en cuyo caso debemos especificar la dirección en el parámetro %r:


Definimos los Pool que servirán de almacenamiento, el tiempo durante el cual se guardarán los volúmenes y el tamaño máximo y número de volúmenes.


Definimos la consola:



Antes de arrancar la consola, nos aseguramos de que tiene puesta la ip correcta del Director al que tiene que conectar (/etc/bacula/bconsole.conf):


También debemos definir todos los componentes (director, sd y fd) en el archivo /etc/bacula/tray-monitor.conf.

Tras comprobar que todo está correcto, vamos a testear el sistema a mano para asegurarnos de que todo funciona correctamente. Para ello, iniciamos todos los servicios:
/etc/init.d/bacula-sd start
/etc/init.d/bacula-fd start
/etc/init.d/baclua-dir start
Y comprobamos las configuraciones de todos los ficheros:
/usr/sbin/bacula-sd -t -c /etc/bacula/bacula-sd.conf
/usr/sbin/bacula-fd -t -c /etc/bacula/bacula-fd.conf
/usr/sbin/bacula-director -t -c /etc/bacula/bacula-dir.conf
En mi caso, el Director me dio un error de autorización del usuario bacula en la base de datos. Esto lo solucioné dando permisos a dicho usuario y estableciendo el parámetro DB Address del bacula-dir.conf a localhost.

Arrancamos la consola de Bacula para administrar el sistema de backups de forma manual:
bconsole
Primero tecleamos help para ver una lista de los comandos disponibles, y tras ello creamos un volumen de almacenamiento:


Ahora vamos a crear un backup:


A partir de aquí, si tecleamos "yes", ejecutará el backup. En este caso, detecta que es un backup incremental. Sin embargo, si no hay ningún Full Backup que le sirva de base para hacer el incremental, hará un Full. Con un status dir obtenemos el estado del Director, así como un listado de los útlimos jobs:


En este caso, hemos hecho un Full, y después hemos hecho un Incremental (jobs 7 y 8), mostrando en cada caso los bytes copiados:


El comando restore es muy parecido, sólo hay que seguir las opciones disponibles para ejecutar un trabajo de restauración de archivos. Pongamos que ahora borramos todos los archivos de los que hemos hecho backup. Vamos a hacer un restore para comprobar (con archivos dummy por supuesto) que funciona bien.


Listamos los últimos 20 Jobs, y elegimos el último de ellos:


A partir de aquí podemos explorar el backup para ir seleccionando los archivos que queremos restaurar mediante el comando mark [nombre de archivo] o mark all para seleccionar todos los archivos:


En este caso sólo podemos seleccionar un archivo porque hemos seleccionado restaurar un backup Incremental, y es ese archivo el que habíamos modificado después de hacer el Full Backup. Tecleamos done para terminar, seleccionamos un cliente donde restaurar, y aceptamos:


Nos mostrará un mensaje del trabajo que se ha añadido a la cola para procesar y, si no hay trabajos pendientes, lo hará inmediatamente.

No obstante, aquí tenéis una completa guía de la consola de bácula donde se detallan todas las opciones disponibles y su funcionalidad.

Podemos comprobar que se ha restaurado correctamente el Full Backup, con los incrementales correspondientes hasta llegar al que habíamos seleccionado para restaurar:


Y ya está, tenemos un sistemas de backups completos e incrementales automatizados y, si quisiéramos, sobre un sistema de ficheros cifrado.

Seguramente hay soluciones mucho mejores, pero en cuanto a open source no está nada mal. Es fácil de montar y de gestionar, y lo que es más importante, la restauración de archivos funciona exactamente igual que los backups, evitando así la tediosa labor de rescatar un backup y devolver los archivos a sus sitios originales.

También podríamos comprimir los volúmenes llenos, bien mediante un cron o un script por ejemplo, pero eso ya lo dejamos a elección del lector.

--EOF--