Implementación teórica con BlockChain para un sistema de votaciones

Ha inicios de este año recibí un mensaje en Linkedin donde me preguntaban si estaba interesado en comenzar un proceso de reclutamiento, lo cual no es nada raro ya que siendo ingeniero de software (una de las industrias con más de profesionales en la actualidad) te llegan correos con propuestas laborales todos los días, sin embargo esta propuesta me pareció bastante interesante ya que necesitaban un Senior BlockChain Engineer, el mensaje en cuestión era:

Si bien no tengo experiencia desarrollando BlockChain como tal, si tengo bastante experiencia con sistemas distribuidos, así que me di a la tarea de comenzar a aprender el funcionamiento de esta tecnología desde un punto de vista técnico, sus conceptos básicos y sobre todo tratar de entender por que se volvió tan popular y sera el “futuro”.

Disclaimer: El código mostrado en el articulo a continuación no es una implementación real de BlockChain (no esta ni cerca del 1% de ser un proyecto real) la intención es resaltar y explicar las partes mas importantes y hacer hincapié en los conceptos básicos de lo que es BlockChain, el código dista de ser perfecto y no debe ser usado en producción.

Bueno ya estan advertidos hehe, comenzamos.

El bloque

Para entender lo que es la cadena de bloques primero tenemos que entender lo que es un bloque, el bloque puede ser representado como un objeto que contiene un identificador único, un timestamp, información en cualquier formato que queramos, un hash o checksum que representa la información que contiene y lo mas importante es que debe tener una referencia al bloque anterior, como si de una lista enlazada se tratara.

Con un lenguaje tan sencillo como Javascript podemos representar al bloque de la siguiente forma:

class Block {
  constructor(index, timestamp, data, previousHash = '') {
    this.index = index;
    this.timestamp = timestamp;
    this.data = data;
    this.previousHash = previousHash;
    this.hash = this.calculateHash();
  }

  calculateHash() {
    return SHA256(this.index + this.timestamp + JSON.stringify(this.data) + this.previousHash).toString();
  }
}

La clase bloque contiene una función muy especial llamada calculateHash, esta función toma toda la información del bloque (index, timestamp, data, previousHash), la concatena y le aplica un algoritmo de hashing para generar un checkSum que despues sera almacenado en el mismo bloque, la parte interesante y una de las razones por las que BlockChain es seguro es precisamente el uso de estas funciones criptográficas, ya que su integridad esta respaldada de forma matemáticamente.

Detengamonos por unos segundos y pensemos, si todo bloque debe de tener una referencia al hash del bloque anterior, y ese dato (previousHash) se utiliza para calcular el hash del bloque actual eso significa que si alguien hackea/modifica/elimina uno de los bloques anteriores todos los siguientes bloques quedarían invalidados 🙂 , seria un efecto domino de fallas en la integridad de los bloques.

Esta es la representación mas básica que se me ocurre de un bloque, en la vida real son estructuras de datos mucho mas complejas y en la parte de los datos pueden contener muchísimas mas piezas de información y no solo una, como lo es el caso de las transacciones en la BlockChain de Bitcoin.

La cadena

Habiendo entendido un poco lo que es el bloque ahora toca el turno de la cadena, esta es otra estructura de datos que funciona alrededor de los bloques y realiza operaciones con ellos, mencione que esta tecnología es muy parecida a una lista enlazada, si el bloque es uno de los nodos entonces la cadena serian las operaciones de agregar, eliminar, modificar, etc nodos, aunque en BlockChain solo podemos agregar bloques y nunca eliminarlos por lo que mencionaba sobre la integridad de los hashes.

En Javascript podemos representar la cadena de la siguiente forma:

class BlockChain {
  constructor() {
    this.chain = [this.createGenesisBlock()];
  }

  createGenesisBlock() {
    return new Block(0, new Date(), "Genesis block");
  }

  getLatestBlock() {
    return this.chain[this.chain.length - 1];
  }

  addBlock(block) {
    block.previousHash = this.getLatestBlock().hash;
    block.hash = block.calculateHash();
    this.chain.push(block);
  }

  isChainValid() {
    for(let i = 1; i < this.chain.length; i++) {
      const currentBlock = this.chain[i];
      const previousBlock = this.chain[i - 1];
      if (currentBlock.hash !== currentBlock.calculateHash()) {
        return false;
      }
      if(currentBlock.previousHash !== previousBlock.hash) {
        return false;
      } 
    }
    return true;
  }
}

Tenemos varias funciones interesantes como addBlock (agregar nuevo bloque), getLatestBlock (obtener el ultimo bloque), isChainValid (valida la integridad de la cadena de bloques) y createGenesisBlock, estas dos ultimas son las mas interesantes.

Mencione que cada bloque debe tener una referencia al bloque anterior ¿Pero entonces cuál fue el primer bloque 🙂 ?

Toda cadena de bloques inicia con un bloque llamado Bloque Genesis, ese nombre no es nada mas que una convención, es la forma de inicializar la cadena.

La función isChainValid verifica la integridad de la cadena utilizando los hashes de cada uno de los bloques, comienza revisando a partir del segundo bloque (uno después del bloque génesis) y primero revisa que el hash actual efectivamente corresponda con la información del bloque

if (currentBlock.hash !== currentBlock.calculateHash()) {
  return false;
}

