CTF OverTheWire: Natas3

Continuamos con la serie de tutoriales del CTF Natas, ahora toca el turno de natas3.

Natas Level 2 → Level 3
Username: natas3
URL:      http://natas3.natas.labs.overthewire.org

Utilizamos la bandera obtenida en el reto anterior y accedemos a la URL indicada en las instrucciones del reto, veremos una pantalla como la siguiente.

Inspeccionamos el código fuente de la pagina.

Parece que se nos acabaron las pistas :S, revisamos el código fuente de la pagina pero no encontramos nada que sugiera cual es la bandera de este reto, también revisamos cada uno de los archivos js y css en busca de la solución pero no hay resultados. Cada detalle cuenta en este tipo de retos.

Recordando el reto anterior, la bandera se encontraba en un archivo llamado users.txt en http://natas2.natas.labs.overthewire.org/files/users.txt. La bandera de este reto podria estar en un archivo similar sin embargo no hay ningún directorio files, pero no descartamos la idea por completo, vamos a utilizar una herramienta llamada dirbuster para buscar otros archivos y directorios.

Dirbuster es un scanner de contenido web, la herramienta puede ser utilizada para encontrar archivos y directorios de forma automática utilizando diccionarios y fuerza bruta.

Dirbuster nos muestra un archivo interesante, http://natas3.natas.labs.overthewire.org/robots.txt vamos a esa URL y veremos lo siguiente

User-agent: *
Disallow: /s3cr3t/

Un archivo robots.txt es un archivo que se encuentra en la raíz de un sitio e indica a qué partes no quieres que accedan los rastreadores de los motores de búsqueda. El archivo utiliza el Estándar de exclusión de robots, que es un protocolo con un pequeño conjunto de comandos que se puede utilizar para indicar el acceso al sitio web por sección y por tipos específicos de rastreadores web (como los rastreadores móviles o los rastreadores de ordenador).

Claramente alguien no quiere que los buscadores indexen el directorio http://natas3.natas.labs.overthewire.org/s3cr3t/ :), vamos a esa URL a ver que encontramos.

Genial, otro archivo users.txt, revisamos su contenido.

natas4:Z9tkRkWmpt9Qr7XrR5jWRkgOU901swEZ

La bandera para acceder a natas4 es Z9tkRkWmpt9Qr7XrR5jWRkgOU901swEZ

Happy hacking 🙂

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

CTF OverTheWire: Natas2

Continuamos con la serie de tutoriales del CTF Natas, ahora toca el turno de natas2.

Natas Level 1 → Level 2
Username: natas2
URL:      http://natas2.natas.labs.overthewire.org

Al igual que en los artículos anteriores, utilizamos la bandera obtenida en el reto anterior y accedemos a la URL indicada en las instrucciones del reto, veremos una pantalla como la siguiente.

Repetimos lo que nos ha funcionado hasta ahora e inspeccionamos el código fuente de la pagina.

Efectivamente no vemos nada que haga referencia al password / bandera para acceder a natas3, sin embargo algo nos llama la atención, hay una imagen png de un pixel en el documento, eso es algo nuevo.

La imagen por si misma no es nada especial, http://natas2.natas.labs.overthewire.org/files/pixel.png, pero la ruta donde esta alojada si 🙂 así que visitamos la URL http://natas2.natas.labs.overthewire.org/files/ y voilà.

Debido a una mala configuración del servidor es posible listar los archivos de directorios que no contengan un index o pagina principal: index.html, index.php, index.jsp, etc. Esta es una vulnerabilidad de revelación de información llamada Directory Listing.

Dentro de users.txt encontraremos una lista de usuarios y contraseñas, entre ellos la bandera para acceder al siguiente reto

# username:password
alice:BYNdCesZqW
bob:jw2ueICLvT
charlie:G5vCxkVV3m
natas3:sJIJNW6ucpu6HPZ1ZAchaDtwd7oGrD14
eve:zo4mJWyNj2
mallory:9urtcpzBmH

La bandera para acceder a natas3 es sJIJNW6ucpu6HPZ1ZAchaDtwd7oGrD14

Happy hacking 🙂

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

CTF OverTheWire: Natas1

En el articulo anterior, OWASP – Riviera Maya e introducción a Overthewire CTF, comenzamos con una breve introducción a los CTFs y resolvimos Natas0, con la bandera que obtuvimos ahora toca el turno de Natas1, el nivel es muy similar pero tiene algo que lo hace diferente.

Natas1

Natas Level 0 → Level 1
Username: natas1
URL:      http://natas1.natas.labs.overthewire.org

Vamos a la URL del reto, http://natas1.natas.labs.overthewire.org, ingresamos natas1 como username, la bandera obtenida en el reto anterior como contraseña y veremos la siguiente pantalla.

