Archivo de la categoría: Mac

Solución del #CTF CPMX9 de Blog de Alevsk

Hola, como muchos saben, este blog esta registrado como comunidad tecnológica en Campus Party, cada año gente del estado de Michoacán nos organizamos para asistir al evento, jugar, divertirnos, aprender y sobre todo pasar un buen rato 🙂

Ser comunidad de CPMX tiene algunas ventajas por ejemplo obtener códigos de descuento y entradas gratuitas para rifar entre los miembros de la comunidad pero este año realice una dinámica diferente, hace mas o menos 1 semana anuncie en redes sociales (Facebook y Twitter) un pequeño reto CTF en donde poder ganar una entrada no fuera cuestión de suerte. Muchas gracias a todos los que participaron y felicidades a los ganadores.

A continuación dejo la solución de cada uno de los retos por si hay gente que se quedo con dudas 🙂

0x01 – 8.8.8.8 or 1.1.1.1?

A Dan Kaminsky le gusta ( ͡° ͜ ʖ ͡°) www.alevsk.com

Este reto es bastante sencillo si sabes un poco de cultura general de como funciona Internet. 8.8.8.8, 1.1.1.1 y Dan Kaminsky son claras referencias al sistema DNS.

En este tipo de retos es muy común que la información se encuentre escondida en el record TXT, pero también existen muchos otros tipos de DNS records. Vamos a utilizar la herramienta nslookup y con los siguientes comandos podemos listar los records TXT de cualquier dominio.

$ nslookup
> set q=TXT
> alevsk.com

La bandera de este reto es: ctf_flag{3550dd06-aec9-4841-96cb-dbfb093c6991}

0x02 – Cipher

Cipher es probablemente el reto mas complicado de este CTF, las instrucciones del reto nos muestran el siguiente texto cifrado.

h8s, s, l2e0 4o,h w8orwgx ochg0 h8s,n h8g0g s, r2 he0rsrm .owyx l2e hoyg h8g .4eg 5s44 _ h8g ,h20l grz,n l2e !oyg e5 sr l2e0 .gz orz .g4sg1g !8ohg1g0 l2e !orh h2 .g4sg1gx l2e hoyg h8g 0gz 5s44 _ l2e ,hol sr !2rzg04orz orz s ,82! l2e 82! zgg5 h8g 0o..sh_824g m2g,x h8g c4om s, whcjc4om{dzz9bk}v_pbdi_i}v3_op33_c3p39d.owvwpu

En la mayoría de los retos básicos de criptografía encontramos dos tipos de cifrados:

Podemos intentar resolver esto con alguna herramienta automática como Rot13 Online o Caesar Cipher pero no hay resultados. No queda otra cosa mas que empezar a hacer un analisis del texto y aplicar distintos ataques criptograficos 🙂

Utilizamos uno de mis lenguajes de programación favoritos, python, para comenzar a recolectar estadísticas interesantes del texto.

Comenzamos separando el texto cifrado por espacios y contando el numero de veces que se repiten las palabras

from collections import Counter
import re

encrypted = "h8s, s, l2e0 4o,h w8orwgx ochg0 h8s,n h8g0g s, r2 he0rsrm .owyx l2e hoyg h8g .4eg 5s44 _ h8g ,h20l grz,n l2e !oyg e5 sr l2e0 .gz orz .g4sg1g !8ohg1g0 l2e !orh h2 .g4sg1gx l2e hoyg h8g 0gz 5s44 _ l2e ,hol sr !2rzg04orz orz s ,82! l2e 82! zgg5 h8g 0o..sh_824g m2g,x h8g c4om s, whcjc4om{dzz9bk}v_pbdi_i}v3_op33_c3p39d.owvwpu"

words = encrypted.split()
word_counts = Counter(words)
print(word_counts)
{
	'l2e': 6,
	'h8g': 5,
	's,': 3,
	'5s44': 2,
	'orz': 2,
	'hoyg': 2,
	'_': 2,
	'l2e0': 2,
	'sr': 2,
	'zgg5': 1,
	'grz,n': 1,
	'!orh': 1,
	'whcjc4om{dzz9bk}v_pbdi_i}v3_op33_c3p39d.owvwpu': 1,
	'0o..sh_824g': 1,
	',h20l': 1,
	'!8ohg1g0': 1,
	',hol': 1,
	'.owyx': 1,
	'h8s,': 1,
	'4o,h': 1,
	'h8s,n': 1,
	'!2rzg04orz': 1,
	'.4eg': 1,
	'c4om': 1,
	',82!': 1,
	'.g4sg1g': 1,
	'e5': 1,
	'w8orwgx': 1,
	'0gz': 1,
	'r2': 1,
	'he0rsrm': 1,
	'.g4sg1gx': 1,
	'82!': 1,
	'h8g0g': 1,
	'h2': 1,
	'm2g,x': 1,
	's': 1,
	'!oyg': 1,
	'ochg0': 1,
	'.gz': 1
}