Después revisa que la referencia (previousHash) al bloque anterior sea la correcta:

if(currentBlock.previousHash !== previousBlock.hash) {
  return false;
} 

Así hasta llegar al ultimo bloque y si todo sale bien la cadena es valida :). Sin embargo si entendieron bien el concepto de verificación de integridad pueden ver el problema con esta implementación, si bien no es posible modificar la información de un bloque intermedio, teóricamente es posible “hackear” la información del ultimo bloque antes de que agreguen nuevos nodos a la cadena.

Este precisamente es el problema que se aborda en el primer paper de Bitcoin por Satoshi Nakamoto: Bitcoin: A Peer-to-Peer Electronic Cash System

Sin entrar en detalles, en implementaciones reales la cadena de bloques no se encuentra centralizada en una sola maquina, en lugar de eso es una red distribuida y todas las computadoras de la red contienen una copia completa de la cadena, entonces cada vez que alguien va a agregar un nuevo bloque toda la red tiene que consentir y finalmente ese bloque se almacena en las cadenas de todas las maquinas, sin embargo esta solución abre la posibilidad a nuevos tipos de ataques como por ejemplo el double spend attack, aun así, teóricamente sigue siendo posible “hackear” la BlockChain pero para eso tendrías que modificar los últimos bloques de todas las maquinas de la red lo cual requiere una cantidad inmensa de recursos y por lo tanto no es factible.

Ejemplo de BlockChain para votaciones

Habiendo aprendido los conceptos básicos ahora podemos pensar en como usar BlockChain para almacenar información referente a un sistema de votaciones, vamos a escribir unas cuantas pruebas en Javascript para probar nuestras dos clases, Block y BlockChain.

  it('Generate genesis block', () => {
    voteChain = new BlockChain();
    assert.lengthOf(voteChain.chain, 1);
    assert.equal(voteChain.chain[0].data, 'Genesis block');
  });

Con este test probamos que la cadena se inicializa y el bloque génesis es generado correctamente (la longitud de la cadena es 1 y data del primer bloque contiene el string ‘Genesis block’)

Ahora vamos a agregar unos cuantos bloques a la cadena

  it('Add some blocks', () => {
    voteChain.addBlock(new Block(1, new Date(), { user: 'Manuel', voted: 'PRI' }));
    voteChain.addBlock(new Block(2, new Date(), { user: 'Andres', voted: 'PAN' }));
    voteChain.addBlock(new Block(3, new Date(), { user: 'Julio', voted: 'PRD' }));
    voteChain.addBlock(new Block(4, new Date(), { user: 'Carlos', voted: 'PRI' }));
    voteChain.addBlock(new Block(5, new Date(), { user: 'Ruben', voted: 'PAN' }));
    voteChain.addBlock(new Block(6, new Date(), { user: 'Laura', voted: 'PRD' }));
    assert.lengthOf(voteChain.chain, 7);
  });

Estamos almacenando nombres de personas y el partido político mexicano por el que votaron, un bloque a la vez y al final verificamos que la longitud de la cadena es 7 (incluyendo el bloque génesis). En la vida real esto es mucho mas complicado ya que la gente no podría agregar bloques “solo por que si”, al igual que con Bitcoin se utilizaría una tecnología de PKI (Infraestructura de llave publica) en donde cada transacción de voto deberá ser firmada usando la llave privada (como con la FIEL del SAT) de la persona que emite su voto, de esa manera nadie podría votar a nombre de alguien mas.

Ahora tenemos nuestro test para verificar la integridad de la BlockChain, si la cadena es valida esperaríamos que la función isChainValid nos devolviera true.

  it('Validate chain integrity', () => {
    assert.isOk(voteChain.isChainValid(), 'Block hashes are incorrect'); // this should return true
  });

Observen como en cada uno de los bloques el valor de previousHash es identico al hash del bloque anterior

En la ultima prueba simulamos que alguien modifico el voto de alguien mas, para eso tomamos de forma aleatoria un bloque y cambiamos el valor de su data por el nombre de otro partido político.

  it('Changing random data in the BlockChain', () => {
    const min = 0; // first block id
    const max = 5; // for academic purpose this cannot be 6 (the last block id) due to double spend attack
    const blockId = Math.floor(Math.random() * (max - min + 1) + min); // https://stackoverflow.com/questions/4959975/generate-random-number-between-two-numbers-in-javascript
    const block = voteChain.chain[blockId];
    block.data = { user: block.data.user, voted: 'MORENA' }; // Changing block value
    block.hash = block.calculateHash(); // Re calculate the current block hash so no one notices the hack
    assert.isNotOk(voteChain.isChainValid(), 'Block hashes are incorrect'); // this should return false
  });

El test, de forma aleatoria, tomo el bloque con index 2 y cambio los valores que tenia en data y eso hizo que el hash resultante de ese bloque cambiara completamente.

hash antes del cambio:
9ecbe54e3e6b3f22a522bbee7f399002f1de2d653c15a74d2d321f27cdfe116b

hash después del cambio:
3e6c8f5c0a734db4bb19483a11022081250171621e5c5c17c21a302d1d9d14d0

Por lo tanto el previousHash del bloque index 3 ya no coincide con el del bloque index 2.

Debido a este cambio la validación de integridad de la cadena fallara (siempre y cuando no modifiquemos los datos del ultimo bloque) y isChainValid() nos devolverá false.

