{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "Сравнение подозрительного файла с ранее проанализированными образцами или образцами, хранящимися в публичном либо частном хранилище, может дать представление о семействе вредоносных программ, их характеристиках и сходстве с предварительно проанализированными образцами.\n", "\n", "Хотя криптографические хеш-функции (MD5/SHA1/SHA256) являются отличным методом для обнаружения идентичных образцов, они не помогают в идентификации схожих образцов. Очень часто авторы вредоносных программ меняют мелкие аспекты вредоносных программ, что полностью меняет значение хеш-функции. " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Нечеткое хеширование – отличный способ сравнить файлы на схожесть. \n", "\n", "[Ssdeep](https://ssdeep-project.github.io/ssdeep/) – полезный инструмент для создания нечеткого хеша для образца, и он также помогает в определении процентного сходства между\n", "образцами. Этот метод полезен при сравнении подозрительного файла с образцами из хранилища для идентификации похожих. Это может помочь определить образцы, принадлежащие к одному семейству вредоносных программ или к одной и той же группе субъектов." ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "#apt-get -y install libfuzzy-dev\n", "#apt-get install ssdeep\n", "#pip install ssdeep" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Чтобы определить нечеткий хеш образца, выполните следующую команду:" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "ssdeep,1.1--blocksize:hash:hash,filename\n", "96:RZTmB6WBilMGIlZIpMRiUHsTgZ6uQ7fTuB3eoBqSitrqN:RZioWQMZMpLfgZ8+4osSi,\"/home/dmf/new_github/infosec/re-tools/samples/test\"\n" ] } ], "source": [ "!ssdeep samples/test" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Чтобы продемонстрировать использование нечеткого хеширования, рассмотрим в качестве примера директорию, состоящую из трех образцов вредоносного ПО. \n", "\n", "В следующем фрагменте кода видно, что все три файла имеют совершенно разные значения хеш-функций MD5:" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "main_01.c main_03.c test\ttest_02 v_01.txt\n", "main_02.c task-1.exe test_01\ttest_03\n" ] } ], "source": [ "!ls samples" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "9cc4604b8bb026dbab1d72b17f9c5446 samples/main_01.c\n", "e08e52b2653e222df3ef3270326b7524 samples/main_02.c\n", "1022987df6fbc4684f5d7cec491b459f samples/main_03.c\n", "a82a243ff5dbf90677c64eae4f0b6a8e samples/task-1.exe\n", "309d0bfa200e4a936157379357cdbf66 samples/test\n", "7c2c629a6b03a1db0ad5f168c29317a3 samples/test_01\n", "f8da20d939b7f10d2de94c22cf28f7dd samples/test_02\n", "aca771dc841b399b8dfb66fcdaae130d samples/test_03\n", "46877a90e977f2562bc3a22a47e67dec samples/v_01.txt\n" ] } ], "source": [ "!md5sum samples/*" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Режим изящного сравнения (опция ```-p```) в ```ssdeep``` может использоваться для определения процентного сходства. Из трех образцов два имеют сходство 93%, что предполагает, что они, вероятно, принадлежат к одному и тому же семейству вредоносных программ:" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "test_02 matches test_03 (93)\n", "\n", "test_03 matches test_02 (93)\n", "\n" ] } ], "source": [ "!ssdeep -pb samples/test_01 samples/test_02 samples/test_03" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Как показано в предыдущем примере, криптографические хеш-функции не помогли установить связь между образцами, тогда как метод нечеткого хеширования выявил сходство. \n", "\n", "Можно запустить ```ssdeep``` для каталогов и подкаталогов, содержащих вредоносные образцы, используя рекурсивный режим (```-r```):" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [], "source": [ "#ssdeep -lrpa samples/" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "В следующем примере ssdeep-хеши всех файлов были перенаправлены в текстовый файл (```all_hashes.txt```), а затем подозрительный файл (```test_03```) сопоставляется со всеми хешами в файле: " ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [], "source": [ "!ssdeep samples/test_01 samples/test_02 samples/test_03 > samples/all_hashes.txt" ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "ssdeep,1.1--blocksize:hash:hash,filename\n", "96:RZTWB6WBilMGIlZIpMRiUHs9ga7fNuB3eoBqSitrqN:RZ6oWQMZMpLrI4osSi,\"/home/dmf/new_github/infosec/re-tools/samples/test_01\"\n", "96:RIXTekB6WBn+ZZS9+MRSM8vKk7fAuBWeoBqSAXLgj:RIX9oWgZS9+bz7xosSA,\"/home/dmf/new_github/infosec/re-tools/samples/test_02\"\n", "96:RIXTtB6WBn+ZZSg+MRSM8vKk7fXuBWeoBqSAXLgj:RIXRoWgZSg+bzyxosSA,\"/home/dmf/new_github/infosec/re-tools/samples/test_03\"\n" ] } ], "source": [ "!cat samples/all_hashes.txt" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "В следующем фрагменте кода видно, что подозрительный файл (```test_03```) идентичен ```test_03``` (соответствие – 100%) и имеет сходство 93% с ```test_02```. Можно использовать этот метод для сравнения любого нового файла с хешами ранее проанализированных образцов:" ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "/home/dmf/new_github/infosec/re-tools/samples/test_03 matches samples/all_hashes.txt:/home/dmf/new_github/infosec/re-tools/samples/test_02 (93)\n", "/home/dmf/new_github/infosec/re-tools/samples/test_03 matches samples/all_hashes.txt:/home/dmf/new_github/infosec/re-tools/samples/test_03 (100)\n" ] } ], "source": [ "!ssdeep -m samples/all_hashes.txt samples/test_03" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "В Python нечеткий хеш может быть вычислен с использованием ```python-ssdeep```:" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "#!pip3 install ssdeep" ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "96:RIXTtB6WBn+ZZSg+MRSM8vKk7fXuBWeoBqSAXLgj:RIXRoWgZSg+bzyxosSA\n" ] } ], "source": [ "import ssdeep\n", "hash1 = ssdeep.hash_from_file('samples/test_03')\n", "print(hash1)" ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "96:RIXTekB6WBn+ZZS9+MRSM8vKk7fAuBWeoBqSAXLgj:RIX9oWgZS9+bz7xosSA\n" ] } ], "source": [ "hash2 = ssdeep.hash_from_file('samples/test_02')\n", "print(hash2)" ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "93" ] }, "execution_count": 31, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ssdeep.compare(hash1, hash2)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.7.3" } }, "nbformat": 4, "nbformat_minor": 4 }