
Framework d'analyse du tas de processus - Windows/Linux - inférence de type d'enregistrement et forensique
################################
|travis| |coverage| |landscape| |pypi| |docs|
Guide d'utilisation rapide <docs/Haystack_basic_usage.ipynb>_ dans le dossier docs/.
Haystack-reverse CLI <docs/Haystack_reverse_CLI.ipynb>_ dans le dossier docs/.
Plus de documentation <http://python-haystack.readthedocs.io/en/latest/>_
python-haystack est un framework d'analyse du tas (heap), axé sur la recherche et le rétro-ingénierie de structures C dans la mémoire allouée.
La première fonction/API est la fonction SEARCH. Elle permet de rechercher des types d'enregistrements connus dans un vidage mémoire d'un processus ou dans la mémoire d'un processus en direct.
La deuxième fonction/API est la fonction REVERSE dans l'extension python-haystack-reverse <https://github.com/trolldbois/python-haystack-reverse>_
Elle vise à aider un analyste à rétro-ingénier les types d'enregistrements mémoire présents dans le tas d'un processus.
Elle se concentre sur la reconstruction et la classification des structures C classiques à partir de la mémoire.
Elle tente de recréer les définitions de types.
Quelques points d'entrée existent pour gérer le format de votre vidage mémoire.
haystack-live-dumphaystack-find-heap permet d'afficher les détails sur le tas Windows.haystack-search interface CLI de recherchehaystack-show interface CLI d'affichage pour un type d'enregistrement spécifique à une adresse donnéeVous pouvez utiliser les URL suivantes pour désigner votre gestionnaire/ vidage mémoire :
dir:///chemin/vers/mon/dossier/de/vidage/haystack pour utiliser le format de vidage haystackdmp:///chemin/vers/mon/fichier/minidump pour utiliser le format minidump (Microsoft ?)frida://nom_ou_pid_du_processus_à_attacher pour utiliser frida afin d'accéder à la mémoire d'un processus en directlive://nom_ou_pid_du_processus_à_attacher pour tracer (ptrace) un processus en directrekall:// pour charger une image rekallvolatility:// pour charger une image volatilitycuckoo:// pour charger un vidage mémoire produit par Cuckoo (bêta, peut nécessiter un correctif)Sous Windows, le plus simple est d'obtenir un Minidump. La suite d'outils Microsoft Sysinternals
fournit soit un CLI (procdump.exe) soit une interface graphique (Process Explorer).
En utilisant l'un de ces outils (avec l'option de vidage mémoire complet), vous produirez un fichier
qui peut être utilisé avec la liste de points d'entrée haystack-minidump-xxx.
Bien que techniquement vous puissiez utiliser de nombreux outils tiers, haystack a en réalité
besoin des informations de mappage mémoire pour fonctionner.
C'est pourquoi un outil de vidage est inclus : haystack-live-dump :
.. code-block:: bash
# haystack-live-dump <pid> myproc.dump
haystack-live-dump capture un vidage mémoire d'un processus vers un dossier (format haystack)haystack-rekall-dump vide un processus spécifique vers un vidage de processus haystackhaystack-volatility-dump vide un processus spécifique vers un vidage de processus haystackVous pouvez facilement reproduire le format du vidage : il s'agit d'un dossier/archive contenant chaque carte mémoire dans un fichier séparé :
Ou vous pouvez coder une implémentation de haystack.abc.IMemoryMapping pour votre format préféré.
Sinon, si vous avez déjà un vidage mémoire système provenant de Volatility ou Rekall,
vous pouvez utiliser les familles de points d'entrée haystack-rekall-xxx ou haystack-volatility-xxx
pour extraire la mémoire d'un processus spécifique dans un fichier.
Le point d'entrée haystack-find-heap permet d'afficher les détails sur le tas Windows.
Il devrait prendre en charge :
et afficher les détails de la liste de côté (LAL) et du tas à faible fragmentation (LFH) frontal (frontend).
Vous pourriez être surpris de constater que parfois, un seul processus peut mélanger les deux types de TAS (32 et 64).
Pour rechercher un enregistrement spécifique, vous devez d'abord définir ce type d'enregistrement. Un [guide d'utilisation rapide](docs/Haystack basic usage.ipynb) est disponible pour parcourir les étapes de base allant d'un fichier d'en-tête C à une définition Python ctypes. Ou vous pouvez le faire vous-même, avec des enregistrements Python ctypes traditionnels.
L'API de recherche est disponible via la famille de scripts haystack-xxx-search mais
aussi via une API afin que vous puissiez intégrer cette recherche dans votre propre code.
En résumé, la recherche haystack parcourra chaque décalage (offset) de la mémoire du programme pour tenter de trouver un décalage 'valide' pour ce type d'enregistrement spécifique.
La validité de l'enregistrement est déterminée par des contraintes de type telles que :
.. code-block:: bash
$ python haystack/cli.py dir:///home/user/project/python-haystack/test/src/test-ctypes6.32.dump ctypes6_gen32.struct_usual
Les contraintes suivantes sont prises en charge :
Exemple :
.. code-block:: python
[struct_name]
myfield: [1,0xff]
ptr_field: NotNull
Vous pouvez consulter haystack/allocators/win32/winxpheap32.constraints, où
les contraintes d'un TAS Windows XP x32 sont définies.
Évidemment, plus il y a de contraintes, meilleurs seront les résultats.
Vous pouvez également créer des contraintes plus complexes en utilisant du code Python en implémentant
une classe haystack.abc.interface.IRecordTypeDynamicConstraintsValidator et en la transmettant à
ModuleConstraints.set_dynamic_constraints
Le dépôt sslsnoop nécessite une mise à jour pour être compatible avec les versions > v0.30 - en attente
Par exemple, cela videra les structures session_state ainsi que les structures enfants pointées sous forme d'un objet Python avec lequel nous pouvons jouer. Supposons que nous ayons un client ou serveur ssh avec le 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> <your ctypes Structure> search
Cela ne fonctionne pas pour le moment
Il existe également une tentative d'interface graphique python-haystack-gui <https://github.com/trolldbois/python-haystack-gui>_
Voir le guide d'utilisation rapide <docs/Haystack_basic_usage.ipynb>_
La façon la plus simple est d'utiliser ctypeslib pour générer des enregistrements ctypes à partir d'en-têtes C.
Ou définissez vos enregistrements Python ctypes manuellement.
@ voir sslsnoop dans le dépôt Pypi. Les structures openssl et nss sont générées.
@ voir ctypes-kernel sur mon github. Les structures du noyau Linux sont générées à partir d'une arborescence de noyau compilée. (VMM est une garce)
La fonctionnalité de base est de rechercher dans la mémoire d'un processus un enregistrement C spécifique.
La fonctionnalité étendue de rétro-ingénierie vise à inverser (reverse) des structures à partir de l'analyse de la mémoire/du tas.
Vous ajoutez des contraintes sur les valeurs attendues des champs de l'enregistrement. Les pointeurs sont toujours contraints à un espace mémoire valide.
À l'origine de passe-partout <http://www.hsc.fr/ressources/breves/passe-partout.html.fr>_.
Depuis que j'ai commencé en mars 2011, j'ai découvert plusieurs autres travaux
antérieurs connexes.
La plupart d'entre eux se trouvent dans le dossier docs/.
D'autres travaux connexes sont mona.py d'Immunity, certains trucs de Mandiant...
En résumé, ce n'est probablement pas une idée originale. Mais pourtant, je n'ai pas trouvé de bibliothèque autonome opérationnelle pour l'extraction de mémoire en direct pour mon PoC sslsnoop, donc...
Travaux connexes <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