Y eso es todo por ahora, finalmente si quieren descargar este sencillo código para verlo mas a detalle o simplemente para tenerlo lo pueden hacer desde el siguiente repositorio de github alevsk blockchain javascript con los siguientes comandos

$ git clone https://github.com/Alevsk/blockchain-javascript
$ cd blockchain-javascript
$ npm install
$ mocha index.test.js

Resumen

BlockChain nos ofrece ante todo integridad de la información, nos asegura que la información no puede ser cambiada ni eliminada sin que nos demos cuenta, ademas por su naturaleza de ser un sistema distribuido es virtualmente imposible hackear la red, esta tecnología aplicada a un sistema de votaciones nos garantiza que algo como el robo de votos no puede ocurrir y tendríamos total transparencia en las votaciones.

Si quieren aprender mas sobre esta tecnología les recomiendo ver este video en donde se explica con mucho mas detalle como funciona Bitcoin y la BlockChain en general, se abordan muchísimos mas conceptos de los que mencione en este articulo.

Happy hacking 🙂

Si te gusto comparte ...Share on Facebook
Facebook
Share on Google+
Google+
Tweet about this on Twitter
Twitter
Share on LinkedIn
Linkedin

Introducción a GraphQL, Queries y Mutations

Como algunos de ustedes sabrán llevo poco mas de 1 año trabajando con una startup (si, deje Oracle XD) cuyo stack esta conformado en su mayoría por tecnologías de Javascript (NodeJS, ReactJS, Redux, Apollo, GraphQL, React-native, etc). y en esta ocasión quiero compartir con ustedes el material de la platica que di en el GDLJS del mes de octubre en Guadalajara, se trata de una breve introducción a GraphQL y cual ha sido mi experiencia con esta tecnología.

¿Que es GraphQL?

Primero lo primero, GraphQL es un lenguaje de consultas para tu API creado por Facebook en 2012, es decir, es un intermediario comúnmente utilizado entre un cliente y algún orm de tu elección, es importante mencionar que GraphQL no se conecta directamente a tu base de datos, en lugar de eso ayuda a que el cliente defina el formato de la respuesta que desea obtener del servidor, mas adelante veremos algunos ejemplos.

¿Cual es la diferencia?

Ya existen bastantes frameworks para desarrollar apis ¿Por que quisiera usar GraphQL?

Bueno una de las principales diferencias con apis basadas en REST simple que tienen múltiples endpoints es que en tu api basada en GraphQL solo tendras uno.

Ademas de eso las apis comunes utilizan varios métodos HTTP (GET, POST, DELETE, PUT, OPTIONS, etc) según la operación que vayan a realizar, mientras que con GraphQL usaras solamente POST si así lo deseas, un endpoint para gobernarlos a todos 😉

Todo bien hasta aquí, pero no me haz dicho realmente cual es el beneficio de usar esta tecnología

Tranquilo pequeño saltamontes, consideremos el caso siguiente:

Del lado izquierdo tenemos un cliente que hace una petición GET a un endpoint de álbumes pasando un id para obtener sus assets, posteriormente por cada uno de esos assets solicita los comentarios (múltiples peticiones al servidor), adicionalmente los objetos JSON que reciba en las respuestas siempre tendrán los mismos atributos.

Del lado derecho vemos la petición POST equivalente para un endpoint basado en GraphQL, como podemos observar en el mismo payload de nuestra petición estamos indicando el formato de respuesta que queremos que el servidor nos regrese, atributos en los objetos, etc.

Habra quien diga que puede ingeniárselas para que la petición defina la respuesta del servidor, regresar atributos dinámicamente, etc. y le creo pero buena suerte manteniendo algo como esto 🙂

GET /albums/1/assets/comments/?include=asset.name,comment.author,comment.text

Este es precisamente el problema que GraphQL resuelve, GraphQL nos permite definir relaciones entre las entidades de nuestra aplicación e inyectar esos objetos relacionados en las respuestas cada vez que el cliente lo pida.

El siguiente ejemplo de código esta basado en Javascript utilizando expressJS, supongamos que el cliente necesita desplegar en su frontend un objeto como el siguiente:

Un objeto película con datos como su nombre, el año y la calificación de la critica, adicionalmente también queremos los datos de los actores involucrados y los comentarios de los visitantes que han visto esa pelicula.

Manos a la obra, vamos a iniciar un nuevo proyecto con NodeJS

$ npm init
$ npm install --save express express-graphql graphiql graphql

Adicionalmente me gusta definir algunos comandos e instalar algunas dependencias para tener soporte es6, aquí pueden ver como queda mi package.json al final.

La estructura del proyecto es mas o menos la siguiente (demo-server)

Los archivos y carpetas mas importantes son:

  • app.js es nuestro entry point
  • graphql es la carpeta donde guardaremos nuestros “objetos QL”
  • data es la carpeta donde tendremos algunos objetos de ejemplo que simulan registros de la base de datos

Vamos a comenzar con el objeto Movie (película), en la carpeta graphql creamos un nuevo archivo llamado movieQL.js

import {
  GraphQLObjectType,
  GraphQLInt,
  GraphQLString,
  GraphQLList,
  GraphQLBoolean,
  GraphQLNonNull,
  GraphQLFloat,
} from 'graphql';

