Mostrando entradas con la etiqueta practicas. Mostrar todas las entradas
Mostrando entradas con la etiqueta practicas. Mostrar todas las entradas

miércoles, 11 de mayo de 2016

Python Scripting (I) - Metadatos

Buenos días hackers, cuánto tiempo sin escribiros nada! Hoy vengo a introduciros un poco en el mundo de la programación de scripts en Python, ese lenguaje tan ampliamente utilizado en el mundo de la ciberseguridad.

Python

Python es un lenguaje interpretado y orientado a objetos cuyo principal objetivo es producir software de una forma fácil y rápida, así de sencillo. Python es rápido. Además, siendo bastante fácil de aprender y utilizar, lo hacen un lenguaje de programación perfecto para principiantes que quieran aprender programación.


Actualmente, la versión de Python más actualizada es la 3.5.1. Sin embargo, mucha gente (como yo de forma habitual) utiliza otra versión más antigua, de la familia 2.7.X. Esto se debe a que el paso de Python 2 a Python 3 llevó a una remodelación de algunos elementos del lenguaje. De todas formas, la rama de Python 2 aún sigue actualizándose, siendo la más actual la versión 2.7.11.

Pese a que estas diferencias existen, ambas ramas comparten el mismo paradigma y el mismo enfoque, y la sintaxis es prácticamente igual. Podéis usar cualquiera de estas dos versiones libremente, y los scripts escritos en una o en otra deberían poder usarse (con ciertos límites) en ambas versiones sin apenas modificaciones.

Dicho esto, soltaré una frase que me oiréis decir de vez en cuando: Saber programar no es saber un lenguaje. Cuando aprendes a programar, el lenguaje te da un poco igual. Esto, que puede sonar muy raro, al final tiene sentido; programar es comprender el flujo que tiene que seguir tu programa para solucionar tu problema de una forma ágil y fiable, y esto es igual en cualquier lenguaje de programación.

¡No me tengáis en cuenta los sermones! :)

Decir también que esta entrada y las que seguirán no pretenden realizar un paso-a-paso por la programación en Python; para ello puedo recomendar libros y manuales que os ayudarán mucho. Sin ir mas lejos, Python para todos de Raúl González Duque es el mejor manual que me he encontrado, y lo podéis descargar de forma gratuita. Lo que sí intentaré es justificar y explicar los elementos estructurales de la herramienta.

En Fwhibbit todos utilizamos Python en mayor o menor medida a la hora de crear herramientas y pruebas de concepto, como la que os traigo hoy. Este script, que podéis encontrar en mi perfil de GitHub, permite obtener metadatos de ficheros con extensión pdf y docx. Por supuesto, el script es ampliable (en un futuro seguramente se amplíe) con nuevos formatos soportados; os lo brindo como prueba de concepto a la recolección de metadatos.

Metadatos

Hablando de ello, ¿qué es eso de metadatos? Los metadatos son una serie de marcas o etiquetas en un archivo que describen diversa información acerca del mismo. La información que arrojan puede ser muy variada dependiendo de cómo se creó el archivo y con qué formato y extensión: autor, fecha de creación, programa y sistema operativo origen... La información que puede arrojar un solo fichero puede dejarnos muy sorprendidos y ser clave para la recolección de información de un objetivo.

El script metadatos.py

El proceso que suelo utilizar a la hora de realizar este tipo de scripts (que puede no ser la mejor, ¡uno no es perfecto!) es comenzar escribiendo la función principal del programa (la función main de toda la vida y que os sonará a los que sois más de Java o C), que verificará los argumentos que le pasamos al script; en este caso, es la dirección (absoluta o relativa) a un directorio que contendrá los ficheros a analizar.

Función principal del script