La palabra que se repite mas veces es l2e (6 veces), pero también vemos l2e0 (2 veces) que es una variación de la palabra anterior, algo similar ocurre con h8g y h8g0g y algunas otras más.

La complejidad de este reto disminuye notoriamente ya que sabemos lo que estamos buscando en el texto, la bandera 🙂 y sabemos cual es el formato que deben seguir las mismas.

ctf_flag{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}

En una cadena de texto lo suficientemente larga debemos encontrar un símbolo que se repita siguiendo el mismo patrón que el de la bandera si no estuviera encriptada, es decir:

* = (simbolo de guion)

(8 simbolos)*(4 simbolos)*(4 simbolos)*(4 simbolos)*(12 simbolos)

La palabra mas larga que arrojo nuestro análisis es whcjc4om{dzz9bk}v_pbdi_i}v3_op33_c3p39d.owvwpu, probamos “alineando” el formato de la bandera en esa palabra para ver si cumple con el patrón:

whcjc4om{dzz9bk}v_pbdi_i}v3_op33_c3p39d.owvwpu
         xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

Tenemos una coincidencia 🙂 acomodamos el resto de la bandera y comenzamos a crear un diccionario con los caracteres a sustituir en el texto y podremos empezar a romper el cifrado (encontrar el alfabeto que fue usado para la sustitución)

whcjc4om{dzz9bk}v_pbdi_i}v3_op33_c3p39d.owvwpu
ctf_flag{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}

Agregamos el diccionario a nuestro script y hacemos la sustitución.

encrypted = "h8s, s, l2e0 4o,h w8orwgx ochg0 h8s,n h8g0g s, r2 he0rsrm .owyx l2e hoyg h8g .4eg 5s44 _ h8g ,h20l grz,n l2e !oyg e5 sr l2e0 .gz orz .g4sg1g !8ohg1g0 l2e !orh h2 .g4sg1gx l2e hoyg h8g 0gz 5s44 _ l2e ,hol sr !2rzg04orz orz s ,82! l2e 82! zgg5 h8g 0o..sh_824g m2g,x h8g c4om s, whcjc4om{dzz9bk}v_pbdi_i}v3_op33_c3p39d.owvwpu"
decrypted = ""
replace = {
	'w': 'c',
	'h': 't',
	'c': 'f',
	'j': '_',
	'4': 'l',
	'o': 'a',
	'm': 'g',
	'_': '-',
	'u': '}'
}

for c in encrypted:
	if c in replace:
		decrypted += replace
	else:
		decrypted += c

print(decrypted)

Vemos que la palabra flag se encuentra en otras partes del texto y no solo en la bandera, lo que sugiere que el texto esta escrito en ingles

t8s, s, l2e0 la,t c8arcgx aftg0 t8s,n t8g0g s, r2 te0rsrg .acyx l2e tayg t8g .leg 5sll – t8g ,t20l grz,n l2e !ayg e5 sr l2e0 .gz arz .glsg1g !8atg1g0 l2e !art t2 .glsg1gx l2e tayg t8g 0gz 5sll – l2e ,tal sr !2rzg0larz arz s ,82! l2e 82! zgg5 t8g 0a..st-82lg g2g,x t8g flag s, ctf_flag{dzz9bk}v-pbdi-i}v3-ap33-f3p39d.acvcp}

Todavía tenemos otras 2 palabras, l2e y h8g, que se repiten bastante en el texto, si encontramos cual es su equivalente nuestro texto sera todavía mas legible. Investigando un poco encontré un articulo bastante interesante The Most Common Three Letter Words (Las palabras mas comunes de 3 letras)

Hacia al final del texto podemos leer algo que dice:

t8g flag s, ctf_flag{dzz9bk}v-pbdi-i}v3-ap33-f3p39d.acvcp}

si t8g puede ser the (que se encuentra en la lista de palabras populares) y s, es is la frase final seria

the flag is ctf_flag{dzz9bk}v-pbdi-i}v3-ap33-f3p39d.acvcp}

Parece que nos vamos acercando, probamos agregando estas letras a nuestro diccionario.

replace = {
	'w': 'c',
	'h': 't',
	'c': 'f',
	'j': '_',
	'4': 'l',
	'o': 'a',
	'm': 'g',
	'_': '-',
	'u': '}',
	'8': 'h',
	'g': 'e',
	's': 'i',
	',': 's',
}

this is l2e0 last charcex afte0 thisn the0e is r2 te0rirg .acyx l2e taye the .lee 5ill – the st20l erzsn l2e !aye e5 ir l2e0 .ez arz .elie1e !hate1e0 l2e !art t2 .elie1ex l2e taye the 0ez 5ill – l2e stal ir !2rze0larz arz i sh2! l2e h2! zee5 the 0a..it-h2le g2esx the flag is ctf_flag{dzz9bk}v-pbdi-i}v3-ap33-f3p39d.acvcp}

Mas palabras salen a la luz:

afte00 es r

l2e0 se vuelve l2er, por lo tanto en la frase this is l2er last charcex, l2er es remplazado por your y el texto tiene aun mas sentido 🙂 !!!

charce … r es n (chance)

this is your last chancex after thisn there is no turning

Tenemos suficiente texto legible para realizar una búsqueda en google y darnos cuenta que el texto es una frase famosa de la película The Matrix

Completamos el resto del diccionario con las letras que nos hacen falta.

Nota: en este punto de la solución me di cuenta que cometí un error al momento de diseñar el reto y no se puede avanzar mas, gracias a @unmanarc por reportar el problema

Por lo tanto la bandera de este reto es ctf_flag{ddd9bk}v-pbdi-i}v3-ap33-f3p39dbacvcp}

0x03 – A new security policy standard

Si encuentras una vulnerabilidad en www.alevsk.com deberías reportarla utilizando los canales adecuados 🙂

Tanto el nombre del reto como la descripción nos da una pista acerca de que debemos investigar sobre nuevos estándares en políticas de seguridad, algunas personas se confundieron en este reto pues creían que tenían que encontrar vulnerabilidades en esta pagina, pero la solución es mas sencilla que eso.

security.txt es un estándar propuesto (similar a robots.txt) para que los sitios web puedan anunciar sus políticas de seguridad y consiste en publicar un archivo de texto en el directorio .well-known donde comuniquemos información importante como por ejemplo la direccion de contacto en la que los hackers pueden reportar las vulnerabilidades encontradas de nuestro sitio web, en este caso https://www.alevsk.com/.well-known/security.txt

# If you would like to report a security issue
# you may report it to me on www.alevsk.com
# ctf_flag{1999251d-df25-4d4a-846b-d4267f471b23}
Contact: [email protected]
Encryption: https://pgp.mit.edu/pks/lookup?op=get&search=0xFF4F600D674B6DED

La bandera de este reto es: ctf_flag{1999251d-df25-4d4a-846b-d4267f471b23}

0x04 – Foogle

Neo: Why do my eyes hurt? Morpheus: You’ve never used them before.

Descargar imagen

Este reto involucra esteganografía y es muy fácil de resolver, descargamos la imagen que nos indican las instrucciones y comenzamos a realizar el análisis, lo mas sencillo y lo primero que intentamos es ver si la imagen contiene en sus bytes alguna cadena de caracteres que tenga sentido.

Podemos utilizar la herramienta hexdump para hacer esto.

$ hexdump -C foogle.png

00000000  89 50 4e 47 0d 0a 1a 0a  00 00 00 0d 49 48 44 52  |.PNG........IHDR|
00000010  00 00 04 34 00 00 02 60  08 06 00 00 00 75 21 33  |...4...`.....u!3|
00000020  a1 00 00 01 7c 69 43 43  50 49 43 43 20 50 72 6f  |....|iCCPICC Pro|
00000030  66 69 6c 65 00 00 28 91  63 60 60 2a 49 2c 28 c8  |file..(.c``*I,(.|
....
....
....
000be000  7b 3a e3 0d e3 7e e2 66  21 44 35 e4 e6 ce 49 93  |{:...~.f!D5...I.|
000be010  6e 35 05 78 c2 39 98 9c  ae db e4 fd 69 9f 8b 31  |n5.x.9......i..1|
000be020  94 4e ca e5 4d c1 c5 ba  13 c0 eb 99 ff 07 7b ee  |.N..M.........{.|
000be030  41 67 d0 72 4a 54 00 00  00 00 49 45 4e 44 ae 42  |Ag.rJT....IEND.B|
000be040  60 82 59 33 52 6d 58 32  5a 73 59 57 64 37 59 6a  |`.Y3RmX2ZsYWd7Yj|
000be050  4d 77 4f 57 55 77 4e 57  4d 74 5a 6a 49 79 4e 43  |MwOWUwNWMtZjIyNC|
000be060  30 30 4e 44 4d 33 4c 57  46 6a 5a 44 6b 74 59 57  |00NDM3LWFjZDktYW|
000be070  52 68 5a 54 6b 35 4e 6a  45 30 4d 6d 56 6b 66 51  |RhZTk5NjE0MmVkfQ|
000be080  3d 3d                                             |==|
000be082

También podemos utilizar el comando strings.

$ strings foogle.png

Al final del archivo hay una cadena de caracteres muy peculiar, parece que es un mensaje codificado en base64, tomamos el string y lo decodificamos con alguna herramienta como https://www.base64decode.org/

La bandera de este reto es ctf_flag{b309e05c-f224-4437-acd9-adae996142ed}

0x05 – Information leak

Información critica ha sido leakeada en los archivos de este repositorio x.x

Como la descripción nos indica, tenemos que revisar los archivos del repositorio donde esta hospedado el CTF, y no solo eso, tambien tenemos que revisar el historial de commits, vemos que en uno de los commits un archivo llamado 0x05_secret.txt fue publicado en el repositorio.

La bandera de este reto es ctf_flag{163f0835-8fc0-4fd0-b96b-dcd724cbe200}

0x06 – We can fix it!

Otro participante trato de robar la bandera de este reto pero sin querer la daño, ¿Puedes repararla? Descargar imagen

Este reto nos presentaba un codigo QR “dañado” (los bordes de la imagen han sido recortados), por lo que si tratamos de leerlo nos dará un error

Pero nada que un poco de photoshop no pueda arreglar 🙂

La bandera de este reto es ctf_flag{d55bd4f6-bff1-45b4-836e-7df1839e7d70}

Espero se hayan divertido mucho y aprendido algo nuevo al participar en este reto.

Happy hacking 🙂

CTF OverTheWire: Natas4

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

Natas Level 3 → Level 4
Username: natas4
URL:      http://natas4.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.

Como lo hemos hecho anteriormente, revisamos el codigo fuente pero no encontramos nada interesante, tampoco hay archivo robots.txt

Nos concentramos en el mensaje que aparece en la pantalla: Access disallowed. You are visiting from “” while authorized users should come only from “http://natas5.natas.labs.overthewire.org/”

Acceso deshabilitado. Nos estas visitando de “” mientras que los usuarios autorizados deberian de venir desde “http://natas5.natas.labs.overthewire.org/”

El mensaje anterior sugiere algún tipo de validación del lado del servidor en donde se revisa el origen de la petición, damos click en el link de refresh, inspeccionamos las cabeceras del request utilizando google developer toolbars y observamos que el mensaje de la pagina cambio.

Observamos una cabecera interesante llamada referer cuyo valor actual es http://natas4.natas.labs.overthewire.org/, veamos si es posible definir nuestro propio valor utilizando cURL.

Abrimos una consola y escribimos

$ curl --help
Usage: curl [options...] <url>
Options: (H) means HTTP/HTTPS only, (F) means FTP only
....
 -r, --range RANGE   Retrieve only the bytes within RANGE
     --raw           Do HTTP "raw"; no transfer decoding (H)
 -e, --referer       Referer URL (H)
 -J, --remote-header-name  Use the header-provided filename (H)
....

Genial, con el parámetro -e / –referer podemos definir nuestra propia URL.

○ → curl --user natas4:Z9tkRkWmpt9Qr7XrR5jWRkgOU901swEZ --referer http://natas5.natas.labs.overthewire.org/ http://natas4.natas.labs.overthewire.org/
<html>
<head>
<!-- This stuff in the header has nothing to do with the level -->
<link rel="stylesheet" type="text/css" href="http://natas.labs.overthewire.org/css/level.css">
<link rel="stylesheet" href="http://natas.labs.overthewire.org/css/jquery-ui.css" />
<link rel="stylesheet" href="http://natas.labs.overthewire.org/css/wechall.css" />
<script src="http://natas.labs.overthewire.org/js/jquery-1.9.1.js"></script>
<script src="http://natas.labs.overthewire.org/js/jquery-ui.js"></script>
<script src=http://natas.labs.overthewire.org/js/wechall-data.js></script><script src="http://natas.labs.overthewire.org/js/wechall.js"></script>
<script>var wechallinfo = { "level": "natas4", "pass": "Z9tkRkWmpt9Qr7XrR5jWRkgOU901swEZ" };</script></head>
<body>
<h1>natas4</h1>
<div id="content">

Access granted. The password for natas5 is iX6IOfmpN7AYOQGPwtn3fXpbaJVJcHfq
<br/>
<div id="viewsource"><a href="index.php">Refresh page</a></div>
</div>
</body>
</html>

La bandera para acceder a natas5 es iX6IOfmpN7AYOQGPwtn3fXpbaJVJcHfq

* Aprendimos que el referer header no es garantía de que el request viene del origen que el cliente nos esta diciendo, esto podría ser considerado una vulnerabilidad de Broken Access Control de acuerdo al top 10 de vulnerabilidad de OWASP.

Happy hacking 🙂

Docker 101 #1: Introducción a docker y los contenedores

docker-image

Hola lectores, en los últimos 6 meses he tenido la oportunidad de estar desarrollando mi carrera en una de las empresas de tecnología más grandes que hay en México, he estado trabajando muy de cerca en temas de Cloud computing, virtualizacion, bare metal e IaaS en general.

Es por eso que he decidido que es una buena idea crear una serie de tutoriales sobre docker, herramienta que considero esencial para los desarrolladores hoy en día, sobre todo si te atrae el mundo del cloud computing :). Si no tienes conocimientos previos de docker no te preocupes, planeo escribir tutoriales desde cero y voy a ir explicando cosas un poco más complejas conforme vayamos avanzando.

Un poco de teoria

Cuando hablamos de docker hablamos de contenedores. Pero ¿Que es un contenedor?, seguramente podrás encontrar una definición más formal de lo que es, pero imagínate que un contenedor es una caja que contiene tu solución de software, y no solo eso, también contiene las dependencias necesarias para ejecutar tu aplicación, las dependencias pueden ser librerías, configuraciones especiales e incluso otras aplicación o servicios que necesites (como un servidor web, nginx, apache, tomcat, etc.), todas las dependencias y aplicaciones dentro de una imagen están organizadas mediante un concepto de layers (capas), de esa manera cuando modificas un contenedor (una imagen) solo actualizas un layer en específico.

La gran ventaja de los contenedores es que, a diferencia de las máquinas virtuales estos no tienen asignadas cuotas específicas de recursos del sistema host (memoria, cpu, storage, etc), cuentan con un sistema de archivos virtual que permite que los contenedores se ejecuten de forma independiente y separada de los procesos del sistema, de esta manera la memoria de un proceso del contenedor no interfiere con un proceso de la maquina donde es ejecutado.

Un contenedor solo incluye consigo la aplicación y sus dependencias lo que hace que las imágenes de docker sean bastante livianas.

Otro de los grandes beneficios que nos aportan los contenedores es la potabilidad, me refiero a que si tienes una aplicación y la quieres migrar a otro sistema (por ejemplo de desarrollo a producción) puedes creas una imagen de docker que incluya tu solución y ejecutarla en cualquier otro sistema teniendo la certeza de que va a “correr” pues la imagen contiene todas las dependencias necesarias. Existen técnicas para “comunicar” nuestra maquina host con los contenedores como el mapeo de puertos y directorios, eso lo veremos en los siguientes tutoriales.

Conceptos básicos

  • Docker: Tecnología de software para creación y administración de contenedores.
  • Docker image: Un sistema de archivos virtual que puede contener aplicaciones y dependencias.
  • Docker container: Una imagen de docker que está siendo ejecutada, una instancia de una imagen.
  • Dockerhub: Un repositorio que contiene muchísimas imágenes de docker listas para ser descargadas.
  • DockerFile: Un script que indica una serie de pasos para construir una imagen de docker.

Bien suficiente teoría, si quieres saber más a fondo sobre docker pueden visitar el sitio web o ir a la documentación oficial

Instalar docker

Lo primero que debemos hacer es instalar docker, dependiendo de tu sistema operativo es el instalador que utilizaras, descarga docker de la página oficial, si estas en Windows descarga el ejecutable y sigue el wizard (siguiente, siguiente, siguiente), en Mac OSX puedes descargar una imagen dmg y hacer lo mismo, en mi caso lo que tengo a la mano es un sistema Linux, Ubuntu para ser específico y para proceder con la instalacion lo hago de la siguiente forma:

$ sudo apt-get install docker.io

Sea cual sea tu sistema operativo, una vez hayas instalado docker para verificar que la herramienta está bien instalada abre una consola y escribe el comando docker

$ docker

docker1

Si el resultado es un output similar al de la imagen significa que instalaste docker correctamente, si por el contrario recibes algún mensaje que dice que el comando docker no existe esto se puede deber a varias razones pero principalmente si estas en Windows verifica que la ruta al binario de docker se encuentre definida en tus variables de entorno.

Docker contiene muchisimos comandos pero los más importantes, o al menos los que utilizaras más son:

  • $ docker run
  • $ docker images
  • $ docker build
  • $ docker pull
  • $ docker ps
  • $ docker start
  • $ docker stop
  • $ docker commit
  • $ docker attach

Conforme vayamos avanzando en los tutoriales iré explicando que hace cada uno de ellos

Nuestro primer contenedor

Estamos listos para crear nuestro primer contenedor, abrimos una consola y escribimos el siguiente comando:

$ sudo docker run hello-world

El comando anterior le dice a docker que ejecute una nueva instancia (un contenedor) de la imagen hello-world, primero busca en el repositorio local y si no la encuentra va al dockerhub y procede a con la descarga.

docker2

¿Observas la parte que dice Pull complete?:

Unable to find image 'hello-world:latest' locally
latest: Pulling from hello-world

264eca88cf85: Pull complete 
f0cb9bdcaa69: Pull complete 
Digest: sha256:548e9719abe62684ac7f01eea38cb5b0cf467cfe67c58b83fe87ba96674a4cdd
Status: Downloaded newer image for hello-world:latest

Ahi es donde docker está mostrando el progreso de la descarga y los layers de la image, el resultado final de ejecutar este contenedor es el mensaje que dice: Hello from Docker!

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker Hub account:
 https://hub.docker.com

For more examples and ideas, visit:
 https://docs.docker.com/engine/userguide/

Si ejecutamos el comando docker images, obtendremos una lista de las imágenes que tenemos disponibles localmente, y claro ahí tenemos nuestra imagen hello-world

$ docker images

docker3

Ahora veremos uno de los conceptos importantes de docker, el sistema de archivos virtual, vamos a descargar y ejecutar una imagen docker de ubuntu con el comando:

$ sudo docker run ubuntu

docker4