import actorQL from './actorQL';
import commentQL from './commentQL';

const movieQL = new GraphQLObjectType({
  name: 'movieQL',
  description: 'This is a movie QL object',
  fields: () => {
    return {
      name: {
        type: GraphQLString,
        resolve(movie) {
          return movie.name;
        }
      },
      score: {
        type: GraphQLFloat,
        resolve(movie) {
          return movie.score;
        }
      },
      year: {
        type: GraphQLInt,
        resolve(movie) {
          return movie.year;
        }
      },
      actors: {
        type: new GraphQLList(actorQL),
        resolve(movie) {
          return movie.actors;
        }
      },
      comments: {
        type: new GraphQLList(commentQL),
        resolve(movie) {
          return movie.comments;
        }
      },
    }
  }
});

export default movieQL;

Como podemos observar al inicio estamos haciendo import de varios módulos que representan tipos de datos escalares en graphQL, adicionalmente hacemos import de otras 2 entidades de nuestra aplicación, actorQL.js y commentQL.js, después en el atributo fields de nuestro objeto movieQL definimos varios campos del mismo junto con su tipo y aqui viene lo mas importante, definimos actors como una lista de tipo actorQL y comments como una lista de tipo commentQL, el código de las otras entidades es bastante similar al de movieQL por lo que no lo pondre en el post, pueden revisarlo en el repositorio: actorQL.js y commentQL.js

Queries y mutations

Otro de los conceptos básicos en graphQL son las queries y las mutations, existe toda una teoría detrás pero en resumen:

  • Queries: nos permiten leer datos del servidor (por lo general extraídos de una db)
  • Mutations: Crear / modificar / borrar datos en el servidor

Dentro de la misma carpeta graphql vamos a crear 2 nuevos archivos, queryQL.js y mutationQL.js

import {
  GraphQLObjectType,
  GraphQLList,
  GraphQLString,
  GraphQLInt,
  GraphQLBoolean
} from 'graphql';

import movieQL from './movieQL';
import { movies } from '../data';

const query = new GraphQLObjectType({
    name: 'Query',
    description: 'This is the root Query',
    fields: () => {
      return Object.assign({
        getMovies: {
          type: new GraphQLList(movieQL),
          args: {},
          resolve(root, args, request) {
            // do some db queries
            return movies;
          }
        },
      });
    },
});

export default query;

Para efectos de que esto es un demo no estamos utilizando ningún orm para conectarnos a alguna base de datos, pero ustedes son libres de elegir e implementar el que mas le guste, de la misma forma que en movieQL.js definimos los fields aquí estamos definiendo nuestros “endpoints”, por ejemplo estamos diciendo que getMovies es una query que nos regresara una lista de movieQL y estamos haciendo return del objeto movies (que es un objeto de ejemplo que importamos de la carpeta data).

De la misma forma dentro de mutationQL.js declaramos una operación llamada createMovie que nos retornara un objeto tipo movieQL (después de haberlo creado), la parte importante aquí es que por lo general los mutations reciben argumentos (name, year, score, lista de actores, lista de comentarios) y de nuevo, para efectos de que esto es un demo no estamos haciendo nada con los datos que nos enviá el usuario, simplemente los regresamos en la respuesta.

import {
  GraphQLObjectType,
  GraphQLInt,
  GraphQLString,
  GraphQLNonNull,
  GraphQLList,
  GraphQLInputObjectType,
  GraphQLBoolean,
  GraphQLFloat,
} from 'graphql';

import movieQL from './movieQL';

const actorInputQL = new GraphQLInputObjectType({
  name: 'actorInputQL',
  fields: {
    name: { type: GraphQLString },
    age: { type: GraphQLInt },
    country: { type: GraphQLString },
  },
});

const commentInputQL = new GraphQLInputObjectType({
  name: 'commentInputQL',
  fields: {
    user: { type: GraphQLString },
    commentary: { type: GraphQLString },
    timestamp: { type: GraphQLString },
  },
});

const mutation = new GraphQLObjectType({
  name: 'Mutation',
  description: 'This is the root Mutation',
  fields: () => {
    return Object.assign({
      createMovie: {
        type: movieQL,
        args: {
          name: {
            type: new GraphQLNonNull(GraphQLString),
          },
          year: {
            type: GraphQLInt,
          },
          score: {
            type: GraphQLFloat,
          },
          actors: {
            type: new GraphQLList(actorInputQL),
          },
          comments: {
            type: new GraphQLList(commentInputQL),
          },
        },
        resolve(root, args, request) {
          // do something here
          return args;
        },
      },
    });
  },
});

export default mutation;

Hasta aquí ya tenemos definidos nuestros queries y mutations de ejemplo, ha llegado el momento de definir un schema de graphQL e integrar todo con express, es bastante sencillo, comenzamos creando un archivo llamado schemaQL.js también dentro de la carpeta graphql

import { GraphQLSchema } from 'graphql';
import queryQL from './queryQL';
import mutationQL from './mutationQL';

const schemaQL = new GraphQLSchema({
  query: queryQL,
  mutation: mutationQL,
});

export default schemaQL;

Como podemos ver, simplemente importamos los modulos de queryQL y mutationQL y finalmente en nuestro entry point (app.js) mandamos llamar a graphQL con el schema recién creado.

import express from 'express';
import GraphHTTP from 'express-graphql';
import schemaQL from './graphql/schemaQL';

