
Marco de análisis del heap de procesos - Windows/Linux - inferencia de tipos de registros y análisis forense
python-haystack memoria forense ################################
|travis| |coverage| |landscape| |pypi| |docs|
Guía de uso rápido <docs/Haystack_basic_usage.ipynb>_ en la carpeta docs/.
CLI de Haystack-reverse <docs/Haystack_reverse_CLI.ipynb>_ en la carpeta docs/.
Más documentación <http://python-haystack.readthedocs.io/en/latest/>_
python-haystack es un framework de análisis de heap, enfocado en la búsqueda e ingeniería inversa de estructuras C en memoria asignada.
La primera función/API es la función SEARCH. Proporciona la capacidad de buscar tipos de registros conocidos en un volcado de memoria de un proceso o en la memoria de un proceso en vivo.
La segunda función/API es la función REVERSE en la extensión python-haystack-reverse <https://github.com/trolldbois/python-haystack-reverse>_
Su objetivo es ayudar a un analista en la ingeniería inversa de los tipos de registros de memoria presentes en el heap de un proceso.
Se centra en la reconstrucción y clasificación de estructuras C clásicas a partir de la memoria.
Intenta recrear definiciones de tipos.
Existen algunos puntos de entrada para manejar el formato de su volcado de memoria.
haystack-live-dumphaystack-find-heap permite mostrar detalles sobre el HEAP de Windows.haystack-search CLI de búsquedahaystack-show CLI de visualización para un tipo de registro específico en una dirección específicaPuede usar la siguiente URL para designar su manejador/volcado de memoria:
dir:///ruta/a/mi/carpeta/de/volcado/haystack para usar el formato de volcado de haystackdmp:///ruta/a/mi/archivo/minidump para usar el formato minidump (¿Microsoft?)frida://nombre_o_pid_del_proceso_a_conectar para usar frida y acceder a la memoria de un proceso en vivolive://nombre_o_pid_del_proceso_a_conectar para hacer ptrace a un proceso en vivorekall:// para cargar una imagen de rekallvolatility:// para cargar una imagen de volatilitycuckoo:// para cargar un volcado de memoria producido por Cuckoo (beta, puede necesitar parche)En Windows, la forma más directa es obtener un Minidump. El conjunto de herramientas Sysinternals de Microsoft
proporciona una CLI (procdump.exe) o una GUI (Process Explorer).
Usando una de ellas (con la opción de volcado de memoria completo) obtendrá un archivo
que se puede usar con la lista de puntos de entrada haystack-minidump-xxx.
Aunque técnicamente podría usar muchas herramientas de terceros, haystack realmente
necesita información de mapeo de memoria para funcionar.
Por lo tanto, se incluye una herramienta de volcado haystack-live-dump:
.. code-block:: bash
# haystack-live-dump <pid> myproc.dump
haystack-live-dump captura un volcado de memoria de un proceso en una carpeta (formato haystack)haystack-rekall-dump vuelca un proceso específico a un volcado de proceso de haystackhaystack-volatility-dump vuelca un proceso específico a un volcado de proceso de haystackPuede reproducir fácilmente el formato del volcado; es una carpeta/archivo que contiene cada mapa de memoria en un archivo separado:
O puede programar una implementación de haystack.abc.IMemoryMapping para su formato favorito.
De lo contrario, si ya tiene un volcado de memoria del sistema de Volatility o Rekall,
puede usar las familias de puntos de entrada haystack-rekall-xxx o haystack-volatility-xxx
para extraer la memoria de un proceso específico en un archivo.
El punto de entrada haystack-find-heap permite mostrar detalles sobre el HEAP de Windows.
Debería soportar:
y mostrar detalles de la Lista Lateral de Búsqueda (LAL) y el heap de Baja Fragmentación (LFH) frontend.
Puede sorprenderse al ver que, a veces, un solo proceso puede mezclar los dos tipos de HEAP (32 y 64).
Para buscar un registro específico, primero necesitará definir ese tipo de registro. Hay una [guía de uso rápido](docs/Haystack basic usage.ipynb) disponible para repasar los pasos básicos para pasar de un archivo de cabecera C a una definición de ctypes en Python. O puede hacerlo usted mismo, con registros ctypes tradicionales de Python.
La API de búsqueda está disponible a través de la familia de scripts haystack-xxx-search pero
también en una API para que pueda integrar esa búsqueda en su propio código.
En resumen, la búsqueda de haystack iterará sobre cada offset de la memoria del programa para intentar encontrar offsets 'válidos' para ese tipo de registro específico.
La validez del registro se determina mediante restricciones de tipo como:
.. code-block:: bash
$ python haystack/cli.py dir:///home/user/project/python-haystack/test/src/test-ctypes6.32.dump ctypes6_gen32.struct_usual
Se soportan las siguientes restricciones:
Ejemplo:
.. code-block:: python
[struct_name]
myfield: [1,0xff]
ptr_field: NotNull
Puede echar un vistazo a haystack/allocators/win32/winxpheap32.constraints, donde
se definen las restricciones de un HEAP de Windows XP x32.
Obviamente, cuantas más restricciones, mejores serán los resultados.
También puede crear restricciones más complejas usando código Python implementando
una clase haystack.abc.interface.IRecordTypeDynamicConstraintsValidator y alimentándola a
ModuleConstraints.set_dynamic_constraints
El repositorio sslsnoop necesita una actualización para ser compatible con versiones > v0.30 - pendiente
Por ejemplo, esto volcará las estructuras session_state + las estructuras hijas apuntadas como un objeto Python con el que podemos jugar. Supongamos que tenemos un cliente o servidor ssh con pid 4042:
.. code-block:: bash
$ sudo haystack-live-search --pickled 4042 sslsnoop.ctypes_openssh.session_state search > instance.pickled
$ sudo haystack-live-search --pickled 4042 sslsnoop.ctypes_openssh.session_state refresh 0xb8b70d18 > instance.pickled
$ sudo haystack-live-search --pickled <pid> <su estructura ctypes> search
Esto no funciona actualmente
También hay un intento de interfaz gráfica de usuario python-haystack-gui <https://github.com/trolldbois/python-haystack-gui>_
Consulte la guía de uso rápido <docs/Haystack_basic_usage.ipynb>_
La forma más sencilla es usar ctypeslib para generar registros ctypes a partir de cabeceras C.
O definir su registro ctypes de Python a mano.
@ ver sslsnoop en el repositorio de Pypi. Las estructuras de openssl y nss están generadas.
@ ver ctypes-kernel en mi github. Las estructuras del kernel de Linux se generan a partir de un árbol del kernel compilado. (VMM es un fastidio)
La funcionalidad básica es buscar en la memoria de un proceso un registro C específico.
La funcionalidad extendida de ingeniería inversa tiene como objetivo invertir estructuras a partir del análisis de memoria/heap.
Agrega algunas restricciones sobre los valores esperados de los campos del registro. Los punteros siempre están restringidos al espacio de memoria válido.
passe-partout <http://www.hsc.fr/ressources/breves/passe-partout.html.fr>_ originalmente.
Desde que comencé en marzo de 2011, he descubierto varios otros trabajos
relacionados anteriores.
La mayoría de ellos están en la carpeta docs/.
Otros trabajos relacionados son mona.py de Immunity, algunas cosas de Mandiant...
En resumen, probablemente no sea una idea original. Pero aún así, no pude encontrar una librería independiente operativa para la extracción de memoria en vivo para mi PoC de sslsnoop, así que...
Trabajos relacionados <https://github.com/trolldbois/python-haystack/wiki/State-of-art-reference>_
http://ntinfo.biz/ xntsv32
.. |pypi| image:: https://img.shields.io/pypi/v/haystack.svg?style=flat-square&label=latest%20stable%20version :target: https://pypi.python.org/pypi/haystack :alt: Latest version released on PyPi
.. |coverage| image:: https://img.shields.io/coveralls/trolldbois/python-haystack/master.svg?style=flat-square&label=coverage :target: https://coveralls.io/github/trolldbois/python-haystack?branch=master :alt: Test coverage
.. |travis| image:: https://img.shields.io/travis/trolldbois/python-haystack/master.svg?style=flat-square&label=travis-ci :target: http://travis-ci.org/trolldbois/python-haystack :alt: Build status of the master branch on Mac/Linux
.. |landscape| image:: https://landscape.io/github/trolldbois/python-haystack/master/landscape.svg?style=flat :target: https://landscape.io/github/trolldbois/python-haystack/master :alt: Code Health
.. |docs| image:: https://readthedocs.org/projects/python-haystack/badge/?version=latest :target: https://readthedocs.org/projects/python-haystack/badge/?version=latest :alt: Documentation status