Una vez hecho esto, la función main invocará a la función que abre y realiza el análisis del fichero en sí, que llamo printMeta(target). Recibe como parámetro el directorio objetivo una vez comprobado y filtrado por la función principal. Una vez comprobado que el objetivo existe, realizará un recorrido en profundidad en su interior (utilizo la función os.walk(target), extremadamente útil en estos casos) y, por cada fichero encontrado, analizará su extensión e invocará a la función correspondiente para la impresión de metadatos si es una extensión soportada.

Función de apertura para analizar el directorio y ficheros encontrados

Por último, las funciones print_doxc(file_full_path) y print_pdf(file_full_path) reciben como parámetro la dirección completa del fichero objetivo e imprimen todos los metadatos encontrados. Para esto, hacemos uso de los módulos externos python-docx y PyPDF2, que proporcionan medios para crear, modificar y borrar ficheros .docx y .pdf respectivamente. En nuestro caso, servirán para analizar un fichero que ya existe y extraer toda la información en forma de metadatos que contengan, imprimiendo por pantalla los datos encontrados.

Análisis de metadatos en PDF
Análisis de metadatos en PDF

A continuación, la ejecución del script en nuestra distribución Linux favorita (funcionará en Windows excepto por la coloración de los resultados, dependiendo de nuestra shell): 

Ejecución del script sobre un directorio

