Немного теории
Программа, демонстрирующая описанное выше свойство частоты распределения байтов данных в файле приведена далее (оригинал лежащего в основе кода доступен здесь).
Python:
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()
В результате выполнения программы, для заданного файла, вычисляется значение энтропии, а также строится частотная характеристика.
В качестве наглядного примера можно рассмотреть частотные характеристики файла со сжатием и без сжатия (первый и второй графики соответственно).
Из графиков видно, что у сжатого файла энтропия выше, чем у файла без сжатия. Этот принцип широко используется при анализе бинарных файлов, позволяя сделать вывод о наличии/отсутствии сжатия в файле (и его типе).
Помимо анализа бинарных файлов свойство энтропии используется и при анализе обычных файлов: у строк, содержащих секреты (пароли/криптографические ключи/токены и т.п.) энтропия выше чем у обычных строк. Применение энтропии при анализе данных существенно ускоряет этот процесс.
На этом краткий экскурс в теории можно закончить и перейти к практике.
Софт
Софта подобной тематики существует масса (любят велосипеды делать).Наиболее известным считается 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.
Анализ данных
Чтобы продемонстрировать возможности анализа необходим хороший и наглядный пример: слитая в паблик утечка CD-Project отлично для этого подойдёт.В числе выложенных и доступных архивов для анализа практическую пользу имеет только архив cp.7z, весящий 120 Гб, после распаковки имеем 160 Гб данных (структура каталогов приведена на рисунке далее). С помощью rustyHog найти что-то интересное становится достаточно просто.
В логе каждая из записей содержит поля, позволяющие однозначно понять что было найдено и где (путь до файла, номер строки, выявленный тип данных). Список используемых по умолчанию полей доступен здесь. По умолчанию он содержит большое количество регулярных выражений, с помощью которых могут быть найдены секреты без применения энтропии.
Результат.
Пример выявленных интересных строк, с использованием энтропии приведён на рисунке ниже. Полностью результаты намеренно не привожу, т.к. анализ этих результатов показал отсутствие какой-либо полезной информации.
Из полного списка шаблонов регулярных выражений для поиска заслуживают внимания следующие типы секретов: Generic Secret, RSA private key, Credentials in absolute URL, Generic Account API Key (остальные не рассматриваем, т.к. их наличие маловероятно). Результаты выявленных секретов приведены далее на рисунках.
Итог анализа
В составе "утечки" CD-Project слитой в паблик было выявлено:
- несколько приватных ключей;
- несколько секретов, используемых при сборке-отладке;
- большое количество адресов email разработчиков используемых opensource компонентов;
- очень большая куча мусора.
Результат в целом соответствует действительности: были слиты части SDK и куски кода, не содержащие какой-либо ценности.
Всё то же, что имеет хоть какой-то вес содержится в архивах под паролем, о чём было написано в readme-файле в торрент раздаче данной "утечки".
Заключение
В этой статье мы рассмотрели простой способ для быстрого анализа данных, а вот где применять его решать вам.
Спасибо за внимание!
P.S.: Статья написана при содействии club1337, спасибо.
Последнее редактирование: