El poder de los reptiles: Hacer herramientas de hacking es fácil

Post on 14-Aug-2015

183 views 1 download

Transcript of El poder de los reptiles: Hacer herramientas de hacking es fácil

El poder de los reptilesHacer herramientas de hacking es fácil

>>> print(Me) https://twitter.com/ggdaniel http://cr0hn.com/me/

https://github.com/cr0hn/navajanegra

Aviso…

• Las ideas aquí presentadas son fruto de la experiencia e investigación propia.

• Las soluciones presentadas pueden no ser las mejores. Éstas son son solo mis propuestas

¿Por qué?

¿Por qué?

Hackers != desarrolladores

¿Por qué?

Hackers != desarrolladores

¿Por qué?

Hackers != desarrolladores

¿Por qué?

Las herramientas de hacking muy mal diseñadas (en general)

Aplicaciones no re-usables. Buenas prácticas… ¿qué es eso?

Tolerancia a fallos pésima

Obsesión por reinventar la rueda…

Hackers != desarrolladores

¿Por qué?

Las herramientas de hacking muy mal diseñadas (en general)

Aplicaciones no re-usables. Buenas prácticas… ¿qué es eso?

Tolerancia a fallos pésima

Obsesión por reinventar la rueda… why?! :)

Hackers != desarrolladores

¿De qué va esta charla?

Hacer movidas tope chungas con Python

Nociones de esenciales de desarrollo

Buenas prácticas

Como hacer puzzles de frameworks y cómo unirlos

¿De qué va esta charla?

Hacer movidas tope chungas con Python

Nociones de esenciales de desarrollo

Buenas prácticas

Como hacer puzzles de frameworks y cómo unirlos

Cómo hacer caca en Python

¿Qué vas a aprender?

Nociones de buenas prácticas

Organizar y crear tu herramienta de hacking

Casos concretos de uso

Ejemplos prácticos de cada uso

¿Porqué Python?

Fácil

Desarrollo muy rápido

Infinidad de librerías

Código limpio

Buena relación: tiempo desarrollo / rendimiento

¿Porqué Python 3.x?Python 2.7.x

No será evolucionado

Muchos problemas de unicode, textos, core…

Python 3

Es el futuro de Python

Incluye infinidad de nuevas características muy interesantes

¡Manos a la obra!

Muchas herramientas no pueden ser usadas con un “import”

Usarlas en nuestro código puede ser muy complicado

Solo pueden ser usadas en linea de comandos

Problema 1

Solución 1

Una correcta estructuración del proyecto

Diseñar nuestra aplicación pensando en la potabilidad

Cómo 1Wfuzz

theHardvester

Cómo 1Wfuzz

theHardvester

Cómo 1

Cómo 1

lib

Cómo 1

lib

Cómo 1

lib

doc

Cómo 1

lib doc

Cómo 1

lib doc

bin

Cómo 1

lib doc bin

Cómo 1

Cómo 1

Cómo 1

Cómo 1

setup.py

Cómo 1

setup.py

Cómo 1

setup.py

LICENSE

Cómo 1

setup.pyLICENSE

Cómo 1

setup.pyLICENSE

README.rst

Cómo 1

setup.pyLICENSE

README.rst

Cómo 1

setup.pyLICENSE

README.rst

__init__.py

Cómo 1

setup.pyLICENSE

README.rst__init__.py

Problema 2

Añadir nuevos parámetros de entrada

Cada cambio implica modificar mucho del código

Problema 2

Problema 2

Problema 2

Verbosity

Problema 2

Verbosity

Problema 2

Verbosity

1

Problema 2

Verbosity

1

2

Solución 2

Objeto contenedor de parámetros de aplicación

Posibilidad de comprobación exhaustiva de los parámetros

Cómo 2

Cómo 2

Cómo 2

Cómo 2

1

Problema 3

Obtención de resultados de ejecución no es sencilla

El mejor de los casos: parsear XML/JSON/YAML…

Problema 3

Problema 3

Problema 3

is_2_multiple

Problema 3

is_2_multiple

Problema 3

is_2_multiple12

3

Solución 3

Objeto contenedor de resultados.

Abstracción de resultado del formato de salida: XML/JSON…

Cómo 3

Cómo 3

Cómo 3

Cómo 3

1

Problema 4

Cada nueva UI implica cambiar mucho código.

Inclusión de nueva funcionalidad no es sencilla.

La aplicación no puede ser usada como librería.

Problema 4

Problema 4

Problema 4

Solución 4

Solución 4

Solución 4

API

Solución 4

API

Cómo 4

setup.pyLICENSE

README.rst__init__.py

Cómo 4

setup.pyLICENSE

README.rst__init__.py

api.py

Cómo 4

setup.pyLICENSE

README.rst__init__.pyapi.py

Cómo 4

Cómo 4

Cómo 4

Cómo 4

Cómo 4

Cómo 4

Cómo 4

12

Problema 5

Mostrar información por pantalla con un print(…)

Añadir nuevas localizaciones, además del print(…)

Enviar información a 2 localizaciones concurrentemente

Problema 5

Problema 5

Problema 5

Problema 5

Problema 5

1

Problema 5

12

Problema 5

Problema 5

Problema 5

Problema 5

Problema 5

12

Problema 5

Problema 5

Problema 5

1

32

4

Solución 5

Punto de entrada unificado a los medios de salida

Solución 5

Solución 5

Hello world

Solución 5

Hello world

Cómo 5

Cómo 5

12

3

Cómo 5

Cómo 5

Cómo 5

Cómo 5

Problema 6

Instalar dependencias es muy tedioso

Cada dependencias tiene su web oficial y su forma de instalarse

Solución 6

Usar pip para instalar dependencias

Usar un fichero de dependencias: requirements.txt

Cómo 6

setup.pyLICENSE

README.rst__init__.pyapi.py

Cómo 6

setup.pyLICENSE

README.rst__init__.py

requirements.txt

api.py

Cómo 6

setup.pyLICENSE

README.rst__init__.pyapi.py

requirements.txt

Cómo 6

Cómo 6

Problema 7

Las dependencias cruzadas entre proyectos.

Varias versiones de una misma libraría en el sistema.

Acceso como administrador.

Solución 7

Solución 7¿Un espacio virtual…?

Solución 7¿Un espacio virtual…?

Solución 7¿Un espacio virtual…?

Solución 7¿Un espacio virtual…?

Solución 7¿Un espacio virtual…?

Solución 7¿Un espacio virtual…?

Solución 7¿Un espacio virtual…?

Solución 7¿Un espacio virtual…?

Solución 7¿Un espacio virtual…?

Solución 7¿Un espacio virtual…?

Solución 7¿Un espacio virtual…?

Solución 7¿Un espacio virtual…?

Solución 7¿Un espacio virtual…?

Solución 7¿Un espacio virtual…?

Solución 7¿Y en Python?

Cómo 7

Cómo 7

Problema 8

Python es mucho más lento que otros lenguajes

No no tiene coroutines integradas en el framework

Problema 8

Python es mucho más lento que otros lenguajes

No no tiene coroutines integradas en el framework

¡¡¡¿¿Co..rru..ti….. queeee??!!!

Problema 8

Python es mucho más lento que otros lenguajes

No no tiene coroutines integradas en el framework

¡¡¡¿¿Co..rru..ti….. queeee??!!!

Problema 8

Problema 8def hello_coroutine(…):

return get_web_page(…)

Problema 8def hello_coroutine(…):

return get_web_page(…)

… hello_coroutine() …

Run!

Problema 8def hello_coroutine(…):

return get_web_page(…)

… hello_coroutine() …

Run! get_web_page()1

Problema 8def hello_coroutine(…):

return get_web_page(…)

… hello_coroutine() …

Run! get_web_page()1

<—Respuesta

Problema 8def hello_coroutine(…):

return get_web_page(…)

… hello_coroutine() …

Run! get_web_page()1

return get_web_page()

<—Respuesta

2

Solución 8

Usar la librería asyncio (a.k.a. Tulip), incluida en Python 3.4

Instalarla en versiones anteriores de Python 3.4

Cómo 8

Cómo 8