Corroboramos que tenemos una nueva imagen almacenada localmente:

[email protected]:~$ sudo docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
ubuntu              latest              426844ebf7f7        2 weeks ago         127.1 MB
hello-world         latest              f0cb9bdcaa69        3 months ago        1.848 kB

Ya tenemos una imagen docker de ubuntu, ¿Pero cómo accedemos a ella? ¿Cómo la utilizamos?, podemos utilizar el siguiente comando para acceder al contenedor en tiempo de ejecución utilizando una shell interactiva:

$ sudo docker run -t -i ubuntu /bin/bash

Cuando el contenedor este corriendo podrás navegar su sistema de archivos como lo harías normalmente en Linux, incluso si estas corriendo docker desde una maquina con Windows podrás ver que el sistema de archivos es de Linux, aquí es donde puedes empezar a considerar la opción de dejar atrás Cygwin y comenzar a utilizar un contenedor de ubuntu con todas las herramientas que necesites.

docker5

Para salir del contenedor utiliza el comando exit, como si terminaras una sesión remota de ssh.

Un punto importante a recalcar es que los contenedores no son persistentes, si creas un archivo dentro del contenedor la siguiente vez que lo ejecutes no existirá, posteriormente veremos cómo podemos solucionar eso. Por el momento quiero que entiendas los conceptos básicos de los contenedores en docker, como descargar imágenes y lanzarlas, los comandos básicos, etc.

Al inicio mencionaba el dockerhub, el repositorio público de donde puedes descargar miles de imágenes de docker, te invito a explorarlo e instalar las que más te gusten:

docker6

Servidor web nginx utilizando docker

Para terminar el tutorial mostrare rápidamente como podemos ejecutar un servidor web utilizando docker, como mencionaba, el dockerhub tiene miles de imágenes públicas y muchas comunidades de software libre están creando versiones “contenerizadas” de sus soluciones, en este caso el servidor web nginx, lo primero que debemos hacer es descargar la imagen de nginx para docker

$ sudo docker pull nginx

docker7

Ejecutamos docker images para verificar que se descargó correctamente:

[email protected]:~$ sudo docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
ubuntu              latest              426844ebf7f7        2 weeks ago         127.1 MB
nginx               latest              4c0e7e3661d2        2 weeks ago         181.4 MB
hello-world         latest              f0cb9bdcaa69        3 months ago        1.848 kB

Ahora para lanzar el contenedor utilizaremos el comando:

$ sudo docker run --name nginx-server1 -p 80:80 nginx

docker8

  • El comando docker run especifica que queremos correr un contenedor
  • El parametro –name nos permite definir un nombre único y amigable para esa instancia
  • El parametro -p nos permite mapear puertos entre el sistema operativo y los servicios que corren dentro del contenedor
  • Al final especificamos el nombre de la imagen de la cual queremos crear el contenedor, nginx en este caso

docker9

Incluso podemos abrir una segunda terminal y ejecutar el siguiente comando para lanzar un segundo servidor web contenerizado pero en un puerto diferente:

$ sudo docker run --name nginx-server2 -p 8080:80 nginx

docker10

Al lanzar cada una de las imágenes de nginx habrás notado que la consola se queda “ocupada” corriendo el contenedor, en el siguiente tutorial mostrare como evitar eso, finalmente para detener la ejecución del contenedor presiona ctrl+c

Si ejecutas el comando docker ps -a podras ver todas los contenedores que hemos creado hasta el momento, la mayoria no estara en ejecucion y puede ser eliminado utilizando docker rm [CONTAINER ID]

docker11

Si haz entendido bien los conceptos básicos ya te imaginaras el potencial de docker y hacia donde iré en los siguientes tutoriales :).

Saludos y happy hacking.

StringTransformer: the transformation tool

st

Hola lectores, en esta ocasión me gustaría compartir con ustedes una herramienta opensource que he publicado en mi repositorio de github, se trata de StringTransformer, un script desarrollado en python cuya finalidad es tomar una cadena de texto y transformarla a distintas representaciones equivalentes de la misma, por ejemplo binario, hexadecimal, octal, md5, sha256, etc. Las funciones de transformación son clases separadas del script principal por lo que la herramienta es modular, esto significa que es bastante fácil para cualquier programador (que sepa python) crear sus propias transformaciones y extender la funcionalidad de la herramienta.

Esta herramienta les puede ser útil cuando están jugando Capture the flags y necesitan una forma rápida de analizar cadenas de texto (o al menos esa es su finalidad), la herramienta sigue en desarrollo, corrigiendo bugs e implementando nuevas funcionalidades.

Instalación

Su instalación es bastante sencilla, primero deben de clonar el repositorio usando git

$ git clone https://github.com/Alevsk/stringTransformer.git

Una vez descargado el repositorio acceden a la carpeta del proyecto, dan los permisos de ejecución necesarios y lanzan el script:

