Entradas

Sumas con beepers en GvR

En este artículo vamos a plantear un ejercicio avanzado para GvR. Pero comencemos por el principio porque seguramente te estés preguntado ¿qué es GvR?

GvR son las iniciales de Guido van Robot (http://gvr.sourceforge.net), un entorno para introducir a los más jóvenes en los fundamentos de la programación y además un simpático guiño a Guido van Rossum (autor de Python).

Para instalar GvR en Windows lo más sencillo es que descargues y descomprimas el paquete standalone (https://sourceforge.net/projects/gvr/files/GvR%20GTK/4.4/GvRng-4.4_win32_standalone.zip/) que incluye todo lo necesario para empezar a utilizarlo sin necesidad de instalar nada más.

Al abrir GvR nos encontraremos con una interfaz muy simple dividida en dos paneles laterales. El de la derecha, con dos pestañas, nos dará acceso al “Code Editor” donde introduciremos las instrucciones para controlar el robot y al “World Editor” con las instrucciones para recrear el mapa.

En el panel de la izquierda tenemos tres pestañas de las cuales la más interesante es la primera “Guido’s World” la cuál nos mostrará una recreación visual del mapa y el robot.

Representación visual del mapa en GvR

Como podemos ver en la imagen los elementos que componen un mapa de GvR son muy básicos:

  • Por un lado tenemos al propio robot en forma de triángulo con una G en medio, el vértice del triángulo nos indica hacia donde está mirando.
  • Además del robot tenemos las paredes representadas con líneas rojas. Si chocamos con una pared nuestro robot se detendrá inmediatamente y tendremos que empezar de nuevo.
  • Por último tenemos los beepers (esos círculos azules). El robot puede recoger los beepers y guardarlos en su mochila y también puede soltarlos siempre y cuando tenga alguno guardado. Los beepers pueden apilarse, es decir, pueden soltarse varios en la misma casilla, en cuyo caso dentro del círculo azul se mostrará cuantos beepers hay apilados.

El propio lenguaje en sí es a su vez muy simple contando con tan solo un puñado de instrucciones, puedes consultar la referencia aquí (http://gvr.sourceforge.net/documents/languageRef/gvr.html).

De hecho el lenguaje es tan simple que ni siquiera tenemos variables en las que almacenar información o tipos de datos (Integers, Strings, etc.) y es esta limitante la que me motivó a escribir el ejercicio que veremos a continuación.

El ejercicio propuesto consiste en sumar números de varios dígitos con cada dígito representado mediante beepers apilados.

En la imagen superior podemos ver un mapa de GvR para este ejercicio simulando la siguiente suma:

8 0 7 1 0 +

3 3 5 1 6 +

7 0 8 2 0 +

1 5 1 1 1

Sin poder convertir los beepers a Integers, sin operadores aritméticos que faciliten los cálculos y sin variables en las que almacenar información de estado (posición del robot, acarreo, cálculos intermedios, etc.) parece una tarea ardua pero a veces, en la vida real, el dispositivo para el que estemos programando no tiene tanta memoria como nos gustaría.

En este ejercicio nuestros estudiantes tendrán que estrujarse el cerebro y usar el pensamiento lateral para descubrir por sí mismos el compromiso RAM-CPU, a menudo si no queremos o podemos consumir más memoria podemos suplirlo con un exceso de ciclos de procesador.

Empezaremos creando una librería de movimientos para nuestro robot. Si has revisado la documentación del lenguaje te habrás dado cuenta de que aunque existe una función para girar a la izquierda, no existe otra para girar a la derecha. Esto no es un problema y forma parte de los retos que plantea GvR para que los estudiantes aprendan desde el principio a resolver problemas más complejos con herramientas muy simples. En este caso para girar a la derecha simplemente tendremos que girar 3 veces a la izquierda, creemos una función para ello. Igualmente ya hemos visto que chocar con una pared hará que nuestro programa se detenga inmediatamente así que antes de avanzar siempre nos interesará comprobar si hay una pared delante o no, creemos otra función para ello. Así, con funciones simples pero útiles podemos crear una sencilla librería que nos facilite el control de nuestro robot.

Ahora que podemos controlar nuestro robot de forma sencilla vamos a atacar el ejercicio. Cuando aprendemos a sumar de pequeños lo hacemos en dos pasos, primero con sumas sencillas donde la suma de dígitos en una columna no es mayor de 9 y por lo tanto no hay acarreo. Después pasamos a sumas más complejas donde los dígitos ya sí suman más de 9 y tenemos que hacer un acarreo (“llevarnos una” a la siguiente columna). Nosotros lo haremos igual, primero veremos como resolver sumas sencillas y después veremos como nos peleamos con el acarreo.

Resolver una suma sencilla en este escenario es muy fácil gracias al apilado de beepers. Lo único que tenemos que hacer es ponernos encima de una columna y descender por ella recogiendo todos los beepers, al llegar abajo los soltamos todos resultando en la suma de los dígitos y pasamos a la siguiente columna.

Ejemplo de suma sencilla (sin acarreos)

Resultado de la suma

Ahora probemos a resolver una suma con acarreo pero sin calcular el acarreo, el resultado sería el siguiente:

Ejemplo de suma con acarreo, las casillas vacías representan un 0

Resultado de la suma, sin calcular el acarreo

La problemática que encontramos ahora es, con las limitaciones del lenguaje, cómo detectamos para cada casilla si hay acarreo o no y en caso positivo cuántas nos “tenemos que llevar”.

Bien, lo primero que haremos será recorrer las casillas de derecha a izquierda ya que el acarreo siempre realiza hacia la izquierda. Para cada casilla tenemos que saber si hay al menos 10 beepers. Con una variable que pusiésemos usar de contador sería muy fácil, pero sin ella no nos queda más remedio que sacrificar algo de CPU e intentar coger 9 beepers (aunque haya menos en la casilla, pero no podemos saberlo de antemano). Cuidado, intentar coger un beeper cuando no hay ninguno en la casilla hará que nuestro programa se detenga así que tendremos que usar nuestra librería de control donde habremos creado una función que antes de coger un beeper compruebe si hay alguno.

Si tras “intentar” coger 9 beepers no queda ninguno en la casilla entonces es que en esa casilla no hay al menos 10 beepers y por lo tanto no hay acarreo. Soltamos todos los beepers para dejar la casilla como estaba y pasamos a la siguiente de la izquierda.

Por otro lado si tras “intentar” coger 9 beepers queda alguno en la casilla entonces es que la casilla hay al menos 10 beepers y debemos proceder con el acarreo. Para ello cogemos 1 más (sólo habíamos cogido 9), nos movemos a la casilla de la izquierda y soltamos 1 (al haber quitado 10 nos llevamos 1), ahora nos quedan 9 beepers en la mochila de los que nos tenemos que deshacer. Es necesario que vaciemos la mochila ya que de lo contrario cuando volvamos a coger beepers de una casilla para comprobar si hay acarreo, en caso de que no lo haya y tengamos que soltar todos los beepers para dejar la casilla como estaba estaremos soltando 9 beepers de más.

Para vaciar la mochila volvemos al punto de partida (base), a la derecha del todo y soltamos todos los beepers. Una vez tenemos la mochila vacía lo ideal sería volver a la casilla que estábamos calculando antes pero sin variables no tenemos forma de almacenar la posición, así que no nos queda más remedio que sacrificar CPU de nuevo y volver a calcular todos los acarreos desde el principio, si bien puesto que ya hemos quitado 10 beepers de una casilla, ya nos queda un acarreo menos que calcular.

Reducir los acarreos por oleadas también nos garantiza que en caso de que en una casilla no solo haya más de 10 beepers sino más de 20, 30, etc, estos acarreos también se calculen correctamente.

Resultado de la suma con el acarreo calculado

Quizá lo último que nos queda por aclarar es cómo saber cuándo estamos en la base, al comienzo de una columna para empezar a “barrer” beepers hacia abajo o cuándo hemos llegado al final de la suma. Para poder sabe en que punto estamos no apoyamos en las paredes. Cuando toquemos la pared de arriba sabremos que estamos al comienzo de una columna, cuando toquemos la pared de la izquierda sabremos que hemos llegado al final de la suma y si bajamos abajo del todo y nos desplazamos a la derecha hasta que toquemos una pared entonces habremos llegado a la base. De esta manera si queremos sumar más cantidad de números o números más largos (con más dígitos) simplemente tendremos que mover la pared de arriba más arriba y la de la derecha más a la derecha.

Y con esto llegamos al final de nuestro ejercicio y del post. Espero que os haya gustado y os permita inspirar a vuestros alumnos para que vayan más allá de los límites aparentes. Tenéis todo el código a vuestra disposición mi repositorio (https://gitlab.com/kaisec/GvR_Lessons).

Fuentes de información abiertas OSINT

Fuentes de Información Abierta OSINT

El término OSINT es un término anglosajón que hace referencia a las fuentes abiertas, de acceso libre y desclasificadas. Este término hace referencia a la labor de inteligencia realizada a partir de fuentes públicamente accesibles (Open Source Inteligence). Es importante aclarar, en todo caso, que el término ‘fuente abierta’ no está necesariamente vinculado al código abierto (también llamado ‘open source’ en inglés). Las fuentes documentales ‘abiertas’ no tienen por qué ser de acceso gratuito ni contar con licencia Copyleft: lo que las define es, según se recoge en la web de Cartograf, que “todas ellas son fuentes accesibles procedimentalmente (aunque el procedimiento sea tan poco burocrático como rastrear la web abierta), sin necesidad de subterfugios y sin necesidad de realizar o mantener conversaciones en privado ni vigilancia en el sentido detectivesco clásico”

 

 

Esta búsqueda de información en fuentes abiertas es utilizada por los hackers en la fase de Information Gathering, usando herramientas específicas para la búsqueda de esta información. En distribuciones como Kali Linux encontramos una apartado especial para la búsqueda de esta información:

Muchas de estas herramientas no solo tienen el objetivo de buscar información en fuentes abiertas, pero eso será el contenido de otro post. Ahora mismo solo mencionaremos theHArvester como ejemplo de las posibilidades que dan este tipo de herramientas.

The Harvester es un ejemplo de herramienta para buscar en fuentes abiertas,  la cual nos presenta información sobre emails, subdominios, hosts, nombres de empleados, puertos abiertos, banners, etc .. desde fuentes públicas como son los motores de búsqueda, servidores PGP, la red social LinkedIN y la base de datos de SHODAN (Buscador parecido a Google pero con la diferencia que no indexa contenido, si no que registra cualquier dispositivo conectado a Internet).

Clonamos:

 

Vamos a la carpeta con $cd theHarvester:

Y lo lanzamos utilizando el ejemplo que aparece en la propia herramienta para ilustrarlo:

Obteniendo los siguientes resultados:

Ya tenemos un vector de ataque por donde empezar. 🙂

 

Para terminar, comentar que desde el Insituto Nacional de CiberSeguridad (INCIBE) señalan una serie de utilidades para las que puede ser usada esta información:

  1. Conocer la reputación online de un usuario o empresa.
  2. Realizar estudios sociológicos, psicológicos, lingüísticos, etc.
  3. Auditoría de empresas y diferentes organismos con el fin de evaluar el nivel de privacidad y seguridad.
  4. Evaluar tendencias de mercados.
  5. Identificación y prevención de posibles amenazas en el ámbito militar o de la seguridad nacional.
  6. Como aspecto negativo, es utilizado por cibercriminales para lanzar ataques APT y ‘Spear Phishing’.

Todos sabemos del auge de las redes sociales y  lo que supone esta utilización masiva brindando una gran cantidad de información de fuente abierta que nos permite recoger mucha información de cualquier persona y utilizarla para la investigación, ya sea esta para un Pentesting o para otros fines. Si a esta cuestión le añadimos la Inteligencia Artificial y el Big Data podemos pensar la repercusión que puede tener. Quizás no estemos tan alejados de aquella serie de televisión de la CBS “Person of Interest”

 

Referencias:

https://inteltechniques.com/menu.html

http://www.cartograf.net/pedia/inteligencia-fuente-abierta-osint

http://blog.segu-info.com.ar/2015/03/osint-que-es-la-inteligencia-de-fuentes.html

http://osintblog.org

https://www.certsi.es/blog/osint-la-informacion-es-poder

http://hackpuntes.com/obtener-informacion-con-the-harvester/

https://github.com/laramies/theHarvester

Desplegando GitLab en Amazon EC2

A continuación vamos a explicar como desplegar un gestor de repositorios en una instancia Amazon EC2. Para ello primero haremos primeramente una breve introducción a los dos principales sistemas:

  • Por un lado Amazon Elastic Compute Cloud o Amazon EC2 que es una parte central de la plataforma de cómputo en la nube de la propia compañía Amazon, denominada Amazon Web Services (AWS). EC2 permite a los usuarios alquilar computadores virtuales en las cuales poder ejecutar sus propias aplicaciones. Dicho servicio, dispone de una capa de servicios gratuita, con una duración para altas nuevas de 1 año. Para nuestro caso esto será más que suficiente.
  • Por otro lado GitLab, un proyecto open source para la gestión de repositorios. El concepto es el mismo que el que maneja GitHub pero esta vez seremos nosotros quienes tendremos el control de nuestros repositorios.

Configuración de instancia Amazon EC2

Ahora vamos a meternos en materia, y para ello lo primero que debemos hacer es crear la instancia EC2 (dando por supuesto que ya disponéis de cuenta en Amazon) en la que desplegaremos GitLab:

  1. Accedemos a la consola de administración de Amazon AWS con nuestras credenciales.
  2. Seleccionamos Services > EC2
  3. Elegimos la opción Launch Instance (botón).

Ahora vamos a crear y configurar la instancia:

  1. Elegimos una AMI (Amazon Machine Image), en nuestro caso y en el momento actual seleccionaremos “Ubuntu Server 16.04 LTS (HVM), SSD Volume Type”. Pulsando Select (botón). La reconoceréis fácilmente dentro de la capa gratuita porque está etiquetada como “Free Tier Eligible”.
  2. El siguiente punto nos indica el tipo de la instancia, en nuestro caso elegiremos una t2.micro (incluida en la capa gratuita) y pulsaremos “Next: Configure Instance Details”.
  3. En la siguiente opción, “Configurar la instancia” no modificaremos ninguno de los aspectos informados por defecto y pulsaremos “Next: Add Storage”.
  4. En el punto de configuración de almacenamiento no modificaremos nada ya que por defecto la instancia se crea con 8Gb y esto es más que suficiente para la prueba que nos ocupa. No obstante en el momento actual Amazon permite crear una instancia con almacenamiento de 30Gb o 2 con almacenamiento de 15Gb dentro de la capa gratuita.
  5. Seleccionaremos “Review and Launch” y esto nos llevará a un resumen de la información configurada.
  6. A continuación seleccionamos “Launch”.

Una vez pulsemos “Launch” se nos presentará un cuadro de dialogo que nos pregunte si queremos generar un nuevo juego de llaves o por el contrario queremos continuar con alguno que hayamos generado previamente. Es importante que conservemos el juego al menos hasta habernos logado en el servidor y posteriormente modificado la obligatoriedad de uso del key.

Conexión a instancia

Accedemos mediante conexión ssh desde un terminal con el siguiente comando:

ssh -i "Key.pem" ubuntu@ec2-52-39-107-12.us-west-2.compute.amazonaws.com

De el comando anterior el entrecomillado debe corresponder con la ruta y nombre del .pem que habéis generado, “ubuntu” es el usuario por defecto para cualquier conexión y todo lo que figura de la @ en adelante es la DNS de vuestra instancia en Amazon.

Instalación de GitLab

A continuación instalamos Gitlab community edition en nuestra instancia para ello:

  1. Accedemos a la web y seleccionamos la versión de nuestro OS, en nuestro caso Ubuntu 16.04
  2. En ese instante se mostrarán los comandos a ejecutar para la instalación:
  1. sudo apt-get install curl openssh-server ca-certificates postfix
  2. curl -sS https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.deb.sh | sudo bash sudo apt-get install gitlab-ce
  3. sudo gitlab-ctl reconfigure

Configuración del puerto de acceso

Para poder acceder a la URL de nuestro servidor y que la misma nos de acceso a GitLab necesitaremos habilitar el puerto http y esto lo haremos:

  1. Seleccionando “security groups” (menú lateral izquierdo) dentro del apartado “network and security”.
  2. Seleccionando la pestaña “inbound”.
  3. Pulsaremos “edit” y posteriormente en “add rule” para seleccionar en la opción “type” el tipo “http”, asegurándonos de que en “source” tenemos seleccionado “anywhere” y una ip de este tipo “0.0.0.0/0” y dejando el resto tal cual.

Lo siguiente será acceder a la URL de nuestro servidor (para este ejemplo ec2-52-39-107-12.us-west-2.compute.amazonaws.com) y comprobar que GitLab está instalado y funcionando.

Os recomiendo que no intentéis probar a acceder a la instancia usada para el ejemplo porque después de haber realizado el mismo, fue eliminada.

stormtroopers go to school

Vuelve la segunda edición de EastMadHack con los deberes hechos

Aunque a los que en la anterior edición nos vimos involucrados en el evento de un modo u otro nos parezca imposible, ha pasado ya casi un año de ello, y seguimos en marcha para poder repetir este año con nuevos ponentes, nuevos patrocinadores, nuevos regalos, un programa diferente, mejor organización, mejor localización… y otras muchas cosas que están por venir.

Ya que hemos estado durante un “largo” periodo sin hacer ninguna comunicación, queríamos haceros participes de las cosas que han centrado nuestra atención durante lo que quedó de 2016 y lo que llevamos de 2017:

  • Reflexionar sobre la primera edición del evento en 2016. Durante el transcurso de la pasada edición recogimos el feedback de asistentes, ponentes, colaboradores, así como nuestra propia experiencia y durante este año hemos estado madurando todo lo recopilado de cara a mejorar en esta nueva edición.
  • Constitución como asociación. Ya que el objetivo es poder establecernos como referente en la zona, y poder no solo organizar charlas divulgativas, si no promover formaciones, hackathones, charlas en institutos… hemos analizado la situación y decidido constituirnos legalmente como asociación para dar cobertura a todas estas actividades.
  • Organización del programa 2017. Tal como ya se ha comentado en los dos puntos anteriores el objetivo es dar continuidad al proyecto y sobre todo subsanar errores y mejorar en todos los ámbitos. Aunque la fecha (posiblemente el último fin de semana de Mayo) y los ponentes aún se están cerrando, pronto podremos ampliar información sobre este punto.
  • Talleres y formaciones. Pretendemos que este año este lleno de novedades y para ello hemos establecido una serie de formaciones y talleres. Algunos de ellos se llevarán a cabo antes del evento y la información estará disponible en breve para que podáis consultar los programas y apuntaros a los mismos.

Los que asististeis el año pasado al evento recibiréis información actualizada por medio de la newsletter y a los que no asististeis os invitamos a que nos acompañéis este año, y a que os suscribáis a nuestra newsletter si queréis estar al tanto de todo lo que pasa en EastMadHack.

Como veis, hemos hecho los deberes.

gracias a todos

Gracias a los colaboradores de EastMadHack

eastmadhacklogo

Gracias a los colaboradores de EastMadHack. No quisieramos llevar a cabo el evento sin contar cómo han colaborado todos aquellos que forman parte de EastMadHack, desde los ponentes hasta los colaboradores y distintos agentes locales que hayan podido tener alguna implicación para hacer que la iniciativa salga adelante.

Creo que lo más justo es empezar por los ponentes:

Gracias a todos/as por compartir con nosotros de manera desinteresada vuestros conocimientos y tiempo, por bloquear vuestras agendas para estos días, por vuestra dedicación y vuestra amabilidad.

Y a continuación a todos aquellos que han aportado de una forma u otra:

  • NomadaLab por hacerse cargo de la realización de la web y la difusión en redes sociales, y por por asumir los gastos de hosting y dominio
  • 0xWord por facilitarnos libros que sortear durante el evento, así como carteles publicitarios, libros para la venta…
  • Ra-ma Editorial y MundoHacker por facilitarnos libros que sortear en el evento, así como libros para la venta
  • ESET por los códigos de activación con los que obsequiará a cada uno de los asistentes

En definitiva gracias a todos aquellos/as que habéis aportado de una forma u otra en mayor o menor medida, desde los que han hecho un retweet hasta los que han incluído un post en su blog, pasando por aquellos que nos han transmitido su ánimo y apoyo. Estamos encantados de colaborar con un gran equipo como el que hemos formado.