
プロセスヒープ解析フレームワーク - Windows/Linux - レコードタイプ推論とフォレンジック
################################
|travis| |coverage| |landscape| |pypi| |docs|
クイック使用ガイド <docs/Haystack_basic_usage.ipynb>_ (docs/ フォルダ内)
Haystack-reverse CLI <docs/Haystack_reverse_CLI.ipynb>_ (docs/ フォルダ内)
詳細ドキュメント <http://python-haystack.readthedocs.io/en/latest/>_
python-haystack は、割り当てられたメモリ内の C 構造体の検索とリバースエンジニアリングに特化したヒープ分析フレームワークです。
最初の機能/API は SEARCH 関数です。プロセスメモリダンプや動作中のプロセスメモリ内で既知のレコードタイプを検索する機能を提供します。
2つ目の機能/API は、拡張機能 python-haystack-reverse <https://github.com/trolldbois/python-haystack-reverse>_ の REVERSE 関数です。アナリストがプロセスヒープに存在するメモリレコードタイプをリバースエンジニアリングするのを支援することを目的としています。メモリから古典的な C 構造体の再構築と分類に焦点を当てています。型定義の再作成を試みます。
メモリダンプの形式を処理するためのいくつかのエントリポイントが存在します。
haystack-live-dump によって生成されたメモリダンプフォルダhaystack-find-heap は Windows HEAP の詳細を表示します。haystack-search 検索 CLIhaystack-show 特定のアドレスの特定のレコードタイプを表示する CLI次の URL を使用してメモリハンドラ/ダンプを指定できます:
dir:///path/to/my/haystack/fump/folder : haystack ダンプ形式を使用する場合dmp:///path/to/my/minidump/file : minidump 形式を使用する場合 (Microsoft?)frida://name_or_pid_of_process_to_attach_to : frida を使用して動作中のプロセスメモリにアクセスする場合live://name_or_pid_of_process_to_attach_to : ptrace で動作中のプロセスにアクセスする場合rekall:// : rekall イメージをロードする場合volatility:// : volatility イメージをロードする場合cuckoo:// : Cuckoo によって生成されたメモリダンプをロードする場合 (beta, パッチが必要かもしれません)Windows では、最も簡単なのはミニダンプを取得することです。Microsoft Sysinternals ツール群は、CLI (procdump.exe) または GUI (Process Explorer) を提供しています。これらのいずれか(フルメモリダンプオプション付き)を使用すると、haystack-minidump-xxx エントリポイント群で使用できるファイルが生成されます。
技術的には多くのサードパーティ製ツールを使用できますが、haystack は実際にはメモリマッピング情報を必要とします。そのため、ダンプツール haystack-live-dump が含まれています:
.. code-block:: bash
# haystack-live-dump <pid> myproc.dump
haystack-live-dump プロセスメモリダンプをフォルダにキャプチャ (haystack 形式)haystack-rekall-dump 特定のプロセスを haystack プロセスダンプにダンプhaystack-volatility-dump 特定のプロセスを haystack プロセスダンプにダンプダンプの形式は簡単に再現でき、各メモリマップを個別のファイルに含むフォルダ/アーカイブです:
または、お好みの形式用に haystack.abc.IMemoryMapping の実装をコーディングすることもできます。
あるいは、すでに Volatility または Rekall からのシステムメモリダンプがある場合は、haystack-rekall-xxx または haystack-volatility-xxx のエントリポイント群を使用して、特定のプロセスメモリをファイルに抽出できます。
エントリポイント haystack-find-heap は Windows HEAP の詳細を表示します。対応しているのは:
また、Look Aside List (LAL) および Low Fragmentation Heap (LFH) フロントエンドの詳細を表示します。
驚くかもしれませんが、単一のプロセスが2種類のヒープ (32 ビットと 64 ビット) を混在させることがあります。
特定のレコードを検索するには、まずそのレコードタイプを定義する必要があります。C ヘッダーファイルから Python ctypes 定義への基本的な手順を説明する[クイック使用ガイド](docs/Haystack basic usage.ipynb) が利用可能です。または、従来の Python ctypes レコードを使用して自分で行うこともできます。
検索 API は haystack-xxx-search スクリプト群を通じて利用可能ですが、API としても提供されているため、独自のコードに検索を組み込むことができます。
要するに、haystack の検索はプログラムのメモリのすべてのオフセットを反復処理し、その特定のレコードタイプに対して「有効な」オフセットを見つけようとします。
レコードの有効性は、次のような型制約によって決定されます:
.. code-block:: bash
$ python haystack/cli.py dir:///home/user/project/python-haystack/test/src/test-ctypes6.32.dump ctypes6_gen32.struct_usual
次の制約がサポートされています:
例:
.. code-block:: python
[struct_name]
myfield: [1,0xff]
ptr_field: NotNull
haystack/allocators/win32/winxpheap32.constraints を参照してください。ここで Windows XP HEAP x32 の制約が定義されています。
明らかに、制約が多いほど結果は良くなります。
haystack.abc.interface.IRecordTypeDynamicConstraintsValidator クラスを実装し、それを ModuleConstraints.set_dynamic_constraints に渡すことで、Python コードを使用してより複雑な制約を作成することもできます。
sslsnoop リポジトリは v0.30 より新しいリリースと互換性を持たせるために更新が必要です(保留中)
例えば、次のコマンドは session_state 構造体 + ポインタが指す子構造体を、操作可能な Python オブジェクトとしてダンプします。ssh クライアントまたはサーバーの 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
現在は動作しません
グラフィカル UI の試みもあります python-haystack-gui <https://github.com/trolldbois/python-haystack-gui>_
クイック使用ガイド <docs/Haystack_basic_usage.ipynb>_ を参照してください。
最も簡単な方法は、ctypeslib を使用して C ヘッダーから ctypes レコードを生成することです。
または、手動で Python ctypes レコードを定義します。
@ Pypi リポジトリの sslsnoop を参照してください。openssl と nss の構造体が生成されています。
@ 私の github の ctypes-kernel を参照してください。Linux カーネル構造体がビルドされたカーネルツリーから生成されています。(VMM は厄介です)
基本機能は、プロセスのメモリ内で特定の C レコードを検索することです。
拡張リバースエンジニアリング機能は、メモリ/ヒープ分析から構造体をリバースエンジニアリングすることを目的としています。
レコードフィールドの期待値にいくつかの制約を追加します。ポインタは常に有効なメモリ空間に制約されます。
もともとは passe-partout <http://www.hsc.fr/ressources/breves/passe-partout.html.fr>_ です。2011年3月に開始して以来、他のいくつかの関連する先行研究を発見しました。
それらのほとんどは docs/ フォルダにあります。
その他の関連作品としては、Immunity の mona.py、Mandiant のいくつかのものなどがあります...
要するに、これはおそらく独創的なアイデアではありません。しかし、sslsnoop PoC のために動作するスタンドアロンライブラリを見つけられなかったので...
関連作品 <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