$ cd stringTransformer
$ chmod +x stringTransformer.py
$ ./stringTransformer.py
                  
              _______         
       _____ |   _   |  ____  
      |    |  \  V  /  |    | 
      |   \ \  \_ _/  / /   | 
      \  \ \ \   '   / / /  / 
       \  \   | 'V' |   /  /  
     |\ \_____| \ / |_____/ /|
     | \        | |        / |
     |  |    ,/|| ||\,    |  |
     |   `| '  || ||  ' |`   |
     |    | |  || ||  | |    |
     \    | |  || ||  | |    /
      \.  | |  ||_||  | |  ./ 
       \  | |  |___|  | |  /  
         \' ,  _____  , '/    
             \/ ___ \/        
               /___\          
                           

stringTransformer v0.1 (https://github.com/alevsk/stringTransformer/)

Usage: stringTransformer.py -i INPUT_STRING | --input INPUT_STRING | --load FILE

stringTransformer.py: error: Required argument is missing. Use '-h' for help.

Con el comando -h o –help podran ver el menu de ayuda:

Options:
  -h/--help             show this help message and exit
  -i/--input=INPUT      set the input string to test with
  -l/--load=LOAD_FILE   load list of input strings (one per line)
  -x/--exclude=EXCLUDE  exclude this representations
  -o/--only=ONLY        transform input only to this representations
  -O/--output=OUTPUT    generate an output file
  -p/--params=PARAMS    use custom parameters on transformation functions
  --list                list available input representations
  --update              update from the official git repository

Examples:
./stringTransformer.py -i [STRING]
./stringTransformer.py -i [STRING] --exclude "hexa, octal"
./stringTransformer.py -i [STRING] --only "hexa, octal"
./stringTransformer.py -i [STRING] --params "rot.cipher=13,rot.encoding=utf-8"
./stringTransformer.py --load list.txt
./stringTransformer.py --list

Para ver las funciones de transformación actualmente disponibles pueden utilizar –list:

stringTransformer v0.1 (https://github.com/alevsk/stringTransformer/)

- sha1
- octal
- binary
- sha256
- html_entities_decode
- html_entities_encode
- md5
- base64_encode
- base64_decode
- ascii
- slug
- rot_encode
- hexa
- urlencode

Puedes ayudar a crear más funciones de transformación para la herramienta, para eso sugiero lean la documentación en la página principal del repositorio (o en el archivo README.md) https://github.com/Alevsk/stringTransformer

Ejemplos de uso

Queremos aplicar una transformación hexadecimal, rot 13 encode y ascii a la cadena de texto “The transformation tool”

$ ./stringTransformer.py -i "The transformation tool" -o "hexa,rot_encode,ascii"

Obtenemos como resultado:

stringTransformer v0.1 (https://github.com/alevsk/stringTransformer/)

[i] Loaded 3 representations to apply.
[i] Starting tests at: "23:54:04"

The transformation tool

[i] applying transformation...

ascii:

84 104 101 32 116 114 97 110 115 102 111 114 109 97 116 105 111 110 32 116 111 111 108

rot_encode:

Gur genafsbezngvba gbby

hexa:

54 0x68 0x65 0x20 0x74 0x72 0x61 0x6e 0x73 0x66 0x6f 0x72 0x6d 0x61 0x74 0x69 0x6f 0x6e 0x20 0x74 0x6f 0x6f 0x6c 

==================================

Incluso podemos pasar parámetros a las funciones de transformación que lo soporten, rot_encode por defecto utilizar 13 posiciones de desplazamiento pero aquí indicamos que use 51

$ ./stringTransformer.py -i "The transformation tool" -o "rot_encode" --params="rot_encode.cipher=51"

stringTransformer v0.1 (https://github.com/alevsk/stringTransformer/)

[i] Loaded 1 representations to apply.
[i] Starting tests at: "23:58:11"

The transformation tool

[i] applying transformation...

rot_encode:

Sgd sqzmrenqlzshnm snnk

==================================

La herramienta cuenta con muchísimos otros parámetros que los invito a explorar.
saludos

Git Hack Recovery

En esta ocasión quiero compartir con ustedes una pequeña herramienta que desarrolle (y lo sigo haciendo) y que presente en #CPMX5 como parte de las charlas dadas por miembros de la Comunidad Underground de México, la herramienta se llama Git Hack Recovery y a grandes rasgos permite que en el caso de que tu sitio web haya sido comprometido por un atacante, los archivos regresen al último estado de confianza de manera automática, ahora explico un poco más.

1487876_10203003583025374_7182323267010208382_o

Montando el entorno

Para empezar tenemos dos opciones, montar nuestro propio servidor con git o utilizar el servicio de algún tercero que permita crear repositorios privados, para este ejemplo Bitbucket es una buena opción puesto que nos permite crear repositorios ilimitados. (https://bitbucket.org/repo/create)

bitbucket

Después debemos de crear 2 cuentas y agregarlas al repositorio, un administrador del con permisos de lectura y escritura y “esclavo” que solo será capaz de leer los archivos del repositorio pero no subir ni modificar nada. (para agregar usuarios al repositorio debes ir a settings > access management)

bitbucket2

Después para mayor comodidad vamos a utilizar pki authentication por lo que debemos crear nuestras respectivas ssh keys en cada maquina (el servidor de producción y la máquina de desarrollo / administración), tutorial: https://help.github.com/articles/generating-ssh-keys
Recapitulando debemos de tener:

  • Repositorio privado
  • Una cuenta con acceso de escritura y lectura al repositorio
  • Una cuenta con acceso de solo lectura al repositorio

Ahora con las tres cosas que tenemos debemos montar una infraestructura como la siguiente:

git-hack-recovery

Tip: En el caso de que nuestro sitio web utilice urls amigables como wordpress, es recomendable que en nuestro servidor de desarrollo utilicemos virtual-host y agreguemos una entrada con el dominio del sitio web que apunte a 127.0.0.1 en nuestro archivo hosts, esto porque algunas veces CMS como wordpress causan problemas con las urls.

Explicación de los Scripts

Esta primera versión de la herramienta está conformada por 5 scripts que se supone deben de correr en segundo background en el servidor de producción, los he separado en dos grupos para que sean más fácil de explicar.

Scripts de administración
Deben de correr en nuestro “trusted system”

  • auto_commit.sh: Como su nombre lo indica, hace un commit, es util a la hora de que terminamos de agregar algo en localhost y queremos que los cambios sean agregados al repositorio
  • db_checksum_backup.sh: En el caso de que nuestro desarrollo utilice bases de datos con este script podemos crear un backup de las tablas y almacenar el checksum de las mismas en un archivo para que posteriormente sean revisadas

Scripts de producción
Deben de correr en nuestro servidor de producción

  • auto_update.sh: Como su nombre lo indica, el trabajo de este script es revisar si hay nuevos cambios en el servidor Git, si los hay los descargara con el fin de mantener el sitio de producción actualizado
  • deface_recovery.sh: Este script se encarga de detectar cambios en los archivos locales, en el caso de que se elimine, modifique o cree un archivo, el script devolverá todo a como estaba originalmente
  • db_checksum_validator.sh: En el caso de que un atacante haya comprometido nuestra base de datos (agregado, eliminado o modificado información de la misma), este script detectara que hubo una modificación de las tablas utilizando el checksum y las restaurara utilizando la copia que tiene del servidor Git
Tip: Es recomendable que los script de producción corran mediante cronjobs mientras que los de administración sean bajo demanda

Integrar los scripts con un proyecto

Primeramente, en nuestra laptop o la máquina de donde subiremos los cambios (normalmente localhost) clonaremos el repositorio usando la cuenta de administrador, y agregaremos los archivos de nuestro sitio web, blog de wordpress, joomla, desarrollo a la medida o lo que sea, después para integrar Git Hack Recovery es tan fácil como descargar los archivos del siguiente enlace Git Hack Recovery y colocarlos junto con los archivos del sitio web que queremos proteger, el archivo .gitignore ya contiene las entradas para que los scripts de administración sean ignorados al momento de hacer los commits. Una vez tenemos los archivos listos en la maquina “trusted” podemos correr los scripts de administración (en este orden)

$ ./db_checksum_backup.sh host-name db-name db-user db-pass
$ ./auto_commit.sh remote-name branch-name "your-commit-message"

En este punto tanto nuestro sistema “trusted” como nuestro servidor Git estarán sincronizados con los mismos archivos, ahora en el servidor de producción vamos a clonar el repositorio de Git utilizando la cuenta “esclavo”, esto nos asegura que en caso de que alguien vulnere el servidor de producción (que es el que normalmente está expuesto a Internet), solo seguirá teniendo acceso de lectura al repositorio en el servidor Git. En el servidor de producción es donde debemos de correr los 3 scripts que nos faltan como taras cron, para hacerlo podemos abrir el archivo de configuración de cronjobs usando el comando:

# crontab -e

Y agregar las siguientes entradas

*/1 * * * * cd /path/production-repository/; /bin/bash deface_recovery.sh --arguments > /path/deface_recovery.txt</li>
*/1 * * * * cd /path/production-repository/; /bin/bash auto_update.sh --arguments > /path/auto_update.txt</li>
*/1 * * * * cd /path/production-repository/; /bin/bash db_checksum_validator.sh --arguments > /path/db_checksum_validator.txt</li>

Estos scripts se estarán ejecutando cada minuto y guardaran un log en el path que le indiquemos. Listo, esto ha sido un pequeño tutorial de cómo integrar la herramienta, es la versión 1.0 pero cumple con su cometido, estaré trabajando para agregarle funcionalidades extras así como soporte para manejar más motores de bases de datos. Próximamente estaré subido algunos vídeos de donde se aprecie el funcionamiento de la misma.

Git Hack Recovery en acción

Descargar Git Hack Recovery

salu2