Несколько слов об энтропии

  • Автор темы Admin

Admin

#1
Администратор
Регистрация
31.12.2019
Сообщения
6,977
Реакции
34
Всем известно что энтропия - это мера хаоса системы, а "информация" (данные) - это мера упорядоченности системы. Используя это свойство можно выполнять качественный анализ данных вне зависимости от их характера, вычисляя функцию частоты распределения: значение этой функции будет принимать большие значения для данных содержащих больше "хаоса" и, соответственно, меньшие значения для данных, содержащих меньше "хаоса".
Немного теории​

Программа, демонстрирующая описанное выше свойство частоты распределения байтов данных в файле приведена далее (оригинал лежащего в основе кода доступен здесь).

Код:
import sys
import math
import os
import numpy as np
import matplotlib.pyplot as plt

if len(sys.argv) != 2:
    print("Usage: " + os.path.basename(__file__) + " filename")
    sys.exit()

f = open(sys.argv[1], "rb")
byteArr = map(ord, f.read())
f.close()
fileSize = len(byteArr)
#print("File size in bytes: " + fileSize)

freqList = []
for b in range(256):
    ctr = 0
    for byte in byteArr:
        if byte == b:
            ctr += 1
    freqList.append(float(ctr) / fileSize)
# print("Frequencies of each byte-character: " + freqList)

# entropy
ent = 0.0
for freq in freqList:
    if freq > 0:
        ent = ent + freq * math.log(freq, 2)
ent = -ent


N = len(freqList)

ind = np.arange(N)  # the x locations for the groups
width = 1.00        # the width of the bars

#fig = plt.figure()
fig = plt.figure(figsize=(11,5),dpi=100)
ax = fig.add_subplot(111)
rects1 = ax.bar(ind, freqList, width)
ax.set_autoscalex_on(False)
ax.set_xlim([0,255])

ax.set_ylabel('Frequency')
ax.set_xlabel('Byte')
ax.set_title('Frequency of Bytes 0 to 255\nFILENAME: ' + sys.argv[1])

plt.show()
В результате выполнения программы, для заданного файла, вычисляется значение энтропии, а также строится частотная характеристика.
В качестве наглядного примера можно рассмотреть частотные характеристики файла со сжатием и без сжатия (первый и второй графики соответственно).

767c9d1b61f35cf0c3938.png



25fe7bdba115d35b404f0.png


Из графиков видно, что у сжатого файла энтропия выше, чем у файла без сжатия. Этот принцип широко используется при анализе бинарных файлов, позволяя сделать вывод о наличии/отсутствии сжатия в файле (и его типе).
Помимо анализа бинарных файлов свойство энтропии используется и при анализе обычных файлов: у строк, содержащих секреты (пароли/криптографические ключи/токены и т.п.) энтропия выше чем у обычных строк. Применение энтропии при анализе данных существенно ускоряет этот процесс.

На этом краткий экскурс в теории можно закончить и перейти к практике.

Софт​

Софта подобной тематики существует масса (любят велосипеды делать).
Наиболее известным считается truffleHog, в котором реализованы типовые функции для анализа (поиск по заданным шаблонам, поиск по энтропии и т.д.). Имеет большой недостаток - работает только с git-репозиториями, без возможности анализа локальных файлов. Существует доработанная до ума модификация - truffleHog3. Среди доработок: добавили возможность работы с локальными файлами, а также функции фильтрации результатов. Как и оригинал, truffleHog3 также давно не обновлялся.

В настоящее время активно развивается идейный продолжатель truffleHog - rustyHog, превосходящий предшественника как по скорости работы, так и по количеству реализованных фич.
Распространяется rustyHog в виде исходных текстов (компилируется в несколько команд, как под windows, так и под linux/macos), также имеется готовый образ в Docker.

Для удобства использования rustyHog разбит на компоненты по области применения:
  • Ankamali Hog: для работы с гугл-диском.
  • Berkshire Hog: для работы с S3-инстансами.
  • Choctaw Hog: для работы с Git-репозиториями.
  • Duroc Hog: для работы с файловой системой.
  • Essex Hog: для работы с Confluence.
  • Gottingen Hog: Sдля работы с JIRA.
Список параметров у каждой из утилит типовой, пример справки для duroc_hog приведён на рисунке ниже.

e2fbdaca28ff499a968e1.png


Анализ данных​

Чтобы продемонстрировать возможности анализа необходим хороший и наглядный пример: слитая в паблик утечка CD-Project отлично для этого подойдёт.
Код:
magnet:?xt=urn:btih:44134e7ade0f85e0ee940c33a7bfed5204587b93&dn=cp_no_password&tr=udp%3A%2F%2Ftracker.openbittorrent.com%3A80&tr=udp%3A%2F%2Ftracker.opentrackr.org%3A1337%2Fannounce
В числе выложенных и доступных архивов для анализа практическую пользу имеет только архив cp.7z, весящий 120 Гб, после распаковки имеем 160 Гб данных (структура каталогов приведена на рисунке далее). С помощью rustyHog найти что-то интересное становится достаточно просто.


edaf3dc9768740b52324f.png


В логе каждая из записей содержит поля, позволяющие однозначно понять что было найдено и где (путь до файла, номер строки, выявленный тип данных). Список используемых по умолчанию полей доступен здесь. По умолчанию он содержит большое количество регулярных выражений, с помощью которых могут быть найдены секреты без применения энтропии.

Результат.
Пример выявленных интересных строк, с использованием энтропии приведён на рисунке ниже. Полностью результаты намеренно не привожу, т.к. анализ этих результатов показал отсутствие какой-либо полезной информации.

170935402ec01eeef4503.png


Из полного списка шаблонов регулярных выражений для поиска заслуживают внимания следующие типы секретов: Generic Secret, RSA private key, Credentials in absolute URL, Generic Account API Key (остальные не рассматриваем, т.к. их наличие маловероятно). Результаты выявленных секретов приведены далее на рисунках.

41c7a0394e6eb84b1a5e8.png


d381af99f6dd0a58fcb62.png


e01743b4d99d9a3b3ef38.png


eacda2948fdfb039d0a25.png


Итог анализа
В составе "утечки" CD-Project слитой в паблик было выявлено:
  • несколько приватных ключей;
  • несколько секретов, используемых при сборке-отладке;
  • большое количество адресов email разработчиков используемых opensource компонентов;
  • очень большая куча мусора.
Ничего из выявленного не представляет ценности как таковой.
Результат в целом соответствует действительности: были слиты части SDK и куски кода, не содержащие какой-либо ценности.
Всё то же, что имеет хоть какой-то вес содержится в архивах под паролем, о чём было написано в readme-файле в торрент раздаче данной "утечки".

a6ff1c583ade1ccafdb13.png


Заключение
В этой статье мы рассмотрели простой способ для быстрого анализа данных, а вот где применять его решать вам.
Спасибо за внимание!

Автор: lulz
 

Members, viewing this thread

Сейчас на форуме нет ни одного пользователя.