si intentamos hacer lo mismo que en el reto anterior, click derecho > ver código fuente, nos aparece un alert de Javascript indicando que el clic derecho esta deshabilitado.

Ok, hay código javascript que bloquea la acción de click derecho, sin embargo conocemos otras formas de acceder al código fuente de un sitio web, por ejemplo usando shortcuts (alt + command + U en mac, etc.) o con CURL

CURL es un cliente para linea de comandos que nos permite enviar o recibir datos utilizando distintos protocolos, entre ellos HTTP, abrimos una consola y escribimos el siguiente comando (en Windows CURL no esta instalado por default, pero podemos utilizar esta solución https://curl.haxx.se/download.html)

$ curl -u natas1:gtVrDuiDfck831PqWsLEZy5gyDz1clto http://natas1.natas.labs.overthewire.org

El parámetro -u nos permite definir credenciales para autenticarnos ante el servidor.

CURL nos muestra el código fuente de la URL que le indicamos, también podemos ver el código javascript que bloquea el clic derecho y la solución de este reto.

<body oncontextmenu="javascript:alert('right clicking has been blocked!');return false;">

La bandera para acceder a natas2 es ZluruAthQk7Q2MqmDeTiUij2ZvWy2mBi

* Aprendimos que hay otras formas de consumir una pagina web ademas de los navegadores que normalmente usamos (firefox, chrome, ie, safari, etc)

Happy hacking 🙂

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

OWASP – Riviera Maya e introducción a Overthewire CTF

El 20 y 21 de abril de este año se llevo a cabo la segunda edición de OWASP – Riviera Maya en Cancún, evento de seguridad al cual tuve la fortuna de asistir y donde coincidí con varios amigos de la seguridad informática: @hkm, @calderpwn, @nitr0us, dex, @tresvecesdobleu, @NoxOner, @acorazada, @jjtibaquira son algunos de los que me vienen a la mente ahora mismo (una disculpa si me olvidé de alguno), en lo personal creo que esto es lo mejor de este tipo de eventos 🙂

El staff del evento ha publicado algunos videos de las charlas que podrán encontrar en el canal de youtube de OWASP Latam

Durante el evento tome el taller de web hacking impartido por Eduardo Vela (sirdarckcat), el formato era muy parecido a un CTF en donde ibas resolviendo cada uno de los niveles explotando vulnerabilidades web especificas (XSS, SQLi, LFI, etc). Este tipo de vulnerabilidades web han existido durante los últimos 20 años pero creo que la finalidad del taller era demostrar que siempre habra nuevas formas de seguir aprovechandolas.

Jugar CTFs me divierte mucho ya que siempre se aprende algo nuevo (en el pasado he publicados algunos como #CPMX6 CTF) y este no fue la excepción, al final logre completar todos los retos y Eduardo me dijo que fui el único que lo hizo 😳

Ahora que estoy dedicado el 99% del tiempo al desarrollo de software (ocasionalmente hago algún freelance que tiene que ver con Pentest o revisiones de código) lo mas cercano al hacking que hago son CTFs (justo ahora me estoy preparando para jugar el Google – Capture the flag 2018) y entonces pensé que hay muchísima gente interesada en este tipo de competencias de hacking pero no saben bien por donde empezar y decidí comenzar una nueva serie de tutoriales donde resolveremos un CTF paso a paso 🙂

Me di a la tarea de investigar varios de los CTFs que hay en Internet (básicos, intermedios, avanzados, imposibles, etc…) y creo que el mejor para principiantes se encuentra en OverTheWire, la idea es que resolveremos el CTF llamado Natas donde aprenderemos lo básico de web y mobile hacking y terminando esta serie (son 33 niveles) nos moveremos a algo un poco mas intermedio/avanzado donde tengamos que hacer binary exploitation.

Bueno, pues comenzamos….

Natas CTF

Este CTF, a diferencia de otros como los jeopardy que te dejan jugar los niveles en el orden que tu decidas, te forzá a resolver el nivel actual antes de pasar al siguiente, entonces debemos comenzar por Natas0

Username: natas0
Password: natas0
URL:      http://natas0.natas.labs.overthewire.org

Vamos a la URL que nos indican las instrucciones, introducimos las credenciales que nos da el reto y veremos una pantalla como la siguiente:

Nos dice que el password se encuentre en esta misma pagina sin embargo no vemos nada que haga referencia a la contraseña.

Esta es la primera lección para los principiantes de los CTFs, lo primero que tenemos que hacer en la mayoría de los casos es ver el código fuente de las paginas.

La contraseña para natas1 es gtVrDuiDfck831PqWsLEZy5gyDz1clto, felicidades ahora podemos continuar con el nivel 1, tratare de ir publicando los siguientes artículos cada 2 o 3 días así que estén pendientes.

Happy hacking 🙂

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

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