Cómo 8

Bloqueo

Cómo 8

Bloqueo

Cómo 8

Bloqueo

NO bloqueante

Problema 9

Python NO tiene multithreading real.

Los hilos no son realmente hilos, sino una simulación.

GIL (Global Interpreter Lock)

CTRL+C

Problema 9

GIL

thread 1

T0

thread 2

Problema 9

GIL

thread 1

T1

thread 2

Problema 9

GIL

thread 1

T2

thread 2

Problema 9

GIL

thread 1

thread 2

T3

Problema 9

GIL

thread 1

thread 2

T4

Solución 9

Usar multiprocessing

Cómo 9Multithreading

Cómo 9Multithreading

Cómo 9Multithreading

Cómo 9Multiprocessing

Cómo 9Multiprocessing

Cómo 9Multiprocessing

Problema 10

Ejecución de tareas en backgound

Ejecución de procesos muy costosos computacionalmente

Creación un flujo de información entre tareas

Solución 10

Usar Celery

Solución 10Pero… ¿Qué es eso de Celery? ¿Se come?

Solución 10Pero… ¿Qué es eso de Celery? ¿Se come?

Solución 10

Gestor de tareas distribuido

Consumidor3

Solución 10

Tarea Generadora

Consumidor1

Consumidor2Gestor de colas

Conceptualmente

Consumidor3

Solución 10

Tarea Generadora

Consumidor1

Consumidor2Gestor de colas

Conceptualmente

Consumidor3

Solución 10

Tarea Generadora

Consumidor1

Consumidor2Gestor de colas

Conceptualmente

Consumidor3

Solución 10

Tarea Generadora

Consumidor1

Consumidor2Gestor de colas

Conceptualmente

Registrar visita

Solución 10

Enviar email

Enviar email

Caso concreto

Registrar visita

Solución 10

Enviar email

Enviar email

Caso concreto

send_mail(“text”)

Registrar visita

Solución 10

Enviar email

Enviar email

Caso concreto

send_mail(“text”)

Registrar visita

Solución 10

Enviar email

Enviar email

Caso concreto

send_mail(“text”)

Registrar visita

Solución 10

Enviar email

Enviar email

Caso concreto

send_mail(“text”)

Cómo 10

Tasks Servidor broker

Cómo 10

Cómo 10

Cómo 10

Cómo 10

Cómo 10

celery.py

Cómo 10

celery.py

Cómo 10

Cómo 10

main_task.py

Cómo 10

main_task.py

Cómo 10

main_task.py

__init__.py

Cómo 10

main_task.py

__init__.py

Cómo 10

celery.py

Cómo 10

celery.py

__init__.py

Cómo 10

celery.py

__init__.py

Cómo 10

celery.py

__init__.py

celeryconfig.py.py

Cómo 10

celery.py

__init__.py

celeryconfig.py

Cómo 10celeryconfig.py

Cómo 10celeryconfig.py

Cómo 10celeryconfig.py

Cómo 10celery.py

Cómo 10celery.py

Cómo 10celery.py

Cómo 10main_task.py

Cómo 10main_task.py

Cómo 10main_task.py

Cómo 10“pseudo-demo”

Cómo 10“pseudo-demo”

Cómo 10“pseudo-demo”

Cómo 10“pseudo-demo”

Cómo 10“pseudo-demo”

Problema 11

Quiero que se ejecuten tareas cada X tiempo

Solución 11

Usar Celery beat

Cómo 11celeryconfig.py

Cómo 11celeryconfig.py

Cómo 11celeryconfig.py

Cómo 11celeryconfig.py

Cómo 11celeryconfig.py

Cómo 11celeryconfig.py

Cómo 11celeryconfig.py

Mini ejemplo: Análisis de Malware “cutre”

Mini ejemploCelery + Yara

Mini ejemplomain_task.py

Mini ejemplomain_task.py

Mini ejemplomain_task.py

Mini ejemplomain_task.py

export.py

Mini ejemplomain_task.py

export.py

Mini ejemplo

start.py

Mini ejemplo

start.py

¡ Gracias !

https://github.com/cr0hn/navajanegra