var app = express();

app.use('/graphiql', GraphHTTP({
    schema: schemaQL,
    pretty: true,
    graphiql: true
}));

app.use('/graphql', GraphHTTP({
    schema: schemaQL
}));

app.get('/', function (req, res, next) {
  const reponse = {
    message: 'hello world',
  };
  return res.json(reponse);
});

module.exports = app;

Notaran que tenemos definidos 2 endpoints, graphql y graphiql. GraphiQL es una herramienta bastante útil que viene con el modulo de graphQL, se trata de una pequeña interfaz web desde donde podemos probar nuestras queries y mutations y la cual nos genera una documentación con base en los objetos QL de nuestro código, por ejemplo para probar nuestra query de getMovies seria algo como lo siguiente:

Observen que del lado izquierdo estoy definiendo los atributos que quiero que contengan los objetos de la respuesta, puedo solicitar mas o menos dependiendo de lo que el cliente pida, ayudando bastante a, por ejemplo, reducir el tamaño de los mensajes si la petición se hace desde un cliente móvil.

De la misma forma podemos probar nuestro mutation por medio de graphiQL

Observen como desde el cliente podemos pasar directamente el objeto con sus atributos, incluso los objetos relacionados como la lista de actores y comentarios, ya es cuestión de procesar todo eso en nuestro backend y crear los registros en la base de datos.

Todo bien hasta el momento, ya sabemos utilizar graphiQL, ahora como usamos nuestra api ya en un proyecto real, muy sencillo, cada vez que hacemos un request en google developer toolbar podemos observar cual es el payload que se enviá al servidor:

Podemos tomar ese mismo payload y con la ayuda de POSTMAN enviarlo como raw body a nuestro endpoint de graphQL en /graphql

Observa como el POST request va dirigido a /graphql y no /graphiql, por ultimo desde el mismo POSTMAN podemos ver cual seria el HTTP request generado haciendo clic en el boton code

Finalmente lo único que queda es implementar ese request en tu lenguaje de programación / framework favorito, a continuación dejo la presentación que utilice durante el evento por si necesitan revisarla asi como el repositorio de github donde esta alojado el código de este demo: graphql demo server

Si te gusto comparte ...Share on Facebook
Facebook
Share on Google+
Google+
Tweet about this on Twitter
Twitter
Share on LinkedIn
Linkedin

25 mujeres tecnólogas / hackers / programadoras que sigo en twitter – Parte 2

Continuo con la segunda parte de mi listas, mujeres en la tecnología que no puedes dejar de seguir en Twitter 🙂

#11 – Jessy Irwin

Tecnologa y entusiasta de la ciberseguridad, Jessy es un miembro muy activo en la comunidad, parte de su tiempo lo dedica a impartir platicas sobre privacidad de datos, consejos básicos sobre seguridad y en general concientizar a la población acerca del buen uso de Internet, en su blog personal tiene bastantes referencias sobre platicas y eventos a las que ha sido invitada

#12 – Julia Evans

Julia es una hacker muy peculiar 🙂 no solo por la manera en la que transmite sus ideas (les recomiendo ver los videos de sus presentaciones en YouTube) si no también por el gran numero de áreas que domina en la informática, parece que no hay algo que esta mujer no sepa y lo mejor de todo es que puede explicar temas muy complejos de una forma simple y fácil de entender para el común de los programadores. Algunas de sus publicaciones mas populares incluyen System design, TCP stack, Kernel hacking, dynamic memory, etc.

Aunque ella se considera a si misma una simple administradora de sistemas, en sus publicaciones Julia demuestra un gran expertis en el área de redes y sistemas operativos en general.

#13 – Katie Moussouris

Fundadora y CEO de LutaSecurity, empresa dedicada en proveer soluciones para el responsable disclosure de vulnerabilidades en las organizaciones, los tweets de Katie incluyen las ultimas noticias sobre el malware que afecta a las organizaciones y APTs (advanced persistent threat) en general.

#14 – Katie Neuman

Katie Neuman es una autoridad en la comunidad de seguridad, junto con un grupo de expertos se encargan de crear las pautas para que los procesos de seguridad a nivel corporativo sigan un mismo estándar, en su cuenta de Twitter publica acerca de las ultimas amenazas en el mundo de la ciberseguridad.

#15 – Lesley Carhart

Lesley Carhart es una veterana de la seguridad, con mas de 15 años de experiencia en la industria, incluyendo 8 como DFIR (Digital Forensics and Incident Response) es una gran inspiración para todas los entusiastas de la informática forense, mediante su blog personal colabora con la comunidad publicando artículos de seguridad dirigidos tanto a audiencia técnica como no técnica, puedes encontrar varios videos de sus charlas en Youtube

#16 – Amanda Rousseau

Amanda Rousseau, mejor conocida como Malware Unicorn, es una analista de Malware e investigadora de seguridad, su experiencia incluye haber trabajado como Malware reverse Engineer en el centro de delitos cibernéticos del Departamento de Defensa de los Estados Unidos, Amanda es especialmente popular en eventos de ciberseguridad como Defcon y Black Hat por sus platicas y talleres sobre ingeniería inversa.

Si estas interesado en el análisis de Malware, en su blog encontraras dos cursos completamente gratuitos que te ayudaran a empezar, Reverse Engineering Malware 101 y Reverse Engineering Malware 102.