Cabe destacar la importancia de varias cosas que podéis apreciar en el script como buenas prácticas que os animo encarecidamente a seguir: 
  • Los argumentos pasados al script deben verificarse antes de proceder a la ejecución de las funciones, evitando errores futuros. 
  • Es importante dividir el código en funciones para facilitar la lectura y el reciclado del código. Lo agradeceréis cuando abráis el script unos meses después. 
  • Los errores han de tratarse (bloques de código en try...except) y, si son conocidos, informar al usuario de lo que ha pasado.
  • ¡El código debe estar comentado! Una buena práctica es comenzar cada función con un docstring  y comentar el resto del código con comentarios normales (utilizando #). 



Y hasta aquí nuestro script de análisis de metadatos. Espero que os haya gustado y que os sirva para aprender, que es el objetivo de los scripts que os empezaré a traer más de vez en cuando en calidad de prueba de concepto. 

Un saludo hackers!
hartek

viernes, 25 de marzo de 2016

Entornos de pruebas: ¿Cómo practico mi hacking?

Buenas hackers! La intención de la entrada de hoy es daros algunas pautas a la hora de practicar y experimentar en ciberseguridad.

Nuestro campo es tan extenso y experimenta una evolución tan constante que es necesario practicar y experimentar lo máximo posible para mantenerse al día y mantener las garras afiladas. ¿Cómo podemos realizar nuestras prácticas de forma segura y manteniendo nuestra economía dentro de los límites razonables?

Seamos sinceros: a todos nos gustaría tener un equipamiento digno de la nave de Matrix y practicar en un entorno de máquinas reales. Sin embargo, esto no suele ser posible para la mayoría de la gente. Además, en materias de ciberseguridad a veces querremos hacer cosas que pueden comprometer la integridad de nuestro material; no nos gustaría fundir sin querer los datos de un disco duro real en el que tengamos fotos de las vacaciones.

Y sin embargo, realmente necesitamos la interacción entre máquinas para poder aprender.  La primera y normalmente mejor opción para ello son las máquinas virtuales.

Máquinas virtuales

Una máquina virtual, a grandes rasgos, es un sofware que permite ejecutar programas y sistemas operativos como si fuese una máquina de verdad. Dentro de una máquina virtual, en nuestro contexto, tendremos instalado un sistema operativo, igual o diferente al de nuestra máquina real, ejecutándose de forma independiente sobre el real, como si de un programa cualquiera se tratase. 

Los softwares de virtualización más conocidos son VirtualBox y VMware. No entraremos demasiado en las ventajas y desventajas de cada uno; los dos nos pueden servir perfectamente para alojar nuestras máquinas virtuales. 

Podemos configurar nuestras máquinas virtuales de múltiples formas para atender nuestras necesidades, asignando más o menos recursos en función de la potencia que tengamos disponible. Aunque no es necesario tener un equipo de última generación para ejecutar MVs, hay que tener en cuenta que si no les asignamos recursos suficientes podrían funcionar a una velocidad baja. 

La principal ventaja de las máquinas virtuales es que si las "rompemos" podemos recuperarlas fácilmente con una copia de seguridad, podemos clonarlas, reinstalarlas, etc. y todo ello sin comprometer en ningún momento nuestra máquina real. Podemos llevar a cabo auténticos ataques desde una máquina virtual a otra sin miedo a la pérdida de información o a dañar nuestro equipo. 

Las MVs pueden ser configuradas para funcionar en diferentes modos de red, siendo el modo puente y el modo NAT los más utilizados. Podemos ver fácilmente las posibilidades que nos brinda tener dentro de nuestro ordenador una red que a todas luces se comporta exactamente igual que una red real de dispositivos interconectados y funcionando. 

Aun siendo la opción más económica y asequible, a veces necesitaremos tener funcionando equipamiento real; por ejemplo, para practicar ataques a redes inalámbricas necesitaremos una red de pruebas. Para ello, suele bastar con una serie de equipamiento barato y asequible, y el componente más utilizado por su versatibilidad es la Raspberry Pi. 

Raspberry Pi

Este pequeño aparato es, en resumen, un ordenador en miniatura y con un precio considerablemente bajo. Lleva utilizándose años en multitud de proyectos de diversa índole, sobre todo en materia de educación y experimentación. 

El modelo actual, la Raspberry Pi 3, ronda los 45 euros y proporciona una potencia de computación bastante elevada para su precio, incluyendo además funcionalidad WiFi y Bluetooth sin necesidad de agregarle un periférico. El modelo anterior, la Raspberry Pi 2, ronda los 30 euros y también proporciona una buena potencia. El modelo antiguo era bastante más básico, pero aún puede encontrarse a un precio aún menor. 

La Raspberry Pi puede hacer prácticamente todo lo que cualquier ordenador, ejecutando un sistema operativo Linux de nuestra elección. Por ello, puede servirnos como objetivo simulado de un ataque, con la ventaja de que realmente estamos practicando con una máquina real, con sus pros y sus contras. 

Experimentando con la Raspberry Pi

Particularmente, me parece la mejor elección a la hora de llevar a cabo prácticas con redes inalámbricas (¡visita nuestras entradas de Aircrack-ng!), dado que puede configurarse de forma fácil para crear una red WiFi de diversos tipos utilizando el módulo inalámbrico incluido ya en los modelos más actuales o una antena externa en caso del modelo antiguo. 

Otras opciones

Aunque esas son las opciones más asequibles en términos de economía y recursos que utilizo, existen más alternativas. Por ejemplo, Amazon proporciona servicios de virtualización en la nube, que podríamos utilizar en caso de no tener la potencia necesaria en nuestro equipo para ejecutar entornos de varias máquinas virtuales. 

Sin embargo, hay que tener en cuenta los límites que hay que respetar; esas máquinas no pueden utilizarse para ningún fin ilícito, y la infraestructura que las ejecuta es compartida con otras máquinas. Podría haber complicaciones legales a la hora de realizar ciertas prácticas de hacking en esos entornos. 

Dicho esto, podemos terminar con la posibilidad de utilizar equipamiento real. Hay mucha gente que prefiere realizar siempre que es posible las prácticas con varios equipos físicos si dispone de ellos. Aunque comprendo las ventajas de utilizar máquinas reales, también hay que tener en cuenta las desventajas: puedes poner en riesgo dicho equipo si haces según qué cosas, y además, personalmente, encuentro mucho más cómoda la virtualización, dado que me proporciona un entorno de trabajo centralizado en un solo equipo. 

Hasta aquí la entrada de hoy. Espero que os haya gustado y os sirva para orientaros un poco a la hora de fabricar vuestro entorno de pruebas. 

Un saludo hackers!!
hartek

Google Analytics