#17 – Melissa Archer

Melissa Archer es una entusiasta de la tecnología, actriz y empresaria, mejor conocida por ser cofundadora de Hacker’s brew, Jailbreak developer y Tweak developer.

#18 – Ophelia Pastrana

Ophelia Pastrana es una mujer transgénero, física, economista, emprendedora y agnóstica de la tecnología, es muy activa en redes sociales, especialmente en la comunidad tecnológica y LGBT de Latinoamérica, es creadora de varios podcast/vlogs como nerdcore y canvas y le gusta asistir a multitud de eventos tecnológicos entre ellos Campus Party MX, en el cual he tenido la oportunidad de conocerla y hablar con ella personalmente.

#19 – Parisa Tabriz

Parisa Tabriz aka Security Princess, trabaja en Google liderando uno de los equipo de ciberseguridad encargado de mejorar la seguridad de varios productos, entre ellos como Google Chrome, Parisa es una investigadora de la que todo entusiasta de la seguridad ha oído hablar al menos una vez, una de sus aportaciones mas significativas ha sido su articulo So, you want to work in security? en donde comparte consejos a las personas que se quieren iniciar en seguridad.

#20 – Rosa Guillén

Rosa Guillén, también conocida como Novatillasku es una entusiasta de Linux a la que tengo ya varios años de seguir en Internet, es autodidacta y tiene un blog donde publica noticias y artículos de tecnología, comencé a leer sus tutoriales sobre Ubuntu y Linux en general cuando empezaba la preparatoria, si quieres estar enterado de las ultimas noticias sobre este sistema operativo definitivamente es una excelente fuente de noticias.

#21 – Sailor Mercury (Amy)

Sailor Mercury tiene una historia muy interesante, ella solía ser una desarrolladora web en Airbnb y tenia un pasa tiempo que consistía en crear historietas sobre tecnología y diversos temas de ciencias computacionales como algoritmos, memoria, TCP, protocolos, etc. con la ayuda de Kickstarter consiguio fondos para crear una tienda en linea llamada bubblesort.io, dejo su trabajo en Airbnb y ahora se dedica de tiempo completo a seguir transformando conceptos complejos en pequeñas historietas para que mas gente tenga acceso al conocimiento.

#22 – Samantha Davison

Samantha Davidson es una hacker que ha trabajado en equipos de seguridad de compañías como Uber y actualmente Snapchat, su trabajo consiste en concientizar a las personas acerca de la privacidad de sus datos, sobre todo en ambientes corporativos.

#23 – Sheila A. Berta

Tuve la oportunidad de conocer a Sheila en una de sus platicas durante el DragonJar Security Conference en 2015 en Manizales, Colombia. Ella se dedica a la seguridad informática pero desde un punto de vista mas ofensivo, es una reverse engineer y analista de malware muy hábil, ha contribuido a la comunidad de seguridad creando herramientas como CBM – The Bicho y el framework Crozono

#24 – Yan Zhu

Yan Zhu es otra de las hackers mas populares y respetadas en la comunidad de seguridad, siempre esta presente en eventos como Defcon y Black Hat, entre sus aportaciones a la comunidad se encuentran haber contribuido a proyectos como HTTPS everywhere, Let’s Encrypt, SecureDrop, Privacy Badger y Brave

Puedes encontrar varias de sus charlas en Youtube, la gran mayoría de ellas son acerca de protocolos de seguridad para comunicaciones como TLS.

#25 – Keren Elazari

Investigadora y oradora en temas de ciberseguridad reconocida mundialmente, trabaja directamente con compañías Big 4 y Fortune 500 ayudandolos a crear estrategias para mejorar su seguridad y la de sus productos. Esta mujer ha aportado bastante a la comunidad y ha sido fuente de inspiración de muchísimos entusiastas alrededor del mundo, ha sido mencionada en medios de gran reputación como Forbes, Scientific American, WIRED y TED.

Tienen alguna otra recomendación para seguir en Twitter? de ser así se los agradecería.

Saludos.

Si te gusto comparte ...Share on Facebook
Facebook
Share on Google+
Google+
Tweet about this on Twitter
Twitter
Share on LinkedIn
Linkedin

25 mujeres tecnólogas / hackers / programadoras que sigo en twitter – Parte 1

Hola, en esta ocasión quiero compartir con ustedes una lista de 25 mujeres que sigo (y admiro) en Twitter y que son referencia en el mundo de la tecnología, ya sea por que son programadoras muy hábiles, investigadoras, periodistas especializadas en tecnología, hackers, ingenierías o simplemente tecnologas en general.

#1 – AJ Bowen

AJ Bowen es una ingeniera especializada en infraestructura tecnológica, trabaja en una compañía llamada Travis CI dedicada a implementar soluciones de continues integration, entre las aportaciones de AJ a la comunidad podemos encontrar herramientas como IDNcheck y Clink, también es programadora de Python, Golang, C, C++ y bash scripting.

Bonus: tiene uno de los curriculums mas ingeniosos que he visto (el proyecto es opensource https://github.com/soulshake/cv.soulshake.net/) ya que para visualizarlo necesitas hacer una petición con curl desde la linea de comandos.

$ curl cv.soulshake.net


            ┌───────────────────────────────────────────────────────────────────────────────────────────┐
            │.                                                                                          │
            │                                   Hi, I'm AJ.                                             │
            │                I'm a Python developer with a strong interest in                           │
            │                 APIs, CLIs and subverting the dominant paradigm.                          │
            │                                This is my resume.                                         │
            │                                                                                           │
            │                                                                                           │
            │           Note: this is primarily intended for command-line addicts.                      │
            │             A more conventional version can be found on LinkedIn.                         │
            │                                                                                           │
            │                                                                                           │
            └───────────────────────────────────────────────────────────────────────────────────────────┘

#2 – Aloria

Jefa de seguridad de datos en Flatiron Health, empresa de software dedicada al desarrollo e investigación de nuevos métodos para combatir el cáncer. Aloria es considerada una de las mujeres mas influyentes a nivel mundial en la comunidad de seguridad, también formó parte del equipo de seguridad de Tumblr en donde dedicó gran parte de su tiempo para concientizar a sus seguidores en temas de seguridad informática.

#3 – Azeria

Azeria es una hacker en toda la extensión de la palabra, entre sus aportaciones mas destacadas se encuentran tutoriales completamente gratuitos y de gran calidad sobre ingeniería inversa, ensamblador para plataformas ARM, seguridad ofensiva y otros temas mas avanzados como escalacion de privilegios, binary exploitation y ARM exploit development. Podemos encontrar su material directamente en Azaria Labs.

#4 – Binni Shah

Evangelista de Linux, investigadora de Malware, kernel developer y hasta filántropa, Binni Shah es una verdadera caja de sorpresas, también mantiene Linux – Technology Tidbits, facebook fanpage desde donde comparte artículos muy interesantes sobre seguridad.

#5 – Charity Majors

Tuve la fortuna de conocer a Charity en persona en una de sus platicas sobre ingenieria de sistemas que dio en las oficinas de Microsoft CA en 2016, Charity Majors es una Reliability Engineer eso significa que se encarga de que los sistemas, y la infraestructura en general, siempre este operando de la mejor manera posible, tiene experiencia manejando infraestructura de grandes compañias como Facebook y ahora ha fundado su propia empresa llamada HoneyComb de la cual es la actual CEO

Tip: si lo tuyo es la administración de sistemas (sysadmin) Charity Majors es alguien ha quien debes de seguir en twitter.

#6 – Erika Vilches

Hace unos 6 años cuando comenzaba la universidad tuve la oportunidad de pertenecer a Microsoft Student Partner, en aquel tiempo Erika era una de las personas encargadas de coordinar el programa y gestionar los eventos que nos permitían acercarnos a las tecnologías de Microsoft, así fue como la conocí :). Hoy en día Erika Vilches es una de las mujeres mas influyentes de Latinoamérica en temas de tecnológicos, recomiendo seguirla en twitter para estar enterado de los últimos avances sobre blockchain, chatbots, speech recognition y ciencia/tecnología en general.

#7 – Eva Galperin

Nada mas y nada menos que la directora de ciberseguridad de la Electronic Frontier Foundation, organización sin fines de lucro encargada de luchar por los derechos de las personas en el mundo digital (Internet, ciberespacio, etc.), Eva se enfoca en el sector mas vulnerable (digital-mente hablando) de la población como los periodistas, los medios de comunicación y los ciberactivistas en general, para lograr eso viaja alrededor del mundo concientizando acerca de la privacidad, la libertad de expresión y los peligros del government surveillance.

#8 – Hasherezade

hasherezade es una programadora y analista de Malware que vive en Polonia, ha trabajado como investigadora cientifica, C / C++ developer, penetration tester y actualmente tiene su propia compañia que ofrece servicios de respuesta a incidentes de seguridad, también colabora escribiendo artículos para MalwareBytes.

En su blog personal encontraras algunos de los mejores tutoriales y artículos sobre análisis de Malware que he leído así como soluciones a retos de seguridad, ingeniería inversa y crackmes.

#9 – J.

Es una entusiasta de la seguridad informática, la inteligencia artificial y la automatización, trabaja como analista en el área de DFIR (Digital Forensics and Incident Response) de la empresa Under Armour, compañia estadounidense de ropa y accesorios deportivos. J. es un miembro muy activo de la comunidad de seguridad y participa dando platicas y compartiendo su conocimiento en eventos de seguridad como Defcon.

#10 – Jennifer Sunshine

Jennifer Sunshine es actualmente la CEO de la compañia de ciberseguridad IOActive, ha sido juez de Duo Women in Security los últimos dos añios y ademas también es un miembro muy activo en organizaciones como OWASP, EWF e ISSA.

Hasta aquí la primera parte del articulo, pondré la segunda parte de la lista en la siguiente publicación :), mientras tanto tienen alguna otra recomendación para agregar a mi lista? mujeres que sean un punto de referencia en cuanto a la seguridad informática o el desarrollo de software :D.

Puedes leer la segunda parte de la lista en la siguiente publicación: 25 mujeres tecnólogas / hackers / programadoras que sigo en twitter – Parte 2

Saludos.

Si te gusto comparte ...Share on Facebook
Facebook
Share on Google+
Google+
Tweet about this on Twitter
Twitter
Share on LinkedIn
Linkedin

#Docker para #hackers y pentesters, ejecutando #metasploit desde un container

Se acabó el 2016 y como ultima publicación del año les traigo un tutorial exprés que involucra docker y seguridad informática. En publicaciones anteriores explicaba que durante estos últimos meses he estado trabajando bastante con docker, orchestration e infraestructura de cloud en general (parte habitual en un trabajo de full stack engineer).

Docker es una herramienta muy poderosa para desarrolladores pues nos ayuda a construir imágenes con todas sus dependencias y nos deja el paso libre para enfocarnos en lo que realmente importa: deployar rápidamente una aplicación (o varias) que sabemos que va a funcionar.

Bajo esa premisa no es de extrañarse que la comunidad de seguridad haya adoptado docker tan rápidamente, docker es una herramienta fantástica 🙂 y así como nos permite dockerizar una aplicación también podemos dockerizar herramientas de seguridad y en general cualquier cosa que tengamos en nuestro arsenal para pentest.

La gente que trabaja o ha trabajado en seguridad, específicamente en el área de penetration testing, estará de acuerdo en que uno de los recursos más importantes que tenemos son las ventanas de tiempo, por lo general cuando se realiza una prueba de penetración a alguna aplicación o sistema se hace durante un periodo de tiempo bien definido, el tiempo es valioso y no podemos desperdiciarlo en instalar y configurar herramientas, o peor aun ¿que pasa si la infraestructura que estamos auditando nos bloquea? ¿cuánto tiempo vamos a invertir en preparar un nuevo nodo desde donde podamos lanzar ataques y recibir shells?, para todo lo anterior llega docker al rescate 🙂

En este tutorial mostraré como ejecutar una de las herramientas de seguridad más populares utilizando docker: metasploit, específicamente utilizaremos el módulo exploit/multi/handler para recibir sesiones de meterpreter.

ojo: no voy a mostrar como dockerizar metasploit, eso lo dejamos para un siguiente tutorial donde veamos como dockerizar aplicaciones

Ejecutando metasploit desde un contenedor de docker

Para evitarte el problema de abrir los puertos en tu router y hacer un mapeo de puertos para exponer tu maquina a internet, puedes contratar un vps con algún proveedor de tu elección, hoy en día es muy sencillo contratar un vps y puedes tener uno en línea prácticamente en minutos, yo recomiendo digitalocean por qué sus vps son baratos y el soporte es muy bueno, con un nodo de 10 USD al mes es suficiente para correr una imagen de metasploit, puedes contratar el de 5 USD pero tendrás que habilitar el swap o si no quieres gastar dinero siempre puedes aprovechar la promoción que te ofrece Amazon Webservices (más o menos 1 año de uso gratuito de una instancia micro)

Sea cual sea el proveedor que hayas elegido el siguiente paso es instalar docker en tu instancia, para este tutorial lo haré sobre ubuntu / debian pero podrías instalarlo en el sistema operativo de tu elección, acá tienes una lista de sistemas operativos soportados

Desde la terminal de tu instancia y como root vamos a ejecutar algunos comandos para instalar herramientas necesarias como compiladores de gcc/g++, algunas librerías, utilidades, etc. al final vamos a instalar docker

apt-get install build-essential
apt-get install libxslt-dev libxml2-dev zlib1g-dev --yes
apt-get install docker
apt-get install docker.io

Lo siguiente que vamos a hacer es crear un directorio en nuestra instancia, este directorio lo vamos a utilizar como un volumen persistente cuando ejecutemos metasploit desde el contenedor para poder almacenar ahí todo el loot, scripts y en general archivos que nos genere la herramienta.

mkdir /root/.msf4

Llego el momento, en el docker registry oficial existe una imagen llamada remnux/metasploit que contiene todo lo necesario para ejecutar la herramienta, ejecutamos el siguiente comando y docker comenzara a descargar la imagen y posteriormente procederá a correr el contenedor.

docker run --rm -it -p 443:443 -v ~/.msf4:/root/.msf4 -v /tmp/msf:/tmp/data remnux/metasploit

En el tutorial de docker anterior explicaba para que era cada parametro, en resumen -p nos permite mapear puertos y -v definir volúmenes persistentes (mapear una carpeta de nuestro sistema de archivos a una del sistema de archivos virtual del contenedor).

Una vez la imagen haya sido descargada el contenedor será creado y todas las dependencias necesarias comenzaran a ser instaladas, nos olvidamos de instalar todas las gemas y resolver conflictos y nos podemos ir por un café ya que es un proceso bastante automatizo 🙂

Después de unos minutos tenemos un nodo listo para recibir conexiones.

En el caso de necesitar más listeners no hay problema pues podemos ejecutar múltiples contenedores de metasploit en diferentes puertos y así tener nuestras shells organizadas, y si nuestro servidor es baneado rápidamente podemos desplegar otro ejecutando esos 6 comandos.

Como lo he comentado en varios artículos, docker es una herramienta muy poderosa que puede ser utilizada en varias situaciones además del desarrollo de software, como lo vimos en este tutorial. Puedes dockerizar casi cualquier cosa, yo en lo personal tengo una imagen con un set de herramientas que utilizo en mi día a día (fierce, dirb, sqlmap, nmap, enum4linux, hashcat, Responder, etc.)

Saludos y Happy Hacking.

Si te gusto comparte ...Share on Facebook
Facebook
Share on Google+
Google+
Tweet about this on Twitter
Twitter
Share on LinkedIn
Linkedin